@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,343 @@
|
|
|
1
|
+
import { ModuleSettingsManifestSchema, valueSchemaForType, } from '@endora-commerce/contracts';
|
|
2
|
+
import { SettingGroup } from './setting-group.entity.js';
|
|
3
|
+
import { Setting } from './setting.entity.js';
|
|
4
|
+
import { SalesChannel } from '../sales-channels/sales-channel.entity.js';
|
|
5
|
+
/**
|
|
6
|
+
* Manifest reconciler — feature 004 / US1 (T023).
|
|
7
|
+
*
|
|
8
|
+
* Walks a list of {@link ModuleSettingsManifest}s and ensures the database
|
|
9
|
+
* contains every declared group and setting. Idempotent: re-running adds only
|
|
10
|
+
* missing rows; never overwrites administrator-chosen `setting_values`. Boot
|
|
11
|
+
* sync NEVER deletes — only `modules:uninstall` removes entries (R-1).
|
|
12
|
+
*
|
|
13
|
+
* Errors:
|
|
14
|
+
* - {@link ManifestSchemaInvalid} — Zod parse failed.
|
|
15
|
+
* - {@link SettingCodeConflict} / {@link GroupCodeConflict} — code owned by
|
|
16
|
+
* a different module.
|
|
17
|
+
* - {@link BreakingChangeRejected} — `valueType` or `defaultValue` changed
|
|
18
|
+
* for an existing code (without `--force`).
|
|
19
|
+
*/
|
|
20
|
+
export class ManifestSchemaInvalid extends Error {
|
|
21
|
+
issues;
|
|
22
|
+
name = 'ManifestSchemaInvalid';
|
|
23
|
+
constructor(issues) {
|
|
24
|
+
super('Module settings manifest failed Zod validation.');
|
|
25
|
+
this.issues = issues;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class SettingCodeConflict extends Error {
|
|
29
|
+
code;
|
|
30
|
+
existingOwnerModule;
|
|
31
|
+
attemptedOwnerModule;
|
|
32
|
+
name = 'SettingCodeConflict';
|
|
33
|
+
constructor(code, existingOwnerModule, attemptedOwnerModule) {
|
|
34
|
+
super(`Setting "${code}" is already owned by module "${existingOwnerModule}"; ` +
|
|
35
|
+
`module "${attemptedOwnerModule}" cannot redeclare it.`);
|
|
36
|
+
this.code = code;
|
|
37
|
+
this.existingOwnerModule = existingOwnerModule;
|
|
38
|
+
this.attemptedOwnerModule = attemptedOwnerModule;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class GroupCodeConflict extends Error {
|
|
42
|
+
code;
|
|
43
|
+
existingOwnerModule;
|
|
44
|
+
attemptedOwnerModule;
|
|
45
|
+
name = 'GroupCodeConflict';
|
|
46
|
+
constructor(code, existingOwnerModule, attemptedOwnerModule) {
|
|
47
|
+
super(`Setting group "${code}" is already owned by module "${existingOwnerModule}"; ` +
|
|
48
|
+
`module "${attemptedOwnerModule}" cannot redeclare it.`);
|
|
49
|
+
this.code = code;
|
|
50
|
+
this.existingOwnerModule = existingOwnerModule;
|
|
51
|
+
this.attemptedOwnerModule = attemptedOwnerModule;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export class BreakingChangeRejected extends Error {
|
|
55
|
+
settingCode;
|
|
56
|
+
field;
|
|
57
|
+
previous;
|
|
58
|
+
attempted;
|
|
59
|
+
name = 'BreakingChangeRejected';
|
|
60
|
+
constructor(settingCode, field, previous, attempted) {
|
|
61
|
+
super(`Setting "${settingCode}" cannot change ${field} from ${JSON.stringify(previous)} ` +
|
|
62
|
+
`to ${JSON.stringify(attempted)} without --force; existing per-channel values may ` +
|
|
63
|
+
'become invalid.');
|
|
64
|
+
this.settingCode = settingCode;
|
|
65
|
+
this.field = field;
|
|
66
|
+
this.previous = previous;
|
|
67
|
+
this.attempted = attempted;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function loadChannelLookup(em) {
|
|
71
|
+
const channels = await em.find(SalesChannel, {});
|
|
72
|
+
return { byCode: new Map(channels.map((c) => [c.code, c])) };
|
|
73
|
+
}
|
|
74
|
+
function isJsonEqual(a, b) {
|
|
75
|
+
// jsonb columns deserialize to plain JS values; this is sufficient for the
|
|
76
|
+
// scalar / array / object payloads we accept as setting values.
|
|
77
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
78
|
+
}
|
|
79
|
+
export class ManifestReconciler {
|
|
80
|
+
em;
|
|
81
|
+
constructor(em) {
|
|
82
|
+
this.em = em;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Apply the supplied manifests to the database.
|
|
86
|
+
*
|
|
87
|
+
* Within one apply() the manifests are processed in order; later manifests
|
|
88
|
+
* see earlier ones' groups, but ownership conflicts ALWAYS abort the whole
|
|
89
|
+
* batch — partial commits are rolled back via the surrounding transaction.
|
|
90
|
+
*/
|
|
91
|
+
async apply(manifests, options = {}) {
|
|
92
|
+
// command-coverage-ignore: idempotent lifecycle reconciler/seed — a system-
|
|
93
|
+
// invariant repair, not an operator-initiated audited write.
|
|
94
|
+
// (1) Validate every manifest before touching the DB.
|
|
95
|
+
const parsed = manifests.map((m) => {
|
|
96
|
+
const result = ModuleSettingsManifestSchema.safeParse(m);
|
|
97
|
+
if (!result.success)
|
|
98
|
+
throw new ManifestSchemaInvalid(result.error.issues);
|
|
99
|
+
return result.data;
|
|
100
|
+
});
|
|
101
|
+
// (1a) Validate each setting's defaultValue against its declared valueType.
|
|
102
|
+
for (const m of parsed) {
|
|
103
|
+
for (const s of m.settings) {
|
|
104
|
+
const schema = valueSchemaForType(s.valueType);
|
|
105
|
+
const r = schema.safeParse(s.defaultValue);
|
|
106
|
+
if (!r.success) {
|
|
107
|
+
throw new ManifestSchemaInvalid({
|
|
108
|
+
moduleCode: m.moduleCode,
|
|
109
|
+
settingCode: s.code,
|
|
110
|
+
field: 'defaultValue',
|
|
111
|
+
issues: r.error.issues,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const channels = await loadChannelLookup(this.em);
|
|
117
|
+
const perModule = [];
|
|
118
|
+
let totalAddedGroups = 0;
|
|
119
|
+
let totalAddedSettings = 0;
|
|
120
|
+
for (const manifest of parsed) {
|
|
121
|
+
const result = await this.applyOne(manifest, channels, options);
|
|
122
|
+
perModule.push(result);
|
|
123
|
+
totalAddedGroups += result.addedGroups;
|
|
124
|
+
totalAddedSettings += result.addedSettings;
|
|
125
|
+
}
|
|
126
|
+
if (!options.dryRun) {
|
|
127
|
+
await this.em.flush();
|
|
128
|
+
}
|
|
129
|
+
return { perModule, totalAddedGroups, totalAddedSettings };
|
|
130
|
+
}
|
|
131
|
+
async applyOne(manifest, channels, options) {
|
|
132
|
+
// command-coverage-ignore: idempotent boot reconcile of one module's settings
|
|
133
|
+
// manifest — a system-invariant repair, not an operator-initiated audited write.
|
|
134
|
+
const moduleCode = manifest.moduleCode;
|
|
135
|
+
let addedGroups = 0;
|
|
136
|
+
let updatedGroups = 0;
|
|
137
|
+
let addedSettings = 0;
|
|
138
|
+
let updatedSettings = 0;
|
|
139
|
+
// Groups first.
|
|
140
|
+
for (const entry of manifest.groups) {
|
|
141
|
+
const existing = await this.em.findOne(SettingGroup, { code: entry.code }, { populate: ['salesChannels'] });
|
|
142
|
+
if (existing) {
|
|
143
|
+
if (existing.ownerModule !== moduleCode) {
|
|
144
|
+
throw new GroupCodeConflict(entry.code, existing.ownerModule, moduleCode);
|
|
145
|
+
}
|
|
146
|
+
let changed = false;
|
|
147
|
+
if (existing.name !== entry.name) {
|
|
148
|
+
existing.name = entry.name;
|
|
149
|
+
changed = true;
|
|
150
|
+
}
|
|
151
|
+
// Additive scope reconciliation only (R-1): never remove existing rows.
|
|
152
|
+
if (entry.salesChannelCodes && entry.salesChannelCodes.length > 0) {
|
|
153
|
+
for (const code of entry.salesChannelCodes) {
|
|
154
|
+
const channel = channels.byCode.get(code);
|
|
155
|
+
if (!channel)
|
|
156
|
+
continue; // tolerate absent channels — logged at WARN by caller
|
|
157
|
+
if (!existing.salesChannels.getItems().some((c) => c.id === channel.id)) {
|
|
158
|
+
existing.salesChannels.add(channel);
|
|
159
|
+
changed = true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (changed)
|
|
164
|
+
updatedGroups += 1;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const group = this.em.create(SettingGroup, {
|
|
168
|
+
code: entry.code,
|
|
169
|
+
name: entry.name,
|
|
170
|
+
ownerModule: moduleCode,
|
|
171
|
+
isSystemProtected: entry.isSystemProtected ?? false,
|
|
172
|
+
});
|
|
173
|
+
if (entry.salesChannelCodes && entry.salesChannelCodes.length > 0) {
|
|
174
|
+
for (const code of entry.salesChannelCodes) {
|
|
175
|
+
const channel = channels.byCode.get(code);
|
|
176
|
+
if (channel)
|
|
177
|
+
group.salesChannels.add(channel);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
this.em.persist(group);
|
|
181
|
+
addedGroups += 1;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Settings second (so groupCode lookups can resolve).
|
|
185
|
+
for (const entry of manifest.settings) {
|
|
186
|
+
const groupCode = entry.groupCode ?? 'general';
|
|
187
|
+
const group = await this.em.findOne(SettingGroup, { code: groupCode });
|
|
188
|
+
if (!group) {
|
|
189
|
+
throw new ManifestSchemaInvalid({
|
|
190
|
+
moduleCode,
|
|
191
|
+
settingCode: entry.code,
|
|
192
|
+
field: 'groupCode',
|
|
193
|
+
issue: `Group "${groupCode}" is not declared by any manifest in this batch and is not pre-existing in the database.`,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
const existing = await this.em.findOne(Setting, { code: entry.code }, { populate: ['salesChannels', 'group'] });
|
|
197
|
+
if (existing) {
|
|
198
|
+
if (existing.ownerModule !== moduleCode) {
|
|
199
|
+
throw new SettingCodeConflict(entry.code, existing.ownerModule, moduleCode);
|
|
200
|
+
}
|
|
201
|
+
const valueType = entry.valueType;
|
|
202
|
+
// `string` → `secret` is the ONE sanctioned non-breaking valueType
|
|
203
|
+
// upgrade (feature 043): the write schema is unchanged (plain
|
|
204
|
+
// string), stored plaintext values keep resolving through the
|
|
205
|
+
// codec's legacy passthrough and are re-encrypted on the next
|
|
206
|
+
// write. Auto-applying it here lets pre-043 rows (or test
|
|
207
|
+
// databases reseeded out of band) self-heal at boot instead of
|
|
208
|
+
// failing the whole reconciliation.
|
|
209
|
+
const isSanctionedSecretUpgrade = existing.valueType === 'string' && valueType === 'secret';
|
|
210
|
+
if (isSanctionedSecretUpgrade) {
|
|
211
|
+
existing.valueType = valueType;
|
|
212
|
+
}
|
|
213
|
+
else if (existing.valueType !== valueType && !options.force) {
|
|
214
|
+
throw new BreakingChangeRejected(entry.code, 'valueType', existing.valueType, valueType);
|
|
215
|
+
}
|
|
216
|
+
// A **declared** default migration (feature 078, D-95.3 move 4). A
|
|
217
|
+
// `defaultValue` change is breaking because it silently alters
|
|
218
|
+
// behaviour for every deployment that never overrode the value — but a
|
|
219
|
+
// module that names the exact prior value it supersedes has said which
|
|
220
|
+
// change is intended and how far it reaches. A stored default equal to
|
|
221
|
+
// one of those is moved forward; anything else, including an operator's
|
|
222
|
+
// own choice that happens to differ, still throws. Same shape and same
|
|
223
|
+
// self-healing argument as `isSanctionedSecretUpgrade` above; without
|
|
224
|
+
// it a shipped default can never change, because no composition root
|
|
225
|
+
// passes `force` at boot.
|
|
226
|
+
const isDeclaredDefaultMigration = !isJsonEqual(existing.defaultValue, entry.defaultValue) &&
|
|
227
|
+
(entry.previousDefaultValues ?? []).some((previous) => isJsonEqual(existing.defaultValue, previous));
|
|
228
|
+
if (!isJsonEqual(existing.defaultValue, entry.defaultValue) &&
|
|
229
|
+
!isDeclaredDefaultMigration &&
|
|
230
|
+
!options.force) {
|
|
231
|
+
throw new BreakingChangeRejected(entry.code, 'defaultValue', existing.defaultValue, entry.defaultValue);
|
|
232
|
+
}
|
|
233
|
+
let changed = false;
|
|
234
|
+
if (isDeclaredDefaultMigration) {
|
|
235
|
+
existing.defaultValue = entry.defaultValue;
|
|
236
|
+
changed = true;
|
|
237
|
+
}
|
|
238
|
+
if (existing.name !== entry.name) {
|
|
239
|
+
existing.name = entry.name;
|
|
240
|
+
changed = true;
|
|
241
|
+
}
|
|
242
|
+
const desc = entry.description ?? null;
|
|
243
|
+
if ((existing.description ?? null) !== desc) {
|
|
244
|
+
existing.description = desc;
|
|
245
|
+
changed = true;
|
|
246
|
+
}
|
|
247
|
+
if (existing.group.id !== group.id) {
|
|
248
|
+
existing.group = group;
|
|
249
|
+
changed = true;
|
|
250
|
+
}
|
|
251
|
+
// enumOptions is manifest-driven config (not admin data): keep it in
|
|
252
|
+
// sync with the manifest on every reconciliation.
|
|
253
|
+
const nextEnumOptions = entry.enumOptions ?? null;
|
|
254
|
+
if (!isJsonEqual(existing.enumOptions ?? null, nextEnumOptions)) {
|
|
255
|
+
existing.enumOptions = nextEnumOptions;
|
|
256
|
+
changed = true;
|
|
257
|
+
}
|
|
258
|
+
// configurationType is manifest-driven config (feature 058) — keep it
|
|
259
|
+
// in sync with the manifest on every reconciliation.
|
|
260
|
+
const nextConfigurationType = entry.configurationType ?? null;
|
|
261
|
+
if ((existing.configurationType ?? null) !== nextConfigurationType) {
|
|
262
|
+
existing.configurationType = nextConfigurationType;
|
|
263
|
+
changed = true;
|
|
264
|
+
}
|
|
265
|
+
// hidden is manifest-driven config — keep it in sync on every run.
|
|
266
|
+
const nextHidden = entry.hidden ?? false;
|
|
267
|
+
if (existing.hidden !== nextHidden) {
|
|
268
|
+
existing.hidden = nextHidden;
|
|
269
|
+
changed = true;
|
|
270
|
+
}
|
|
271
|
+
if (options.force) {
|
|
272
|
+
if (existing.valueType !== valueType) {
|
|
273
|
+
existing.valueType = valueType;
|
|
274
|
+
changed = true;
|
|
275
|
+
}
|
|
276
|
+
if (!isJsonEqual(existing.defaultValue, entry.defaultValue)) {
|
|
277
|
+
existing.defaultValue = entry.defaultValue;
|
|
278
|
+
changed = true;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
// Additive scope reconciliation.
|
|
282
|
+
if (entry.salesChannelCodes && entry.salesChannelCodes.length > 0) {
|
|
283
|
+
for (const code of entry.salesChannelCodes) {
|
|
284
|
+
const channel = channels.byCode.get(code);
|
|
285
|
+
if (!channel)
|
|
286
|
+
continue;
|
|
287
|
+
if (!existing.salesChannels.getItems().some((c) => c.id === channel.id)) {
|
|
288
|
+
existing.salesChannels.add(channel);
|
|
289
|
+
changed = true;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (changed)
|
|
294
|
+
updatedSettings += 1;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const setting = this.em.create(Setting, {
|
|
298
|
+
code: entry.code,
|
|
299
|
+
name: entry.name,
|
|
300
|
+
group,
|
|
301
|
+
valueType: entry.valueType,
|
|
302
|
+
defaultValue: entry.defaultValue,
|
|
303
|
+
ownerModule: moduleCode,
|
|
304
|
+
description: entry.description ?? null,
|
|
305
|
+
enumOptions: entry.enumOptions ?? null,
|
|
306
|
+
configurationType: entry.configurationType ?? null,
|
|
307
|
+
hidden: entry.hidden ?? false,
|
|
308
|
+
});
|
|
309
|
+
if (entry.salesChannelCodes && entry.salesChannelCodes.length > 0) {
|
|
310
|
+
for (const code of entry.salesChannelCodes) {
|
|
311
|
+
const channel = channels.byCode.get(code);
|
|
312
|
+
if (channel)
|
|
313
|
+
setting.salesChannels.add(channel);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
this.em.persist(setting);
|
|
317
|
+
addedSettings += 1;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Detect orphans for warning purposes — rows owned by this module that the
|
|
321
|
+
// current manifest no longer claims. The reconciler does NOT remove them.
|
|
322
|
+
const ownedSettings = await this.em.find(Setting, { ownerModule: moduleCode });
|
|
323
|
+
const declaredSettingCodes = new Set(manifest.settings.map((s) => s.code));
|
|
324
|
+
const orphanSettings = ownedSettings
|
|
325
|
+
.filter((s) => !declaredSettingCodes.has(s.code))
|
|
326
|
+
.map((s) => s.code);
|
|
327
|
+
const ownedGroups = await this.em.find(SettingGroup, { ownerModule: moduleCode });
|
|
328
|
+
const declaredGroupCodes = new Set(manifest.groups.map((g) => g.code));
|
|
329
|
+
const orphanGroups = ownedGroups
|
|
330
|
+
.filter((g) => !declaredGroupCodes.has(g.code))
|
|
331
|
+
.map((g) => g.code);
|
|
332
|
+
return {
|
|
333
|
+
moduleCode,
|
|
334
|
+
addedGroups,
|
|
335
|
+
updatedGroups,
|
|
336
|
+
addedSettings,
|
|
337
|
+
updatedSettings,
|
|
338
|
+
orphanGroups,
|
|
339
|
+
orphanSettings,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=manifest-reconciler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-reconciler.js","sourceRoot":"","sources":["../../../src/kernel/settings/manifest-reconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret-value codec for the Settings `secret` value type (feature 043,
|
|
3
|
+
* FR-021 / research §R10).
|
|
4
|
+
*
|
|
5
|
+
* Written values are AES-256-GCM-encrypted into a JSON envelope stored in the
|
|
6
|
+
* existing JSONB value columns; the 32-byte key comes from the
|
|
7
|
+
* `SETTINGS_SECRET_ENCRYPTION_KEY` env var (base64), mirroring the MFA
|
|
8
|
+
* module's key format. The codec is deliberately settings-local: importing
|
|
9
|
+
* mfa's module-private SecretCipher would couple the two modules
|
|
10
|
+
* (Principle I), and ~50 LOC of duplication is the constitution-preferred
|
|
11
|
+
* trade (Principle IV).
|
|
12
|
+
*
|
|
13
|
+
* Legacy tolerance: values stored as plain strings (pre-043 secrets such as
|
|
14
|
+
* `search.llm.embedder_api_key`) are returned as-is on read and re-encrypted
|
|
15
|
+
* on the next write. There is NO plaintext fallback on write — encrypting
|
|
16
|
+
* without a key throws {@link SecretKeyMissing}.
|
|
17
|
+
*/
|
|
18
|
+
declare const ALGORITHM = "aes-256-gcm";
|
|
19
|
+
export interface SecretEnvelope {
|
|
20
|
+
v: 1;
|
|
21
|
+
alg: typeof ALGORITHM;
|
|
22
|
+
iv: string;
|
|
23
|
+
ct: string;
|
|
24
|
+
tag: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class SecretKeyMissing extends Error {
|
|
27
|
+
readonly name = "SecretKeyMissing";
|
|
28
|
+
readonly code: "SETTING_SECRET_KEY_MISSING";
|
|
29
|
+
constructor();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The encryption key is present but not a valid AES-256 key (must decode to
|
|
33
|
+
* exactly 32 bytes). Carries the same error code as {@link SecretKeyMissing} so
|
|
34
|
+
* callers surface a clear 5xx instead of a bare "Internal server error".
|
|
35
|
+
*/
|
|
36
|
+
export declare class SecretKeyInvalid extends Error {
|
|
37
|
+
readonly name = "SecretKeyInvalid";
|
|
38
|
+
readonly code: "SETTING_SECRET_KEY_MISSING";
|
|
39
|
+
constructor(actualBytes: number);
|
|
40
|
+
}
|
|
41
|
+
export declare function isSecretEnvelope(value: unknown): value is SecretEnvelope;
|
|
42
|
+
export declare function encryptSecretValue(plaintext: string, keyBase64: string | undefined): SecretEnvelope;
|
|
43
|
+
/**
|
|
44
|
+
* Resolve a stored secret value to its plaintext. Plain strings are legacy
|
|
45
|
+
* pre-encryption values and pass through unchanged; envelopes require the key
|
|
46
|
+
* and an intact auth tag.
|
|
47
|
+
*/
|
|
48
|
+
export declare function decryptSecretValue(stored: unknown, keyBase64: string | undefined): string;
|
|
49
|
+
/** A secret counts as "set" when it is an envelope or a non-empty legacy string. */
|
|
50
|
+
export declare function secretValueIsSet(stored: unknown): boolean;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=secret-value-codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-value-codec.d.ts","sourceRoot":"","sources":["../../../src/kernel/settings/secret-value-codec.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,QAAA,MAAM,SAAS,gBAAgB,CAAC;AAIhC,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,CAAC,CAAC;IACL,GAAG,EAAE,OAAO,SAAS,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAkB,IAAI,sBAAsB;IAC5C,QAAQ,CAAC,IAAI,EAAG,4BAA4B,CAAU;;CAMvD;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAkB,IAAI,sBAAsB;IAC5C,QAAQ,CAAC,IAAI,EAAG,4BAA4B,CAAU;gBAC1C,WAAW,EAAE,MAAM;CAMhC;AAUD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAUxE;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,cAAc,CAahB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,MAAM,CAcR;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAGzD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes } from 'crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Secret-value codec for the Settings `secret` value type (feature 043,
|
|
4
|
+
* FR-021 / research §R10).
|
|
5
|
+
*
|
|
6
|
+
* Written values are AES-256-GCM-encrypted into a JSON envelope stored in the
|
|
7
|
+
* existing JSONB value columns; the 32-byte key comes from the
|
|
8
|
+
* `SETTINGS_SECRET_ENCRYPTION_KEY` env var (base64), mirroring the MFA
|
|
9
|
+
* module's key format. The codec is deliberately settings-local: importing
|
|
10
|
+
* mfa's module-private SecretCipher would couple the two modules
|
|
11
|
+
* (Principle I), and ~50 LOC of duplication is the constitution-preferred
|
|
12
|
+
* trade (Principle IV).
|
|
13
|
+
*
|
|
14
|
+
* Legacy tolerance: values stored as plain strings (pre-043 secrets such as
|
|
15
|
+
* `search.llm.embedder_api_key`) are returned as-is on read and re-encrypted
|
|
16
|
+
* on the next write. There is NO plaintext fallback on write — encrypting
|
|
17
|
+
* without a key throws {@link SecretKeyMissing}.
|
|
18
|
+
*/
|
|
19
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
20
|
+
const IV_LENGTH = 12;
|
|
21
|
+
const KEY_LENGTH = 32;
|
|
22
|
+
export class SecretKeyMissing extends Error {
|
|
23
|
+
name = 'SecretKeyMissing';
|
|
24
|
+
code = 'SETTING_SECRET_KEY_MISSING';
|
|
25
|
+
constructor() {
|
|
26
|
+
super('SETTINGS_SECRET_ENCRYPTION_KEY is not configured — secret settings cannot be processed.');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The encryption key is present but not a valid AES-256 key (must decode to
|
|
31
|
+
* exactly 32 bytes). Carries the same error code as {@link SecretKeyMissing} so
|
|
32
|
+
* callers surface a clear 5xx instead of a bare "Internal server error".
|
|
33
|
+
*/
|
|
34
|
+
export class SecretKeyInvalid extends Error {
|
|
35
|
+
name = 'SecretKeyInvalid';
|
|
36
|
+
code = 'SETTING_SECRET_KEY_MISSING';
|
|
37
|
+
constructor(actualBytes) {
|
|
38
|
+
super(`SETTINGS_SECRET_ENCRYPTION_KEY is misconfigured — it must decode to ${KEY_LENGTH} bytes ` +
|
|
39
|
+
`(got ${actualBytes}). Set it to 32 random bytes, base64-encoded (e.g. \`openssl rand -base64 32\`).`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function keyBuffer(keyBase64) {
|
|
43
|
+
const key = Buffer.from(keyBase64, 'base64');
|
|
44
|
+
if (key.length !== KEY_LENGTH) {
|
|
45
|
+
throw new SecretKeyInvalid(key.length);
|
|
46
|
+
}
|
|
47
|
+
return key;
|
|
48
|
+
}
|
|
49
|
+
export function isSecretEnvelope(value) {
|
|
50
|
+
if (typeof value !== 'object' || value === null)
|
|
51
|
+
return false;
|
|
52
|
+
const v = value;
|
|
53
|
+
return (v['v'] === 1 &&
|
|
54
|
+
v['alg'] === ALGORITHM &&
|
|
55
|
+
typeof v['iv'] === 'string' &&
|
|
56
|
+
typeof v['ct'] === 'string' &&
|
|
57
|
+
typeof v['tag'] === 'string');
|
|
58
|
+
}
|
|
59
|
+
export function encryptSecretValue(plaintext, keyBase64) {
|
|
60
|
+
if (!keyBase64)
|
|
61
|
+
throw new SecretKeyMissing();
|
|
62
|
+
const key = keyBuffer(keyBase64);
|
|
63
|
+
const iv = randomBytes(IV_LENGTH);
|
|
64
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
65
|
+
const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
66
|
+
return {
|
|
67
|
+
v: 1,
|
|
68
|
+
alg: ALGORITHM,
|
|
69
|
+
iv: iv.toString('base64'),
|
|
70
|
+
ct: ct.toString('base64'),
|
|
71
|
+
tag: cipher.getAuthTag().toString('base64'),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a stored secret value to its plaintext. Plain strings are legacy
|
|
76
|
+
* pre-encryption values and pass through unchanged; envelopes require the key
|
|
77
|
+
* and an intact auth tag.
|
|
78
|
+
*/
|
|
79
|
+
export function decryptSecretValue(stored, keyBase64) {
|
|
80
|
+
if (typeof stored === 'string')
|
|
81
|
+
return stored;
|
|
82
|
+
if (!isSecretEnvelope(stored)) {
|
|
83
|
+
throw new Error('Stored secret value is neither a string nor a v1 secret envelope.');
|
|
84
|
+
}
|
|
85
|
+
if (!keyBase64)
|
|
86
|
+
throw new SecretKeyMissing();
|
|
87
|
+
const key = keyBuffer(keyBase64);
|
|
88
|
+
const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(stored.iv, 'base64'));
|
|
89
|
+
decipher.setAuthTag(Buffer.from(stored.tag, 'base64'));
|
|
90
|
+
const plaintext = Buffer.concat([
|
|
91
|
+
decipher.update(Buffer.from(stored.ct, 'base64')),
|
|
92
|
+
decipher.final(),
|
|
93
|
+
]);
|
|
94
|
+
return plaintext.toString('utf8');
|
|
95
|
+
}
|
|
96
|
+
/** A secret counts as "set" when it is an envelope or a non-empty legacy string. */
|
|
97
|
+
export function secretValueIsSet(stored) {
|
|
98
|
+
if (isSecretEnvelope(stored))
|
|
99
|
+
return true;
|
|
100
|
+
return typeof stored === 'string' && stored.length > 0;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=secret-value-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-value-codec.js","sourceRoot":"","sources":["../../../src/kernel/settings/secret-value-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Collection, OptionalProps } from '@mikro-orm/core';
|
|
2
|
+
import { SalesChannel } from '../sales-channels/sales-channel.entity.js';
|
|
3
|
+
/**
|
|
4
|
+
* SettingGroup — feature 004 / data-model.md.
|
|
5
|
+
*
|
|
6
|
+
* Logical section under which Settings are listed in Admin UI. The built-in
|
|
7
|
+
* `general` group has `isSystemProtected = true` and is rejected by the
|
|
8
|
+
* service layer when an operator tries to delete it.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SettingGroup {
|
|
11
|
+
[OptionalProps]?: 'id' | 'createdAt' | 'updatedAt' | 'isSystemProtected';
|
|
12
|
+
id: string;
|
|
13
|
+
code: string;
|
|
14
|
+
name: string;
|
|
15
|
+
isSystemProtected: boolean;
|
|
16
|
+
ownerModule: string;
|
|
17
|
+
/**
|
|
18
|
+
* Sales-channel scope. Empty collection ⇒ "applies to all sales channels"
|
|
19
|
+
* (FR-004 / R-5). Backed by the `setting_group_sales_channels` join table.
|
|
20
|
+
*/
|
|
21
|
+
salesChannels: Collection<SalesChannel, object>;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
updatedAt: Date;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=setting-group.entity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setting-group.entity.d.ts","sourceRoot":"","sources":["../../../src/kernel/settings/setting-group.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAIV,aAAa,EAId,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAEzE;;;;;;GAMG;AACH,qBAEa,YAAY;IACvB,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,mBAAmB,CAAC;IAGzE,EAAE,EAAE,MAAM,CAAgB;IAI1B,IAAI,EAAG,MAAM,CAAC;IAGd,IAAI,EAAG,MAAM,CAAC;IAGd,iBAAiB,EAAE,OAAO,CAAS;IAInC,WAAW,EAAG,MAAM,CAAC;IAErB;;;OAGG;IAMH,aAAa,mCAAsC;IAGnD,SAAS,EAAE,IAAI,CAAc;IAG7B,SAAS,EAAE,IAAI,CAAc;CAC9B"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { Collection, Entity, Index, ManyToMany, OptionalProps, PrimaryKey, Property, Unique, } from '@mikro-orm/core';
|
|
11
|
+
import { GlobalEntity } from '../../tenancy/org-scoped.decorator.js';
|
|
12
|
+
import { randomUUID } from 'crypto';
|
|
13
|
+
import { SalesChannel } from '../sales-channels/sales-channel.entity.js';
|
|
14
|
+
/**
|
|
15
|
+
* SettingGroup — feature 004 / data-model.md.
|
|
16
|
+
*
|
|
17
|
+
* Logical section under which Settings are listed in Admin UI. The built-in
|
|
18
|
+
* `general` group has `isSystemProtected = true` and is rejected by the
|
|
19
|
+
* service layer when an operator tries to delete it.
|
|
20
|
+
*/
|
|
21
|
+
let SettingGroup = class SettingGroup {
|
|
22
|
+
[OptionalProps];
|
|
23
|
+
id = randomUUID();
|
|
24
|
+
code;
|
|
25
|
+
name;
|
|
26
|
+
isSystemProtected = false;
|
|
27
|
+
ownerModule;
|
|
28
|
+
/**
|
|
29
|
+
* Sales-channel scope. Empty collection ⇒ "applies to all sales channels"
|
|
30
|
+
* (FR-004 / R-5). Backed by the `setting_group_sales_channels` join table.
|
|
31
|
+
*/
|
|
32
|
+
salesChannels = new Collection(this);
|
|
33
|
+
createdAt = new Date();
|
|
34
|
+
updatedAt = new Date();
|
|
35
|
+
};
|
|
36
|
+
__decorate([
|
|
37
|
+
PrimaryKey({ type: 'uuid' }),
|
|
38
|
+
__metadata("design:type", String)
|
|
39
|
+
], SettingGroup.prototype, "id", void 0);
|
|
40
|
+
__decorate([
|
|
41
|
+
Property({ type: 'string', length: 120 }),
|
|
42
|
+
Unique(),
|
|
43
|
+
__metadata("design:type", String)
|
|
44
|
+
], SettingGroup.prototype, "code", void 0);
|
|
45
|
+
__decorate([
|
|
46
|
+
Property({ type: 'string', length: 200 }),
|
|
47
|
+
__metadata("design:type", String)
|
|
48
|
+
], SettingGroup.prototype, "name", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
Property({ type: 'boolean', fieldName: 'is_system_protected' }),
|
|
51
|
+
__metadata("design:type", Boolean)
|
|
52
|
+
], SettingGroup.prototype, "isSystemProtected", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
Property({ type: 'string', length: 120, fieldName: 'owner_module' }),
|
|
55
|
+
Index(),
|
|
56
|
+
__metadata("design:type", String)
|
|
57
|
+
], SettingGroup.prototype, "ownerModule", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
ManyToMany(() => SalesChannel, undefined, {
|
|
60
|
+
pivotTable: 'setting_group_sales_channels',
|
|
61
|
+
joinColumn: 'setting_group_id',
|
|
62
|
+
inverseJoinColumn: 'sales_channel_id',
|
|
63
|
+
}),
|
|
64
|
+
__metadata("design:type", Object)
|
|
65
|
+
], SettingGroup.prototype, "salesChannels", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
Property({ type: 'datetime', onCreate: () => new Date(), fieldName: 'created_at' }),
|
|
68
|
+
__metadata("design:type", Date)
|
|
69
|
+
], SettingGroup.prototype, "createdAt", void 0);
|
|
70
|
+
__decorate([
|
|
71
|
+
Property({ type: 'datetime', onUpdate: () => new Date(), fieldName: 'updated_at' }),
|
|
72
|
+
__metadata("design:type", Date)
|
|
73
|
+
], SettingGroup.prototype, "updatedAt", void 0);
|
|
74
|
+
SettingGroup = __decorate([
|
|
75
|
+
GlobalEntity(),
|
|
76
|
+
Entity({ tableName: 'setting_groups' })
|
|
77
|
+
], SettingGroup);
|
|
78
|
+
export { SettingGroup };
|
|
79
|
+
//# sourceMappingURL=setting-group.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setting-group.entity.js","sourceRoot":"","sources":["../../../src/kernel/settings/setting-group.entity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,UAAU,EACV,MAAM,EACN,KAAK,EACL,UAAU,EACV,aAAa,EACb,UAAU,EACV,QAAQ,EACR,MAAM,GACP,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAEzE;;;;;;GAMG;AAGI,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB,CAAC,aAAa,CAAC,CAA0D;IAGzE,EAAE,GAAW,UAAU,EAAE,CAAC;IAI1B,IAAI,CAAU;IAGd,IAAI,CAAU;IAGd,iBAAiB,GAAY,KAAK,CAAC;IAInC,WAAW,CAAU;IAErB;;;OAGG;IAMH,aAAa,GAAG,IAAI,UAAU,CAAe,IAAI,CAAC,CAAC;IAGnD,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;IAG7B,SAAS,GAAS,IAAI,IAAI,EAAE,CAAC;CAC9B,CAAA;AAhCC;IADC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;wCACH;AAI1B;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACzC,MAAM,EAAE;;0CACK;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;0CAC5B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,EAAE,CAAC;;uDAC7B;AAInC;IAFC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;IACpE,KAAK,EAAE;;iDACa;AAWrB;IALC,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE;QACzC,UAAU,EAAE,8BAA8B;QAC1C,UAAU,EAAE,kBAAkB;QAC9B,iBAAiB,EAAE,kBAAkB;KACtC,CAAC;;mDACiD;AAGnD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;8BACzE,IAAI;+CAAc;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;8BACzE,IAAI;+CAAc;AAnClB,YAAY;IAFxB,YAAY,EAAE;IACd,MAAM,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;GAC3B,YAAY,CAoCxB"}
|