@endora-commerce/platform 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +58 -0
- package/dist/cli/dispatch.d.ts +146 -0
- package/dist/cli/dispatch.d.ts.map +1 -0
- package/dist/cli/dispatch.js +259 -0
- package/dist/cli/dispatch.js.map +1 -0
- package/dist/cli/index.d.ts +58 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +58 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/module-commands.d.ts +118 -0
- package/dist/cli/module-commands.d.ts.map +1 -0
- package/dist/cli/module-commands.js +120 -0
- package/dist/cli/module-commands.js.map +1 -0
- package/dist/commands/actor.d.ts +19 -0
- package/dist/commands/actor.d.ts.map +1 -0
- package/dist/commands/actor.js +45 -0
- package/dist/commands/actor.js.map +1 -0
- package/dist/commands/audit-from-context.d.ts +24 -0
- package/dist/commands/audit-from-context.d.ts.map +1 -0
- package/dist/commands/audit-from-context.js +28 -0
- package/dist/commands/audit-from-context.js.map +1 -0
- package/dist/commands/command-bus.d.ts +40 -0
- package/dist/commands/command-bus.d.ts.map +1 -0
- package/dist/commands/command-bus.js +46 -0
- package/dist/commands/command-bus.js.map +1 -0
- package/dist/commands/command.d.ts +76 -0
- package/dist/commands/command.d.ts.map +1 -0
- package/dist/commands/command.js +2 -0
- package/dist/commands/command.js.map +1 -0
- package/dist/commands/index.d.ts +65 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +57 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/reversible.d.ts +66 -0
- package/dist/commands/reversible.d.ts.map +1 -0
- package/dist/commands/reversible.js +41 -0
- package/dist/commands/reversible.js.map +1 -0
- package/dist/composition/compose-app.d.ts +305 -0
- package/dist/composition/compose-app.d.ts.map +1 -0
- package/dist/composition/compose-app.js +939 -0
- package/dist/composition/compose-app.js.map +1 -0
- package/dist/composition/index.d.ts +92 -0
- package/dist/composition/index.d.ts.map +1 -0
- package/dist/composition/index.js +175 -0
- package/dist/composition/index.js.map +1 -0
- package/dist/composition/newsletter-token-secret.d.ts +19 -0
- package/dist/composition/newsletter-token-secret.d.ts.map +1 -0
- package/dist/composition/newsletter-token-secret.js +24 -0
- package/dist/composition/newsletter-token-secret.js.map +1 -0
- package/dist/composition/process-runs-workers.d.ts +17 -0
- package/dist/composition/process-runs-workers.d.ts.map +1 -0
- package/dist/composition/process-runs-workers.js +19 -0
- package/dist/composition/process-runs-workers.js.map +1 -0
- package/dist/db/baseline-migration-inventory.d.ts +15 -0
- package/dist/db/baseline-migration-inventory.d.ts.map +1 -0
- package/dist/db/baseline-migration-inventory.js +115 -0
- package/dist/db/baseline-migration-inventory.js.map +1 -0
- package/dist/db/configured-entities.d.ts +74 -0
- package/dist/db/configured-entities.d.ts.map +1 -0
- package/dist/db/configured-entities.js +20 -0
- package/dist/db/configured-entities.js.map +1 -0
- package/dist/db/configured-migrations.d.ts +199 -0
- package/dist/db/configured-migrations.d.ts.map +1 -0
- package/dist/db/configured-migrations.js +181 -0
- package/dist/db/configured-migrations.js.map +1 -0
- package/dist/db/index.d.ts +54 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +54 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +21 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +48 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migration-order.d.ts +159 -0
- package/dist/db/migration-order.d.ts.map +1 -0
- package/dist/db/migration-order.js +273 -0
- package/dist/db/migration-order.js.map +1 -0
- package/dist/db/mikro-orm.config.d.ts +51 -0
- package/dist/db/mikro-orm.config.d.ts.map +1 -0
- package/dist/db/mikro-orm.config.js +64 -0
- package/dist/db/mikro-orm.config.js.map +1 -0
- package/dist/db/orm.d.ts +40 -0
- package/dist/db/orm.d.ts.map +1 -0
- package/dist/db/orm.js +25 -0
- package/dist/db/orm.js.map +1 -0
- package/dist/db/platform-schema.d.ts +102 -0
- package/dist/db/platform-schema.d.ts.map +1 -0
- package/dist/db/platform-schema.js +79 -0
- package/dist/db/platform-schema.js.map +1 -0
- package/dist/db/pluralizing-naming-strategy.d.ts +16 -0
- package/dist/db/pluralizing-naming-strategy.d.ts.map +1 -0
- package/dist/db/pluralizing-naming-strategy.js +66 -0
- package/dist/db/pluralizing-naming-strategy.js.map +1 -0
- package/dist/demo/guard.d.ts +101 -0
- package/dist/demo/guard.d.ts.map +1 -0
- package/dist/demo/guard.js +168 -0
- package/dist/demo/guard.js.map +1 -0
- package/dist/demo/host-command.d.ts +133 -0
- package/dist/demo/host-command.d.ts.map +1 -0
- package/dist/demo/host-command.js +113 -0
- package/dist/demo/host-command.js.map +1 -0
- package/dist/demo/index.d.ts +82 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +82 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/packages.d.ts +67 -0
- package/dist/demo/packages.d.ts.map +1 -0
- package/dist/demo/packages.js +132 -0
- package/dist/demo/packages.js.map +1 -0
- package/dist/demo/plan.d.ts +111 -0
- package/dist/demo/plan.d.ts.map +1 -0
- package/dist/demo/plan.js +74 -0
- package/dist/demo/plan.js.map +1 -0
- package/dist/demo/report.d.ts +17 -0
- package/dist/demo/report.d.ts.map +1 -0
- package/dist/demo/report.js +85 -0
- package/dist/demo/report.js.map +1 -0
- package/dist/demo/runner.d.ts +207 -0
- package/dist/demo/runner.d.ts.map +1 -0
- package/dist/demo/runner.js +169 -0
- package/dist/demo/runner.js.map +1 -0
- package/dist/demo/scope.d.ts +44 -0
- package/dist/demo/scope.d.ts.map +1 -0
- package/dist/demo/scope.js +44 -0
- package/dist/demo/scope.js.map +1 -0
- package/dist/env/index.d.ts +68 -0
- package/dist/env/index.d.ts.map +1 -0
- package/dist/env/index.js +427 -0
- package/dist/env/index.js.map +1 -0
- package/dist/events/bus.d.ts +29 -0
- package/dist/events/bus.d.ts.map +1 -0
- package/dist/events/bus.js +67 -0
- package/dist/events/bus.js.map +1 -0
- package/dist/events/index.d.ts +19 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +19 -0
- package/dist/events/index.js.map +1 -0
- package/dist/http/cursor.d.ts +10 -0
- package/dist/http/cursor.d.ts.map +1 -0
- package/dist/http/cursor.js +20 -0
- package/dist/http/cursor.js.map +1 -0
- package/dist/http/error-envelope.d.ts +127 -0
- package/dist/http/error-envelope.d.ts.map +1 -0
- package/dist/http/error-envelope.js +402 -0
- package/dist/http/error-envelope.js.map +1 -0
- package/dist/http/health.d.ts +88 -0
- package/dist/http/health.d.ts.map +1 -0
- package/dist/http/health.js +77 -0
- package/dist/http/health.js.map +1 -0
- package/dist/http/index.d.ts +50 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +50 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/interceptors/dispatch.d.ts +14 -0
- package/dist/http/interceptors/dispatch.d.ts.map +1 -0
- package/dist/http/interceptors/dispatch.js +113 -0
- package/dist/http/interceptors/dispatch.js.map +1 -0
- package/dist/http/interceptors/index.d.ts +6 -0
- package/dist/http/interceptors/index.d.ts.map +1 -0
- package/dist/http/interceptors/index.js +5 -0
- package/dist/http/interceptors/index.js.map +1 -0
- package/dist/http/interceptors/registry.d.ts +44 -0
- package/dist/http/interceptors/registry.d.ts.map +1 -0
- package/dist/http/interceptors/registry.js +123 -0
- package/dist/http/interceptors/registry.js.map +1 -0
- package/dist/http/interceptors/route-table.d.ts +33 -0
- package/dist/http/interceptors/route-table.d.ts.map +1 -0
- package/dist/http/interceptors/route-table.js +39 -0
- package/dist/http/interceptors/route-table.js.map +1 -0
- package/dist/http/interceptors/types.d.ts +101 -0
- package/dist/http/interceptors/types.d.ts.map +1 -0
- package/dist/http/interceptors/types.js +2 -0
- package/dist/http/interceptors/types.js.map +1 -0
- package/dist/http/interceptors/validation.d.ts +22 -0
- package/dist/http/interceptors/validation.d.ts.map +1 -0
- package/dist/http/interceptors/validation.js +39 -0
- package/dist/http/interceptors/validation.js.map +1 -0
- package/dist/http/logger.d.ts +9 -0
- package/dist/http/logger.d.ts.map +1 -0
- package/dist/http/logger.js +25 -0
- package/dist/http/logger.js.map +1 -0
- package/dist/http/openapi.d.ts +21 -0
- package/dist/http/openapi.d.ts.map +1 -0
- package/dist/http/openapi.js +114 -0
- package/dist/http/openapi.js.map +1 -0
- package/dist/http/product-audience.d.ts +78 -0
- package/dist/http/product-audience.d.ts.map +1 -0
- package/dist/http/product-audience.js +92 -0
- package/dist/http/product-audience.js.map +1 -0
- package/dist/http/request-actor.d.ts +82 -0
- package/dist/http/request-actor.d.ts.map +1 -0
- package/dist/http/request-actor.js +2 -0
- package/dist/http/request-actor.js.map +1 -0
- package/dist/http/server.d.ts +60 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +117 -0
- package/dist/http/server.js.map +1 -0
- package/dist/http/storefront-revalidator.d.ts +29 -0
- package/dist/http/storefront-revalidator.d.ts.map +1 -0
- package/dist/http/storefront-revalidator.js +34 -0
- package/dist/http/storefront-revalidator.js.map +1 -0
- package/dist/http/test-actor-carrier.d.ts +28 -0
- package/dist/http/test-actor-carrier.d.ts.map +1 -0
- package/dist/http/test-actor-carrier.js +10 -0
- package/dist/http/test-actor-carrier.js.map +1 -0
- package/dist/http/trusted-proxy.d.ts +48 -0
- package/dist/http/trusted-proxy.d.ts.map +1 -0
- package/dist/http/trusted-proxy.js +136 -0
- package/dist/http/trusted-proxy.js.map +1 -0
- package/dist/kernel/audit/audit-log-entry.entity.d.ts +33 -0
- package/dist/kernel/audit/audit-log-entry.entity.d.ts.map +1 -0
- package/dist/kernel/audit/audit-log-entry.entity.js +102 -0
- package/dist/kernel/audit/audit-log-entry.entity.js.map +1 -0
- package/dist/kernel/audit/audit-log-service.d.ts +63 -0
- package/dist/kernel/audit/audit-log-service.d.ts.map +1 -0
- package/dist/kernel/audit/audit-log-service.js +107 -0
- package/dist/kernel/audit/audit-log-service.js.map +1 -0
- package/dist/kernel/cache/in-process-cache-registry.d.ts +93 -0
- package/dist/kernel/cache/in-process-cache-registry.d.ts.map +1 -0
- package/dist/kernel/cache/in-process-cache-registry.js +78 -0
- package/dist/kernel/cache/in-process-cache-registry.js.map +1 -0
- package/dist/kernel/cache/shared-drop-marks.d.ts +39 -0
- package/dist/kernel/cache/shared-drop-marks.d.ts.map +1 -0
- package/dist/kernel/cache/shared-drop-marks.js +68 -0
- package/dist/kernel/cache/shared-drop-marks.js.map +1 -0
- package/dist/kernel/compose.d.ts +234 -0
- package/dist/kernel/compose.d.ts.map +1 -0
- package/dist/kernel/compose.js +279 -0
- package/dist/kernel/compose.js.map +1 -0
- package/dist/kernel/container.d.ts +95 -0
- package/dist/kernel/container.d.ts.map +1 -0
- package/dist/kernel/container.js +90 -0
- package/dist/kernel/container.js.map +1 -0
- package/dist/kernel/contribution-sinks.d.ts +106 -0
- package/dist/kernel/contribution-sinks.d.ts.map +1 -0
- package/dist/kernel/contribution-sinks.js +153 -0
- package/dist/kernel/contribution-sinks.js.map +1 -0
- package/dist/kernel/crypto/password-hasher.d.ts +3 -0
- package/dist/kernel/crypto/password-hasher.d.ts.map +1 -0
- package/dist/kernel/crypto/password-hasher.js +44 -0
- package/dist/kernel/crypto/password-hasher.js.map +1 -0
- package/dist/kernel/i18n/error-envelope-options.d.ts +56 -0
- package/dist/kernel/i18n/error-envelope-options.d.ts.map +1 -0
- package/dist/kernel/i18n/error-envelope-options.js +46 -0
- package/dist/kernel/i18n/error-envelope-options.js.map +1 -0
- package/dist/kernel/i18n/error-translation.d.ts +144 -0
- package/dist/kernel/i18n/error-translation.d.ts.map +1 -0
- package/dist/kernel/i18n/error-translation.js +84 -0
- package/dist/kernel/i18n/error-translation.js.map +1 -0
- package/dist/kernel/i18n/request-language.d.ts +80 -0
- package/dist/kernel/i18n/request-language.d.ts.map +1 -0
- package/dist/kernel/i18n/request-language.js +168 -0
- package/dist/kernel/i18n/request-language.js.map +1 -0
- package/dist/kernel/index.d.ts +142 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +160 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/lazy-port.d.ts +59 -0
- package/dist/kernel/lazy-port.d.ts.map +1 -0
- package/dist/kernel/lazy-port.js +78 -0
- package/dist/kernel/lazy-port.js.map +1 -0
- package/dist/kernel/lifecycle/activation-resolver.d.ts +63 -0
- package/dist/kernel/lifecycle/activation-resolver.d.ts.map +1 -0
- package/dist/kernel/lifecycle/activation-resolver.js +70 -0
- package/dist/kernel/lifecycle/activation-resolver.js.map +1 -0
- package/dist/kernel/lifecycle/capability-registry.d.ts +145 -0
- package/dist/kernel/lifecycle/capability-registry.d.ts.map +1 -0
- package/dist/kernel/lifecycle/capability-registry.js +170 -0
- package/dist/kernel/lifecycle/capability-registry.js.map +1 -0
- package/dist/kernel/lifecycle/effective-state.d.ts +126 -0
- package/dist/kernel/lifecycle/effective-state.d.ts.map +1 -0
- package/dist/kernel/lifecycle/effective-state.js +111 -0
- package/dist/kernel/lifecycle/effective-state.js.map +1 -0
- package/dist/kernel/lifecycle/module-registration.entity.d.ts +57 -0
- package/dist/kernel/lifecycle/module-registration.entity.d.ts.map +1 -0
- package/dist/kernel/lifecycle/module-registration.entity.js +111 -0
- package/dist/kernel/lifecycle/module-registration.entity.js.map +1 -0
- package/dist/kernel/lifecycle/plugin-helpers.d.ts +165 -0
- package/dist/kernel/lifecycle/plugin-helpers.d.ts.map +1 -0
- package/dist/kernel/lifecycle/plugin-helpers.js +395 -0
- package/dist/kernel/lifecycle/plugin-helpers.js.map +1 -0
- package/dist/kernel/lifecycle/registry-cache.d.ts +318 -0
- package/dist/kernel/lifecycle/registry-cache.d.ts.map +1 -0
- package/dist/kernel/lifecycle/registry-cache.js +509 -0
- package/dist/kernel/lifecycle/registry-cache.js.map +1 -0
- package/dist/kernel/lifecycle/required-modules.d.ts +137 -0
- package/dist/kernel/lifecycle/required-modules.d.ts.map +1 -0
- package/dist/kernel/lifecycle/required-modules.js +80 -0
- package/dist/kernel/lifecycle/required-modules.js.map +1 -0
- package/dist/kernel/lifecycle/unique-module-ids.d.ts +58 -0
- package/dist/kernel/lifecycle/unique-module-ids.d.ts.map +1 -0
- package/dist/kernel/lifecycle/unique-module-ids.js +82 -0
- package/dist/kernel/lifecycle/unique-module-ids.js.map +1 -0
- package/dist/kernel/logging.d.ts +116 -0
- package/dist/kernel/logging.d.ts.map +1 -0
- package/dist/kernel/logging.js +71 -0
- package/dist/kernel/logging.js.map +1 -0
- package/dist/kernel/module-context.d.ts +563 -0
- package/dist/kernel/module-context.d.ts.map +1 -0
- package/dist/kernel/module-context.js +670 -0
- package/dist/kernel/module-context.js.map +1 -0
- package/dist/kernel/ports/audit.d.ts +115 -0
- package/dist/kernel/ports/audit.d.ts.map +1 -0
- package/dist/kernel/ports/audit.js +2 -0
- package/dist/kernel/ports/audit.js.map +1 -0
- package/dist/kernel/ports/organizations.d.ts +56 -0
- package/dist/kernel/ports/organizations.d.ts.map +1 -0
- package/dist/kernel/ports/organizations.js +2 -0
- package/dist/kernel/ports/organizations.js.map +1 -0
- package/dist/kernel/ports/provide.d.ts +14 -0
- package/dist/kernel/ports/provide.d.ts.map +1 -0
- package/dist/kernel/ports/provide.js +50 -0
- package/dist/kernel/ports/provide.js.map +1 -0
- package/dist/kernel/ports/require-admin.d.ts +61 -0
- package/dist/kernel/ports/require-admin.d.ts.map +1 -0
- package/dist/kernel/ports/require-admin.js +2 -0
- package/dist/kernel/ports/require-admin.js.map +1 -0
- package/dist/kernel/ports/require-customer.d.ts +17 -0
- package/dist/kernel/ports/require-customer.d.ts.map +1 -0
- package/dist/kernel/ports/require-customer.js +2 -0
- package/dist/kernel/ports/require-customer.js.map +1 -0
- package/dist/kernel/ports/sales-channel.d.ts +84 -0
- package/dist/kernel/ports/sales-channel.d.ts.map +1 -0
- package/dist/kernel/ports/sales-channel.js +2 -0
- package/dist/kernel/ports/sales-channel.js.map +1 -0
- package/dist/kernel/ports/settings.d.ts +59 -0
- package/dist/kernel/ports/settings.d.ts.map +1 -0
- package/dist/kernel/ports/settings.js +2 -0
- package/dist/kernel/ports/settings.js.map +1 -0
- package/dist/kernel/public-api-base-url.d.ts +98 -0
- package/dist/kernel/public-api-base-url.d.ts.map +1 -0
- package/dist/kernel/public-api-base-url.js +144 -0
- package/dist/kernel/public-api-base-url.js.map +1 -0
- package/dist/kernel/request-scope-hook.d.ts +63 -0
- package/dist/kernel/request-scope-hook.d.ts.map +1 -0
- package/dist/kernel/request-scope-hook.js +67 -0
- package/dist/kernel/request-scope-hook.js.map +1 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.d.ts +109 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.d.ts.map +1 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.js +75 -0
- package/dist/kernel/sales-channels/channel-bridge-registry.js.map +1 -0
- package/dist/kernel/sales-channels/compose.d.ts +69 -0
- package/dist/kernel/sales-channels/compose.d.ts.map +1 -0
- package/dist/kernel/sales-channels/compose.js +43 -0
- package/dist/kernel/sales-channels/compose.js.map +1 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.d.ts +66 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.d.ts.map +1 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.js +91 -0
- package/dist/kernel/sales-channels/default-channel-reconciler.js.map +1 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts +28 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.d.ts.map +1 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.js +33 -0
- package/dist/kernel/sales-channels/no-system-default-channel.error.js.map +1 -0
- package/dist/kernel/sales-channels/request-channel-assortment.d.ts +72 -0
- package/dist/kernel/sales-channels/request-channel-assortment.d.ts.map +1 -0
- package/dist/kernel/sales-channels/request-channel-assortment.js +83 -0
- package/dist/kernel/sales-channels/request-channel-assortment.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts +157 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.js +302 -0
- package/dist/kernel/sales-channels/sales-channel-membership.service.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts +76 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js +184 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.middleware.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts +82 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.js +126 -0
- package/dist/kernel/sales-channels/sales-channel-resolver.service.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channel.entity.d.ts +50 -0
- package/dist/kernel/sales-channels/sales-channel.entity.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channel.entity.js +132 -0
- package/dist/kernel/sales-channels/sales-channel.entity.js.map +1 -0
- package/dist/kernel/sales-channels/sales-channels-cache.d.ts +170 -0
- package/dist/kernel/sales-channels/sales-channels-cache.d.ts.map +1 -0
- package/dist/kernel/sales-channels/sales-channels-cache.js +243 -0
- package/dist/kernel/sales-channels/sales-channels-cache.js.map +1 -0
- package/dist/kernel/scope.d.ts +153 -0
- package/dist/kernel/scope.d.ts.map +1 -0
- package/dist/kernel/scope.js +172 -0
- package/dist/kernel/scope.js.map +1 -0
- package/dist/kernel/settings/compose.d.ts +49 -0
- package/dist/kernel/settings/compose.d.ts.map +1 -0
- package/dist/kernel/settings/compose.js +21 -0
- package/dist/kernel/settings/compose.js.map +1 -0
- package/dist/kernel/settings/manifest-reconciler.d.ts +78 -0
- package/dist/kernel/settings/manifest-reconciler.d.ts.map +1 -0
- package/dist/kernel/settings/manifest-reconciler.js +343 -0
- package/dist/kernel/settings/manifest-reconciler.js.map +1 -0
- package/dist/kernel/settings/secret-value-codec.d.ts +52 -0
- package/dist/kernel/settings/secret-value-codec.d.ts.map +1 -0
- package/dist/kernel/settings/secret-value-codec.js +102 -0
- package/dist/kernel/settings/secret-value-codec.js.map +1 -0
- package/dist/kernel/settings/setting-group.entity.d.ts +25 -0
- package/dist/kernel/settings/setting-group.entity.d.ts.map +1 -0
- package/dist/kernel/settings/setting-group.entity.js +79 -0
- package/dist/kernel/settings/setting-group.entity.js.map +1 -0
- package/dist/kernel/settings/setting-value.entity.d.ts +23 -0
- package/dist/kernel/settings/setting-value.entity.d.ts.map +1 -0
- package/dist/kernel/settings/setting-value.entity.js +66 -0
- package/dist/kernel/settings/setting-value.entity.js.map +1 -0
- package/dist/kernel/settings/setting.entity.d.ts +56 -0
- package/dist/kernel/settings/setting.entity.d.ts.map +1 -0
- package/dist/kernel/settings/setting.entity.js +147 -0
- package/dist/kernel/settings/setting.entity.js.map +1 -0
- package/dist/kernel/settings/settings-cache.d.ts +158 -0
- package/dist/kernel/settings/settings-cache.d.ts.map +1 -0
- package/dist/kernel/settings/settings-cache.js +253 -0
- package/dist/kernel/settings/settings-cache.js.map +1 -0
- package/dist/kernel/settings/settings.service.d.ts +142 -0
- package/dist/kernel/settings/settings.service.d.ts.map +1 -0
- package/dist/kernel/settings/settings.service.js +294 -0
- package/dist/kernel/settings/settings.service.js.map +1 -0
- package/dist/lifecycle/backend.d.ts +51 -0
- package/dist/lifecycle/backend.d.ts.map +1 -0
- package/dist/lifecycle/backend.js +40 -0
- package/dist/lifecycle/backend.js.map +1 -0
- package/dist/lifecycle/commands/activation.commands.d.ts +97 -0
- package/dist/lifecycle/commands/activation.commands.d.ts.map +1 -0
- package/dist/lifecycle/commands/activation.commands.js +142 -0
- package/dist/lifecycle/commands/activation.commands.js.map +1 -0
- package/dist/lifecycle/commands/disable.d.ts +3 -0
- package/dist/lifecycle/commands/disable.d.ts.map +1 -0
- package/dist/lifecycle/commands/disable.js +126 -0
- package/dist/lifecycle/commands/disable.js.map +1 -0
- package/dist/lifecycle/commands/enable.d.ts +3 -0
- package/dist/lifecycle/commands/enable.d.ts.map +1 -0
- package/dist/lifecycle/commands/enable.js +102 -0
- package/dist/lifecycle/commands/enable.js.map +1 -0
- package/dist/lifecycle/commands/install.d.ts +3 -0
- package/dist/lifecycle/commands/install.d.ts.map +1 -0
- package/dist/lifecycle/commands/install.js +263 -0
- package/dist/lifecycle/commands/install.js.map +1 -0
- package/dist/lifecycle/commands/operator-entry.d.ts +104 -0
- package/dist/lifecycle/commands/operator-entry.d.ts.map +1 -0
- package/dist/lifecycle/commands/operator-entry.js +127 -0
- package/dist/lifecycle/commands/operator-entry.js.map +1 -0
- package/dist/lifecycle/commands/operator-runtime.d.ts +147 -0
- package/dist/lifecycle/commands/operator-runtime.d.ts.map +1 -0
- package/dist/lifecycle/commands/operator-runtime.js +40 -0
- package/dist/lifecycle/commands/operator-runtime.js.map +1 -0
- package/dist/lifecycle/commands/status.d.ts +3 -0
- package/dist/lifecycle/commands/status.d.ts.map +1 -0
- package/dist/lifecycle/commands/status.js +108 -0
- package/dist/lifecycle/commands/status.js.map +1 -0
- package/dist/lifecycle/commands/uninstall.d.ts +3 -0
- package/dist/lifecycle/commands/uninstall.d.ts.map +1 -0
- package/dist/lifecycle/commands/uninstall.js +223 -0
- package/dist/lifecycle/commands/uninstall.js.map +1 -0
- package/dist/lifecycle/divergence-declaration.d.ts +74 -0
- package/dist/lifecycle/divergence-declaration.d.ts.map +1 -0
- package/dist/lifecycle/divergence-declaration.js +92 -0
- package/dist/lifecycle/divergence-declaration.js.map +1 -0
- package/dist/lifecycle/i18n/en.json +4 -0
- package/dist/lifecycle/i18n/pl.json +4 -0
- package/dist/lifecycle/index.d.ts +110 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +189 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/lifecycle/manifest-registry.d.ts +244 -0
- package/dist/lifecycle/manifest-registry.d.ts.map +1 -0
- package/dist/lifecycle/manifest-registry.js +223 -0
- package/dist/lifecycle/manifest-registry.js.map +1 -0
- package/dist/lifecycle/manifest.d.ts +166 -0
- package/dist/lifecycle/manifest.d.ts.map +1 -0
- package/dist/lifecycle/manifest.js +121 -0
- package/dist/lifecycle/manifest.js.map +1 -0
- package/dist/lifecycle/plugin.d.ts +56 -0
- package/dist/lifecycle/plugin.d.ts.map +1 -0
- package/dist/lifecycle/plugin.js +59 -0
- package/dist/lifecycle/plugin.js.map +1 -0
- package/dist/lifecycle/resident.d.ts +16 -0
- package/dist/lifecycle/resident.d.ts.map +1 -0
- package/dist/lifecycle/resident.js +59 -0
- package/dist/lifecycle/resident.js.map +1 -0
- package/dist/lifecycle/routes.admin.d.ts +57 -0
- package/dist/lifecycle/routes.admin.d.ts.map +1 -0
- package/dist/lifecycle/routes.admin.js +162 -0
- package/dist/lifecycle/routes.admin.js.map +1 -0
- package/dist/lifecycle/routes.storefront.d.ts +26 -0
- package/dist/lifecycle/routes.storefront.d.ts.map +1 -0
- package/dist/lifecycle/routes.storefront.js +36 -0
- package/dist/lifecycle/routes.storefront.js.map +1 -0
- package/dist/lifecycle/services/deactivation-ledger.d.ts +216 -0
- package/dist/lifecycle/services/deactivation-ledger.d.ts.map +1 -0
- package/dist/lifecycle/services/deactivation-ledger.js +171 -0
- package/dist/lifecycle/services/deactivation-ledger.js.map +1 -0
- package/dist/lifecycle/services/dep-graph.d.ts +119 -0
- package/dist/lifecycle/services/dep-graph.d.ts.map +1 -0
- package/dist/lifecycle/services/dep-graph.js +334 -0
- package/dist/lifecycle/services/dep-graph.js.map +1 -0
- package/dist/lifecycle/services/gating-graph.d.ts +164 -0
- package/dist/lifecycle/services/gating-graph.d.ts.map +1 -0
- package/dist/lifecycle/services/gating-graph.js +203 -0
- package/dist/lifecycle/services/gating-graph.js.map +1 -0
- package/dist/lifecycle/services/lock.d.ts +27 -0
- package/dist/lifecycle/services/lock.d.ts.map +1 -0
- package/dist/lifecycle/services/lock.js +82 -0
- package/dist/lifecycle/services/lock.js.map +1 -0
- package/dist/lifecycle/services/manifest-loader.d.ts +125 -0
- package/dist/lifecycle/services/manifest-loader.d.ts.map +1 -0
- package/dist/lifecycle/services/manifest-loader.js +210 -0
- package/dist/lifecycle/services/manifest-loader.js.map +1 -0
- package/dist/lifecycle/services/migration-ownership.d.ts +36 -0
- package/dist/lifecycle/services/migration-ownership.d.ts.map +1 -0
- package/dist/lifecycle/services/migration-ownership.js +15 -0
- package/dist/lifecycle/services/migration-ownership.js.map +1 -0
- package/dist/lifecycle/services/module-id-claims.d.ts +38 -0
- package/dist/lifecycle/services/module-id-claims.d.ts.map +1 -0
- package/dist/lifecycle/services/module-id-claims.js +123 -0
- package/dist/lifecycle/services/module-id-claims.js.map +1 -0
- package/dist/lifecycle/services/module-origin.d.ts +55 -0
- package/dist/lifecycle/services/module-origin.d.ts.map +1 -0
- package/dist/lifecycle/services/module-origin.js +47 -0
- package/dist/lifecycle/services/module-origin.js.map +1 -0
- package/dist/lifecycle/services/orchestrator.d.ts +235 -0
- package/dist/lifecycle/services/orchestrator.d.ts.map +1 -0
- package/dist/lifecycle/services/orchestrator.js +954 -0
- package/dist/lifecycle/services/orchestrator.js.map +1 -0
- package/dist/lifecycle/services/presence-load.d.ts +281 -0
- package/dist/lifecycle/services/presence-load.d.ts.map +1 -0
- package/dist/lifecycle/services/presence-load.js +437 -0
- package/dist/lifecycle/services/presence-load.js.map +1 -0
- package/dist/lifecycle/services/static-registry.d.ts +47 -0
- package/dist/lifecycle/services/static-registry.d.ts.map +1 -0
- package/dist/lifecycle/services/static-registry.js +41 -0
- package/dist/lifecycle/services/static-registry.js.map +1 -0
- package/dist/migrations/20260424T165847_core_foundation_init.d.ts +25 -0
- package/dist/migrations/20260424T165847_core_foundation_init.d.ts.map +1 -0
- package/dist/migrations/20260424T165847_core_foundation_init.js +238 -0
- package/dist/migrations/20260424T165847_core_foundation_init.js.map +1 -0
- package/dist/migrations/20260425T050720_core_commerce_init.d.ts +19 -0
- package/dist/migrations/20260425T050720_core_commerce_init.d.ts.map +1 -0
- package/dist/migrations/20260425T050720_core_commerce_init.js +200 -0
- package/dist/migrations/20260425T050720_core_commerce_init.js.map +1 -0
- package/dist/migrations/20260430T101450_core_settings_init.d.ts +25 -0
- package/dist/migrations/20260430T101450_core_settings_init.d.ts.map +1 -0
- package/dist/migrations/20260430T101450_core_settings_init.js +113 -0
- package/dist/migrations/20260430T101450_core_settings_init.js.map +1 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts +67 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.d.ts.map +1 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.js +101 -0
- package/dist/migrations/20260430T170044_core_sales_channels_promote.js.map +1 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts +21 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.d.ts.map +1 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.js +41 -0
- package/dist/migrations/20260506T200657_core_module_lifecycle_init.js.map +1 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.d.ts +30 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.d.ts.map +1 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.js +34 -0
- package/dist/migrations/20260514T111329_core_settings_global_value.js.map +1 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts +26 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.d.ts.map +1 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.js +63 -0
- package/dist/migrations/20260611T140411_core_settings_secret_value_type.js.map +1 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts +19 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.d.ts.map +1 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.js +23 -0
- package/dist/migrations/20260611T140419_core_settings_enum_options.js.map +1 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts +20 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.d.ts.map +1 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.js +24 -0
- package/dist/migrations/20260629T090100_core_settings_hidden_flag.js.map +1 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts +27 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.d.ts.map +1 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js +32 -0
- package/dist/migrations/20260717T134752_core_tenant_scope_indexes.js.map +1 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts +24 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.d.ts.map +1 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js +57 -0
- package/dist/migrations/20260721T011510_core_settings_credential_ref_value_type.js.map +1 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts +39 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.d.ts.map +1 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js +59 -0
- package/dist/migrations/20260816T203339_core_retire_core_activation_settings.js.map +1 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts +34 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.d.ts.map +1 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js +38 -0
- package/dist/migrations/20260919T101500_core_module_registrations_boot_converged.js.map +1 -0
- package/dist/migrations/baseline-migrations.generated.d.ts +2 -0
- package/dist/migrations/baseline-migrations.generated.d.ts.map +1 -0
- package/dist/migrations/baseline-migrations.generated.js +136 -0
- package/dist/migrations/baseline-migrations.generated.js.map +1 -0
- package/dist/migrations/index.d.ts +62 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +75 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/overlay/deployment-roots.d.ts +37 -0
- package/dist/overlay/deployment-roots.d.ts.map +1 -0
- package/dist/overlay/deployment-roots.js +90 -0
- package/dist/overlay/deployment-roots.js.map +1 -0
- package/dist/overlay/index.d.ts +62 -0
- package/dist/overlay/index.d.ts.map +1 -0
- package/dist/overlay/index.js +62 -0
- package/dist/overlay/index.js.map +1 -0
- package/dist/overlay/overlay-runtime.d.ts +173 -0
- package/dist/overlay/overlay-runtime.d.ts.map +1 -0
- package/dist/overlay/overlay-runtime.js +281 -0
- package/dist/overlay/overlay-runtime.js.map +1 -0
- package/dist/overlay/resolve-overlay.d.ts +41 -0
- package/dist/overlay/resolve-overlay.d.ts.map +1 -0
- package/dist/overlay/resolve-overlay.js +72 -0
- package/dist/overlay/resolve-overlay.js.map +1 -0
- package/dist/packages/index.d.ts +57 -0
- package/dist/packages/index.d.ts.map +1 -0
- package/dist/packages/index.js +57 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/installed-packages.d.ts +79 -0
- package/dist/packages/installed-packages.d.ts.map +1 -0
- package/dist/packages/installed-packages.js +312 -0
- package/dist/packages/installed-packages.js.map +1 -0
- package/dist/packages/package-entity-lookup.d.ts +120 -0
- package/dist/packages/package-entity-lookup.d.ts.map +1 -0
- package/dist/packages/package-entity-lookup.js +17 -0
- package/dist/packages/package-entity-lookup.js.map +1 -0
- package/dist/packages/package-runtime.d.ts +177 -0
- package/dist/packages/package-runtime.d.ts.map +1 -0
- package/dist/packages/package-runtime.js +386 -0
- package/dist/packages/package-runtime.js.map +1 -0
- package/dist/tenancy/derived-scope.d.ts +43 -0
- package/dist/tenancy/derived-scope.d.ts.map +1 -0
- package/dist/tenancy/derived-scope.js +76 -0
- package/dist/tenancy/derived-scope.js.map +1 -0
- package/dist/tenancy/escape-hatch.d.ts +30 -0
- package/dist/tenancy/escape-hatch.d.ts.map +1 -0
- package/dist/tenancy/escape-hatch.js +50 -0
- package/dist/tenancy/escape-hatch.js.map +1 -0
- package/dist/tenancy/filters.d.ts +87 -0
- package/dist/tenancy/filters.d.ts.map +1 -0
- package/dist/tenancy/filters.js +126 -0
- package/dist/tenancy/filters.js.map +1 -0
- package/dist/tenancy/index.d.ts +63 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +61 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/org-scoped.decorator.d.ts +150 -0
- package/dist/tenancy/org-scoped.decorator.d.ts.map +1 -0
- package/dist/tenancy/org-scoped.decorator.js +339 -0
- package/dist/tenancy/org-scoped.decorator.js.map +1 -0
- package/dist/tenancy/org-write-guard.d.ts +106 -0
- package/dist/tenancy/org-write-guard.d.ts.map +1 -0
- package/dist/tenancy/org-write-guard.js +141 -0
- package/dist/tenancy/org-write-guard.js.map +1 -0
- package/dist/tenancy/resolve-tenant-context.d.ts +91 -0
- package/dist/tenancy/resolve-tenant-context.d.ts.map +1 -0
- package/dist/tenancy/resolve-tenant-context.js +85 -0
- package/dist/tenancy/resolve-tenant-context.js.map +1 -0
- package/dist/tenancy/scoped-em.d.ts +10 -0
- package/dist/tenancy/scoped-em.d.ts.map +1 -0
- package/dist/tenancy/scoped-em.js +11 -0
- package/dist/tenancy/scoped-em.js.map +1 -0
- package/dist/tenancy/tenant-context.d.ts +154 -0
- package/dist/tenancy/tenant-context.d.ts.map +1 -0
- package/dist/tenancy/tenant-context.js +109 -0
- package/dist/tenancy/tenant-context.js.map +1 -0
- package/package.json +123 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { ModuleManifest } from '@endora-commerce/contracts';
|
|
2
|
+
import { type DeclaredContribution } from '../../kernel/contribution-sinks.js';
|
|
3
|
+
/**
|
|
4
|
+
* The graph the **presence refusals** read — feature 073, FR-008, Amendment A1.
|
|
5
|
+
*
|
|
6
|
+
* It is deliberately not the graph the installer reads. `ModuleDepGraph`
|
|
7
|
+
* (`dep-graph.ts`) is built from `manifest.dependencies` alone because it has
|
|
8
|
+
* to be a DAG: it computes the topological install order and the reverse
|
|
9
|
+
* cascade order, and a cycle there fails the build. That constraint is what
|
|
10
|
+
* makes a handful of *real* runtime edges undeclarable — `addresses` must
|
|
11
|
+
* install after `organizations`, so `organizations` cannot declare `addresses`
|
|
12
|
+
* back, however certainly its customer routes call `addressService`.
|
|
13
|
+
*
|
|
14
|
+
* Withholding the declaration used to hide the edge from everything, including
|
|
15
|
+
* the flip-time refusals, which is how `catalog` came to resolve
|
|
16
|
+
* `pricingService` from a module an operator can switch off with nothing
|
|
17
|
+
* refusing the flip. The edges are now declared as
|
|
18
|
+
* `manifest.acknowledgedDependencies` and this graph is their reader:
|
|
19
|
+
*
|
|
20
|
+
* | Direction | Edges used | Why |
|
|
21
|
+
* | --- | --- | --- |
|
|
22
|
+
* | deactivating X — who still needs X? | `dependencies` ∪ `acknowledgedDependencies` | an acknowledged edge is a live resolution; the owner disappearing under it is exactly the failure this refuses |
|
|
23
|
+
* | activating X — what does X need? | `dependencies` only | the acknowledged edges are mutual **by construction**; requiring both ends present before either may be switched on is a deadlock, not a safeguard |
|
|
24
|
+
*
|
|
25
|
+
* That asymmetry is the same trade the install order makes, applied to the
|
|
26
|
+
* other axis, and it is why one union graph with two accessors beats two
|
|
27
|
+
* graphs.
|
|
28
|
+
*
|
|
29
|
+
* **`manifest.nonBindingDependencies` is the third array and this class reads
|
|
30
|
+
* none of it** (D-44). Those edges are real container resolutions whose
|
|
31
|
+
* declaring module has a defined behaviour when the owner is absent — a boot
|
|
32
|
+
* push into an ungated registry, or a read guarded by an
|
|
33
|
+
* `effectiveState.isPresent` probe — so there is nothing for a refusal to
|
|
34
|
+
* protect and refusing anyway would kill the owner's activation control for no
|
|
35
|
+
* gain. {@link nonBindingPortEdgesFrom} flattens them for
|
|
36
|
+
* `check-port-dependencies.ts`, which wants the ownership claim and not the
|
|
37
|
+
* lifecycle one; the omission from the constructor below is the decision, not
|
|
38
|
+
* an oversight, and `test/unit/_lifecycle/gating-graph.test.ts` pins it in both
|
|
39
|
+
* directions.
|
|
40
|
+
*/
|
|
41
|
+
/** One withheld edge, flattened from the declaring manifest. */
|
|
42
|
+
export interface AcknowledgedPortEdge {
|
|
43
|
+
/** The module that resolves the port. */
|
|
44
|
+
readonly moduleId: string;
|
|
45
|
+
/** The module that owns it. */
|
|
46
|
+
readonly dependsOn: string;
|
|
47
|
+
/** The container registration name, e.g. `addressService`. */
|
|
48
|
+
readonly port: string;
|
|
49
|
+
readonly reason: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Every acknowledged edge in a manifest set, keyed the way
|
|
53
|
+
* `check-port-dependencies.ts` needs them: `<resolving module>:<port>`.
|
|
54
|
+
*
|
|
55
|
+
* The CI check and the runtime refusal read this one function over the one
|
|
56
|
+
* declaration set, so the two cannot disagree about which edges exist — they
|
|
57
|
+
* did, for as long as the list lived in the script as a constant.
|
|
58
|
+
*/
|
|
59
|
+
export declare function acknowledgedPortEdgesFrom(manifests: readonly ModuleManifest[]): AcknowledgedPortEdge[];
|
|
60
|
+
/** One non-binding edge, flattened from the declaring manifest — D-44. */
|
|
61
|
+
export interface NonBindingPortEdge {
|
|
62
|
+
/** The module that reads the name. */
|
|
63
|
+
readonly moduleId: string;
|
|
64
|
+
/** The module that owns it. */
|
|
65
|
+
readonly dependsOn: string;
|
|
66
|
+
/** The container registration name, e.g. `promptActionToolRegistry`. */
|
|
67
|
+
readonly name: string;
|
|
68
|
+
readonly kind: 'contributes-to' | 'degrades-without' | 'refuses-without';
|
|
69
|
+
/**
|
|
70
|
+
* What stops working — required for `degrades-without` and for
|
|
71
|
+
* `refuses-without`, `null` for a contribution.
|
|
72
|
+
*/
|
|
73
|
+
readonly whenAbsent: string | null;
|
|
74
|
+
readonly reason: string;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Every non-binding edge in a manifest set, keyed the way
|
|
78
|
+
* `check-port-dependencies.ts` needs them: `<resolving module>:<name>`.
|
|
79
|
+
*
|
|
80
|
+
* It sits beside {@link acknowledgedPortEdgesFrom} rather than in the check,
|
|
81
|
+
* for the reason that function exists: one declaration set, read by the check
|
|
82
|
+
* and by the runtime, so the two cannot disagree about which edges exist. What
|
|
83
|
+
* differs is who else reads it — an acknowledged edge reaches the graph below,
|
|
84
|
+
* and a non-binding one reaches the graph not at all.
|
|
85
|
+
*
|
|
86
|
+
* It used to reach **nothing**, which was true of all three kinds until the
|
|
87
|
+
* owner ruling of 2026-09-12. The `contributes-to` subset now reaches the
|
|
88
|
+
* container resolution through {@link declaredContributionsFrom}, so that a
|
|
89
|
+
* push into a registry this composition does not hold is dropped rather than
|
|
90
|
+
* throwing; `degrades-without` and `refuses-without` still reach nothing.
|
|
91
|
+
*/
|
|
92
|
+
export declare function nonBindingPortEdgesFrom(manifests: readonly ModuleManifest[]): NonBindingPortEdge[];
|
|
93
|
+
/** Is this module effectively present? Supplied by the caller so this file stays pure. */
|
|
94
|
+
export type PresencePredicate = (moduleId: string) => boolean;
|
|
95
|
+
export declare class ModuleGatingGraph {
|
|
96
|
+
/** moduleId → the modules it declares in `dependencies`. */
|
|
97
|
+
private readonly declared;
|
|
98
|
+
/** moduleId → the modules it acknowledges without declaring. */
|
|
99
|
+
private readonly acknowledged;
|
|
100
|
+
/** moduleId → everything that depends on it, by either kind of edge. */
|
|
101
|
+
private readonly dependents;
|
|
102
|
+
constructor(manifests?: readonly ModuleManifest[]);
|
|
103
|
+
/** `manifest.dependencies` — the install-ordering edges, and only those. */
|
|
104
|
+
declaredDependenciesOf(moduleId: string): string[];
|
|
105
|
+
/** The withheld edges this module declares as acknowledged. */
|
|
106
|
+
acknowledgedDependenciesOf(moduleId: string): string[];
|
|
107
|
+
/** Direct dependents over **both** kinds of edge — the refusal direction. */
|
|
108
|
+
dependentsOf(moduleId: string): string[];
|
|
109
|
+
/**
|
|
110
|
+
* Who would be left resolving a module that is no longer there.
|
|
111
|
+
*
|
|
112
|
+
* **Direct dependents only, and that is not an approximation.** A transitive
|
|
113
|
+
* dependent can only be reached through an intermediate one; if that
|
|
114
|
+
* intermediate is present it blocks here on its own account, and if it is
|
|
115
|
+
* absent then the transitive dependent is already stranded on the
|
|
116
|
+
* intermediate, which this flip neither causes nor repairs. So the refusal
|
|
117
|
+
* decision is identical either way, and the direct set is the one an operator
|
|
118
|
+
* can act on: these are the modules to switch off first.
|
|
119
|
+
*
|
|
120
|
+
* The same shape the CLI takes on the other axis — `orchestrator.disable`
|
|
121
|
+
* blocks on currently-installed *direct* dependents (`dependents-block`).
|
|
122
|
+
*/
|
|
123
|
+
presentDependentsOf(moduleId: string, isPresent: PresencePredicate): string[];
|
|
124
|
+
/**
|
|
125
|
+
* What this module needs that is not there — `dependencies` only.
|
|
126
|
+
*
|
|
127
|
+
* Acknowledged edges are excluded because they are mutual by construction:
|
|
128
|
+
* `catalog` acknowledges `price_lists` while `price_lists` declares
|
|
129
|
+
* `catalog`, so requiring each to be present before the other may be switched
|
|
130
|
+
* on leaves a pair that can never be switched on again. The install order
|
|
131
|
+
* makes exactly this trade, and for exactly this reason (Amendment A1).
|
|
132
|
+
*/
|
|
133
|
+
absentDependenciesOf(moduleId: string, isPresent: PresencePredicate): string[];
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The fallback manifest set, from whoever owns the registry.
|
|
137
|
+
*
|
|
138
|
+
* Idempotent and last-writer-wins: it is a module-scope installation, not a
|
|
139
|
+
* per-request choice.
|
|
140
|
+
*/
|
|
141
|
+
export declare function provideDefaultGatingManifests(supplier: () => readonly ModuleManifest[]): void;
|
|
142
|
+
export declare function gatingGraph(): ModuleGatingGraph;
|
|
143
|
+
/** Install the deployment's manifest set. Idempotent; called from the presence load. */
|
|
144
|
+
export declare function installGatingGraph(manifests: readonly ModuleManifest[]): void;
|
|
145
|
+
/**
|
|
146
|
+
* The `contributes-to` edges, as the container resolution needs them (owner
|
|
147
|
+
* ruling, 2026-09-12; feature 117, A4).
|
|
148
|
+
*
|
|
149
|
+
* It is installed from **both** places this file establishes a manifest set —
|
|
150
|
+
* here and in {@link provideDefaultGatingManifests} — rather than from the
|
|
151
|
+
* presence load alone, because the question "did this module declare this
|
|
152
|
+
* contribution" has to be answerable in every process that composes modules,
|
|
153
|
+
* and those are the two points at which a process learns which manifests it
|
|
154
|
+
* has. Deriving it here rather than in the kernel is what keeps the kernel from
|
|
155
|
+
* importing a manifest: it receives a flattened pair list and knows nothing
|
|
156
|
+
* about `ModuleManifest`.
|
|
157
|
+
*
|
|
158
|
+
* The comment on {@link nonBindingPortEdgesFrom} above says a non-binding edge
|
|
159
|
+
* "reaches nothing". That was true of all three kinds until this ruling; the
|
|
160
|
+
* `contributes-to` subset now reaches the container resolution, and nothing
|
|
161
|
+
* else does.
|
|
162
|
+
*/
|
|
163
|
+
export declare function declaredContributionsFrom(manifests: readonly ModuleManifest[]): DeclaredContribution[];
|
|
164
|
+
//# sourceMappingURL=gating-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gating-graph.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/services/gating-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,oCAAoC,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,gEAAgE;AAChE,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,oBAAoB,EAAE,CAaxB;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;IACzE;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,kBAAkB,EAAE,CAetB;AAED,0FAA0F;AAC1F,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;AAE9D,qBAAa,iBAAiB;IAC5B,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IACnE,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;IACvE,wEAAwE;IACxE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;gBAEjD,SAAS,GAAE,SAAS,cAAc,EAAO;IAoBrD,4EAA4E;IAC5E,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAIlD,+DAA+D;IAC/D,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAItD,6EAA6E;IAC7E,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM,EAAE;IAI7E;;;;;;;;OAQG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM,EAAE;CAK/E;AAyBD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,SAAS,cAAc,EAAE,GAAG,IAAI,CAQ7F;AAED,wBAAgB,WAAW,IAAI,iBAAiB,CAc/C;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI,CAG7E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC,oBAAoB,EAAE,CAIxB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { provideDeclaredContributions, } from '../../kernel/contribution-sinks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Every acknowledged edge in a manifest set, keyed the way
|
|
4
|
+
* `check-port-dependencies.ts` needs them: `<resolving module>:<port>`.
|
|
5
|
+
*
|
|
6
|
+
* The CI check and the runtime refusal read this one function over the one
|
|
7
|
+
* declaration set, so the two cannot disagree about which edges exist — they
|
|
8
|
+
* did, for as long as the list lived in the script as a constant.
|
|
9
|
+
*/
|
|
10
|
+
export function acknowledgedPortEdgesFrom(manifests) {
|
|
11
|
+
const edges = [];
|
|
12
|
+
for (const manifest of manifests) {
|
|
13
|
+
for (const edge of manifest.acknowledgedDependencies ?? []) {
|
|
14
|
+
edges.push({
|
|
15
|
+
moduleId: manifest.id,
|
|
16
|
+
dependsOn: edge.moduleId,
|
|
17
|
+
port: edge.port,
|
|
18
|
+
reason: edge.reason,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return edges;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Every non-binding edge in a manifest set, keyed the way
|
|
26
|
+
* `check-port-dependencies.ts` needs them: `<resolving module>:<name>`.
|
|
27
|
+
*
|
|
28
|
+
* It sits beside {@link acknowledgedPortEdgesFrom} rather than in the check,
|
|
29
|
+
* for the reason that function exists: one declaration set, read by the check
|
|
30
|
+
* and by the runtime, so the two cannot disagree about which edges exist. What
|
|
31
|
+
* differs is who else reads it — an acknowledged edge reaches the graph below,
|
|
32
|
+
* and a non-binding one reaches the graph not at all.
|
|
33
|
+
*
|
|
34
|
+
* It used to reach **nothing**, which was true of all three kinds until the
|
|
35
|
+
* owner ruling of 2026-09-12. The `contributes-to` subset now reaches the
|
|
36
|
+
* container resolution through {@link declaredContributionsFrom}, so that a
|
|
37
|
+
* push into a registry this composition does not hold is dropped rather than
|
|
38
|
+
* throwing; `degrades-without` and `refuses-without` still reach nothing.
|
|
39
|
+
*/
|
|
40
|
+
export function nonBindingPortEdgesFrom(manifests) {
|
|
41
|
+
const edges = [];
|
|
42
|
+
for (const manifest of manifests) {
|
|
43
|
+
for (const edge of manifest.nonBindingDependencies ?? []) {
|
|
44
|
+
edges.push({
|
|
45
|
+
moduleId: manifest.id,
|
|
46
|
+
dependsOn: edge.moduleId,
|
|
47
|
+
name: edge.name,
|
|
48
|
+
kind: edge.kind,
|
|
49
|
+
whenAbsent: edge.whenAbsent ?? null,
|
|
50
|
+
reason: edge.reason,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return edges;
|
|
55
|
+
}
|
|
56
|
+
export class ModuleGatingGraph {
|
|
57
|
+
/** moduleId → the modules it declares in `dependencies`. */
|
|
58
|
+
declared = new Map();
|
|
59
|
+
/** moduleId → the modules it acknowledges without declaring. */
|
|
60
|
+
acknowledged = new Map();
|
|
61
|
+
/** moduleId → everything that depends on it, by either kind of edge. */
|
|
62
|
+
dependents = new Map();
|
|
63
|
+
constructor(manifests = []) {
|
|
64
|
+
const add = (owner, dependent) => {
|
|
65
|
+
let set = this.dependents.get(owner);
|
|
66
|
+
if (!set) {
|
|
67
|
+
set = new Set();
|
|
68
|
+
this.dependents.set(owner, set);
|
|
69
|
+
}
|
|
70
|
+
set.add(dependent);
|
|
71
|
+
};
|
|
72
|
+
for (const manifest of manifests) {
|
|
73
|
+
this.declared.set(manifest.id, new Set(manifest.dependencies));
|
|
74
|
+
for (const dep of manifest.dependencies)
|
|
75
|
+
add(dep, manifest.id);
|
|
76
|
+
const acknowledged = new Set((manifest.acknowledgedDependencies ?? []).map((edge) => edge.moduleId));
|
|
77
|
+
this.acknowledged.set(manifest.id, acknowledged);
|
|
78
|
+
for (const dep of acknowledged)
|
|
79
|
+
add(dep, manifest.id);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** `manifest.dependencies` — the install-ordering edges, and only those. */
|
|
83
|
+
declaredDependenciesOf(moduleId) {
|
|
84
|
+
return [...(this.declared.get(moduleId) ?? [])].sort();
|
|
85
|
+
}
|
|
86
|
+
/** The withheld edges this module declares as acknowledged. */
|
|
87
|
+
acknowledgedDependenciesOf(moduleId) {
|
|
88
|
+
return [...(this.acknowledged.get(moduleId) ?? [])].sort();
|
|
89
|
+
}
|
|
90
|
+
/** Direct dependents over **both** kinds of edge — the refusal direction. */
|
|
91
|
+
dependentsOf(moduleId) {
|
|
92
|
+
return [...(this.dependents.get(moduleId) ?? [])].sort();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Who would be left resolving a module that is no longer there.
|
|
96
|
+
*
|
|
97
|
+
* **Direct dependents only, and that is not an approximation.** A transitive
|
|
98
|
+
* dependent can only be reached through an intermediate one; if that
|
|
99
|
+
* intermediate is present it blocks here on its own account, and if it is
|
|
100
|
+
* absent then the transitive dependent is already stranded on the
|
|
101
|
+
* intermediate, which this flip neither causes nor repairs. So the refusal
|
|
102
|
+
* decision is identical either way, and the direct set is the one an operator
|
|
103
|
+
* can act on: these are the modules to switch off first.
|
|
104
|
+
*
|
|
105
|
+
* The same shape the CLI takes on the other axis — `orchestrator.disable`
|
|
106
|
+
* blocks on currently-installed *direct* dependents (`dependents-block`).
|
|
107
|
+
*/
|
|
108
|
+
presentDependentsOf(moduleId, isPresent) {
|
|
109
|
+
return this.dependentsOf(moduleId).filter((id) => id !== moduleId && isPresent(id));
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* What this module needs that is not there — `dependencies` only.
|
|
113
|
+
*
|
|
114
|
+
* Acknowledged edges are excluded because they are mutual by construction:
|
|
115
|
+
* `catalog` acknowledges `price_lists` while `price_lists` declares
|
|
116
|
+
* `catalog`, so requiring each to be present before the other may be switched
|
|
117
|
+
* on leaves a pair that can never be switched on again. The install order
|
|
118
|
+
* makes exactly this trade, and for exactly this reason (Amendment A1).
|
|
119
|
+
*/
|
|
120
|
+
absentDependenciesOf(moduleId, isPresent) {
|
|
121
|
+
return this.declaredDependenciesOf(moduleId).filter((id) => id !== moduleId && !isPresent(id));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Process singleton, read by the activation refusals.
|
|
126
|
+
*
|
|
127
|
+
* It has **no empty default**, because an empty graph is a refusal that never
|
|
128
|
+
* fires — the silent fall-open this whole task exists to remove. There are two
|
|
129
|
+
* ways it gets a value, and they are different questions:
|
|
130
|
+
* {@link installGatingGraph} sets the deployment's real manifest set (core,
|
|
131
|
+
* overlay modules and installed packages) as part of the presence load, and
|
|
132
|
+
* {@link provideDefaultGatingManifests} says what to fall back to for a process
|
|
133
|
+
* that never runs one — which is most of the test harness.
|
|
134
|
+
*
|
|
135
|
+
* **The fallback is the host's to supply** (feature 080, D-160.11). This file
|
|
136
|
+
* read `REGISTERED_MANIFESTS` directly, which is the host application's
|
|
137
|
+
* registry: it derives from the generated manifest index and merges the
|
|
138
|
+
* deployment's overlay and the instance's installed packages, none of which the
|
|
139
|
+
* platform can see. `backend/src/lifecycle/registered-manifests.ts` installs it
|
|
140
|
+
* as it is loaded — that file is the manifest registry, so a process that can
|
|
141
|
+
* answer "which modules exist" has imported it, and one that cannot must not be
|
|
142
|
+
* given an empty answer instead.
|
|
143
|
+
*/
|
|
144
|
+
let graph = null;
|
|
145
|
+
let defaultManifests = null;
|
|
146
|
+
/**
|
|
147
|
+
* The fallback manifest set, from whoever owns the registry.
|
|
148
|
+
*
|
|
149
|
+
* Idempotent and last-writer-wins: it is a module-scope installation, not a
|
|
150
|
+
* per-request choice.
|
|
151
|
+
*/
|
|
152
|
+
export function provideDefaultGatingManifests(supplier) {
|
|
153
|
+
defaultManifests = supplier;
|
|
154
|
+
// The contribution declarations travel with the manifest set, in both of the
|
|
155
|
+
// places a process learns one — see `declaredContributionsFrom`. A process
|
|
156
|
+
// that has a manifest registry but never runs a presence load (a CLI, a
|
|
157
|
+
// fixture composition) still composes modules, and a contributor in it must
|
|
158
|
+
// get the same answer.
|
|
159
|
+
provideDeclaredContributions(() => declaredContributionsFrom(supplier()));
|
|
160
|
+
}
|
|
161
|
+
export function gatingGraph() {
|
|
162
|
+
if (graph)
|
|
163
|
+
return graph;
|
|
164
|
+
if (defaultManifests === null) {
|
|
165
|
+
throw new Error('[gating-graph] no gating graph and no default manifest set. The activation refusals ' +
|
|
166
|
+
'read this graph, so answering from an empty one would let every flip through — ' +
|
|
167
|
+
'exactly the silent fall-open feature 073 removed. A composed process gets its graph ' +
|
|
168
|
+
'from the presence load (installGatingGraph); anything else must call ' +
|
|
169
|
+
'provideDefaultGatingManifests first, which the host does as it loads its manifest ' +
|
|
170
|
+
'registry.');
|
|
171
|
+
}
|
|
172
|
+
graph = new ModuleGatingGraph(defaultManifests());
|
|
173
|
+
return graph;
|
|
174
|
+
}
|
|
175
|
+
/** Install the deployment's manifest set. Idempotent; called from the presence load. */
|
|
176
|
+
export function installGatingGraph(manifests) {
|
|
177
|
+
graph = new ModuleGatingGraph(manifests);
|
|
178
|
+
provideDeclaredContributions(() => declaredContributionsFrom(manifests));
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The `contributes-to` edges, as the container resolution needs them (owner
|
|
182
|
+
* ruling, 2026-09-12; feature 117, A4).
|
|
183
|
+
*
|
|
184
|
+
* It is installed from **both** places this file establishes a manifest set —
|
|
185
|
+
* here and in {@link provideDefaultGatingManifests} — rather than from the
|
|
186
|
+
* presence load alone, because the question "did this module declare this
|
|
187
|
+
* contribution" has to be answerable in every process that composes modules,
|
|
188
|
+
* and those are the two points at which a process learns which manifests it
|
|
189
|
+
* has. Deriving it here rather than in the kernel is what keeps the kernel from
|
|
190
|
+
* importing a manifest: it receives a flattened pair list and knows nothing
|
|
191
|
+
* about `ModuleManifest`.
|
|
192
|
+
*
|
|
193
|
+
* The comment on {@link nonBindingPortEdgesFrom} above says a non-binding edge
|
|
194
|
+
* "reaches nothing". That was true of all three kinds until this ruling; the
|
|
195
|
+
* `contributes-to` subset now reaches the container resolution, and nothing
|
|
196
|
+
* else does.
|
|
197
|
+
*/
|
|
198
|
+
export function declaredContributionsFrom(manifests) {
|
|
199
|
+
return nonBindingPortEdgesFrom(manifests)
|
|
200
|
+
.filter((edge) => edge.kind === 'contributes-to')
|
|
201
|
+
.map((edge) => ({ moduleId: edge.moduleId, name: edge.name }));
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=gating-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gating-graph.js","sourceRoot":"","sources":["../../../src/lifecycle/services/gating-graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Redis } from 'ioredis';
|
|
2
|
+
export declare const LOCK_KEY = "b2b:module:lifecycle:lock";
|
|
3
|
+
export declare const LOCK_TTL_SECONDS = 300;
|
|
4
|
+
export declare const LOCK_REFRESH_INTERVAL_MS = 60000;
|
|
5
|
+
export declare class LifecycleLockError extends Error {
|
|
6
|
+
readonly heldBy: string | null;
|
|
7
|
+
constructor(heldBy: string | null);
|
|
8
|
+
}
|
|
9
|
+
export interface LifecycleLeaseHandle {
|
|
10
|
+
/** UUID identifying this acquisition. */
|
|
11
|
+
readonly leaseId: string;
|
|
12
|
+
/** Stops the auto-refresh timer and releases the lock if still held. */
|
|
13
|
+
release(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Acquire the global lifecycle lock. Returns a handle that auto-extends
|
|
17
|
+
* the lease every 60 s and exposes `release()` for the caller's `finally`.
|
|
18
|
+
*
|
|
19
|
+
* Throws `LifecycleLockError` if the lock is currently held by someone
|
|
20
|
+
* else (single attempt — the lifecycle commands surface this as exit 75
|
|
21
|
+
* rather than block).
|
|
22
|
+
*/
|
|
23
|
+
export declare function acquireLifecycleLock(redis: Redis, options?: {
|
|
24
|
+
ttlSeconds?: number;
|
|
25
|
+
refreshIntervalMs?: number;
|
|
26
|
+
}): Promise<LifecycleLeaseHandle>;
|
|
27
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/services/lock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,QAAQ,8BAA8B,CAAC;AACpD,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,wBAAwB,QAAS,CAAC;AA2B/C,qBAAa,kBAAmB,SAAQ,KAAK;aACf,MAAM,EAAE,MAAM,GAAG,IAAI;gBAArB,MAAM,EAAE,MAAM,GAAG,IAAI;CAQlD;AAED,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAO,GAChE,OAAO,CAAC,oBAAoB,CAAC,CAoC/B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
export const LOCK_KEY = 'b2b:module:lifecycle:lock';
|
|
3
|
+
export const LOCK_TTL_SECONDS = 300; // 5 minutes
|
|
4
|
+
export const LOCK_REFRESH_INTERVAL_MS = 60_000; // 1 minute
|
|
5
|
+
/**
|
|
6
|
+
* Compare-and-delete release script. Prevents the case where a stale
|
|
7
|
+
* lease's TTL elapsed, the lock was acquired by someone else, and our
|
|
8
|
+
* own `finally` block then deletes their key.
|
|
9
|
+
*/
|
|
10
|
+
const RELEASE_SCRIPT = `
|
|
11
|
+
if redis.call("get", KEYS[1]) == ARGV[1] then
|
|
12
|
+
return redis.call("del", KEYS[1])
|
|
13
|
+
else
|
|
14
|
+
return 0
|
|
15
|
+
end
|
|
16
|
+
`;
|
|
17
|
+
/**
|
|
18
|
+
* Compare-and-extend script. Refreshes the lease only when we still
|
|
19
|
+
* own it; otherwise reports zero so the caller can stop refreshing.
|
|
20
|
+
*/
|
|
21
|
+
const EXTEND_SCRIPT = `
|
|
22
|
+
if redis.call("get", KEYS[1]) == ARGV[1] then
|
|
23
|
+
return redis.call("expire", KEYS[1], ARGV[2])
|
|
24
|
+
else
|
|
25
|
+
return 0
|
|
26
|
+
end
|
|
27
|
+
`;
|
|
28
|
+
export class LifecycleLockError extends Error {
|
|
29
|
+
heldBy;
|
|
30
|
+
constructor(heldBy) {
|
|
31
|
+
super(heldBy
|
|
32
|
+
? `lifecycle lock is held by another process (lease ${heldBy})`
|
|
33
|
+
: 'lifecycle lock is currently held');
|
|
34
|
+
this.heldBy = heldBy;
|
|
35
|
+
this.name = 'LifecycleLockError';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Acquire the global lifecycle lock. Returns a handle that auto-extends
|
|
40
|
+
* the lease every 60 s and exposes `release()` for the caller's `finally`.
|
|
41
|
+
*
|
|
42
|
+
* Throws `LifecycleLockError` if the lock is currently held by someone
|
|
43
|
+
* else (single attempt — the lifecycle commands surface this as exit 75
|
|
44
|
+
* rather than block).
|
|
45
|
+
*/
|
|
46
|
+
export async function acquireLifecycleLock(redis, options = {}) {
|
|
47
|
+
const ttl = options.ttlSeconds ?? LOCK_TTL_SECONDS;
|
|
48
|
+
const refreshIntervalMs = options.refreshIntervalMs ?? LOCK_REFRESH_INTERVAL_MS;
|
|
49
|
+
const leaseId = randomUUID();
|
|
50
|
+
const result = await redis.set(LOCK_KEY, leaseId, 'EX', ttl, 'NX');
|
|
51
|
+
if (result !== 'OK') {
|
|
52
|
+
const heldBy = await redis.get(LOCK_KEY);
|
|
53
|
+
throw new LifecycleLockError(heldBy);
|
|
54
|
+
}
|
|
55
|
+
let released = false;
|
|
56
|
+
const refresh = setInterval(() => {
|
|
57
|
+
if (released)
|
|
58
|
+
return;
|
|
59
|
+
void redis
|
|
60
|
+
.eval(EXTEND_SCRIPT, 1, LOCK_KEY, leaseId, String(ttl))
|
|
61
|
+
.catch(() => {
|
|
62
|
+
/* refresh failure is silent — release() will still run */
|
|
63
|
+
});
|
|
64
|
+
}, refreshIntervalMs);
|
|
65
|
+
// Don't keep the event loop alive on the refresh interval.
|
|
66
|
+
refresh.unref?.();
|
|
67
|
+
return {
|
|
68
|
+
leaseId,
|
|
69
|
+
async release() {
|
|
70
|
+
if (released)
|
|
71
|
+
return;
|
|
72
|
+
released = true;
|
|
73
|
+
clearInterval(refresh);
|
|
74
|
+
await redis
|
|
75
|
+
.eval(RELEASE_SCRIPT, 1, LOCK_KEY, leaseId)
|
|
76
|
+
.catch(() => {
|
|
77
|
+
/* swallow — the lock will expire on its TTL anyway */
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../src/lifecycle/services/lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,CAAC,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,YAAY;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,CAAC,WAAW;AAE3D;;;;GAIG;AACH,MAAM,cAAc,GAAG;;;;;;CAMtB,CAAC;AAEF;;;GAGG;AACH,MAAM,aAAa,GAAG;;;;;;CAMrB,CAAC;AAEF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACf;IAA5B,YAA4B,MAAqB;QAC/C,KAAK,CACH,MAAM;YACJ,CAAC,CAAC,oDAAoD,MAAM,GAAG;YAC/D,CAAC,CAAC,kCAAkC,CACvC,CAAC;QALwB,WAAM,GAAN,MAAM,CAAe;QAM/C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AASD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAY,EACZ,UAA+D,EAAE;IAEjE,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,IAAI,gBAAgB,CAAC;IACnD,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,wBAAwB,CAAC;IAChF,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,QAAQ;YAAE,OAAO;QACrB,KAAK,KAAK;aACP,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;aACtD,KAAK,CAAC,GAAG,EAAE;YACV,0DAA0D;QAC5D,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACtB,2DAA2D;IAC3D,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAElB,OAAO;QACL,OAAO;QACP,KAAK,CAAC,OAAO;YACX,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,KAAK;iBACR,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC;iBAC1C,KAAK,CAAC,GAAG,EAAE;gBACV,sDAAsD;YACxD,CAAC,CAAC,CAAC;QACP,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { type ModuleManifest, type ModuleInstallHook, type ModuleLifecycleParticipant, type ModuleUninstallHook, type ModuleRecentActivity } from '@endora-commerce/contracts';
|
|
2
|
+
import { ModuleDepGraph } from './dep-graph.js';
|
|
3
|
+
export interface LoadedModuleEntry<EM = unknown, R = unknown> {
|
|
4
|
+
manifest: ModuleManifest;
|
|
5
|
+
/** Absolute path to the manifest.ts file on disk. */
|
|
6
|
+
filePath: string;
|
|
7
|
+
installHook?: ModuleInstallHook<EM, R>;
|
|
8
|
+
uninstallHook?: ModuleUninstallHook<EM, R>;
|
|
9
|
+
/**
|
|
10
|
+
* This module's interest in *every other* module's install and hard
|
|
11
|
+
* uninstall — feature 080, T036a / D-159. Declared as an export of the
|
|
12
|
+
* module's `manifest.ts`, exactly as the two hooks above are.
|
|
13
|
+
*/
|
|
14
|
+
lifecycleParticipant?: ModuleLifecycleParticipant<EM>;
|
|
15
|
+
/**
|
|
16
|
+
* The module's recent-activity eligibility — feature 080, T042j / D-163.1.
|
|
17
|
+
* The orchestrator reads it to reconcile the visibility Setting the
|
|
18
|
+
* declaration implies, which for a package is the only author it has.
|
|
19
|
+
*/
|
|
20
|
+
recentActivity?: ModuleRecentActivity;
|
|
21
|
+
}
|
|
22
|
+
/** A participant, with the module that declared it — named in a failure. */
|
|
23
|
+
export interface LoadedLifecycleParticipant<EM = unknown> {
|
|
24
|
+
moduleId: string;
|
|
25
|
+
participant: ModuleLifecycleParticipant<EM>;
|
|
26
|
+
}
|
|
27
|
+
export interface LoadedManifestRegistry<EM = unknown, R = unknown> {
|
|
28
|
+
modules: Map<string, LoadedModuleEntry<EM, R>>;
|
|
29
|
+
graph: ModuleDepGraph;
|
|
30
|
+
/**
|
|
31
|
+
* Every lifecycle participant the modules in this registry declare — or
|
|
32
|
+
* `null` when whoever built this registry is in no position to say.
|
|
33
|
+
*
|
|
34
|
+
* The two answers are different facts and the field exists to keep them
|
|
35
|
+
* apart. `[]` means *"I enumerated the modules and none declares one"*, and
|
|
36
|
+
* the orchestrator proceeds. `null` means *"I cannot enumerate them"*, and
|
|
37
|
+
* the orchestrator **refuses** the operation rather than performing an
|
|
38
|
+
* install that silently reconciles nothing. Collapsing the two is the
|
|
39
|
+
* fail-open this field was added to close: the reconcilers used to be
|
|
40
|
+
* optional injected values, so a caller that passed neither got an install
|
|
41
|
+
* indistinguishable from one where there was nothing to reconcile. The idiom
|
|
42
|
+
* is `MigrationOwnership.migrationNamesFor`'s, eleven lines from where the
|
|
43
|
+
* orchestrator reads it (`src/db/configured-migrations.ts`).
|
|
44
|
+
*
|
|
45
|
+
* It is **required**, so a builder cannot omit the answer: `[]` for a fixture
|
|
46
|
+
* registry that carries no participants is a declaration a reader can see.
|
|
47
|
+
*/
|
|
48
|
+
participants: readonly LoadedLifecycleParticipant<EM>[] | null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Collect the participants declared by a set of loaded entries.
|
|
52
|
+
*
|
|
53
|
+
* Sorted by module id so the order a projection is written in is a property of
|
|
54
|
+
* the platform rather than of whichever walk produced the map.
|
|
55
|
+
*/
|
|
56
|
+
export declare function collectLifecycleParticipants<EM = unknown, R = unknown>(entries: Iterable<LoadedModuleEntry<EM, R>>): LoadedLifecycleParticipant<EM>[];
|
|
57
|
+
export declare class ManifestLoadError extends Error {
|
|
58
|
+
readonly kind: 'duplicate-id' | 'cycle' | 'self-dep' | 'orphan-dep' | 'folder-id-mismatch' | 'package-root' | 'parse-failed';
|
|
59
|
+
constructor(kind: 'duplicate-id' | 'cycle' | 'self-dep' | 'orphan-dep' | 'folder-id-mismatch' | 'package-root' | 'parse-failed', message: string);
|
|
60
|
+
}
|
|
61
|
+
export interface DiscoverOptions {
|
|
62
|
+
/** Root directory to scan (e.g. `backend/src/modules`). */
|
|
63
|
+
modulesRoot: string;
|
|
64
|
+
/**
|
|
65
|
+
* Subdirectories under `modulesRoot` that the loader should INCLUDE.
|
|
66
|
+
* Defaults to "every direct subdirectory". Used by tests to scope
|
|
67
|
+
* discovery to a single fixture tree.
|
|
68
|
+
*/
|
|
69
|
+
include?: readonly string[];
|
|
70
|
+
/**
|
|
71
|
+
* Names of subdirectories under `modulesRoot` to ignore (e.g.
|
|
72
|
+
* `__pycache__`-like or test fixtures). Defaults to none.
|
|
73
|
+
*/
|
|
74
|
+
exclude?: readonly string[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Discover every `manifest.ts` under `modulesRoot/<id>/manifest.ts` and
|
|
78
|
+
* dynamically import each module. Returns the validated registry plus
|
|
79
|
+
* the dep graph derived from declarations.
|
|
80
|
+
*
|
|
81
|
+
* Production builds may swap this loader for a generated
|
|
82
|
+
* `manifest-index.ts` that imports the same modules eagerly — this
|
|
83
|
+
* runtime path is for dev/test where the file system is the source of
|
|
84
|
+
* truth.
|
|
85
|
+
*
|
|
86
|
+
* **Identity here is the directory name, and that scopes this loader** (feature
|
|
87
|
+
* 080, T032). It walks a tree this repository lays out, where Principle VI says
|
|
88
|
+
* `<id>/manifest.ts` — so the folder name is a claim about the id and a
|
|
89
|
+
* disagreement is a defect. An **installed package** has neither property: its
|
|
90
|
+
* directory is its npm name (`@endora-commerce/mod-blog`), and its identity is
|
|
91
|
+
* the `endora.id` field of its `package.json` (D-142), checked against its
|
|
92
|
+
* manifest by `src/packages/package-runtime.ts`. Pointing this loader at a
|
|
93
|
+
* `node_modules` is therefore refused outright rather than walked — see
|
|
94
|
+
* {@link ManifestLoadError} kind `package-root`. Without that refusal the walk
|
|
95
|
+
* happens to work and then reports `folder-id-mismatch`, which blames a vendor
|
|
96
|
+
* for naming their package correctly and sends the reader to fix the one thing
|
|
97
|
+
* that is right.
|
|
98
|
+
*/
|
|
99
|
+
export declare function discoverManifests<EM = unknown, R = unknown>(opts: DiscoverOptions): Promise<LoadedManifestRegistry<EM, R>>;
|
|
100
|
+
/**
|
|
101
|
+
* Convenience for tests: resolve `modulesRoot` relative to a test file.
|
|
102
|
+
* Avoids hard-coding paths that break under different working dirs.
|
|
103
|
+
*/
|
|
104
|
+
export declare function resolveFromFile(metaUrl: string, relative: string): string;
|
|
105
|
+
/** Test helper — assert that a value is one of the known load-error kinds. */
|
|
106
|
+
export declare function isLoadError(err: unknown): err is ManifestLoadError;
|
|
107
|
+
/**
|
|
108
|
+
* Production loader entry point: scans the project's
|
|
109
|
+
* `backend/src/modules` for every `manifest.ts`. Skips the fixtures
|
|
110
|
+
* trees under `test/`. Used by `composition.ts` at boot.
|
|
111
|
+
*/
|
|
112
|
+
export declare function loadProjectManifests<EM = unknown, R = unknown>(modulesRoot: string): Promise<LoadedManifestRegistry<EM, R>>;
|
|
113
|
+
/**
|
|
114
|
+
* The folder name a **directory-named** module's id comes from.
|
|
115
|
+
*
|
|
116
|
+
* It answers for the anchor {@link discoverManifests} produces — a
|
|
117
|
+
* `manifest.ts` under `<modules root>/<id>/`. It refuses a `package.json`
|
|
118
|
+
* anchor, which is what a resolved package entry's `filePath` is (feature 080,
|
|
119
|
+
* T032): `basename(dirname(...))` would answer `mod-blog`, the tail of an npm
|
|
120
|
+
* name, which is neither the module id nor even unique without the `@scope`
|
|
121
|
+
* this drops. A confident wrong answer is worse than a refusal — a package's id
|
|
122
|
+
* is its `endora.id`, and `resolvedManifestEntries()` already carries it.
|
|
123
|
+
*/
|
|
124
|
+
export declare function folderNameFromPath(filePath: string): string;
|
|
125
|
+
//# sourceMappingURL=manifest-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-loader.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/services/manifest-loader.ts"],"names":[],"mappings":"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"}
|