@venizia/ignis-kernel 0.3.6 → 0.4.1
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/LICENSE.md +1 -1
- package/dist/cjs/base/applications/abstract.js +2 -2
- package/dist/cjs/base/applications/abstract.js.map +1 -1
- package/dist/cjs/base/applications/artifact-group.js +1 -1
- package/dist/cjs/base/applications/artifact-group.js.map +1 -1
- package/dist/cjs/base/applications/artifact-index.js +11 -11
- package/dist/cjs/base/applications/artifact-index.js.map +1 -1
- package/dist/cjs/base/applications/boot-sequence.js +1 -1
- package/dist/cjs/base/applications/boot-sequence.js.map +1 -1
- package/dist/cjs/base/applications/rest.js +5 -5
- package/dist/cjs/base/applications/rest.js.map +1 -1
- package/dist/cjs/base/auth/authenticate/common/codecs.js +2 -2
- package/dist/cjs/base/auth/authenticate/common/codecs.js.map +1 -1
- package/dist/cjs/base/auth/authenticate/providers/authentication.provider.js +1 -1
- package/dist/cjs/base/auth/authenticate/providers/authentication.provider.js.map +1 -1
- package/dist/cjs/base/auth/authenticate/strategies/strategy-registry.js +1 -1
- package/dist/cjs/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
- package/dist/cjs/base/auth/authorize/builders/grant.builder.js +12 -12
- package/dist/cjs/base/auth/authorize/builders/grant.builder.js.map +1 -1
- package/dist/cjs/base/auth/authorize/builders/permission.builder.js +1 -1
- package/dist/cjs/base/auth/authorize/builders/permission.builder.js.map +1 -1
- package/dist/cjs/base/auth/authorize/builders/policy.builder.js +1 -1
- package/dist/cjs/base/auth/authorize/builders/policy.builder.js.map +1 -1
- package/dist/cjs/base/auth/authorize/common/constants/authorization.d.ts.map +1 -1
- package/dist/cjs/base/auth/authorize/common/constants/authorization.js +2 -2
- package/dist/cjs/base/auth/authorize/common/constants/authorization.js.map +1 -1
- package/dist/cjs/base/auth/authorize/enforcers/enforcer-registry.js +1 -1
- package/dist/cjs/base/auth/authorize/enforcers/enforcer-registry.js.map +1 -1
- package/dist/cjs/base/auth/authorize/providers/authorization.provider.js +3 -3
- package/dist/cjs/base/auth/authorize/providers/authorization.provider.js.map +1 -1
- package/dist/cjs/base/controllers/factory/controller.d.ts +2 -2
- package/dist/cjs/base/controllers/factory/controller.d.ts.map +1 -1
- package/dist/cjs/base/controllers/factory/controller.js +1 -0
- package/dist/cjs/base/controllers/factory/controller.js.map +1 -1
- package/dist/cjs/base/controllers/factory/crud/abstract.d.ts +1 -1
- package/dist/cjs/base/controllers/factory/crud/abstract.d.ts.map +1 -1
- package/dist/cjs/base/controllers/factory/crud/abstract.js.map +1 -1
- package/dist/cjs/base/controllers/factory/definition.js +1 -1
- package/dist/cjs/base/controllers/factory/definition.js.map +1 -1
- package/dist/cjs/base/controllers/rest/extras.js +5 -5
- package/dist/cjs/base/controllers/rest/extras.js.map +1 -1
- package/dist/cjs/base/metadata/injectable.js +1 -1
- package/dist/cjs/base/metadata/injectable.js.map +1 -1
- package/dist/cjs/base/metadata/persistents.js +4 -4
- package/dist/cjs/base/metadata/persistents.js.map +1 -1
- package/dist/cjs/base/metadata/routes/controller.js +1 -1
- package/dist/cjs/base/metadata/routes/controller.js.map +1 -1
- package/dist/cjs/base/middlewares/app-error/app-error.middleware.js +3 -3
- package/dist/cjs/base/middlewares/app-error/app-error.middleware.js.map +1 -1
- package/dist/cjs/base/middlewares/app-error/zod.handler.js +2 -2
- package/dist/cjs/base/middlewares/app-error/zod.handler.js.map +1 -1
- package/dist/cjs/base/middlewares/form-body/form-body.middleware.js +2 -2
- package/dist/cjs/base/middlewares/form-body/form-body.middleware.js.map +1 -1
- package/dist/cjs/base/middlewares/not-found/not-found.middleware.js.map +1 -1
- package/dist/cjs/base/models/common/utilities.js +1 -1
- package/dist/cjs/base/models/common/utilities.js.map +1 -1
- package/dist/cjs/base/repositories/common/types/contracts.d.ts +17 -17
- package/dist/cjs/base/repositories/common/types/contracts.d.ts.map +1 -1
- package/dist/cjs/base/repositories/common/types/contracts.js.map +1 -1
- package/dist/cjs/base/repositories/core/abstract.d.ts +17 -17
- package/dist/cjs/base/repositories/core/abstract.d.ts.map +1 -1
- package/dist/cjs/base/repositories/core/abstract.js +4 -3
- package/dist/cjs/base/repositories/core/abstract.js.map +1 -1
- package/dist/cjs/helpers/inversion/mixins/model.mixin.js +1 -1
- package/dist/cjs/helpers/inversion/mixins/model.mixin.js.map +1 -1
- package/dist/cjs/helpers/inversion/mixins/repository.mixin.js +1 -1
- package/dist/cjs/helpers/inversion/mixins/repository.mixin.js.map +1 -1
- package/dist/cjs/repository.d.ts +1 -1
- package/dist/cjs/repository.d.ts.map +1 -1
- package/dist/cjs/repository.js.map +1 -1
- package/dist/esm/base/applications/abstract.js +2 -2
- package/dist/esm/base/applications/abstract.js.map +1 -1
- package/dist/esm/base/applications/artifact-group.js +1 -1
- package/dist/esm/base/applications/artifact-group.js.map +1 -1
- package/dist/esm/base/applications/artifact-index.js +11 -11
- package/dist/esm/base/applications/artifact-index.js.map +1 -1
- package/dist/esm/base/applications/boot-sequence.js +1 -1
- package/dist/esm/base/applications/boot-sequence.js.map +1 -1
- package/dist/esm/base/applications/rest.js +5 -5
- package/dist/esm/base/applications/rest.js.map +1 -1
- package/dist/esm/base/auth/authenticate/common/codecs.js +2 -2
- package/dist/esm/base/auth/authenticate/common/codecs.js.map +1 -1
- package/dist/esm/base/auth/authenticate/providers/authentication.provider.js +1 -1
- package/dist/esm/base/auth/authenticate/providers/authentication.provider.js.map +1 -1
- package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js +1 -1
- package/dist/esm/base/auth/authenticate/strategies/strategy-registry.js.map +1 -1
- package/dist/esm/base/auth/authorize/builders/grant.builder.js +12 -12
- package/dist/esm/base/auth/authorize/builders/grant.builder.js.map +1 -1
- package/dist/esm/base/auth/authorize/builders/permission.builder.js +1 -1
- package/dist/esm/base/auth/authorize/builders/permission.builder.js.map +1 -1
- package/dist/esm/base/auth/authorize/builders/policy.builder.js +1 -1
- package/dist/esm/base/auth/authorize/builders/policy.builder.js.map +1 -1
- package/dist/esm/base/auth/authorize/common/constants/authorization.d.ts.map +1 -1
- package/dist/esm/base/auth/authorize/common/constants/authorization.js +2 -2
- package/dist/esm/base/auth/authorize/common/constants/authorization.js.map +1 -1
- package/dist/esm/base/auth/authorize/enforcers/enforcer-registry.js +1 -1
- package/dist/esm/base/auth/authorize/enforcers/enforcer-registry.js.map +1 -1
- package/dist/esm/base/auth/authorize/providers/authorization.provider.js +3 -3
- package/dist/esm/base/auth/authorize/providers/authorization.provider.js.map +1 -1
- package/dist/esm/base/controllers/factory/controller.d.ts +2 -2
- package/dist/esm/base/controllers/factory/controller.d.ts.map +1 -1
- package/dist/esm/base/controllers/factory/controller.js +1 -0
- package/dist/esm/base/controllers/factory/controller.js.map +1 -1
- package/dist/esm/base/controllers/factory/crud/abstract.d.ts +1 -1
- package/dist/esm/base/controllers/factory/crud/abstract.d.ts.map +1 -1
- package/dist/esm/base/controllers/factory/crud/abstract.js.map +1 -1
- package/dist/esm/base/controllers/factory/definition.js +1 -1
- package/dist/esm/base/controllers/factory/definition.js.map +1 -1
- package/dist/esm/base/controllers/rest/extras.js +5 -5
- package/dist/esm/base/controllers/rest/extras.js.map +1 -1
- package/dist/esm/base/metadata/injectable.js +1 -1
- package/dist/esm/base/metadata/injectable.js.map +1 -1
- package/dist/esm/base/metadata/persistents.js +4 -4
- package/dist/esm/base/metadata/persistents.js.map +1 -1
- package/dist/esm/base/metadata/routes/controller.js +1 -1
- package/dist/esm/base/metadata/routes/controller.js.map +1 -1
- package/dist/esm/base/middlewares/app-error/app-error.middleware.js +3 -3
- package/dist/esm/base/middlewares/app-error/app-error.middleware.js.map +1 -1
- package/dist/esm/base/middlewares/app-error/zod.handler.js +2 -2
- package/dist/esm/base/middlewares/app-error/zod.handler.js.map +1 -1
- package/dist/esm/base/middlewares/form-body/form-body.middleware.js +2 -2
- package/dist/esm/base/middlewares/form-body/form-body.middleware.js.map +1 -1
- package/dist/esm/base/middlewares/not-found/not-found.middleware.js.map +1 -1
- package/dist/esm/base/models/common/utilities.js +1 -1
- package/dist/esm/base/models/common/utilities.js.map +1 -1
- package/dist/esm/base/repositories/common/types/contracts.d.ts +17 -17
- package/dist/esm/base/repositories/common/types/contracts.d.ts.map +1 -1
- package/dist/esm/base/repositories/common/types/contracts.js.map +1 -1
- package/dist/esm/base/repositories/core/abstract.d.ts +17 -17
- package/dist/esm/base/repositories/core/abstract.d.ts.map +1 -1
- package/dist/esm/base/repositories/core/abstract.js +4 -3
- package/dist/esm/base/repositories/core/abstract.js.map +1 -1
- package/dist/esm/helpers/inversion/mixins/model.mixin.js +1 -1
- package/dist/esm/helpers/inversion/mixins/model.mixin.js.map +1 -1
- package/dist/esm/helpers/inversion/mixins/repository.mixin.js +1 -1
- package/dist/esm/helpers/inversion/mixins/repository.mixin.js.map +1 -1
- package/dist/esm/repository.d.ts +1 -1
- package/dist/esm/repository.d.ts.map +1 -1
- package/dist/esm/repository.js.map +1 -1
- package/package.json +33 -34
package/LICENSE.md
CHANGED
|
@@ -37,7 +37,7 @@ This monorepo contains the following packages, all licensed under MIT:
|
|
|
37
37
|
| `@venizia/ignis-boot` | Application bootstrapping & artifact auto-discovery |
|
|
38
38
|
| `@venizia/ignis-helpers` | Utility helpers - logging, cron, Redis, queues, storage |
|
|
39
39
|
| `@venizia/ignis-inversion` | Dependency Injection & IoC container |
|
|
40
|
-
| `@venizia/dev-configs` | Shared
|
|
40
|
+
| `@venizia/dev-configs` | Shared oxlint, ESLint, TypeScript configurations |
|
|
41
41
|
| `@venizia/ignis-docs` | Documentation and MCP Server |
|
|
42
42
|
|
|
43
43
|
---
|
|
@@ -62,7 +62,7 @@ class AbstractApplication extends container_1.Container {
|
|
|
62
62
|
throw (0, core_1.getError)({
|
|
63
63
|
statusCode: common_1.HTTP.ResultCodes.RS_5.InternalServerError,
|
|
64
64
|
message: `[executePostStartHooks] Failed post-start hook(s): ${failures
|
|
65
|
-
.map(failure => `${failure.identifier} (${failure.error})`)
|
|
65
|
+
.map((failure) => `${failure.identifier} (${failure.error})`)
|
|
66
66
|
.join(', ')}`,
|
|
67
67
|
});
|
|
68
68
|
}
|
|
@@ -86,7 +86,7 @@ class AbstractApplication extends container_1.Container {
|
|
|
86
86
|
registerCoreBindings() {
|
|
87
87
|
this.bind({
|
|
88
88
|
key: bindings_1.CoreBindings.APPLICATION_INSTANCE,
|
|
89
|
-
}).toProvider(_ => this);
|
|
89
|
+
}).toProvider((_) => this);
|
|
90
90
|
}
|
|
91
91
|
init() {
|
|
92
92
|
this.registerCoreBindings();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../../src/base/applications/abstract.ts"],"names":[],"mappings":";;;AAAA,gDAAiD;AACjD,6DAA0D;AAE1D,sDAAuD;AACvD,0DAAqD;AAGrD,MAAsB,mBAAoB,SAAQ,qBAAS;IAOzD,YAAY,IAAoD;QAC9D,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QALX,mBAAc,GAAoE,EAAE,CAAC;QACrF,kBAAa,GAAoE,EAAE,CAAC;QAM1F,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE;YACvC,YAAY,EAAE;gBACZ,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,IAAI,IAAI,CAAC,6BAA6B,EAAE;aAC7E;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5E,CAAC;IAoBS,6BAA6B;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,cAAc;QACZ,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,IAAI,CAAS,EAAE,GAAG,EAAE,uBAAY,CAAC,wBAAwB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvF,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,qBAAqB,CAAC,IAA8D;QAClF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM;aACR,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;aACpC,KAAK,CAAC,6CAA6C,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED,qMAAqM;IAC3L,KAAK,CAAC,qBAAqB;QACnC,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAE9E,MAAM,QAAQ,GAAkD,EAAE,CAAC;QAEnE,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAE5B,IAAI,CAAC;gBACH,MAAM,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,qDAAqD,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;gBACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,MAAM,CAAC,IAAI,CACT,gDAAgD,EAChD,UAAU,EACV,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CACtB,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,IAAA,eAAQ,EAAC;YACb,UAAU,EAAE,aAAI,CAAC,WAAW,CAAC,IAAI,CAAC,mBAAmB;YACrD,OAAO,EAAE,sDAAsD,QAAQ;iBACpE,GAAG,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"abstract.js","sourceRoot":"","sources":["../../../../src/base/applications/abstract.ts"],"names":[],"mappings":"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","sourcesContent":["import { CoreBindings } from '@/common/bindings';\nimport { Container } from '@/helpers/inversion/container';\nimport type { ValueOrPromise } from '@venizia/ignis-helpers/common';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport { HTTP } from '@venizia/ignis-helpers/common';\nimport type { IApplicationConfigs, IApplicationInfo } from './common';\n\nexport abstract class AbstractApplication extends Container {\n protected configs: IApplicationConfigs;\n protected projectRoot: string;\n\n private postStartHooks: Array<{ identifier: string; hook: () => ValueOrPromise<void> }> = [];\n private postStopHooks: Array<{ identifier: string; hook: () => ValueOrPromise<void> }> = [];\n\n constructor(opts: { scope: string; config: IApplicationConfigs }) {\n const { scope, config } = opts;\n super({ scope });\n\n this.configs = Object.assign({}, config, {\n asyncContext: {\n enable: config?.asyncContext?.enable ?? this.getDefaultAsyncContextEnabled(),\n },\n });\n\n this.projectRoot = this.getProjectRoot();\n this.logger.for('constructor').info('Project root: %s', this.projectRoot);\n }\n\n abstract getAppInfo(): ValueOrPromise<IApplicationInfo>;\n abstract preConfigure(): ValueOrPromise<void>;\n\n /**\n * Runs after every registration sweep (datasources, components, controllers) has already\n * completed. Registering a new one here is not auto-registered and silently does nothing -\n * call `configure()` manually instead.\n */\n abstract postConfigure(): ValueOrPromise<void>;\n\n abstract staticConfigure(): void;\n\n abstract setupMiddlewares(opts?: {\n middlewares?: Record<string | symbol, any>;\n }): ValueOrPromise<void>;\n\n abstract initialize(): Promise<void>;\n\n protected getDefaultAsyncContextEnabled(): boolean {\n return false;\n }\n\n getProjectConfigs(): IApplicationConfigs {\n return this.configs;\n }\n\n getProjectRoot(): string {\n const projectRoot = '';\n this.bind<string>({ key: CoreBindings.APPLICATION_PROJECT_ROOT }).toValue(projectRoot);\n return projectRoot;\n }\n\n registerPostStartHook(opts: { identifier: string; hook: () => ValueOrPromise<void> }) {\n this.postStartHooks.push(opts);\n this.logger\n .for(this.registerPostStartHook.name)\n .debug('Registered post-start hook | identifier: %s', opts.identifier);\n }\n\n /** Runs every post-start hook in isolation - the server is already listening, so a throwing hook must not cancel the ones behind it; failures are collected and reported as one error at the end. */\n protected async executePostStartHooks() {\n if (this.postStartHooks.length === 0) {\n return;\n }\n\n const logger = this.logger.for(this.executePostStartHooks.name);\n logger.info('Executing %s post-start hook(s)...', this.postStartHooks.length);\n\n const failures: Array<{ identifier: string; error: unknown }> = [];\n\n for (const { identifier, hook } of this.postStartHooks) {\n const t = performance.now();\n\n try {\n await hook();\n } catch (error) {\n logger.error('Failed to execute hook | identifier: %s | error: %s', identifier, error);\n failures.push({ identifier, error });\n continue;\n }\n\n logger.info(\n 'Executed hook | identifier: %s | took: %s (ms)',\n identifier,\n performance.now() - t,\n );\n }\n\n if (failures.length === 0) {\n return;\n }\n\n throw getError({\n statusCode: HTTP.ResultCodes.RS_5.InternalServerError,\n message: `[executePostStartHooks] Failed post-start hook(s): ${failures\n .map((failure) => `${failure.identifier} (${failure.error})`)\n .join(', ')}`,\n });\n }\n\n registerPostStopHook(opts: { identifier: string; hook: () => ValueOrPromise<void> }) {\n this.postStopHooks.push(opts);\n this.logger\n .for(this.registerPostStopHook.name)\n .debug('Registered post-stop hook | identifier: %s', opts.identifier);\n }\n\n protected async executePostStopHooks() {\n const logger = this.logger.for(this.executePostStopHooks.name);\n for (const { identifier, hook } of this.postStopHooks) {\n try {\n await hook();\n } catch (error) {\n logger.error('Post-stop hook failed | identifier: %s | error: %s', identifier, error);\n }\n }\n }\n\n protected registerCoreBindings() {\n this.bind<typeof this>({\n key: CoreBindings.APPLICATION_INSTANCE,\n }).toProvider((_) => this);\n }\n\n init() {\n this.registerCoreBindings();\n }\n}\n"]}
|
|
@@ -38,7 +38,7 @@ class ArtifactGroup {
|
|
|
38
38
|
/** A group carrying only `kinds` - for a slicer that splits `configs.artifacts` by run mode. The source group is resolved when artifacts are registered, never here. */
|
|
39
39
|
static pick(opts) {
|
|
40
40
|
const { group, kinds } = opts;
|
|
41
|
-
const slice = (index) => Object.fromEntries(kinds.filter(kind => index[kind] !== undefined).map(kind => [kind, index[kind]]));
|
|
41
|
+
const slice = (index) => Object.fromEntries(kinds.filter((kind) => index[kind] !== undefined).map((kind) => [kind, index[kind]]));
|
|
42
42
|
return new ArtifactGroup({
|
|
43
43
|
folder: group.folder,
|
|
44
44
|
site: group.site,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-group.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { SingletonRealm } from '@/helpers/singleton-realm';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport type { IArtifactGroup, IArtifactIndex } from './common';\n\ntype TGroupResolver = (opts: { group: IArtifactGroup }) => Promise<IArtifactIndex>;\n\n/** A typed slice of a shared package's artifacts - every decorated class under a directory named `folder` in the package that defined it. A package declares one per domain, once; an application borrows it in `configs.artifacts`. The content is filled by `@venizia/ignis-boot`: inlined when the application is built, or resolved from source when artifacts are registered. */\nexport class ArtifactGroup implements IArtifactGroup {\n /** A string brand, so the group protocol is structural: `@venizia/ignis-boot/auto` builds one without depending on the kernel. */\n static readonly BRAND_KEY = 'isArtifactGroup';\n /** The realm slot `@venizia/ignis-boot` fills with the resolver for groups defined without content. */\n static readonly SINGLETON_REALM_KEY = 'artifact-group-resolver';\n\n readonly isArtifactGroup = true as const;\n readonly resolve: (() => Promise<IArtifactIndex>) | undefined;\n readonly kinds: ReadonlyArray<keyof IArtifactIndex> | undefined;\n\n private constructor(opts: {\n folder: string | undefined;\n site: string | undefined;\n content: IArtifactIndex | undefined;\n resolve?: () => Promise<IArtifactIndex>;\n kinds?: ReadonlyArray<keyof IArtifactIndex>;\n ignore?: ReadonlyArray<string>;\n }) {\n this.folder = opts.folder;\n this.site = opts.site;\n this.content = opts.content;\n this.resolve = opts.resolve;\n this.kinds = opts.kinds;\n this.ignore = opts.ignore;\n }\n\n readonly folder: string | undefined;\n readonly site: string | undefined;\n readonly content: IArtifactIndex | undefined;\n readonly ignore: ReadonlyArray<string> | undefined;\n\n /** `content` is written by the build plugin; a hand-written group passes only `folder`. */\n static define(opts: { folder: string; content?: IArtifactIndex }): ArtifactGroup {\n return new ArtifactGroup({\n folder: opts.folder,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n });\n }\n\n /** Every decorated class of the calling package - an application's own artifacts, picked by its call site, so several applications in one process each get their own. `ignore` takes the globs `ignis-artifacts --ignore` takes, relative to the package `src`. `content` is written by the build plugin. */\n static application(\n opts: { ignore?: ReadonlyArray<string>; content?: IArtifactIndex } = {},\n ): ArtifactGroup {\n return new ArtifactGroup({\n folder: undefined,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n ignore: opts.ignore,\n });\n }\n\n /** A group carrying only `kinds` - for a slicer that splits `configs.artifacts` by run mode. The source group is resolved when artifacts are registered, never here. */\n static pick(opts: {\n group: IArtifactGroup;\n kinds: ReadonlyArray<keyof IArtifactIndex>;\n }): ArtifactGroup {\n const { group, kinds } = opts;\n const slice = (index: IArtifactIndex): IArtifactIndex =>\n Object.fromEntries(\n kinds.filter(kind => index[kind] !== undefined).map(kind => [kind, index[kind]]),\n );\n\n return new ArtifactGroup({\n folder: group.folder,\n site: group.site,\n content: group.content ? slice(group.content) : undefined,\n resolve: async () => slice(await ArtifactGroup.resolveContent({ group })),\n kinds,\n ignore: group.ignore,\n });\n }\n\n /** A group's classes: inlined by a build, else its own `resolve()`, else the resolver `@venizia/ignis-boot/auto` installs. */\n static async resolveContent(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n if (group.content) {\n return group.content;\n }\n if (group.resolve) {\n return group.resolve();\n }\n const resolve = ArtifactGroup.getResolver();\n if (!resolve) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' has no content | Import @venizia/ignis-boot/auto in the application (it resolves groups from source), or add IgnisArtifactsPlugin to the build's plugins`,\n });\n }\n return resolve({ group });\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `value`. */\n static isGroup(value: unknown): value is IArtifactGroup {\n return (\n typeof value === 'object' &&\n value !== null &&\n ArtifactGroup.BRAND_KEY in value &&\n value[ArtifactGroup.BRAND_KEY] === true\n );\n }\n\n static setResolver(opts: { resolve: TGroupResolver | undefined }): void {\n ArtifactGroup.holder().resolve = opts.resolve;\n }\n\n static getResolver(): TGroupResolver | undefined {\n return ArtifactGroup.holder().resolve;\n }\n\n /** The error a walker over `configs.artifacts` gets for reading a kind off a group - loud, never an empty list. */\n static unreadKindError(opts: { folder: string | undefined }): Error {\n return getError({\n message: `[ArtifactGroup] '${opts.folder ?? '<application>'}' is resolved when artifacts are registered | A function that walks configs.artifacts must pass a group through untouched (ArtifactGroup.isGroup) instead of reading its kinds`,\n });\n }\n\n get configurations(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get dataSources(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get components(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get repositories(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get services(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get controllers(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n private static holder(): { resolve: TGroupResolver | undefined } {\n return SingletonRealm.resolve({\n key: ArtifactGroup.SINGLETON_REALM_KEY,\n create: () => ({ resolve: undefined }),\n });\n }\n\n /** The module that declared the group, read from the call stack. */\n private static callSite(): string | undefined {\n // A stack trace, not a failure: reading the call site needs an Error object, and nothing is thrown.\n // eslint-disable-next-line venizia/no-new-error\n return ArtifactGroup.siteFromStack({ stack: new Error().stack ?? '' });\n }\n\n /** The first frame outside the kernel's own `artifact-group` file: POSIX and Windows paths, `file://` URLs (decoded, drive kept), parentheses inside a path. */\n static siteFromStack(opts: { stack: string }): string | undefined {\n for (const raw of opts.stack.split('\\n').slice(1)) {\n const frame = raw.trim().replace(/^at\\s+/, '');\n const opening = frame.indexOf(' (');\n const location = frame.endsWith(')') && opening >= 0 ? frame.slice(opening + 2, -1) : frame;\n let file = location.replace(/:\\d+:\\d+$/, '');\n if (file.startsWith('file://')) {\n file = decodeURIComponent(file.slice('file://'.length)).replace(/^\\/([A-Za-z]:\\/)/, '$1');\n }\n const isPath = file.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(file);\n if (isPath && !/(?:^|[\\\\/])artifact-group\\.(?:ts|js)$/.test(file)) {\n return file;\n }\n }\n return undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-group.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { SingletonRealm } from '@/helpers/singleton-realm';\nimport { getError } from '@venizia/ignis-helpers/core';\nimport type { IArtifactGroup, IArtifactIndex } from './common';\n\ntype TGroupResolver = (opts: { group: IArtifactGroup }) => Promise<IArtifactIndex>;\n\n/** A typed slice of a shared package's artifacts - every decorated class under a directory named `folder` in the package that defined it. A package declares one per domain, once; an application borrows it in `configs.artifacts`. The content is filled by `@venizia/ignis-boot`: inlined when the application is built, or resolved from source when artifacts are registered. */\nexport class ArtifactGroup implements IArtifactGroup {\n /** A string brand, so the group protocol is structural: `@venizia/ignis-boot/auto` builds one without depending on the kernel. */\n static readonly BRAND_KEY = 'isArtifactGroup';\n /** The realm slot `@venizia/ignis-boot` fills with the resolver for groups defined without content. */\n static readonly SINGLETON_REALM_KEY = 'artifact-group-resolver';\n\n readonly isArtifactGroup = true as const;\n readonly resolve: (() => Promise<IArtifactIndex>) | undefined;\n readonly kinds: ReadonlyArray<keyof IArtifactIndex> | undefined;\n\n private constructor(opts: {\n folder: string | undefined;\n site: string | undefined;\n content: IArtifactIndex | undefined;\n resolve?: () => Promise<IArtifactIndex>;\n kinds?: ReadonlyArray<keyof IArtifactIndex>;\n ignore?: ReadonlyArray<string>;\n }) {\n this.folder = opts.folder;\n this.site = opts.site;\n this.content = opts.content;\n this.resolve = opts.resolve;\n this.kinds = opts.kinds;\n this.ignore = opts.ignore;\n }\n\n readonly folder: string | undefined;\n readonly site: string | undefined;\n readonly content: IArtifactIndex | undefined;\n readonly ignore: ReadonlyArray<string> | undefined;\n\n /** `content` is written by the build plugin; a hand-written group passes only `folder`. */\n static define(opts: { folder: string; content?: IArtifactIndex }): ArtifactGroup {\n return new ArtifactGroup({\n folder: opts.folder,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n });\n }\n\n /** Every decorated class of the calling package - an application's own artifacts, picked by its call site, so several applications in one process each get their own. `ignore` takes the globs `ignis-artifacts --ignore` takes, relative to the package `src`. `content` is written by the build plugin. */\n static application(\n opts: { ignore?: ReadonlyArray<string>; content?: IArtifactIndex } = {},\n ): ArtifactGroup {\n return new ArtifactGroup({\n folder: undefined,\n site: ArtifactGroup.callSite(),\n content: opts.content,\n ignore: opts.ignore,\n });\n }\n\n /** A group carrying only `kinds` - for a slicer that splits `configs.artifacts` by run mode. The source group is resolved when artifacts are registered, never here. */\n static pick(opts: {\n group: IArtifactGroup;\n kinds: ReadonlyArray<keyof IArtifactIndex>;\n }): ArtifactGroup {\n const { group, kinds } = opts;\n const slice = (index: IArtifactIndex): IArtifactIndex =>\n Object.fromEntries(\n kinds.filter((kind) => index[kind] !== undefined).map((kind) => [kind, index[kind]]),\n );\n\n return new ArtifactGroup({\n folder: group.folder,\n site: group.site,\n content: group.content ? slice(group.content) : undefined,\n resolve: async () => slice(await ArtifactGroup.resolveContent({ group })),\n kinds,\n ignore: group.ignore,\n });\n }\n\n /** A group's classes: inlined by a build, else its own `resolve()`, else the resolver `@venizia/ignis-boot/auto` installs. */\n static async resolveContent(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n if (group.content) {\n return group.content;\n }\n if (group.resolve) {\n return group.resolve();\n }\n const resolve = ArtifactGroup.getResolver();\n if (!resolve) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' has no content | Import @venizia/ignis-boot/auto in the application (it resolves groups from source), or add IgnisArtifactsPlugin to the build's plugins`,\n });\n }\n return resolve({ group });\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `value`. */\n static isGroup(value: unknown): value is IArtifactGroup {\n return (\n typeof value === 'object' &&\n value !== null &&\n ArtifactGroup.BRAND_KEY in value &&\n value[ArtifactGroup.BRAND_KEY] === true\n );\n }\n\n static setResolver(opts: { resolve: TGroupResolver | undefined }): void {\n ArtifactGroup.holder().resolve = opts.resolve;\n }\n\n static getResolver(): TGroupResolver | undefined {\n return ArtifactGroup.holder().resolve;\n }\n\n /** The error a walker over `configs.artifacts` gets for reading a kind off a group - loud, never an empty list. */\n static unreadKindError(opts: { folder: string | undefined }): Error {\n return getError({\n message: `[ArtifactGroup] '${opts.folder ?? '<application>'}' is resolved when artifacts are registered | A function that walks configs.artifacts must pass a group through untouched (ArtifactGroup.isGroup) instead of reading its kinds`,\n });\n }\n\n get configurations(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get dataSources(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get components(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get repositories(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get services(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n get controllers(): never {\n throw ArtifactGroup.unreadKindError({ folder: this.folder });\n }\n\n private static holder(): { resolve: TGroupResolver | undefined } {\n return SingletonRealm.resolve({\n key: ArtifactGroup.SINGLETON_REALM_KEY,\n create: () => ({ resolve: undefined }),\n });\n }\n\n /** The module that declared the group, read from the call stack. */\n private static callSite(): string | undefined {\n // A stack trace, not a failure: reading the call site needs an Error object, and nothing is thrown.\n // eslint-disable-next-line venizia/no-new-error\n return ArtifactGroup.siteFromStack({ stack: new Error().stack ?? '' });\n }\n\n /** The first frame outside the kernel's own `artifact-group` file: POSIX and Windows paths, `file://` URLs (decoded, drive kept), parentheses inside a path. */\n static siteFromStack(opts: { stack: string }): string | undefined {\n for (const raw of opts.stack.split('\\n').slice(1)) {\n const frame = raw.trim().replace(/^at\\s+/, '');\n const opening = frame.indexOf(' (');\n const location = frame.endsWith(')') && opening >= 0 ? frame.slice(opening + 2, -1) : frame;\n let file = location.replace(/:\\d+:\\d+$/, '');\n if (file.startsWith('file://')) {\n file = decodeURIComponent(file.slice('file://'.length)).replace(/^\\/([A-Za-z]:\\/)/, '$1');\n }\n const isPath = file.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(file);\n if (isPath && !/(?:^|[\\\\/])artifact-group\\.(?:ts|js)$/.test(file)) {\n return file;\n }\n }\n return undefined;\n }\n}\n"]}
|
|
@@ -110,8 +110,8 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
110
110
|
for (const prereq of afterList) {
|
|
111
111
|
// A string names a class, the only form that can; a class is matched by identity.
|
|
112
112
|
const prereqClass = typeof prereq === 'function'
|
|
113
|
-
? classes.find(candidate => candidate === prereq)
|
|
114
|
-
: classes.find(candidate => candidate.name === String(prereq));
|
|
113
|
+
? classes.find((candidate) => candidate === prereq)
|
|
114
|
+
: classes.find((candidate) => candidate.name === String(prereq));
|
|
115
115
|
if (!prereqClass) {
|
|
116
116
|
const prereqName = typeof prereq === 'function' ? prereq.name : String(prereq);
|
|
117
117
|
throw (0, core_1.getError)({
|
|
@@ -125,7 +125,7 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
125
125
|
// Kahn's algorithm. Siblings run in class-name order; a minified build renames classes, so an
|
|
126
126
|
// order that matters belongs in `after`.
|
|
127
127
|
const byName = (a, b) => a.name.localeCompare(b.name);
|
|
128
|
-
const available = classes.filter(target => inDegree.get(target) === 0).sort(byName);
|
|
128
|
+
const available = classes.filter((target) => inDegree.get(target) === 0).sort(byName);
|
|
129
129
|
const sorted = [];
|
|
130
130
|
while (available.length > 0) {
|
|
131
131
|
const current = available.shift();
|
|
@@ -141,8 +141,8 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
141
141
|
}
|
|
142
142
|
if (sorted.length !== classes.length) {
|
|
143
143
|
const unvisited = classes
|
|
144
|
-
.filter(target => !sorted.includes(target))
|
|
145
|
-
.map(target => target.name);
|
|
144
|
+
.filter((target) => !sorted.includes(target))
|
|
145
|
+
.map((target) => target.name);
|
|
146
146
|
throw (0, core_1.getError)({
|
|
147
147
|
message: `[sortConfigurationsTopologically] Dependency cycle detected in configurations: ${unvisited.join(', ')}`,
|
|
148
148
|
});
|
|
@@ -151,7 +151,7 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
151
151
|
}
|
|
152
152
|
/** Every entry of a kind must be a class. `undefined` is what an import cycle leaves - the index was read before a class's module finished loading - so it gets a message that names the cause instead of a crash on `.name`. */
|
|
153
153
|
assertClasses(opts) {
|
|
154
|
-
const position = (opts.classes ?? []).findIndex(target => typeof target !== 'function');
|
|
154
|
+
const position = (opts.classes ?? []).findIndex((target) => typeof target !== 'function');
|
|
155
155
|
if (position >= 0) {
|
|
156
156
|
throw (0, core_1.getError)({
|
|
157
157
|
message: `[ArtifactIndex] '${opts.field}' lists an entry that is not a class (position ${position}) | Usually an import cycle: the index was read before that class's module finished loading. The module that imports the index (or @venizia/ignis-boot/auto) must not define decorated classes or be imported by them`,
|
|
@@ -165,7 +165,7 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
165
165
|
return this.flatten({ input: await this.contentOf({ group: input }), application });
|
|
166
166
|
}
|
|
167
167
|
if (Array.isArray(input)) {
|
|
168
|
-
const nested = await Promise.all(input.map(entry => this.flatten({ input: entry, application })));
|
|
168
|
+
const nested = await Promise.all(input.map((entry) => this.flatten({ input: entry, application })));
|
|
169
169
|
return nested.flat();
|
|
170
170
|
}
|
|
171
171
|
if (this.isConditional(input)) {
|
|
@@ -187,7 +187,7 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
187
187
|
this.assertClasses({ field, classes });
|
|
188
188
|
}
|
|
189
189
|
const kinds = Object.values(content);
|
|
190
|
-
const names = kinds.flatMap(classes => (classes ?? []).map(target => target.name));
|
|
190
|
+
const names = kinds.flatMap((classes) => (classes ?? []).map((target) => target.name));
|
|
191
191
|
if (names.length === 0 && !group.kinds) {
|
|
192
192
|
throw (0, core_1.getError)({
|
|
193
193
|
message: `[ArtifactGroup] '${group.folder ?? '<application>'}' resolved to no class | Defined in ${group.site ?? 'an unknown module'} - check the folder name and that its classes carry a stereotype decorator`,
|
|
@@ -206,9 +206,9 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
206
206
|
const registry = inversion_1.MetadataRegistry.getInstance();
|
|
207
207
|
// De-duplicated: discovery and a declared index can name the same class, and registering it
|
|
208
208
|
// twice trips `bootChecks.binding.allowOverride: false`. First mention wins its position.
|
|
209
|
-
const listed = [...new Set(indexes.flatMap(index => [...(index[field] ?? [])]))];
|
|
209
|
+
const listed = [...new Set(indexes.flatMap((index) => [...(index[field] ?? [])]))];
|
|
210
210
|
this.assertClasses({ field, classes: listed });
|
|
211
|
-
const decisions = await Promise.all(listed.map(target => this.isSelected({ target, application })));
|
|
211
|
+
const decisions = await Promise.all(listed.map((target) => this.isSelected({ target, application })));
|
|
212
212
|
const kept = listed.filter((target, position) => {
|
|
213
213
|
if (decisions[position]) {
|
|
214
214
|
return true;
|
|
@@ -223,7 +223,7 @@ class ArtifactIndexHelper extends core_1.BaseHelper {
|
|
|
223
223
|
order: registry.getArtifactMetadata({ target })?.order ?? 0,
|
|
224
224
|
}))
|
|
225
225
|
.sort((a, b) => a.order - b.order || a.position - b.position)
|
|
226
|
-
.map(entry => entry.target);
|
|
226
|
+
.map((entry) => entry.target);
|
|
227
227
|
}
|
|
228
228
|
async isSelected(opts) {
|
|
229
229
|
const { target, application } = opts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-index.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-index.ts"],"names":[],"mappings":"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","sourcesContent":["import { MetadataRegistry } from '@/helpers/inversion';\nimport { SingletonRealm } from '@/helpers/singleton-realm';\nimport type { AnyType, TClass } from '@venizia/ignis-helpers/common';\nimport { ArtifactTypes, isClass } from '@/helpers/inversion';\nimport { BaseHelper, getError } from '@venizia/ignis-helpers/core';\nimport { ArtifactGroup } from './artifact-group';\nimport type {\n IArtifactGroup,\n IArtifactIndex,\n IConditionalArtifactIndex,\n TArtifactIndexInput,\n} from './common';\nimport { ArtifactIndexFields } from './common';\n\n/** Turns a `configs.artifacts` input into the classes to register: flattens nested indexes, drops the classes whose `when` says no, orders the rest. It never touches the container - `registerArtifacts` does the binding. */\nexport class ArtifactIndexHelper extends BaseHelper {\n static readonly SINGLETON_REALM_KEY = 'artifact-index-helper';\n\n private constructor() {\n super({ scope: ArtifactIndexHelper.name });\n }\n\n static getInstance(): ArtifactIndexHelper {\n return SingletonRealm.resolve({\n key: ArtifactIndexHelper.SINGLETON_REALM_KEY,\n create: () => new ArtifactIndexHelper(),\n });\n }\n\n /** Maps an artifact type to the index field that carries it. `ArtifactTypes.MODEL` is deliberately absent: a model has a binding namespace but no index field, because its repository registers it. */\n private static readonly INDEX_FIELD_BY_TYPE: Record<string, string> = {\n [ArtifactTypes.CONFIGURATION]: ArtifactIndexFields.CONFIGURATIONS,\n [ArtifactTypes.DATASOURCE]: ArtifactIndexFields.DATA_SOURCES,\n [ArtifactTypes.COMPONENT]: ArtifactIndexFields.COMPONENTS,\n [ArtifactTypes.REPOSITORY]: ArtifactIndexFields.REPOSITORIES,\n [ArtifactTypes.SERVICE]: ArtifactIndexFields.SERVICES,\n [ArtifactTypes.CONTROLLER]: ArtifactIndexFields.CONTROLLERS,\n };\n\n /** The index a decorator-only application has: every class a stereotype saw at import time, bucketed by its type. `when` and `order` still apply - `resolve` does that, exactly as it does for a declared index. */\n buildDiscoveredIndex(): IArtifactIndex {\n const registry = MetadataRegistry.getInstance();\n const index: Record<string, TClass<AnyType>[]> = {};\n\n const discoveredArtifacts = registry.getDiscoveredArtifacts();\n for (const target of discoveredArtifacts) {\n if (!isClass<AnyType>(target)) {\n continue;\n }\n\n const type = registry.getArtifactMetadata({ target })?.type;\n const field = type ? ArtifactIndexHelper.INDEX_FIELD_BY_TYPE[type] : undefined;\n if (!field) {\n continue;\n }\n\n index[field] = [...(index[field] ?? []), target];\n }\n\n return index;\n }\n\n /** Every kind of the input, each already filtered by `when` and sorted by `order`, keyed the way `IArtifactIndex` is. */\n async resolve(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<Required<IArtifactIndex>> {\n const { input, application } = opts;\n const indexes = await this.flatten({ input, application });\n\n const rawConfigurations = await this.select({\n indexes,\n field: ArtifactIndexFields.CONFIGURATIONS,\n application,\n });\n const configurations = this.sortConfigurationsTopologically({\n classes: rawConfigurations,\n });\n\n const dataSources = await this.select({\n indexes,\n field: ArtifactIndexFields.DATA_SOURCES,\n application,\n });\n const components = await this.select({\n indexes,\n field: ArtifactIndexFields.COMPONENTS,\n application,\n });\n const repositories = await this.select({\n indexes,\n field: ArtifactIndexFields.REPOSITORIES,\n application,\n });\n const services = await this.select({\n indexes,\n field: ArtifactIndexFields.SERVICES,\n application,\n });\n const controllers = await this.select({\n indexes,\n field: ArtifactIndexFields.CONTROLLERS,\n application,\n });\n\n return { configurations, dataSources, components, repositories, services, controllers };\n }\n\n /**\n * Topologically sort configurations based on `after` dependencies.\n * Siblings with no dependency relation are sorted deterministically by class name.\n * Throws if an unknown `after` dependency is referenced or if a dependency cycle is detected.\n */\n sortConfigurationsTopologically(opts: { classes: ReadonlyArray<TClass<any>> }): TClass<any>[] {\n const { classes } = opts;\n if (classes.length === 0) {\n return [];\n }\n\n const registry = MetadataRegistry.getInstance();\n\n // Keyed by the class itself: two configurations may share a name (a minified build renames them),\n // and a name-keyed graph silently drops one of them.\n const inDegree = new Map<TClass<any>, number>();\n const adjacency = new Map<TClass<any>, TClass<any>[]>();\n\n for (const target of classes) {\n inDegree.set(target, 0);\n adjacency.set(target, []);\n }\n\n for (const target of classes) {\n const metadata = registry.getArtifactMetadata({ target });\n const afterList = metadata?.after ?? [];\n\n for (const prereq of afterList) {\n // A string names a class, the only form that can; a class is matched by identity.\n const prereqClass =\n typeof prereq === 'function'\n ? classes.find(candidate => candidate === prereq)\n : classes.find(candidate => candidate.name === String(prereq));\n\n if (!prereqClass) {\n const prereqName = typeof prereq === 'function' ? prereq.name : String(prereq);\n throw getError({\n message: `[sortConfigurationsTopologically][${target.name}] Declared 'after' dependency '${prereqName}' is not registered as a configuration`,\n });\n }\n\n adjacency.get(prereqClass)!.push(target);\n inDegree.set(target, (inDegree.get(target) ?? 0) + 1);\n }\n }\n\n // Kahn's algorithm. Siblings run in class-name order; a minified build renames classes, so an\n // order that matters belongs in `after`.\n const byName = (a: TClass<any>, b: TClass<any>) => a.name.localeCompare(b.name);\n const available = classes.filter(target => inDegree.get(target) === 0).sort(byName);\n const sorted: TClass<any>[] = [];\n\n while (available.length > 0) {\n const current = available.shift()!;\n sorted.push(current);\n\n for (const dependent of adjacency.get(current) ?? []) {\n const newDeg = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, newDeg);\n if (newDeg === 0) {\n available.push(dependent);\n available.sort(byName);\n }\n }\n }\n\n if (sorted.length !== classes.length) {\n const unvisited = classes\n .filter(target => !sorted.includes(target))\n .map(target => target.name);\n throw getError({\n message: `[sortConfigurationsTopologically] Dependency cycle detected in configurations: ${unvisited.join(', ')}`,\n });\n }\n\n return sorted;\n }\n\n /** Every entry of a kind must be a class. `undefined` is what an import cycle leaves - the index was read before a class's module finished loading - so it gets a message that names the cause instead of a crash on `.name`. */\n private assertClasses(opts: {\n field: string;\n classes: ReadonlyArray<unknown> | undefined;\n }): void {\n const position = (opts.classes ?? []).findIndex(target => typeof target !== 'function');\n if (position >= 0) {\n throw getError({\n message: `[ArtifactIndex] '${opts.field}' lists an entry that is not a class (position ${position}) | Usually an import cycle: the index was read before that class's module finished loading. The module that imports the index (or @venizia/ignis-boot/auto) must not define decorated classes or be imported by them`,\n });\n }\n }\n\n /** One index, or arrays nested to any depth, as a flat list in input order; a conditional entry contributes its subtree only when its `when` answers true. */\n async flatten(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<IArtifactIndex[]> {\n const { input, application } = opts;\n if (ArtifactGroup.isGroup(input)) {\n return this.flatten({ input: await this.contentOf({ group: input }), application });\n }\n if (Array.isArray(input)) {\n const nested = await Promise.all(\n input.map(entry => this.flatten({ input: entry, application })),\n );\n return nested.flat();\n }\n\n if (this.isConditional(input)) {\n const isSelected = await input.when({ application });\n if (!isSelected) {\n this.logger.debug('Skipped by condition | conditional index entry');\n return [];\n }\n\n return this.flatten({ input: input.index, application });\n }\n\n return [input];\n }\n\n /** A group's classes: inlined at build time, else the resolver `@venizia/ignis-boot/auto` installs. Never empty - a group that names nothing is a typo or a moved folder. */\n private async contentOf(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n const content = await ArtifactGroup.resolveContent({ group });\n\n // One element type for the six kinds, so `.map` is callable on every member of the union.\n for (const [field, classes] of Object.entries(content)) {\n this.assertClasses({ field, classes });\n }\n const kinds: Array<ReadonlyArray<TClass<unknown>> | undefined> = Object.values(content);\n const names = kinds.flatMap(classes => (classes ?? []).map(target => target.name));\n if (names.length === 0 && !group.kinds) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' resolved to no class | Defined in ${group.site ?? 'an unknown module'} - check the folder name and that its classes carry a stereotype decorator`,\n });\n }\n this.logger.info('[ArtifactGroup] %s -> %s', group.folder ?? '<application>', names.join(', '));\n return content;\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `input`. */\n private isConditional(\n entry: IArtifactIndex | IConditionalArtifactIndex,\n ): entry is IConditionalArtifactIndex {\n return 'when' in entry && 'index' in entry;\n }\n\n /** The classes of one kind across every index, minus those whose `when` says no, sorted by `order` (stable). The `when` conditions run concurrently: each reads config and environment, never another artifact. */\n async select<Field extends keyof IArtifactIndex>(opts: {\n indexes: IArtifactIndex[];\n field: Field;\n application: unknown;\n }): Promise<NonNullable<IArtifactIndex[Field]>[number][]> {\n const { indexes, field, application } = opts;\n const registry = MetadataRegistry.getInstance();\n\n // De-duplicated: discovery and a declared index can name the same class, and registering it\n // twice trips `bootChecks.binding.allowOverride: false`. First mention wins its position.\n const listed = [...new Set(indexes.flatMap(index => [...(index[field] ?? [])]))];\n this.assertClasses({ field, classes: listed });\n const decisions = await Promise.all(\n listed.map(target => this.isSelected({ target, application })),\n );\n\n const kept = listed.filter((target, position) => {\n if (decisions[position]) {\n return true;\n }\n\n this.logger.debug('Skipped by condition | kind: %s | class: %s', field, target.name);\n return false;\n });\n\n return kept\n .map((target, position) => ({\n target,\n position,\n order: registry.getArtifactMetadata({ target })?.order ?? 0,\n }))\n .sort((a, b) => a.order - b.order || a.position - b.position)\n .map(entry => entry.target);\n }\n\n private async isSelected(opts: {\n target: TClass<unknown>;\n application: unknown;\n }): Promise<boolean> {\n const { target, application } = opts;\n const when = MetadataRegistry.getInstance().getArtifactMetadata({ target })?.when;\n if (!when) {\n return true;\n }\n return when({ application });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-index.js","sourceRoot":"","sources":["../../../../src/base/applications/artifact-index.ts"],"names":[],"mappings":";;;AAAA,mDAAuD;AACvD,+DAA2D;AAE3D,mDAA6D;AAC7D,sDAAmE;AACnE,qDAAiD;AAOjD,qCAA+C;AAE/C,+NAA+N;AAC/N,MAAa,mBAAoB,SAAQ,iBAAU;aACjC,wBAAmB,GAAG,uBAAuB,CAAC;IAE9D;QACE,KAAK,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,gCAAc,CAAC,OAAO,CAAC;YAC5B,GAAG,EAAE,mBAAmB,CAAC,mBAAmB;YAC5C,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE;SACxC,CAAC,CAAC;IACL,CAAC;IAED,uMAAuM;aAC/K,wBAAmB,GAA2B;QACpE,CAAC,yBAAa,CAAC,aAAa,CAAC,EAAE,4BAAmB,CAAC,cAAc;QACjE,CAAC,yBAAa,CAAC,UAAU,CAAC,EAAE,4BAAmB,CAAC,YAAY;QAC5D,CAAC,yBAAa,CAAC,SAAS,CAAC,EAAE,4BAAmB,CAAC,UAAU;QACzD,CAAC,yBAAa,CAAC,UAAU,CAAC,EAAE,4BAAmB,CAAC,YAAY;QAC5D,CAAC,yBAAa,CAAC,OAAO,CAAC,EAAE,4BAAmB,CAAC,QAAQ;QACrD,CAAC,yBAAa,CAAC,UAAU,CAAC,EAAE,4BAAmB,CAAC,WAAW;KAC5D,CAAC;IAEF,oNAAoN;IACpN,oBAAoB;QAClB,MAAM,QAAQ,GAAG,4BAAgB,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,KAAK,GAAsC,EAAE,CAAC;QAEpD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QAC9D,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;YACzC,IAAI,CAAC,IAAA,mBAAO,EAAU,MAAM,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yHAAyH;IACzH,KAAK,CAAC,OAAO,CAAC,IAGb;QACC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAE3D,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YAC1C,OAAO;YACP,KAAK,EAAE,4BAAmB,CAAC,cAAc;YACzC,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,CAAC;YAC1D,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YACpC,OAAO;YACP,KAAK,EAAE,4BAAmB,CAAC,YAAY;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YACnC,OAAO;YACP,KAAK,EAAE,4BAAmB,CAAC,UAAU;YACrC,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YACrC,OAAO;YACP,KAAK,EAAE,4BAAmB,CAAC,YAAY;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YACjC,OAAO;YACP,KAAK,EAAE,4BAAmB,CAAC,QAAQ;YACnC,WAAW;SACZ,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YACpC,OAAO;YACP,KAAK,EAAE,4BAAmB,CAAC,WAAW;YACtC,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;IAC1F,CAAC;IAED;;;;OAIG;IACH,+BAA+B,CAAC,IAA6C;QAC3E,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;QACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,QAAQ,GAAG,4BAAgB,CAAC,WAAW,EAAE,CAAC;QAEhD,kGAAkG;QAClG,qDAAqD;QACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;QAExD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxB,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;YAExC,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;gBAC/B,kFAAkF;gBAClF,MAAM,WAAW,GACf,OAAO,MAAM,KAAK,UAAU;oBAC1B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC;oBACnD,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAErE,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC/E,MAAM,IAAA,eAAQ,EAAC;wBACb,OAAO,EAAE,qCAAqC,MAAM,CAAC,IAAI,kCAAkC,UAAU,wCAAwC;qBAC9I,CAAC,CAAC;gBACL,CAAC;gBAED,SAAS,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,8FAA8F;QAC9F,yCAAyC;QACzC,MAAM,MAAM,GAAG,CAAC,CAAc,EAAE,CAAc,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtF,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,EAAG,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAErB,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAE,GAAG,CAAC,CAAC;gBAC5C,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAChC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;oBACjB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1B,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,OAAO;iBACtB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;iBAC5C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,IAAA,eAAQ,EAAC;gBACb,OAAO,EAAE,kFAAkF,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAClH,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iOAAiO;IACzN,aAAa,CAAC,IAGrB;QACC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC;QAC1F,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,IAAA,eAAQ,EAAC;gBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,KAAK,kDAAkD,QAAQ,uNAAuN;aACzT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8JAA8J;IAC9J,KAAK,CAAC,OAAO,CAAC,IAGb;QACC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QACpC,IAAI,8BAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAClE,CAAC;YACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YACrD,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBACpE,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,6KAA6K;IACrK,KAAK,CAAC,SAAS,CAAC,IAA+B;QACrD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,8BAAa,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAE9D,0FAA0F;QAC1F,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,KAAK,GAAsD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACvC,MAAM,IAAA,eAAQ,EAAC;gBACb,OAAO,EAAE,oBAAoB,KAAK,CAAC,MAAM,IAAI,eAAe,uCAAuC,KAAK,CAAC,IAAI,IAAI,mBAAmB,4EAA4E;aACjN,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,MAAM,IAAI,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,4IAA4I;IACpI,aAAa,CACnB,KAAiD;QAEjD,OAAO,MAAM,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,CAAC;IAC7C,CAAC;IAED,mNAAmN;IACnN,KAAK,CAAC,MAAM,CAAqC,IAIhD;QACC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QAC7C,MAAM,QAAQ,GAAG,4BAAgB,CAAC,WAAW,EAAE,CAAC;QAEhD,4FAA4F;QAC5F,0FAA0F;QAC1F,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CACjE,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACrF,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI;aACR,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC1B,MAAM;YACN,QAAQ;YACR,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;SAC5D,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;aAC5D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAGxB;QACC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,4BAAgB,CAAC,WAAW,EAAE,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC;QAClF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/B,CAAC;;AA9RH,kDA+RC","sourcesContent":["import { MetadataRegistry } from '@/helpers/inversion';\nimport { SingletonRealm } from '@/helpers/singleton-realm';\nimport type { AnyType, TClass } from '@venizia/ignis-helpers/common';\nimport { ArtifactTypes, isClass } from '@/helpers/inversion';\nimport { BaseHelper, getError } from '@venizia/ignis-helpers/core';\nimport { ArtifactGroup } from './artifact-group';\nimport type {\n IArtifactGroup,\n IArtifactIndex,\n IConditionalArtifactIndex,\n TArtifactIndexInput,\n} from './common';\nimport { ArtifactIndexFields } from './common';\n\n/** Turns a `configs.artifacts` input into the classes to register: flattens nested indexes, drops the classes whose `when` says no, orders the rest. It never touches the container - `registerArtifacts` does the binding. */\nexport class ArtifactIndexHelper extends BaseHelper {\n static readonly SINGLETON_REALM_KEY = 'artifact-index-helper';\n\n private constructor() {\n super({ scope: ArtifactIndexHelper.name });\n }\n\n static getInstance(): ArtifactIndexHelper {\n return SingletonRealm.resolve({\n key: ArtifactIndexHelper.SINGLETON_REALM_KEY,\n create: () => new ArtifactIndexHelper(),\n });\n }\n\n /** Maps an artifact type to the index field that carries it. `ArtifactTypes.MODEL` is deliberately absent: a model has a binding namespace but no index field, because its repository registers it. */\n private static readonly INDEX_FIELD_BY_TYPE: Record<string, string> = {\n [ArtifactTypes.CONFIGURATION]: ArtifactIndexFields.CONFIGURATIONS,\n [ArtifactTypes.DATASOURCE]: ArtifactIndexFields.DATA_SOURCES,\n [ArtifactTypes.COMPONENT]: ArtifactIndexFields.COMPONENTS,\n [ArtifactTypes.REPOSITORY]: ArtifactIndexFields.REPOSITORIES,\n [ArtifactTypes.SERVICE]: ArtifactIndexFields.SERVICES,\n [ArtifactTypes.CONTROLLER]: ArtifactIndexFields.CONTROLLERS,\n };\n\n /** The index a decorator-only application has: every class a stereotype saw at import time, bucketed by its type. `when` and `order` still apply - `resolve` does that, exactly as it does for a declared index. */\n buildDiscoveredIndex(): IArtifactIndex {\n const registry = MetadataRegistry.getInstance();\n const index: Record<string, TClass<AnyType>[]> = {};\n\n const discoveredArtifacts = registry.getDiscoveredArtifacts();\n for (const target of discoveredArtifacts) {\n if (!isClass<AnyType>(target)) {\n continue;\n }\n\n const type = registry.getArtifactMetadata({ target })?.type;\n const field = type ? ArtifactIndexHelper.INDEX_FIELD_BY_TYPE[type] : undefined;\n if (!field) {\n continue;\n }\n\n index[field] = [...(index[field] ?? []), target];\n }\n\n return index;\n }\n\n /** Every kind of the input, each already filtered by `when` and sorted by `order`, keyed the way `IArtifactIndex` is. */\n async resolve(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<Required<IArtifactIndex>> {\n const { input, application } = opts;\n const indexes = await this.flatten({ input, application });\n\n const rawConfigurations = await this.select({\n indexes,\n field: ArtifactIndexFields.CONFIGURATIONS,\n application,\n });\n const configurations = this.sortConfigurationsTopologically({\n classes: rawConfigurations,\n });\n\n const dataSources = await this.select({\n indexes,\n field: ArtifactIndexFields.DATA_SOURCES,\n application,\n });\n const components = await this.select({\n indexes,\n field: ArtifactIndexFields.COMPONENTS,\n application,\n });\n const repositories = await this.select({\n indexes,\n field: ArtifactIndexFields.REPOSITORIES,\n application,\n });\n const services = await this.select({\n indexes,\n field: ArtifactIndexFields.SERVICES,\n application,\n });\n const controllers = await this.select({\n indexes,\n field: ArtifactIndexFields.CONTROLLERS,\n application,\n });\n\n return { configurations, dataSources, components, repositories, services, controllers };\n }\n\n /**\n * Topologically sort configurations based on `after` dependencies.\n * Siblings with no dependency relation are sorted deterministically by class name.\n * Throws if an unknown `after` dependency is referenced or if a dependency cycle is detected.\n */\n sortConfigurationsTopologically(opts: { classes: ReadonlyArray<TClass<any>> }): TClass<any>[] {\n const { classes } = opts;\n if (classes.length === 0) {\n return [];\n }\n\n const registry = MetadataRegistry.getInstance();\n\n // Keyed by the class itself: two configurations may share a name (a minified build renames them),\n // and a name-keyed graph silently drops one of them.\n const inDegree = new Map<TClass<any>, number>();\n const adjacency = new Map<TClass<any>, TClass<any>[]>();\n\n for (const target of classes) {\n inDegree.set(target, 0);\n adjacency.set(target, []);\n }\n\n for (const target of classes) {\n const metadata = registry.getArtifactMetadata({ target });\n const afterList = metadata?.after ?? [];\n\n for (const prereq of afterList) {\n // A string names a class, the only form that can; a class is matched by identity.\n const prereqClass =\n typeof prereq === 'function'\n ? classes.find((candidate) => candidate === prereq)\n : classes.find((candidate) => candidate.name === String(prereq));\n\n if (!prereqClass) {\n const prereqName = typeof prereq === 'function' ? prereq.name : String(prereq);\n throw getError({\n message: `[sortConfigurationsTopologically][${target.name}] Declared 'after' dependency '${prereqName}' is not registered as a configuration`,\n });\n }\n\n adjacency.get(prereqClass)!.push(target);\n inDegree.set(target, (inDegree.get(target) ?? 0) + 1);\n }\n }\n\n // Kahn's algorithm. Siblings run in class-name order; a minified build renames classes, so an\n // order that matters belongs in `after`.\n const byName = (a: TClass<any>, b: TClass<any>) => a.name.localeCompare(b.name);\n const available = classes.filter((target) => inDegree.get(target) === 0).sort(byName);\n const sorted: TClass<any>[] = [];\n\n while (available.length > 0) {\n const current = available.shift()!;\n sorted.push(current);\n\n for (const dependent of adjacency.get(current) ?? []) {\n const newDeg = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, newDeg);\n if (newDeg === 0) {\n available.push(dependent);\n available.sort(byName);\n }\n }\n }\n\n if (sorted.length !== classes.length) {\n const unvisited = classes\n .filter((target) => !sorted.includes(target))\n .map((target) => target.name);\n throw getError({\n message: `[sortConfigurationsTopologically] Dependency cycle detected in configurations: ${unvisited.join(', ')}`,\n });\n }\n\n return sorted;\n }\n\n /** Every entry of a kind must be a class. `undefined` is what an import cycle leaves - the index was read before a class's module finished loading - so it gets a message that names the cause instead of a crash on `.name`. */\n private assertClasses(opts: {\n field: string;\n classes: ReadonlyArray<unknown> | undefined;\n }): void {\n const position = (opts.classes ?? []).findIndex((target) => typeof target !== 'function');\n if (position >= 0) {\n throw getError({\n message: `[ArtifactIndex] '${opts.field}' lists an entry that is not a class (position ${position}) | Usually an import cycle: the index was read before that class's module finished loading. The module that imports the index (or @venizia/ignis-boot/auto) must not define decorated classes or be imported by them`,\n });\n }\n }\n\n /** One index, or arrays nested to any depth, as a flat list in input order; a conditional entry contributes its subtree only when its `when` answers true. */\n async flatten(opts: {\n input: TArtifactIndexInput;\n application: unknown;\n }): Promise<IArtifactIndex[]> {\n const { input, application } = opts;\n if (ArtifactGroup.isGroup(input)) {\n return this.flatten({ input: await this.contentOf({ group: input }), application });\n }\n if (Array.isArray(input)) {\n const nested = await Promise.all(\n input.map((entry) => this.flatten({ input: entry, application })),\n );\n return nested.flat();\n }\n\n if (this.isConditional(input)) {\n const isSelected = await input.when({ application });\n if (!isSelected) {\n this.logger.debug('Skipped by condition | conditional index entry');\n return [];\n }\n\n return this.flatten({ input: input.index, application });\n }\n\n return [input];\n }\n\n /** A group's classes: inlined at build time, else the resolver `@venizia/ignis-boot/auto` installs. Never empty - a group that names nothing is a typo or a moved folder. */\n private async contentOf(opts: { group: IArtifactGroup }): Promise<IArtifactIndex> {\n const { group } = opts;\n const content = await ArtifactGroup.resolveContent({ group });\n\n // One element type for the six kinds, so `.map` is callable on every member of the union.\n for (const [field, classes] of Object.entries(content)) {\n this.assertClasses({ field, classes });\n }\n const kinds: Array<ReadonlyArray<TClass<unknown>> | undefined> = Object.values(content);\n const names = kinds.flatMap((classes) => (classes ?? []).map((target) => target.name));\n if (names.length === 0 && !group.kinds) {\n throw getError({\n message: `[ArtifactGroup] '${group.folder ?? '<application>'}' resolved to no class | Defined in ${group.site ?? 'an unknown module'} - check the folder name and that its classes carry a stereotype decorator`,\n });\n }\n this.logger.info('[ArtifactGroup] %s -> %s', group.folder ?? '<application>', names.join(', '));\n return content;\n }\n\n /** Positional on purpose: a type predicate narrows its own parameter, and an options object would narrow the wrapper instead of `input`. */\n private isConditional(\n entry: IArtifactIndex | IConditionalArtifactIndex,\n ): entry is IConditionalArtifactIndex {\n return 'when' in entry && 'index' in entry;\n }\n\n /** The classes of one kind across every index, minus those whose `when` says no, sorted by `order` (stable). The `when` conditions run concurrently: each reads config and environment, never another artifact. */\n async select<Field extends keyof IArtifactIndex>(opts: {\n indexes: IArtifactIndex[];\n field: Field;\n application: unknown;\n }): Promise<NonNullable<IArtifactIndex[Field]>[number][]> {\n const { indexes, field, application } = opts;\n const registry = MetadataRegistry.getInstance();\n\n // De-duplicated: discovery and a declared index can name the same class, and registering it\n // twice trips `bootChecks.binding.allowOverride: false`. First mention wins its position.\n const listed = [...new Set(indexes.flatMap((index) => [...(index[field] ?? [])]))];\n this.assertClasses({ field, classes: listed });\n const decisions = await Promise.all(\n listed.map((target) => this.isSelected({ target, application })),\n );\n\n const kept = listed.filter((target, position) => {\n if (decisions[position]) {\n return true;\n }\n\n this.logger.debug('Skipped by condition | kind: %s | class: %s', field, target.name);\n return false;\n });\n\n return kept\n .map((target, position) => ({\n target,\n position,\n order: registry.getArtifactMetadata({ target })?.order ?? 0,\n }))\n .sort((a, b) => a.order - b.order || a.position - b.position)\n .map((entry) => entry.target);\n }\n\n private async isSelected(opts: {\n target: TClass<unknown>;\n application: unknown;\n }): Promise<boolean> {\n const { target, application } = opts;\n const when = MetadataRegistry.getInstance().getArtifactMetadata({ target })?.when;\n if (!when) {\n return true;\n }\n return when({ application });\n }\n}\n"]}
|
|
@@ -39,7 +39,7 @@ class BootSequence {
|
|
|
39
39
|
static indexOf(opts) {
|
|
40
40
|
const { steps, target } = opts;
|
|
41
41
|
const matches = steps.flatMap((step, index) => (step.name === target ? [index] : []));
|
|
42
|
-
const known = steps.map(step => step.name).join(', ');
|
|
42
|
+
const known = steps.map((step) => step.name).join(', ');
|
|
43
43
|
switch (matches.length) {
|
|
44
44
|
case 0: {
|
|
45
45
|
throw (0, core_1.getError)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot-sequence.js","sourceRoot":"","sources":["../../../../src/base/applications/boot-sequence.ts"],"names":[],"mappings":";;;AACA,sDAAuD;AAEvD,+LAA+L;AAC/L,MAAa,SAAS;aACJ,qBAAgB,GAAG,iBAAiB,CAAC;aACrC,uBAAkB,GAAG,mBAAmB,CAAC;aACzC,kBAAa,GAAG,cAAc,CAAC;aAC/B,iCAA4B,GAAG,4BAA4B,CAAC;aAC5D,4BAAuB,GAAG,wBAAwB,CAAC;aACnD,0BAAqB,GAAG,qBAAqB,CAAC;aAC9C,wBAAmB,GAAG,oBAAoB,CAAC;aAC3C,sCAAiC,GAAG,gCAAgC,CAAC;aACrE,yBAAoB,GAAG,qBAAqB,CAAC;aAC7C,mBAAc,GAAG,eAAe,CAAC;aACjC,oBAAe,GAAG,gBAAgB,CAAC;aACnC,eAAU,GAAG,IAAI,GAAG,CAAS;QAC3C,IAAI,CAAC,gBAAgB;QACrB,IAAI,CAAC,kBAAkB;QACvB,IAAI,CAAC,aAAa;QAClB,IAAI,CAAC,4BAA4B;QACjC,IAAI,CAAC,uBAAuB;QAC5B,IAAI,CAAC,qBAAqB;QAC1B,IAAI,CAAC,mBAAmB;QACxB,IAAI,CAAC,iCAAiC;QACtC,IAAI,CAAC,oBAAoB;QACzB,IAAI,CAAC,cAAc;QACnB,IAAI,CAAC,eAAe;KACrB,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;;AA5BH,8BA6BC;AASD,2KAA2K;AAC3K,MAAa,YAAY;IACvB,2IAA2I;IACnI,MAAM,CAAC,OAAO,CAAC,IAAoD;QACzE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"boot-sequence.js","sourceRoot":"","sources":["../../../../src/base/applications/boot-sequence.ts"],"names":[],"mappings":";;;AACA,sDAAuD;AAEvD,+LAA+L;AAC/L,MAAa,SAAS;aACJ,qBAAgB,GAAG,iBAAiB,CAAC;aACrC,uBAAkB,GAAG,mBAAmB,CAAC;aACzC,kBAAa,GAAG,cAAc,CAAC;aAC/B,iCAA4B,GAAG,4BAA4B,CAAC;aAC5D,4BAAuB,GAAG,wBAAwB,CAAC;aACnD,0BAAqB,GAAG,qBAAqB,CAAC;aAC9C,wBAAmB,GAAG,oBAAoB,CAAC;aAC3C,sCAAiC,GAAG,gCAAgC,CAAC;aACrE,yBAAoB,GAAG,qBAAqB,CAAC;aAC7C,mBAAc,GAAG,eAAe,CAAC;aACjC,oBAAe,GAAG,gBAAgB,CAAC;aACnC,eAAU,GAAG,IAAI,GAAG,CAAS;QAC3C,IAAI,CAAC,gBAAgB;QACrB,IAAI,CAAC,kBAAkB;QACvB,IAAI,CAAC,aAAa;QAClB,IAAI,CAAC,4BAA4B;QACjC,IAAI,CAAC,uBAAuB;QAC5B,IAAI,CAAC,qBAAqB;QAC1B,IAAI,CAAC,mBAAmB;QACxB,IAAI,CAAC,iCAAiC;QACtC,IAAI,CAAC,oBAAoB;QACzB,IAAI,CAAC,cAAc;QACnB,IAAI,CAAC,eAAe;KACrB,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;;AA5BH,8BA6BC;AASD,2KAA2K;AAC3K,MAAa,YAAY;IACvB,2IAA2I;IACnI,MAAM,CAAC,OAAO,CAAC,IAAoD;QACzE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAExD,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,CAAC,CAAC,CAAC;gBACP,MAAM,IAAA,eAAQ,EAAC;oBACb,OAAO,EAAE,iCAAiC,MAAM,oBAAoB,KAAK,EAAE;iBAC5E,CAAC,CAAC;YACL,CAAC;YACD,KAAK,CAAC,CAAC,CAAC,CAAC;gBACP,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;YACpB,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,IAAA,eAAQ,EAAC;oBACb,OAAO,EAAE,mCAAmC,MAAM,aAAa,OAAO,CAAC,MAAM,yBAAyB,KAAK,EAAE;iBAC9G,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAIlB;QACC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QACrC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;CACF;AAlCD,oCAkCC","sourcesContent":["import type { TConstValue, ValueOrPromise } from '@venizia/ignis-helpers/common';\nimport { getError } from '@venizia/ignis-helpers/core';\n\n/** The step names the kernel defines - the vocabulary a subclass targets with `BootSequence.insertAfter`. A server application adds its own on top (`ServerBootSteps` in `@venizia/ignis`). */\nexport class BootSteps {\n static readonly STATIC_CONFIGURE = 'staticConfigure';\n static readonly REGISTER_ARTIFACTS = 'registerArtifacts';\n static readonly PRE_CONFIGURE = 'preConfigure';\n static readonly REGISTER_DEFAULT_MIDDLEWARES = 'registerDefaultMiddlewares';\n static readonly REGISTER_CONFIGURATIONS = 'registerConfigurations';\n static readonly REGISTER_DATA_SOURCES = 'registerDataSources';\n static readonly REGISTER_COMPONENTS = 'registerComponents';\n static readonly REGISTER_CONTRIBUTED_DATA_SOURCES = 'registerContributedDataSources';\n static readonly REGISTER_CONTROLLERS = 'registerControllers';\n static readonly POST_CONFIGURE = 'postConfigure';\n static readonly VERIFY_BINDINGS = 'verifyBindings';\n static readonly SCHEME_SET = new Set<string>([\n this.STATIC_CONFIGURE,\n this.REGISTER_ARTIFACTS,\n this.PRE_CONFIGURE,\n this.REGISTER_DEFAULT_MIDDLEWARES,\n this.REGISTER_CONFIGURATIONS,\n this.REGISTER_DATA_SOURCES,\n this.REGISTER_COMPONENTS,\n this.REGISTER_CONTRIBUTED_DATA_SOURCES,\n this.REGISTER_CONTROLLERS,\n this.POST_CONFIGURE,\n this.VERIFY_BINDINGS,\n ]);\n\n static isValid(value: string): boolean {\n return this.SCHEME_SET.has(value);\n }\n}\n\nexport type TBootStep = TConstValue<typeof BootSteps>;\n\nexport interface IBootSequenceStep {\n name: string;\n run: () => ValueOrPromise<void>;\n}\n\n/** Composes a boot sequence by name instead of copying the array - a subclass reads exactly what it adds by reading its own override, without diffing two files by eye. */\nexport class BootSequence {\n /** A duplicated name is refused as loudly as a missing one - picking the first match would splice a step into the wrong place silently. */\n private static indexOf(opts: { steps: IBootSequenceStep[]; target: string }): number {\n const { steps, target } = opts;\n const matches = steps.flatMap((step, index) => (step.name === target ? [index] : []));\n const known = steps.map((step) => step.name).join(', ');\n\n switch (matches.length) {\n case 0: {\n throw getError({\n message: `[BootSequence] Unknown step: '${target}' | Known steps: ${known}`,\n });\n }\n case 1: {\n return matches[0];\n }\n default: {\n throw getError({\n message: `[BootSequence] Ambiguous step: '${target}' appears ${matches.length} times | Known steps: ${known}`,\n });\n }\n }\n }\n\n static insertAfter(opts: {\n steps: IBootSequenceStep[];\n target: string;\n step: IBootSequenceStep;\n }): IBootSequenceStep[] {\n const { steps, target, step } = opts;\n const index = BootSequence.indexOf({ steps, target });\n\n return [...steps.slice(0, index + 1), step, ...steps.slice(index + 1)];\n }\n}\n"]}
|
|
@@ -51,10 +51,10 @@ class RestApplication extends abstract_1.AbstractApplication {
|
|
|
51
51
|
super.registerCoreBindings();
|
|
52
52
|
this.bind({
|
|
53
53
|
key: bindings_1.CoreBindings.APPLICATION_SERVER,
|
|
54
|
-
}).toProvider(_ => this.server);
|
|
54
|
+
}).toProvider((_) => this.server);
|
|
55
55
|
this.bind({
|
|
56
56
|
key: bindings_1.CoreBindings.APPLICATION_ROOT_ROUTER,
|
|
57
|
-
}).toProvider(_ => this.rootRouter);
|
|
57
|
+
}).toProvider((_) => this.rootRouter);
|
|
58
58
|
}
|
|
59
59
|
/** The correlation id every host stamps - see {@link RequestIdGenerator} for why `crypto.randomUUID` is refused. */
|
|
60
60
|
generateRequestId() {
|
|
@@ -282,7 +282,7 @@ class RestApplication extends abstract_1.AbstractApplication {
|
|
|
282
282
|
throw error;
|
|
283
283
|
}
|
|
284
284
|
}
|
|
285
|
-
logger.info('Boot sequence complete | %d step(s) | Took: %s (ms) | %s', steps.length, performance.now() - t, steps.map(step => step.name).join(' -> '));
|
|
285
|
+
logger.info('Boot sequence complete | %d step(s) | Took: %s (ms) | %s', steps.length, performance.now() - t, steps.map((step) => step.name).join(' -> '));
|
|
286
286
|
}
|
|
287
287
|
inspectRoutes() {
|
|
288
288
|
const t = performance.now();
|
|
@@ -520,7 +520,7 @@ class RestApplication extends abstract_1.AbstractApplication {
|
|
|
520
520
|
[resolved.controllers, bindings_1.BindingNamespaces.CONTROLLER],
|
|
521
521
|
];
|
|
522
522
|
const collisions = artifact_keys_1.ArtifactBindingKeys.findDerivedCollisions({
|
|
523
|
-
entries: kinds.flatMap(([targets, namespace]) => targets.map(target => ({
|
|
523
|
+
entries: kinds.flatMap(([targets, namespace]) => targets.map((target) => ({
|
|
524
524
|
target,
|
|
525
525
|
namespace,
|
|
526
526
|
binding: registry.getArtifactMetadata({ target })?.binding,
|
|
@@ -600,7 +600,7 @@ class RestApplication extends abstract_1.AbstractApplication {
|
|
|
600
600
|
}).key;
|
|
601
601
|
for (const entry of provides) {
|
|
602
602
|
this.bind({ key: entry.key })
|
|
603
|
-
.toProvider(container => {
|
|
603
|
+
.toProvider((container) => {
|
|
604
604
|
const instance = container.get({
|
|
605
605
|
key: componentKey,
|
|
606
606
|
});
|