alepha 0.19.1 → 0.19.2
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 +1 -1
- package/README.md +6 -9
- package/dist/api/audits/index.d.ts +378 -346
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +216 -184
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +528 -496
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +3 -3
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +207 -207
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/notifications/index.d.ts +152 -152
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/organizations/index.browser.js +48 -0
- package/dist/api/organizations/index.browser.js.map +1 -0
- package/dist/api/organizations/index.d.ts +516 -0
- package/dist/api/organizations/index.d.ts.map +1 -0
- package/dist/api/organizations/index.js +202 -0
- package/dist/api/organizations/index.js.map +1 -0
- package/dist/api/parameters/index.d.ts +391 -358
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +5 -1
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -5
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +978 -913
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +160 -112
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +135 -135
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -2
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +6 -6
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/billing/index.d.ts +1048 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +713 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/bin/index.js +0 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +10 -10
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +2 -2
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +9 -9
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +2 -2
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +2 -2
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/redis/index.d.ts +6 -6
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +12 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +4 -0
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +183 -140
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +279 -89
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +45 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +170 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +383 -492
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +42 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +196 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +384 -0
- package/dist/cli/vendor/index.js.map +1 -0
- package/dist/command/index.d.ts +18 -18
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2 -2
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +4 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +10 -10
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +4 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +4 -4
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.d.ts +7 -7
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/datetime/index.d.ts +4 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/email/brevo/index.d.ts +4 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/core/index.d.ts +15 -11
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +12 -35
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.d.ts +12 -12
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +7 -4
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +4 -8
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +55 -889
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -13
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +2 -2
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +4 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +16 -15
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +5 -2
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +11 -11
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +11 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +53 -16
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +95 -51
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +55 -14
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +18 -17
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/queue/core/index.d.ts +14 -14
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +2 -2
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +2 -2
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +4 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.d.ts +9 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +5 -4
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/head/index.d.ts +4 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/i18n/index.d.ts +9 -9
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/intro/index.d.ts +2 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +4 -5
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +215 -215
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +6 -7
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +2 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +2 -4
- package/dist/react/testing/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +4 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +13 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -2
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +47 -47
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -12
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +170 -169
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -2
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +76 -76
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +23 -17
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -13
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +2 -2
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +9 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +2 -2
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -66
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +7 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +5 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +12 -12
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +2 -2
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +5 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +7 -7
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +11 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +9 -15
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +4 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/topic/core/index.d.ts +6 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +7 -7
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/dist/websocket/index.d.ts +36 -36
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +2 -2
- package/dist/websocket/index.js.map +1 -1
- package/package.json +36 -14
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +3 -3
- package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
- package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
- package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
- package/src/api/organizations/entities/organizations.ts +20 -0
- package/src/api/organizations/index.browser.ts +10 -0
- package/src/api/organizations/index.ts +31 -0
- package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
- package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
- package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
- package/src/api/organizations/services/OrganizationService.ts +75 -0
- package/src/api/parameters/services/ParameterProvider.ts +6 -1
- package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -4
- package/src/api/users/primitives/$realm.ts +6 -4
- package/src/api/users/providers/RealmProvider.ts +1 -1
- package/src/api/users/services/RegistrationService.ts +1 -1
- package/src/api/users/services/SessionService.ts +92 -5
- package/src/api/users/services/UserService.ts +1 -1
- package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
- package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
- package/src/billing/__tests__/BillingService.spec.ts +136 -0
- package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
- package/src/billing/controllers/AdminBillingController.ts +149 -0
- package/src/billing/controllers/BillingController.ts +108 -0
- package/src/billing/entities/paymentIntents.ts +34 -0
- package/src/billing/entities/paymentMethods.ts +24 -0
- package/src/billing/entities/refunds.ts +22 -0
- package/src/billing/errors/BillingError.ts +5 -0
- package/src/billing/index.ts +76 -0
- package/src/billing/providers/BillingProvider.ts +79 -0
- package/src/billing/providers/MemoryBillingProvider.ts +139 -0
- package/src/billing/schemas/intentSchemas.ts +60 -0
- package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
- package/src/billing/schemas/refundSchemas.ts +6 -0
- package/src/billing/services/BillingService.ts +325 -0
- package/src/billing/services/PaymentMethodService.ts +82 -0
- package/src/bin/index.ts +0 -2
- package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
- package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
- package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
- package/src/cache/core/primitives/$cache.ts +2 -2
- package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
- package/src/cli/config/defineConfig.ts +20 -0
- package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
- package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
- package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
- package/src/cli/core/atoms/devOptions.ts +0 -5
- package/src/cli/core/commands/build.ts +2 -2
- package/src/cli/core/commands/dev.ts +165 -30
- package/src/cli/core/commands/gen/changelog.ts +2 -2
- package/src/cli/core/commands/init.ts +2 -7
- package/src/cli/core/commands/verify.ts +0 -1
- package/src/cli/core/providers/AppEntryProvider.ts +2 -2
- package/src/cli/core/providers/ViteDevServerProvider.ts +54 -66
- package/src/cli/core/services/PackageManagerUtils.ts +8 -3
- package/src/cli/core/services/ProjectScaffolder.ts +18 -18
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- package/src/cli/core/templates/alephaConfigTs.ts +0 -6
- package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
- package/src/cli/core/templates/webAppRouterTs.ts +85 -2
- package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
- package/src/cli/devtools/index.ts +194 -0
- package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
- package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
- package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
- package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
- package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
- package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
- package/src/cli/platform/atoms/platformOptions.ts +2 -10
- package/src/cli/platform/commands/SecretsCommand.ts +2 -2
- package/src/cli/platform/commands/platform.ts +2 -11
- package/src/cli/platform/index.ts +34 -11
- package/src/cli/platform/services/PlatformInspector.ts +2 -2
- package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
- package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
- package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
- package/src/cli/vendor/commands/VendorCommand.ts +204 -0
- package/src/cli/vendor/index.ts +43 -0
- package/src/cli/vendor/services/VendorService.ts +338 -0
- package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
- package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
- package/src/command/providers/CliProvider.ts +2 -2
- package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
- package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
- package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
- package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
- package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
- package/src/core/index.shared.ts +1 -1
- package/src/core/primitives/{$use.ts → $state.ts} +4 -4
- package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
- package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
- package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
- package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
- package/src/email/core/providers/LocalEmailProvider.ts +13 -51
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
- package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
- package/src/lock/core/primitives/$lock.ts +2 -2
- package/src/logger/index.ts +10 -4
- package/src/mcp/transports/SseMcpTransport.ts +2 -2
- package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
- package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
- package/src/orm/__tests__/organization-tests.ts +200 -0
- package/src/orm/__tests__/organization.spec.ts +103 -0
- package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
- package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
- package/src/orm/core/index.shared.ts +1 -0
- package/src/orm/core/primitives/$entity.ts +31 -0
- package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
- package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
- package/src/orm/core/services/ModelBuilder.ts +11 -0
- package/src/orm/core/services/QueryManager.ts +16 -2
- package/src/orm/core/services/Repository.ts +70 -10
- package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
- package/src/queue/core/providers/WorkerProvider.ts +2 -2
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
- package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
- package/src/react/core/hooks/useAction.ts +7 -6
- package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
- package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
- package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
- package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
- package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
- package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
- package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
- package/src/react/router/providers/ReactPageProvider.ts +2 -2
- package/src/react/router/providers/ReactServerProvider.ts +3 -3
- package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
- package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
- package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
- package/src/scheduler/primitives/$scheduler.ts +2 -2
- package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
- package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
- package/src/security/primitives/$issuer.ts +1 -1
- package/src/security/providers/JwtProvider.ts +6 -10
- package/src/security/providers/SecurityProvider.ts +6 -11
- package/src/security/schemas/userAccountInfoSchema.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
- package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
- package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
- package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
- package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
- package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +2 -2
- package/src/server/core/primitives/$sse.ts +2 -2
- package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
- package/src/server/core/providers/ServerCompressProvider.ts +2 -2
- package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
- package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
- package/src/server/core/providers/ServerRouterProvider.ts +1 -5
- package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
- package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
- package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
- package/src/server/links/providers/LinkProvider.ts +2 -2
- package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
- package/src/server/links/providers/ServerLinksProvider.ts +2 -2
- package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
- package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
- package/src/sms/providers/LocalSmsProvider.ts +13 -24
- package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
- package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
- package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
- package/tsconfig.base.json +1 -0
- package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
- package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
- package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
- package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
- package/src/cli/platform/services/DockerSshService.ts +0 -61
- /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
- /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
- /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
- /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
- /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
- /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
- /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
- /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
- /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
- /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
- /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
- /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
- /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
- /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
- /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
- /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
- /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
- /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
- /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
- /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
- /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
- /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
- /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
- /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
- /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
- /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
- /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
- /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
- /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
- /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
- /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
- /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
- /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
- /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
- /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
- /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
- /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
- /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
- /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
- /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
- /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
- /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
- /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
- /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
- /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
- /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
- /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
- /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
- /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
- /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
- /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
- /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
- /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/orm/core/schemas/insertSchema.ts","../../../src/orm/core/schemas/updateSchema.ts","../../../src/orm/core/primitives/$entity.ts","../../../src/orm/core/constants/PG_SYMBOLS.ts","../../../src/orm/core/helpers/pgAttr.ts","../../../src/orm/core/schemas/databaseEnvSchema.ts","../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/primitives/$parameter.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/services/ParameterProvider.ts","../../../src/api/parameters/controllers/AdminParameterController.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/index.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/orm/core/schemas/insertSchema.ts","../../../src/orm/core/schemas/updateSchema.ts","../../../src/orm/core/primitives/$entity.ts","../../../src/orm/core/constants/PG_SYMBOLS.ts","../../../src/orm/core/helpers/pgAttr.ts","../../../src/orm/core/schemas/databaseEnvSchema.ts","../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/primitives/$parameter.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/services/ParameterProvider.ts","../../../src/api/parameters/controllers/AdminParameterController.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/index.ts"],"mappings":"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"}
|
|
@@ -178,7 +178,11 @@ var ParameterProvider = class {
|
|
|
178
178
|
/**
|
|
179
179
|
* Unique identifier for this instance (to avoid self-updates).
|
|
180
180
|
*/
|
|
181
|
-
instanceId
|
|
181
|
+
get instanceId() {
|
|
182
|
+
this._instanceId ??= this.crypto.randomUUID();
|
|
183
|
+
return this._instanceId;
|
|
184
|
+
}
|
|
185
|
+
_instanceId;
|
|
182
186
|
/**
|
|
183
187
|
* In-memory cache of registered parameter primitives.
|
|
184
188
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/services/ParameterProvider.ts","../../../src/api/parameters/controllers/AdminParameterController.ts","../../../src/api/parameters/primitives/$parameter.ts","../../../src/api/parameters/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\n/**\n * Configuration parameter entity for versioned configuration management.\n *\n * Stores all versions of configuration parameters with:\n * - Status derived from activationDate at query time\n * - Schema versioning for migrations\n * - Activation scheduling\n * - Audit trail (creator info)\n */\nexport const parameters = $entity({\n name: \"parameters\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n /**\n * Configuration name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name: t.text(),\n\n /**\n * The configuration content as JSON.\n */\n content: t.json(),\n\n /**\n * Schema version hash for detecting schema changes.\n * Used for auto-migration when schema evolves.\n */\n schemaHash: t.text(),\n\n /**\n * When this version should become active.\n * Default is immediate (now).\n */\n activationDate: t.datetime(),\n\n /**\n * Version number for this configuration.\n * Auto-incremented per config name.\n */\n version: t.integer(),\n\n /**\n * Optional description of changes in this version.\n */\n changeDescription: t.optional(t.text()),\n\n /**\n * Optional tags for filtering/categorization.\n */\n tags: t.optional(t.array(t.text())),\n\n /**\n * Creator user ID (if available).\n */\n creatorId: t.optional(t.uuid()),\n\n /**\n * Creator display name for audit trail.\n */\n creatorName: t.optional(t.text()),\n\n /**\n * Previous content before this change (for rollback reference).\n */\n previousContent: t.optional(t.json()),\n\n /**\n * Migration log if schema changed.\n */\n migrationLog: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"name\", \"activationDate\"] },\n { columns: [\"name\", \"version\"], unique: true },\n { columns: [\"activationDate\"] },\n ],\n});\n\nexport type Parameter = Static<typeof parameters.schema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Activate parameter body schema.\n * Uses t.pick for version and creator fields.\n */\nexport const activateParameterBodySchema = t.pick(parameters.schema, [\n \"version\",\n \"creatorId\",\n \"creatorName\",\n]);\n\nexport type ActivateParameterBody = Static<typeof activateParameterBodySchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Create parameter version body schema.\n * Uses t.pick to derive from entity, with required fields made non-optional.\n */\nexport const createParameterVersionBodySchema = t.extend(\n t.pick(parameters.schema, [\n \"content\",\n \"schemaHash\",\n \"changeDescription\",\n \"tags\",\n \"creatorId\",\n \"creatorName\",\n ]),\n {\n activationDate: t.optional(\n t.datetime({ description: \"When to activate (default: now)\" }),\n ),\n },\n);\n\nexport type CreateParameterVersionBody = Static<\n typeof createParameterVersionBodySchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter status enum schema.\n */\nexport const parameterStatusSchema = t.enum([\n \"expired\",\n \"current\",\n \"next\",\n \"future\",\n]);\n\nexport type ParameterStatus = Static<typeof parameterStatusSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\nimport { parameterStatusSchema } from \"./parameterStatusSchema.ts\";\n\n/**\n * Parameter response schema for API responses.\n * Extends the entity schema with a calculated status field.\n * Status is derived from activationDate at query time, not stored.\n */\nexport const parameterResponseSchema = t.extend(parameters.schema, {\n status: parameterStatusSchema,\n});\n\nexport type ParameterResponse = Static<typeof parameterResponseSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Current parameter response schema.\n * Includes current version, next scheduled version, and defaults.\n */\nexport const parameterCurrentResponseSchema = t.object({\n current: t.optional(parameterResponseSchema),\n next: t.optional(parameterResponseSchema),\n defaultValue: t.optional(t.json()),\n currentValue: t.optional(t.json()),\n schema: t.optional(t.json()),\n});\n\nexport type ParameterCurrentResponse = Static<\n typeof parameterCurrentResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter history response schema.\n */\nexport const parameterHistoryResponseSchema = t.object({\n versions: t.array(parameterResponseSchema),\n});\n\nexport type ParameterHistoryResponse = Static<\n typeof parameterHistoryResponseSchema\n>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterNameParamSchema = t.pick(parameters.schema, [\"name\"]);\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter names list response schema.\n */\nexport const parameterNamesResponseSchema = t.object({\n names: t.array(t.text()),\n});\n\nexport type ParameterNamesResponse = Static<\n typeof parameterNamesResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Tree node schema for parameter tree navigation.\n */\nexport const parameterTreeNodeSchema = t.object({\n name: t.text(),\n path: t.text(),\n isLeaf: t.boolean(),\n children: t.array(t.any()),\n});\n\nexport type ParameterTreeNode = Static<typeof parameterTreeNodeSchema>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name and version param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterVersionParamSchema = t.pick(parameters.schema, [\n \"name\",\n \"version\",\n]);\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter version response schema.\n */\nexport const parameterVersionResponseSchema = t.object({\n parameter: t.optional(parameterResponseSchema),\n});\n\nexport type ParameterVersionResponse = Static<\n typeof parameterVersionResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Rollback parameter body schema.\n * Uses t.pick for creator fields, adds targetVersion.\n */\nexport const rollbackParameterBodySchema = t.extend(\n t.pick(parameters.schema, [\"changeDescription\", \"creatorId\", \"creatorName\"]),\n {\n targetVersion: t.integer({\n description: \"Version number to rollback to\",\n }),\n },\n);\n\nexport type RollbackParameterBody = Static<typeof rollbackParameterBodySchema>;\n","import {\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TObject,\n t,\n Value,\n} from \"alepha\";\nimport { CryptoProvider } from \"alepha/crypto\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LockProvider } from \"alepha/lock\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { $topic } from \"alepha/topic\";\nimport { type Parameter, parameters } from \"../entities/parameters.ts\";\nimport type { ParameterPrimitive } from \"../primitives/$parameter.ts\";\nimport type { ParameterStatus } from \"../schemas/parameterStatusSchema.ts\";\nimport type { ParameterTreeNode } from \"../schemas/parameterTreeNodeSchema.ts\";\n\n/**\n * Payload for parameter change events across instances.\n */\nexport interface ParameterChangePayload {\n name: string;\n instanceId: string;\n}\n\n/**\n * A parameter with a calculated status field.\n */\nexport type ParameterWithStatus = Parameter & { status: ParameterStatus };\n\n/**\n * ParameterProvider manages versioned parameter persistence, caching,\n * migration, and synchronization.\n *\n * Features:\n * - Stores all parameter versions in the database\n * - Derives status from activationDate at query time (no stored status)\n * - Provides cross-instance notification via topic\n * - Supports schema migrations via hash comparison\n * - Manages per-parameter caching, loading, and subscriber notification\n */\nexport class ParameterProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly crypto = $inject(CryptoProvider);\n protected readonly lockProvider = $inject(LockProvider);\n protected readonly repo = $repository(parameters);\n\n /**\n * Unique identifier for this instance (to avoid self-updates).\n */\n protected readonly instanceId = this.crypto.randomUUID();\n\n /**\n * In-memory cache of registered parameter primitives.\n */\n protected readonly primitives = new Map<string, ParameterPrimitive<any>>();\n\n /**\n * In-memory cached current content per parameter.\n */\n protected readonly cachedCurrent = new Map<string, unknown>();\n\n /**\n * In-memory cached next version info per parameter.\n */\n protected readonly cachedNext = new Map<\n string,\n { content: unknown; activationDate: string }\n >();\n\n /**\n * Set of parameter names that have completed initial load.\n */\n protected readonly loaded = new Set<string>();\n\n /**\n * Shared promises for deduplicating concurrent load() calls.\n */\n protected readonly loadPromises = new Map<string, Promise<void>>();\n\n /**\n * Subscriber callbacks per parameter name.\n */\n protected readonly subscribers = new Map<\n string,\n Array<(v: unknown) => void>\n >();\n\n /**\n * Set of parameter names that have already been checked for migration.\n */\n protected readonly migrationChecked = new Set<string>();\n\n /**\n * Computed schema hashes per parameter name.\n */\n protected readonly schemaHashes = new Map<string, string>();\n\n /**\n * Pre-load all registered parameters on ready (non-serverless only).\n */\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n if (this.alepha.isServerless()) {\n return;\n }\n for (const name of this.primitives.keys()) {\n await this.migrateWithLock(name);\n }\n },\n });\n\n /**\n * Topic for cross-instance change notification.\n * Payload is minimal — receivers call load() to fetch fresh data.\n */\n public readonly syncTopic = $topic({\n name: \"parameter:sync\",\n schema: {\n payload: t.object({\n name: t.text(),\n instanceId: t.text(),\n }),\n },\n handler: async ({ payload }) => {\n await this.handleChangeNotification(payload as ParameterChangePayload);\n },\n });\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n /**\n * Register a parameter primitive with the provider.\n * Computes and stores the schema hash.\n */\n public register(param: ParameterPrimitive<any>): void {\n this.primitives.set(param.name, param);\n this.schemaHashes.set(param.name, this.calculateSchemaHash(param.schema));\n }\n\n // ---------------------------------------------------------------------------\n // Public API used by $parameter primitive (thin delegates)\n // ---------------------------------------------------------------------------\n\n /**\n * Get the current parameter value asynchronously.\n * Lazy-loads from database on first call.\n * Checks if a cached next version has become current.\n */\n public async get(name: string): Promise<unknown> {\n if (!this.loaded.has(name)) {\n if (!this.loadPromises.has(name)) {\n this.loadPromises.set(name, this.doLoad(name));\n }\n await this.loadPromises.get(name);\n }\n\n // Check if cached next has become current\n const cachedNext = this.cachedNext.get(name);\n if (cachedNext) {\n const now = this.dateTimeProvider.now().toDate();\n if (new Date(cachedNext.activationDate) <= now) {\n this.cachedCurrent.set(name, cachedNext.content);\n this.cachedNext.delete(name);\n this.reloadNextInBackground(name);\n }\n }\n\n const param = this.primitives.get(name);\n return this.cachedCurrent.has(name)\n ? this.cachedCurrent.get(name)\n : param?.options.default;\n }\n\n /**\n * Set a new parameter value.\n */\n public async set(\n name: string,\n value: unknown,\n options: SaveParameterOptions = {},\n ): Promise<void> {\n const schemaHash = this.schemaHashes.get(name) ?? \"\";\n\n await this.save(name, value as Record<string, unknown>, schemaHash, {\n activationDate: options.activationDate,\n changeDescription: options.changeDescription,\n tags: options.tags,\n creatorId: options.creatorId,\n creatorName: options.creatorName,\n });\n\n // Update local cache\n const now = this.dateTimeProvider.now().toDate();\n if (!options.activationDate || options.activationDate <= now) {\n const prev = this.cachedCurrent.get(name);\n this.cachedCurrent.set(name, value);\n if (JSON.stringify(prev) !== JSON.stringify(value)) {\n this.notifySubscribers(name);\n }\n } else {\n this.cachedNext.set(name, {\n content: value,\n activationDate: options.activationDate.toISOString(),\n });\n }\n }\n\n /**\n * Subscribe to parameter changes.\n * Returns an unsubscribe function.\n */\n public sub(name: string, fn: (v: unknown) => void): () => void {\n if (!this.subscribers.has(name)) {\n this.subscribers.set(name, []);\n }\n this.subscribers.get(name)!.push(fn);\n return () => {\n const subs = this.subscribers.get(name);\n if (subs) {\n const idx = subs.indexOf(fn);\n if (idx >= 0) {\n subs.splice(idx, 1);\n }\n }\n };\n }\n\n /**\n * Load current and next values from database.\n * Deduplicates concurrent calls via shared promise.\n */\n public async load(name: string): Promise<void> {\n this.loadPromises.set(name, this.doLoad(name));\n await this.loadPromises.get(name);\n }\n\n /**\n * Get the cached current content, falling back to default.\n * Synchronous access for admin API.\n */\n public getCachedCurrentContent(name: string): unknown {\n if (this.cachedCurrent.has(name)) {\n return this.cachedCurrent.get(name);\n }\n const param = this.primitives.get(name);\n return param?.options.default;\n }\n\n /**\n * Whether the parameter is using its default value (no DB value loaded).\n */\n public isUsingDefault(name: string): boolean {\n return !this.cachedCurrent.has(name);\n }\n\n // ---------------------------------------------------------------------------\n // Database operations\n // ---------------------------------------------------------------------------\n\n /**\n * Load the current and next parameter values from database.\n * Current: latest version with activationDate <= now.\n * Next: earliest version with activationDate > now.\n */\n public async loadCurrentAndNext(\n name: string,\n ): Promise<{ current: Parameter | null; next: Parameter | null; now: Date }> {\n const now = this.dateTimeProvider.now().toDate();\n const nowIso = now.toISOString();\n\n const [currentRows, nextRows] = await Promise.all([\n this.repo.findMany({\n where: { name, activationDate: { lte: nowIso } },\n orderBy: { column: \"activationDate\", direction: \"desc\" },\n limit: 2,\n }),\n this.repo.findMany({\n where: { name, activationDate: { gt: nowIso } },\n orderBy: { column: \"activationDate\", direction: \"asc\" },\n limit: 1,\n }),\n ]);\n\n // Secondary sort by version descending for same-millisecond ties\n const current =\n currentRows.length > 1 &&\n new Date(currentRows[0].activationDate).getTime() ===\n new Date(currentRows[1].activationDate).getTime()\n ? [...currentRows].sort((a, b) => b.version - a.version)[0]\n : (currentRows[0] ?? null);\n\n return {\n current: current ?? null,\n next: nextRows[0] ?? null,\n now,\n };\n }\n\n /**\n * Calculate statuses for a list of parameter versions.\n * Derives status from activationDate relative to now:\n * - The latest version with activationDate <= now is \"current\"\n * - The earliest version with activationDate > now is \"next\"\n * - Other future versions are \"future\"\n * - Other past versions are \"expired\"\n */\n public calculateStatuses(\n versions: Parameter[],\n now?: Date,\n ): ParameterWithStatus[] {\n const effectiveNow = now ?? this.dateTimeProvider.now().toDate();\n\n // Sort by activationDate ascending, then version ascending for ties\n const sorted = [...versions].sort((a, b) => {\n const timeDiff =\n new Date(a.activationDate).getTime() -\n new Date(b.activationDate).getTime();\n if (timeDiff !== 0) return timeDiff;\n return a.version - b.version;\n });\n\n // Find which should be current (latest activated)\n const pastVersions = sorted.filter(\n (v) => new Date(v.activationDate) <= effectiveNow,\n );\n const futureVersions = sorted.filter(\n (v) => new Date(v.activationDate) > effectiveNow,\n );\n\n const currentVersion = pastVersions[pastVersions.length - 1];\n const nextVersion = futureVersions[0];\n\n return sorted.map((v) => {\n let status: ParameterStatus;\n if (currentVersion && v.id === currentVersion.id) {\n status = \"current\";\n } else if (nextVersion && v.id === nextVersion.id) {\n status = \"next\";\n } else if (new Date(v.activationDate) > effectiveNow) {\n status = \"future\";\n } else {\n status = \"expired\";\n }\n return { ...v, status };\n });\n }\n\n /**\n * Save a new parameter version.\n *\n * @param name - Parameter name (e.g., \"app.features.flags\")\n * @param content - New parameter content\n * @param schemaHash - Hash of the schema for migration detection\n * @param options - Additional options (activation date, creator info, etc.)\n */\n public async save<T extends TObject>(\n name: string,\n content: Static<T>,\n schemaHash: string,\n options: SaveParameterOptions = {},\n ): Promise<ParameterWithStatus> {\n // Resolve empty schema hash from registered primitive\n if (!schemaHash) {\n schemaHash = this.schemaHashes.get(name) ?? \"\";\n }\n\n const now = this.dateTimeProvider.now().toDate();\n const activationDate = options.activationDate ?? now;\n const isImmediate = activationDate <= now;\n\n // Get all versions to determine next version number and previous content\n const versions = await this.repo.findMany({\n where: { name },\n orderBy: { column: \"version\", direction: \"desc\" },\n });\n\n const latestVersion = versions[0];\n const newVersion = (latestVersion?.version ?? 0) + 1;\n\n // Find previous content from the latest activated version\n const currentVersion = versions.find(\n (v) => new Date(v.activationDate) <= now,\n );\n const previousContent = currentVersion?.content;\n\n // Check for schema migration\n let migrationLog: string | undefined;\n if (latestVersion && latestVersion.schemaHash !== schemaHash) {\n migrationLog = `Schema changed from ${latestVersion.schemaHash} to ${schemaHash} at version ${newVersion}`;\n this.log.info(\"Parameter schema migration detected\", {\n name,\n migrationLog,\n });\n }\n\n // Insert new version\n const inserted = await this.repo.create({\n name,\n content: content as Record<string, unknown>,\n schemaHash,\n activationDate: activationDate.toISOString(),\n version: newVersion,\n changeDescription: options.changeDescription,\n tags: options.tags,\n creatorId: options.creatorId,\n creatorName: options.creatorName,\n previousContent: previousContent as Record<string, unknown> | undefined,\n migrationLog,\n });\n\n // Calculate status from existing versions + the newly inserted row\n const withStatuses = this.calculateStatuses([...versions, inserted]);\n const insertedWithStatus = withStatuses.find((v) => v.id === inserted.id)!;\n\n // Publish change notification if activation is immediate\n if (isImmediate) {\n await this.publishChange(name);\n }\n\n this.log.info(\"Parameter saved\", {\n name,\n version: newVersion,\n status: insertedWithStatus.status,\n });\n\n return insertedWithStatus;\n }\n\n /**\n * Get all versions of a parameter.\n */\n public async getHistory(name: string): Promise<Parameter[]> {\n return this.repo.findMany({\n where: { name },\n orderBy: { column: \"version\", direction: \"desc\" },\n });\n }\n\n /**\n * Get a specific version of a parameter.\n */\n public async getVersion(\n name: string,\n version: number,\n ): Promise<Parameter | null> {\n const versions = await this.repo.findMany({\n where: { name, version },\n });\n return versions[0] ?? null;\n }\n\n /**\n * Rollback to a previous version by creating a new version with old content.\n */\n public async rollback(\n name: string,\n targetVersion: number,\n options: SaveParameterOptions = {},\n ): Promise<ParameterWithStatus> {\n const target = await this.getVersion(name, targetVersion);\n\n if (!target) {\n throw new AlephaError(\n `Parameter version not found: ${name}@${targetVersion}`,\n );\n }\n\n return this.save(\n name,\n target.content as Static<TObject>,\n target.schemaHash,\n {\n ...options,\n changeDescription:\n options.changeDescription ?? `Rollback to version ${targetVersion}`,\n },\n );\n }\n\n /**\n * Get current parameter value with fallback to default from registered primitive.\n * Returns the in-memory current value which may be the default if never saved.\n */\n public getCurrentValue(\n name: string,\n ): { content: unknown; isDefault: boolean } | null {\n if (!this.primitives.has(name)) {\n return null;\n }\n return {\n content: this.getCachedCurrentContent(name),\n isDefault: this.isUsingDefault(name),\n };\n }\n\n /**\n * Get parameter info including current value with default fallback.\n */\n public async getCurrentWithDefault(name: string): Promise<{\n current: ParameterWithStatus | null;\n next: ParameterWithStatus | null;\n defaultValue: unknown | null;\n currentValue: unknown | null;\n schema: TObject | null;\n }> {\n const { current, next } = await this.loadCurrentAndNext(name);\n\n // Get default and current from registered primitive\n const param = this.primitives.get(name);\n const defaultValue = param?.options.default ?? null;\n const currentValue = this.getCachedCurrentContent(name) ?? null;\n const schema = param?.schema ?? null;\n\n return {\n current: current ? { ...current, status: \"current\" as const } : null,\n next: next ? { ...next, status: \"next\" as const } : null,\n defaultValue,\n currentValue,\n schema,\n };\n }\n\n /**\n * Get all unique parameter names (for tree view).\n */\n public async getParameterNames(): Promise<string[]> {\n const results = await this.repo.findMany({\n columns: [\"name\"],\n distinct: [\"name\"],\n orderBy: { column: \"name\", direction: \"asc\" },\n });\n\n return results.map((r) => r.name);\n }\n\n /**\n * Build a tree structure from parameter names for UI.\n * Includes both database parameters and registered (but not yet saved) parameters.\n */\n public async getParameterTree(): Promise<ParameterTreeNode[]> {\n const dbNames = await this.getParameterNames();\n const registeredNames = Array.from(this.primitives.keys());\n const allNames = [...new Set([...dbNames, ...registeredNames])].sort();\n return this.buildTree(allNames);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: loading, migration, notification\n // ---------------------------------------------------------------------------\n\n /**\n * Internal load implementation.\n * Fetches current and next from database, updates cache.\n */\n protected async doLoad(name: string): Promise<void> {\n const { current, next } = await this.loadCurrentAndNext(name);\n const schemaHash = this.schemaHashes.get(name) ?? \"\";\n\n // Check if migration is needed\n if (current && !this.migrationChecked.has(name)) {\n this.migrationChecked.add(name);\n const migration = this.migrateValue(\n name,\n current.content,\n current.schemaHash,\n );\n if (migration) {\n this.log.info(\"Auto-migrating parameter\", {\n name,\n description: migration.description,\n });\n await this.save(\n name,\n migration.value as Record<string, unknown>,\n schemaHash,\n {\n changeDescription: migration.description,\n },\n );\n // Reload after migration to get the new current\n const updated = await this.loadCurrentAndNext(name);\n if (updated.current) {\n this.cachedCurrent.set(name, updated.current.content);\n } else {\n this.cachedCurrent.delete(name);\n }\n if (updated.next) {\n this.cachedNext.set(name, {\n content: updated.next.content,\n activationDate: updated.next.activationDate,\n });\n } else {\n this.cachedNext.delete(name);\n }\n this.loaded.add(name);\n this.loadPromises.delete(name);\n this.notifySubscribers(name);\n return;\n }\n }\n\n const prev = this.cachedCurrent.get(name);\n const hadPrev = this.cachedCurrent.has(name);\n if (current) {\n this.cachedCurrent.set(name, current.content);\n } else {\n this.cachedCurrent.delete(name);\n }\n if (next) {\n this.cachedNext.set(name, {\n content: next.content,\n activationDate: next.activationDate,\n });\n } else {\n this.cachedNext.delete(name);\n }\n this.loaded.add(name);\n this.loadPromises.delete(name);\n\n if (\n hadPrev &&\n JSON.stringify(prev) !== JSON.stringify(this.cachedCurrent.get(name))\n ) {\n this.notifySubscribers(name);\n }\n }\n\n /**\n * Run migration with a distributed lock (Node.js only).\n * Ensures only one instance performs the migration while others wait.\n */\n protected async migrateWithLock(name: string): Promise<void> {\n const lockKey = `parameter:migrate:${name}`;\n const lockId = crypto.randomUUID();\n\n const value = await this.lockProvider.set(lockKey, lockId, true, 30_000);\n\n if (value === lockId) {\n // We got the lock — run migration\n try {\n await this.doLoad(name);\n } finally {\n await this.lockProvider.del(lockKey);\n }\n } else {\n // Another instance holds the lock — wait then load\n await this.waitForLock(lockKey);\n await this.doLoad(name);\n }\n }\n\n /**\n * Poll until a lock is released.\n */\n protected async waitForLock(lockKey: string): Promise<void> {\n const maxWait = 30_000;\n const start = this.dateTimeProvider.nowMillis();\n while (this.dateTimeProvider.nowMillis() - start < maxWait) {\n await this.dateTimeProvider.wait(200);\n const lockId = crypto.randomUUID();\n const value = await this.lockProvider.set(lockKey, lockId, true, 1000);\n if (value === lockId) {\n await this.lockProvider.del(lockKey);\n return;\n }\n }\n // Timeout — proceed anyway (lock expired or will expire)\n }\n\n /**\n * Attempt to migrate a DB value to the current schema.\n * Returns the migrated value if successful, or null if no migration needed.\n *\n * Cascade:\n * 1. Run user migrate() if provided\n * 2. Validate result against schema\n * 3. If invalid, shallow merge DB value with defaults\n * 4. Validate merged result\n * 5. If still invalid, use defaults\n */\n protected migrateValue(\n name: string,\n dbValue: unknown,\n dbSchemaHash: string,\n ): { value: unknown; description: string } | null {\n const schemaHash = this.schemaHashes.get(name) ?? \"\";\n const param = this.primitives.get(name);\n if (!param) {\n return null;\n }\n\n // No migration if schema hash matches\n if (dbSchemaHash === schemaHash) {\n return null;\n }\n\n const schema = param.schema;\n const defaults = param.options.default;\n\n // Step 1: Try user-provided migrate function\n if (param.options.migrate) {\n try {\n const migrated = param.options.migrate(dbValue);\n if (Value.Check(schema, migrated)) {\n if (JSON.stringify(migrated) === JSON.stringify(dbValue)) {\n return null;\n }\n return {\n value: migrated,\n description: \"Auto-migrated: user migration function\",\n };\n }\n this.log.warn(\n \"Parameter migrate() returned invalid value, falling through to merge\",\n { name },\n );\n } catch (err) {\n this.log.warn(\"Parameter migrate() threw, falling through to merge\", {\n name,\n error: err,\n });\n }\n }\n\n // Step 2: Strip unknown keys and check if DB value is valid for new schema\n const schemaKeys = new Set(Object.keys(schema.properties));\n const stripped = this.pickSchemaKeys(\n dbValue as Record<string, unknown>,\n schemaKeys,\n );\n\n if (Value.Check(schema, stripped)) {\n if (JSON.stringify(stripped) === JSON.stringify(dbValue)) {\n return null;\n }\n return {\n value: stripped,\n description: \"Auto-migrated: stripped unknown fields\",\n };\n }\n\n // Step 3: Shallow merge DB value with defaults, keeping only schema keys\n const merged = this.pickSchemaKeys(\n Object.assign(\n {},\n defaults as Record<string, unknown>,\n dbValue as Record<string, unknown>,\n ),\n schemaKeys,\n );\n\n if (Value.Check(schema, merged)) {\n return {\n value: merged,\n description: \"Auto-migrated: merged with defaults\",\n };\n }\n\n // Step 4: Full reset to defaults\n return {\n value: defaults,\n description: \"Auto-migrated: reset to defaults (schema incompatible)\",\n };\n }\n\n /**\n * Reload next version info in background (non-blocking).\n */\n protected reloadNextInBackground(name: string): void {\n this.loadCurrentAndNext(name)\n .then(({ next }) => {\n if (next) {\n this.cachedNext.set(name, {\n content: next.content,\n activationDate: next.activationDate,\n });\n } else {\n this.cachedNext.delete(name);\n }\n })\n .catch((err) => {\n this.log.warn(\"Failed to reload next parameter version\", {\n name,\n error: err,\n });\n });\n }\n\n /**\n * Notify all subscribers of a value change.\n */\n protected notifySubscribers(name: string): void {\n const subs = this.subscribers.get(name);\n if (!subs) return;\n const param = this.primitives.get(name);\n const value = this.cachedCurrent.has(name)\n ? this.cachedCurrent.get(name)\n : param?.options.default;\n for (const fn of subs) {\n fn(value);\n }\n }\n\n /**\n * Return a new object containing only keys present in the schema.\n */\n protected pickSchemaKeys(\n obj: Record<string, unknown>,\n schemaKeys: Set<string>,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of schemaKeys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n }\n\n /**\n * Calculate a hash of the schema for migration detection.\n * Uses CryptoProvider for proper SHA-256 hashing.\n */\n protected calculateSchemaHash(schema: TObject): string {\n return this.crypto.hash(JSON.stringify(schema));\n }\n\n /**\n * Publish change notification to other instances.\n */\n protected async publishChange(name: string): Promise<void> {\n await this.syncTopic.publish({\n name,\n instanceId: this.instanceId,\n });\n }\n\n /**\n * Handle incoming change notification from other instances.\n * Reloads the parameter from DB.\n */\n protected async handleChangeNotification(\n payload: ParameterChangePayload,\n ): Promise<void> {\n // Ignore messages from self\n if (payload.instanceId === this.instanceId) {\n return;\n }\n\n if (!this.primitives.has(payload.name)) {\n return;\n }\n\n await this.load(payload.name);\n }\n\n /**\n * Build tree structure from dot-notation names.\n */\n protected buildTree(names: string[]): ParameterTreeNode[] {\n const root: ParameterTreeNode[] = [];\n\n for (const name of names) {\n const parts = name.split(\".\");\n let currentLevel = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLeaf = i === parts.length - 1;\n const path = parts.slice(0, i + 1).join(\".\");\n\n let existing = currentLevel.find((n) => n.name === part);\n\n if (!existing) {\n existing = {\n name: part,\n path,\n isLeaf,\n children: [],\n };\n currentLevel.push(existing);\n }\n\n if (isLeaf) {\n existing.isLeaf = true;\n }\n\n currentLevel = existing.children;\n }\n }\n\n return root;\n }\n}\n\nexport interface SaveParameterOptions {\n activationDate?: Date;\n changeDescription?: string;\n tags?: string[];\n creatorId?: string;\n creatorName?: string;\n}\n","import { $inject, AlephaError, t } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action } from \"alepha/server\";\nimport { activateParameterBodySchema } from \"../schemas/activateParameterBodySchema.ts\";\nimport { createParameterVersionBodySchema } from \"../schemas/createParameterVersionBodySchema.ts\";\nimport { parameterCurrentResponseSchema } from \"../schemas/parameterCurrentResponseSchema.ts\";\nimport { parameterHistoryResponseSchema } from \"../schemas/parameterHistoryResponseSchema.ts\";\nimport { parameterNameParamSchema } from \"../schemas/parameterNameParamSchema.ts\";\nimport { parameterNamesResponseSchema } from \"../schemas/parameterNamesResponseSchema.ts\";\nimport { parameterResponseSchema } from \"../schemas/parameterResponseSchema.ts\";\nimport { parameterTreeNodeSchema } from \"../schemas/parameterTreeNodeSchema.ts\";\nimport { parameterVersionParamSchema } from \"../schemas/parameterVersionParamSchema.ts\";\nimport { parameterVersionResponseSchema } from \"../schemas/parameterVersionResponseSchema.ts\";\nimport { rollbackParameterBodySchema } from \"../schemas/rollbackParameterBodySchema.ts\";\nimport { ParameterProvider } from \"../services/ParameterProvider.ts\";\n\n/**\n * REST API controller for versioned parameter management.\n *\n * Provides endpoints for:\n * - Listing all parameters (tree view support)\n * - Getting parameter history (all versions with calculated status)\n * - Getting current/next parameter values\n * - Creating new parameter versions (immediate or scheduled)\n * - Rolling back to previous versions\n * - Activating scheduled versions immediately\n */\nexport class AdminParameterController {\n protected readonly url = \"/parameters\";\n protected readonly group = \"admin:parameters\";\n protected readonly provider = $inject(ParameterProvider);\n\n /**\n * Get tree structure of all parameter names.\n * Useful for admin UI navigation.\n */\n getParameterTree = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get tree structure of all parameter names for navigation.\",\n path: \"/parameters/tree\",\n method: \"GET\",\n schema: {\n response: t.array(parameterTreeNodeSchema),\n },\n handler: async () => {\n return this.provider.getParameterTree();\n },\n });\n\n /**\n * List all unique parameter names.\n */\n listParameterNames = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"List all unique parameter names.\",\n path: \"/parameters\",\n method: \"GET\",\n schema: {\n response: parameterNamesResponseSchema,\n },\n handler: async () => {\n const names = await this.provider.getParameterNames();\n return { names };\n },\n });\n\n /**\n * Get version history for a specific parameter.\n * Returns all versions with calculated status.\n */\n getHistory = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get all versions of a specific parameter.\",\n path: \"/parameters/:name/history\",\n method: \"GET\",\n schema: {\n params: parameterNameParamSchema,\n response: parameterHistoryResponseSchema,\n },\n handler: async ({ params }) => {\n const rawVersions = await this.provider.getHistory(params.name);\n const versions = this.provider.calculateStatuses(rawVersions);\n return { versions };\n },\n });\n\n /**\n * Get current and next values for a parameter.\n * Includes defaultValue and currentValue from the registered primitive\n * even if no versions exist in the database yet.\n */\n getCurrent = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get current and next scheduled values for a parameter.\",\n path: \"/parameters/:name\",\n method: \"GET\",\n schema: {\n params: parameterNameParamSchema,\n response: parameterCurrentResponseSchema,\n },\n handler: async ({ params }) => {\n const result = await this.provider.getCurrentWithDefault(params.name);\n return {\n current: result.current ?? undefined,\n next: result.next ?? undefined,\n defaultValue: result.defaultValue ?? undefined,\n currentValue: result.currentValue ?? undefined,\n schema: result.schema ?? undefined,\n };\n },\n });\n\n /**\n * Get a specific version of a parameter.\n */\n getVersion = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get a specific version of a parameter.\",\n path: \"/parameters/:name/versions/:version\",\n method: \"GET\",\n schema: {\n params: parameterVersionParamSchema,\n response: parameterVersionResponseSchema,\n },\n handler: async ({ params }) => {\n const version = await this.provider.getVersion(\n params.name,\n params.version,\n );\n if (!version) {\n return { parameter: undefined };\n }\n const [withStatus] = this.provider.calculateStatuses([version]);\n return { parameter: withStatus };\n },\n });\n\n /**\n * Create a new parameter version.\n */\n createVersion = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:create\"] })],\n description:\n \"Create a new version of a parameter (immediate or scheduled).\",\n path: \"/parameters/:name\",\n method: \"POST\",\n schema: {\n params: parameterNameParamSchema,\n body: createParameterVersionBodySchema,\n response: parameterResponseSchema,\n },\n handler: async ({ params, body }) => {\n return this.provider.save(params.name, body.content, body.schemaHash, {\n activationDate: body.activationDate\n ? new Date(body.activationDate)\n : undefined,\n changeDescription: body.changeDescription,\n tags: body.tags,\n creatorId: body.creatorId,\n creatorName: body.creatorName,\n });\n },\n });\n\n /**\n * Rollback to a previous version.\n */\n rollback = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:rollback\"] })],\n description:\n \"Rollback a parameter to a previous version (creates new version with old content).\",\n path: \"/parameters/:name/rollback\",\n method: \"POST\",\n schema: {\n params: parameterNameParamSchema,\n body: rollbackParameterBodySchema,\n response: parameterResponseSchema,\n },\n handler: async ({ params, body }) => {\n return this.provider.rollback(params.name, body.targetVersion, {\n changeDescription: body.changeDescription,\n creatorId: body.creatorId,\n creatorName: body.creatorName,\n });\n },\n });\n\n /**\n * Activate a scheduled version immediately.\n * Creates a new version with the same content but immediate activation.\n */\n activateNow = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:activate\"] })],\n description: \"Activate a future/next parameter version immediately.\",\n path: \"/parameters/:name/activate\",\n method: \"POST\",\n schema: {\n params: parameterNameParamSchema,\n body: activateParameterBodySchema,\n response: parameterResponseSchema,\n },\n handler: async ({ params, body }) => {\n const allVersions = await this.provider.getHistory(params.name);\n const withStatuses = this.provider.calculateStatuses(allVersions);\n const target = withStatuses.find((v) => v.version === body.version);\n\n if (!target) {\n throw new AlephaError(\n `Version ${body.version} not found for parameter ${params.name}`,\n );\n }\n\n if (target.status === \"current\") {\n return target;\n }\n\n if (target.status === \"expired\") {\n throw new AlephaError(\n \"Cannot activate an expired version. Use rollback instead.\",\n );\n }\n\n // Create new version with same content but immediate activation\n return this.provider.save(\n params.name,\n target.content,\n target.schemaHash,\n {\n changeDescription: `Early activation of version ${body.version}`,\n creatorId: body.creatorId,\n creatorName: body.creatorName,\n },\n );\n },\n });\n}\n","import {\n $inject,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n} from \"alepha\";\nimport type { UserAccount } from \"alepha/security\";\nimport { ParameterProvider } from \"../services/ParameterProvider.ts\";\n\n/**\n * Creates a versioned parameter primitive for managing application settings.\n *\n * Provides type-safe, versioned configuration with:\n * - Schema validation with auto-migration detection\n * - Default values for initial state\n * - Status derived from activationDate (no stored status)\n * - Database persistence with full version history\n * - Cross-instance notification via topic\n * - Tree view support via dot-notation naming (e.g., \"app.features.flags\")\n * - Async `.get()` with lazy loading (works in Node and Cloudflare Workers)\n *\n * @example\n * ```ts\n * class AppConfig {\n * features = $parameter({\n * name: \"app.features.flags\",\n * schema: t.object({\n * enableBeta: t.boolean(),\n * maxUploadSize: t.number()\n * }),\n * default: { enableBeta: false, maxUploadSize: 10485760 }\n * });\n *\n * async checkBeta() {\n * const config = await this.features.get();\n * return config.enableBeta;\n * }\n *\n * async enableBeta() {\n * await this.features.set({ enableBeta: true, maxUploadSize: 20971520 });\n * }\n * }\n * ```\n */\nexport interface ParameterPrimitiveOptions<T extends TObject> {\n /**\n * Parameter name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name?: string;\n\n /**\n * Human-readable description of the parameter.\n */\n description?: string;\n\n /**\n * TypeBox schema defining the parameter structure.\n */\n schema: T;\n\n /**\n * Default value used when no parameter exists in database.\n */\n default: Static<T>;\n\n /**\n * Optional migration function for schema changes.\n * Receives the raw DB value and returns a transformed value matching the new schema.\n * Runs before validation — if the result is valid, it's used directly.\n * If not provided or returns an invalid value, falls through to merge/default cascade.\n */\n migrate?: (old: unknown) => Static<T>;\n}\n\nexport class ParameterPrimitive<T extends TObject> extends Primitive<\n ParameterPrimitiveOptions<T>\n> {\n protected readonly provider = $inject(ParameterProvider);\n\n /**\n * Parameter name (uses property key if not specified).\n */\n public get name(): string {\n return this.options.name || this.config.propertyKey;\n }\n\n /**\n * The TypeBox schema for this parameter.\n */\n public get schema(): T {\n return this.options.schema;\n }\n\n /**\n * Get the cached current content, falling back to default.\n * Synchronous access for admin API.\n */\n public get cachedCurrentContent(): Static<T> {\n return this.provider.getCachedCurrentContent(this.name) as Static<T>;\n }\n\n /**\n * Whether the parameter is using its default value (no DB value loaded).\n */\n public get isUsingDefault(): boolean {\n return this.provider.isUsingDefault(this.name);\n }\n\n /**\n * Get the current parameter value asynchronously.\n * Lazy-loads from database on first call.\n * Checks if a cached next version has become current.\n */\n public get(): Promise<Static<T>> {\n return this.provider.get(this.name) as Promise<Static<T>>;\n }\n\n /**\n * Load current and next values from database.\n */\n public async load(): Promise<void> {\n await this.provider.load(this.name);\n }\n\n /**\n * Set a new parameter value.\n *\n * @param value - The new parameter value\n * @param options - Optional settings (activation date, creator info, etc.)\n */\n public async set(\n value: Static<T>,\n options: SetParameterOptions = {},\n ): Promise<void> {\n await this.provider.set(this.name, value, {\n activationDate: options.activationDate,\n changeDescription: options.changeDescription,\n tags: options.tags,\n creatorId: options.user?.id,\n creatorName: options.user?.name ?? options.user?.email,\n });\n }\n\n /**\n * Subscribe to parameter changes.\n * Returns an unsubscribe function.\n */\n public sub(fn: (curr: Static<T>) => void): () => void {\n return this.provider.sub(this.name, fn as (v: unknown) => void);\n }\n\n /**\n * Reload parameter from database.\n * Called when sync notification received or for manual refresh.\n */\n public async reload(): Promise<void> {\n await this.provider.load(this.name);\n }\n\n /**\n * Get version history for this parameter.\n */\n public async getHistory() {\n return this.provider.getHistory(this.name);\n }\n\n /**\n * Rollback to a specific version.\n */\n public async rollback(\n version: number,\n options?: SetParameterOptions,\n ): Promise<void> {\n await this.provider.rollback(this.name, version, {\n changeDescription: options?.changeDescription,\n creatorId: options?.user?.id,\n creatorName: options?.user?.name ?? options?.user?.email,\n });\n await this.provider.load(this.name);\n }\n\n /**\n * Called after primitive creation to register with provider.\n */\n protected onInit(): void {\n this.provider.register(this);\n }\n}\n\nexport const $parameter = <T extends TObject>(\n options: ParameterPrimitiveOptions<T>,\n) => {\n return createPrimitive(ParameterPrimitive<T>, options);\n};\n\n$parameter[KIND] = ParameterPrimitive;\n\nexport interface SetParameterOptions {\n /**\n * User making the change (for audit trail).\n */\n user?: Pick<UserAccount, \"id\" | \"email\" | \"name\">;\n\n /**\n * When this parameter should become active.\n * Default is immediate (now).\n */\n activationDate?: Date;\n\n /**\n * Description of the change.\n */\n changeDescription?: string;\n\n /**\n * Tags for filtering/categorization.\n */\n tags?: string[];\n}\n","import { $module } from \"alepha\";\nimport { AdminParameterController } from \"./controllers/AdminParameterController.ts\";\nimport { $parameter } from \"./primitives/$parameter.ts\";\nimport { ParameterProvider } from \"./services/ParameterProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Controller exports\nexport * from \"./controllers/AdminParameterController.ts\";\n// Entity exports\nexport * from \"./entities/parameters.ts\";\n// Primitive exports\nexport * from \"./primitives/$parameter.ts\";\n// Schema exports (types for UI)\nexport * from \"./schemas/activateParameterBodySchema.ts\";\nexport * from \"./schemas/createParameterVersionBodySchema.ts\";\nexport * from \"./schemas/parameterCurrentResponseSchema.ts\";\nexport * from \"./schemas/parameterHistoryResponseSchema.ts\";\nexport * from \"./schemas/parameterNameParamSchema.ts\";\nexport * from \"./schemas/parameterNamesResponseSchema.ts\";\nexport * from \"./schemas/parameterResponseSchema.ts\";\nexport * from \"./schemas/parameterStatusSchema.ts\";\nexport * from \"./schemas/parameterTreeNodeSchema.ts\";\nexport * from \"./schemas/parameterVersionParamSchema.ts\";\nexport * from \"./schemas/parameterVersionResponseSchema.ts\";\nexport * from \"./schemas/rollbackParameterBodySchema.ts\";\n// Service exports\nexport * from \"./services/ParameterProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Application parameter management.\n *\n * **Features:**\n * - Versioned parameter definitions\n * - Status derived from activationDate at query time\n * - Schema validation with migration detection\n * - Cross-instance notification via pub/sub\n * - Async `.get()` with lazy loading (works in Node and Cloudflare Workers)\n *\n * @module alepha.api.parameters\n */\nexport const AlephaApiParameters = $module({\n name: \"alepha.api.parameters\",\n primitives: [$parameter],\n services: [ParameterProvider, AdminParameterController],\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/api/parameters/entities/parameters.ts","../../../src/api/parameters/schemas/activateParameterBodySchema.ts","../../../src/api/parameters/schemas/createParameterVersionBodySchema.ts","../../../src/api/parameters/schemas/parameterStatusSchema.ts","../../../src/api/parameters/schemas/parameterResponseSchema.ts","../../../src/api/parameters/schemas/parameterCurrentResponseSchema.ts","../../../src/api/parameters/schemas/parameterHistoryResponseSchema.ts","../../../src/api/parameters/schemas/parameterNameParamSchema.ts","../../../src/api/parameters/schemas/parameterNamesResponseSchema.ts","../../../src/api/parameters/schemas/parameterTreeNodeSchema.ts","../../../src/api/parameters/schemas/parameterVersionParamSchema.ts","../../../src/api/parameters/schemas/parameterVersionResponseSchema.ts","../../../src/api/parameters/schemas/rollbackParameterBodySchema.ts","../../../src/api/parameters/services/ParameterProvider.ts","../../../src/api/parameters/controllers/AdminParameterController.ts","../../../src/api/parameters/primitives/$parameter.ts","../../../src/api/parameters/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\n/**\n * Configuration parameter entity for versioned configuration management.\n *\n * Stores all versions of configuration parameters with:\n * - Status derived from activationDate at query time\n * - Schema versioning for migrations\n * - Activation scheduling\n * - Audit trail (creator info)\n */\nexport const parameters = $entity({\n name: \"parameters\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n /**\n * Configuration name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name: t.text(),\n\n /**\n * The configuration content as JSON.\n */\n content: t.json(),\n\n /**\n * Schema version hash for detecting schema changes.\n * Used for auto-migration when schema evolves.\n */\n schemaHash: t.text(),\n\n /**\n * When this version should become active.\n * Default is immediate (now).\n */\n activationDate: t.datetime(),\n\n /**\n * Version number for this configuration.\n * Auto-incremented per config name.\n */\n version: t.integer(),\n\n /**\n * Optional description of changes in this version.\n */\n changeDescription: t.optional(t.text()),\n\n /**\n * Optional tags for filtering/categorization.\n */\n tags: t.optional(t.array(t.text())),\n\n /**\n * Creator user ID (if available).\n */\n creatorId: t.optional(t.uuid()),\n\n /**\n * Creator display name for audit trail.\n */\n creatorName: t.optional(t.text()),\n\n /**\n * Previous content before this change (for rollback reference).\n */\n previousContent: t.optional(t.json()),\n\n /**\n * Migration log if schema changed.\n */\n migrationLog: t.optional(t.text()),\n }),\n indexes: [\n { columns: [\"name\", \"activationDate\"] },\n { columns: [\"name\", \"version\"], unique: true },\n { columns: [\"activationDate\"] },\n ],\n});\n\nexport type Parameter = Static<typeof parameters.schema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Activate parameter body schema.\n * Uses t.pick for version and creator fields.\n */\nexport const activateParameterBodySchema = t.pick(parameters.schema, [\n \"version\",\n \"creatorId\",\n \"creatorName\",\n]);\n\nexport type ActivateParameterBody = Static<typeof activateParameterBodySchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Create parameter version body schema.\n * Uses t.pick to derive from entity, with required fields made non-optional.\n */\nexport const createParameterVersionBodySchema = t.extend(\n t.pick(parameters.schema, [\n \"content\",\n \"schemaHash\",\n \"changeDescription\",\n \"tags\",\n \"creatorId\",\n \"creatorName\",\n ]),\n {\n activationDate: t.optional(\n t.datetime({ description: \"When to activate (default: now)\" }),\n ),\n },\n);\n\nexport type CreateParameterVersionBody = Static<\n typeof createParameterVersionBodySchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter status enum schema.\n */\nexport const parameterStatusSchema = t.enum([\n \"expired\",\n \"current\",\n \"next\",\n \"future\",\n]);\n\nexport type ParameterStatus = Static<typeof parameterStatusSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\nimport { parameterStatusSchema } from \"./parameterStatusSchema.ts\";\n\n/**\n * Parameter response schema for API responses.\n * Extends the entity schema with a calculated status field.\n * Status is derived from activationDate at query time, not stored.\n */\nexport const parameterResponseSchema = t.extend(parameters.schema, {\n status: parameterStatusSchema,\n});\n\nexport type ParameterResponse = Static<typeof parameterResponseSchema>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Current parameter response schema.\n * Includes current version, next scheduled version, and defaults.\n */\nexport const parameterCurrentResponseSchema = t.object({\n current: t.optional(parameterResponseSchema),\n next: t.optional(parameterResponseSchema),\n defaultValue: t.optional(t.json()),\n currentValue: t.optional(t.json()),\n schema: t.optional(t.json()),\n});\n\nexport type ParameterCurrentResponse = Static<\n typeof parameterCurrentResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter history response schema.\n */\nexport const parameterHistoryResponseSchema = t.object({\n versions: t.array(parameterResponseSchema),\n});\n\nexport type ParameterHistoryResponse = Static<\n typeof parameterHistoryResponseSchema\n>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterNameParamSchema = t.pick(parameters.schema, [\"name\"]);\n","import { type Static, t } from \"alepha\";\n\n/**\n * Parameter names list response schema.\n */\nexport const parameterNamesResponseSchema = t.object({\n names: t.array(t.text()),\n});\n\nexport type ParameterNamesResponse = Static<\n typeof parameterNamesResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\n\n/**\n * Tree node schema for parameter tree navigation.\n */\nexport const parameterTreeNodeSchema = t.object({\n name: t.text(),\n path: t.text(),\n isLeaf: t.boolean(),\n children: t.array(t.any()),\n});\n\nexport type ParameterTreeNode = Static<typeof parameterTreeNodeSchema>;\n","import { t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Parameter name and version param schema.\n * Uses t.pick from entity for consistency.\n */\nexport const parameterVersionParamSchema = t.pick(parameters.schema, [\n \"name\",\n \"version\",\n]);\n","import { type Static, t } from \"alepha\";\nimport { parameterResponseSchema } from \"./parameterResponseSchema.ts\";\n\n/**\n * Parameter version response schema.\n */\nexport const parameterVersionResponseSchema = t.object({\n parameter: t.optional(parameterResponseSchema),\n});\n\nexport type ParameterVersionResponse = Static<\n typeof parameterVersionResponseSchema\n>;\n","import { type Static, t } from \"alepha\";\nimport { parameters } from \"../entities/parameters.ts\";\n\n/**\n * Rollback parameter body schema.\n * Uses t.pick for creator fields, adds targetVersion.\n */\nexport const rollbackParameterBodySchema = t.extend(\n t.pick(parameters.schema, [\"changeDescription\", \"creatorId\", \"creatorName\"]),\n {\n targetVersion: t.integer({\n description: \"Version number to rollback to\",\n }),\n },\n);\n\nexport type RollbackParameterBody = Static<typeof rollbackParameterBodySchema>;\n","import {\n $hook,\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TObject,\n t,\n Value,\n} from \"alepha\";\nimport { CryptoProvider } from \"alepha/crypto\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LockProvider } from \"alepha/lock\";\nimport { $logger } from \"alepha/logger\";\nimport { $repository } from \"alepha/orm\";\nimport { $topic } from \"alepha/topic\";\nimport { type Parameter, parameters } from \"../entities/parameters.ts\";\nimport type { ParameterPrimitive } from \"../primitives/$parameter.ts\";\nimport type { ParameterStatus } from \"../schemas/parameterStatusSchema.ts\";\nimport type { ParameterTreeNode } from \"../schemas/parameterTreeNodeSchema.ts\";\n\n/**\n * Payload for parameter change events across instances.\n */\nexport interface ParameterChangePayload {\n name: string;\n instanceId: string;\n}\n\n/**\n * A parameter with a calculated status field.\n */\nexport type ParameterWithStatus = Parameter & { status: ParameterStatus };\n\n/**\n * ParameterProvider manages versioned parameter persistence, caching,\n * migration, and synchronization.\n *\n * Features:\n * - Stores all parameter versions in the database\n * - Derives status from activationDate at query time (no stored status)\n * - Provides cross-instance notification via topic\n * - Supports schema migrations via hash comparison\n * - Manages per-parameter caching, loading, and subscriber notification\n */\nexport class ParameterProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly crypto = $inject(CryptoProvider);\n protected readonly lockProvider = $inject(LockProvider);\n protected readonly repo = $repository(parameters);\n\n /**\n * Unique identifier for this instance (to avoid self-updates).\n */\n protected get instanceId(): string {\n this._instanceId ??= this.crypto.randomUUID();\n return this._instanceId;\n }\n\n protected _instanceId: string | undefined;\n\n /**\n * In-memory cache of registered parameter primitives.\n */\n protected readonly primitives = new Map<string, ParameterPrimitive<any>>();\n\n /**\n * In-memory cached current content per parameter.\n */\n protected readonly cachedCurrent = new Map<string, unknown>();\n\n /**\n * In-memory cached next version info per parameter.\n */\n protected readonly cachedNext = new Map<\n string,\n { content: unknown; activationDate: string }\n >();\n\n /**\n * Set of parameter names that have completed initial load.\n */\n protected readonly loaded = new Set<string>();\n\n /**\n * Shared promises for deduplicating concurrent load() calls.\n */\n protected readonly loadPromises = new Map<string, Promise<void>>();\n\n /**\n * Subscriber callbacks per parameter name.\n */\n protected readonly subscribers = new Map<\n string,\n Array<(v: unknown) => void>\n >();\n\n /**\n * Set of parameter names that have already been checked for migration.\n */\n protected readonly migrationChecked = new Set<string>();\n\n /**\n * Computed schema hashes per parameter name.\n */\n protected readonly schemaHashes = new Map<string, string>();\n\n /**\n * Pre-load all registered parameters on ready (non-serverless only).\n */\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n if (this.alepha.isServerless()) {\n return;\n }\n for (const name of this.primitives.keys()) {\n await this.migrateWithLock(name);\n }\n },\n });\n\n /**\n * Topic for cross-instance change notification.\n * Payload is minimal — receivers call load() to fetch fresh data.\n */\n public readonly syncTopic = $topic({\n name: \"parameter:sync\",\n schema: {\n payload: t.object({\n name: t.text(),\n instanceId: t.text(),\n }),\n },\n handler: async ({ payload }) => {\n await this.handleChangeNotification(payload as ParameterChangePayload);\n },\n });\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n /**\n * Register a parameter primitive with the provider.\n * Computes and stores the schema hash.\n */\n public register(param: ParameterPrimitive<any>): void {\n this.primitives.set(param.name, param);\n this.schemaHashes.set(param.name, this.calculateSchemaHash(param.schema));\n }\n\n // ---------------------------------------------------------------------------\n // Public API used by $parameter primitive (thin delegates)\n // ---------------------------------------------------------------------------\n\n /**\n * Get the current parameter value asynchronously.\n * Lazy-loads from database on first call.\n * Checks if a cached next version has become current.\n */\n public async get(name: string): Promise<unknown> {\n if (!this.loaded.has(name)) {\n if (!this.loadPromises.has(name)) {\n this.loadPromises.set(name, this.doLoad(name));\n }\n await this.loadPromises.get(name);\n }\n\n // Check if cached next has become current\n const cachedNext = this.cachedNext.get(name);\n if (cachedNext) {\n const now = this.dateTimeProvider.now().toDate();\n if (new Date(cachedNext.activationDate) <= now) {\n this.cachedCurrent.set(name, cachedNext.content);\n this.cachedNext.delete(name);\n this.reloadNextInBackground(name);\n }\n }\n\n const param = this.primitives.get(name);\n return this.cachedCurrent.has(name)\n ? this.cachedCurrent.get(name)\n : param?.options.default;\n }\n\n /**\n * Set a new parameter value.\n */\n public async set(\n name: string,\n value: unknown,\n options: SaveParameterOptions = {},\n ): Promise<void> {\n const schemaHash = this.schemaHashes.get(name) ?? \"\";\n\n await this.save(name, value as Record<string, unknown>, schemaHash, {\n activationDate: options.activationDate,\n changeDescription: options.changeDescription,\n tags: options.tags,\n creatorId: options.creatorId,\n creatorName: options.creatorName,\n });\n\n // Update local cache\n const now = this.dateTimeProvider.now().toDate();\n if (!options.activationDate || options.activationDate <= now) {\n const prev = this.cachedCurrent.get(name);\n this.cachedCurrent.set(name, value);\n if (JSON.stringify(prev) !== JSON.stringify(value)) {\n this.notifySubscribers(name);\n }\n } else {\n this.cachedNext.set(name, {\n content: value,\n activationDate: options.activationDate.toISOString(),\n });\n }\n }\n\n /**\n * Subscribe to parameter changes.\n * Returns an unsubscribe function.\n */\n public sub(name: string, fn: (v: unknown) => void): () => void {\n if (!this.subscribers.has(name)) {\n this.subscribers.set(name, []);\n }\n this.subscribers.get(name)!.push(fn);\n return () => {\n const subs = this.subscribers.get(name);\n if (subs) {\n const idx = subs.indexOf(fn);\n if (idx >= 0) {\n subs.splice(idx, 1);\n }\n }\n };\n }\n\n /**\n * Load current and next values from database.\n * Deduplicates concurrent calls via shared promise.\n */\n public async load(name: string): Promise<void> {\n this.loadPromises.set(name, this.doLoad(name));\n await this.loadPromises.get(name);\n }\n\n /**\n * Get the cached current content, falling back to default.\n * Synchronous access for admin API.\n */\n public getCachedCurrentContent(name: string): unknown {\n if (this.cachedCurrent.has(name)) {\n return this.cachedCurrent.get(name);\n }\n const param = this.primitives.get(name);\n return param?.options.default;\n }\n\n /**\n * Whether the parameter is using its default value (no DB value loaded).\n */\n public isUsingDefault(name: string): boolean {\n return !this.cachedCurrent.has(name);\n }\n\n // ---------------------------------------------------------------------------\n // Database operations\n // ---------------------------------------------------------------------------\n\n /**\n * Load the current and next parameter values from database.\n * Current: latest version with activationDate <= now.\n * Next: earliest version with activationDate > now.\n */\n public async loadCurrentAndNext(\n name: string,\n ): Promise<{ current: Parameter | null; next: Parameter | null; now: Date }> {\n const now = this.dateTimeProvider.now().toDate();\n const nowIso = now.toISOString();\n\n const [currentRows, nextRows] = await Promise.all([\n this.repo.findMany({\n where: { name, activationDate: { lte: nowIso } },\n orderBy: { column: \"activationDate\", direction: \"desc\" },\n limit: 2,\n }),\n this.repo.findMany({\n where: { name, activationDate: { gt: nowIso } },\n orderBy: { column: \"activationDate\", direction: \"asc\" },\n limit: 1,\n }),\n ]);\n\n // Secondary sort by version descending for same-millisecond ties\n const current =\n currentRows.length > 1 &&\n new Date(currentRows[0].activationDate).getTime() ===\n new Date(currentRows[1].activationDate).getTime()\n ? [...currentRows].sort((a, b) => b.version - a.version)[0]\n : (currentRows[0] ?? null);\n\n return {\n current: current ?? null,\n next: nextRows[0] ?? null,\n now,\n };\n }\n\n /**\n * Calculate statuses for a list of parameter versions.\n * Derives status from activationDate relative to now:\n * - The latest version with activationDate <= now is \"current\"\n * - The earliest version with activationDate > now is \"next\"\n * - Other future versions are \"future\"\n * - Other past versions are \"expired\"\n */\n public calculateStatuses(\n versions: Parameter[],\n now?: Date,\n ): ParameterWithStatus[] {\n const effectiveNow = now ?? this.dateTimeProvider.now().toDate();\n\n // Sort by activationDate ascending, then version ascending for ties\n const sorted = [...versions].sort((a, b) => {\n const timeDiff =\n new Date(a.activationDate).getTime() -\n new Date(b.activationDate).getTime();\n if (timeDiff !== 0) return timeDiff;\n return a.version - b.version;\n });\n\n // Find which should be current (latest activated)\n const pastVersions = sorted.filter(\n (v) => new Date(v.activationDate) <= effectiveNow,\n );\n const futureVersions = sorted.filter(\n (v) => new Date(v.activationDate) > effectiveNow,\n );\n\n const currentVersion = pastVersions[pastVersions.length - 1];\n const nextVersion = futureVersions[0];\n\n return sorted.map((v) => {\n let status: ParameterStatus;\n if (currentVersion && v.id === currentVersion.id) {\n status = \"current\";\n } else if (nextVersion && v.id === nextVersion.id) {\n status = \"next\";\n } else if (new Date(v.activationDate) > effectiveNow) {\n status = \"future\";\n } else {\n status = \"expired\";\n }\n return { ...v, status };\n });\n }\n\n /**\n * Save a new parameter version.\n *\n * @param name - Parameter name (e.g., \"app.features.flags\")\n * @param content - New parameter content\n * @param schemaHash - Hash of the schema for migration detection\n * @param options - Additional options (activation date, creator info, etc.)\n */\n public async save<T extends TObject>(\n name: string,\n content: Static<T>,\n schemaHash: string,\n options: SaveParameterOptions = {},\n ): Promise<ParameterWithStatus> {\n // Resolve empty schema hash from registered primitive\n if (!schemaHash) {\n schemaHash = this.schemaHashes.get(name) ?? \"\";\n }\n\n const now = this.dateTimeProvider.now().toDate();\n const activationDate = options.activationDate ?? now;\n const isImmediate = activationDate <= now;\n\n // Get all versions to determine next version number and previous content\n const versions = await this.repo.findMany({\n where: { name },\n orderBy: { column: \"version\", direction: \"desc\" },\n });\n\n const latestVersion = versions[0];\n const newVersion = (latestVersion?.version ?? 0) + 1;\n\n // Find previous content from the latest activated version\n const currentVersion = versions.find(\n (v) => new Date(v.activationDate) <= now,\n );\n const previousContent = currentVersion?.content;\n\n // Check for schema migration\n let migrationLog: string | undefined;\n if (latestVersion && latestVersion.schemaHash !== schemaHash) {\n migrationLog = `Schema changed from ${latestVersion.schemaHash} to ${schemaHash} at version ${newVersion}`;\n this.log.info(\"Parameter schema migration detected\", {\n name,\n migrationLog,\n });\n }\n\n // Insert new version\n const inserted = await this.repo.create({\n name,\n content: content as Record<string, unknown>,\n schemaHash,\n activationDate: activationDate.toISOString(),\n version: newVersion,\n changeDescription: options.changeDescription,\n tags: options.tags,\n creatorId: options.creatorId,\n creatorName: options.creatorName,\n previousContent: previousContent as Record<string, unknown> | undefined,\n migrationLog,\n });\n\n // Calculate status from existing versions + the newly inserted row\n const withStatuses = this.calculateStatuses([...versions, inserted]);\n const insertedWithStatus = withStatuses.find((v) => v.id === inserted.id)!;\n\n // Publish change notification if activation is immediate\n if (isImmediate) {\n await this.publishChange(name);\n }\n\n this.log.info(\"Parameter saved\", {\n name,\n version: newVersion,\n status: insertedWithStatus.status,\n });\n\n return insertedWithStatus;\n }\n\n /**\n * Get all versions of a parameter.\n */\n public async getHistory(name: string): Promise<Parameter[]> {\n return this.repo.findMany({\n where: { name },\n orderBy: { column: \"version\", direction: \"desc\" },\n });\n }\n\n /**\n * Get a specific version of a parameter.\n */\n public async getVersion(\n name: string,\n version: number,\n ): Promise<Parameter | null> {\n const versions = await this.repo.findMany({\n where: { name, version },\n });\n return versions[0] ?? null;\n }\n\n /**\n * Rollback to a previous version by creating a new version with old content.\n */\n public async rollback(\n name: string,\n targetVersion: number,\n options: SaveParameterOptions = {},\n ): Promise<ParameterWithStatus> {\n const target = await this.getVersion(name, targetVersion);\n\n if (!target) {\n throw new AlephaError(\n `Parameter version not found: ${name}@${targetVersion}`,\n );\n }\n\n return this.save(\n name,\n target.content as Static<TObject>,\n target.schemaHash,\n {\n ...options,\n changeDescription:\n options.changeDescription ?? `Rollback to version ${targetVersion}`,\n },\n );\n }\n\n /**\n * Get current parameter value with fallback to default from registered primitive.\n * Returns the in-memory current value which may be the default if never saved.\n */\n public getCurrentValue(\n name: string,\n ): { content: unknown; isDefault: boolean } | null {\n if (!this.primitives.has(name)) {\n return null;\n }\n return {\n content: this.getCachedCurrentContent(name),\n isDefault: this.isUsingDefault(name),\n };\n }\n\n /**\n * Get parameter info including current value with default fallback.\n */\n public async getCurrentWithDefault(name: string): Promise<{\n current: ParameterWithStatus | null;\n next: ParameterWithStatus | null;\n defaultValue: unknown | null;\n currentValue: unknown | null;\n schema: TObject | null;\n }> {\n const { current, next } = await this.loadCurrentAndNext(name);\n\n // Get default and current from registered primitive\n const param = this.primitives.get(name);\n const defaultValue = param?.options.default ?? null;\n const currentValue = this.getCachedCurrentContent(name) ?? null;\n const schema = param?.schema ?? null;\n\n return {\n current: current ? { ...current, status: \"current\" as const } : null,\n next: next ? { ...next, status: \"next\" as const } : null,\n defaultValue,\n currentValue,\n schema,\n };\n }\n\n /**\n * Get all unique parameter names (for tree view).\n */\n public async getParameterNames(): Promise<string[]> {\n const results = await this.repo.findMany({\n columns: [\"name\"],\n distinct: [\"name\"],\n orderBy: { column: \"name\", direction: \"asc\" },\n });\n\n return results.map((r) => r.name);\n }\n\n /**\n * Build a tree structure from parameter names for UI.\n * Includes both database parameters and registered (but not yet saved) parameters.\n */\n public async getParameterTree(): Promise<ParameterTreeNode[]> {\n const dbNames = await this.getParameterNames();\n const registeredNames = Array.from(this.primitives.keys());\n const allNames = [...new Set([...dbNames, ...registeredNames])].sort();\n return this.buildTree(allNames);\n }\n\n // ---------------------------------------------------------------------------\n // Internal: loading, migration, notification\n // ---------------------------------------------------------------------------\n\n /**\n * Internal load implementation.\n * Fetches current and next from database, updates cache.\n */\n protected async doLoad(name: string): Promise<void> {\n const { current, next } = await this.loadCurrentAndNext(name);\n const schemaHash = this.schemaHashes.get(name) ?? \"\";\n\n // Check if migration is needed\n if (current && !this.migrationChecked.has(name)) {\n this.migrationChecked.add(name);\n const migration = this.migrateValue(\n name,\n current.content,\n current.schemaHash,\n );\n if (migration) {\n this.log.info(\"Auto-migrating parameter\", {\n name,\n description: migration.description,\n });\n await this.save(\n name,\n migration.value as Record<string, unknown>,\n schemaHash,\n {\n changeDescription: migration.description,\n },\n );\n // Reload after migration to get the new current\n const updated = await this.loadCurrentAndNext(name);\n if (updated.current) {\n this.cachedCurrent.set(name, updated.current.content);\n } else {\n this.cachedCurrent.delete(name);\n }\n if (updated.next) {\n this.cachedNext.set(name, {\n content: updated.next.content,\n activationDate: updated.next.activationDate,\n });\n } else {\n this.cachedNext.delete(name);\n }\n this.loaded.add(name);\n this.loadPromises.delete(name);\n this.notifySubscribers(name);\n return;\n }\n }\n\n const prev = this.cachedCurrent.get(name);\n const hadPrev = this.cachedCurrent.has(name);\n if (current) {\n this.cachedCurrent.set(name, current.content);\n } else {\n this.cachedCurrent.delete(name);\n }\n if (next) {\n this.cachedNext.set(name, {\n content: next.content,\n activationDate: next.activationDate,\n });\n } else {\n this.cachedNext.delete(name);\n }\n this.loaded.add(name);\n this.loadPromises.delete(name);\n\n if (\n hadPrev &&\n JSON.stringify(prev) !== JSON.stringify(this.cachedCurrent.get(name))\n ) {\n this.notifySubscribers(name);\n }\n }\n\n /**\n * Run migration with a distributed lock (Node.js only).\n * Ensures only one instance performs the migration while others wait.\n */\n protected async migrateWithLock(name: string): Promise<void> {\n const lockKey = `parameter:migrate:${name}`;\n const lockId = crypto.randomUUID();\n\n const value = await this.lockProvider.set(lockKey, lockId, true, 30_000);\n\n if (value === lockId) {\n // We got the lock — run migration\n try {\n await this.doLoad(name);\n } finally {\n await this.lockProvider.del(lockKey);\n }\n } else {\n // Another instance holds the lock — wait then load\n await this.waitForLock(lockKey);\n await this.doLoad(name);\n }\n }\n\n /**\n * Poll until a lock is released.\n */\n protected async waitForLock(lockKey: string): Promise<void> {\n const maxWait = 30_000;\n const start = this.dateTimeProvider.nowMillis();\n while (this.dateTimeProvider.nowMillis() - start < maxWait) {\n await this.dateTimeProvider.wait(200);\n const lockId = crypto.randomUUID();\n const value = await this.lockProvider.set(lockKey, lockId, true, 1000);\n if (value === lockId) {\n await this.lockProvider.del(lockKey);\n return;\n }\n }\n // Timeout — proceed anyway (lock expired or will expire)\n }\n\n /**\n * Attempt to migrate a DB value to the current schema.\n * Returns the migrated value if successful, or null if no migration needed.\n *\n * Cascade:\n * 1. Run user migrate() if provided\n * 2. Validate result against schema\n * 3. If invalid, shallow merge DB value with defaults\n * 4. Validate merged result\n * 5. If still invalid, use defaults\n */\n protected migrateValue(\n name: string,\n dbValue: unknown,\n dbSchemaHash: string,\n ): { value: unknown; description: string } | null {\n const schemaHash = this.schemaHashes.get(name) ?? \"\";\n const param = this.primitives.get(name);\n if (!param) {\n return null;\n }\n\n // No migration if schema hash matches\n if (dbSchemaHash === schemaHash) {\n return null;\n }\n\n const schema = param.schema;\n const defaults = param.options.default;\n\n // Step 1: Try user-provided migrate function\n if (param.options.migrate) {\n try {\n const migrated = param.options.migrate(dbValue);\n if (Value.Check(schema, migrated)) {\n if (JSON.stringify(migrated) === JSON.stringify(dbValue)) {\n return null;\n }\n return {\n value: migrated,\n description: \"Auto-migrated: user migration function\",\n };\n }\n this.log.warn(\n \"Parameter migrate() returned invalid value, falling through to merge\",\n { name },\n );\n } catch (err) {\n this.log.warn(\"Parameter migrate() threw, falling through to merge\", {\n name,\n error: err,\n });\n }\n }\n\n // Step 2: Strip unknown keys and check if DB value is valid for new schema\n const schemaKeys = new Set(Object.keys(schema.properties));\n const stripped = this.pickSchemaKeys(\n dbValue as Record<string, unknown>,\n schemaKeys,\n );\n\n if (Value.Check(schema, stripped)) {\n if (JSON.stringify(stripped) === JSON.stringify(dbValue)) {\n return null;\n }\n return {\n value: stripped,\n description: \"Auto-migrated: stripped unknown fields\",\n };\n }\n\n // Step 3: Shallow merge DB value with defaults, keeping only schema keys\n const merged = this.pickSchemaKeys(\n Object.assign(\n {},\n defaults as Record<string, unknown>,\n dbValue as Record<string, unknown>,\n ),\n schemaKeys,\n );\n\n if (Value.Check(schema, merged)) {\n return {\n value: merged,\n description: \"Auto-migrated: merged with defaults\",\n };\n }\n\n // Step 4: Full reset to defaults\n return {\n value: defaults,\n description: \"Auto-migrated: reset to defaults (schema incompatible)\",\n };\n }\n\n /**\n * Reload next version info in background (non-blocking).\n */\n protected reloadNextInBackground(name: string): void {\n this.loadCurrentAndNext(name)\n .then(({ next }) => {\n if (next) {\n this.cachedNext.set(name, {\n content: next.content,\n activationDate: next.activationDate,\n });\n } else {\n this.cachedNext.delete(name);\n }\n })\n .catch((err) => {\n this.log.warn(\"Failed to reload next parameter version\", {\n name,\n error: err,\n });\n });\n }\n\n /**\n * Notify all subscribers of a value change.\n */\n protected notifySubscribers(name: string): void {\n const subs = this.subscribers.get(name);\n if (!subs) return;\n const param = this.primitives.get(name);\n const value = this.cachedCurrent.has(name)\n ? this.cachedCurrent.get(name)\n : param?.options.default;\n for (const fn of subs) {\n fn(value);\n }\n }\n\n /**\n * Return a new object containing only keys present in the schema.\n */\n protected pickSchemaKeys(\n obj: Record<string, unknown>,\n schemaKeys: Set<string>,\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const key of schemaKeys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n }\n\n /**\n * Calculate a hash of the schema for migration detection.\n * Uses CryptoProvider for proper SHA-256 hashing.\n */\n protected calculateSchemaHash(schema: TObject): string {\n return this.crypto.hash(JSON.stringify(schema));\n }\n\n /**\n * Publish change notification to other instances.\n */\n protected async publishChange(name: string): Promise<void> {\n await this.syncTopic.publish({\n name,\n instanceId: this.instanceId,\n });\n }\n\n /**\n * Handle incoming change notification from other instances.\n * Reloads the parameter from DB.\n */\n protected async handleChangeNotification(\n payload: ParameterChangePayload,\n ): Promise<void> {\n // Ignore messages from self\n if (payload.instanceId === this.instanceId) {\n return;\n }\n\n if (!this.primitives.has(payload.name)) {\n return;\n }\n\n await this.load(payload.name);\n }\n\n /**\n * Build tree structure from dot-notation names.\n */\n protected buildTree(names: string[]): ParameterTreeNode[] {\n const root: ParameterTreeNode[] = [];\n\n for (const name of names) {\n const parts = name.split(\".\");\n let currentLevel = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLeaf = i === parts.length - 1;\n const path = parts.slice(0, i + 1).join(\".\");\n\n let existing = currentLevel.find((n) => n.name === part);\n\n if (!existing) {\n existing = {\n name: part,\n path,\n isLeaf,\n children: [],\n };\n currentLevel.push(existing);\n }\n\n if (isLeaf) {\n existing.isLeaf = true;\n }\n\n currentLevel = existing.children;\n }\n }\n\n return root;\n }\n}\n\nexport interface SaveParameterOptions {\n activationDate?: Date;\n changeDescription?: string;\n tags?: string[];\n creatorId?: string;\n creatorName?: string;\n}\n","import { $inject, AlephaError, t } from \"alepha\";\nimport { $secure } from \"alepha/security\";\nimport { $action } from \"alepha/server\";\nimport { activateParameterBodySchema } from \"../schemas/activateParameterBodySchema.ts\";\nimport { createParameterVersionBodySchema } from \"../schemas/createParameterVersionBodySchema.ts\";\nimport { parameterCurrentResponseSchema } from \"../schemas/parameterCurrentResponseSchema.ts\";\nimport { parameterHistoryResponseSchema } from \"../schemas/parameterHistoryResponseSchema.ts\";\nimport { parameterNameParamSchema } from \"../schemas/parameterNameParamSchema.ts\";\nimport { parameterNamesResponseSchema } from \"../schemas/parameterNamesResponseSchema.ts\";\nimport { parameterResponseSchema } from \"../schemas/parameterResponseSchema.ts\";\nimport { parameterTreeNodeSchema } from \"../schemas/parameterTreeNodeSchema.ts\";\nimport { parameterVersionParamSchema } from \"../schemas/parameterVersionParamSchema.ts\";\nimport { parameterVersionResponseSchema } from \"../schemas/parameterVersionResponseSchema.ts\";\nimport { rollbackParameterBodySchema } from \"../schemas/rollbackParameterBodySchema.ts\";\nimport { ParameterProvider } from \"../services/ParameterProvider.ts\";\n\n/**\n * REST API controller for versioned parameter management.\n *\n * Provides endpoints for:\n * - Listing all parameters (tree view support)\n * - Getting parameter history (all versions with calculated status)\n * - Getting current/next parameter values\n * - Creating new parameter versions (immediate or scheduled)\n * - Rolling back to previous versions\n * - Activating scheduled versions immediately\n */\nexport class AdminParameterController {\n protected readonly url = \"/parameters\";\n protected readonly group = \"admin:parameters\";\n protected readonly provider = $inject(ParameterProvider);\n\n /**\n * Get tree structure of all parameter names.\n * Useful for admin UI navigation.\n */\n getParameterTree = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get tree structure of all parameter names for navigation.\",\n path: \"/parameters/tree\",\n method: \"GET\",\n schema: {\n response: t.array(parameterTreeNodeSchema),\n },\n handler: async () => {\n return this.provider.getParameterTree();\n },\n });\n\n /**\n * List all unique parameter names.\n */\n listParameterNames = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"List all unique parameter names.\",\n path: \"/parameters\",\n method: \"GET\",\n schema: {\n response: parameterNamesResponseSchema,\n },\n handler: async () => {\n const names = await this.provider.getParameterNames();\n return { names };\n },\n });\n\n /**\n * Get version history for a specific parameter.\n * Returns all versions with calculated status.\n */\n getHistory = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get all versions of a specific parameter.\",\n path: \"/parameters/:name/history\",\n method: \"GET\",\n schema: {\n params: parameterNameParamSchema,\n response: parameterHistoryResponseSchema,\n },\n handler: async ({ params }) => {\n const rawVersions = await this.provider.getHistory(params.name);\n const versions = this.provider.calculateStatuses(rawVersions);\n return { versions };\n },\n });\n\n /**\n * Get current and next values for a parameter.\n * Includes defaultValue and currentValue from the registered primitive\n * even if no versions exist in the database yet.\n */\n getCurrent = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get current and next scheduled values for a parameter.\",\n path: \"/parameters/:name\",\n method: \"GET\",\n schema: {\n params: parameterNameParamSchema,\n response: parameterCurrentResponseSchema,\n },\n handler: async ({ params }) => {\n const result = await this.provider.getCurrentWithDefault(params.name);\n return {\n current: result.current ?? undefined,\n next: result.next ?? undefined,\n defaultValue: result.defaultValue ?? undefined,\n currentValue: result.currentValue ?? undefined,\n schema: result.schema ?? undefined,\n };\n },\n });\n\n /**\n * Get a specific version of a parameter.\n */\n getVersion = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:read\"] })],\n description: \"Get a specific version of a parameter.\",\n path: \"/parameters/:name/versions/:version\",\n method: \"GET\",\n schema: {\n params: parameterVersionParamSchema,\n response: parameterVersionResponseSchema,\n },\n handler: async ({ params }) => {\n const version = await this.provider.getVersion(\n params.name,\n params.version,\n );\n if (!version) {\n return { parameter: undefined };\n }\n const [withStatus] = this.provider.calculateStatuses([version]);\n return { parameter: withStatus };\n },\n });\n\n /**\n * Create a new parameter version.\n */\n createVersion = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:create\"] })],\n description:\n \"Create a new version of a parameter (immediate or scheduled).\",\n path: \"/parameters/:name\",\n method: \"POST\",\n schema: {\n params: parameterNameParamSchema,\n body: createParameterVersionBodySchema,\n response: parameterResponseSchema,\n },\n handler: async ({ params, body }) => {\n return this.provider.save(params.name, body.content, body.schemaHash, {\n activationDate: body.activationDate\n ? new Date(body.activationDate)\n : undefined,\n changeDescription: body.changeDescription,\n tags: body.tags,\n creatorId: body.creatorId,\n creatorName: body.creatorName,\n });\n },\n });\n\n /**\n * Rollback to a previous version.\n */\n rollback = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:rollback\"] })],\n description:\n \"Rollback a parameter to a previous version (creates new version with old content).\",\n path: \"/parameters/:name/rollback\",\n method: \"POST\",\n schema: {\n params: parameterNameParamSchema,\n body: rollbackParameterBodySchema,\n response: parameterResponseSchema,\n },\n handler: async ({ params, body }) => {\n return this.provider.rollback(params.name, body.targetVersion, {\n changeDescription: body.changeDescription,\n creatorId: body.creatorId,\n creatorName: body.creatorName,\n });\n },\n });\n\n /**\n * Activate a scheduled version immediately.\n * Creates a new version with the same content but immediate activation.\n */\n activateNow = $action({\n group: this.group,\n use: [$secure({ permissions: [\"admin:parameter:activate\"] })],\n description: \"Activate a future/next parameter version immediately.\",\n path: \"/parameters/:name/activate\",\n method: \"POST\",\n schema: {\n params: parameterNameParamSchema,\n body: activateParameterBodySchema,\n response: parameterResponseSchema,\n },\n handler: async ({ params, body }) => {\n const allVersions = await this.provider.getHistory(params.name);\n const withStatuses = this.provider.calculateStatuses(allVersions);\n const target = withStatuses.find((v) => v.version === body.version);\n\n if (!target) {\n throw new AlephaError(\n `Version ${body.version} not found for parameter ${params.name}`,\n );\n }\n\n if (target.status === \"current\") {\n return target;\n }\n\n if (target.status === \"expired\") {\n throw new AlephaError(\n \"Cannot activate an expired version. Use rollback instead.\",\n );\n }\n\n // Create new version with same content but immediate activation\n return this.provider.save(\n params.name,\n target.content,\n target.schemaHash,\n {\n changeDescription: `Early activation of version ${body.version}`,\n creatorId: body.creatorId,\n creatorName: body.creatorName,\n },\n );\n },\n });\n}\n","import {\n $inject,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n} from \"alepha\";\nimport type { UserAccount } from \"alepha/security\";\nimport { ParameterProvider } from \"../services/ParameterProvider.ts\";\n\n/**\n * Creates a versioned parameter primitive for managing application settings.\n *\n * Provides type-safe, versioned configuration with:\n * - Schema validation with auto-migration detection\n * - Default values for initial state\n * - Status derived from activationDate (no stored status)\n * - Database persistence with full version history\n * - Cross-instance notification via topic\n * - Tree view support via dot-notation naming (e.g., \"app.features.flags\")\n * - Async `.get()` with lazy loading (works in Node and Cloudflare Workers)\n *\n * @example\n * ```ts\n * class AppConfig {\n * features = $parameter({\n * name: \"app.features.flags\",\n * schema: t.object({\n * enableBeta: t.boolean(),\n * maxUploadSize: t.number()\n * }),\n * default: { enableBeta: false, maxUploadSize: 10485760 }\n * });\n *\n * async checkBeta() {\n * const config = await this.features.get();\n * return config.enableBeta;\n * }\n *\n * async enableBeta() {\n * await this.features.set({ enableBeta: true, maxUploadSize: 20971520 });\n * }\n * }\n * ```\n */\nexport interface ParameterPrimitiveOptions<T extends TObject> {\n /**\n * Parameter name using dot notation for tree hierarchy.\n * Examples: \"app.features\", \"app.pricing.tiers\", \"system.limits\"\n */\n name?: string;\n\n /**\n * Human-readable description of the parameter.\n */\n description?: string;\n\n /**\n * TypeBox schema defining the parameter structure.\n */\n schema: T;\n\n /**\n * Default value used when no parameter exists in database.\n */\n default: Static<T>;\n\n /**\n * Optional migration function for schema changes.\n * Receives the raw DB value and returns a transformed value matching the new schema.\n * Runs before validation — if the result is valid, it's used directly.\n * If not provided or returns an invalid value, falls through to merge/default cascade.\n */\n migrate?: (old: unknown) => Static<T>;\n}\n\nexport class ParameterPrimitive<T extends TObject> extends Primitive<\n ParameterPrimitiveOptions<T>\n> {\n protected readonly provider = $inject(ParameterProvider);\n\n /**\n * Parameter name (uses property key if not specified).\n */\n public get name(): string {\n return this.options.name || this.config.propertyKey;\n }\n\n /**\n * The TypeBox schema for this parameter.\n */\n public get schema(): T {\n return this.options.schema;\n }\n\n /**\n * Get the cached current content, falling back to default.\n * Synchronous access for admin API.\n */\n public get cachedCurrentContent(): Static<T> {\n return this.provider.getCachedCurrentContent(this.name) as Static<T>;\n }\n\n /**\n * Whether the parameter is using its default value (no DB value loaded).\n */\n public get isUsingDefault(): boolean {\n return this.provider.isUsingDefault(this.name);\n }\n\n /**\n * Get the current parameter value asynchronously.\n * Lazy-loads from database on first call.\n * Checks if a cached next version has become current.\n */\n public get(): Promise<Static<T>> {\n return this.provider.get(this.name) as Promise<Static<T>>;\n }\n\n /**\n * Load current and next values from database.\n */\n public async load(): Promise<void> {\n await this.provider.load(this.name);\n }\n\n /**\n * Set a new parameter value.\n *\n * @param value - The new parameter value\n * @param options - Optional settings (activation date, creator info, etc.)\n */\n public async set(\n value: Static<T>,\n options: SetParameterOptions = {},\n ): Promise<void> {\n await this.provider.set(this.name, value, {\n activationDate: options.activationDate,\n changeDescription: options.changeDescription,\n tags: options.tags,\n creatorId: options.user?.id,\n creatorName: options.user?.name ?? options.user?.email,\n });\n }\n\n /**\n * Subscribe to parameter changes.\n * Returns an unsubscribe function.\n */\n public sub(fn: (curr: Static<T>) => void): () => void {\n return this.provider.sub(this.name, fn as (v: unknown) => void);\n }\n\n /**\n * Reload parameter from database.\n * Called when sync notification received or for manual refresh.\n */\n public async reload(): Promise<void> {\n await this.provider.load(this.name);\n }\n\n /**\n * Get version history for this parameter.\n */\n public async getHistory() {\n return this.provider.getHistory(this.name);\n }\n\n /**\n * Rollback to a specific version.\n */\n public async rollback(\n version: number,\n options?: SetParameterOptions,\n ): Promise<void> {\n await this.provider.rollback(this.name, version, {\n changeDescription: options?.changeDescription,\n creatorId: options?.user?.id,\n creatorName: options?.user?.name ?? options?.user?.email,\n });\n await this.provider.load(this.name);\n }\n\n /**\n * Called after primitive creation to register with provider.\n */\n protected onInit(): void {\n this.provider.register(this);\n }\n}\n\nexport const $parameter = <T extends TObject>(\n options: ParameterPrimitiveOptions<T>,\n) => {\n return createPrimitive(ParameterPrimitive<T>, options);\n};\n\n$parameter[KIND] = ParameterPrimitive;\n\nexport interface SetParameterOptions {\n /**\n * User making the change (for audit trail).\n */\n user?: Pick<UserAccount, \"id\" | \"email\" | \"name\">;\n\n /**\n * When this parameter should become active.\n * Default is immediate (now).\n */\n activationDate?: Date;\n\n /**\n * Description of the change.\n */\n changeDescription?: string;\n\n /**\n * Tags for filtering/categorization.\n */\n tags?: string[];\n}\n","import { $module } from \"alepha\";\nimport { AdminParameterController } from \"./controllers/AdminParameterController.ts\";\nimport { $parameter } from \"./primitives/$parameter.ts\";\nimport { ParameterProvider } from \"./services/ParameterProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Controller exports\nexport * from \"./controllers/AdminParameterController.ts\";\n// Entity exports\nexport * from \"./entities/parameters.ts\";\n// Primitive exports\nexport * from \"./primitives/$parameter.ts\";\n// Schema exports (types for UI)\nexport * from \"./schemas/activateParameterBodySchema.ts\";\nexport * from \"./schemas/createParameterVersionBodySchema.ts\";\nexport * from \"./schemas/parameterCurrentResponseSchema.ts\";\nexport * from \"./schemas/parameterHistoryResponseSchema.ts\";\nexport * from \"./schemas/parameterNameParamSchema.ts\";\nexport * from \"./schemas/parameterNamesResponseSchema.ts\";\nexport * from \"./schemas/parameterResponseSchema.ts\";\nexport * from \"./schemas/parameterStatusSchema.ts\";\nexport * from \"./schemas/parameterTreeNodeSchema.ts\";\nexport * from \"./schemas/parameterVersionParamSchema.ts\";\nexport * from \"./schemas/parameterVersionResponseSchema.ts\";\nexport * from \"./schemas/rollbackParameterBodySchema.ts\";\n// Service exports\nexport * from \"./services/ParameterProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Application parameter management.\n *\n * **Features:**\n * - Versioned parameter definitions\n * - Status derived from activationDate at query time\n * - Schema validation with migration detection\n * - Cross-instance notification via pub/sub\n * - Async `.get()` with lazy loading (works in Node and Cloudflare Workers)\n *\n * @module alepha.api.parameters\n */\nexport const AlephaApiParameters = $module({\n name: \"alepha.api.parameters\",\n primitives: [$parameter],\n services: [ParameterProvider, AdminParameterController],\n});\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { $module, t } from "alepha";
|
|
2
|
-
import { $entity, db } from "alepha/orm";
|
|
2
|
+
import { $entity, db, sql } from "alepha/orm";
|
|
3
3
|
//#region ../../src/api/users/entities/users.ts
|
|
4
4
|
const DEFAULT_USER_REALM_NAME = "default";
|
|
5
5
|
const users = $entity({
|
|
@@ -12,7 +12,7 @@ const users = $entity({
|
|
|
12
12
|
realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),
|
|
13
13
|
username: t.optional(t.shortText({
|
|
14
14
|
minLength: 3,
|
|
15
|
-
maxLength:
|
|
15
|
+
maxLength: 30
|
|
16
16
|
})),
|
|
17
17
|
email: t.optional(t.string({ format: "email" })),
|
|
18
18
|
phoneNumber: t.optional(t.e164()),
|
|
@@ -21,12 +21,14 @@ const users = $entity({
|
|
|
21
21
|
lastName: t.optional(t.string()),
|
|
22
22
|
picture: t.optional(t.string()),
|
|
23
23
|
enabled: db.default(t.boolean(), true),
|
|
24
|
-
emailVerified: db.default(t.boolean(), false)
|
|
24
|
+
emailVerified: db.default(t.boolean(), false),
|
|
25
|
+
organizationId: db.organization()
|
|
25
26
|
}),
|
|
26
27
|
indexes: [
|
|
27
28
|
{
|
|
28
|
-
|
|
29
|
-
unique: true
|
|
29
|
+
expressions: (self) => [self.realm, sql`LOWER(${self.username})`],
|
|
30
|
+
unique: true,
|
|
31
|
+
name: "users_realm_username_lower_idx"
|
|
30
32
|
},
|
|
31
33
|
{
|
|
32
34
|
columns: ["realm", "email"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/users/entities/users.ts","../../../src/api/users/entities/identities.ts","../../../src/api/users/entities/sessions.ts","../../../src/api/users/schemas/registerSchema.ts","../../../src/api/users/schemas/resetPasswordSchema.ts","../../../src/api/users/index.browser.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\n\nexport const DEFAULT_USER_REALM_NAME = \"default\";\n\nexport const users = $entity({\n name: \"users\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n version: db.version(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),\n\n username: t.optional(\n t.shortText({\n minLength: 3,\n maxLength:
|
|
1
|
+
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/api/users/entities/users.ts","../../../src/api/users/entities/identities.ts","../../../src/api/users/entities/sessions.ts","../../../src/api/users/schemas/registerSchema.ts","../../../src/api/users/schemas/resetPasswordSchema.ts","../../../src/api/users/index.browser.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\nimport { $entity, db, sql } from \"alepha/orm\";\n\nexport const DEFAULT_USER_REALM_NAME = \"default\";\n\nexport const users = $entity({\n name: \"users\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n version: db.version(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n\n realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),\n\n username: t.optional(\n t.shortText({\n minLength: 3,\n maxLength: 30,\n // pattern is handled at the realm settings level\n }),\n ),\n\n email: t.optional(t.string({ format: \"email\" })),\n\n phoneNumber: t.optional(t.e164()),\n\n roles: db.default(t.array(t.string()), []),\n firstName: t.optional(t.string()),\n lastName: t.optional(t.string()),\n picture: t.optional(t.string()),\n enabled: db.default(t.boolean(), true),\n\n emailVerified: db.default(t.boolean(), false),\n\n organizationId: db.organization(),\n }),\n indexes: [\n {\n expressions: (self) => [self.realm, sql`LOWER(${self.username})`],\n unique: true,\n name: \"users_realm_username_lower_idx\",\n },\n { columns: [\"realm\", \"email\"], unique: true },\n { columns: [\"realm\", \"phoneNumber\"], unique: true },\n ],\n});\n\nexport type UserEntity = Static<typeof users.schema>;\n","import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\nimport { users } from \"./users.ts\";\n\nexport const identities = $entity({\n name: \"identities\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n version: db.version(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n userId: db.ref(t.uuid(), () => users.cols.id),\n password: t.optional(t.text()),\n provider: t.text(),\n providerUserId: t.optional(t.text()),\n providerData: t.optional(t.json()),\n }),\n indexes: [\n \"userId\",\n \"provider\",\n { columns: [\"userId\", \"provider\"] },\n { columns: [\"provider\", \"providerUserId\"], unique: true },\n ],\n});\n\nexport type IdentityEntity = Static<typeof identities.schema>;\n","import { type Static, t } from \"alepha\";\nimport { $entity, db } from \"alepha/orm\";\nimport { users } from \"./users.ts\";\n\nexport const sessions = $entity({\n name: \"sessions\",\n schema: t.object({\n id: db.primaryKey(t.uuid()),\n version: db.version(),\n createdAt: db.createdAt(),\n updatedAt: db.updatedAt(),\n refreshToken: t.uuid(),\n userId: db.ref(t.uuid(), () => users.cols.id),\n expiresAt: t.datetime(),\n ip: t.optional(t.text()),\n userAgent: t.optional(\n t.object({\n os: t.text(),\n browser: t.text(),\n device: t.enum([\"MOBILE\", \"DESKTOP\", \"TABLET\"]),\n }),\n ),\n }),\n indexes: [\"userId\", \"expiresAt\", { column: \"refreshToken\", unique: true }],\n});\n\nexport type SessionEntity = Static<typeof sessions.schema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const registerSchema = t.object({\n username: t.string({\n minLength: 3,\n maxLength: 20,\n pattern: /^[a-zA-Z0-9_]+$/,\n description: \"Username for the new account\",\n }),\n email: t.email({\n description: \"Email address for the new account\",\n }),\n password: t.string({\n minLength: 8,\n description: \"Password for the new account\",\n }),\n confirmPassword: t.string({\n minLength: 8,\n description: \"Confirmation of the password\",\n }),\n firstName: t.optional(\n t.string({\n maxLength: 100,\n description: \"User's first name\",\n }),\n ),\n lastName: t.optional(\n t.string({\n maxLength: 100,\n description: \"User's last name\",\n }),\n ),\n});\n\nexport type RegisterInput = Static<typeof registerSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const resetPasswordRequestSchema = t.object({\n email: t.email({\n description: \"Email address to send password reset link\",\n }),\n});\n\nexport const resetPasswordSchema = t.object({\n token: t.string({\n description: \"Password reset token from email\",\n }),\n password: t.string({\n minLength: 8,\n description: \"New password\",\n }),\n confirmPassword: t.string({\n minLength: 8,\n description: \"Confirmation of the new password\",\n }),\n});\n\nexport type ResetPasswordRequest = Static<typeof resetPasswordRequestSchema>;\nexport type ResetPasswordInput = Static<typeof resetPasswordSchema>;\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./entities/identities.ts\";\nexport * from \"./entities/sessions.ts\";\nexport * from \"./entities/users.ts\";\nexport * from \"./schemas/registerSchema.ts\";\nexport * from \"./schemas/resetPasswordSchema.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaApiUsers = $module({\n name: \"alepha.api.users\",\n services: [],\n});\n"],"mappings":"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"}
|