From 64ece4d0defc4dd00ed12a05adad63c26a1531ec Mon Sep 17 00:00:00 2001 From: tmorin Date: Mon, 8 Nov 2021 17:08:28 +0100 Subject: [PATCH] feat(ceb-messaging-builder-inversion): add a builder to inject a bus from a container --- .idea/ceb.iml | 1 + README.md | 2 + README.typedoc.md | 2 + lerna.json | 3 +- packages/ceb-inversion-builder/src/builder.ts | 2 +- .../ceb-messaging-builder-inversion/README.md | 22 ++++ .../karma.conf.js | 1 + .../package.json | 62 +++++++++++ .../src/__TEST/fixtures.ts | 68 ++++++++++++ .../src/builder.decorate.spec.ts | 58 ++++++++++ .../src/builder.listener.spec.ts | 46 ++++++++ .../src/builder.spec.ts | 103 ++++++++++++++++++ .../src/builder.ts | 82 ++++++++++++++ .../src/index.ts | 2 + .../src/module.ts | 49 +++++++++ .../tsconfig.build.json | 6 + .../tsconfig.json | 6 + .../ceb-messaging-core-builder/src/builder.ts | 48 ++++---- 18 files changed, 540 insertions(+), 23 deletions(-) create mode 100644 packages/ceb-messaging-builder-inversion/README.md create mode 100644 packages/ceb-messaging-builder-inversion/karma.conf.js create mode 100644 packages/ceb-messaging-builder-inversion/package.json create mode 100644 packages/ceb-messaging-builder-inversion/src/__TEST/fixtures.ts create mode 100644 packages/ceb-messaging-builder-inversion/src/builder.decorate.spec.ts create mode 100644 packages/ceb-messaging-builder-inversion/src/builder.listener.spec.ts create mode 100644 packages/ceb-messaging-builder-inversion/src/builder.spec.ts create mode 100644 packages/ceb-messaging-builder-inversion/src/builder.ts create mode 100644 packages/ceb-messaging-builder-inversion/src/index.ts create mode 100644 packages/ceb-messaging-builder-inversion/src/module.ts create mode 100644 packages/ceb-messaging-builder-inversion/tsconfig.build.json create mode 100644 packages/ceb-messaging-builder-inversion/tsconfig.json diff --git a/.idea/ceb.iml b/.idea/ceb.iml index cd0dde23..675fa538 100644 --- a/.idea/ceb.iml +++ b/.idea/ceb.iml @@ -13,6 +13,7 @@ + diff --git a/README.md b/README.md index 009f4d84..79730950 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ A built-in implementation of the Inversion of Control principle: A built-in implementation of the Event/Message architecture: - [ceb-messaging-core](./packages/ceb-messaging-core) +- [ceb-messaging-core-builder](./packages/ceb-messaging-core-builder) +- [ceb-messaging-builder-inversion](./packages/ceb-messaging-builder-inversion) - [ceb-messaging-simple](./packages/ceb-messaging-simple) - [ceb-messaging-simple-builder](./packages/ceb-messaging-simple-builder) - [ceb-messaging-dom](./packages/ceb-messaging-dom) diff --git a/README.typedoc.md b/README.typedoc.md index aecc903b..d7dcf81f 100644 --- a/README.typedoc.md +++ b/README.typedoc.md @@ -30,6 +30,8 @@ A built-in implementation of the Inversion of Control principle: A built-in implementation of the Event/Message architecture: - [ceb-messaging-core](modules/_tmorin_ceb_messaging_core.html) +- [ceb-messaging-core-builder](modules/_tmorin_ceb_messaging_core_builder.html) +- [ceb-messaging-builder-inversion](modules/_tmorin_ceb_messaging_builder_inversion.html) - [ceb-messaging-simple](modules/_tmorin_ceb_messaging_simple.html) - [ceb-messaging-dom](modules/_tmorin_ceb_messaging_dom.html) - [ceb-messaging-adapter-electron](modules/_tmorin_ceb_messaging_bus_adapter_ipc.html) diff --git a/lerna.json b/lerna.json index 98a8710f..95a59f86 100644 --- a/lerna.json +++ b/lerna.json @@ -8,11 +8,12 @@ "packages/ceb-inversion", "packages/ceb-inversion-builder", "packages/ceb-messaging-adapter-electron", + "packages/ceb-messaging-builder-inversion", "packages/ceb-messaging-core", "packages/ceb-messaging-core-builder", + "packages/ceb-messaging-dom", "packages/ceb-messaging-simple", "packages/ceb-messaging-simple-builder", - "packages/ceb-messaging-dom", "packages/ceb-templating-engine", "packages/ceb-templating-parser", "packages/ceb-templating-builder", diff --git a/packages/ceb-inversion-builder/src/builder.ts b/packages/ceb-inversion-builder/src/builder.ts index a7176d00..f0d46f29 100644 --- a/packages/ceb-inversion-builder/src/builder.ts +++ b/packages/ceb-inversion-builder/src/builder.ts @@ -70,7 +70,7 @@ export class InversionBuilder implements Builder { if (!this._key) { this._key = this._propName } - const id = `bus-field-inversion-${this._propName}` + const id = `field-inversion-${this._propName}` ElementBuilder.getOrSet(target, this, id) } } diff --git a/packages/ceb-messaging-builder-inversion/README.md b/packages/ceb-messaging-builder-inversion/README.md new file mode 100644 index 00000000..88b7b7e7 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/README.md @@ -0,0 +1,22 @@ +# @tmorin/ceb-messaging-builder-inversion + +[![npm version](https://badge.fury.io/js/%40tmorin%2Fceb-messaging-builder-inversion.svg)](https://badge.fury.io/js/%40tmorin%2Fceb-messaging-builder-inversion) +[![api](https://img.shields.io/badge/-api-informational.svg)](https://tmorin.github.io/ceb/api/modules/_tmorin_ceb_messaging_builder_inversion.html) + +> The package is part of the `` library. +> It provides a builder to resolve and inject a bus from a container and then subscribe to event. + +## Install + +The NPM package is compliant [CommonJs](https://flaviocopes.com/commonjs) and [ES Module](https://flaviocopes.com/es-modules). + +```bash +npm install @tmorin/ceb-messaging-builder-inversion +``` + +## License + +Released under the [MIT license]. + +[Custom Elements (v1)]: https://html.spec.whatwg.org/multipage/custom-elements.html +[MIT license]: http://opensource.org/licenses/MIT diff --git a/packages/ceb-messaging-builder-inversion/karma.conf.js b/packages/ceb-messaging-builder-inversion/karma.conf.js new file mode 100644 index 00000000..118321eb --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/karma.conf.js @@ -0,0 +1 @@ +module.exports = require('../../karma.conf') diff --git a/packages/ceb-messaging-builder-inversion/package.json b/packages/ceb-messaging-builder-inversion/package.json new file mode 100644 index 00000000..39e0c3b3 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/package.json @@ -0,0 +1,62 @@ +{ + "name": "@tmorin/ceb-messaging-builder-inversion", + "version": "4.0.3-alpha.13", + "license": "MIT", + "description": "The package is part of the `` library. It provides a builder to resolve and inject a bus from a container and then subscribe to event.", + "keywords": [ + "custom-element-builder", + "custom-elements-v1", + "custom-elements", + "custom-element", + "typescript", + "typescript-library", + "javascript-library", + "messaging", + "cqrs", + "bus", + "event-bus", + "message-bus" + ], + "homepage": "https://tmorin.github.io/ceb", + "bugs": { + "url": "https://github.com/tmorin/ceb/issues" + }, + "repository": { + "type": "git", + "url": "git@github.com:tmorin/ceb.git" + }, + "author": { + "name": "Thibault Morin", + "url": "https://tmorin.github.io" + }, + "publishConfig": { + "access": "public" + }, + "exports": { + ".": { + "import": "./dist/mjs/index.js", + "require": "./dist/cjs/index.js" + } + }, + "types": "dist/types/index.d.ts", + "main": "dist/cjs/index.js", + "module": "dist/mjs/index.js", + "files": [ + "dist" + ], + "scripts": { + "build": "npm run build:lib && npm run build:module && npm run build:fix", + "build:fix": "../../scripts/fix-dist.js", + "build:lib": "tsc -p tsconfig.build.json --module CommonJS --outDir dist/cjs --declaration --declarationDir dist/types", + "build:module": "tsc -p tsconfig.build.json --module ESNext --outDir dist/mjs", + "test": "karma start --single-run --no-auto-watch --browsers FirefoxHeadless,ChromeHeadless", + "test:watch": "karma start --no-single-run --auto-watch --browsers Firefox" + }, + "dependencies": { + "@tmorin/ceb-core": "^4.0.3-alpha.13", + "@tmorin/ceb-inversion": "^4.0.3-alpha.13", + "@tmorin/ceb-messaging-core": "^4.0.3-alpha.13", + "@tmorin/ceb-messaging-core-builder": "^4.0.3-alpha.13", + "@tmorin/ceb-utilities": "^4.0.0" + } +} diff --git a/packages/ceb-messaging-builder-inversion/src/__TEST/fixtures.ts b/packages/ceb-messaging-builder-inversion/src/__TEST/fixtures.ts new file mode 100644 index 00000000..b40c842b --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/__TEST/fixtures.ts @@ -0,0 +1,68 @@ +import { + Bus, + ExecutionHandler, + Handler, + MessageAction, + MessageConstructor, + MessageEvent, + MessageHeaders, + MessageKind, + MessageResult, + SubscribeOptions, + Subscription, + SubscriptionListener +} from "@tmorin/ceb-messaging-core"; + +export class NotImplementedBus implements Bus { + + public subscribeCalls: Array<[any, any, any]> = [] + + publish>(event: E): Promise { + throw new Error("Method not implemented."); + } + + subscribe>(EventType: string | MessageConstructor, listener: SubscriptionListener, options?: SubscribeOptions): Subscription { + this.subscribeCalls.push([EventType, listener, options]) + return { + unsubscribe() { + } + } + } + + execute, R extends MessageResult>(action: any, ResultType?: any, options?: any): Promise | Promise { + throw new Error("Method not implemented."); + } + + handle, R extends MessageResult>(ActionType: string | MessageConstructor, ResultType: string | MessageConstructor, handler: ExecutionHandler): Handler { + throw new Error("Method not implemented."); + } + + emit(event: any, err?: any, ...rest: any[]): void { + throw new Error("Method not implemented."); + } + + on(event: any, listener: any): this { + throw new Error("Method not implemented."); + } + + off(event?: any, listener?: any): this { + throw new Error("Method not implemented."); + } + + dispose(): Promise { + throw new Error("Method not implemented."); + } + +} + +export class EventA implements MessageEvent { + constructor( + readonly body: string, + readonly headers: MessageHeaders = { + messageType: EventA.name, + messageId: `${EventA.name}-${Date.now()}` + }, + readonly kind: MessageKind = MessageKind.event, + ) { + } +} diff --git a/packages/ceb-messaging-builder-inversion/src/builder.decorate.spec.ts b/packages/ceb-messaging-builder-inversion/src/builder.decorate.spec.ts new file mode 100644 index 00000000..3e75f70f --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/builder.decorate.spec.ts @@ -0,0 +1,58 @@ +import {assert} from "chai"; +import {ElementBuilder} from "@tmorin/ceb-core"; +import {Bus, BusSymbol} from "@tmorin/ceb-messaging-core"; +import {Container, ContainerBuilder, OnlyConfigureModule} from "@tmorin/ceb-inversion"; +import {BusInversionBuilder} from "./builder"; +import {BusInversionBuilderModule} from "./module"; +import {EventA, NotImplementedBus} from "./__TEST/fixtures"; + +describe("messaging/bus/inversion/builder/decorate", function () { + let sandbox: HTMLDivElement + const tagName = "messaging-bus-inversion-builder-decorate" + let container: Container + let bus: NotImplementedBus + let testElement: TestElement + + @ElementBuilder.get(TestElement).name(tagName).decorate() + class TestElement extends HTMLElement { + @BusInversionBuilder.get().decorate() + bus?: Bus + + @BusInversionBuilder.get().subscribe().decorate() + onEventA(event: EventA) { + } + + @BusInversionBuilder.get().subscribe().type(EventA).decorate() + onEventABis(event: EventA) { + } + } + + before(async function () { + bus = new NotImplementedBus() + container = await ContainerBuilder.get() + .module(OnlyConfigureModule.create(async function () { + this.registry.registerValue(BusSymbol, bus) + })) + .module(new BusInversionBuilderModule()) + .build() + .initialize() + sandbox = document.body.appendChild(document.createElement('div')) + testElement = sandbox.appendChild(document.createElement(tagName) as TestElement) + }) + + after(async function () { + await container.dispose() + }) + + it("should resolve container with default settings", function () { + assert.property(testElement, "bus") + assert.equal(testElement.bus, bus) + }) + + it("should subscribe", function () { + assert.equal(bus.subscribeCalls.length, 2) + assert.equal(bus.subscribeCalls[0][0], "EventA") + assert.equal(bus.subscribeCalls[1][0], EventA) + }) + +}) diff --git a/packages/ceb-messaging-builder-inversion/src/builder.listener.spec.ts b/packages/ceb-messaging-builder-inversion/src/builder.listener.spec.ts new file mode 100644 index 00000000..3c480cac --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/builder.listener.spec.ts @@ -0,0 +1,46 @@ +import {assert} from "chai"; +import {ElementBuilder} from "@tmorin/ceb-core"; +import {Bus, BusSymbol} from "@tmorin/ceb-messaging-core"; +import {Container, ContainerBuilder, OnlyConfigureModule} from "@tmorin/ceb-inversion"; +import {BusInversionBuilder} from "./builder"; +import {BusInversionBuilderModule} from "./module"; +import {EventA, NotImplementedBus} from "./__TEST/fixtures"; + +describe("messaging/bus/inversion/builder/listener", function () { + let sandbox: HTMLDivElement + const tagName = "messaging-bus-inversion-builder-listener" + let container: Container + let bus: NotImplementedBus + let testElement: TestElement + + class TestElement extends HTMLElement { + bus?: Bus + } + + before(async function () { + bus = new NotImplementedBus() + container = await ContainerBuilder.get() + .module(OnlyConfigureModule.create(async function () { + this.registry.registerValue(BusSymbol, bus) + })) + .module(new BusInversionBuilderModule()) + .build() + .initialize() + ElementBuilder.get(TestElement).name(tagName).builder( + BusInversionBuilder.get().subscribe(EventA, () => { + }), + ).register() + sandbox = document.body.appendChild(document.createElement('div')) + testElement = sandbox.appendChild(document.createElement(tagName)) + }) + + after(async function () { + await container.dispose() + }) + + it("should subscribe", function () { + assert.equal(bus.subscribeCalls.length, 1) + assert.equal(bus.subscribeCalls[0][0], EventA) + }) + +}) diff --git a/packages/ceb-messaging-builder-inversion/src/builder.spec.ts b/packages/ceb-messaging-builder-inversion/src/builder.spec.ts new file mode 100644 index 00000000..587f67b8 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/builder.spec.ts @@ -0,0 +1,103 @@ +import {assert} from "chai"; +import {ElementBuilder} from "@tmorin/ceb-core"; +import {Bus, BusSymbol} from "@tmorin/ceb-messaging-core"; +import {Container, ContainerBuilder, OnlyConfigureModule} from "@tmorin/ceb-inversion"; +import {BusInversionBuilder} from "./builder"; +import {BusInversionBuilderModule} from "./module"; +import {NotImplementedBus} from "./__TEST/fixtures"; + +describe("messaging/bus/inversion/builder", function () { + let container: Container + let sandbox: HTMLDivElement + let bus: NotImplementedBus + + describe("when container provided by module", function () { + const tagName = "messaging-bus-inversion-builder-module" + let testElement: TestElementA + + class TestElementA extends HTMLElement { + bus?: Bus + busBis?: Bus + busAlternative?: Bus + } + + before(async function () { + bus = new NotImplementedBus() + + container = await ContainerBuilder.get() + .module(OnlyConfigureModule.create(async function () { + this.registry.registerValue(BusSymbol, bus) + this.registry.registerValue("busAlternative", bus) + })) + .module(new BusInversionBuilderModule()) + .build() + .initialize() + ElementBuilder.get(TestElementA).name(tagName).builder( + BusInversionBuilder.get(), + BusInversionBuilder.get("busBis"), + BusInversionBuilder.get("busAlternative").key("busAlternative"), + ).register() + sandbox = document.body.appendChild(document.createElement('div')) + testElement = sandbox.appendChild(document.createElement(tagName)) + }) + after(async function () { + await container.dispose() + }) + it("should resolve container with default settings", function () { + assert.property(testElement, "bus") + assert.equal(testElement.bus, bus) + }) + it("should resolve container with custom property name", function () { + assert.property(testElement, "busBis") + assert.equal(testElement.busBis, bus) + }) + it("should resolve container with custom registry key", function () { + assert.property(testElement, "busAlternative") + assert.equal(testElement.busAlternative, bus) + }) + }) + + describe("when container provided by provider", function () { + const tagName = "messaging-bus-inversion-builder-provider" + let testElement: TestElementB + let sandbox: HTMLDivElement + + class TestElementB extends HTMLElement { + bus?: Bus + busBis?: Bus + busAlternative?: Bus + } + + before(async function () { + container = await ContainerBuilder.get() + .module(OnlyConfigureModule.create(async function () { + this.registry.registerValue(BusSymbol, bus) + this.registry.registerValue("busAlternative", bus) + })) + .build() + .initialize() + ElementBuilder.get(TestElementB).name(tagName).builder( + BusInversionBuilder.get().provider(() => container), + BusInversionBuilder.get("busBis").provider(() => container), + BusInversionBuilder.get("busAlternative").key("busAlternative").provider(() => container), + ).register() + sandbox = document.body.appendChild(document.createElement('div')) + testElement = sandbox.appendChild(document.createElement(tagName)) + }) + after(async function () { + await container.dispose() + }) + it("should resolve container with default settings", function () { + assert.property(testElement, "bus") + assert.equal(testElement.bus, bus) + }) + it("should resolve container with custom property name", function () { + assert.property(testElement, "busBis") + assert.equal(testElement.busBis, bus) + }) + it("should resolve container with custom registry key", function () { + assert.property(testElement, "busAlternative") + assert.equal(testElement.busAlternative, bus) + }) + }) +}) diff --git a/packages/ceb-messaging-builder-inversion/src/builder.ts b/packages/ceb-messaging-builder-inversion/src/builder.ts new file mode 100644 index 00000000..f680d704 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/builder.ts @@ -0,0 +1,82 @@ +import {CustomElementConstructor, ElementBuilder, HooksRegistration} from "@tmorin/ceb-core"; +import {Container, RegistryKey} from "@tmorin/ceb-inversion"; +import {Bus, BusSymbol} from "@tmorin/ceb-messaging-core"; +import {AbstractBusBuilder} from "@tmorin/ceb-messaging-core-builder"; + +/** + * Provider of the container. + */ +export interface ContainerProvider { + /** + * @return the container + */ + (): Container +} + +/** + * The builder injects a {@link Bus} in Custom Elements. + * + * @template E the type of the Custom Element + */ +export class BusInversionBuilder extends AbstractBusBuilder { + + private static DEFAULT_CONTAINER: Container + + protected constructor( + _propName: string = "bus", + private _key: RegistryKey = BusSymbol, + private _provider?: ContainerProvider, + ) { + super( + () => { + let _container: Container + if (_provider) { + _container = _provider() + } else if (BusInversionBuilder.DEFAULT_CONTAINER) { + _container = BusInversionBuilder.DEFAULT_CONTAINER + } else { + throw new TypeError("BusInversionBuilder - unable to resolve a Container") + } + return _container.registry.resolve(_key) + }, + _propName + ) + } + + /** + * Set the default {@link Container}. + * @param container the container + * @internal + */ + static setDefaultContainer(container: Container) { + BusInversionBuilder.DEFAULT_CONTAINER = container + } + + /** + * Provides a fresh builder. + * @param propName the property name + * @template E the type of the Custom Element + */ + static get(propName?: string) { + return new BusInversionBuilder(propName) + } + + /** + * Set the registry key. + * @param key the registry key + */ + key(key: RegistryKey): this { + this._key = key + return this + } + + /** + * Set the Container provider. + * @param provider the provider + */ + provider(provider: ContainerProvider): this { + this._provider = provider + return this + } + +} diff --git a/packages/ceb-messaging-builder-inversion/src/index.ts b/packages/ceb-messaging-builder-inversion/src/index.ts new file mode 100644 index 00000000..ee343c82 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/index.ts @@ -0,0 +1,2 @@ +export * from "./builder" +export * from "./module" diff --git a/packages/ceb-messaging-builder-inversion/src/module.ts b/packages/ceb-messaging-builder-inversion/src/module.ts new file mode 100644 index 00000000..38a272d3 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/src/module.ts @@ -0,0 +1,49 @@ +import {Container, ContainerSymbol, Module, ModuleConfiguration} from "@tmorin/ceb-inversion"; +import {BusInversionBuilder} from "./builder"; + +/** + * The options of {@link BusInversionBuilderModule}. + */ +export interface BusInversionBuilderModuleOptions { + /** + * When `true`, the current container becomes the default one, i.e. {@link BusInversionBuilder#setDefaultContainer} + */ + setDefaultContainer: boolean +} + +/** + * The module can set the default container of {@link BusInversionBuilder}. + * + * @example Register the InversionBuilderModule + * ```typescript + * import {ContainerBuilder} from "@tmorin/ceb-inversion" + * import {InversionBuilderModule} from "@tmorin/ceb-inversion-builder" + * const container = ContainerBuilder.get() + * .module(new InversionBuilderModule()) + * .build() + * ``` + */ +export class BusInversionBuilderModule implements Module { + private readonly options: BusInversionBuilderModuleOptions + + constructor( + /** + * Options of the module. + */ + partialOptions: Partial = {} + ) { + this.options = { + setDefaultContainer: true, + ...partialOptions + } + } + + async initialize(configuration: ModuleConfiguration): Promise { + if (this.options.setDefaultContainer) { + BusInversionBuilder.setDefaultContainer(configuration.registry.resolve(ContainerSymbol)) + } + } + + async dispose(): Promise { + } +} diff --git a/packages/ceb-messaging-builder-inversion/tsconfig.build.json b/packages/ceb-messaging-builder-inversion/tsconfig.build.json new file mode 100644 index 00000000..3a564a82 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/tsconfig.build.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.build.json", + "include": [ + "src" + ] +} diff --git a/packages/ceb-messaging-builder-inversion/tsconfig.json b/packages/ceb-messaging-builder-inversion/tsconfig.json new file mode 100644 index 00000000..2e690402 --- /dev/null +++ b/packages/ceb-messaging-builder-inversion/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.json", + "include": [ + "src" + ] +} diff --git a/packages/ceb-messaging-core-builder/src/builder.ts b/packages/ceb-messaging-core-builder/src/builder.ts index 7bf97df8..117f9e7a 100644 --- a/packages/ceb-messaging-core-builder/src/builder.ts +++ b/packages/ceb-messaging-core-builder/src/builder.ts @@ -1,6 +1,13 @@ -import {toKebabCase} from "@tmorin/ceb-utilities"; import {Builder, CustomElementConstructor, ElementBuilder, HooksRegistration} from "@tmorin/ceb-core"; -import {Bus, MessageEvent, MessageType, SubscribeOptions, Subscription} from "@tmorin/ceb-messaging-core"; +import { + Bus, + Message, + MessageConstructor, + MessageEvent, + MessageType, + SubscribeOptions, + Subscription +} from "@tmorin/ceb-messaging-core"; /** * The listener of a subscription. @@ -31,7 +38,7 @@ export class BusSubscriptionBuilder, - private _eventType?: MessageType, + private _EventType?: MessageType | MessageConstructor, private _listener: ElementSubscriptionListener = () => { }, private _options?: SubscribeOptions @@ -40,10 +47,10 @@ export class BusSubscriptionBuilder { - this._eventType = eventType + type(EventType: MessageType | MessageConstructor): BusSubscriptionBuilder { + this._EventType = EventType return this } @@ -60,23 +67,21 @@ export class BusSubscriptionBuilder`, where `` is by default `on`. - + * The pattern is ``, where `` is by default `on`. + * * @param prefix the prefix used to discover the type of the message event from the method name */ decorate(prefix = "on"): MethodDecorator { return (target: Object, methName: string | symbol, descriptor: PropertyDescriptor) => { - if (!this._eventType) { - this._eventType = toKebabCase( - methName.toString().replace(prefix, '') - ) + if (!this._EventType) { + this._EventType = methName.toString().replace(prefix, '') } const id = `bus-${this._busBuilder._propName}` const builder = ElementBuilder.getOrSet(target, this._busBuilder, id) if (builder !== this._busBuilder) { builder.mergeBuilder(this._busBuilder, false) } - builder.subscribe(this._eventType, (el, event) => { + builder.subscribe(this._EventType, (el, event) => { const fn = descriptor.value as Function fn.call(el, event) }, this._options) @@ -119,25 +124,26 @@ export abstract class AbstractBusBuilder implements Build /** * @ignore + * @internal */ public _propName: string = "bus"; protected constructor( protected _busProvider: BusProvider, _propName: string = "bus", - protected _subscriptionsByType: Map> = new Map(), + protected _subscriptionsByType: Map, Array<[ElementSubscriptionListener, SubscribeOptions | undefined]>> = new Map(), ) { this._propName = _propName; } /** * Subscribe to a Message Event. - * @param eventType the type of the event + * @param EventType the type of the event * @param listener the listener * @param options the options */ subscribe( - eventType: MessageType, + EventType: MessageType | MessageConstructor, listener: ElementSubscriptionListener, options ?: SubscribeOptions ): AbstractBusBuilder @@ -148,16 +154,16 @@ export abstract class AbstractBusBuilder implements Build subscribe(): BusSubscriptionBuilder subscribe( - eventType ?: MessageType, + EventType ?: MessageType | MessageConstructor, listener ?: ElementSubscriptionListener, options ?: SubscribeOptions ): AbstractBusBuilder | BusSubscriptionBuilder { - if (eventType && listener + if (EventType && listener ) { - if (!this._subscriptionsByType.has(eventType)) { - this._subscriptionsByType.set(eventType, []) + if (!this._subscriptionsByType.has(EventType)) { + this._subscriptionsByType.set(EventType, []) } - this._subscriptionsByType.get(eventType)?.push([ + this._subscriptionsByType.get(EventType)?.push([ // @ts-ignore listener, options