mongodb-dynamic-api 4.14.1 → 4.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -0
- package/README.md +2 -1
- package/package.json +1 -1
- package/src/decorators/entity-exists.decorator.d.ts +10 -0
- package/src/decorators/entity-exists.decorator.js +37 -0
- package/src/decorators/entity-exists.decorator.js.map +1 -0
- package/src/decorators/index.d.ts +2 -0
- package/src/decorators/index.js +2 -0
- package/src/decorators/index.js.map +1 -1
- package/src/decorators/is-unique.decorator.d.ts +10 -0
- package/src/decorators/is-unique.decorator.js +48 -0
- package/src/decorators/is-unique.decorator.js.map +1 -0
- package/src/dynamic-api.module.d.ts +1 -1
- package/src/dynamic-api.module.js +4 -3
- package/src/dynamic-api.module.js.map +1 -1
- package/src/gateways/base.gateway.js +13 -19
- package/src/gateways/base.gateway.js.map +1 -1
- package/src/helpers/event-registry.store.d.ts +29 -0
- package/src/helpers/event-registry.store.js +45 -0
- package/src/helpers/event-registry.store.js.map +1 -0
- package/src/helpers/index.d.ts +1 -0
- package/src/helpers/index.js +1 -0
- package/src/helpers/index.js.map +1 -1
- package/src/helpers/mixin-data.helper.d.ts +2 -2
- package/src/helpers/mixin-data.helper.js +14 -1
- package/src/helpers/mixin-data.helper.js.map +1 -1
- package/src/helpers/resolve-broadcast.helper.d.ts +8 -0
- package/src/helpers/resolve-broadcast.helper.js +25 -0
- package/src/helpers/resolve-broadcast.helper.js.map +1 -0
- package/src/helpers/socket-config.helper.js +14 -0
- package/src/helpers/socket-config.helper.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/interfaces/dynamic-api-global-state.interface.d.ts +2 -0
- package/src/interfaces/dynamic-api-options.interface.d.ts +2 -0
- package/src/interfaces/dynamic-api-options.interface.js.map +1 -1
- package/src/interfaces/dynamic-api-route-config.interface.d.ts +2 -1
- package/src/interfaces/dynamic-api-route-config.interface.js.map +1 -1
- package/src/interfaces/dynamic-api-service-callback.interface.d.ts +14 -1
- package/src/interfaces/dynamic-api-web-socket.interface.d.ts +1 -0
- package/src/modules/auth/auth.helper.js +2 -0
- package/src/modules/auth/auth.helper.js.map +1 -1
- package/src/modules/auth/interfaces/auth-options.interface.d.ts +2 -0
- package/src/modules/auth/mixins/auth-controller.mixin.js +49 -0
- package/src/modules/auth/mixins/auth-controller.mixin.js.map +1 -1
- package/src/modules/auth/mixins/auth-gateway.mixin.js +49 -0
- package/src/modules/auth/mixins/auth-gateway.mixin.js.map +1 -1
- package/src/modules/auth/services/base-auth.service.d.ts +10 -0
- package/src/modules/auth/services/base-auth.service.js +114 -28
- package/src/modules/auth/services/base-auth.service.js.map +1 -1
- package/src/predicates/admin.predicate.d.ts +9 -0
- package/src/predicates/admin.predicate.js +17 -0
- package/src/predicates/admin.predicate.js.map +1 -0
- package/src/predicates/composition.predicate.d.ts +6 -0
- package/src/predicates/composition.predicate.js +15 -0
- package/src/predicates/composition.predicate.js.map +1 -0
- package/src/predicates/group-member.predicate.d.ts +8 -0
- package/src/predicates/group-member.predicate.js +19 -0
- package/src/predicates/group-member.predicate.js.map +1 -0
- package/src/predicates/index.d.ts +6 -0
- package/src/predicates/index.js +23 -0
- package/src/predicates/index.js.map +1 -0
- package/src/predicates/ownership.predicate.d.ts +8 -0
- package/src/predicates/ownership.predicate.js +14 -0
- package/src/predicates/ownership.predicate.js.map +1 -0
- package/src/predicates/soft-delete.predicate.d.ts +7 -0
- package/src/predicates/soft-delete.predicate.js +8 -0
- package/src/predicates/soft-delete.predicate.js.map +1 -0
- package/src/predicates/visibility.predicate.d.ts +7 -0
- package/src/predicates/visibility.predicate.js +8 -0
- package/src/predicates/visibility.predicate.js.map +1 -0
- package/src/routes/aggregate/aggregate.helper.d.ts +2 -2
- package/src/routes/aggregate/aggregate.helper.js +3 -2
- package/src/routes/aggregate/aggregate.helper.js.map +1 -1
- package/src/routes/aggregate/aggregate.module.js +1 -1
- package/src/routes/aggregate/aggregate.module.js.map +1 -1
- package/src/routes/aggregate/base-aggregate.service.d.ts +2 -1
- package/src/routes/aggregate/base-aggregate.service.js +2 -2
- package/src/routes/aggregate/base-aggregate.service.js.map +1 -1
- package/src/routes/create-many/base-create-many.service.d.ts +2 -1
- package/src/routes/create-many/base-create-many.service.js +2 -2
- package/src/routes/create-many/base-create-many.service.js.map +1 -1
- package/src/routes/create-many/create-many-controller.mixin.js +1 -1
- package/src/routes/create-many/create-many-controller.mixin.js.map +1 -1
- package/src/routes/create-many/create-many-gateway.mixin.js +1 -1
- package/src/routes/create-many/create-many-gateway.mixin.js.map +1 -1
- package/src/routes/create-many/create-many.helper.d.ts +2 -2
- package/src/routes/create-many/create-many.helper.js +3 -2
- package/src/routes/create-many/create-many.helper.js.map +1 -1
- package/src/routes/create-many/create-many.module.js +1 -1
- package/src/routes/create-many/create-many.module.js.map +1 -1
- package/src/routes/create-one/base-create-one.service.d.ts +2 -1
- package/src/routes/create-one/base-create-one.service.js +1 -3
- package/src/routes/create-one/base-create-one.service.js.map +1 -1
- package/src/routes/create-one/create-one-controller.mixin.js +1 -1
- package/src/routes/create-one/create-one-controller.mixin.js.map +1 -1
- package/src/routes/create-one/create-one-gateway.mixin.js +1 -1
- package/src/routes/create-one/create-one-gateway.mixin.js.map +1 -1
- package/src/routes/create-one/create-one.helper.d.ts +2 -2
- package/src/routes/create-one/create-one.helper.js +3 -2
- package/src/routes/create-one/create-one.helper.js.map +1 -1
- package/src/routes/create-one/create-one.module.js +1 -1
- package/src/routes/create-one/create-one.module.js.map +1 -1
- package/src/routes/delete-many/base-delete-many.service.d.ts +2 -1
- package/src/routes/delete-many/base-delete-many.service.js +2 -2
- package/src/routes/delete-many/base-delete-many.service.js.map +1 -1
- package/src/routes/delete-many/delete-many-controller.mixin.js +1 -1
- package/src/routes/delete-many/delete-many-controller.mixin.js.map +1 -1
- package/src/routes/delete-many/delete-many-gateway.mixin.js +1 -1
- package/src/routes/delete-many/delete-many-gateway.mixin.js.map +1 -1
- package/src/routes/delete-many/delete-many.helper.d.ts +2 -2
- package/src/routes/delete-many/delete-many.helper.js +3 -2
- package/src/routes/delete-many/delete-many.helper.js.map +1 -1
- package/src/routes/delete-many/delete-many.module.js +1 -1
- package/src/routes/delete-many/delete-many.module.js.map +1 -1
- package/src/routes/delete-one/base-delete-one.service.d.ts +2 -1
- package/src/routes/delete-one/base-delete-one.service.js +2 -2
- package/src/routes/delete-one/base-delete-one.service.js.map +1 -1
- package/src/routes/delete-one/delete-one-controller.mixin.js +1 -1
- package/src/routes/delete-one/delete-one-controller.mixin.js.map +1 -1
- package/src/routes/delete-one/delete-one-gateway.mixin.js +1 -1
- package/src/routes/delete-one/delete-one-gateway.mixin.js.map +1 -1
- package/src/routes/delete-one/delete-one.helper.d.ts +2 -2
- package/src/routes/delete-one/delete-one.helper.js +3 -2
- package/src/routes/delete-one/delete-one.helper.js.map +1 -1
- package/src/routes/delete-one/delete-one.module.js +1 -1
- package/src/routes/delete-one/delete-one.module.js.map +1 -1
- package/src/routes/duplicate-many/base-duplicate-many.service.d.ts +2 -1
- package/src/routes/duplicate-many/base-duplicate-many.service.js +2 -2
- package/src/routes/duplicate-many/base-duplicate-many.service.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many-controller.mixin.js +1 -1
- package/src/routes/duplicate-many/duplicate-many-controller.mixin.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js +1 -1
- package/src/routes/duplicate-many/duplicate-many-gateway.mixin.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many.helper.d.ts +2 -2
- package/src/routes/duplicate-many/duplicate-many.helper.js +3 -2
- package/src/routes/duplicate-many/duplicate-many.helper.js.map +1 -1
- package/src/routes/duplicate-many/duplicate-many.module.js +1 -1
- package/src/routes/duplicate-many/duplicate-many.module.js.map +1 -1
- package/src/routes/duplicate-one/base-duplicate-one.service.d.ts +2 -1
- package/src/routes/duplicate-one/base-duplicate-one.service.js +1 -3
- package/src/routes/duplicate-one/base-duplicate-one.service.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one-controller.mixin.js +1 -1
- package/src/routes/duplicate-one/duplicate-one-controller.mixin.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js +1 -1
- package/src/routes/duplicate-one/duplicate-one-gateway.mixin.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one.helper.d.ts +2 -2
- package/src/routes/duplicate-one/duplicate-one.helper.js +3 -2
- package/src/routes/duplicate-one/duplicate-one.helper.js.map +1 -1
- package/src/routes/duplicate-one/duplicate-one.module.js +1 -1
- package/src/routes/duplicate-one/duplicate-one.module.js.map +1 -1
- package/src/routes/get-many/base-get-many.service.d.ts +2 -1
- package/src/routes/get-many/base-get-many.service.js +2 -2
- package/src/routes/get-many/base-get-many.service.js.map +1 -1
- package/src/routes/get-many/get-many.helper.d.ts +2 -2
- package/src/routes/get-many/get-many.helper.js +3 -2
- package/src/routes/get-many/get-many.helper.js.map +1 -1
- package/src/routes/get-many/get-many.module.js +1 -1
- package/src/routes/get-many/get-many.module.js.map +1 -1
- package/src/routes/get-one/base-get-one.service.d.ts +2 -1
- package/src/routes/get-one/base-get-one.service.js +1 -3
- package/src/routes/get-one/base-get-one.service.js.map +1 -1
- package/src/routes/get-one/get-one.helper.d.ts +2 -2
- package/src/routes/get-one/get-one.helper.js +3 -2
- package/src/routes/get-one/get-one.helper.js.map +1 -1
- package/src/routes/get-one/get-one.module.js +1 -1
- package/src/routes/get-one/get-one.module.js.map +1 -1
- package/src/routes/replace-one/base-replace-one.service.d.ts +2 -1
- package/src/routes/replace-one/base-replace-one.service.js +1 -3
- package/src/routes/replace-one/base-replace-one.service.js.map +1 -1
- package/src/routes/replace-one/replace-one-controller.mixin.js +1 -1
- package/src/routes/replace-one/replace-one-controller.mixin.js.map +1 -1
- package/src/routes/replace-one/replace-one-gateway.mixin.js +1 -1
- package/src/routes/replace-one/replace-one-gateway.mixin.js.map +1 -1
- package/src/routes/replace-one/replace-one.helper.d.ts +2 -2
- package/src/routes/replace-one/replace-one.helper.js +3 -2
- package/src/routes/replace-one/replace-one.helper.js.map +1 -1
- package/src/routes/replace-one/replace-one.module.js +1 -1
- package/src/routes/replace-one/replace-one.module.js.map +1 -1
- package/src/routes/update-many/base-update-many.service.d.ts +2 -1
- package/src/routes/update-many/base-update-many.service.js +2 -2
- package/src/routes/update-many/base-update-many.service.js.map +1 -1
- package/src/routes/update-many/update-many-controller.mixin.js +1 -1
- package/src/routes/update-many/update-many-controller.mixin.js.map +1 -1
- package/src/routes/update-many/update-many-gateway.mixin.js +1 -1
- package/src/routes/update-many/update-many-gateway.mixin.js.map +1 -1
- package/src/routes/update-many/update-many.helper.d.ts +2 -2
- package/src/routes/update-many/update-many.helper.js +3 -2
- package/src/routes/update-many/update-many.helper.js.map +1 -1
- package/src/routes/update-many/update-many.module.js +1 -1
- package/src/routes/update-many/update-many.module.js.map +1 -1
- package/src/routes/update-one/base-update-one.service.d.ts +2 -1
- package/src/routes/update-one/base-update-one.service.js +1 -3
- package/src/routes/update-one/base-update-one.service.js.map +1 -1
- package/src/routes/update-one/update-one-controller.mixin.js +1 -1
- package/src/routes/update-one/update-one-controller.mixin.js.map +1 -1
- package/src/routes/update-one/update-one-gateway.mixin.js +1 -1
- package/src/routes/update-one/update-one-gateway.mixin.js.map +1 -1
- package/src/routes/update-one/update-one.helper.d.ts +2 -2
- package/src/routes/update-one/update-one.helper.js +3 -2
- package/src/routes/update-one/update-one.helper.js.map +1 -1
- package/src/routes/update-one/update-one.module.js +1 -1
- package/src/routes/update-one/update-one.module.js.map +1 -1
- package/src/services/base/base.service.d.ts +3 -1
- package/src/services/base/base.service.js +32 -0
- package/src/services/base/base.service.js.map +1 -1
- package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.d.ts +1 -0
- package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js +17 -15
- package/src/services/dynamic-api-broadcast/dynamic-api-broadcast.service.js.map +1 -1
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js +1 -0
- package/src/services/dynamic-api-global-state/dynamic-api-global-state.service.js.map +1 -1
- package/src/version.json +1 -1
- package/test/for-feature/ability-predicates.e2e-spec.d.ts +1 -0
- package/test/for-feature/ability-predicates.e2e-spec.js +188 -0
- package/test/for-feature/ability-predicates.e2e-spec.js.map +1 -0
- package/test/for-feature/after-save-callback-reliability.e2e-spec.d.ts +1 -0
- package/test/for-feature/after-save-callback-reliability.e2e-spec.js +139 -0
- package/test/for-feature/after-save-callback-reliability.e2e-spec.js.map +1 -0
- package/test/for-feature/broadcast-event-registry.e2e-spec.d.ts +1 -0
- package/test/for-feature/broadcast-event-registry.e2e-spec.js +122 -0
- package/test/for-feature/broadcast-event-registry.e2e-spec.js.map +1 -0
- package/test/for-feature/db-aware-validators.e2e-spec.d.ts +1 -0
- package/test/for-feature/db-aware-validators.e2e-spec.js +121 -0
- package/test/for-feature/db-aware-validators.e2e-spec.js.map +1 -0
- package/test/for-feature/raw-update-callback-methods.e2e-spec.js +8 -6
- package/test/for-feature/raw-update-callback-methods.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-basic.e2e-spec.js +2 -0
- package/test/for-root/auth-api-basic.e2e-spec.js.map +1 -1
- package/test/for-root/auth-api-refresh-token.e2e-spec.js +101 -0
- package/test/for-root/auth-api-refresh-token.e2e-spec.js.map +1 -1
- package/test/for-root/initialization.e2e-spec.js +2 -0
- package/test/for-root/initialization.e2e-spec.js.map +1 -1
- package/test/for-root/websockets-auth-basic.e2e-spec.js +1 -0
- package/test/for-root/websockets-auth-basic.e2e-spec.js.map +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,75 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
|
|
3
|
+
## [4.17.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.15.0...v4.17.0) (2026-08-12)
|
|
4
|
+
|
|
5
|
+
### routes
|
|
6
|
+
|
|
7
|
+
* **routes:** remove unused AfterSaveCallback import left by the callbackRetry bundling ([a2bb491](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2bb491fb214c958fb93e831cef3278ca4c99954))
|
|
8
|
+
|
|
9
|
+
### callbacks
|
|
10
|
+
|
|
11
|
+
* **callbacks:** add global onAfterSaveError hook via forRoot ([a206e64](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a206e64eedcaf5779cd145d668a48156edec04b9))
|
|
12
|
+
* **callbacks:** add invokeAfterSaveCallback failure-isolation helper ([f5199be](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5199be7fab5220739af6e7d92954ea7b8d4b4a3))
|
|
13
|
+
* **callbacks:** isolate afterSaveCallback failures across all route types ([5886f67](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5886f67c9bcfbc6896b0086280770ffd0597f2f6))
|
|
14
|
+
|
|
15
|
+
### predicates
|
|
16
|
+
|
|
17
|
+
* **predicates:** add standard ability predicate factories ([f55973e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f55973e720b076bc4116436cd6b5b051a9f62a4d))
|
|
18
|
+
|
|
19
|
+
### websockets
|
|
20
|
+
|
|
21
|
+
* **websockets:** add failOnEventCollision option to enableDynamicAPIWebSockets ([cfb71a1](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/cfb71a1dc0b4bd1eb2d1ee0c7d7b5f13324b6180))
|
|
22
|
+
|
|
23
|
+
### broadcast
|
|
24
|
+
|
|
25
|
+
* **broadcast:** add internal event registry with collision detection ([503c514](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/503c514a9d4253bc1d1358f0591a5108ba687fb8))
|
|
26
|
+
* **broadcast:** catch and log emit failures in HTTP and WS broadcast paths ([9981d89](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9981d8933925e6ca5ea00404e3a797b705354888))
|
|
27
|
+
* **broadcast:** extract shared resolveBroadcast helper ([3890e95](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3890e95caf85b94c1145b9be9fa8bbf74820f545))
|
|
28
|
+
* **broadcast:** register broadcast events in a central registry at mixin-setup time ([47fa642](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/47fa642866e9cace9d4f4caed0a66ee7e916d8bb))
|
|
29
|
+
|
|
30
|
+
### decorators
|
|
31
|
+
|
|
32
|
+
* **decorators:** add EntityExists DB-aware existence validator ([d070e2e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d070e2e4bf5987283690eceb6fe1be1abfb33ec8))
|
|
33
|
+
* **decorators:** add IsUnique DB-aware uniqueness validator ([e2c978b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e2c978b4eead14286403c901a95f38a71ffc63f7))
|
|
34
|
+
|
|
35
|
+
## [4.16.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.15.0...v4.16.0) (2026-08-12)
|
|
36
|
+
|
|
37
|
+
### routes
|
|
38
|
+
|
|
39
|
+
* **routes:** remove unused AfterSaveCallback import left by the callbackRetry bundling ([a2bb491](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a2bb491fb214c958fb93e831cef3278ca4c99954))
|
|
40
|
+
|
|
41
|
+
### callbacks
|
|
42
|
+
|
|
43
|
+
* **callbacks:** add global onAfterSaveError hook via forRoot ([a206e64](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/a206e64eedcaf5779cd145d668a48156edec04b9))
|
|
44
|
+
* **callbacks:** add invokeAfterSaveCallback failure-isolation helper ([f5199be](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f5199be7fab5220739af6e7d92954ea7b8d4b4a3))
|
|
45
|
+
* **callbacks:** isolate afterSaveCallback failures across all route types ([5886f67](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/5886f67c9bcfbc6896b0086280770ffd0597f2f6))
|
|
46
|
+
|
|
47
|
+
### predicates
|
|
48
|
+
|
|
49
|
+
* **predicates:** add standard ability predicate factories ([f55973e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/f55973e720b076bc4116436cd6b5b051a9f62a4d))
|
|
50
|
+
|
|
51
|
+
### websockets
|
|
52
|
+
|
|
53
|
+
* **websockets:** add failOnEventCollision option to enableDynamicAPIWebSockets ([cfb71a1](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/cfb71a1dc0b4bd1eb2d1ee0c7d7b5f13324b6180))
|
|
54
|
+
|
|
55
|
+
### broadcast
|
|
56
|
+
|
|
57
|
+
* **broadcast:** add internal event registry with collision detection ([503c514](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/503c514a9d4253bc1d1358f0591a5108ba687fb8))
|
|
58
|
+
* **broadcast:** catch and log emit failures in HTTP and WS broadcast paths ([9981d89](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/9981d8933925e6ca5ea00404e3a797b705354888))
|
|
59
|
+
* **broadcast:** extract shared resolveBroadcast helper ([3890e95](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/3890e95caf85b94c1145b9be9fa8bbf74820f545))
|
|
60
|
+
* **broadcast:** register broadcast events in a central registry at mixin-setup time ([47fa642](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/47fa642866e9cace9d4f4caed0a66ee7e916d8bb))
|
|
61
|
+
|
|
62
|
+
### decorators
|
|
63
|
+
|
|
64
|
+
* **decorators:** add EntityExists DB-aware existence validator ([d070e2e](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/d070e2e4bf5987283690eceb6fe1be1abfb33ec8))
|
|
65
|
+
* **decorators:** add IsUnique DB-aware uniqueness validator ([e2c978b](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e2c978b4eead14286403c901a95f38a71ffc63f7))
|
|
66
|
+
|
|
67
|
+
## [4.15.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.14.1...v4.15.0) (2026-05-31)
|
|
68
|
+
|
|
69
|
+
### auth
|
|
70
|
+
|
|
71
|
+
* **auth:** add grace window, rotate=false, and atomic CAS rotation for refresh tokens ([e62b77d](https://github.com/MikeDev75015/mongodb-dynamic-api/commit/e62b77d3539abb3c7c50580a49888b5363bca310))
|
|
72
|
+
|
|
3
73
|
## [4.14.1](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.14.0...v4.14.1) (2026-05-27)
|
|
4
74
|
|
|
5
75
|
## [4.14.0](https://github.com/MikeDev75015/mongodb-dynamic-api/compare/v4.13.0...v4.14.0) (2026-05-26)
|
package/README.md
CHANGED
|
@@ -259,7 +259,7 @@ Register `UsersModule` in `AppModule`, run `npm run start:dev` — your API is l
|
|
|
259
259
|
| 🔐 **Authentication** | Dual-token JWT, 8 endpoints, cookie mode, revocation, OTP ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/authentication.md) |
|
|
260
260
|
| 🛡️ **Authorization** | Ability predicates, `filter` vs `throw` mode | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/authorization.md) |
|
|
261
261
|
| ⚡ **Caching** | Global cache, auto-purge endpoint, `disableCache` option ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/caching.md) |
|
|
262
|
-
| ✅ **Validation** | `class-validator`, global + per-route `ValidationPipe` | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/validation.md) |
|
|
262
|
+
| ✅ **Validation** | `class-validator`, global + per-route `ValidationPipe`, DB-aware `@IsUnique`/`@EntityExists` ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/validation.md) |
|
|
263
263
|
| 📡 **WebSockets** | Socket.IO, room-targeted broadcast, `onConnection`, debug ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/websockets.md) |
|
|
264
264
|
| 🟢 **Presence** | Online/offline tracking, InMemory & Redis adapters ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/presence.md) |
|
|
265
265
|
| 🔁 **Callbacks** | `beforeSave`, `afterSave`, `beforeDelete`, typed contexts ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/callbacks.md) |
|
|
@@ -267,6 +267,7 @@ Register `UsersModule` in `AppModule`, run `npm run start:dev` — your API is l
|
|
|
267
267
|
| 📚 **Swagger UI** | Auto-generated OpenAPI docs, visibility decorators | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/swagger-ui.md) |
|
|
268
268
|
| 🗂️ **Route Config** | DTOs, cascade delete, predicates, subPath, interceptors ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/route-config.md) |
|
|
269
269
|
| 🎛️ **Controller Config** | `forFeature` options, `customRoutes`, `extraProviders` ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/controller-config.md) |
|
|
270
|
+
| 🐞 **Debugging** | `MONGODB_DYNAMIC_API_LOGGER` levels, WS debug mode, where each log comes from ⭐ | [View](https://github.com/MikeDev75015/mongodb-dynamic-api/blob/main/README/debugging.md) |
|
|
270
271
|
|
|
271
272
|
> [!NOTE]
|
|
272
273
|
> **Key reminders:**
|
package/package.json
CHANGED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { ValidationOptions } from 'class-validator';
|
|
3
|
+
import { FilterQuery } from 'mongoose';
|
|
4
|
+
import { BaseEntity } from '../models';
|
|
5
|
+
interface EntityExistsOptions<Entity extends BaseEntity> {
|
|
6
|
+
field?: keyof Entity;
|
|
7
|
+
filter?: (value: unknown, dto: unknown) => FilterQuery<Entity>;
|
|
8
|
+
}
|
|
9
|
+
declare function EntityExists<Entity extends BaseEntity>(entity: Type<Entity>, options?: EntityExistsOptions<Entity>, validationOptions?: ValidationOptions): PropertyDecorator;
|
|
10
|
+
export { EntityExists, EntityExistsOptions };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntityExists = EntityExists;
|
|
4
|
+
const class_validator_1 = require("class-validator");
|
|
5
|
+
const services_1 = require("../services");
|
|
6
|
+
function EntityExists(entity, options = {}, validationOptions) {
|
|
7
|
+
return (object, propertyName) => {
|
|
8
|
+
(0, class_validator_1.registerDecorator)({
|
|
9
|
+
name: 'entityExists',
|
|
10
|
+
target: object.constructor,
|
|
11
|
+
propertyName: propertyName,
|
|
12
|
+
options: validationOptions,
|
|
13
|
+
constraints: [entity, options],
|
|
14
|
+
validator: {
|
|
15
|
+
async validate(value, args) {
|
|
16
|
+
if (value === undefined || value === null || value === '') {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
const [targetEntity, opts] = args.constraints;
|
|
20
|
+
const field = String(opts.field ?? '_id');
|
|
21
|
+
const model = await services_1.DynamicApiGlobalStateService.getEntityModel(targetEntity);
|
|
22
|
+
const filter = {
|
|
23
|
+
[field]: value,
|
|
24
|
+
...opts.filter?.(value, args.object),
|
|
25
|
+
};
|
|
26
|
+
const existing = await model.exists(filter);
|
|
27
|
+
return !!existing;
|
|
28
|
+
},
|
|
29
|
+
defaultMessage(args) {
|
|
30
|
+
const [targetEntity] = args.constraints;
|
|
31
|
+
return `Referenced ${targetEntity.name} does not exist`;
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=entity-exists.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-exists.decorator.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/entity-exists.decorator.ts"],"names":[],"mappings":";;AAwGS,oCAAY;AAvGrB,qDAA4F;AAG5F,0CAA2D;AA4D3D,SAAS,YAAY,CACnB,MAAoB,EACpB,UAAuC,EAAE,EACzC,iBAAqC;IAErC,OAAO,CAAC,MAAc,EAAE,YAA6B,EAAE,EAAE;QACvD,IAAA,mCAAiB,EAAC;YAChB,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY,EAAE,YAAsB;YACpC,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAC9B,SAAS,EAAE;gBACT,KAAK,CAAC,QAAQ,CAAC,KAAc,EAAE,IAAyB;oBACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;wBAC1D,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,GACxB,IAAI,CAAC,WAA0D,CAAC;oBAClE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;oBAC1C,MAAM,KAAK,GAAG,MAAM,uCAA4B,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;oBAE9E,MAAM,MAAM,GAAG;wBACb,CAAC,KAAK,CAAC,EAAE,KAAK;wBACd,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;qBACd,CAAC;oBAEzB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5C,OAAO,CAAC,CAAC,QAAQ,CAAC;gBACpB,CAAC;gBACD,cAAc,CAAC,IAAyB;oBACtC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,WAA6B,CAAC;oBAC1D,OAAO,cAAc,YAAY,CAAC,IAAI,iBAAiB,CAAC;gBAC1D,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export * from './api-endpoint-visibility.decorator';
|
|
2
2
|
export * from './derived-field.decorator';
|
|
3
3
|
export * from './disable-cache.decorator';
|
|
4
|
+
export * from './entity-exists.decorator';
|
|
5
|
+
export * from './is-unique.decorator';
|
|
4
6
|
export * from './protected-field.decorator';
|
|
5
7
|
export * from './public.decorator';
|
|
6
8
|
export * from './schema-options.decorator';
|
package/src/decorators/index.js
CHANGED
|
@@ -17,6 +17,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./api-endpoint-visibility.decorator"), exports);
|
|
18
18
|
__exportStar(require("./derived-field.decorator"), exports);
|
|
19
19
|
__exportStar(require("./disable-cache.decorator"), exports);
|
|
20
|
+
__exportStar(require("./entity-exists.decorator"), exports);
|
|
21
|
+
__exportStar(require("./is-unique.decorator"), exports);
|
|
20
22
|
__exportStar(require("./protected-field.decorator"), exports);
|
|
21
23
|
__exportStar(require("./public.decorator"), exports);
|
|
22
24
|
__exportStar(require("./schema-options.decorator"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,4DAA0C;AAC1C,4DAA0C;AAC1C,8DAA4C;AAC5C,qDAAmC;AACnC,6DAA2C;AAC3C,6DAA2C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,4DAA0C;AAC1C,4DAA0C;AAC1C,4DAA0C;AAC1C,wDAAsC;AACtC,8DAA4C;AAC5C,qDAAmC;AACnC,6DAA2C;AAC3C,6DAA2C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Type } from '@nestjs/common';
|
|
2
|
+
import { ValidationOptions } from 'class-validator';
|
|
3
|
+
import { BaseEntity } from '../models';
|
|
4
|
+
interface IsUniqueOptions<Entity extends BaseEntity> {
|
|
5
|
+
field?: keyof Entity;
|
|
6
|
+
caseInsensitive?: boolean;
|
|
7
|
+
ignoreId?: string;
|
|
8
|
+
}
|
|
9
|
+
declare function IsUnique<Entity extends BaseEntity>(entity: Type<Entity>, options?: IsUniqueOptions<Entity>, validationOptions?: ValidationOptions): PropertyDecorator;
|
|
10
|
+
export { IsUnique, IsUniqueOptions };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IsUnique = IsUnique;
|
|
4
|
+
const class_validator_1 = require("class-validator");
|
|
5
|
+
const services_1 = require("../services");
|
|
6
|
+
function escapeRegExp(value) {
|
|
7
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
|
|
8
|
+
}
|
|
9
|
+
function IsUnique(entity, options = {}, validationOptions) {
|
|
10
|
+
return (object, propertyName) => {
|
|
11
|
+
(0, class_validator_1.registerDecorator)({
|
|
12
|
+
name: 'isUnique',
|
|
13
|
+
target: object.constructor,
|
|
14
|
+
propertyName: propertyName,
|
|
15
|
+
options: validationOptions,
|
|
16
|
+
constraints: [entity, options, propertyName],
|
|
17
|
+
validator: {
|
|
18
|
+
async validate(value, args) {
|
|
19
|
+
if (value === undefined || value === null || value === '') {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
const [targetEntity, opts, defaultField] = args.constraints;
|
|
23
|
+
const field = String(opts.field ?? defaultField);
|
|
24
|
+
const model = await services_1.DynamicApiGlobalStateService.getEntityModel(targetEntity);
|
|
25
|
+
const filter = {
|
|
26
|
+
[field]: opts.caseInsensitive && typeof value === 'string'
|
|
27
|
+
? { $regex: `^${escapeRegExp(value)}$`, $options: 'i' }
|
|
28
|
+
: value,
|
|
29
|
+
};
|
|
30
|
+
if (opts.ignoreId) {
|
|
31
|
+
const currentId = args.object[opts.ignoreId];
|
|
32
|
+
if (currentId) {
|
|
33
|
+
Object.assign(filter, { _id: { $ne: currentId } });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const existing = await model.exists(filter);
|
|
37
|
+
return !existing;
|
|
38
|
+
},
|
|
39
|
+
defaultMessage(args) {
|
|
40
|
+
const [targetEntity, opts, defaultField] = args.constraints;
|
|
41
|
+
const field = String(opts.field ?? defaultField);
|
|
42
|
+
return `${field} must be unique for ${targetEntity.name}`;
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=is-unique.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-unique.decorator.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/decorators/is-unique.decorator.ts"],"names":[],"mappings":";;AAgHS,4BAAQ;AA/GjB,qDAA4F;AAG5F,0CAA2D;AAwB3D,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAA,KAAK,CAAC,CAAC;AAC/D,CAAC;AAgCD,SAAS,QAAQ,CACf,MAAoB,EACpB,UAAmC,EAAE,EACrC,iBAAqC;IAErC,OAAO,CAAC,MAAc,EAAE,YAA6B,EAAE,EAAE;QACvD,IAAA,mCAAiB,EAAC;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,YAAY,EAAE,YAAsB;YACpC,OAAO,EAAE,iBAAiB;YAC1B,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,YAAsB,CAAC;YACtD,SAAS,EAAE;gBACT,KAAK,CAAC,QAAQ,CAAC,KAAc,EAAE,IAAyB;oBACtD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;wBAC1D,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,GACtC,IAAI,CAAC,WAA8D,CAAC;oBACtE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,uCAA4B,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;oBAE9E,MAAM,MAAM,GAAG;wBACb,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,eAAe,IAAI,OAAO,KAAK,KAAK,QAAQ;4BACxD,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;4BACvD,CAAC,CAAC,KAAK;qBACa,CAAC;oBAEzB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAClB,MAAM,SAAS,GAAI,IAAI,CAAC,MAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBAC1E,IAAI,SAAS,EAAE,CAAC;4BACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;wBACrD,CAAC;oBACH,CAAC;oBAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5C,OAAO,CAAC,QAAQ,CAAC;gBACnB,CAAC;gBACD,cAAc,CAAC,IAAyB;oBACtC,MAAM,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,GACtC,IAAI,CAAC,WAA8D,CAAC;oBACtE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;oBACjD,OAAO,GAAG,KAAK,uBAAuB,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC5D,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { BaseEntity } from './models';
|
|
|
4
4
|
import { DynamicApiGlobalStateService } from './services';
|
|
5
5
|
export declare class DynamicApiModule {
|
|
6
6
|
static readonly state: DynamicApiGlobalStateService;
|
|
7
|
-
static forRoot<Entity extends BaseEntity = any>(uri: string, { useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions, }?: DynamicApiForRootOptions<Entity>): DynamicModule;
|
|
7
|
+
static forRoot<Entity extends BaseEntity = any>(uri: string, { useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError, }?: DynamicApiForRootOptions<Entity>): DynamicModule;
|
|
8
8
|
static forFeature<Entity extends BaseEntity>({ entity, controllerOptions, routes, webSocket: featureWebSocket, extraImports, extraProviders, extraControllers, customRoutes, }: DynamicApiForFeatureOptions<Entity>): Promise<DynamicModule>;
|
|
9
9
|
private static buildStateFromOptions;
|
|
10
10
|
private static setDefaultRoutes;
|
|
@@ -22,13 +22,13 @@ const modules_1 = require("./modules");
|
|
|
22
22
|
const routes_1 = require("./routes");
|
|
23
23
|
const services_1 = require("./services");
|
|
24
24
|
let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
25
|
-
static forRoot(uri, { useGlobalCache = true, cacheOptions = {}, useAuth, routesConfig, webSocket, broadcastGatewayOptions, } = {}) {
|
|
25
|
+
static forRoot(uri, { useGlobalCache = true, cacheOptions = {}, useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError, } = {}) {
|
|
26
26
|
if (!uri) {
|
|
27
27
|
throw new Error('You must provide a valid mongodb uri in the forRoot method to use MongoDB Dynamic API');
|
|
28
28
|
}
|
|
29
29
|
this.state.set([
|
|
30
30
|
'partial',
|
|
31
|
-
this.buildStateFromOptions(uri, useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions),
|
|
31
|
+
this.buildStateFromOptions(uri, useGlobalCache, cacheOptions, { useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError }),
|
|
32
32
|
]);
|
|
33
33
|
return {
|
|
34
34
|
module: DynamicApiModule_1,
|
|
@@ -141,12 +141,13 @@ let DynamicApiModule = DynamicApiModule_1 = class DynamicApiModule {
|
|
|
141
141
|
});
|
|
142
142
|
});
|
|
143
143
|
}
|
|
144
|
-
static buildStateFromOptions(uri, useGlobalCache, cacheOptions, useAuth, routesConfig, webSocket, broadcastGatewayOptions) {
|
|
144
|
+
static buildStateFromOptions(uri, useGlobalCache, cacheOptions, { useAuth, routesConfig, webSocket, broadcastGatewayOptions, onAfterSaveError, }) {
|
|
145
145
|
const routesConfigState = this.state.get('routesConfig');
|
|
146
146
|
return {
|
|
147
147
|
uri,
|
|
148
148
|
initialized: true,
|
|
149
149
|
isGlobalCacheEnabled: useGlobalCache,
|
|
150
|
+
...(onAfterSaveError ? { onAfterSaveError } : {}),
|
|
150
151
|
...(cacheOptions?.excludePaths ? { cacheExcludedPaths: cacheOptions?.excludePaths } : {}),
|
|
151
152
|
...(useAuth?.userEntity ? {
|
|
152
153
|
isAuthEnabled: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-api.module.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/dynamic-api.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,yDAAmE;AACnE,2CAAuD;AACvD,uCAAqE;AACrE,8EAAyE;AACzE,+CAAkD;AAElD,yCAA8D;AAC9D,qCAAkD;AAClD,uCAA2H;AAC3H,iDAA4D;AAC5D,
|
|
1
|
+
{"version":3,"file":"dynamic-api.module.js","sourceRoot":"","sources":["../../libs/dynamic-api/src/dynamic-api.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,30 +42,24 @@ class BaseGateway {
|
|
|
42
42
|
body.ids.length);
|
|
43
43
|
}
|
|
44
44
|
broadcastIfNeeded(socket, event, data, broadcastConfig) {
|
|
45
|
-
|
|
45
|
+
const resolved = (0, helpers_1.resolveBroadcast)(event, data, broadcastConfig, socket.user);
|
|
46
|
+
if (!resolved) {
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
48
|
-
const {
|
|
49
|
-
if (typeof enabled === 'boolean' && !enabled) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
const broadcastData = typeof enabled === 'function'
|
|
53
|
-
? data.filter((item) => enabled(item, socket.user))
|
|
54
|
-
: data;
|
|
55
|
-
if (!broadcastData.length) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const broadcastEvent = eventName || event;
|
|
59
|
-
const resolvedRooms = (0, helpers_1.resolveRooms)(rooms, broadcastData, socket.user);
|
|
49
|
+
const { event: broadcastEvent, rooms, data: broadcastData } = resolved;
|
|
60
50
|
if (helpers_1.DynamicApiWsConfigStore.debug) {
|
|
61
|
-
this.logger.log(`[WS] broadcastIfNeeded – event=${broadcastEvent}, rooms=${
|
|
51
|
+
this.logger.log(`[WS] broadcastIfNeeded – event=${broadcastEvent}, rooms=${rooms ? JSON.stringify(rooms) : 'all'}, items=${broadcastData.length}`);
|
|
62
52
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
try {
|
|
54
|
+
if (rooms) {
|
|
55
|
+
socket.nsp.to(rooms).emit(broadcastEvent, broadcastData);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
socket.broadcast.emit(broadcastEvent, broadcastData);
|
|
59
|
+
}
|
|
66
60
|
}
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.logger.error(`[WS] Failed to emit "${broadcastEvent}": ${error.message}`, error.stack);
|
|
69
63
|
}
|
|
70
64
|
}
|
|
71
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.gateway.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/gateways/base.gateway.ts"],"names":[],"mappings":";;;AACA,mDAAiD;AAEjD,8DAAyD;AACzD,
|
|
1
|
+
{"version":3,"file":"base.gateway.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/gateways/base.gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { RouteType } from '../interfaces';
|
|
2
|
+
type BroadcastChannel = 'http' | 'ws';
|
|
3
|
+
interface BroadcastEventDescriptor {
|
|
4
|
+
event: string;
|
|
5
|
+
routeType: RouteType | 'Auth';
|
|
6
|
+
entityName: string;
|
|
7
|
+
displayedName: string;
|
|
8
|
+
channels: BroadcastChannel[];
|
|
9
|
+
hasRoomTargeting: boolean;
|
|
10
|
+
hasAbilityPredicate: boolean;
|
|
11
|
+
isCustomEventName: boolean;
|
|
12
|
+
}
|
|
13
|
+
interface EventCollision {
|
|
14
|
+
event: string;
|
|
15
|
+
registrations: Pick<BroadcastEventDescriptor, 'routeType' | 'entityName'>[];
|
|
16
|
+
}
|
|
17
|
+
type BroadcastEventRegistration = Omit<BroadcastEventDescriptor, 'channels'> & {
|
|
18
|
+
channel: BroadcastChannel;
|
|
19
|
+
};
|
|
20
|
+
declare class DynamicApiEventRegistryStore {
|
|
21
|
+
private static readonly logger;
|
|
22
|
+
private static readonly registry;
|
|
23
|
+
private static readonly _collisions;
|
|
24
|
+
static register({ channel, ...descriptor }: BroadcastEventRegistration): void;
|
|
25
|
+
static getAll(): BroadcastEventDescriptor[];
|
|
26
|
+
static getCollisions(): EventCollision[];
|
|
27
|
+
static reset(): void;
|
|
28
|
+
}
|
|
29
|
+
export { DynamicApiEventRegistryStore, BroadcastEventDescriptor, BroadcastEventRegistration, EventCollision, BroadcastChannel };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DynamicApiEventRegistryStore = void 0;
|
|
4
|
+
const logger_1 = require("../logger");
|
|
5
|
+
class DynamicApiEventRegistryStore {
|
|
6
|
+
static register({ channel, ...descriptor }) {
|
|
7
|
+
const existing = DynamicApiEventRegistryStore.registry.get(descriptor.event);
|
|
8
|
+
if (!existing) {
|
|
9
|
+
DynamicApiEventRegistryStore.registry.set(descriptor.event, { ...descriptor, channels: [channel] });
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const isSameSource = existing.routeType === descriptor.routeType && existing.entityName === descriptor.entityName;
|
|
13
|
+
if (!isSameSource) {
|
|
14
|
+
DynamicApiEventRegistryStore.logger.warn(`[Broadcast Registry] Event name collision on "${descriptor.event}": already registered by `
|
|
15
|
+
+ `${existing.routeType}/${existing.entityName}, now also requested by ${descriptor.routeType}/${descriptor.entityName}. `
|
|
16
|
+
+ 'Set a unique "eventName" on one of the routes to avoid client-side ambiguity.');
|
|
17
|
+
DynamicApiEventRegistryStore._collisions.push({
|
|
18
|
+
event: descriptor.event,
|
|
19
|
+
registrations: [
|
|
20
|
+
{ routeType: existing.routeType, entityName: existing.entityName },
|
|
21
|
+
{ routeType: descriptor.routeType, entityName: descriptor.entityName },
|
|
22
|
+
],
|
|
23
|
+
});
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (!existing.channels.includes(channel)) {
|
|
27
|
+
existing.channels.push(channel);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
static getAll() {
|
|
31
|
+
return Array.from(DynamicApiEventRegistryStore.registry.values());
|
|
32
|
+
}
|
|
33
|
+
static getCollisions() {
|
|
34
|
+
return [...DynamicApiEventRegistryStore._collisions];
|
|
35
|
+
}
|
|
36
|
+
static reset() {
|
|
37
|
+
DynamicApiEventRegistryStore.registry.clear();
|
|
38
|
+
DynamicApiEventRegistryStore._collisions.length = 0;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.DynamicApiEventRegistryStore = DynamicApiEventRegistryStore;
|
|
42
|
+
DynamicApiEventRegistryStore.logger = new logger_1.MongoDBDynamicApiLogger(DynamicApiEventRegistryStore.name);
|
|
43
|
+
DynamicApiEventRegistryStore.registry = new Map();
|
|
44
|
+
DynamicApiEventRegistryStore._collisions = [];
|
|
45
|
+
//# sourceMappingURL=event-registry.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.store.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/event-registry.store.ts"],"names":[],"mappings":";;;AAAA,sCAAoD;AAiCpD,MAAM,4BAA4B;IAKhC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,UAAU,EAA8B;QACpE,MAAM,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAE7E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,4BAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,UAAU,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACpG,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,SAAS,IAAI,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,UAAU,CAAC;QAElH,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,4BAA4B,CAAC,MAAM,CAAC,IAAI,CACtC,iDAAiD,UAAU,CAAC,KAAK,2BAA2B;kBAC1F,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,UAAU,2BAA2B,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,UAAU,IAAI;kBACxH,+EAA+E,CAClF,CAAC;YAEF,4BAA4B,CAAC,WAAW,CAAC,IAAI,CAAC;gBAC5C,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,aAAa,EAAE;oBACb,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE;oBAClE,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE;iBACvE;aACF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,OAAO,CAAC,GAAG,4BAA4B,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAGD,MAAM,CAAC,KAAK;QACV,4BAA4B,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC9C,4BAA4B,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACtD,CAAC;;AAGM,oEAA4B;AAnDX,mCAAM,GAAG,IAAI,gCAAuB,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;AACxE,qCAAQ,GAAG,IAAI,GAAG,EAAoC,CAAC;AACvD,wCAAW,GAAqB,EAAE,CAAC"}
|
package/src/helpers/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * from './from-user.helper';
|
|
|
4
4
|
export * from './lodash.helper';
|
|
5
5
|
export * from './mixin-data.helper';
|
|
6
6
|
export * from './repository.helper';
|
|
7
|
+
export * from './resolve-broadcast.helper';
|
|
7
8
|
export * from './resolve-rooms.helper';
|
|
8
9
|
export * from './route-decorators.helper';
|
|
9
10
|
export * from './route-description.helper';
|
package/src/helpers/index.js
CHANGED
|
@@ -20,6 +20,7 @@ __exportStar(require("./from-user.helper"), exports);
|
|
|
20
20
|
__exportStar(require("./lodash.helper"), exports);
|
|
21
21
|
__exportStar(require("./mixin-data.helper"), exports);
|
|
22
22
|
__exportStar(require("./repository.helper"), exports);
|
|
23
|
+
__exportStar(require("./resolve-broadcast.helper"), exports);
|
|
23
24
|
__exportStar(require("./resolve-rooms.helper"), exports);
|
|
24
25
|
__exportStar(require("./route-decorators.helper"), exports);
|
|
25
26
|
__exportStar(require("./route-description.helper"), exports);
|
package/src/helpers/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yEAAuD;AACvD,kDAAgC;AAChC,qDAAmC;AACnC,kDAAgC;AAChC,sDAAoC;AACpC,sDAAoC;AACpC,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,0DAAwC;AACxC,6DAA2C;AAC3C,6DAA2C;AAC3C,oDAAkC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yEAAuD;AACvD,kDAAgC;AAChC,qDAAmC;AACnC,kDAAgC;AAChC,sDAAoC;AACpC,sDAAoC;AACpC,6DAA2C;AAC3C,yDAAuC;AACvC,4DAA0C;AAC1C,6DAA2C;AAC3C,kDAAgC;AAChC,yDAAuC;AACvC,0DAAwC;AACxC,6DAA2C;AAC3C,6DAA2C;AAC3C,oDAAkC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Type } from '@nestjs/common';
|
|
2
|
-
import { AbilityPredicate, DynamicApiControllerOptions, DynamicAPIRouteConfig, PredicateBehavior, RouteType } from '../interfaces';
|
|
2
|
+
import { AbilityPredicate, BroadcastConfig, DynamicApiControllerOptions, DynamicAPIRouteConfig, PredicateBehavior, RouteType } from '../interfaces';
|
|
3
3
|
import { BaseEntity } from '../models';
|
|
4
|
-
declare function getMixinData<Entity extends BaseEntity>(entity: Type<Entity>, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }: DynamicApiControllerOptions<Entity>, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }: DynamicAPIRouteConfig<Entity>, isGateway?: boolean): {
|
|
4
|
+
declare function getMixinData<Entity extends BaseEntity>(entity: Type<Entity>, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }: DynamicApiControllerOptions<Entity>, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }: DynamicAPIRouteConfig<Entity>, isGateway?: boolean, broadcastConfig?: BroadcastConfig<Entity>): {
|
|
5
5
|
routeType: RouteType;
|
|
6
6
|
displayedName: string;
|
|
7
7
|
description: string;
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getMixinData = getMixinData;
|
|
4
4
|
const lodash_helper_1 = require("./lodash.helper");
|
|
5
|
+
const event_registry_store_1 = require("./event-registry.store");
|
|
5
6
|
const controller_ability_predicates_helper_1 = require("./controller-ability-predicates.helper");
|
|
6
7
|
const format_helper_1 = require("./format.helper");
|
|
7
|
-
function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }, isGateway = false) {
|
|
8
|
+
function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCache: disableCacheController, abilityPredicates: controllerAbilityPredicates, }, { type: routeType, subPath, description, isPublic: isPublicRoute, disableCache: disableCacheRoute, abilityPredicate: routeAbilityPredicate, predicateBehavior, eventName, }, isGateway = false, broadcastConfig) {
|
|
8
9
|
const displayedName = (0, format_helper_1.getDisplayedName)(apiTag, entity.name, subPath);
|
|
9
10
|
let isPublic;
|
|
10
11
|
if (typeof isPublicRoute === 'boolean') {
|
|
@@ -28,6 +29,18 @@ function getMixinData(entity, { apiTag, isPublic: isPublicController, disableCac
|
|
|
28
29
|
}
|
|
29
30
|
const abilityPredicate = routeAbilityPredicate ?? (0, controller_ability_predicates_helper_1.getPredicateFromControllerAbilityPredicates)(controllerAbilityPredicates, routeType);
|
|
30
31
|
const event = eventName ?? (0, lodash_helper_1.kebabCase)(`${routeType}/${displayedName}`);
|
|
32
|
+
if (broadcastConfig) {
|
|
33
|
+
event_registry_store_1.DynamicApiEventRegistryStore.register({
|
|
34
|
+
event: broadcastConfig.eventName || event,
|
|
35
|
+
routeType,
|
|
36
|
+
entityName: entity.name,
|
|
37
|
+
displayedName,
|
|
38
|
+
channel: isGateway ? 'ws' : 'http',
|
|
39
|
+
hasRoomTargeting: !!broadcastConfig.rooms,
|
|
40
|
+
hasAbilityPredicate: typeof broadcastConfig.enabled === 'function',
|
|
41
|
+
isCustomEventName: !!broadcastConfig.eventName,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
31
44
|
return {
|
|
32
45
|
routeType,
|
|
33
46
|
displayedName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"mixin-data.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/mixin-data.helper.ts"],"names":[],"mappings":";;AAkGS,oCAAY;AAjGrB,mDAA4C;AAC5C,iEAAsE;AAUtE,iGAAqG;AACrG,mDAAmD;AAGnD,SAAS,YAAY,CACnB,MAAoB,EACpB,EACE,MAAM,EACN,QAAQ,EAAE,kBAAkB,EAC5B,YAAY,EAAE,sBAAsB,EACpC,iBAAiB,EAAE,2BAA2B,GACV,EACtC,EACE,IAAI,EAAE,SAAS,EACf,OAAO,EACP,WAAW,EACX,QAAQ,EAAE,aAAa,EACvB,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EAAE,qBAAqB,EACvC,iBAAiB,EACjB,SAAS,GACqB,EAChC,SAAS,GAAG,KAAK,EACjB,eAAyC;IAWzC,MAAM,aAAa,GAAG,IAAA,gCAAgB,EAAC,MAAM,EAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,QAAiB,CAAC;IACtB,IAAI,OAAO,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,QAAQ,GAAG,aAAa,CAAC;IAC3B,CAAC;SAAM,IAAI,OAAO,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACnD,QAAQ,GAAG,kBAAkB,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,IAAI,YAAqB,CAAC;IAC1B,IAAI,OAAO,iBAAiB,KAAK,SAAS,EAAE,CAAC;QAC3C,YAAY,GAAG,iBAAiB,CAAC;IACnC,CAAC;SAAM,IAAI,OAAO,sBAAsB,KAAK,SAAS,EAAE,CAAC;QACvD,YAAY,GAAG,sBAAsB,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,MAAM,gBAAgB,GAAG,qBAAqB,IAAI,IAAA,kFAA2C,EAC3F,2BAA2B,EAC3B,SAAS,CACV,CAAC;IAEF,MAAM,KAAK,GAAG,SAAS,IAAI,IAAA,yBAAS,EAAC,GAAG,SAAS,IAAI,aAAa,EAAE,CAAC,CAAC;IAEtE,IAAI,eAAe,EAAE,CAAC;QACpB,mDAA4B,CAAC,QAAQ,CAAC;YACpC,KAAK,EAAE,eAAe,CAAC,SAAS,IAAI,KAAK;YACzC,SAAS;YACT,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,aAAa;YACb,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM;YAClC,gBAAgB,EAAE,CAAC,CAAC,eAAe,CAAC,KAAK;YACzC,mBAAmB,EAAE,OAAO,eAAe,CAAC,OAAO,KAAK,UAAU;YAClE,iBAAiB,EAAE,CAAC,CAAC,eAAe,CAAC,SAAS;SAC/C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,SAAS;QACT,aAAa;QACb,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BroadcastConfig } from '../interfaces';
|
|
2
|
+
interface ResolvedBroadcast<T extends object> {
|
|
3
|
+
event: string;
|
|
4
|
+
rooms?: string[];
|
|
5
|
+
data: T[];
|
|
6
|
+
}
|
|
7
|
+
declare function resolveBroadcast<T extends object, User = unknown>(event: string, data: T[], broadcastConfig: BroadcastConfig<T, User> | undefined, user?: User): ResolvedBroadcast<T> | undefined;
|
|
8
|
+
export { resolveBroadcast, ResolvedBroadcast };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveBroadcast = resolveBroadcast;
|
|
4
|
+
const resolve_rooms_helper_1 = require("./resolve-rooms.helper");
|
|
5
|
+
function resolveBroadcast(event, data, broadcastConfig, user) {
|
|
6
|
+
if (!broadcastConfig || !data?.length) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
const { enabled, eventName, rooms } = broadcastConfig;
|
|
10
|
+
if (typeof enabled === 'boolean' && !enabled) {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
const broadcastData = typeof enabled === 'function'
|
|
14
|
+
? data.filter((item) => enabled(item, user))
|
|
15
|
+
: data;
|
|
16
|
+
if (!broadcastData.length) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
event: eventName || event,
|
|
21
|
+
rooms: (0, resolve_rooms_helper_1.resolveRooms)(rooms, broadcastData, user),
|
|
22
|
+
data: broadcastData,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=resolve-broadcast.helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-broadcast.helper.js","sourceRoot":"","sources":["../../../libs/dynamic-api/src/helpers/resolve-broadcast.helper.ts"],"names":[],"mappings":";;AAkDS,4CAAgB;AAlDzB,iEAAsD;AAmBtD,SAAS,gBAAgB,CACvB,KAAa,EACb,IAAS,EACT,eAAqD,EACrD,IAAW;IAEX,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,eAAe,CAAC;IAEtD,IAAI,OAAO,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,OAAO,KAAK,UAAU;QACjD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAE,OAA8C,CAAC,IAAI,EAAE,IAAY,CAAC,CAAC;QAC5F,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,SAAS,IAAI,KAAK;QACzB,KAAK,EAAE,IAAA,mCAAY,EAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC;QAC/C,IAAI,EAAE,aAAa;KACpB,CAAC;AACJ,CAAC"}
|