alepha 0.19.1 → 0.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +6 -9
- package/dist/api/audits/index.d.ts +378 -346
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +216 -184
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +534 -502
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +13 -7
- 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 +986 -931
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +160 -112
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +137 -137
- 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 +6 -18
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +5 -6
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +11811 -323
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +324 -98
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +50 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +174 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +438 -542
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +46 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +201 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +388 -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 +8 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +8 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +8 -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 +6 -3
- 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 +78 -72
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +103 -69
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +80 -70
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +19 -17
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/queue/core/index.d.ts +14 -14
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +2 -2
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +2 -2
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +4 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.d.ts +9 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +5 -4
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/head/index.d.ts +4 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/i18n/index.d.ts +9 -9
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/intro/index.d.ts +2 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +4 -5
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +215 -215
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +6 -7
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +2 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +2 -4
- package/dist/react/testing/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +4 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +13 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -2
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +47 -47
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -12
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +170 -169
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -2
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +76 -76
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +23 -17
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -13
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +2 -2
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +9 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +2 -2
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -66
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +7 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +5 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +12 -12
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +2 -2
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +5 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +7 -7
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +11 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +9 -15
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +4 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/topic/core/index.d.ts +6 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +7 -7
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/dist/websocket/index.d.ts +36 -36
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +2 -2
- package/dist/websocket/index.js.map +1 -1
- package/package.json +37 -15
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +13 -9
- package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
- package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
- package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
- package/src/api/organizations/entities/organizations.ts +20 -0
- package/src/api/organizations/index.browser.ts +10 -0
- package/src/api/organizations/index.ts +31 -0
- package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
- package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
- package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
- package/src/api/organizations/services/OrganizationService.ts +75 -0
- package/src/api/parameters/services/ParameterProvider.ts +6 -1
- package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -4
- package/src/api/users/primitives/$realm.ts +6 -4
- package/src/api/users/providers/RealmProvider.ts +1 -1
- package/src/api/users/services/RegistrationService.ts +1 -1
- package/src/api/users/services/SessionService.ts +92 -5
- package/src/api/users/services/UserService.ts +1 -1
- package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
- package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
- package/src/billing/__tests__/BillingService.spec.ts +136 -0
- package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
- package/src/billing/controllers/AdminBillingController.ts +149 -0
- package/src/billing/controllers/BillingController.ts +108 -0
- package/src/billing/entities/paymentIntents.ts +34 -0
- package/src/billing/entities/paymentMethods.ts +24 -0
- package/src/billing/entities/refunds.ts +22 -0
- package/src/billing/errors/BillingError.ts +5 -0
- package/src/billing/index.ts +76 -0
- package/src/billing/providers/BillingProvider.ts +79 -0
- package/src/billing/providers/MemoryBillingProvider.ts +139 -0
- package/src/billing/schemas/intentSchemas.ts +60 -0
- package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
- package/src/billing/schemas/refundSchemas.ts +6 -0
- package/src/billing/services/BillingService.ts +325 -0
- package/src/billing/services/PaymentMethodService.ts +82 -0
- package/src/bin/index.ts +0 -2
- package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
- package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
- package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
- package/src/cache/core/primitives/$cache.ts +2 -2
- package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
- package/src/cli/config/defineConfig.ts +17 -26
- package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
- package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
- package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
- package/src/cli/core/atoms/devOptions.ts +0 -5
- package/src/cli/core/commands/build.ts +2 -2
- package/src/cli/core/commands/dev.ts +165 -30
- package/src/cli/core/commands/gen/changelog.ts +2 -2
- package/src/cli/core/commands/init.ts +2 -7
- package/src/cli/core/commands/verify.ts +0 -1
- package/src/cli/core/providers/AppEntryProvider.ts +2 -2
- package/src/cli/core/providers/ViteDevServerProvider.ts +99 -69
- package/src/cli/core/services/PackageManagerUtils.ts +8 -1
- package/src/cli/core/services/ProjectScaffolder.ts +23 -23
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- package/src/cli/core/templates/agentMd.ts +14 -5
- 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 +214 -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 +55 -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 +60 -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/Alepha.ts +10 -0
- 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 +16 -5
- 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 +57 -106
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
- package/src/orm/core/services/ModelBuilder.ts +11 -0
- package/src/orm/core/services/QueryManager.ts +16 -2
- package/src/orm/core/services/Repository.ts +70 -10
- package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
- package/src/queue/core/providers/WorkerProvider.ts +2 -2
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
- package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
- package/src/react/core/hooks/useAction.ts +7 -6
- package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
- package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
- package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
- package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
- package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
- package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
- package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
- package/src/react/router/providers/ReactPageProvider.ts +2 -2
- package/src/react/router/providers/ReactServerProvider.ts +3 -3
- package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
- package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
- package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
- package/src/scheduler/primitives/$scheduler.ts +2 -2
- package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
- package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
- package/src/security/primitives/$issuer.ts +1 -1
- package/src/security/providers/JwtProvider.ts +6 -10
- package/src/security/providers/SecurityProvider.ts +6 -11
- package/src/security/schemas/userAccountInfoSchema.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
- package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
- package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
- package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
- package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
- package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +2 -2
- package/src/server/core/primitives/$sse.ts +2 -2
- package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
- package/src/server/core/providers/ServerCompressProvider.ts +2 -2
- package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
- package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
- package/src/server/core/providers/ServerRouterProvider.ts +1 -5
- package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
- package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
- package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
- package/src/server/links/providers/LinkProvider.ts +2 -2
- package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
- package/src/server/links/providers/ServerLinksProvider.ts +2 -2
- package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
- package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
- package/src/sms/providers/LocalSmsProvider.ts +13 -24
- package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
- package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
- package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
- package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
- package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
- package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
- package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
- package/src/cli/platform/services/DockerSshService.ts +0 -61
- /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
- /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
- /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
- /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
- /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
- /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
- /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
- /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
- /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
- /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
- /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
- /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
- /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
- /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
- /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
- /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
- /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
- /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
- /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
- /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
- /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
- /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
- /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
- /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
- /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
- /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
- /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
- /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
- /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
- /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
- /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
- /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
- /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
- /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
- /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
- /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
- /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
- /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
- /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
- /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
- /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
- /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
- /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
- /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
- /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
- /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
- /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
- /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
- /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
- /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
- /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
- /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
- /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
|
@@ -29,10 +29,13 @@ export class DrizzleKitProvider {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
if (this.alepha.isTest()) {
|
|
32
|
-
// In test mode, we want to generate migrations from scratch (no snapshots)
|
|
33
|
-
// to ensure the generated SQL is correct and can be applied cleanly.
|
|
34
32
|
const { statements } = await this.generateMigration(provider);
|
|
35
|
-
await this.
|
|
33
|
+
await this.executeStatements(
|
|
34
|
+
statements.map((s) =>
|
|
35
|
+
s.replace(/^CREATE SCHEMA /i, "CREATE SCHEMA IF NOT EXISTS "),
|
|
36
|
+
),
|
|
37
|
+
provider,
|
|
38
|
+
);
|
|
36
39
|
return;
|
|
37
40
|
}
|
|
38
41
|
|
|
@@ -52,18 +55,22 @@ export class DrizzleKitProvider {
|
|
|
52
55
|
await this.pushPostgres(kit, models, provider);
|
|
53
56
|
}
|
|
54
57
|
} catch (error) {
|
|
55
|
-
// Fallback: generate migrations from scratch (no snapshots)
|
|
56
|
-
// Covers drivers that don't support introspection (e.g. PgLite, sqlite-proxy)
|
|
58
|
+
// Fallback: generate migrations from scratch (no snapshots).
|
|
59
|
+
// Covers drivers that don't support introspection (e.g. PgLite, sqlite-proxy).
|
|
60
|
+
//
|
|
61
|
+
// If push partially executed (e.g. interactive rename applied then errored),
|
|
62
|
+
// the fallback would re-create tables that already exist. Guard against this
|
|
63
|
+
// by attempting the statements individually and ignoring "already exists" errors.
|
|
57
64
|
this.log.debug(
|
|
58
65
|
"Push sync not available, falling back to migration generation",
|
|
59
66
|
{ error },
|
|
60
67
|
);
|
|
61
68
|
const { statements } = await this.generateMigration(provider);
|
|
62
|
-
await this.
|
|
69
|
+
await this.executeStatementsLenient(statements, provider);
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
this.log.info(
|
|
66
|
-
`
|
|
73
|
+
`Synchronization of '${provider.name}' OK [${this.dateTime.nowMillis() - now}ms]`,
|
|
67
74
|
);
|
|
68
75
|
}
|
|
69
76
|
|
|
@@ -127,7 +134,6 @@ export class DrizzleKitProvider {
|
|
|
127
134
|
public getModels(provider: DatabaseProvider): Record<string, unknown> {
|
|
128
135
|
const models: Record<string, unknown> = {};
|
|
129
136
|
|
|
130
|
-
// Required for pushSchema with Postgres and POSTGRES_SCHEMA
|
|
131
137
|
for (const [key, value] of provider.schemas.entries()) {
|
|
132
138
|
models[`__schema_${key}`] = value;
|
|
133
139
|
}
|
|
@@ -232,14 +238,10 @@ export class DrizzleKitProvider {
|
|
|
232
238
|
};
|
|
233
239
|
|
|
234
240
|
if (provider.dialect === "sqlite") {
|
|
235
|
-
result = await
|
|
236
|
-
kit.pushSQLiteSchema(models, provider.db as any),
|
|
237
|
-
);
|
|
241
|
+
result = await kit.pushSQLiteSchema(models, provider.db as any);
|
|
238
242
|
} else {
|
|
239
243
|
const wrappedDb = this.wrapDbForDrizzleKit(provider.db);
|
|
240
|
-
result = await
|
|
241
|
-
kit.pushSchema(models, wrappedDb, [provider.schema]),
|
|
242
|
-
);
|
|
244
|
+
result = await kit.pushSchema(models, wrappedDb, [provider.schema]);
|
|
243
245
|
}
|
|
244
246
|
|
|
245
247
|
return {
|
|
@@ -256,11 +258,11 @@ export class DrizzleKitProvider {
|
|
|
256
258
|
models: Record<string, unknown>,
|
|
257
259
|
provider: DatabaseProvider,
|
|
258
260
|
): Promise<void> {
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
+
const { statementsToExecute } = await kit.pushSQLiteSchema(
|
|
262
|
+
models,
|
|
263
|
+
provider.db as any,
|
|
261
264
|
);
|
|
262
|
-
|
|
263
|
-
await this.runPushResult(result, provider);
|
|
265
|
+
await this.executeStatements(statementsToExecute, provider);
|
|
264
266
|
}
|
|
265
267
|
|
|
266
268
|
/**
|
|
@@ -275,78 +277,61 @@ export class DrizzleKitProvider {
|
|
|
275
277
|
await this.createSchemaIfNotExists(provider, provider.schema);
|
|
276
278
|
}
|
|
277
279
|
|
|
278
|
-
// Drizzle Kit's pushSchema
|
|
279
|
-
//
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
// This assumes node-postgres (pg) format where execute() returns { rows: [...] }.
|
|
283
|
-
// But postgres.js (used by Alepha) returns a Result that extends Array — no .rows property.
|
|
284
|
-
// We wrap the db instance so execute() returns { rows: [...] } as expected.
|
|
280
|
+
// Drizzle Kit's pushSchema expects execute() to return { rows: T[] }
|
|
281
|
+
// (node-postgres/pg format), but postgres.js returns a Result that
|
|
282
|
+
// extends Array directly — no .rows property.
|
|
285
283
|
const wrappedDb = this.wrapDbForDrizzleKit(provider.db);
|
|
286
284
|
|
|
287
|
-
const
|
|
288
|
-
|
|
289
|
-
);
|
|
290
|
-
|
|
291
|
-
await this.runPushResult(result, provider);
|
|
285
|
+
const { statementsToExecute } = await kit.pushSchema(models, wrappedDb, [
|
|
286
|
+
provider.schema,
|
|
287
|
+
]);
|
|
288
|
+
await this.executeStatements(statementsToExecute, provider);
|
|
292
289
|
}
|
|
293
290
|
|
|
294
291
|
/**
|
|
295
|
-
*
|
|
292
|
+
* Execute a list of SQL statements against the provider.
|
|
296
293
|
*/
|
|
297
|
-
protected async
|
|
298
|
-
|
|
299
|
-
statementsToExecute: string[];
|
|
300
|
-
warnings: string[];
|
|
301
|
-
hasDataLoss: boolean;
|
|
302
|
-
},
|
|
294
|
+
protected async executeStatements(
|
|
295
|
+
statements: string[],
|
|
303
296
|
provider: DatabaseProvider,
|
|
304
|
-
) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
if (upper.startsWith("DROP SCHEMA") || upper.startsWith("DROP TABLE")) {
|
|
309
|
-
this.log.warn("Skipping destructive statement", { statement: s });
|
|
310
|
-
return false;
|
|
311
|
-
}
|
|
312
|
-
return true;
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
if (result.hasDataLoss) {
|
|
316
|
-
this.log.warn("Push would cause data loss", {
|
|
317
|
-
warnings: result.warnings,
|
|
318
|
-
statements: result.statementsToExecute,
|
|
297
|
+
): Promise<void> {
|
|
298
|
+
if (statements.length > 0) {
|
|
299
|
+
this.log.debug(`Executing ${statements.length} statements ...`, {
|
|
300
|
+
statements,
|
|
319
301
|
});
|
|
320
302
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
this.log.debug(`Pushing ${safe.length} statements ...`, {
|
|
324
|
-
statements: safe,
|
|
325
|
-
});
|
|
326
|
-
for (const statement of safe) {
|
|
327
|
-
await provider.execute(sql.raw(statement));
|
|
328
|
-
}
|
|
303
|
+
for (const statement of statements) {
|
|
304
|
+
await provider.execute(sql.raw(statement));
|
|
329
305
|
}
|
|
330
306
|
}
|
|
331
307
|
|
|
332
308
|
/**
|
|
333
|
-
* Execute
|
|
334
|
-
*
|
|
309
|
+
* Execute SQL statements, ignoring "already exists" errors.
|
|
310
|
+
*
|
|
311
|
+
* Used by the fallback migration path where push may have partially
|
|
312
|
+
* applied changes before erroring, leaving some objects already created.
|
|
335
313
|
*/
|
|
336
|
-
protected async
|
|
314
|
+
protected async executeStatementsLenient(
|
|
337
315
|
statements: string[],
|
|
338
316
|
provider: DatabaseProvider,
|
|
339
317
|
): Promise<void> {
|
|
318
|
+
if (statements.length > 0) {
|
|
319
|
+
this.log.debug(
|
|
320
|
+
`Executing ${statements.length} statements (lenient) ...`,
|
|
321
|
+
{ statements },
|
|
322
|
+
);
|
|
323
|
+
}
|
|
340
324
|
for (const statement of statements) {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
325
|
+
try {
|
|
326
|
+
await provider.execute(sql.raw(statement));
|
|
327
|
+
} catch (error: any) {
|
|
328
|
+
const message = error?.message ?? "";
|
|
329
|
+
if (message.includes("already exists")) {
|
|
330
|
+
this.log.debug(`Skipped (already exists): ${statement.slice(0, 80)}`);
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
throw error;
|
|
348
334
|
}
|
|
349
|
-
await provider.execute(sql.raw(statement));
|
|
350
335
|
}
|
|
351
336
|
}
|
|
352
337
|
|
|
@@ -375,7 +360,7 @@ export class DrizzleKitProvider {
|
|
|
375
360
|
|
|
376
361
|
// -------------------------------------------------------------------------------------------------------------------
|
|
377
362
|
|
|
378
|
-
// TODO: remove
|
|
363
|
+
// TODO: remove when Drizzle Kit fixes postgres.js compatibility
|
|
379
364
|
|
|
380
365
|
/**
|
|
381
366
|
* Wrap a Drizzle PgDatabase instance for compatibility with Drizzle Kit.
|
|
@@ -401,40 +386,6 @@ export class DrizzleKitProvider {
|
|
|
401
386
|
});
|
|
402
387
|
}
|
|
403
388
|
|
|
404
|
-
/**
|
|
405
|
-
* Suppress Drizzle Kit's spinner output during a callback.
|
|
406
|
-
*
|
|
407
|
-
* Drizzle Kit uses hanji's renderWithTask with a setInterval-based spinner.
|
|
408
|
-
* If the wrapped task throws, the interval is never cleared and leaks
|
|
409
|
-
* spinner frames to stdout. We keep the filter active until the next
|
|
410
|
-
* tick after the promise settles to catch any straggling writes.
|
|
411
|
-
*/
|
|
412
|
-
protected async muteSpinner<T>(fn: () => Promise<T>): Promise<T> {
|
|
413
|
-
const originalWrite = process.stdout.write;
|
|
414
|
-
const filter = (chunk: any, ...args: any[]) => {
|
|
415
|
-
const str =
|
|
416
|
-
typeof chunk === "string" ? chunk : (chunk?.toString?.() ?? "");
|
|
417
|
-
if (str.includes("Pulling schema from database")) {
|
|
418
|
-
return true;
|
|
419
|
-
}
|
|
420
|
-
if (str.includes("\x1B[1A")) {
|
|
421
|
-
return true;
|
|
422
|
-
}
|
|
423
|
-
return (originalWrite as any).call(process.stdout, chunk, ...args);
|
|
424
|
-
};
|
|
425
|
-
process.stdout.write = filter as any;
|
|
426
|
-
try {
|
|
427
|
-
return await fn();
|
|
428
|
-
} finally {
|
|
429
|
-
// Delay restore to catch orphaned setInterval spinner writes
|
|
430
|
-
// that fire after the promise rejects but before cleanup.
|
|
431
|
-
await new Promise((r) => setTimeout(r, 200));
|
|
432
|
-
process.stdout.write = originalWrite;
|
|
433
|
-
}
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// -------------------------------------------------------------------------------------------------------------------
|
|
437
|
-
|
|
438
389
|
/**
|
|
439
390
|
* Try to load the official Drizzle Kit API.
|
|
440
391
|
*/
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
$env,
|
|
7
7
|
$hook,
|
|
8
8
|
$inject,
|
|
9
|
-
$
|
|
9
|
+
$state,
|
|
10
10
|
AlephaError,
|
|
11
11
|
type Static,
|
|
12
12
|
t,
|
|
@@ -74,7 +74,7 @@ declare module "alepha" {
|
|
|
74
74
|
export class BunSqliteProvider extends DatabaseProvider {
|
|
75
75
|
protected readonly env = $env(envSchema);
|
|
76
76
|
protected readonly builder = $inject(SqliteModelBuilder);
|
|
77
|
-
protected readonly options = $
|
|
77
|
+
protected readonly options = $state(bunSqliteOptions);
|
|
78
78
|
|
|
79
79
|
protected sqlite?: Database;
|
|
80
80
|
protected bunDb?: BunSQLiteDatabase;
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
$env,
|
|
8
8
|
$hook,
|
|
9
9
|
$inject,
|
|
10
|
-
$
|
|
10
|
+
$state,
|
|
11
11
|
AlephaError,
|
|
12
12
|
type Static,
|
|
13
13
|
t,
|
|
@@ -81,7 +81,7 @@ declare module "alepha" {
|
|
|
81
81
|
export class NodeSqliteProvider extends DatabaseProvider {
|
|
82
82
|
protected readonly env = $env(envSchema);
|
|
83
83
|
protected readonly builder = $inject(SqliteModelBuilder);
|
|
84
|
-
protected readonly options = $
|
|
84
|
+
protected readonly options = $state(nodeSqliteOptions);
|
|
85
85
|
|
|
86
86
|
protected sqlite!: DatabaseSync;
|
|
87
87
|
protected drizzleDb!: any;
|
|
@@ -182,7 +182,7 @@ export class NodeSqliteProvider extends DatabaseProvider {
|
|
|
182
182
|
await this.migrate();
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
this.log.info(`
|
|
185
|
+
this.log.info(`Sqlite connection OK`, { at: filepath });
|
|
186
186
|
},
|
|
187
187
|
});
|
|
188
188
|
|
|
@@ -136,6 +136,17 @@ export abstract class ModelBuilder {
|
|
|
136
136
|
}
|
|
137
137
|
configs.push(idx);
|
|
138
138
|
}
|
|
139
|
+
} else if ("expressions" in indexDef) {
|
|
140
|
+
const parts = indexDef.expressions(self as any);
|
|
141
|
+
if (parts.length > 0) {
|
|
142
|
+
let idx = indexDef.unique
|
|
143
|
+
? builders.uniqueIndex(indexDef.name).on(...parts)
|
|
144
|
+
: builders.index(indexDef.name).on(...parts);
|
|
145
|
+
if ("where" in indexDef && indexDef.where) {
|
|
146
|
+
idx = (idx as any).where(indexDef.where);
|
|
147
|
+
}
|
|
148
|
+
configs.push(idx);
|
|
149
|
+
}
|
|
139
150
|
} else if ("columns" in indexDef) {
|
|
140
151
|
const columnNames = indexDef.columns.map((col: any) =>
|
|
141
152
|
this.toColumnName(col as string),
|
|
@@ -338,11 +338,25 @@ export class QueryManager {
|
|
|
338
338
|
}
|
|
339
339
|
|
|
340
340
|
if (operator?.ilike != null) {
|
|
341
|
-
|
|
341
|
+
if (dialect === "sqlite") {
|
|
342
|
+
// SQLite doesn't have ilike, use LOWER() for case-insensitive matching
|
|
343
|
+
conditions.push(
|
|
344
|
+
sql`LOWER(${column}) LIKE LOWER(${encodeValue(operator.ilike)})`,
|
|
345
|
+
);
|
|
346
|
+
} else {
|
|
347
|
+
conditions.push(ilike(column, encodeValue(operator.ilike)));
|
|
348
|
+
}
|
|
342
349
|
}
|
|
343
350
|
|
|
344
351
|
if (operator?.notIlike != null) {
|
|
345
|
-
|
|
352
|
+
if (dialect === "sqlite") {
|
|
353
|
+
// SQLite doesn't have ilike, use LOWER() for case-insensitive matching
|
|
354
|
+
conditions.push(
|
|
355
|
+
sql`LOWER(${column}) NOT LIKE LOWER(${encodeValue(operator.notIlike)})`,
|
|
356
|
+
);
|
|
357
|
+
} else {
|
|
358
|
+
conditions.push(notIlike(column, encodeValue(operator.notIlike)));
|
|
359
|
+
}
|
|
346
360
|
}
|
|
347
361
|
|
|
348
362
|
if (operator?.contains != null) {
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "alepha";
|
|
13
13
|
import { type DateTime, DateTimeProvider } from "alepha/datetime";
|
|
14
14
|
import { $logger } from "alepha/logger";
|
|
15
|
+
import { currentUserAtom } from "alepha/security";
|
|
15
16
|
import {
|
|
16
17
|
asc,
|
|
17
18
|
avg,
|
|
@@ -43,6 +44,7 @@ import type {
|
|
|
43
44
|
import type { PgTransactionConfig } from "drizzle-orm/pg-core/session";
|
|
44
45
|
import {
|
|
45
46
|
PG_DELETED_AT,
|
|
47
|
+
PG_ORGANIZATION,
|
|
46
48
|
PG_PRIMARY_KEY,
|
|
47
49
|
PG_UPDATED_AT,
|
|
48
50
|
PG_VERSION,
|
|
@@ -388,9 +390,8 @@ export abstract class Repository<T extends TObject> {
|
|
|
388
390
|
);
|
|
389
391
|
}
|
|
390
392
|
|
|
391
|
-
const where = this.
|
|
392
|
-
(query.where ?? {}) as PgQueryWhere<T>,
|
|
393
|
-
opts,
|
|
393
|
+
const where = this.withOrganization(
|
|
394
|
+
this.withDeletedAt((query.where ?? {}) as PgQueryWhere<T>, opts),
|
|
394
395
|
);
|
|
395
396
|
|
|
396
397
|
builder.where(() => this.toSQL(where, joins));
|
|
@@ -565,9 +566,8 @@ export abstract class Repository<T extends TObject> {
|
|
|
565
566
|
);
|
|
566
567
|
|
|
567
568
|
if (opts.count) {
|
|
568
|
-
const countWhere = this.
|
|
569
|
-
(query.where ?? {}) as PgQueryWhere<T>,
|
|
570
|
-
opts,
|
|
569
|
+
const countWhere = this.withOrganization(
|
|
570
|
+
this.withDeletedAt((query.where ?? {}) as PgQueryWhere<T>, opts),
|
|
571
571
|
);
|
|
572
572
|
|
|
573
573
|
tasks.push(
|
|
@@ -662,6 +662,7 @@ export abstract class Repository<T extends TObject> {
|
|
|
662
662
|
opts: StatementOptions = {},
|
|
663
663
|
): Promise<Static<T>> {
|
|
664
664
|
this.assertWritable();
|
|
665
|
+
this.stampOrganization(data);
|
|
665
666
|
await this.alepha.events.emit("repository:create:before", {
|
|
666
667
|
tableName: this.tableName,
|
|
667
668
|
data,
|
|
@@ -705,6 +706,10 @@ export abstract class Repository<T extends TObject> {
|
|
|
705
706
|
return [];
|
|
706
707
|
}
|
|
707
708
|
|
|
709
|
+
for (const value of values) {
|
|
710
|
+
this.stampOrganization(value);
|
|
711
|
+
}
|
|
712
|
+
|
|
708
713
|
await this.alepha.events.emit("repository:create:before", {
|
|
709
714
|
tableName: this.tableName,
|
|
710
715
|
data: values,
|
|
@@ -774,6 +779,7 @@ export abstract class Repository<T extends TObject> {
|
|
|
774
779
|
} = {},
|
|
775
780
|
): Promise<Static<T>> {
|
|
776
781
|
this.assertWritable();
|
|
782
|
+
this.stampOrganization(data);
|
|
777
783
|
await this.alepha.events.emit("repository:create:before", {
|
|
778
784
|
tableName: this.tableName,
|
|
779
785
|
data,
|
|
@@ -862,7 +868,7 @@ export abstract class Repository<T extends TObject> {
|
|
|
862
868
|
opts.now ?? this.dateTimeProvider.nowISOString();
|
|
863
869
|
}
|
|
864
870
|
|
|
865
|
-
where = this.withDeletedAt(where, opts);
|
|
871
|
+
where = this.withOrganization(this.withDeletedAt(where, opts));
|
|
866
872
|
row = this.cast(row, false) as any;
|
|
867
873
|
|
|
868
874
|
// do not update the ID field
|
|
@@ -1025,7 +1031,7 @@ export abstract class Repository<T extends TObject> {
|
|
|
1025
1031
|
opts.now ?? this.dateTimeProvider.nowISOString();
|
|
1026
1032
|
}
|
|
1027
1033
|
|
|
1028
|
-
where = this.withDeletedAt(where, opts);
|
|
1034
|
+
where = this.withOrganization(this.withDeletedAt(where, opts));
|
|
1029
1035
|
data = this.cast(data, false) as any;
|
|
1030
1036
|
try {
|
|
1031
1037
|
const entities = await this.rawUpdate(opts)
|
|
@@ -1070,6 +1076,8 @@ export abstract class Repository<T extends TObject> {
|
|
|
1070
1076
|
);
|
|
1071
1077
|
}
|
|
1072
1078
|
|
|
1079
|
+
where = this.withOrganization(where);
|
|
1080
|
+
|
|
1073
1081
|
await this.alepha.events.emit("repository:delete:before", {
|
|
1074
1082
|
tableName: this.tableName,
|
|
1075
1083
|
where,
|
|
@@ -1170,7 +1178,7 @@ export abstract class Repository<T extends TObject> {
|
|
|
1170
1178
|
where: PgQueryWhereOrSQL<T> = {},
|
|
1171
1179
|
opts: StatementOptions = {},
|
|
1172
1180
|
): Promise<number> {
|
|
1173
|
-
where = this.withDeletedAt(where, opts);
|
|
1181
|
+
where = this.withOrganization(this.withDeletedAt(where, opts));
|
|
1174
1182
|
const db = opts.tx === null ? this.provider.db : (opts.tx ?? this.db);
|
|
1175
1183
|
return db.$count(this.table, this.toSQL(where));
|
|
1176
1184
|
}
|
|
@@ -1234,7 +1242,9 @@ export abstract class Repository<T extends TObject> {
|
|
|
1234
1242
|
|
|
1235
1243
|
// WHERE
|
|
1236
1244
|
if (query.where) {
|
|
1237
|
-
const where = this.
|
|
1245
|
+
const where = this.withOrganization(
|
|
1246
|
+
this.withDeletedAt(query.where as any, opts),
|
|
1247
|
+
);
|
|
1238
1248
|
builder = builder.where(this.toSQL(where)) as any;
|
|
1239
1249
|
}
|
|
1240
1250
|
|
|
@@ -1458,6 +1468,56 @@ export abstract class Repository<T extends TObject> {
|
|
|
1458
1468
|
return undefined;
|
|
1459
1469
|
}
|
|
1460
1470
|
|
|
1471
|
+
protected withOrganization(
|
|
1472
|
+
where: PgQueryWhereOrSQL<T>,
|
|
1473
|
+
): PgQueryWhereOrSQL<T> {
|
|
1474
|
+
const orgField = this.organizationField();
|
|
1475
|
+
if (!orgField) {
|
|
1476
|
+
return where;
|
|
1477
|
+
}
|
|
1478
|
+
|
|
1479
|
+
const user = this.alepha.store.get(currentUserAtom);
|
|
1480
|
+
if (!user?.organization) {
|
|
1481
|
+
return where;
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
return {
|
|
1485
|
+
and: [
|
|
1486
|
+
where,
|
|
1487
|
+
{
|
|
1488
|
+
or: [
|
|
1489
|
+
{ [orgField.key]: { eq: user.organization } },
|
|
1490
|
+
{ [orgField.key]: { isNull: true } },
|
|
1491
|
+
],
|
|
1492
|
+
} as any,
|
|
1493
|
+
],
|
|
1494
|
+
} as PgQueryWhereOrSQL<T>;
|
|
1495
|
+
}
|
|
1496
|
+
|
|
1497
|
+
protected stampOrganization(data: any): void {
|
|
1498
|
+
const orgField = this.organizationField();
|
|
1499
|
+
if (!orgField) {
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
if (data[orgField.key] != null) {
|
|
1504
|
+
return;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
const user = this.alepha.store.get(currentUserAtom);
|
|
1508
|
+
if (user?.organization) {
|
|
1509
|
+
data[orgField.key] = user.organization;
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
|
|
1513
|
+
protected organizationField(): PgAttrField | undefined {
|
|
1514
|
+
const fields = getAttrFields(this.entity.schema, PG_ORGANIZATION);
|
|
1515
|
+
if (fields.length > 0) {
|
|
1516
|
+
return fields[0];
|
|
1517
|
+
}
|
|
1518
|
+
return undefined;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1461
1521
|
/**
|
|
1462
1522
|
* Convert something to valid Pg Insert Value.
|
|
1463
1523
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it } from "bun:test";
|
|
2
2
|
import { Alepha, t } from "alepha";
|
|
3
3
|
import { $entity, $repository, DatabaseProvider, db } from "alepha/orm";
|
|
4
|
-
import { BunPostgresProvider } from "
|
|
4
|
+
import { BunPostgresProvider } from "../providers/BunPostgresProvider.ts";
|
|
5
5
|
|
|
6
6
|
// -------------------------------------------------------------------------------------------------------------------
|
|
7
7
|
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
$atom,
|
|
3
3
|
$hook,
|
|
4
4
|
$inject,
|
|
5
|
-
$
|
|
5
|
+
$state,
|
|
6
6
|
Alepha,
|
|
7
7
|
type Static,
|
|
8
8
|
type TSchema,
|
|
@@ -61,7 +61,7 @@ declare module "alepha" {
|
|
|
61
61
|
|
|
62
62
|
export class WorkerProvider {
|
|
63
63
|
protected readonly log = $logger();
|
|
64
|
-
protected readonly options = $
|
|
64
|
+
protected readonly options = $state(queueWorkerOptions);
|
|
65
65
|
protected readonly alepha = $inject(Alepha);
|
|
66
66
|
protected readonly queueProvider = $inject(QueueProvider);
|
|
67
67
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $inject, $
|
|
1
|
+
import { $atom, $inject, $state, type Static, t } from "alepha";
|
|
2
2
|
import type { QueueProvider } from "alepha/queue";
|
|
3
3
|
import { RedisProvider } from "alepha/redis";
|
|
4
4
|
|
|
@@ -31,7 +31,7 @@ declare module "alepha" {
|
|
|
31
31
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
32
32
|
|
|
33
33
|
export class RedisQueueProvider implements QueueProvider {
|
|
34
|
-
protected readonly options = $
|
|
34
|
+
protected readonly options = $state(redisQueueOptions);
|
|
35
35
|
protected readonly redisProvider: RedisProvider = $inject(RedisProvider);
|
|
36
36
|
|
|
37
37
|
public prefix(queue: string): string {
|
|
@@ -4,7 +4,7 @@ import { AlephaDateTime } from "alepha/datetime";
|
|
|
4
4
|
import type { ReactNode } from "react";
|
|
5
5
|
import { describe, test, vi } from "vitest";
|
|
6
6
|
import { AlephaContext } from "../contexts/AlephaContext.ts";
|
|
7
|
-
import { useAction } from "
|
|
7
|
+
import { useAction } from "../hooks/useAction.ts";
|
|
8
8
|
|
|
9
9
|
describe("useAction", () => {
|
|
10
10
|
test("should handle successful action", async ({ expect }) => {
|
|
@@ -134,8 +134,10 @@ export function useAction<Args extends any[], Result = void>(
|
|
|
134
134
|
const isMountedRef = useRef(true);
|
|
135
135
|
const intervalRef = useRef<Interval | undefined>(undefined);
|
|
136
136
|
|
|
137
|
-
//
|
|
137
|
+
// Track mount state — must set true in body for React StrictMode double-invoke
|
|
138
138
|
useEffect(() => {
|
|
139
|
+
isMountedRef.current = true;
|
|
140
|
+
|
|
139
141
|
return () => {
|
|
140
142
|
isMountedRef.current = false;
|
|
141
143
|
|
|
@@ -179,12 +181,11 @@ export function useAction<Args extends any[], Result = void>(
|
|
|
179
181
|
setLoading(true);
|
|
180
182
|
setError(undefined);
|
|
181
183
|
|
|
182
|
-
await alepha.events.emit("react:action:begin", {
|
|
183
|
-
type: "custom",
|
|
184
|
-
id: options.id,
|
|
185
|
-
});
|
|
186
|
-
|
|
187
184
|
try {
|
|
185
|
+
await alepha.events.emit("react:action:begin", {
|
|
186
|
+
type: "custom",
|
|
187
|
+
id: options.id,
|
|
188
|
+
});
|
|
188
189
|
// Pass abort signal as last argument to handler
|
|
189
190
|
const result = await options.handler(...args, {
|
|
190
191
|
signal: abortController.signal,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
3
3
|
import type { Head } from "../interfaces/Head.ts";
|
|
4
|
-
import { BrowserHeadProvider } from "
|
|
4
|
+
import { BrowserHeadProvider } from "../providers/BrowserHeadProvider.ts";
|
|
5
5
|
|
|
6
6
|
describe("BrowserHeadProvider", () => {
|
|
7
7
|
let alepha: Alepha;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { describe, it } from "vitest";
|
|
3
|
-
import { SeoExpander } from "
|
|
3
|
+
import { SeoExpander } from "../helpers/SeoExpander.ts";
|
|
4
4
|
|
|
5
5
|
describe("SeoExpander", () => {
|
|
6
6
|
it("should expand basic SEO configuration", ({ expect }) => {
|
|
@@ -2,7 +2,7 @@ import { Alepha } from "alepha";
|
|
|
2
2
|
import { describe, test } from "vitest";
|
|
3
3
|
import { AlephaReactI18n } from "../index.ts";
|
|
4
4
|
import { $dictionary } from "../primitives/$dictionary.ts";
|
|
5
|
-
import { I18nProvider } from "
|
|
5
|
+
import { I18nProvider } from "../providers/I18nProvider.ts";
|
|
6
6
|
|
|
7
7
|
describe("I18nProvider", () => {
|
|
8
8
|
test("should register dictionaries on initialization", async ({ expect }) => {
|
|
@@ -4,10 +4,10 @@ import { AlephaContext } from "alepha/react";
|
|
|
4
4
|
import type { ReactNode } from "react";
|
|
5
5
|
import { act } from "react";
|
|
6
6
|
import { describe, test } from "vitest";
|
|
7
|
+
import { useI18n } from "../hooks/useI18n.ts";
|
|
7
8
|
import { AlephaReactI18n } from "../index.ts";
|
|
8
9
|
import { $dictionary } from "../primitives/$dictionary.ts";
|
|
9
10
|
import { I18nProvider } from "../providers/I18nProvider.ts";
|
|
10
|
-
import { useI18n } from "./useI18n.ts";
|
|
11
11
|
|
|
12
12
|
describe("useI18n hook", () => {
|
|
13
13
|
const renderWithAlepha = (alepha: Alepha, element: ReactNode) => {
|
|
@@ -6,7 +6,7 @@ import type { GettingStartedSlide } from "./GettingStarted.tsx";
|
|
|
6
6
|
* Returns undefined if devtools are not available.
|
|
7
7
|
*/
|
|
8
8
|
export const useDevtoolsSlide = (): GettingStartedSlide | undefined => {
|
|
9
|
-
if (!import.meta.env
|
|
9
|
+
if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {
|
|
10
10
|
return undefined;
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
-
import { ReactBrowserProvider } from "
|
|
3
|
+
import { ReactBrowserProvider } from "../providers/ReactBrowserProvider.ts";
|
|
4
4
|
|
|
5
5
|
class TestReactBrowserProvider extends ReactBrowserProvider {
|
|
6
6
|
public testGetHydrationState = this.getHydrationState.bind(this);
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
$atom,
|
|
3
3
|
$hook,
|
|
4
4
|
$inject,
|
|
5
|
-
$
|
|
5
|
+
$state,
|
|
6
6
|
Alepha,
|
|
7
7
|
type State,
|
|
8
8
|
type Static,
|
|
@@ -54,7 +54,7 @@ export class ReactBrowserProvider {
|
|
|
54
54
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
55
55
|
protected readonly browserHeadProvider = $inject(BrowserHeadProvider);
|
|
56
56
|
|
|
57
|
-
protected readonly options = $
|
|
57
|
+
protected readonly options = $state(reactBrowserOptions);
|
|
58
58
|
|
|
59
59
|
public get rootId() {
|
|
60
60
|
return "root";
|