@quadnix/octo 0.0.22 → 0.0.24
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/dist/app.type.d.ts +236 -27
- package/dist/app.type.js +92 -1
- package/dist/app.type.js.map +1 -1
- package/dist/decorators/action.decorator.d.ts +4 -5
- package/dist/decorators/action.decorator.js +42 -41
- package/dist/decorators/action.decorator.js.map +1 -1
- package/dist/decorators/anchor.decorator.d.ts +2 -2
- package/dist/decorators/anchor.decorator.js +16 -11
- package/dist/decorators/anchor.decorator.js.map +1 -1
- package/dist/decorators/enable-hook.decorator.d.ts +5 -0
- package/dist/decorators/enable-hook.decorator.js +7 -2
- package/dist/decorators/enable-hook.decorator.js.map +1 -1
- package/dist/decorators/event-source.decorator.d.ts +5 -1
- package/dist/decorators/event-source.decorator.js +5 -1
- package/dist/decorators/event-source.decorator.js.map +1 -1
- package/dist/decorators/factory.decorator.d.ts +14 -2
- package/dist/decorators/factory.decorator.js +12 -3
- package/dist/decorators/factory.decorator.js.map +1 -1
- package/dist/decorators/model.decorator.d.ts +19 -5
- package/dist/decorators/model.decorator.js +40 -14
- package/dist/decorators/model.decorator.js.map +1 -1
- package/dist/decorators/module.decorator.d.ts +4 -75
- package/dist/decorators/module.decorator.js +18 -58
- package/dist/decorators/module.decorator.js.map +1 -1
- package/dist/decorators/on-event.decorator.d.ts +1 -1
- package/dist/decorators/on-event.decorator.js +1 -1
- package/dist/decorators/on-event.decorator.js.map +1 -1
- package/dist/decorators/overlay.decorator.d.ts +16 -6
- package/dist/decorators/overlay.decorator.js +36 -15
- package/dist/decorators/overlay.decorator.js.map +1 -1
- package/dist/decorators/resource.decorator.d.ts +17 -6
- package/dist/decorators/resource.decorator.js +37 -15
- package/dist/decorators/resource.decorator.js.map +1 -1
- package/dist/decorators/validate.decorator.d.ts +12 -4
- package/dist/decorators/validate.decorator.js +24 -2
- package/dist/decorators/validate.decorator.js.map +1 -1
- package/dist/errors/container.error.d.ts +20 -0
- package/dist/errors/container.error.js +29 -0
- package/dist/errors/container.error.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/input.error.d.ts +49 -0
- package/dist/errors/input.error.js +59 -0
- package/dist/errors/input.error.js.map +1 -0
- package/dist/errors/module.error.d.ts +7 -0
- package/dist/errors/module.error.js +11 -0
- package/dist/errors/module.error.js.map +1 -0
- package/dist/errors/node.error.d.ts +63 -0
- package/dist/errors/node.error.js +87 -0
- package/dist/errors/node.error.js.map +1 -0
- package/dist/errors/schema.error.d.ts +7 -0
- package/dist/errors/schema.error.js +11 -0
- package/dist/errors/schema.error.js.map +1 -0
- package/dist/errors/transaction.error.d.ts +56 -0
- package/dist/errors/transaction.error.js +79 -0
- package/dist/errors/transaction.error.js.map +1 -0
- package/dist/events/action.event.d.ts +14 -0
- package/dist/events/action.event.js +12 -0
- package/dist/events/action.event.js.map +1 -0
- package/dist/events/event.model.d.ts +8 -12
- package/dist/events/event.model.js +7 -11
- package/dist/events/event.model.js.map +1 -1
- package/dist/events/hook/commit.hook.event.d.ts +28 -0
- package/dist/events/hook/commit.hook.event.js +29 -0
- package/dist/events/hook/commit.hook.event.js.map +1 -0
- package/dist/events/hook/hook.event.d.ts +10 -0
- package/dist/events/hook/hook.event.js +11 -0
- package/dist/events/hook/hook.event.js.map +1 -0
- package/dist/events/hook/index.d.ts +4 -0
- package/dist/events/hook/index.js +5 -0
- package/dist/events/hook/index.js.map +1 -0
- package/dist/events/hook/model.hook.event.d.ts +28 -0
- package/dist/events/hook/model.hook.event.js +29 -0
- package/dist/events/hook/model.hook.event.js.map +1 -0
- package/dist/events/hook/resource.hook.event.d.ts +28 -0
- package/dist/events/hook/resource.hook.event.js +29 -0
- package/dist/events/hook/resource.hook.event.js.map +1 -0
- package/dist/events/index.d.ts +7 -0
- package/dist/events/index.js +8 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/module.event.d.ts +3 -7
- package/dist/events/module.event.js +2 -6
- package/dist/events/module.event.js.map +1 -1
- package/dist/events/registration.event.d.ts +22 -57
- package/dist/events/registration.event.js +29 -70
- package/dist/events/registration.event.js.map +1 -1
- package/dist/events/serialization.event.d.ts +34 -41
- package/dist/events/serialization.event.js +59 -37
- package/dist/events/serialization.event.js.map +1 -1
- package/dist/events/transaction.event.d.ts +72 -29
- package/dist/events/transaction.event.js +63 -27
- package/dist/events/transaction.event.js.map +1 -1
- package/dist/functions/container/container.d.ts +56 -9
- package/dist/functions/container/container.js +108 -19
- package/dist/functions/container/container.js.map +1 -1
- package/dist/functions/container/test-container.d.ts +11 -13
- package/dist/functions/container/test-container.js +35 -38
- package/dist/functions/container/test-container.js.map +1 -1
- package/dist/functions/dependency/dependency.d.ts +9 -0
- package/dist/functions/dependency/dependency.js +10 -3
- package/dist/functions/dependency/dependency.js.map +1 -1
- package/dist/functions/diff/diff-metadata.d.ts +6 -5
- package/dist/functions/diff/diff-metadata.js +6 -2
- package/dist/functions/diff/diff-metadata.js.map +1 -1
- package/dist/functions/diff/diff.d.ts +16 -5
- package/dist/functions/diff/diff.js +11 -4
- package/dist/functions/diff/diff.js.map +1 -1
- package/dist/functions/diff/diff.utility.d.ts +5 -2
- package/dist/functions/diff/diff.utility.js +28 -4
- package/dist/functions/diff/diff.utility.js.map +1 -1
- package/dist/functions/hook/commit.hook.d.ts +17 -3
- package/dist/functions/hook/commit.hook.js +19 -16
- package/dist/functions/hook/commit.hook.js.map +1 -1
- package/dist/functions/hook/hook.interface.d.ts +10 -6
- package/dist/functions/hook/model-action.hook.d.ts +20 -5
- package/dist/functions/hook/model-action.hook.js +23 -39
- package/dist/functions/hook/model-action.hook.js.map +1 -1
- package/dist/functions/hook/resource-action.hook.d.ts +20 -5
- package/dist/functions/hook/resource-action.hook.js +21 -18
- package/dist/functions/hook/resource-action.hook.js.map +1 -1
- package/dist/functions/node/node-action.abstract.d.ts +10 -0
- package/dist/functions/node/node-action.abstract.js +23 -0
- package/dist/functions/node/node-action.abstract.js.map +1 -0
- package/dist/functions/node/node.abstract.d.ts +20 -9
- package/dist/functions/node/node.abstract.js +101 -32
- package/dist/functions/node/node.abstract.js.map +1 -1
- package/dist/functions/node/node.interface.d.ts +22 -18
- package/dist/functions/schema/schema.d.ts +21 -0
- package/dist/functions/schema/schema.js +55 -0
- package/dist/functions/schema/schema.js.map +1 -0
- package/dist/index.d.ts +31 -32
- package/dist/index.js +29 -12
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +32 -15
- package/dist/main.js +65 -50
- package/dist/main.js.map +1 -1
- package/dist/models/account/account.model.d.ts +26 -0
- package/dist/models/account/account.model.js +71 -0
- package/dist/models/account/account.model.js.map +1 -0
- package/dist/models/account/account.schema.d.ts +13 -0
- package/dist/models/account/account.schema.js +18 -0
- package/dist/models/account/account.schema.js.map +1 -0
- package/dist/models/app/app.model.d.ts +9 -14
- package/dist/models/app/app.model.js +27 -27
- package/dist/models/app/app.model.js.map +1 -1
- package/dist/models/app/app.schema.d.ts +6 -0
- package/dist/models/app/app.schema.js +24 -0
- package/dist/models/app/app.schema.js.map +1 -0
- package/dist/models/deployment/deployment.model.d.ts +9 -12
- package/dist/models/deployment/deployment.model.js +11 -11
- package/dist/models/deployment/deployment.model.js.map +1 -1
- package/dist/models/deployment/deployment.schema.d.ts +10 -0
- package/dist/models/deployment/deployment.schema.js +28 -0
- package/dist/models/deployment/deployment.schema.js.map +1 -0
- package/dist/models/environment/environment.model.d.ts +8 -14
- package/dist/models/environment/environment.model.js +10 -22
- package/dist/models/environment/environment.model.js.map +1 -1
- package/dist/models/environment/environment.schema.d.ts +16 -0
- package/dist/models/environment/environment.schema.js +41 -0
- package/dist/models/environment/environment.schema.js.map +1 -0
- package/dist/models/execution/execution.model.d.ts +9 -13
- package/dist/models/execution/execution.model.js +18 -25
- package/dist/models/execution/execution.model.js.map +1 -1
- package/dist/models/execution/execution.schema.d.ts +17 -0
- package/dist/models/execution/execution.schema.js +37 -0
- package/dist/models/execution/execution.schema.js.map +1 -0
- package/dist/models/filesystem/filesystem.model.d.ts +13 -0
- package/dist/models/filesystem/filesystem.model.js +46 -0
- package/dist/models/filesystem/filesystem.model.js.map +1 -0
- package/dist/models/filesystem/filesystem.schema.d.ts +6 -0
- package/dist/models/filesystem/filesystem.schema.js +24 -0
- package/dist/models/filesystem/filesystem.schema.js.map +1 -0
- package/dist/models/image/image.model.d.ts +10 -40
- package/dist/models/image/image.model.js +17 -27
- package/dist/models/image/image.model.js.map +1 -1
- package/dist/models/image/image.schema.d.ts +12 -0
- package/dist/models/image/image.schema.js +34 -0
- package/dist/models/image/image.schema.js.map +1 -0
- package/dist/models/model-action.interface.d.ts +5 -13
- package/dist/models/model.abstract.d.ts +28 -13
- package/dist/models/model.abstract.js +179 -13
- package/dist/models/model.abstract.js.map +1 -1
- package/dist/models/model.interface.d.ts +17 -6
- package/dist/models/pipeline/pipeline.model.d.ts +8 -7
- package/dist/models/pipeline/pipeline.model.js +10 -10
- package/dist/models/pipeline/pipeline.model.js.map +1 -1
- package/dist/models/pipeline/pipeline.schema.d.ts +7 -0
- package/dist/models/pipeline/pipeline.schema.js +25 -0
- package/dist/models/pipeline/pipeline.schema.js.map +1 -0
- package/dist/models/region/region.model.d.ts +11 -8
- package/dist/models/region/region.model.js +25 -12
- package/dist/models/region/region.model.js.map +1 -1
- package/dist/models/region/region.schema.d.ts +6 -0
- package/dist/models/region/region.schema.js +24 -0
- package/dist/models/region/region.schema.js.map +1 -0
- package/dist/models/server/server.model.d.ts +8 -10
- package/dist/models/server/server.model.js +13 -11
- package/dist/models/server/server.model.js.map +1 -1
- package/dist/models/server/server.schema.d.ts +9 -0
- package/dist/models/server/server.schema.js +27 -0
- package/dist/models/server/server.schema.js.map +1 -0
- package/dist/models/service/service.model.d.ts +7 -9
- package/dist/models/service/service.model.js +15 -13
- package/dist/models/service/service.model.js.map +1 -1
- package/dist/models/service/service.schema.d.ts +9 -0
- package/dist/models/service/service.schema.js +27 -0
- package/dist/models/service/service.schema.js.map +1 -0
- package/dist/models/subnet/subnet.model.d.ts +11 -33
- package/dist/models/subnet/subnet.model.js +14 -34
- package/dist/models/subnet/subnet.model.js.map +1 -1
- package/dist/models/subnet/subnet.schema.d.ts +38 -0
- package/dist/models/subnet/subnet.schema.js +53 -0
- package/dist/models/subnet/subnet.schema.js.map +1 -0
- package/dist/modules/module.abstract.d.ts +24 -0
- package/dist/modules/module.abstract.js +17 -0
- package/dist/modules/module.abstract.js.map +1 -0
- package/dist/modules/module.container.d.ts +38 -18
- package/dist/modules/module.container.js +140 -81
- package/dist/modules/module.container.js.map +1 -1
- package/dist/modules/module.interface.d.ts +18 -2
- package/dist/modules/test-module.container.d.ts +39 -15
- package/dist/modules/test-module.container.js +262 -26
- package/dist/modules/test-module.container.js.map +1 -1
- package/dist/overlays/anchor.abstract.d.ts +16 -8
- package/dist/overlays/anchor.abstract.js +4 -1
- package/dist/overlays/anchor.abstract.js.map +1 -1
- package/dist/overlays/anchor.interface.d.ts +8 -8
- package/dist/overlays/anchor.schema.d.ts +14 -0
- package/dist/overlays/anchor.schema.js +12 -0
- package/dist/overlays/anchor.schema.js.map +1 -0
- package/dist/overlays/overlay-data.repository.d.ts +9 -4
- package/dist/overlays/overlay-data.repository.js +20 -10
- package/dist/overlays/overlay-data.repository.js.map +1 -1
- package/dist/overlays/overlay.abstract.d.ts +15 -13
- package/dist/overlays/overlay.abstract.js +22 -8
- package/dist/overlays/overlay.abstract.js.map +1 -1
- package/dist/overlays/overlay.interface.d.ts +6 -7
- package/dist/overlays/overlay.schema.d.ts +11 -0
- package/dist/overlays/overlay.schema.js +12 -0
- package/dist/overlays/overlay.schema.js.map +1 -0
- package/dist/resources/resource-action.interface.d.ts +7 -3
- package/dist/resources/resource-data.repository.d.ts +8 -3
- package/dist/resources/resource-data.repository.js +64 -82
- package/dist/resources/resource-data.repository.js.map +1 -1
- package/dist/resources/resource.abstract.d.ts +53 -27
- package/dist/resources/resource.abstract.js +233 -57
- package/dist/resources/resource.abstract.js.map +1 -1
- package/dist/resources/resource.interface.d.ts +45 -8
- package/dist/resources/resource.schema.d.ts +17 -0
- package/dist/resources/resource.schema.js +14 -0
- package/dist/resources/resource.schema.js.map +1 -0
- package/dist/services/capture/capture.service.d.ts +12 -6
- package/dist/services/capture/capture.service.js +14 -5
- package/dist/services/capture/capture.service.js.map +1 -1
- package/dist/services/event/event.service.d.ts +8 -2
- package/dist/services/event/event.service.js +9 -2
- package/dist/services/event/event.service.js.map +1 -1
- package/dist/services/input/input.service.d.ts +68 -6
- package/dist/services/input/input.service.js +296 -14
- package/dist/services/input/input.service.js.map +1 -1
- package/dist/services/schema-translation/schema-translation.service.d.ts +19 -0
- package/dist/services/schema-translation/schema-translation.service.js +48 -0
- package/dist/services/schema-translation/schema-translation.service.js.map +1 -0
- package/dist/services/serialization/model/model-serialization.service.d.ts +7 -4
- package/dist/services/serialization/model/model-serialization.service.js +65 -33
- package/dist/services/serialization/model/model-serialization.service.js.map +1 -1
- package/dist/services/serialization/resource/resource-serialization.service.d.ts +7 -1
- package/dist/services/serialization/resource/resource-serialization.service.js +64 -80
- package/dist/services/serialization/resource/resource-serialization.service.js.map +1 -1
- package/dist/services/state-management/local.state-provider.d.ts +3 -1
- package/dist/services/state-management/local.state-provider.js +8 -7
- package/dist/services/state-management/local.state-provider.js.map +1 -1
- package/dist/services/state-management/state-management.service.d.ts +8 -3
- package/dist/services/state-management/state-management.service.js +25 -8
- package/dist/services/state-management/state-management.service.js.map +1 -1
- package/dist/services/state-management/state-provider.interface.d.ts +3 -1
- package/dist/services/state-management/test.state-provider.d.ts +3 -1
- package/dist/services/state-management/test.state-provider.js +5 -1
- package/dist/services/state-management/test.state-provider.js.map +1 -1
- package/dist/services/transaction/transaction.service.d.ts +22 -11
- package/dist/services/transaction/transaction.service.js +215 -66
- package/dist/services/transaction/transaction.service.js.map +1 -1
- package/dist/services/validation/validation.service.d.ts +8 -3
- package/dist/services/validation/validation.service.js +33 -12
- package/dist/services/validation/validation.service.js.map +1 -1
- package/dist/utilities/array/array.utility.d.ts +3 -0
- package/dist/utilities/array/array.utility.js +3 -0
- package/dist/utilities/array/array.utility.js.map +1 -1
- package/dist/utilities/cidr/cidr.utility.d.ts +3 -0
- package/dist/utilities/cidr/cidr.utility.js +3 -0
- package/dist/utilities/cidr/cidr.utility.js.map +1 -1
- package/dist/utilities/node/node.utility.d.ts +7 -0
- package/dist/utilities/node/node.utility.js +25 -0
- package/dist/utilities/node/node.utility.js.map +1 -0
- package/dist/utilities/object/object.utility.d.ts +6 -0
- package/dist/utilities/object/object.utility.js +36 -0
- package/dist/utilities/object/object.utility.js.map +1 -1
- package/dist/utilities/test-helpers/test-classes.d.ts +84 -0
- package/dist/utilities/test-helpers/test-classes.js +103 -0
- package/dist/utilities/test-helpers/test-classes.js.map +1 -0
- package/dist/utilities/test-helpers/test-models.d.ts +47 -0
- package/dist/utilities/test-helpers/test-models.js +230 -0
- package/dist/utilities/test-helpers/test-models.js.map +1 -0
- package/dist/utilities/test-helpers/test-overlays.d.ts +13 -0
- package/dist/utilities/test-helpers/test-overlays.js +56 -0
- package/dist/utilities/test-helpers/test-overlays.js.map +1 -0
- package/dist/utilities/test-helpers/test-resources.d.ts +31 -0
- package/dist/utilities/test-helpers/test-resources.js +171 -0
- package/dist/utilities/test-helpers/test-resources.js.map +1 -0
- package/dist/utilities/validation/validation.utility.d.ts +34 -3
- package/dist/utilities/validation/validation.utility.js +124 -2
- package/dist/utilities/validation/validation.utility.js.map +1 -1
- package/package.json +7 -7
- package/dist/events/error.event.d.ts +0 -35
- package/dist/events/error.event.js +0 -36
- package/dist/events/error.event.js.map +0 -1
- package/dist/events/hook.event.d.ts +0 -194
- package/dist/events/hook.event.js +0 -195
- package/dist/events/hook.event.js.map +0 -1
- package/dist/models/app/app.interface.d.ts +0 -9
- package/dist/models/app/app.interface.js +0 -2
- package/dist/models/app/app.interface.js.map +0 -1
- package/dist/models/deployment/deployment.interface.d.ts +0 -9
- package/dist/models/deployment/deployment.interface.js +0 -2
- package/dist/models/deployment/deployment.interface.js.map +0 -1
- package/dist/models/environment/environment.interface.d.ts +0 -12
- package/dist/models/environment/environment.interface.js +0 -2
- package/dist/models/environment/environment.interface.js.map +0 -1
- package/dist/models/execution/execution.interface.d.ts +0 -14
- package/dist/models/execution/execution.interface.js +0 -2
- package/dist/models/execution/execution.interface.js.map +0 -1
- package/dist/models/image/image.interface.d.ts +0 -12
- package/dist/models/image/image.interface.js +0 -2
- package/dist/models/image/image.interface.js.map +0 -1
- package/dist/models/pipeline/pipeline.interface.d.ts +0 -10
- package/dist/models/pipeline/pipeline.interface.js +0 -2
- package/dist/models/pipeline/pipeline.interface.js.map +0 -1
- package/dist/models/region/region.interface.d.ts +0 -9
- package/dist/models/region/region.interface.js +0 -2
- package/dist/models/region/region.interface.js.map +0 -1
- package/dist/models/server/server.interface.d.ts +0 -9
- package/dist/models/server/server.interface.js +0 -2
- package/dist/models/server/server.interface.js.map +0 -1
- package/dist/models/service/service.interface.d.ts +0 -9
- package/dist/models/service/service.interface.js +0 -2
- package/dist/models/service/service.interface.js.map +0 -1
- package/dist/models/subnet/subnet.interface.d.ts +0 -13
- package/dist/models/subnet/subnet.interface.js +0 -2
- package/dist/models/subnet/subnet.interface.js.map +0 -1
- package/dist/overlays/overlay.service.d.ts +0 -17
- package/dist/overlays/overlay.service.js +0 -41
- package/dist/overlays/overlay.service.js.map +0 -1
- package/dist/resources/shared-resource.abstract.d.ts +0 -13
- package/dist/resources/shared-resource.abstract.js +0 -47
- package/dist/resources/shared-resource.abstract.js.map +0 -1
|
@@ -2,48 +2,84 @@ import { Event } from './event.model.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* The TransactionEvent class is the superclass for all events in relation to transactions.
|
|
4
4
|
* A transaction processes actions generated from model and resource diffs.
|
|
5
|
-
* Thus, the events are usually in relation with these actions.
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
* It is not a good practice to create an event from this class directly,
|
|
9
|
-
* but should rather create one from one of the subclasses.
|
|
10
|
-
* This promotes a more accurate classification of events.
|
|
11
|
-
* :::
|
|
6
|
+
* @group Events/Transaction
|
|
12
7
|
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```ts
|
|
15
|
-
* const myEvent = new TransactionEvent('MyActionName');
|
|
16
|
-
* EventService.getInstance().emit(myEvent);
|
|
17
|
-
* ```
|
|
18
|
-
* @group Events
|
|
19
8
|
* @returns The Event instance.
|
|
20
9
|
*/
|
|
21
10
|
export class TransactionEvent extends Event {
|
|
22
11
|
}
|
|
23
12
|
/**
|
|
24
|
-
* This event is emitted when a model action is done executing.
|
|
13
|
+
* This event is emitted when a model action in a transaction is done executing.
|
|
14
|
+
*
|
|
15
|
+
* @group Events/Transaction
|
|
25
16
|
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```ts
|
|
28
|
-
* const myEvent = new ModelActionTransactionEvent('MyActionName');
|
|
29
|
-
* EventService.getInstance().emit(myEvent);
|
|
30
|
-
* ```
|
|
31
|
-
* @group Events
|
|
32
17
|
* @returns The Event instance.
|
|
33
18
|
*/
|
|
34
19
|
export class ModelActionTransactionEvent extends TransactionEvent {
|
|
35
20
|
}
|
|
36
21
|
/**
|
|
37
|
-
* This event is emitted when
|
|
22
|
+
* This event is emitted when transaction prepares a model diff.
|
|
23
|
+
|
|
24
|
+
* @group Events/Transaction
|
|
25
|
+
*
|
|
26
|
+
* @returns The Event instance.
|
|
27
|
+
*/
|
|
28
|
+
export class ModelDiffsTransactionEvent extends TransactionEvent {
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* This event is emitted when transaction prepares a model transaction.
|
|
32
|
+
|
|
33
|
+
* @group Events/Transaction
|
|
34
|
+
*
|
|
35
|
+
* @returns The Event instance.
|
|
36
|
+
*/
|
|
37
|
+
export class ModelTransactionTransactionEvent extends TransactionEvent {
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* This event is emitted when a resource action in a transaction is done executing.
|
|
41
|
+
*
|
|
42
|
+
* @group Events/Transaction
|
|
43
|
+
*
|
|
44
|
+
* @returns The Event instance.
|
|
45
|
+
*/
|
|
46
|
+
export class ResourceActionCompletedTransactionEvent extends TransactionEvent {
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* This event is emitted when a resource action in a transaction begins executing.
|
|
50
|
+
*
|
|
51
|
+
* @group Events/Transaction
|
|
52
|
+
*
|
|
53
|
+
* @returns The Event instance.
|
|
54
|
+
*/
|
|
55
|
+
export class ResourceActionInitiatedTransactionEvent extends TransactionEvent {
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* This event is emitted when a resource action in a transaction is done executing.
|
|
59
|
+
* It emits a summary of the action.
|
|
60
|
+
*
|
|
61
|
+
* @group Events/Transaction
|
|
62
|
+
*
|
|
63
|
+
* @returns The Event instance.
|
|
64
|
+
*/
|
|
65
|
+
export class ResourceActionSummaryTransactionEvent extends TransactionEvent {
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* This event is emitted when transaction prepares a resource diff.
|
|
69
|
+
|
|
70
|
+
* @group Events/Transaction
|
|
71
|
+
*
|
|
72
|
+
* @returns The Event instance.
|
|
73
|
+
*/
|
|
74
|
+
export class ResourceDiffsTransactionEvent extends TransactionEvent {
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* This event is emitted when transaction prepares a resource transaction.
|
|
78
|
+
|
|
79
|
+
* @group Events/Transaction
|
|
38
80
|
*
|
|
39
|
-
* @example
|
|
40
|
-
* ```ts
|
|
41
|
-
* const myEvent = new ResourceActionTransactionEvent('MyActionName');
|
|
42
|
-
* EventService.getInstance().emit(myEvent);
|
|
43
|
-
* ```
|
|
44
|
-
* @group Events
|
|
45
81
|
* @returns The Event instance.
|
|
46
82
|
*/
|
|
47
|
-
export class
|
|
83
|
+
export class ResourceTransactionTransactionEvent extends TransactionEvent {
|
|
48
84
|
}
|
|
49
85
|
//# sourceMappingURL=transaction.event.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.event.js","sourceRoot":"","sources":["../../src/events/transaction.event.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transaction.event.js","sourceRoot":"","sources":["../../src/events/transaction.event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAoB,SAAQ,KAAQ;CAAG;AAEpD;;;;;;GAMG;AACH,MAAM,OAAO,2BAA4B,SAAQ,gBAAsB;CAAG;AAE1E;;;;;;GAMG;AACH,MAAM,OAAO,0BAA2B,SAAQ,gBAAkC;CAAG;AAErF;;;;;;GAMG;AACH,MAAM,OAAO,gCAAiC,SAAQ,gBAAkC;CAAG;AAE3F;;;;;;GAMG;AACH,MAAM,OAAO,uCAAwC,SAAQ,gBAA8B;CAAG;AAE9F;;;;;;GAMG;AACH,MAAM,OAAO,uCAAwC,SAAQ,gBAA8B;CAAG;AAE9F;;;;;;;GAOG;AACH,MAAM,OAAO,qCAAsC,SAAQ,gBAGzD;CAAG;AAEL;;;;;;GAMG;AACH,MAAM,OAAO,6BAA8B,SAAQ,gBAAsD;CAAG;AAE5G;;;;;;GAMG;AACH,MAAM,OAAO,mCAAoC,SAAQ,gBAAsD;CAAG"}
|
|
@@ -2,6 +2,13 @@ import type { Constructable } from '../../app.type.js';
|
|
|
2
2
|
type Factory<T> = {
|
|
3
3
|
create: (...args: unknown[]) => Promise<T>;
|
|
4
4
|
};
|
|
5
|
+
type FactoryValue<T> = Factory<T> | [Promise<Factory<T>>, (factory: Factory<T>) => void];
|
|
6
|
+
type FactoryContainer<T> = {
|
|
7
|
+
factory: FactoryValue<T>;
|
|
8
|
+
metadata: {
|
|
9
|
+
[key: string]: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
5
12
|
/**
|
|
6
13
|
* The Container class is a box to hold all registered factories.
|
|
7
14
|
*
|
|
@@ -10,44 +17,84 @@ type Factory<T> = {
|
|
|
10
17
|
*
|
|
11
18
|
* By using the Container and Factory concepts, it is possible to override internal class definitions at runtime.
|
|
12
19
|
* It is an incredibly powerful tool to customize implementation.
|
|
20
|
+
*
|
|
21
|
+
* @group Functions/Container
|
|
13
22
|
*/
|
|
14
23
|
export declare class Container {
|
|
15
|
-
private
|
|
16
|
-
private
|
|
24
|
+
private FACTORY_TIMEOUT_IN_MS;
|
|
25
|
+
private readonly factories;
|
|
26
|
+
private static instance;
|
|
27
|
+
private readonly startupUnhandledPromises;
|
|
28
|
+
private constructor();
|
|
29
|
+
copyFactories(): {
|
|
30
|
+
[key: string]: FactoryContainer<unknown>[];
|
|
31
|
+
};
|
|
17
32
|
/**
|
|
18
|
-
* `
|
|
33
|
+
* `container.get()` allows to get an instance of a class using its factory.
|
|
34
|
+
* If the factory is not yet registered, it places a blocking promise in the queue to wait for the registration.
|
|
19
35
|
*
|
|
20
36
|
* @param type The type or name of the class to get.
|
|
21
37
|
* @param options Allows selection of a specific factory to use to get the instance.
|
|
22
38
|
* - The `args` option supplies arguments to the factory.
|
|
39
|
+
* - The `metadata` option identifies the factory.
|
|
23
40
|
* @returns The instance of the class.
|
|
24
41
|
*/
|
|
25
|
-
|
|
26
|
-
args?:
|
|
42
|
+
get<T, F extends Factory<T> = never>(type: Constructable<T> | string, options?: {
|
|
43
|
+
args?: Parameters<F['create']>;
|
|
44
|
+
metadata?: {
|
|
45
|
+
[key: string]: string;
|
|
46
|
+
};
|
|
27
47
|
}): Promise<T>;
|
|
48
|
+
static getInstance(): Container;
|
|
49
|
+
has<T>(type: Constructable<T> | string, options?: {
|
|
50
|
+
metadata?: {
|
|
51
|
+
[key: string]: string;
|
|
52
|
+
};
|
|
53
|
+
}): boolean;
|
|
28
54
|
/**
|
|
29
55
|
* `Container.registerFactory()` allows to register a factory for a class.
|
|
30
56
|
*
|
|
31
57
|
* @param type The type or name of the class for which the factory is registered.
|
|
32
58
|
* @param factory The factory class being registered.
|
|
59
|
+
* @param options Distinguishes between different factories of the same class.
|
|
60
|
+
* - The `metadata` attaches custom metadata to the factory.
|
|
33
61
|
*/
|
|
34
|
-
|
|
62
|
+
registerFactory<T>(type: Constructable<T> | string, factory: Factory<T>, options?: {
|
|
63
|
+
metadata?: {
|
|
64
|
+
[key: string]: string;
|
|
65
|
+
};
|
|
66
|
+
}): void;
|
|
67
|
+
registerValue<T>(type: Constructable<T> | string, value: T, options?: {
|
|
68
|
+
metadata?: {
|
|
69
|
+
[key: string]: string;
|
|
70
|
+
};
|
|
71
|
+
}): void;
|
|
72
|
+
registerStartupUnhandledPromise<T>(promise: Promise<T>): void;
|
|
35
73
|
/**
|
|
36
74
|
* `Container.reset()` clears all registered factories and empties the container. This is mostly used in testing.
|
|
37
75
|
*/
|
|
38
|
-
|
|
76
|
+
reset(): void;
|
|
77
|
+
setFactories(factories: {
|
|
78
|
+
[key: string]: FactoryContainer<unknown>[];
|
|
79
|
+
}): void;
|
|
39
80
|
/**
|
|
40
81
|
* The Container, by default, will wait a maximum of 5 seconds for a factory to resolve and provide an instance.
|
|
41
82
|
* This method allows to change that timeout.
|
|
42
83
|
*
|
|
43
84
|
* @param timeoutInMs The timeout in milliseconds.
|
|
44
85
|
*/
|
|
45
|
-
|
|
86
|
+
setFactoryTimeout(timeoutInMs: number): void;
|
|
46
87
|
/**
|
|
47
88
|
* `Container.unRegisterFactory()` will unregister all factories of a class.
|
|
48
89
|
*
|
|
49
90
|
* @param type The type or name of the class for which all factory is unregistered.
|
|
91
|
+
* @param options
|
|
50
92
|
*/
|
|
51
|
-
|
|
93
|
+
unRegisterFactory<T>(type: Constructable<T> | string, options?: {
|
|
94
|
+
metadata?: {
|
|
95
|
+
[key: string]: string;
|
|
96
|
+
};
|
|
97
|
+
}): void;
|
|
98
|
+
waitToResolveAllFactories(): Promise<void>;
|
|
52
99
|
}
|
|
53
100
|
export {};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ContainerRegistrationError, ContainerResolutionError } from '../../errors/index.js';
|
|
2
|
+
import { DiffUtility } from '../diff/diff.utility.js';
|
|
1
3
|
/**
|
|
2
4
|
* The Container class is a box to hold all registered factories.
|
|
3
5
|
*
|
|
@@ -6,22 +8,46 @@
|
|
|
6
8
|
*
|
|
7
9
|
* By using the Container and Factory concepts, it is possible to override internal class definitions at runtime.
|
|
8
10
|
* It is an incredibly powerful tool to customize implementation.
|
|
11
|
+
*
|
|
12
|
+
* @group Functions/Container
|
|
9
13
|
*/
|
|
10
14
|
export class Container {
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
constructor() {
|
|
16
|
+
this.FACTORY_TIMEOUT_IN_MS = 3000;
|
|
17
|
+
this.factories = {};
|
|
18
|
+
this.startupUnhandledPromises = [];
|
|
19
|
+
}
|
|
20
|
+
copyFactories() {
|
|
21
|
+
const newFactoriesCopy = {};
|
|
22
|
+
for (const [type, factoryContainers] of Object.entries(this.factories)) {
|
|
23
|
+
newFactoriesCopy[type] = [];
|
|
24
|
+
for (const factoryContainer of factoryContainers) {
|
|
25
|
+
newFactoriesCopy[type].push({
|
|
26
|
+
factory: factoryContainer.factory,
|
|
27
|
+
metadata: { ...factoryContainer.metadata },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return newFactoriesCopy;
|
|
32
|
+
}
|
|
13
33
|
/**
|
|
14
|
-
* `
|
|
34
|
+
* `container.get()` allows to get an instance of a class using its factory.
|
|
35
|
+
* If the factory is not yet registered, it places a blocking promise in the queue to wait for the registration.
|
|
15
36
|
*
|
|
16
37
|
* @param type The type or name of the class to get.
|
|
17
38
|
* @param options Allows selection of a specific factory to use to get the instance.
|
|
18
39
|
* - The `args` option supplies arguments to the factory.
|
|
40
|
+
* - The `metadata` option identifies the factory.
|
|
19
41
|
* @returns The instance of the class.
|
|
20
42
|
*/
|
|
21
|
-
|
|
43
|
+
async get(type, options) {
|
|
22
44
|
const args = options?.args || [];
|
|
45
|
+
const metadata = options?.metadata || {};
|
|
23
46
|
const name = typeof type === 'string' ? type : type.name;
|
|
24
|
-
|
|
47
|
+
if (!(name in this.factories)) {
|
|
48
|
+
this.factories[name] = [];
|
|
49
|
+
}
|
|
50
|
+
const factoryContainer = this.factories[name].find((f) => DiffUtility.isObjectDeepEquals(f.metadata, metadata));
|
|
25
51
|
if (factoryContainer?.factory) {
|
|
26
52
|
if (!Array.isArray(factoryContainer.factory)) {
|
|
27
53
|
return factoryContainer.factory.create(...args);
|
|
@@ -31,13 +57,15 @@ export class Container {
|
|
|
31
57
|
return factory.create(...args);
|
|
32
58
|
}
|
|
33
59
|
}
|
|
34
|
-
const newFactoryContainer = {
|
|
35
|
-
|
|
60
|
+
const newFactoryContainer = {
|
|
61
|
+
metadata,
|
|
62
|
+
};
|
|
63
|
+
this.factories[name].push(newFactoryContainer);
|
|
36
64
|
let promiseResolver;
|
|
37
65
|
let promiseTimeout;
|
|
38
66
|
const promise = new Promise((resolve, reject) => {
|
|
39
67
|
promiseTimeout = setTimeout(() => {
|
|
40
|
-
reject(new
|
|
68
|
+
reject(new ContainerResolutionError('Timed out waiting for factory to resolve!', type));
|
|
41
69
|
}, this.FACTORY_TIMEOUT_IN_MS);
|
|
42
70
|
promiseResolver = resolve;
|
|
43
71
|
});
|
|
@@ -48,37 +76,78 @@ export class Container {
|
|
|
48
76
|
}
|
|
49
77
|
return factory.create(...args);
|
|
50
78
|
}
|
|
79
|
+
static getInstance() {
|
|
80
|
+
if (!this.instance) {
|
|
81
|
+
this.instance = new Container();
|
|
82
|
+
}
|
|
83
|
+
return this.instance;
|
|
84
|
+
}
|
|
85
|
+
has(type, options) {
|
|
86
|
+
const metadata = options?.metadata || {};
|
|
87
|
+
const name = typeof type === 'string' ? type : type.name;
|
|
88
|
+
if (!(name in this.factories)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return this.factories[name].some((f) => DiffUtility.isObjectDeepEquals(f.metadata, metadata));
|
|
92
|
+
}
|
|
51
93
|
/**
|
|
52
94
|
* `Container.registerFactory()` allows to register a factory for a class.
|
|
53
95
|
*
|
|
54
96
|
* @param type The type or name of the class for which the factory is registered.
|
|
55
97
|
* @param factory The factory class being registered.
|
|
98
|
+
* @param options Distinguishes between different factories of the same class.
|
|
99
|
+
* - The `metadata` attaches custom metadata to the factory.
|
|
56
100
|
*/
|
|
57
|
-
|
|
101
|
+
registerFactory(type, factory, options) {
|
|
102
|
+
const metadata = options?.metadata || {};
|
|
58
103
|
const name = typeof type === 'string' ? type : type.name;
|
|
59
|
-
|
|
104
|
+
if (!(name in this.factories)) {
|
|
105
|
+
this.factories[name] = [];
|
|
106
|
+
}
|
|
107
|
+
const factoryContainer = this.factories[name].find((f) => DiffUtility.isObjectDeepEquals(f.metadata, metadata));
|
|
60
108
|
if (factoryContainer?.factory) {
|
|
61
109
|
// If factory is not a promise set by get() above, it has already been registered.
|
|
62
110
|
if (!Array.isArray(factoryContainer.factory)) {
|
|
63
|
-
|
|
111
|
+
throw new ContainerRegistrationError('Factory has already been registered!', type);
|
|
64
112
|
}
|
|
113
|
+
factoryContainer.metadata = metadata;
|
|
65
114
|
const resolve = factoryContainer.factory[1];
|
|
66
115
|
resolve(factory);
|
|
67
116
|
factoryContainer.factory = factory;
|
|
68
117
|
return;
|
|
69
118
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
119
|
+
this.factories[name].push({ factory, metadata });
|
|
120
|
+
}
|
|
121
|
+
registerValue(type, value, options) {
|
|
122
|
+
this.registerFactory(type, class {
|
|
123
|
+
static async create() {
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
}, options);
|
|
127
|
+
}
|
|
128
|
+
registerStartupUnhandledPromise(promise) {
|
|
129
|
+
this.startupUnhandledPromises.push(promise);
|
|
73
130
|
}
|
|
74
131
|
/**
|
|
75
132
|
* `Container.reset()` clears all registered factories and empties the container. This is mostly used in testing.
|
|
76
133
|
*/
|
|
77
|
-
|
|
78
|
-
this.FACTORY_TIMEOUT_IN_MS =
|
|
134
|
+
reset() {
|
|
135
|
+
this.FACTORY_TIMEOUT_IN_MS = 3000;
|
|
79
136
|
for (const name in this.factories) {
|
|
80
137
|
delete this.factories[name];
|
|
81
138
|
}
|
|
139
|
+
this.startupUnhandledPromises.splice(0, this.startupUnhandledPromises.length);
|
|
140
|
+
}
|
|
141
|
+
setFactories(factories) {
|
|
142
|
+
for (const [type, factoryContainers] of Object.entries(factories)) {
|
|
143
|
+
this.factories[type] = [];
|
|
144
|
+
for (const factoryContainer of factoryContainers) {
|
|
145
|
+
this.factories[type].push({
|
|
146
|
+
factory: factoryContainer.factory,
|
|
147
|
+
metadata: { ...factoryContainer.metadata },
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
82
151
|
}
|
|
83
152
|
/**
|
|
84
153
|
* The Container, by default, will wait a maximum of 5 seconds for a factory to resolve and provide an instance.
|
|
@@ -86,17 +155,37 @@ export class Container {
|
|
|
86
155
|
*
|
|
87
156
|
* @param timeoutInMs The timeout in milliseconds.
|
|
88
157
|
*/
|
|
89
|
-
|
|
158
|
+
setFactoryTimeout(timeoutInMs) {
|
|
90
159
|
this.FACTORY_TIMEOUT_IN_MS = timeoutInMs;
|
|
91
160
|
}
|
|
92
161
|
/**
|
|
93
162
|
* `Container.unRegisterFactory()` will unregister all factories of a class.
|
|
94
163
|
*
|
|
95
164
|
* @param type The type or name of the class for which all factory is unregistered.
|
|
165
|
+
* @param options
|
|
96
166
|
*/
|
|
97
|
-
|
|
167
|
+
unRegisterFactory(type, options) {
|
|
98
168
|
const name = typeof type === 'string' ? type : type.name;
|
|
99
|
-
|
|
169
|
+
if (!options) {
|
|
170
|
+
delete this.factories[name];
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const metadata = options?.metadata || {};
|
|
174
|
+
const index = this.factories[name]?.findIndex((f) => DiffUtility.isObjectDeepEquals(f.metadata, metadata));
|
|
175
|
+
if (index > -1) {
|
|
176
|
+
this.factories[name].splice(index, 1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async waitToResolveAllFactories() {
|
|
180
|
+
const promiseToResolveAllFactories = [];
|
|
181
|
+
for (const name of Object.keys(this.factories)) {
|
|
182
|
+
for (const factoryContainer of this.factories[name]) {
|
|
183
|
+
if (factoryContainer?.factory && Array.isArray(factoryContainer.factory)) {
|
|
184
|
+
promiseToResolveAllFactories.push(factoryContainer.factory[0]);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
await Promise.all([...promiseToResolveAllFactories, ...this.startupUnhandledPromises]);
|
|
100
189
|
}
|
|
101
190
|
}
|
|
102
191
|
//# sourceMappingURL=container.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/functions/container/container.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/functions/container/container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMtD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,SAAS;IASpB;QARQ,0BAAqB,GAAG,IAAI,CAAC;QAEpB,cAAS,GAAmD,EAAE,CAAC;QAI/D,6BAAwB,GAAuB,EAAE,CAAC;IAE5C,CAAC;IAExB,aAAa;QACX,MAAM,gBAAgB,GAAmD,EAAE,CAAC;QAE5E,KAAK,MAAM,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACvE,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;gBACjD,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;oBAC1B,OAAO,EAAE,gBAAgB,CAAC,OAAO;oBACjC,QAAQ,EAAE,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,CACP,IAA+B,EAC/B,OAGC;QAED,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEzD,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChH,IAAI,gBAAgB,EAAE,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAQ,gBAAgB,CAAC,OAAsB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,GAAG,MAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAyB,CAAC;gBAC3E,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,MAAM,mBAAmB,GAAwB;YAC/C,QAAQ;SACc,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAE/C,IAAI,eAAuD,CAAC;QAC5D,IAAI,cAA0C,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1D,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC/B,MAAM,CAAC,IAAI,wBAAwB,CAAC,2CAA2C,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1F,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAC/B,eAAe,GAAG,OAAO,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,mBAAmB,CAAC,OAAO,GAAG,CAAC,OAAO,EAAE,eAAgB,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;QAC9B,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,GAAG,CACD,IAA+B,EAC/B,OAEC;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEzD,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChG,CAAC;IAED;;;;;;;OAOG;IACH,eAAe,CACb,IAA+B,EAC/B,OAAmB,EACnB,OAEC;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEzD,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChH,IAAI,gBAAgB,EAAE,OAAO,EAAE,CAAC;YAC9B,kFAAkF;YAClF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,0BAA0B,CAAC,sCAAsC,EAAE,IAAI,CAAC,CAAC;YACrF,CAAC;YAED,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACrC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAkC,CAAC;YAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;YACjB,gBAAgB,CAAC,OAAO,GAAG,OAAO,CAAC;YAEnC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,aAAa,CACX,IAA+B,EAC/B,KAAQ,EACR,OAEC;QAED,IAAI,CAAC,eAAe,CAClB,IAAI,EACJ;YACE,MAAM,CAAC,KAAK,CAAC,MAAM;gBACjB,OAAO,KAAK,CAAC;YACf,CAAC;SACF,EACD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,+BAA+B,CAAI,OAAmB;QACpD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAChF,CAAC;IAED,YAAY,CAAC,SAAyD;QACpE,KAAK,MAAM,CAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,KAAK,MAAM,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;gBACjD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;oBACxB,OAAO,EAAE,gBAAgB,CAAC,OAAO;oBACjC,QAAQ,EAAE,EAAE,GAAG,gBAAgB,CAAC,QAAQ,EAAE;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAC,WAAmB;QACnC,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,iBAAiB,CAAI,IAA+B,EAAE,OAAkD;QACtG,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3G,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,yBAAyB;QAC7B,MAAM,4BAA4B,GAAgC,EAAE,CAAC;QAErE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,IAAI,gBAAgB,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzE,4BAA4B,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,4BAA4B,EAAE,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACzF,CAAC;CACF"}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import type { Constructable } from '../../app.type.js';
|
|
2
|
+
import { Container } from './container.js';
|
|
2
3
|
type FactoryMock<T> = {
|
|
4
|
+
metadata?: {
|
|
5
|
+
[key: string]: string;
|
|
6
|
+
};
|
|
3
7
|
type: Constructable<T> | string;
|
|
4
8
|
value: T;
|
|
5
9
|
};
|
|
6
10
|
type TestContainerSubjects = {
|
|
7
|
-
importFrom?: Constructable<IPackageMock>[];
|
|
8
11
|
mocks?: FactoryMock<unknown>[];
|
|
9
12
|
};
|
|
10
13
|
type TestContainerOptions = {
|
|
11
14
|
factoryTimeoutInMs?: number;
|
|
12
15
|
};
|
|
13
|
-
export interface IPackageMock {
|
|
14
|
-
destroy: () => Promise<void>;
|
|
15
|
-
getMocks: () => FactoryMock<unknown>[];
|
|
16
|
-
init(): Promise<void>;
|
|
17
|
-
}
|
|
18
16
|
/**
|
|
19
17
|
* The TestContainer class is an isolated {@link Container} for tests.
|
|
20
18
|
*
|
|
@@ -28,10 +26,12 @@ export interface IPackageMock {
|
|
|
28
26
|
* which modifies the Container for the duration of the test.
|
|
29
27
|
* This TestContainer does not affect other tests in parallel since they are on a separate machine core.
|
|
30
28
|
* Once tests are done executing, the `afterAll()` block cleans up the Container.
|
|
29
|
+
*
|
|
30
|
+
* @group Functions/Container
|
|
31
31
|
*/
|
|
32
32
|
export declare class TestContainer {
|
|
33
|
-
private static
|
|
34
|
-
private static
|
|
33
|
+
private static originalFactories;
|
|
34
|
+
private static bootstrap;
|
|
35
35
|
/**
|
|
36
36
|
* The `TestContainer.create()` method allows you to mock factories.
|
|
37
37
|
*
|
|
@@ -39,25 +39,23 @@ export declare class TestContainer {
|
|
|
39
39
|
* ```ts
|
|
40
40
|
* beforeAll(async () => {
|
|
41
41
|
* await TestContainer.create({
|
|
42
|
-
* importFrom: [OctoAwsCdkPackageMock],
|
|
43
42
|
* mocks: [
|
|
44
43
|
* { type: MyClass, value: jest.fn() },
|
|
45
|
-
* { type: AnotherClass, value: new AnotherClass() },
|
|
44
|
+
* { metadata: { key: 'value' }, type: AnotherClass, value: new AnotherClass() },
|
|
46
45
|
* ],
|
|
47
46
|
* }, { factoryTimeoutInMs: 500 });
|
|
48
47
|
* });
|
|
49
48
|
*
|
|
50
49
|
* ```
|
|
51
50
|
* @param subjects The subjects being mocked.
|
|
52
|
-
* - `importFrom` is an array of {@link IPackageMock} classes, to import custom mocks,
|
|
53
|
-
* such as from octo-aws-cdk package - [OctoAwsCdkPackageMock](/api/octo-aws-cdk/class/OctoAwsCdkPackageMock).
|
|
54
51
|
* - `mocks` is an array of objects, to override the default factories.
|
|
52
|
+
* - Use `metadata?: { [key: string]: string }` to identify the factory being mocked.
|
|
55
53
|
* - Use `type: Constructable<T> | string` to identify the class being mocked.
|
|
56
54
|
* - Use `value: T` to provide the mocked value.
|
|
57
55
|
* @param options Options to configure TestContainer.
|
|
58
56
|
* - `factoryTimeoutInMs?: number` is to override the default container timeout.
|
|
59
57
|
*/
|
|
60
|
-
static create(subjects: TestContainerSubjects, options?: TestContainerOptions): Promise<
|
|
58
|
+
static create(subjects: TestContainerSubjects, options?: TestContainerOptions): Promise<Container>;
|
|
61
59
|
/**
|
|
62
60
|
* The `TestContainer.reset()` method will completely destroy all factories from the Container.
|
|
63
61
|
* Because the entire Container is destroyed, and not just the mocks,
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { ModuleContainer } from '../../modules/module.container.js';
|
|
2
|
+
import { OverlayDataRepository } from '../../overlays/overlay-data.repository.js';
|
|
3
|
+
import { ResourceDataRepository, } from '../../resources/resource-data.repository.js';
|
|
4
|
+
import { CaptureService } from '../../services/capture/capture.service.js';
|
|
5
|
+
import { InputService } from '../../services/input/input.service.js';
|
|
1
6
|
import { Container } from './container.js';
|
|
2
7
|
/**
|
|
3
8
|
* The TestContainer class is an isolated {@link Container} for tests.
|
|
@@ -12,16 +17,20 @@ import { Container } from './container.js';
|
|
|
12
17
|
* which modifies the Container for the duration of the test.
|
|
13
18
|
* This TestContainer does not affect other tests in parallel since they are on a separate machine core.
|
|
14
19
|
* Once tests are done executing, the `afterAll()` block cleans up the Container.
|
|
20
|
+
*
|
|
21
|
+
* @group Functions/Container
|
|
15
22
|
*/
|
|
16
23
|
export class TestContainer {
|
|
17
|
-
static
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
24
|
+
static async bootstrap(container) {
|
|
25
|
+
await container.get(OverlayDataRepository, {
|
|
26
|
+
args: [true, []],
|
|
27
|
+
});
|
|
28
|
+
await container.get(ResourceDataRepository, {
|
|
29
|
+
args: [true, [], [], []],
|
|
30
|
+
});
|
|
31
|
+
await container.get(CaptureService, { args: [true] });
|
|
32
|
+
await container.get(InputService, { args: [true] });
|
|
33
|
+
await container.get(ModuleContainer, { args: [true] });
|
|
25
34
|
}
|
|
26
35
|
/**
|
|
27
36
|
* The `TestContainer.create()` method allows you to mock factories.
|
|
@@ -30,50 +39,41 @@ export class TestContainer {
|
|
|
30
39
|
* ```ts
|
|
31
40
|
* beforeAll(async () => {
|
|
32
41
|
* await TestContainer.create({
|
|
33
|
-
* importFrom: [OctoAwsCdkPackageMock],
|
|
34
42
|
* mocks: [
|
|
35
43
|
* { type: MyClass, value: jest.fn() },
|
|
36
|
-
* { type: AnotherClass, value: new AnotherClass() },
|
|
44
|
+
* { metadata: { key: 'value' }, type: AnotherClass, value: new AnotherClass() },
|
|
37
45
|
* ],
|
|
38
46
|
* }, { factoryTimeoutInMs: 500 });
|
|
39
47
|
* });
|
|
40
48
|
*
|
|
41
49
|
* ```
|
|
42
50
|
* @param subjects The subjects being mocked.
|
|
43
|
-
* - `importFrom` is an array of {@link IPackageMock} classes, to import custom mocks,
|
|
44
|
-
* such as from octo-aws-cdk package - [OctoAwsCdkPackageMock](/api/octo-aws-cdk/class/OctoAwsCdkPackageMock).
|
|
45
51
|
* - `mocks` is an array of objects, to override the default factories.
|
|
52
|
+
* - Use `metadata?: { [key: string]: string }` to identify the factory being mocked.
|
|
46
53
|
* - Use `type: Constructable<T> | string` to identify the class being mocked.
|
|
47
54
|
* - Use `value: T` to provide the mocked value.
|
|
48
55
|
* @param options Options to configure TestContainer.
|
|
49
56
|
* - `factoryTimeoutInMs?: number` is to override the default container timeout.
|
|
50
57
|
*/
|
|
51
58
|
static async create(subjects, options) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (options?.factoryTimeoutInMs) {
|
|
55
|
-
Container.setFactoryTimeout(options.factoryTimeoutInMs);
|
|
56
|
-
}
|
|
57
|
-
const importedMocks = [];
|
|
58
|
-
for (const mockClass of subjects.importFrom || []) {
|
|
59
|
-
const mock = new mockClass();
|
|
60
|
-
await mock.init();
|
|
61
|
-
importedMocks.push(...mock.getMocks());
|
|
62
|
-
this.packageMocks.push(mock);
|
|
59
|
+
if (!TestContainer.originalFactories) {
|
|
60
|
+
TestContainer.originalFactories = Container.getInstance().copyFactories();
|
|
63
61
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
62
|
+
const container = Container.getInstance();
|
|
63
|
+
// Load container with previous factories.
|
|
64
|
+
container.setFactories(this.originalFactories);
|
|
65
|
+
// Reset state of eligible factories.
|
|
66
|
+
// A factory is eligible if it has an internal structure and should be reset on every test.
|
|
67
|
+
await this.bootstrap(container);
|
|
68
|
+
if (options?.factoryTimeoutInMs) {
|
|
69
|
+
container.setFactoryTimeout(options.factoryTimeoutInMs);
|
|
73
70
|
}
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
// Override new container with mock factories as instructed.
|
|
72
|
+
for (const mock of subjects.mocks || []) {
|
|
73
|
+
container.unRegisterFactory(mock.type, { metadata: mock.metadata });
|
|
74
|
+
container.registerValue(mock.type, mock.value, { metadata: mock.metadata });
|
|
76
75
|
}
|
|
76
|
+
return container;
|
|
77
77
|
}
|
|
78
78
|
/**
|
|
79
79
|
* The `TestContainer.reset()` method will completely destroy all factories from the Container.
|
|
@@ -88,10 +88,7 @@ export class TestContainer {
|
|
|
88
88
|
* ```
|
|
89
89
|
*/
|
|
90
90
|
static async reset() {
|
|
91
|
-
|
|
92
|
-
await mock.destroy();
|
|
93
|
-
}
|
|
94
|
-
Container.reset();
|
|
91
|
+
Container.getInstance().reset();
|
|
95
92
|
}
|
|
96
93
|
}
|
|
97
94
|
//# sourceMappingURL=test-container.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-container.js","sourceRoot":"","sources":["../../../src/functions/container/test-container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"test-container.js","sourceRoot":"","sources":["../../../src/functions/container/test-container.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA+B,MAAM,mCAAmC,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAqC,MAAM,2CAA2C,CAAC;AACrH,OAAO,EACL,sBAAsB,GAEvB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,cAAc,EAA8B,MAAM,2CAA2C,CAAC;AACvG,OAAO,EAAE,YAAY,EAA4B,MAAM,uCAAuC,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAa3C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,aAAa;IAGhB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,SAAoB;QACjD,MAAM,SAAS,CAAC,GAAG,CAA6D,qBAAqB,EAAE;YACrG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;SACjB,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,GAAG,CAA+D,sBAAsB,EAAE;YACxG,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;SACzB,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,GAAG,CAA+C,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpG,MAAM,SAAS,CAAC,GAAG,CAA2C,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE9F,MAAM,SAAS,CAAC,GAAG,CAAiD,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAA+B,EAAE,OAA8B;QACjF,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;YACrC,aAAa,CAAC,iBAAiB,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,aAAa,EAAE,CAAC;QAC5E,CAAC;QACD,MAAM,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAE1C,0CAA0C;QAC1C,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/C,qCAAqC;QACrC,2FAA2F;QAC3F,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEhC,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;YAChC,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC1D,CAAC;QAED,4DAA4D;QAC5D,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACxC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK;QAChB,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;CACF"}
|