alepha 0.19.0 → 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/files/index.js +5 -1
- package/dist/api/files/index.js.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 +202 -202
- 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 +989 -931
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +292 -146
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +132 -132
- 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 -139
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +283 -86
- 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.bun.js +17 -11
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +21 -15
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +19 -13
- package/dist/orm/postgres/index.js.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 +3 -4
- 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 +37 -32
- package/src/api/files/{controllers → __tests__}/FileController.spec.ts +189 -143
- package/src/api/files/{services → __tests__}/FileService.spec.ts +50 -30
- package/src/api/files/controllers/FileController.ts +6 -0
- 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/__tests__/$realm.spec.ts +191 -0
- package/src/api/users/__tests__/RealmProvider.spec.ts +53 -0
- package/src/api/users/__tests__/SessionService.spec.ts +778 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +24 -0
- package/src/api/users/controllers/RealmController.ts +5 -11
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -3
- package/src/api/users/primitives/$realm.ts +23 -11
- package/src/api/users/providers/RealmProvider.ts +23 -3
- package/src/api/users/services/RegistrationService.ts +3 -2
- package/src/api/users/services/SessionService.ts +249 -8
- 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 +4 -12
- package/src/cli/core/assets.ts +0 -1
- 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 +53 -46
- package/src/cli/core/services/PackageManagerUtils.ts +8 -3
- package/src/cli/core/services/ProjectScaffolder.ts +20 -20
- 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/orm/postgres/services/PostgresModelBuilder.ts +9 -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 +3 -6
- 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/assets/devtools-ui/200.html +0 -10
- package/assets/devtools-ui/200.html.br +0 -0
- package/assets/devtools-ui/404.html +0 -10
- package/assets/devtools-ui/404.html.br +0 -0
- package/assets/devtools-ui/CNAME +0 -1
- package/assets/devtools-ui/asset.CHpVij2M.css +0 -1
- package/assets/devtools-ui/asset.CHpVij2M.css.br +0 -0
- package/assets/devtools-ui/asset.DJ-i0UDz.css +0 -1
- package/assets/devtools-ui/asset.DJ-i0UDz.css.br +0 -0
- package/assets/devtools-ui/chunk.1jwpJORo.js +0 -1
- package/assets/devtools-ui/chunk.1jwpJORo.js.br +0 -0
- package/assets/devtools-ui/chunk.B0r2wfUL.js +0 -1
- package/assets/devtools-ui/chunk.B0r2wfUL.js.br +0 -0
- package/assets/devtools-ui/chunk.BScN4dVR.js +0 -84
- package/assets/devtools-ui/chunk.BScN4dVR.js.br +0 -0
- package/assets/devtools-ui/chunk.BispuoY4.js +0 -1
- package/assets/devtools-ui/chunk.BispuoY4.js.br +0 -0
- package/assets/devtools-ui/chunk.BtrPUUd7.js +0 -2
- package/assets/devtools-ui/chunk.BtrPUUd7.js.br +0 -0
- package/assets/devtools-ui/chunk.C-KMHgqf.js +0 -1
- package/assets/devtools-ui/chunk.C-KMHgqf.js.br +0 -0
- package/assets/devtools-ui/chunk.C2zQ3CF6.js +0 -7
- package/assets/devtools-ui/chunk.C2zQ3CF6.js.br +0 -0
- package/assets/devtools-ui/chunk.C619McpO.js +0 -1
- package/assets/devtools-ui/chunk.C619McpO.js.br +0 -0
- package/assets/devtools-ui/chunk.C9OsYsVl.js +0 -1
- package/assets/devtools-ui/chunk.C9OsYsVl.js.br +0 -3
- package/assets/devtools-ui/chunk.CAC_-151.js +0 -1
- package/assets/devtools-ui/chunk.CAC_-151.js.br +0 -0
- package/assets/devtools-ui/chunk.CCmesWfx.js +0 -1
- package/assets/devtools-ui/chunk.CCmesWfx.js.br +0 -0
- package/assets/devtools-ui/chunk.CFQDmrcV.js +0 -1
- package/assets/devtools-ui/chunk.CFQDmrcV.js.br +0 -0
- package/assets/devtools-ui/chunk.CgM71Zau.js +0 -1
- package/assets/devtools-ui/chunk.CgM71Zau.js.br +0 -0
- package/assets/devtools-ui/chunk.CmHq336a.js +0 -1
- package/assets/devtools-ui/chunk.CmHq336a.js.br +0 -0
- package/assets/devtools-ui/chunk.CthNMCar.js +0 -1
- package/assets/devtools-ui/chunk.CthNMCar.js.br +0 -0
- package/assets/devtools-ui/chunk.D2brVJP1.js +0 -1
- package/assets/devtools-ui/chunk.D2brVJP1.js.br +0 -0
- package/assets/devtools-ui/chunk.DgBKGkiw.js +0 -1
- package/assets/devtools-ui/chunk.DgBKGkiw.js.br +0 -0
- package/assets/devtools-ui/chunk.NNHHCQsa.js +0 -1
- package/assets/devtools-ui/chunk.NNHHCQsa.js.br +0 -0
- package/assets/devtools-ui/chunk._CDKKWMo.js +0 -1
- package/assets/devtools-ui/chunk._CDKKWMo.js.br +0 -0
- package/assets/devtools-ui/entry.B_nOjAod.js +0 -2
- package/assets/devtools-ui/entry.B_nOjAod.js.br +0 -0
- package/assets/devtools-ui/index.html +0 -10
- package/assets/devtools-ui/index.html.br +0 -0
- package/dist/devtools/index.browser.js +0 -224
- package/dist/devtools/index.browser.js.map +0 -1
- package/dist/devtools/index.d.ts +0 -499
- package/dist/devtools/index.d.ts.map +0 -1
- package/dist/devtools/index.js +0 -782
- package/dist/devtools/index.js.map +0 -1
- package/dist/mqtt/index.d.ts +0 -164
- package/dist/mqtt/index.d.ts.map +0 -1
- package/dist/mqtt/index.js +0 -214
- package/dist/mqtt/index.js.map +0 -1
- package/dist/topic/mqtt/index.d.ts +0 -87
- package/dist/topic/mqtt/index.d.ts.map +0 -1
- package/dist/topic/mqtt/index.js +0 -88
- package/dist/topic/mqtt/index.js.map +0 -1
- package/src/api/users/parameters/UserParameters.ts +0 -23
- package/src/api/users/services/SessionService.spec.ts +0 -303
- 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/devtools/__tests__/DevCollectorProvider.spec.ts +0 -7
- package/src/devtools/assets.ts +0 -6
- package/src/devtools/entities/logs.ts +0 -21
- package/src/devtools/index.browser.ts +0 -11
- package/src/devtools/index.shared.ts +0 -15
- package/src/devtools/index.ts +0 -39
- package/src/devtools/providers/DevToolsMetadataProvider.ts +0 -459
- package/src/devtools/providers/DevToolsProvider.ts +0 -280
- package/src/devtools/schemas/DevActionMetadata.ts +0 -30
- package/src/devtools/schemas/DevAtomMetadata.ts +0 -26
- package/src/devtools/schemas/DevBucketMetadata.ts +0 -11
- package/src/devtools/schemas/DevCacheMetadata.ts +0 -10
- package/src/devtools/schemas/DevEntityMetadata.ts +0 -60
- package/src/devtools/schemas/DevEnvMetadata.ts +0 -22
- package/src/devtools/schemas/DevMetadata.ts +0 -47
- package/src/devtools/schemas/DevModuleMetadata.ts +0 -8
- package/src/devtools/schemas/DevPageMetadata.ts +0 -24
- package/src/devtools/schemas/DevProviderMetadata.ts +0 -10
- package/src/devtools/schemas/DevQueueMetadata.ts +0 -10
- package/src/devtools/schemas/DevRealmMetadata.ts +0 -19
- package/src/devtools/schemas/DevRouteMetadata.ts +0 -8
- package/src/devtools/schemas/DevSchedulerMetadata.ts +0 -11
- package/src/devtools/schemas/DevTopicMetadata.ts +0 -11
- package/src/mqtt/index.ts +0 -32
- package/src/mqtt/providers/MqttClientProvider.ts +0 -63
- package/src/mqtt/providers/MqttJsClientProvider.spec.ts +0 -165
- package/src/mqtt/providers/MqttJsClientProvider.ts +0 -309
- package/src/topic/mqtt/index.ts +0 -30
- package/src/topic/mqtt/providers/MqttTopicProvider.spec.ts +0 -160
- package/src/topic/mqtt/providers/MqttTopicProvider.ts +0 -146
- /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/{jobs → __tests__}/FileJobs.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/{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/{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,7 +1,7 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
2
|
import { $env, $hook, $inject, $module, $pipeline, AlephaError, t } from "alepha";
|
|
3
|
-
import { AlephaOrm, DatabaseProvider, DbMigrationError, ModelBuilder, PG_CREATED_AT, PG_ENUM, PG_GENERATED, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, databaseEnvSchema, schema } from "alepha/orm";
|
|
4
|
-
import { sql } from "drizzle-orm";
|
|
3
|
+
import { AlephaOrm, DatabaseProvider, DbMigrationError, ModelBuilder, PG_CREATED_AT, PG_ENUM, PG_GENERATED, PG_IDENTITY, PG_PRIMARY_KEY, PG_REF, PG_SERIAL, PG_UPDATED_AT, databaseEnvSchema, schema, sql } from "alepha/orm";
|
|
4
|
+
import { sql as sql$1 } from "drizzle-orm";
|
|
5
5
|
import { $lock } from "alepha/lock";
|
|
6
6
|
import * as pg from "drizzle-orm/pg-core";
|
|
7
7
|
import { check, customType, foreignKey, index, pgEnum, pgMaterializedView, pgSchema, pgSequence, pgTable, pgView, unique, uniqueIndex } from "drizzle-orm/pg-core";
|
|
@@ -32,6 +32,12 @@ const byte = customType({ dataType: () => "bytea" });
|
|
|
32
32
|
//#region ../../src/orm/postgres/services/PostgresModelBuilder.ts
|
|
33
33
|
var PostgresModelBuilder = class extends ModelBuilder {
|
|
34
34
|
schemas = /* @__PURE__ */ new Map();
|
|
35
|
+
/**
|
|
36
|
+
* Create a primary key column with UUID v7
|
|
37
|
+
*/
|
|
38
|
+
getPrimaryKeyUUID(key) {
|
|
39
|
+
return pg.uuid(key).default(sql`uuidv7()`);
|
|
40
|
+
}
|
|
35
41
|
getPgSchema(name) {
|
|
36
42
|
if (!this.schemas.has(name) && name !== "public") this.schemas.set(name, pgSchema(name));
|
|
37
43
|
const nsp = name !== "public" ? this.schemas.get(name) : {
|
|
@@ -182,7 +188,7 @@ var PostgresModelBuilder = class extends ModelBuilder {
|
|
|
182
188
|
mapStringToColumn = (key, value) => {
|
|
183
189
|
if ("format" in value) {
|
|
184
190
|
if (value.format === "uuid") {
|
|
185
|
-
if (PG_PRIMARY_KEY in value) return
|
|
191
|
+
if (PG_PRIMARY_KEY in value) return this.getPrimaryKeyUUID(key);
|
|
186
192
|
return pg.uuid(key);
|
|
187
193
|
}
|
|
188
194
|
if (value.format === "byte") return byte(key);
|
|
@@ -276,7 +282,7 @@ var PostgresProvider = class extends DatabaseProvider {
|
|
|
276
282
|
async generateTestSchema() {
|
|
277
283
|
if (this.alepha.isTest() && this.schemaForTesting?.startsWith("test_alepha_")) {
|
|
278
284
|
await this.cleanupStaleTestSchemas();
|
|
279
|
-
await this.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.raw(this.schemaForTesting)}`);
|
|
285
|
+
await this.execute(sql$1`CREATE SCHEMA IF NOT EXISTS ${sql$1.raw(this.schemaForTesting)}`);
|
|
280
286
|
}
|
|
281
287
|
}
|
|
282
288
|
/**
|
|
@@ -285,7 +291,7 @@ var PostgresProvider = class extends DatabaseProvider {
|
|
|
285
291
|
async dropTestSchema() {
|
|
286
292
|
if (this.alepha.isTest() && this.schemaForTesting?.startsWith("test_alepha_")) {
|
|
287
293
|
this.log.info(`Deleting test schema '${this.schemaForTesting}' ...`);
|
|
288
|
-
await this.execute(sql`DROP SCHEMA IF EXISTS ${sql.raw(this.schemaForTesting)} CASCADE`);
|
|
294
|
+
await this.execute(sql$1`DROP SCHEMA IF EXISTS ${sql$1.raw(this.schemaForTesting)} CASCADE`);
|
|
289
295
|
this.log.info(`Test schema '${this.schemaForTesting}' deleted`);
|
|
290
296
|
}
|
|
291
297
|
}
|
|
@@ -300,10 +306,10 @@ var PostgresProvider = class extends DatabaseProvider {
|
|
|
300
306
|
*/
|
|
301
307
|
async cleanupStaleTestSchemas() {
|
|
302
308
|
try {
|
|
303
|
-
const [lock] = await this.execute(sql`SELECT pg_try_advisory_lock(hashtext('alepha:test:schema:cleanup')) AS acquired`);
|
|
309
|
+
const [lock] = await this.execute(sql$1`SELECT pg_try_advisory_lock(hashtext('alepha:test:schema:cleanup')) AS acquired`);
|
|
304
310
|
if (!lock?.acquired) return;
|
|
305
311
|
try {
|
|
306
|
-
const result = await this.execute(sql`SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'test_alepha_%'`);
|
|
312
|
+
const result = await this.execute(sql$1`SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'test_alepha_%'`);
|
|
307
313
|
const now = this.dateTime.nowMillis();
|
|
308
314
|
const maxAge = 3600 * 1e3;
|
|
309
315
|
for (const row of result) {
|
|
@@ -312,11 +318,11 @@ var PostgresProvider = class extends DatabaseProvider {
|
|
|
312
318
|
const age = this.parseTestSchemaAge(name, now);
|
|
313
319
|
if (age !== void 0 && age > maxAge) {
|
|
314
320
|
this.log.warn(`Dropping stale test schema '${name}' (age: ${Math.round(age / 6e4)}min) ...`);
|
|
315
|
-
await this.execute(sql`DROP SCHEMA IF EXISTS ${sql.raw(name)} CASCADE`);
|
|
321
|
+
await this.execute(sql$1`DROP SCHEMA IF EXISTS ${sql$1.raw(name)} CASCADE`);
|
|
316
322
|
}
|
|
317
323
|
}
|
|
318
324
|
} finally {
|
|
319
|
-
await this.execute(sql`SELECT pg_advisory_unlock(hashtext('alepha:test:schema:cleanup'))`);
|
|
325
|
+
await this.execute(sql$1`SELECT pg_advisory_unlock(hashtext('alepha:test:schema:cleanup'))`);
|
|
320
326
|
}
|
|
321
327
|
} catch (error) {
|
|
322
328
|
this.log.warn("Failed to clean up stale test schemas", { error });
|
|
@@ -366,7 +372,7 @@ var BunPostgresProvider = class extends PostgresProvider {
|
|
|
366
372
|
return this.bunDb;
|
|
367
373
|
}
|
|
368
374
|
async executeMigrations(migrationsFolder) {
|
|
369
|
-
if (this.schema !== "public") await this.db.execute(sql.raw(`SET search_path TO ${this.schema}, public`));
|
|
375
|
+
if (this.schema !== "public") await this.db.execute(sql$1.raw(`SET search_path TO ${this.schema}, public`));
|
|
370
376
|
const { migrate } = await import("drizzle-orm/bun-sql/migrator");
|
|
371
377
|
await migrate(this.bunDb, {
|
|
372
378
|
migrationsFolder,
|
|
@@ -476,7 +482,7 @@ var CloudflareHyperdriveProvider = class extends DatabaseProvider {
|
|
|
476
482
|
async executeMigrations(migrationsFolder) {
|
|
477
483
|
this.log.debug(`Running Postgres migrations from '${migrationsFolder}'...`);
|
|
478
484
|
try {
|
|
479
|
-
if (this.schema !== "public") await this.db.execute(sql.raw(`SET search_path TO ${this.schema}, public`));
|
|
485
|
+
if (this.schema !== "public") await this.db.execute(sql$1.raw(`SET search_path TO ${this.schema}, public`));
|
|
480
486
|
const { migrate } = await import("drizzle-orm/postgres-js/migrator");
|
|
481
487
|
await migrate(this.db, {
|
|
482
488
|
migrationsFolder,
|
|
@@ -507,7 +513,7 @@ var NodePostgresProvider = class NodePostgresProvider extends PostgresProvider {
|
|
|
507
513
|
return this.pg;
|
|
508
514
|
}
|
|
509
515
|
async executeMigrations(migrationsFolder) {
|
|
510
|
-
if (this.schema !== "public") await this.db.execute(sql.raw(`SET search_path TO ${this.schema}, public`));
|
|
516
|
+
if (this.schema !== "public") await this.db.execute(sql$1.raw(`SET search_path TO ${this.schema}, public`));
|
|
511
517
|
await migrate(this.db, {
|
|
512
518
|
migrationsFolder,
|
|
513
519
|
migrationsTable: this.migrationsTable
|
|
@@ -633,7 +639,7 @@ var PglitePostgresProvider = class PglitePostgresProvider extends DatabaseProvid
|
|
|
633
639
|
}
|
|
634
640
|
});
|
|
635
641
|
async executeMigrations(migrationsFolder) {
|
|
636
|
-
if (this.schema !== "public") await this.db.execute(sql.raw(`SET search_path TO ${this.schema}, public`));
|
|
642
|
+
if (this.schema !== "public") await this.db.execute(sql$1.raw(`SET search_path TO ${this.schema}, public`));
|
|
637
643
|
await migrate$1(this.db, {
|
|
638
644
|
migrationsFolder,
|
|
639
645
|
migrationsTable: this.migrationsTable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["migrate"],"sources":["../../../src/orm/postgres/schemas/postgresEnvSchema.ts","../../../src/orm/postgres/types/byte.ts","../../../src/orm/postgres/services/PostgresModelBuilder.ts","../../../src/orm/postgres/providers/PostgresProvider.ts","../../../src/orm/postgres/providers/BunPostgresProvider.ts","../../../src/orm/postgres/providers/CloudflareHyperdriveProvider.ts","../../../src/orm/postgres/providers/NodePostgresProvider.ts","../../../src/orm/postgres/providers/PglitePostgresProvider.ts","../../../src/orm/postgres/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\n\n/**\n * PostgreSQL-specific environment schema.\n *\n * Additional env vars for PostgreSQL providers on top of `databaseEnvSchema`.\n */\nexport const postgresEnvSchema = t.object({\n /**\n * PostgreSQL schema name (defaults to `\"public\"` when unset).\n */\n POSTGRES_SCHEMA: t.optional(t.text()),\n\n /**\n * Maximum number of connections in the pool.\n */\n POOL_MAX: t.optional(t.integer()),\n\n /**\n * Seconds a connection can be idle before being closed.\n */\n POOL_IDLE_TIMEOUT: t.optional(t.integer()),\n\n /**\n * Seconds to wait when establishing a new connection.\n */\n POOL_CONNECT_TIMEOUT: t.optional(t.integer()),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof postgresEnvSchema>> {}\n}\n","import { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * Postgres bytea type.\n */\nexport const byte = customType<{\n data: Buffer;\n}>({\n dataType: () => \"bytea\",\n});\n","import { AlephaError, type TObject, type TSchema, t } from \"alepha\";\nimport {\n type EntityPrimitive,\n type FromSchema,\n ModelBuilder,\n PG_CREATED_AT,\n PG_ENUM,\n PG_GENERATED,\n PG_IDENTITY,\n PG_PRIMARY_KEY,\n PG_REF,\n PG_SERIAL,\n PG_UPDATED_AT,\n type PgEnumOptions,\n type PgGeneratedOptions,\n type PgIdentityOptions,\n type PgRefOptions,\n type SequencePrimitive,\n schema,\n type ViewPrimitive,\n} from \"alepha/orm\";\nimport type { BuildExtraConfigColumns } from \"drizzle-orm\";\nimport * as pg from \"drizzle-orm/pg-core\";\nimport {\n check,\n foreignKey,\n index,\n type PgEnum,\n type PgSchema,\n type PgTableExtraConfigValue,\n type PgTableWithColumns,\n pgEnum,\n pgMaterializedView,\n pgSchema,\n pgSequence,\n pgTable,\n pgView,\n unique,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport { byte } from \"../types/byte.ts\";\n\nexport class PostgresModelBuilder extends ModelBuilder {\n protected schemas = new Map<string, PgSchema>();\n\n protected getPgSchema(name: string) {\n if (!this.schemas.has(name) && name !== \"public\") {\n this.schemas.set(name, pgSchema(name));\n }\n\n const nsp =\n name !== \"public\"\n ? this.schemas.get(name)\n : ({\n enum: pgEnum,\n table: pgTable,\n sequence: pgSequence,\n } as any);\n\n if (!nsp) {\n throw new AlephaError(`Postgres schema ${name} not found`);\n }\n\n return nsp;\n }\n\n public buildTable(\n entity: EntityPrimitive<any>,\n options: {\n tables: Map<string, unknown>;\n enums: Map<string, unknown>;\n schemas: Map<string, unknown>;\n schema: string;\n },\n ) {\n const tableName = entity.name;\n if (options.tables.has(tableName)) {\n return;\n }\n\n const nsp = this.getPgSchema(options.schema);\n\n // Register PgSchema so drizzle-kit knows the schema is declared in code.\n // Without this, pushSchema diffs \"schema exists in DB but not in code\" → DROP.\n if (options.schema !== \"public\" && !options.schemas.has(options.schema)) {\n options.schemas.set(options.schema, nsp);\n }\n\n const columns = this.schemaToPgColumns(\n tableName,\n entity.schema,\n nsp,\n options.enums,\n options.tables,\n );\n\n // Build the config function that includes indexes, foreign keys, constraints, and custom config\n const configFn = this.getTableConfig(entity, options.tables);\n\n const table = nsp.table(tableName, columns, configFn);\n\n options.tables.set(tableName, table);\n }\n\n public buildView(\n view: ViewPrimitive,\n options: {\n tables: Map<string, unknown>;\n schema: string;\n },\n ) {\n const viewName = view.name;\n if (options.tables.has(viewName)) {\n return;\n }\n\n const columns = this.schemaToPgColumns(\n viewName,\n view.schema,\n { enum: pgEnum, table: pgTable, sequence: pgSequence } as any,\n new Map(),\n options.tables,\n );\n\n let drizzleView: unknown;\n if (view.materialized) {\n drizzleView = pgMaterializedView(viewName, columns).existing();\n } else {\n drizzleView = pgView(viewName, columns).existing();\n }\n\n options.tables.set(viewName, drizzleView);\n }\n\n public buildSequence(\n sequence: SequencePrimitive,\n options: {\n sequences: Map<string, unknown>;\n schema: string;\n },\n ) {\n const sequenceName = sequence.name;\n if (options.sequences.has(sequenceName)) {\n return;\n }\n\n const nsp = this.getPgSchema(options.schema);\n\n options.sequences.set(\n sequenceName,\n nsp.sequence(sequenceName, sequence.options),\n );\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Get PostgreSQL-specific config builder for the table.\n */\n protected getTableConfig(\n entity: EntityPrimitive,\n tables: Map<string, unknown>,\n ):\n | ((\n self: BuildExtraConfigColumns<string, any, \"pg\">,\n ) => PgTableExtraConfigValue[])\n | undefined {\n // PostgreSQL-specific builders\n const pgBuilders = {\n index,\n uniqueIndex,\n unique,\n check,\n foreignKey,\n };\n\n // Table resolver function\n const tableResolver = (entityName: string) => {\n return tables.get(entityName) as any;\n };\n\n return this.buildTableConfig<\n PgTableExtraConfigValue,\n BuildExtraConfigColumns<string, any, \"pg\">\n >(entity, pgBuilders as any, tableResolver);\n }\n\n schemaToPgColumns = <T extends TObject>(\n tableName: string,\n schema: T,\n nsp: PgSchema,\n enums: Map<string, unknown>,\n tables: Map<string, unknown>,\n ): FromSchema<T> => {\n return Object.entries(schema.properties).reduce<Partial<FromSchema<T>>>(\n (columns, [key, value]) => {\n let col = this.mapFieldToColumn(tableName, key, value, nsp, enums);\n\n if (\"default\" in value && value.default != null) {\n col = col.default(value.default as any);\n }\n\n if (PG_PRIMARY_KEY in value) {\n col = col.primaryKey();\n }\n\n if (PG_REF in value) {\n const config = value[PG_REF] as PgRefOptions;\n col = col.references(() => {\n const ref = config.ref();\n const table = tables.get(\n ref.entity.name,\n ) as PgTableWithColumns<any>;\n\n if (!table) {\n throw new AlephaError(\n `Referenced table ${ref.entity.name} not found for ${tableName}.${key}`,\n );\n }\n\n const target = table[ref.name];\n if (!target) {\n throw new AlephaError(\n `Referenced column ${ref.name} not found in table ${ref.entity.name} for ${tableName}.${key}`,\n );\n }\n\n return target;\n }, config.actions);\n }\n\n if (PG_GENERATED in value) {\n const gen = value[PG_GENERATED] as PgGeneratedOptions;\n col = col.generatedAlwaysAs(gen.expression);\n }\n\n if (schema.required?.includes(key)) {\n col = col.notNull();\n }\n\n return {\n ...columns,\n [key]: col,\n };\n },\n {},\n ) as FromSchema<T>;\n };\n\n mapFieldToColumn = (\n tableName: string,\n fieldName: string,\n value: TSchema,\n nsp: PgSchema,\n enums: Map<string, any>,\n ) => {\n const key = this.toColumnName(fieldName);\n\n if (\n // is nullish ?\n \"anyOf\" in value &&\n Array.isArray(value.anyOf) &&\n value.anyOf.length === 2 &&\n value.anyOf.some((it: TSchema) => t.schema.isNull(it))\n ) {\n // then, remove nullish\n value = value.anyOf.find((it: TSchema) => !t.schema.isNull(it))!;\n }\n\n if (t.schema.isInteger(value)) {\n if (PG_SERIAL in value) {\n return pg.serial(key);\n }\n\n if (PG_IDENTITY in value) {\n const options = value[PG_IDENTITY] as PgIdentityOptions;\n if (options.mode === \"byDefault\") {\n return pg.integer(key).generatedByDefaultAsIdentity(options);\n }\n return pg.integer(key).generatedAlwaysAsIdentity(options);\n }\n\n return pg.integer(key);\n }\n\n if (t.schema.isBigInt(value)) {\n if (PG_IDENTITY in value) {\n const options = value[PG_IDENTITY] as PgIdentityOptions;\n if (options.mode === \"byDefault\") {\n return pg\n .bigint(key, { mode: \"bigint\" })\n .generatedByDefaultAsIdentity(options);\n }\n return pg\n .bigint(key, { mode: \"bigint\" })\n .generatedAlwaysAsIdentity(options);\n }\n\n return pg.bigint(key, { mode: \"bigint\" });\n }\n\n if (t.schema.isNumber(value)) {\n if (PG_IDENTITY in value) {\n const options = value[PG_IDENTITY] as PgIdentityOptions;\n if (options.mode === \"byDefault\") {\n return pg\n .bigint(key, { mode: \"number\" })\n .generatedByDefaultAsIdentity(options);\n }\n return pg\n .bigint(key, { mode: \"number\" })\n .generatedAlwaysAsIdentity(options);\n }\n\n if (value.format === \"int64\") {\n return pg.bigint(key, { mode: \"number\" });\n }\n\n return pg.numeric(key);\n }\n\n if (t.schema.isString(value)) {\n return this.mapStringToColumn(key, value);\n }\n\n if (t.schema.isBoolean(value)) {\n return pg.boolean(key);\n }\n\n if (t.schema.isObject(value)) {\n return schema(key, value);\n }\n\n if (t.schema.isRecord(value)) {\n return schema(key, value);\n }\n\n const isTypeEnum = (value: any): value is { enum: any[] } =>\n t.schema.isUnsafe(value) &&\n \"type\" in value &&\n value.type === \"string\" &&\n \"enum\" in value &&\n Array.isArray(value.enum);\n\n if (t.schema.isArray(value)) {\n if (t.schema.isObject(value.items)) {\n return schema(key, value);\n }\n if (t.schema.isRecord(value.items)) {\n return schema(key, value);\n }\n if (t.schema.isString(value.items)) {\n return pg.text(key).array();\n }\n if (t.schema.isInteger(value.items)) {\n return pg.integer(key).array();\n }\n if (t.schema.isNumber(value.items)) {\n return pg.numeric(key).array();\n }\n if (t.schema.isBoolean(value.items)) {\n return pg.boolean(key).array();\n }\n if (isTypeEnum(value.items)) {\n return pg.text(key).array();\n }\n }\n\n // Enum handling\n if (isTypeEnum(value)) {\n if (!value.enum.every((it) => typeof it === \"string\")) {\n throw new AlephaError(\n `Enum for ${fieldName} must be an array of strings, got ${JSON.stringify(\n value.enum,\n )}`,\n );\n }\n\n // SQL Enum\n if (PG_ENUM in value && value[PG_ENUM]) {\n const options = value[PG_ENUM] as PgEnumOptions;\n const enumName = options.name ?? `${tableName}_${key}_enum`;\n\n if (enums.has(enumName)) {\n const values = (\n enums.get(enumName) as PgEnum<[string]>\n ).enumValues.join(\",\");\n const newValues = value.enum.join(\",\");\n if (values !== newValues) {\n throw new AlephaError(\n `Enum name conflict for ${enumName}: [${values}] vs [${newValues}]`,\n );\n }\n }\n\n enums.set(enumName, nsp.enum(enumName, value.enum as [string]));\n\n return enums.get(enumName)(key);\n }\n\n // else, map to TEXT\n return this.mapStringToColumn(key, value);\n }\n\n throw new AlephaError(\n `Unsupported schema type for ${fieldName} as ${JSON.stringify(value)}`,\n );\n };\n\n /**\n * Map a string to a PG column.\n *\n * @param key The key of the field.\n * @param value The value of the field.\n */\n mapStringToColumn = (key: string, value: TSchema) => {\n if (\"format\" in value) {\n if (value.format === \"uuid\") {\n if (PG_PRIMARY_KEY in value) {\n return pg.uuid(key).defaultRandom();\n }\n\n return pg.uuid(key);\n }\n\n if (value.format === \"byte\") {\n return byte(key);\n }\n\n if (value.format === \"date-time\") {\n if (PG_CREATED_AT in value) {\n return pg\n .timestamp(key, { mode: \"string\", withTimezone: true })\n .defaultNow();\n }\n if (PG_UPDATED_AT in value) {\n return pg\n .timestamp(key, { mode: \"string\", withTimezone: true })\n .defaultNow();\n }\n return pg.timestamp(key, { mode: \"string\", withTimezone: true });\n }\n\n if (value.format === \"date\") {\n return pg.date(key, { mode: \"string\" });\n }\n }\n\n return pg.text(key);\n };\n}\n","import { $env, $hook, $inject, $pipeline, AlephaError } from \"alepha\";\nimport { $lock } from \"alepha/lock\";\nimport {\n DatabaseProvider,\n DbMigrationError,\n databaseEnvSchema,\n type SQLLike,\n} from \"alepha/orm\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { postgresEnvSchema } from \"../schemas/postgresEnvSchema.ts\";\nimport { PostgresModelBuilder } from \"../services/PostgresModelBuilder.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Abstract base class for PostgreSQL database providers.\n *\n * Provides shared logic for Node.js and Bun PostgreSQL providers:\n * - Environment variable handling (DATABASE_URL, POSTGRES_SCHEMA)\n * - Schema name resolution (with test schema generation)\n * - SQL execution with error wrapping\n * - Lifecycle hooks (start with migration lock, stop with test cleanup)\n *\n * Subclasses must implement `connect()`, `close()`, and `executeMigrations()`.\n */\nexport abstract class PostgresProvider extends DatabaseProvider {\n protected readonly env = $env(databaseEnvSchema);\n protected readonly pgEnv = $env(postgresEnvSchema);\n protected readonly builder = $inject(PostgresModelBuilder);\n\n public override readonly dialect = \"postgresql\";\n\n public get name() {\n return \"postgres\";\n }\n\n /**\n * In testing mode, the schema name will be generated and deleted after the test.\n */\n protected schemaForTesting = this.alepha.isTest()\n ? this.generateTestSchemaName()\n : undefined;\n\n public override get url() {\n if (!this.env.DATABASE_URL) {\n throw new AlephaError(\"DATABASE_URL is not defined in the environment\");\n }\n\n return this.env.DATABASE_URL;\n }\n\n /**\n * Execute a SQL statement.\n */\n public override async execute(\n statement: SQLLike,\n ): Promise<Array<Record<string, unknown>>> {\n return await this.db.execute(statement);\n }\n\n /**\n * Get Postgres schema used by this provider.\n */\n public override get schema(): string {\n if (this.schemaForTesting) {\n return this.schemaForTesting;\n }\n\n if (this.pgEnv.POSTGRES_SCHEMA) {\n return this.pgEnv.POSTGRES_SCHEMA;\n }\n\n return \"public\";\n }\n\n public abstract override get db(): PgDatabase<any>;\n\n /**\n * Establish the database connection.\n */\n public abstract connect(): Promise<void>;\n\n /**\n * Close the database connection.\n */\n public abstract close(): Promise<void>;\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n await this.connect();\n await this.generateTestSchema();\n\n // never migrate in serverless mode (vercel, netlify, ...)\n if (!this.alepha.isServerless()) {\n try {\n await this.migrateLock.run();\n } catch (error) {\n throw new DbMigrationError(error);\n }\n }\n },\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: async () => {\n await this.dropTestSchema();\n await this.close();\n },\n });\n\n protected migrateLock = $pipeline({\n use: [$lock({ name: \"postgres:migrate\" })],\n handler: async () => {\n await this.migrate();\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n // Create unique schema for tests and clean up after. Format: test_alepha_{epoch_seconds}_{random8}\n // -------------------------------------------------------------------------------------------------------------------\n\n protected async generateTestSchema() {\n if (\n this.alepha.isTest() &&\n this.schemaForTesting?.startsWith(\"test_alepha_\")\n ) {\n // Self-healing: drop stale schemas left behind by crashed/failed test runs\n await this.cleanupStaleTestSchemas();\n\n await this.execute(\n sql`CREATE SCHEMA IF NOT EXISTS ${sql.raw(this.schemaForTesting)}`,\n );\n }\n }\n\n /**\n * Drop the current test schema if applicable.\n */\n protected async dropTestSchema(): Promise<void> {\n if (\n this.alepha.isTest() &&\n this.schemaForTesting?.startsWith(\"test_alepha_\")\n ) {\n this.log.info(`Deleting test schema '${this.schemaForTesting}' ...`);\n await this.execute(\n sql`DROP SCHEMA IF EXISTS ${sql.raw(this.schemaForTesting)} CASCADE`,\n );\n this.log.info(`Test schema '${this.schemaForTesting}' deleted`);\n }\n }\n\n /**\n * Remove stale test schemas older than 1 hour.\n *\n * Parses the embedded epoch from schema names (format: test_alepha_{epoch}_{random8})\n * and drops any that exceed the TTL. This handles schemas left behind by crashed tests,\n * killed processes, or failed startups where stop() never fired.\n *\n * Uses a PG advisory lock so only one concurrent test process performs the cleanup.\n */\n protected async cleanupStaleTestSchemas(): Promise<void> {\n try {\n // Non-blocking advisory lock — first process in cleans, others skip\n const [lock] = await this.execute(\n sql`SELECT pg_try_advisory_lock(hashtext('alepha:test:schema:cleanup')) AS acquired`,\n );\n\n if (!lock?.acquired) {\n return;\n }\n\n try {\n const result = await this.execute(\n sql`SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'test_alepha_%'`,\n );\n\n const now = this.dateTime.nowMillis();\n const maxAge = 60 * 60 * 1000; // 1 hour\n\n for (const row of result) {\n const name = row.schema_name as string;\n\n // Skip our own schema (it was just created or is about to be)\n if (name === this.schemaForTesting) {\n continue;\n }\n\n const age = this.parseTestSchemaAge(name, now);\n if (age !== undefined && age > maxAge) {\n this.log.warn(\n `Dropping stale test schema '${name}' (age: ${Math.round(age / 60_000)}min) ...`,\n );\n await this.execute(\n sql`DROP SCHEMA IF EXISTS ${sql.raw(name)} CASCADE`,\n );\n }\n }\n } finally {\n await this.execute(\n sql`SELECT pg_advisory_unlock(hashtext('alepha:test:schema:cleanup'))`,\n );\n }\n } catch (error) {\n // Don't fail test setup if stale cleanup fails\n this.log.warn(\"Failed to clean up stale test schemas\", { error });\n }\n }\n\n /**\n * Parse the age in milliseconds from a test schema name.\n * Format: test_alepha_{epoch_seconds}_{random8}\n * Returns undefined if the name doesn't match the expected format.\n */\n protected parseTestSchemaAge(name: string, now: number): number | undefined {\n const parts = name.split(\"_\");\n // test_alepha_{epoch}_{random} → [\"test\", \"alepha\", epoch, random]\n if (parts.length !== 4 || parts[0] !== \"test\" || parts[1] !== \"alepha\") {\n return undefined;\n }\n\n const epoch = Number(parts[2]);\n if (!Number.isFinite(epoch) || epoch <= 0) {\n return undefined;\n }\n\n return now - epoch * 1000;\n }\n}\n","import { AlephaError } from \"alepha\";\nimport { sql } from \"drizzle-orm\";\nimport type { BunSQLDatabase } from \"drizzle-orm/bun-sql\";\nimport type { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { PostgresProvider } from \"./PostgresProvider.ts\";\n\n/**\n * Bun PostgreSQL provider using Drizzle ORM with Bun's native SQL client.\n *\n * This provider uses Bun's built-in SQL class for PostgreSQL connections,\n * which provides excellent performance on the Bun runtime.\n *\n * @example\n * ```ts\n * // Set DATABASE_URL environment variable\n * // DATABASE_URL=postgres://user:password@localhost:5432/database\n *\n * // Or configure programmatically\n * alepha.with({\n * provide: DatabaseProvider,\n * use: BunPostgresProvider,\n * });\n * ```\n */\nexport class BunPostgresProvider extends PostgresProvider {\n protected client?: Bun.SQL;\n protected bunDb?: BunSQLDatabase;\n\n /**\n * Get the Drizzle Postgres database instance.\n */\n public override get db(): PgDatabase<any> {\n if (!this.bunDb) {\n throw new AlephaError(\"Database not initialized\");\n }\n\n return this.bunDb as unknown as PgDatabase<any>;\n }\n\n protected override async executeMigrations(\n migrationsFolder: string,\n ): Promise<void> {\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n const { migrate } = await import(\"drizzle-orm/bun-sql/migrator\");\n await migrate(this.bunDb!, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public async connect(): Promise<void> {\n this.log.debug(\"Connect ..\");\n\n // Check if we're running in Bun\n if (typeof Bun === \"undefined\") {\n throw new AlephaError(\n \"BunPostgresProvider requires the Bun runtime. Use NodePostgresProvider for Node.js.\",\n );\n }\n\n const { drizzle } = await import(\"drizzle-orm/bun-sql\");\n\n // Create Bun SQL client with pool options\n // Set search_path via connection URL so all pool connections use the correct schema\n let connectionUrl = this.url;\n if (this.schema !== \"public\") {\n const separator = connectionUrl.includes(\"?\") ? \"&\" : \"?\";\n connectionUrl += `${separator}search_path=${this.schema},public`;\n }\n const bunOptions: Record<string, any> = { url: connectionUrl };\n if (this.pgEnv.POOL_MAX != null) {\n bunOptions.max = this.pgEnv.POOL_MAX;\n }\n if (this.pgEnv.POOL_IDLE_TIMEOUT != null) {\n bunOptions.idleTimeout = this.pgEnv.POOL_IDLE_TIMEOUT;\n }\n if (this.pgEnv.POOL_CONNECT_TIMEOUT != null) {\n bunOptions.connectionTimeout = this.pgEnv.POOL_CONNECT_TIMEOUT;\n }\n this.client = new Bun.SQL(bunOptions);\n\n // Test connection\n await this.client.unsafe(\"SELECT 1\");\n\n this.bunDb = drizzle({\n client: this.client,\n logger: {\n logQuery: (query: string, params: unknown[]) => {\n this.log.trace(query, { params });\n },\n },\n });\n\n this.log.info(\"Connection OK\");\n }\n\n public async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Close...\");\n\n await this.client.close();\n\n this.client = undefined;\n this.bunDb = undefined;\n\n this.log.info(\"Connection closed\");\n }\n }\n}\n","import { $env, $hook, $inject, AlephaError, t } from \"alepha\";\nimport { DatabaseProvider, type SQLLike } from \"alepha/orm\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { PostgresModelBuilder } from \"../services/PostgresModelBuilder.ts\";\n\n/**\n * Cloudflare Hyperdrive PostgreSQL provider using Drizzle ORM.\n *\n * Connects to an external PostgreSQL database through Cloudflare Hyperdrive,\n * which provides connection pooling and caching at the edge.\n *\n * Creates a fresh connection per request, since Cloudflare Workers\n * cannot reuse I/O objects across request contexts.\n *\n * URL format: hyperdrive://BINDING_NAME\n */\nexport class CloudflareHyperdriveProvider extends DatabaseProvider {\n protected readonly builder = $inject(PostgresModelBuilder);\n protected readonly env = $env(\n t.object({\n DATABASE_URL: t.string({\n description: \"Expect to be 'hyperdrive://BINDING'\",\n }),\n POSTGRES_SCHEMA: t.optional(t.text()),\n }),\n );\n\n public override get schema(): string {\n return this.env.POSTGRES_SCHEMA ?? \"public\";\n }\n\n protected postgresFn?: any;\n protected drizzleFn?: any;\n protected bindingName?: string;\n\n public get name() {\n return \"postgres\";\n }\n\n public get driver() {\n return \"hyperdrive\";\n }\n\n public override readonly dialect = \"postgresql\";\n\n public override get url(): string {\n return this.env.DATABASE_URL;\n }\n\n /**\n * Get a fresh Drizzle instance per request.\n *\n * Reads the current Hyperdrive binding from `cloudflare.env`\n * and creates a new postgres client each time, avoiding the\n * \"Cannot perform I/O on behalf of a different request\" error.\n */\n public override get db(): PgDatabase<any> {\n if (!this.postgresFn || !this.drizzleFn || !this.bindingName) {\n throw new AlephaError(\"Hyperdrive database not initialized\");\n }\n\n const cloudflareEnv = this.alepha.get(\"cloudflare.env\") as\n | Record<string, unknown>\n | undefined;\n if (!cloudflareEnv) {\n throw new AlephaError(\n \"Cloudflare Workers environment not found in Alepha store under 'cloudflare.env'.\",\n );\n }\n\n const binding = cloudflareEnv[this.bindingName] as\n | { connectionString: string }\n | undefined;\n if (!binding?.connectionString) {\n throw new AlephaError(\n `Hyperdrive binding '${this.bindingName}' not found in Cloudflare Workers environment.`,\n );\n }\n\n const pgOptions: Record<string, any> = { prepare: false };\n\n // Set search_path so schema-free migration SQL resolves to the correct schema.\n if (this.schema !== \"public\") {\n pgOptions.connection = { search_path: `${this.schema}, public` };\n }\n\n const client = this.postgresFn(binding.connectionString, pgOptions);\n return this.drizzleFn(client as any) as unknown as PgDatabase<any>;\n }\n\n public override async execute(\n query: SQLLike,\n ): Promise<Array<Record<string, unknown>>> {\n return this.db.execute(query);\n }\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n this.bindingName = this.env.DATABASE_URL.replace(\"hyperdrive://\", \"\");\n\n // Pre-load modules so db getter is synchronous\n const pgModule = await import(\"postgres\");\n const drizzleModule = await import(\"drizzle-orm/postgres-js\");\n this.postgresFn = pgModule.default ?? pgModule;\n this.drizzleFn = drizzleModule.drizzle;\n\n this.log.info(\"Using Cloudflare Hyperdrive (PostgreSQL)\");\n },\n });\n\n protected async executeMigrations(migrationsFolder: string): Promise<void> {\n this.log.debug(`Running Postgres migrations from '${migrationsFolder}'...`);\n try {\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n const { migrate } = await import(\"drizzle-orm/postgres-js/migrator\");\n await migrate(this.db as any, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n this.log.debug(\"Postgres migrations completed successfully\");\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? `${error.name}: ${error.message}`\n : String(error);\n throw new AlephaError(\n `Postgres migration failed from '${migrationsFolder}': ${errorMessage}`,\n { cause: error },\n );\n }\n }\n}\n","import { AlephaError } from \"alepha\";\nimport { sql } from \"drizzle-orm\";\nimport type { PostgresJsDatabase } from \"drizzle-orm/postgres-js\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport { migrate } from \"drizzle-orm/postgres-js/migrator\";\nimport postgres from \"postgres\";\nimport { PostgresProvider } from \"./PostgresProvider.ts\";\n\nexport class NodePostgresProvider extends PostgresProvider {\n static readonly SSL_MODES = [\n \"require\",\n \"allow\",\n \"prefer\",\n \"verify-full\",\n ] as const;\n\n protected client?: postgres.Sql;\n protected pg?: PostgresJsDatabase;\n\n /**\n * Get the Drizzle Postgres database instance.\n */\n public override get db(): PostgresJsDatabase {\n if (!this.pg) {\n throw new AlephaError(\"Database not initialized\");\n }\n\n return this.pg;\n }\n\n protected override async executeMigrations(\n migrationsFolder: string,\n ): Promise<void> {\n // Set search_path so schema-free migration SQL resolves to the correct schema.\n // postgres.js doesn't support the `connection` startup parameter with pooled\n // connections (e.g. Neon), so we SET it explicitly before running migrations.\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n await migrate(this.db, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public async connect(): Promise<void> {\n const options = this.getClientOptions();\n\n this.log.debug(\"Connect ..\", {\n ...options,\n password: options.password ? \"****\" : undefined, // hide password\n });\n\n const client = postgres(options);\n await client`SELECT 1`; // test connection\n\n this.client = client;\n this.pg = drizzle(client, {\n logger: {\n // forward logs\n logQuery: (query: string, params: unknown[]) => {\n this.log.trace(query, { params });\n },\n },\n });\n\n this.log.info(\"Connection OK\");\n }\n\n public async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Close...\");\n\n await this.client.end();\n\n this.client = undefined;\n this.pg = undefined;\n\n this.log.info(\"Connection closed\");\n }\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Map the DATABASE_URL to postgres client options.\n */\n protected getClientOptions(): postgres.Options<any> {\n const url = new URL(this.url);\n\n const options: postgres.Options<any> = {\n host: url.hostname,\n user: decodeURIComponent(url.username),\n database: decodeURIComponent(url.pathname.replace(\"/\", \"\")),\n password: decodeURIComponent(url.password),\n port: Number(url.port || 5432),\n ssl: this.ssl(url),\n onnotice: () => {\n // let drizzle handle logs\n },\n };\n\n // Pool options — only set when explicitly configured via env vars\n if (this.pgEnv.POOL_MAX != null) options.max = this.pgEnv.POOL_MAX;\n if (this.pgEnv.POOL_IDLE_TIMEOUT != null)\n options.idle_timeout = this.pgEnv.POOL_IDLE_TIMEOUT;\n if (this.pgEnv.POOL_CONNECT_TIMEOUT != null)\n options.connect_timeout = this.pgEnv.POOL_CONNECT_TIMEOUT;\n\n // Set search_path at connection level so schema-free migration SQL\n // resolves to the correct PostgreSQL schema across all pool connections.\n if (this.schema !== \"public\") {\n options.connection = { search_path: `${this.schema}, public` };\n }\n\n return options;\n }\n\n protected ssl(\n url: URL,\n ): \"require\" | \"allow\" | \"prefer\" | \"verify-full\" | undefined {\n const mode = url.searchParams.get(\"sslmode\");\n for (const it of NodePostgresProvider.SSL_MODES) {\n if (mode === it) {\n return it;\n }\n }\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport type { PGlite } from \"@electric-sql/pglite\";\nimport { $env, $hook, $inject, AlephaError } from \"alepha\";\nimport { DatabaseProvider, databaseEnvSchema, type SQLLike } from \"alepha/orm\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgliteDatabase } from \"drizzle-orm/pglite\";\nimport { migrate } from \"drizzle-orm/pglite/migrator\";\nimport { postgresEnvSchema } from \"../schemas/postgresEnvSchema.ts\";\nimport { PostgresModelBuilder } from \"../services/PostgresModelBuilder.ts\";\n\nexport interface PgLiteModule {\n PGlite: typeof PGlite;\n}\n\nexport class PglitePostgresProvider extends DatabaseProvider {\n public static importPglite(): PgLiteModule | undefined {\n try {\n return createRequire(import.meta.url)(\"@electric-sql/pglite\");\n } catch {\n // ignored\n }\n }\n\n public override get schema(): string {\n return this.pgEnv.POSTGRES_SCHEMA ?? \"public\";\n }\n\n protected readonly env = $env(databaseEnvSchema);\n protected readonly pgEnv = $env(postgresEnvSchema);\n protected readonly builder = $inject(PostgresModelBuilder);\n\n protected client?: PGlite;\n protected pglite?: PgliteDatabase;\n\n public get name() {\n return \"postgres\";\n }\n\n public get driver() {\n return \"pglite\";\n }\n\n public override readonly dialect = \"postgresql\";\n\n public override get supportsTransactions(): boolean {\n return false;\n }\n\n public override get url(): string {\n let path = this.env.DATABASE_URL;\n\n if (!path) {\n if (this.alepha.isTest()) {\n path = \":memory:\"; // use in-memory database for tests by default\n } else {\n path = \"node_modules/.alepha/pglite\"; // default path for dev\n }\n } else {\n if (path.includes(\":memory:\")) {\n // like postgres://:memory: or pglite://:memory:\n path = \":memory:\";\n } else if (path.startsWith(\"file://\")) {\n path = path.replace(\"file://\", \"\");\n }\n }\n\n return path;\n }\n\n public override get db(): PgliteDatabase {\n if (!this.pglite) {\n throw new AlephaError(\"Database not initialized\");\n }\n\n return this.pglite;\n }\n\n public override async execute(\n statement: SQLLike,\n ): Promise<Array<Record<string, unknown>>> {\n const { rows } = await this.db.execute(statement);\n return rows;\n }\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n if (Object.keys(this.kit.getModels(this)).length === 0) {\n return;\n }\n\n const module = PglitePostgresProvider.importPglite();\n if (!module) {\n throw new AlephaError(\n \"@electric-sql/pglite is not installed. Please install it to use the pglite driver.\",\n );\n }\n\n const { drizzle } = createRequire(import.meta.url)(\"drizzle-orm/pglite\");\n const path = this.url;\n\n if (path !== \":memory:\") {\n await mkdir(path, { recursive: true }).catch(() => null);\n this.client = new module.PGlite(path);\n } else {\n this.client = new module.PGlite();\n }\n\n this.pglite = drizzle({\n client: this.client,\n });\n\n await this.migrate();\n\n this.log.info(`Using PGlite database at ${path}`);\n },\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: async () => {\n if (this.client) {\n this.log.debug(\"Closing PGlite connection...\");\n await this.client.close();\n this.client = undefined;\n this.pglite = undefined;\n this.log.info(\"PGlite connection closed\");\n }\n },\n });\n\n protected async executeMigrations(migrationsFolder: string): Promise<void> {\n // Set search_path so schema-free migration SQL resolves to the correct schema.\n // PGlite uses a single connection, so SET persists through the migration.\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n await migrate(this.db, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaOrm, DatabaseProvider, databaseEnvSchema } from \"alepha/orm\";\nimport { BunPostgresProvider } from \"./providers/BunPostgresProvider.ts\";\nimport { CloudflareHyperdriveProvider } from \"./providers/CloudflareHyperdriveProvider.ts\";\nimport { NodePostgresProvider } from \"./providers/NodePostgresProvider.ts\";\nimport { PglitePostgresProvider } from \"./providers/PglitePostgresProvider.ts\";\nimport { PostgresProvider } from \"./providers/PostgresProvider.ts\";\nimport { PostgresModelBuilder } from \"./services/PostgresModelBuilder.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/BunPostgresProvider.ts\";\nexport * from \"./providers/CloudflareHyperdriveProvider.ts\";\nexport * from \"./providers/NodePostgresProvider.ts\";\nexport * from \"./providers/PglitePostgresProvider.ts\";\nexport * from \"./providers/PostgresProvider.ts\";\nexport * from \"./schemas/postgresEnvSchema.ts\";\nexport * from \"./services/PostgresModelBuilder.ts\";\nexport * from \"./types/byte.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaOrmPostgres = $module({\n name: \"alepha.orm.postgres\",\n primitives: [],\n services: [\n PostgresProvider,\n CloudflareHyperdriveProvider,\n NodePostgresProvider,\n BunPostgresProvider,\n PglitePostgresProvider,\n PostgresModelBuilder,\n ],\n register: (alepha: Alepha) => {\n const env = alepha.parseEnv(databaseEnvSchema);\n\n const url = env.DATABASE_URL;\n const isBun = alepha.isBun();\n\n if (url?.startsWith(\"hyperdrive:\")) {\n alepha.with({\n optional: true,\n provide: DatabaseProvider,\n use: CloudflareHyperdriveProvider,\n });\n } else if (url?.startsWith(\"pglite:\")) {\n alepha.with({\n optional: true,\n provide: DatabaseProvider,\n use: PglitePostgresProvider,\n });\n } else if (url?.startsWith(\"postgres:\")) {\n alepha.with({\n optional: true,\n provide: DatabaseProvider,\n use: isBun ? BunPostgresProvider : NodePostgresProvider,\n });\n }\n\n // Also chain core ORM module\n alepha.with(AlephaOrm);\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["sql","sql","sql","sql","sql","migrate"],"sources":["../../../src/orm/postgres/schemas/postgresEnvSchema.ts","../../../src/orm/postgres/types/byte.ts","../../../src/orm/postgres/services/PostgresModelBuilder.ts","../../../src/orm/postgres/providers/PostgresProvider.ts","../../../src/orm/postgres/providers/BunPostgresProvider.ts","../../../src/orm/postgres/providers/CloudflareHyperdriveProvider.ts","../../../src/orm/postgres/providers/NodePostgresProvider.ts","../../../src/orm/postgres/providers/PglitePostgresProvider.ts","../../../src/orm/postgres/index.ts"],"sourcesContent":["import { type Static, t } from \"alepha\";\n\n/**\n * PostgreSQL-specific environment schema.\n *\n * Additional env vars for PostgreSQL providers on top of `databaseEnvSchema`.\n */\nexport const postgresEnvSchema = t.object({\n /**\n * PostgreSQL schema name (defaults to `\"public\"` when unset).\n */\n POSTGRES_SCHEMA: t.optional(t.text()),\n\n /**\n * Maximum number of connections in the pool.\n */\n POOL_MAX: t.optional(t.integer()),\n\n /**\n * Seconds a connection can be idle before being closed.\n */\n POOL_IDLE_TIMEOUT: t.optional(t.integer()),\n\n /**\n * Seconds to wait when establishing a new connection.\n */\n POOL_CONNECT_TIMEOUT: t.optional(t.integer()),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof postgresEnvSchema>> {}\n}\n","import { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * Postgres bytea type.\n */\nexport const byte = customType<{\n data: Buffer;\n}>({\n dataType: () => \"bytea\",\n});\n","import { AlephaError, type TObject, type TSchema, t } from \"alepha\";\nimport {\n type EntityPrimitive,\n type FromSchema,\n ModelBuilder,\n PG_CREATED_AT,\n PG_ENUM,\n PG_GENERATED,\n PG_IDENTITY,\n PG_PRIMARY_KEY,\n PG_REF,\n PG_SERIAL,\n PG_UPDATED_AT,\n type PgEnumOptions,\n type PgGeneratedOptions,\n type PgIdentityOptions,\n type PgRefOptions,\n type SequencePrimitive,\n schema,\n sql,\n type ViewPrimitive,\n} from \"alepha/orm\";\nimport type { BuildExtraConfigColumns } from \"drizzle-orm\";\nimport * as pg from \"drizzle-orm/pg-core\";\nimport {\n check,\n foreignKey,\n index,\n type PgEnum,\n type PgSchema,\n type PgTableExtraConfigValue,\n type PgTableWithColumns,\n pgEnum,\n pgMaterializedView,\n pgSchema,\n pgSequence,\n pgTable,\n pgView,\n unique,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\nimport { byte } from \"../types/byte.ts\";\n\nexport class PostgresModelBuilder extends ModelBuilder {\n protected schemas = new Map<string, PgSchema>();\n\n /**\n * Create a primary key column with UUID v7\n */\n protected getPrimaryKeyUUID(key: string) {\n return pg.uuid(key).default(sql`uuidv7()`);\n }\n\n protected getPgSchema(name: string) {\n if (!this.schemas.has(name) && name !== \"public\") {\n this.schemas.set(name, pgSchema(name));\n }\n\n const nsp =\n name !== \"public\"\n ? this.schemas.get(name)\n : ({\n enum: pgEnum,\n table: pgTable,\n sequence: pgSequence,\n } as any);\n\n if (!nsp) {\n throw new AlephaError(`Postgres schema ${name} not found`);\n }\n\n return nsp;\n }\n\n public buildTable(\n entity: EntityPrimitive<any>,\n options: {\n tables: Map<string, unknown>;\n enums: Map<string, unknown>;\n schemas: Map<string, unknown>;\n schema: string;\n },\n ) {\n const tableName = entity.name;\n if (options.tables.has(tableName)) {\n return;\n }\n\n const nsp = this.getPgSchema(options.schema);\n\n // Register PgSchema so drizzle-kit knows the schema is declared in code.\n // Without this, pushSchema diffs \"schema exists in DB but not in code\" → DROP.\n if (options.schema !== \"public\" && !options.schemas.has(options.schema)) {\n options.schemas.set(options.schema, nsp);\n }\n\n const columns = this.schemaToPgColumns(\n tableName,\n entity.schema,\n nsp,\n options.enums,\n options.tables,\n );\n\n // Build the config function that includes indexes, foreign keys, constraints, and custom config\n const configFn = this.getTableConfig(entity, options.tables);\n\n const table = nsp.table(tableName, columns, configFn);\n\n options.tables.set(tableName, table);\n }\n\n public buildView(\n view: ViewPrimitive,\n options: {\n tables: Map<string, unknown>;\n schema: string;\n },\n ) {\n const viewName = view.name;\n if (options.tables.has(viewName)) {\n return;\n }\n\n const columns = this.schemaToPgColumns(\n viewName,\n view.schema,\n { enum: pgEnum, table: pgTable, sequence: pgSequence } as any,\n new Map(),\n options.tables,\n );\n\n let drizzleView: unknown;\n if (view.materialized) {\n drizzleView = pgMaterializedView(viewName, columns).existing();\n } else {\n drizzleView = pgView(viewName, columns).existing();\n }\n\n options.tables.set(viewName, drizzleView);\n }\n\n public buildSequence(\n sequence: SequencePrimitive,\n options: {\n sequences: Map<string, unknown>;\n schema: string;\n },\n ) {\n const sequenceName = sequence.name;\n if (options.sequences.has(sequenceName)) {\n return;\n }\n\n const nsp = this.getPgSchema(options.schema);\n\n options.sequences.set(\n sequenceName,\n nsp.sequence(sequenceName, sequence.options),\n );\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Get PostgreSQL-specific config builder for the table.\n */\n protected getTableConfig(\n entity: EntityPrimitive,\n tables: Map<string, unknown>,\n ):\n | ((\n self: BuildExtraConfigColumns<string, any, \"pg\">,\n ) => PgTableExtraConfigValue[])\n | undefined {\n // PostgreSQL-specific builders\n const pgBuilders = {\n index,\n uniqueIndex,\n unique,\n check,\n foreignKey,\n };\n\n // Table resolver function\n const tableResolver = (entityName: string) => {\n return tables.get(entityName) as any;\n };\n\n return this.buildTableConfig<\n PgTableExtraConfigValue,\n BuildExtraConfigColumns<string, any, \"pg\">\n >(entity, pgBuilders as any, tableResolver);\n }\n\n schemaToPgColumns = <T extends TObject>(\n tableName: string,\n schema: T,\n nsp: PgSchema,\n enums: Map<string, unknown>,\n tables: Map<string, unknown>,\n ): FromSchema<T> => {\n return Object.entries(schema.properties).reduce<Partial<FromSchema<T>>>(\n (columns, [key, value]) => {\n let col = this.mapFieldToColumn(tableName, key, value, nsp, enums);\n\n if (\"default\" in value && value.default != null) {\n col = col.default(value.default as any);\n }\n\n if (PG_PRIMARY_KEY in value) {\n col = col.primaryKey();\n }\n\n if (PG_REF in value) {\n const config = value[PG_REF] as PgRefOptions;\n col = col.references(() => {\n const ref = config.ref();\n const table = tables.get(\n ref.entity.name,\n ) as PgTableWithColumns<any>;\n\n if (!table) {\n throw new AlephaError(\n `Referenced table ${ref.entity.name} not found for ${tableName}.${key}`,\n );\n }\n\n const target = table[ref.name];\n if (!target) {\n throw new AlephaError(\n `Referenced column ${ref.name} not found in table ${ref.entity.name} for ${tableName}.${key}`,\n );\n }\n\n return target;\n }, config.actions);\n }\n\n if (PG_GENERATED in value) {\n const gen = value[PG_GENERATED] as PgGeneratedOptions;\n col = col.generatedAlwaysAs(gen.expression);\n }\n\n if (schema.required?.includes(key)) {\n col = col.notNull();\n }\n\n return {\n ...columns,\n [key]: col,\n };\n },\n {},\n ) as FromSchema<T>;\n };\n\n mapFieldToColumn = (\n tableName: string,\n fieldName: string,\n value: TSchema,\n nsp: PgSchema,\n enums: Map<string, any>,\n ) => {\n const key = this.toColumnName(fieldName);\n\n if (\n // is nullish ?\n \"anyOf\" in value &&\n Array.isArray(value.anyOf) &&\n value.anyOf.length === 2 &&\n value.anyOf.some((it: TSchema) => t.schema.isNull(it))\n ) {\n // then, remove nullish\n value = value.anyOf.find((it: TSchema) => !t.schema.isNull(it))!;\n }\n\n if (t.schema.isInteger(value)) {\n if (PG_SERIAL in value) {\n return pg.serial(key);\n }\n\n if (PG_IDENTITY in value) {\n const options = value[PG_IDENTITY] as PgIdentityOptions;\n if (options.mode === \"byDefault\") {\n return pg.integer(key).generatedByDefaultAsIdentity(options);\n }\n return pg.integer(key).generatedAlwaysAsIdentity(options);\n }\n\n return pg.integer(key);\n }\n\n if (t.schema.isBigInt(value)) {\n if (PG_IDENTITY in value) {\n const options = value[PG_IDENTITY] as PgIdentityOptions;\n if (options.mode === \"byDefault\") {\n return pg\n .bigint(key, { mode: \"bigint\" })\n .generatedByDefaultAsIdentity(options);\n }\n return pg\n .bigint(key, { mode: \"bigint\" })\n .generatedAlwaysAsIdentity(options);\n }\n\n return pg.bigint(key, { mode: \"bigint\" });\n }\n\n if (t.schema.isNumber(value)) {\n if (PG_IDENTITY in value) {\n const options = value[PG_IDENTITY] as PgIdentityOptions;\n if (options.mode === \"byDefault\") {\n return pg\n .bigint(key, { mode: \"number\" })\n .generatedByDefaultAsIdentity(options);\n }\n return pg\n .bigint(key, { mode: \"number\" })\n .generatedAlwaysAsIdentity(options);\n }\n\n if (value.format === \"int64\") {\n return pg.bigint(key, { mode: \"number\" });\n }\n\n return pg.numeric(key);\n }\n\n if (t.schema.isString(value)) {\n return this.mapStringToColumn(key, value);\n }\n\n if (t.schema.isBoolean(value)) {\n return pg.boolean(key);\n }\n\n if (t.schema.isObject(value)) {\n return schema(key, value);\n }\n\n if (t.schema.isRecord(value)) {\n return schema(key, value);\n }\n\n const isTypeEnum = (value: any): value is { enum: any[] } =>\n t.schema.isUnsafe(value) &&\n \"type\" in value &&\n value.type === \"string\" &&\n \"enum\" in value &&\n Array.isArray(value.enum);\n\n if (t.schema.isArray(value)) {\n if (t.schema.isObject(value.items)) {\n return schema(key, value);\n }\n if (t.schema.isRecord(value.items)) {\n return schema(key, value);\n }\n if (t.schema.isString(value.items)) {\n return pg.text(key).array();\n }\n if (t.schema.isInteger(value.items)) {\n return pg.integer(key).array();\n }\n if (t.schema.isNumber(value.items)) {\n return pg.numeric(key).array();\n }\n if (t.schema.isBoolean(value.items)) {\n return pg.boolean(key).array();\n }\n if (isTypeEnum(value.items)) {\n return pg.text(key).array();\n }\n }\n\n // Enum handling\n if (isTypeEnum(value)) {\n if (!value.enum.every((it) => typeof it === \"string\")) {\n throw new AlephaError(\n `Enum for ${fieldName} must be an array of strings, got ${JSON.stringify(\n value.enum,\n )}`,\n );\n }\n\n // SQL Enum\n if (PG_ENUM in value && value[PG_ENUM]) {\n const options = value[PG_ENUM] as PgEnumOptions;\n const enumName = options.name ?? `${tableName}_${key}_enum`;\n\n if (enums.has(enumName)) {\n const values = (\n enums.get(enumName) as PgEnum<[string]>\n ).enumValues.join(\",\");\n const newValues = value.enum.join(\",\");\n if (values !== newValues) {\n throw new AlephaError(\n `Enum name conflict for ${enumName}: [${values}] vs [${newValues}]`,\n );\n }\n }\n\n enums.set(enumName, nsp.enum(enumName, value.enum as [string]));\n\n return enums.get(enumName)(key);\n }\n\n // else, map to TEXT\n return this.mapStringToColumn(key, value);\n }\n\n throw new AlephaError(\n `Unsupported schema type for ${fieldName} as ${JSON.stringify(value)}`,\n );\n };\n\n /**\n * Map a string to a PG column.\n *\n * @param key The key of the field.\n * @param value The value of the field.\n */\n mapStringToColumn = (key: string, value: TSchema) => {\n if (\"format\" in value) {\n if (value.format === \"uuid\") {\n if (PG_PRIMARY_KEY in value) {\n return this.getPrimaryKeyUUID(key);\n }\n\n return pg.uuid(key);\n }\n\n if (value.format === \"byte\") {\n return byte(key);\n }\n\n if (value.format === \"date-time\") {\n if (PG_CREATED_AT in value) {\n return pg\n .timestamp(key, { mode: \"string\", withTimezone: true })\n .defaultNow();\n }\n if (PG_UPDATED_AT in value) {\n return pg\n .timestamp(key, { mode: \"string\", withTimezone: true })\n .defaultNow();\n }\n return pg.timestamp(key, { mode: \"string\", withTimezone: true });\n }\n\n if (value.format === \"date\") {\n return pg.date(key, { mode: \"string\" });\n }\n }\n\n return pg.text(key);\n };\n}\n","import { $env, $hook, $inject, $pipeline, AlephaError } from \"alepha\";\nimport { $lock } from \"alepha/lock\";\nimport {\n DatabaseProvider,\n DbMigrationError,\n databaseEnvSchema,\n type SQLLike,\n} from \"alepha/orm\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { postgresEnvSchema } from \"../schemas/postgresEnvSchema.ts\";\nimport { PostgresModelBuilder } from \"../services/PostgresModelBuilder.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Abstract base class for PostgreSQL database providers.\n *\n * Provides shared logic for Node.js and Bun PostgreSQL providers:\n * - Environment variable handling (DATABASE_URL, POSTGRES_SCHEMA)\n * - Schema name resolution (with test schema generation)\n * - SQL execution with error wrapping\n * - Lifecycle hooks (start with migration lock, stop with test cleanup)\n *\n * Subclasses must implement `connect()`, `close()`, and `executeMigrations()`.\n */\nexport abstract class PostgresProvider extends DatabaseProvider {\n protected readonly env = $env(databaseEnvSchema);\n protected readonly pgEnv = $env(postgresEnvSchema);\n protected readonly builder = $inject(PostgresModelBuilder);\n\n public override readonly dialect = \"postgresql\";\n\n public get name() {\n return \"postgres\";\n }\n\n /**\n * In testing mode, the schema name will be generated and deleted after the test.\n */\n protected schemaForTesting = this.alepha.isTest()\n ? this.generateTestSchemaName()\n : undefined;\n\n public override get url() {\n if (!this.env.DATABASE_URL) {\n throw new AlephaError(\"DATABASE_URL is not defined in the environment\");\n }\n\n return this.env.DATABASE_URL;\n }\n\n /**\n * Execute a SQL statement.\n */\n public override async execute(\n statement: SQLLike,\n ): Promise<Array<Record<string, unknown>>> {\n return await this.db.execute(statement);\n }\n\n /**\n * Get Postgres schema used by this provider.\n */\n public override get schema(): string {\n if (this.schemaForTesting) {\n return this.schemaForTesting;\n }\n\n if (this.pgEnv.POSTGRES_SCHEMA) {\n return this.pgEnv.POSTGRES_SCHEMA;\n }\n\n return \"public\";\n }\n\n public abstract override get db(): PgDatabase<any>;\n\n /**\n * Establish the database connection.\n */\n public abstract connect(): Promise<void>;\n\n /**\n * Close the database connection.\n */\n public abstract close(): Promise<void>;\n\n // -------------------------------------------------------------------------------------------------------------------\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n await this.connect();\n await this.generateTestSchema();\n\n // never migrate in serverless mode (vercel, netlify, ...)\n if (!this.alepha.isServerless()) {\n try {\n await this.migrateLock.run();\n } catch (error) {\n throw new DbMigrationError(error);\n }\n }\n },\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: async () => {\n await this.dropTestSchema();\n await this.close();\n },\n });\n\n protected migrateLock = $pipeline({\n use: [$lock({ name: \"postgres:migrate\" })],\n handler: async () => {\n await this.migrate();\n },\n });\n\n // -------------------------------------------------------------------------------------------------------------------\n // Create unique schema for tests and clean up after. Format: test_alepha_{epoch_seconds}_{random8}\n // -------------------------------------------------------------------------------------------------------------------\n\n protected async generateTestSchema() {\n if (\n this.alepha.isTest() &&\n this.schemaForTesting?.startsWith(\"test_alepha_\")\n ) {\n // Self-healing: drop stale schemas left behind by crashed/failed test runs\n await this.cleanupStaleTestSchemas();\n\n await this.execute(\n sql`CREATE SCHEMA IF NOT EXISTS ${sql.raw(this.schemaForTesting)}`,\n );\n }\n }\n\n /**\n * Drop the current test schema if applicable.\n */\n protected async dropTestSchema(): Promise<void> {\n if (\n this.alepha.isTest() &&\n this.schemaForTesting?.startsWith(\"test_alepha_\")\n ) {\n this.log.info(`Deleting test schema '${this.schemaForTesting}' ...`);\n await this.execute(\n sql`DROP SCHEMA IF EXISTS ${sql.raw(this.schemaForTesting)} CASCADE`,\n );\n this.log.info(`Test schema '${this.schemaForTesting}' deleted`);\n }\n }\n\n /**\n * Remove stale test schemas older than 1 hour.\n *\n * Parses the embedded epoch from schema names (format: test_alepha_{epoch}_{random8})\n * and drops any that exceed the TTL. This handles schemas left behind by crashed tests,\n * killed processes, or failed startups where stop() never fired.\n *\n * Uses a PG advisory lock so only one concurrent test process performs the cleanup.\n */\n protected async cleanupStaleTestSchemas(): Promise<void> {\n try {\n // Non-blocking advisory lock — first process in cleans, others skip\n const [lock] = await this.execute(\n sql`SELECT pg_try_advisory_lock(hashtext('alepha:test:schema:cleanup')) AS acquired`,\n );\n\n if (!lock?.acquired) {\n return;\n }\n\n try {\n const result = await this.execute(\n sql`SELECT schema_name FROM information_schema.schemata WHERE schema_name LIKE 'test_alepha_%'`,\n );\n\n const now = this.dateTime.nowMillis();\n const maxAge = 60 * 60 * 1000; // 1 hour\n\n for (const row of result) {\n const name = row.schema_name as string;\n\n // Skip our own schema (it was just created or is about to be)\n if (name === this.schemaForTesting) {\n continue;\n }\n\n const age = this.parseTestSchemaAge(name, now);\n if (age !== undefined && age > maxAge) {\n this.log.warn(\n `Dropping stale test schema '${name}' (age: ${Math.round(age / 60_000)}min) ...`,\n );\n await this.execute(\n sql`DROP SCHEMA IF EXISTS ${sql.raw(name)} CASCADE`,\n );\n }\n }\n } finally {\n await this.execute(\n sql`SELECT pg_advisory_unlock(hashtext('alepha:test:schema:cleanup'))`,\n );\n }\n } catch (error) {\n // Don't fail test setup if stale cleanup fails\n this.log.warn(\"Failed to clean up stale test schemas\", { error });\n }\n }\n\n /**\n * Parse the age in milliseconds from a test schema name.\n * Format: test_alepha_{epoch_seconds}_{random8}\n * Returns undefined if the name doesn't match the expected format.\n */\n protected parseTestSchemaAge(name: string, now: number): number | undefined {\n const parts = name.split(\"_\");\n // test_alepha_{epoch}_{random} → [\"test\", \"alepha\", epoch, random]\n if (parts.length !== 4 || parts[0] !== \"test\" || parts[1] !== \"alepha\") {\n return undefined;\n }\n\n const epoch = Number(parts[2]);\n if (!Number.isFinite(epoch) || epoch <= 0) {\n return undefined;\n }\n\n return now - epoch * 1000;\n }\n}\n","import { AlephaError } from \"alepha\";\nimport { sql } from \"drizzle-orm\";\nimport type { BunSQLDatabase } from \"drizzle-orm/bun-sql\";\nimport type { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { PostgresProvider } from \"./PostgresProvider.ts\";\n\n/**\n * Bun PostgreSQL provider using Drizzle ORM with Bun's native SQL client.\n *\n * This provider uses Bun's built-in SQL class for PostgreSQL connections,\n * which provides excellent performance on the Bun runtime.\n *\n * @example\n * ```ts\n * // Set DATABASE_URL environment variable\n * // DATABASE_URL=postgres://user:password@localhost:5432/database\n *\n * // Or configure programmatically\n * alepha.with({\n * provide: DatabaseProvider,\n * use: BunPostgresProvider,\n * });\n * ```\n */\nexport class BunPostgresProvider extends PostgresProvider {\n protected client?: Bun.SQL;\n protected bunDb?: BunSQLDatabase;\n\n /**\n * Get the Drizzle Postgres database instance.\n */\n public override get db(): PgDatabase<any> {\n if (!this.bunDb) {\n throw new AlephaError(\"Database not initialized\");\n }\n\n return this.bunDb as unknown as PgDatabase<any>;\n }\n\n protected override async executeMigrations(\n migrationsFolder: string,\n ): Promise<void> {\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n const { migrate } = await import(\"drizzle-orm/bun-sql/migrator\");\n await migrate(this.bunDb!, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public async connect(): Promise<void> {\n this.log.debug(\"Connect ..\");\n\n // Check if we're running in Bun\n if (typeof Bun === \"undefined\") {\n throw new AlephaError(\n \"BunPostgresProvider requires the Bun runtime. Use NodePostgresProvider for Node.js.\",\n );\n }\n\n const { drizzle } = await import(\"drizzle-orm/bun-sql\");\n\n // Create Bun SQL client with pool options\n // Set search_path via connection URL so all pool connections use the correct schema\n let connectionUrl = this.url;\n if (this.schema !== \"public\") {\n const separator = connectionUrl.includes(\"?\") ? \"&\" : \"?\";\n connectionUrl += `${separator}search_path=${this.schema},public`;\n }\n const bunOptions: Record<string, any> = { url: connectionUrl };\n if (this.pgEnv.POOL_MAX != null) {\n bunOptions.max = this.pgEnv.POOL_MAX;\n }\n if (this.pgEnv.POOL_IDLE_TIMEOUT != null) {\n bunOptions.idleTimeout = this.pgEnv.POOL_IDLE_TIMEOUT;\n }\n if (this.pgEnv.POOL_CONNECT_TIMEOUT != null) {\n bunOptions.connectionTimeout = this.pgEnv.POOL_CONNECT_TIMEOUT;\n }\n this.client = new Bun.SQL(bunOptions);\n\n // Test connection\n await this.client.unsafe(\"SELECT 1\");\n\n this.bunDb = drizzle({\n client: this.client,\n logger: {\n logQuery: (query: string, params: unknown[]) => {\n this.log.trace(query, { params });\n },\n },\n });\n\n this.log.info(\"Connection OK\");\n }\n\n public async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Close...\");\n\n await this.client.close();\n\n this.client = undefined;\n this.bunDb = undefined;\n\n this.log.info(\"Connection closed\");\n }\n }\n}\n","import { $env, $hook, $inject, AlephaError, t } from \"alepha\";\nimport { DatabaseProvider, type SQLLike } from \"alepha/orm\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgDatabase } from \"drizzle-orm/pg-core\";\nimport { PostgresModelBuilder } from \"../services/PostgresModelBuilder.ts\";\n\n/**\n * Cloudflare Hyperdrive PostgreSQL provider using Drizzle ORM.\n *\n * Connects to an external PostgreSQL database through Cloudflare Hyperdrive,\n * which provides connection pooling and caching at the edge.\n *\n * Creates a fresh connection per request, since Cloudflare Workers\n * cannot reuse I/O objects across request contexts.\n *\n * URL format: hyperdrive://BINDING_NAME\n */\nexport class CloudflareHyperdriveProvider extends DatabaseProvider {\n protected readonly builder = $inject(PostgresModelBuilder);\n protected readonly env = $env(\n t.object({\n DATABASE_URL: t.string({\n description: \"Expect to be 'hyperdrive://BINDING'\",\n }),\n POSTGRES_SCHEMA: t.optional(t.text()),\n }),\n );\n\n public override get schema(): string {\n return this.env.POSTGRES_SCHEMA ?? \"public\";\n }\n\n protected postgresFn?: any;\n protected drizzleFn?: any;\n protected bindingName?: string;\n\n public get name() {\n return \"postgres\";\n }\n\n public get driver() {\n return \"hyperdrive\";\n }\n\n public override readonly dialect = \"postgresql\";\n\n public override get url(): string {\n return this.env.DATABASE_URL;\n }\n\n /**\n * Get a fresh Drizzle instance per request.\n *\n * Reads the current Hyperdrive binding from `cloudflare.env`\n * and creates a new postgres client each time, avoiding the\n * \"Cannot perform I/O on behalf of a different request\" error.\n */\n public override get db(): PgDatabase<any> {\n if (!this.postgresFn || !this.drizzleFn || !this.bindingName) {\n throw new AlephaError(\"Hyperdrive database not initialized\");\n }\n\n const cloudflareEnv = this.alepha.get(\"cloudflare.env\") as\n | Record<string, unknown>\n | undefined;\n if (!cloudflareEnv) {\n throw new AlephaError(\n \"Cloudflare Workers environment not found in Alepha store under 'cloudflare.env'.\",\n );\n }\n\n const binding = cloudflareEnv[this.bindingName] as\n | { connectionString: string }\n | undefined;\n if (!binding?.connectionString) {\n throw new AlephaError(\n `Hyperdrive binding '${this.bindingName}' not found in Cloudflare Workers environment.`,\n );\n }\n\n const pgOptions: Record<string, any> = { prepare: false };\n\n // Set search_path so schema-free migration SQL resolves to the correct schema.\n if (this.schema !== \"public\") {\n pgOptions.connection = { search_path: `${this.schema}, public` };\n }\n\n const client = this.postgresFn(binding.connectionString, pgOptions);\n return this.drizzleFn(client as any) as unknown as PgDatabase<any>;\n }\n\n public override async execute(\n query: SQLLike,\n ): Promise<Array<Record<string, unknown>>> {\n return this.db.execute(query);\n }\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n this.bindingName = this.env.DATABASE_URL.replace(\"hyperdrive://\", \"\");\n\n // Pre-load modules so db getter is synchronous\n const pgModule = await import(\"postgres\");\n const drizzleModule = await import(\"drizzle-orm/postgres-js\");\n this.postgresFn = pgModule.default ?? pgModule;\n this.drizzleFn = drizzleModule.drizzle;\n\n this.log.info(\"Using Cloudflare Hyperdrive (PostgreSQL)\");\n },\n });\n\n protected async executeMigrations(migrationsFolder: string): Promise<void> {\n this.log.debug(`Running Postgres migrations from '${migrationsFolder}'...`);\n try {\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n const { migrate } = await import(\"drizzle-orm/postgres-js/migrator\");\n await migrate(this.db as any, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n this.log.debug(\"Postgres migrations completed successfully\");\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? `${error.name}: ${error.message}`\n : String(error);\n throw new AlephaError(\n `Postgres migration failed from '${migrationsFolder}': ${errorMessage}`,\n { cause: error },\n );\n }\n }\n}\n","import { AlephaError } from \"alepha\";\nimport { sql } from \"drizzle-orm\";\nimport type { PostgresJsDatabase } from \"drizzle-orm/postgres-js\";\nimport { drizzle } from \"drizzle-orm/postgres-js\";\nimport { migrate } from \"drizzle-orm/postgres-js/migrator\";\nimport postgres from \"postgres\";\nimport { PostgresProvider } from \"./PostgresProvider.ts\";\n\nexport class NodePostgresProvider extends PostgresProvider {\n static readonly SSL_MODES = [\n \"require\",\n \"allow\",\n \"prefer\",\n \"verify-full\",\n ] as const;\n\n protected client?: postgres.Sql;\n protected pg?: PostgresJsDatabase;\n\n /**\n * Get the Drizzle Postgres database instance.\n */\n public override get db(): PostgresJsDatabase {\n if (!this.pg) {\n throw new AlephaError(\"Database not initialized\");\n }\n\n return this.pg;\n }\n\n protected override async executeMigrations(\n migrationsFolder: string,\n ): Promise<void> {\n // Set search_path so schema-free migration SQL resolves to the correct schema.\n // postgres.js doesn't support the `connection` startup parameter with pooled\n // connections (e.g. Neon), so we SET it explicitly before running migrations.\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n await migrate(this.db, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public async connect(): Promise<void> {\n const options = this.getClientOptions();\n\n this.log.debug(\"Connect ..\", {\n ...options,\n password: options.password ? \"****\" : undefined, // hide password\n });\n\n const client = postgres(options);\n await client`SELECT 1`; // test connection\n\n this.client = client;\n this.pg = drizzle(client, {\n logger: {\n // forward logs\n logQuery: (query: string, params: unknown[]) => {\n this.log.trace(query, { params });\n },\n },\n });\n\n this.log.info(\"Connection OK\");\n }\n\n public async close(): Promise<void> {\n if (this.client) {\n this.log.debug(\"Close...\");\n\n await this.client.end();\n\n this.client = undefined;\n this.pg = undefined;\n\n this.log.info(\"Connection closed\");\n }\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n /**\n * Map the DATABASE_URL to postgres client options.\n */\n protected getClientOptions(): postgres.Options<any> {\n const url = new URL(this.url);\n\n const options: postgres.Options<any> = {\n host: url.hostname,\n user: decodeURIComponent(url.username),\n database: decodeURIComponent(url.pathname.replace(\"/\", \"\")),\n password: decodeURIComponent(url.password),\n port: Number(url.port || 5432),\n ssl: this.ssl(url),\n onnotice: () => {\n // let drizzle handle logs\n },\n };\n\n // Pool options — only set when explicitly configured via env vars\n if (this.pgEnv.POOL_MAX != null) options.max = this.pgEnv.POOL_MAX;\n if (this.pgEnv.POOL_IDLE_TIMEOUT != null)\n options.idle_timeout = this.pgEnv.POOL_IDLE_TIMEOUT;\n if (this.pgEnv.POOL_CONNECT_TIMEOUT != null)\n options.connect_timeout = this.pgEnv.POOL_CONNECT_TIMEOUT;\n\n // Set search_path at connection level so schema-free migration SQL\n // resolves to the correct PostgreSQL schema across all pool connections.\n if (this.schema !== \"public\") {\n options.connection = { search_path: `${this.schema}, public` };\n }\n\n return options;\n }\n\n protected ssl(\n url: URL,\n ): \"require\" | \"allow\" | \"prefer\" | \"verify-full\" | undefined {\n const mode = url.searchParams.get(\"sslmode\");\n for (const it of NodePostgresProvider.SSL_MODES) {\n if (mode === it) {\n return it;\n }\n }\n }\n}\n","import { mkdir } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport type { PGlite } from \"@electric-sql/pglite\";\nimport { $env, $hook, $inject, AlephaError } from \"alepha\";\nimport { DatabaseProvider, databaseEnvSchema, type SQLLike } from \"alepha/orm\";\nimport { sql } from \"drizzle-orm\";\nimport type { PgliteDatabase } from \"drizzle-orm/pglite\";\nimport { migrate } from \"drizzle-orm/pglite/migrator\";\nimport { postgresEnvSchema } from \"../schemas/postgresEnvSchema.ts\";\nimport { PostgresModelBuilder } from \"../services/PostgresModelBuilder.ts\";\n\nexport interface PgLiteModule {\n PGlite: typeof PGlite;\n}\n\nexport class PglitePostgresProvider extends DatabaseProvider {\n public static importPglite(): PgLiteModule | undefined {\n try {\n return createRequire(import.meta.url)(\"@electric-sql/pglite\");\n } catch {\n // ignored\n }\n }\n\n public override get schema(): string {\n return this.pgEnv.POSTGRES_SCHEMA ?? \"public\";\n }\n\n protected readonly env = $env(databaseEnvSchema);\n protected readonly pgEnv = $env(postgresEnvSchema);\n protected readonly builder = $inject(PostgresModelBuilder);\n\n protected client?: PGlite;\n protected pglite?: PgliteDatabase;\n\n public get name() {\n return \"postgres\";\n }\n\n public get driver() {\n return \"pglite\";\n }\n\n public override readonly dialect = \"postgresql\";\n\n public override get supportsTransactions(): boolean {\n return false;\n }\n\n public override get url(): string {\n let path = this.env.DATABASE_URL;\n\n if (!path) {\n if (this.alepha.isTest()) {\n path = \":memory:\"; // use in-memory database for tests by default\n } else {\n path = \"node_modules/.alepha/pglite\"; // default path for dev\n }\n } else {\n if (path.includes(\":memory:\")) {\n // like postgres://:memory: or pglite://:memory:\n path = \":memory:\";\n } else if (path.startsWith(\"file://\")) {\n path = path.replace(\"file://\", \"\");\n }\n }\n\n return path;\n }\n\n public override get db(): PgliteDatabase {\n if (!this.pglite) {\n throw new AlephaError(\"Database not initialized\");\n }\n\n return this.pglite;\n }\n\n public override async execute(\n statement: SQLLike,\n ): Promise<Array<Record<string, unknown>>> {\n const { rows } = await this.db.execute(statement);\n return rows;\n }\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: async () => {\n if (Object.keys(this.kit.getModels(this)).length === 0) {\n return;\n }\n\n const module = PglitePostgresProvider.importPglite();\n if (!module) {\n throw new AlephaError(\n \"@electric-sql/pglite is not installed. Please install it to use the pglite driver.\",\n );\n }\n\n const { drizzle } = createRequire(import.meta.url)(\"drizzle-orm/pglite\");\n const path = this.url;\n\n if (path !== \":memory:\") {\n await mkdir(path, { recursive: true }).catch(() => null);\n this.client = new module.PGlite(path);\n } else {\n this.client = new module.PGlite();\n }\n\n this.pglite = drizzle({\n client: this.client,\n });\n\n await this.migrate();\n\n this.log.info(`Using PGlite database at ${path}`);\n },\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: async () => {\n if (this.client) {\n this.log.debug(\"Closing PGlite connection...\");\n await this.client.close();\n this.client = undefined;\n this.pglite = undefined;\n this.log.info(\"PGlite connection closed\");\n }\n },\n });\n\n protected async executeMigrations(migrationsFolder: string): Promise<void> {\n // Set search_path so schema-free migration SQL resolves to the correct schema.\n // PGlite uses a single connection, so SET persists through the migration.\n if (this.schema !== \"public\") {\n await this.db.execute(\n sql.raw(`SET search_path TO ${this.schema}, public`),\n );\n }\n await migrate(this.db, {\n migrationsFolder,\n migrationsTable: this.migrationsTable,\n });\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaOrm, DatabaseProvider, databaseEnvSchema } from \"alepha/orm\";\nimport { BunPostgresProvider } from \"./providers/BunPostgresProvider.ts\";\nimport { CloudflareHyperdriveProvider } from \"./providers/CloudflareHyperdriveProvider.ts\";\nimport { NodePostgresProvider } from \"./providers/NodePostgresProvider.ts\";\nimport { PglitePostgresProvider } from \"./providers/PglitePostgresProvider.ts\";\nimport { PostgresProvider } from \"./providers/PostgresProvider.ts\";\nimport { PostgresModelBuilder } from \"./services/PostgresModelBuilder.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/BunPostgresProvider.ts\";\nexport * from \"./providers/CloudflareHyperdriveProvider.ts\";\nexport * from \"./providers/NodePostgresProvider.ts\";\nexport * from \"./providers/PglitePostgresProvider.ts\";\nexport * from \"./providers/PostgresProvider.ts\";\nexport * from \"./schemas/postgresEnvSchema.ts\";\nexport * from \"./services/PostgresModelBuilder.ts\";\nexport * from \"./types/byte.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaOrmPostgres = $module({\n name: \"alepha.orm.postgres\",\n primitives: [],\n services: [\n PostgresProvider,\n CloudflareHyperdriveProvider,\n NodePostgresProvider,\n BunPostgresProvider,\n PglitePostgresProvider,\n PostgresModelBuilder,\n ],\n register: (alepha: Alepha) => {\n const env = alepha.parseEnv(databaseEnvSchema);\n\n const url = env.DATABASE_URL;\n const isBun = alepha.isBun();\n\n if (url?.startsWith(\"hyperdrive:\")) {\n alepha.with({\n optional: true,\n provide: DatabaseProvider,\n use: CloudflareHyperdriveProvider,\n });\n } else if (url?.startsWith(\"pglite:\")) {\n alepha.with({\n optional: true,\n provide: DatabaseProvider,\n use: PglitePostgresProvider,\n });\n } else if (url?.startsWith(\"postgres:\")) {\n alepha.with({\n optional: true,\n provide: DatabaseProvider,\n use: isBun ? BunPostgresProvider : NodePostgresProvider,\n });\n }\n\n // Also chain core ORM module\n alepha.with(AlephaOrm);\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as alepha from "alepha";
|
|
1
|
+
import * as _$alepha from "alepha";
|
|
2
2
|
import { Alepha, KIND, PipelinePrimitive, PipelinePrimitiveOptions, Primitive, Service, Static, TSchema } from "alepha";
|
|
3
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
3
|
+
import * as _$alepha_logger0 from "alepha/logger";
|
|
4
4
|
import { DateTimeProvider } from "alepha/datetime";
|
|
5
5
|
|
|
6
6
|
//#region ../../src/queue/core/providers/QueueProvider.d.ts
|
|
@@ -29,7 +29,7 @@ declare abstract class QueueProvider {
|
|
|
29
29
|
//#endregion
|
|
30
30
|
//#region ../../src/queue/core/providers/MemoryQueueProvider.d.ts
|
|
31
31
|
declare class MemoryQueueProvider implements QueueProvider {
|
|
32
|
-
protected readonly log: alepha_logger0.Logger;
|
|
32
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
33
33
|
protected queueList: Record<string, string[]>;
|
|
34
34
|
push(queue: string, ...messages: string[]): Promise<void>;
|
|
35
35
|
pop(queue: string): Promise<string | undefined>;
|
|
@@ -39,10 +39,10 @@ declare class MemoryQueueProvider implements QueueProvider {
|
|
|
39
39
|
/**
|
|
40
40
|
* Queue worker configuration atom.
|
|
41
41
|
*/
|
|
42
|
-
declare const queueWorkerOptions: alepha.Atom<alepha.TObject<{
|
|
43
|
-
interval: alepha.TInteger;
|
|
44
|
-
maxInterval: alepha.TInteger;
|
|
45
|
-
concurrency: alepha.TInteger;
|
|
42
|
+
declare const queueWorkerOptions: _$alepha.Atom<_$alepha.TObject<{
|
|
43
|
+
interval: _$alepha.TInteger;
|
|
44
|
+
maxInterval: _$alepha.TInteger;
|
|
45
|
+
concurrency: _$alepha.TInteger;
|
|
46
46
|
}>, "alepha.queue.worker.options">;
|
|
47
47
|
type QueueWorkerOptions = Static<typeof queueWorkerOptions.schema>;
|
|
48
48
|
declare module "alepha" {
|
|
@@ -51,7 +51,7 @@ declare module "alepha" {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
declare class WorkerProvider {
|
|
54
|
-
protected readonly log: alepha_logger0.Logger;
|
|
54
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
55
55
|
protected readonly options: Readonly<{
|
|
56
56
|
interval: number;
|
|
57
57
|
maxInterval: number;
|
|
@@ -67,13 +67,13 @@ declare class WorkerProvider {
|
|
|
67
67
|
protected consumers: Array<Consumer>;
|
|
68
68
|
protected nextConsumerIndex: number;
|
|
69
69
|
get isRunning(): boolean;
|
|
70
|
-
protected readonly start: alepha.HookPrimitive<"start">;
|
|
70
|
+
protected readonly start: _$alepha.HookPrimitive<"start">;
|
|
71
71
|
/**
|
|
72
72
|
* Start the workers.
|
|
73
73
|
* This method will create an endless loop that will check for new messages!
|
|
74
74
|
*/
|
|
75
75
|
protected startWorkers(): void;
|
|
76
|
-
protected readonly stop: alepha.HookPrimitive<"stop">;
|
|
76
|
+
protected readonly stop: _$alepha.HookPrimitive<"stop">;
|
|
77
77
|
/**
|
|
78
78
|
* Wait for the next message, where `n` is the worker number.
|
|
79
79
|
*
|
|
@@ -348,7 +348,7 @@ interface QueuePrimitiveOptions<T extends TSchema> {
|
|
|
348
348
|
handler?: (message: QueueMessage<T>) => Promise<void>;
|
|
349
349
|
}
|
|
350
350
|
declare class QueuePrimitive<T extends TSchema> extends Primitive<QueuePrimitiveOptions<T>> {
|
|
351
|
-
protected readonly log: alepha_logger0.Logger;
|
|
351
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
352
352
|
protected readonly workerProvider: WorkerProvider;
|
|
353
353
|
readonly provider: QueueProvider | MemoryQueueProvider;
|
|
354
354
|
push(...payloads: Array<Static<T>>): Promise<void>;
|
|
@@ -560,9 +560,9 @@ declare const QUEUE_DEFAULT_BINDING = "JOBS_QUEUE";
|
|
|
560
560
|
*/
|
|
561
561
|
declare class CloudflareQueueProvider extends QueueProvider {
|
|
562
562
|
protected readonly alepha: Alepha;
|
|
563
|
-
protected readonly log: alepha_logger0.Logger;
|
|
563
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
564
564
|
protected queue?: CloudflareQueue;
|
|
565
|
-
protected readonly onStart: alepha.HookPrimitive<"start">;
|
|
565
|
+
protected readonly onStart: _$alepha.HookPrimitive<"start">;
|
|
566
566
|
push(queue: string, message: string): Promise<void>;
|
|
567
567
|
/**
|
|
568
568
|
* Not used on Cloudflare — queue consumption is push-based via the `queue` handler.
|
|
@@ -587,7 +587,7 @@ declare class CloudflareQueueProvider extends QueueProvider {
|
|
|
587
587
|
*
|
|
588
588
|
* @module alepha.queue
|
|
589
589
|
*/
|
|
590
|
-
declare const AlephaQueue: alepha.Service<alepha.Module>;
|
|
590
|
+
declare const AlephaQueue: _$alepha.Service<_$alepha.Module>;
|
|
591
591
|
//#endregion
|
|
592
592
|
export { $consumer, $queue, AlephaQueue, CloudflareQueue, CloudflareQueueProvider, Consumer, ConsumerPrimitive, ConsumerPrimitiveOptions, MemoryQueueProvider, NextMessage, QUEUE_DEFAULT_BINDING, QueueMessage, QueueMessageSchema, QueuePrimitive, QueuePrimitiveOptions, QueueProvider, QueueWorkerOptions, WorkerProvider, queueWorkerOptions };
|
|
593
593
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/queue/core/providers/QueueProvider.ts","../../../src/queue/core/providers/MemoryQueueProvider.ts","../../../src/queue/core/providers/WorkerProvider.ts","../../../src/queue/core/primitives/$queue.ts","../../../src/queue/core/primitives/$consumer.ts","../../../src/queue/core/providers/CloudflareQueueProvider.ts","../../../src/queue/core/index.ts"],"mappings":";;;;;;;;;;;uBAKsB,aAAA;EAAA;;;;;;EAAA,SAOJ,IAAA,CAAK,KAAA,UAAe,OAAA,WAAkB,OAAA;EAAA;;;;;;;EAAA,SAStC,GAAA,CAAI,KAAA,WAAgB,OAAA;AAAA;;;cClBzB,mBAAA,YAA+B,aAAA;EAAA,mBACvB,GAAA,EADY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/queue/core/providers/QueueProvider.ts","../../../src/queue/core/providers/MemoryQueueProvider.ts","../../../src/queue/core/providers/WorkerProvider.ts","../../../src/queue/core/primitives/$queue.ts","../../../src/queue/core/primitives/$consumer.ts","../../../src/queue/core/providers/CloudflareQueueProvider.ts","../../../src/queue/core/index.ts"],"mappings":"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"}
|
package/dist/queue/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $hook, $inject, $module, $
|
|
1
|
+
import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, PipelinePrimitive, Primitive, createPrimitive, t } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import { DateTimeProvider } from "alepha/datetime";
|
|
4
4
|
//#region ../../src/queue/core/primitives/$consumer.ts
|
|
@@ -106,7 +106,7 @@ const queueWorkerOptions = $atom({
|
|
|
106
106
|
});
|
|
107
107
|
var WorkerProvider = class {
|
|
108
108
|
log = $logger();
|
|
109
|
-
options = $
|
|
109
|
+
options = $state(queueWorkerOptions);
|
|
110
110
|
alepha = $inject(Alepha);
|
|
111
111
|
queueProvider = $inject(QueueProvider);
|
|
112
112
|
dateTimeProvider = $inject(DateTimeProvider);
|