alepha 0.21.2 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +393 -403
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +25 -56
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +31 -1
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +313 -208
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +152 -42
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +2 -2
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +289 -292
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +39 -33
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +211 -216
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +188 -195
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +71 -76
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +104 -109
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +43 -16
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +488 -344
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +175 -35
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +396 -402
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +644 -652
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +1 -1
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -0
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1073 -1006
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +283 -61
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +134 -140
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +95 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +121 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/index.workerd.js +110 -0
- package/dist/background/index.workerd.js.map +1 -0
- package/dist/batch/index.d.ts +5 -7
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +76 -54
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +58 -11
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +200 -5
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +7 -10
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -26
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +4 -7
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/captcha/index.d.ts +3 -6
- package/dist/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +417 -214
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +325 -563
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -5
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +8 -12
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +126 -1342
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +136 -2374
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +1446 -0
- package/dist/cli/platform-lib/index.d.ts.map +1 -0
- package/dist/cli/platform-lib/index.js +2597 -0
- package/dist/cli/platform-lib/index.js.map +1 -0
- package/dist/cli/vendor/index.d.ts +17 -21
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +21 -20
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +39 -10
- package/dist/command/index.js.map +1 -1
- package/dist/{containers → container}/core/index.d.ts +13 -15
- package/dist/container/core/index.d.ts.map +1 -0
- package/dist/{containers → container}/core/index.js +23 -14
- package/dist/container/core/index.js.map +1 -0
- package/dist/{containers → container}/core/index.workerd.js +37 -22
- package/dist/container/core/index.workerd.js.map +1 -0
- package/dist/core/index.browser.js +27 -1
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +48 -24
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +27 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +27 -1
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +27 -1
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +5 -8
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +3 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +2 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +20 -7
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +46 -9
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +6 -9
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +10 -13
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +107 -32
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1 -2
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +9 -14
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +2 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +105 -76
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +196 -174
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +16 -20
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +19 -1
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +76 -62
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +20 -2
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +28 -20
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +12 -15
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -5
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.browser.js +9 -2
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +14 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js +9 -2
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +7 -8
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +6 -3
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +2 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.browser.js.map +1 -1
- package/dist/react/head/index.d.ts +2 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +47 -11
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +33 -1
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +2 -2
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +65 -19
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +327 -222
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +65 -29
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +1 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +16 -17
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/ui/index.d.ts +20 -25
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +17 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +2 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +10 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +45 -48
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +167 -172
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +4 -8
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +5 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +88 -73
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +19 -0
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +11 -14
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +6 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/etag/index.js.map +1 -1
- package/dist/server/health/index.d.ts +18 -21
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +2 -0
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +63 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +2 -0
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +5 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +3 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +10 -13
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +3 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +5 -8
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +3 -5
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +2 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.d.ts +4 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +5 -8
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js.map +1 -1
- package/package.json +45 -22
- package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
- package/src/api/audits/controllers/AdminAuditController.ts +14 -0
- package/src/api/audits/services/AuditService.ts +21 -88
- package/src/api/files/__tests__/FileService.spec.ts +207 -2
- package/src/api/files/index.ts +3 -0
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
- package/src/api/files/schemas/fileResourceSchema.ts +10 -1
- package/src/api/files/services/FileService.ts +170 -72
- package/src/api/jobs/__tests__/$job.spec.ts +24 -1
- package/src/api/jobs/index.ts +4 -3
- package/src/api/jobs/primitives/$job.ts +7 -3
- package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
- package/src/api/jobs/providers/JobProvider.ts +53 -24
- package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
- package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
- package/src/api/parameters/audits/ParameterAudits.ts +17 -0
- package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
- package/src/api/parameters/index.ts +3 -0
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
- package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
- package/src/api/parameters/services/ParameterProvider.ts +69 -6
- package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
- package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
- package/src/api/users/audits/SessionAudits.ts +33 -0
- package/src/api/users/audits/UserAudits.ts +19 -43
- package/src/api/users/controllers/AdminUserController.ts +66 -1
- package/src/api/users/entities/sessions.ts +6 -0
- package/src/api/users/entities/users.ts +2 -0
- package/src/api/users/index.ts +9 -1
- package/src/api/users/primitives/$realm.ts +3 -0
- package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
- package/src/api/users/schemas/updateUserSchema.ts +1 -8
- package/src/api/users/schemas/userQuerySchema.ts +7 -0
- package/src/api/users/services/CredentialService.ts +15 -6
- package/src/api/users/services/IdentityService.ts +2 -1
- package/src/api/users/services/RegistrationService.ts +2 -1
- package/src/api/users/services/SessionCrudService.ts +19 -2
- package/src/api/users/services/SessionService.ts +39 -19
- package/src/api/users/services/UserService.ts +106 -8
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
- package/src/background/index.ts +37 -0
- package/src/background/index.workerd.ts +28 -0
- package/src/background/providers/BackgroundTaskProvider.ts +70 -0
- package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
- package/src/bucket/__tests__/$bucket.spec.ts +18 -0
- package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
- package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
- package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
- package/src/bucket/__tests__/shared.ts +30 -0
- package/src/bucket/index.ts +5 -5
- package/src/bucket/index.workerd.ts +11 -4
- package/src/bucket/primitives/$bucket.ts +27 -0
- package/src/bucket/providers/FileStorageProvider.ts +13 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
- package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
- package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
- package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
- package/src/cli/core/__tests__/init.spec.ts +0 -219
- package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
- package/src/cli/core/commands/build.ts +108 -30
- package/src/cli/core/commands/init.ts +0 -12
- package/src/cli/core/commands/pack.ts +133 -0
- package/src/cli/core/index.ts +3 -0
- package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
- package/src/cli/core/services/PackageManagerUtils.ts +0 -16
- package/src/cli/core/services/ProjectScaffolder.ts +29 -291
- package/src/cli/core/tasks/BuildCloudflareTask.ts +353 -47
- package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
- package/src/cli/core/tasks/BuildTask.ts +34 -0
- package/src/cli/core/templates/apiIndexTs.ts +1 -22
- package/src/cli/core/templates/mainCss.ts +0 -1
- package/src/cli/core/templates/webAppRouterTs.ts +0 -99
- package/src/cli/core/templates/webIndexTs.ts +1 -22
- package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
- package/src/cli/platform/commands/SecretsCommand.ts +8 -6
- package/src/cli/platform/commands/platform.ts +192 -46
- package/src/cli/platform/index.ts +12 -52
- package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
- package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
- package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
- package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +402 -165
- package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
- package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
- package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
- package/src/cli/platform-lib/index.ts +67 -0
- package/src/cli/platform-lib/services/NamingService.ts +136 -0
- package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
- package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
- package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
- package/src/command/__tests__/Runner.spec.ts +20 -0
- package/src/command/helpers/EnvUtils.ts +19 -3
- package/src/command/helpers/Runner.ts +12 -2
- package/src/command/providers/CliProvider.ts +34 -1
- package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
- package/src/{containers → container}/core/index.ts +4 -4
- package/src/{containers → container}/core/index.workerd.ts +19 -3
- package/src/{containers → container}/core/primitives/$container.ts +1 -1
- package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
- package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
- package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
- package/src/core/Alepha.ts +49 -1
- package/src/core/__tests__/$env.spec.ts +42 -0
- package/src/core/__tests__/dump.spec.ts +47 -0
- package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
- package/src/email/cloudflare/index.ts +14 -5
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
- package/src/logger/__tests__/Logger.spec.ts +55 -0
- package/src/logger/index.ts +13 -0
- package/src/logger/services/Logger.ts +31 -1
- package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
- package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
- package/src/orm/core/interfaces/PgQuery.ts +4 -1
- package/src/orm/core/services/Repository.ts +27 -11
- package/src/react/auth/hooks/useAuth.ts +10 -5
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
- package/src/react/core/hooks/useAction.ts +14 -3
- package/src/react/core/hooks/useQuery.ts +24 -4
- package/src/react/i18n/components/Translate.tsx +47 -0
- package/src/react/i18n/index.ts +2 -0
- package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
- package/src/react/router/__tests__/$page.spec.tsx +3 -2
- package/src/react/router/__tests__/page-can.spec.ts +18 -13
- package/src/react/router/hooks/useQueryParams.ts +114 -14
- package/src/react/router/primitives/$page.ts +85 -4
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +3 -7
- package/src/react/router/providers/ReactServerProvider.ts +4 -13
- package/src/react/ui/services/SchemaControl.ts +3 -4
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
- package/src/server/links/providers/LinkProvider.ts +10 -0
- package/dist/containers/core/index.d.ts.map +0 -1
- package/dist/containers/core/index.js.map +0 -1
- package/dist/containers/core/index.workerd.js.map +0 -1
- package/src/cli/core/templates/componentsJsonTs.ts +0 -39
- package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
- package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
- package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
- package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
- package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
- package/src/cli/platform/services/NamingService.ts +0 -54
- /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
- /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
- /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
- /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
|
@@ -1,8 +1,25 @@
|
|
|
1
|
+
import { AlephaError } from "alepha";
|
|
1
2
|
import type { AppEntry } from "alepha/cli";
|
|
2
3
|
import type { RunnerMethod } from "alepha/command";
|
|
3
4
|
import type { EnvironmentConfig } from "../atoms/platformOptions.ts";
|
|
4
5
|
import type { NamingContext } from "../services/NamingService.ts";
|
|
5
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Options for {@link PlatformAdapter.exportDb}.
|
|
9
|
+
*/
|
|
10
|
+
export interface ExportDbOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Destination file for the local snapshot. Adapter-specific default —
|
|
13
|
+
* Cloudflare/D1 writes the dev SQLite at
|
|
14
|
+
* `node_modules/.alepha/sqlite.db`.
|
|
15
|
+
*/
|
|
16
|
+
output?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Keep the intermediate `.sql` dump instead of deleting it after import.
|
|
19
|
+
*/
|
|
20
|
+
keepSql?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
6
23
|
// ---------------------------------------------------------------------------
|
|
7
24
|
// Context types
|
|
8
25
|
// ---------------------------------------------------------------------------
|
|
@@ -15,32 +32,14 @@ export interface DetectedResources {
|
|
|
15
32
|
hasCron: boolean;
|
|
16
33
|
}
|
|
17
34
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Relative path from root (e.g., "apps/api").
|
|
26
|
-
* Empty string for standalone apps.
|
|
27
|
-
*/
|
|
28
|
-
path: string;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Resolved entry points for this app.
|
|
32
|
-
*/
|
|
33
|
-
entry: AppEntry;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Cloud resources detected by introspecting the app.
|
|
37
|
-
*/
|
|
38
|
-
resources: DetectedResources;
|
|
39
|
-
}
|
|
40
|
-
|
|
35
|
+
/**
|
|
36
|
+
* One workspace = one app. Used to be a per-app definition in a
|
|
37
|
+
* monorepo-aware orchestrator; flattened into `PlatformContext` after
|
|
38
|
+
* the `apps:` field was removed from platform options.
|
|
39
|
+
*/
|
|
41
40
|
export interface PlatformContext {
|
|
42
41
|
/**
|
|
43
|
-
* Slugified project name (from
|
|
42
|
+
* Slugified project name (from package.json or platform config).
|
|
44
43
|
*/
|
|
45
44
|
project: string;
|
|
46
45
|
|
|
@@ -55,20 +54,35 @@ export interface PlatformContext {
|
|
|
55
54
|
envConfig: EnvironmentConfig;
|
|
56
55
|
|
|
57
56
|
/**
|
|
58
|
-
*
|
|
57
|
+
* Workspace root path.
|
|
59
58
|
*/
|
|
60
|
-
|
|
59
|
+
root: string;
|
|
61
60
|
|
|
62
61
|
/**
|
|
63
|
-
*
|
|
62
|
+
* Resolved entry points for the workspace. Stub (`{ root, server: "" }`)
|
|
63
|
+
* in pre-built / manifest mode since no source booting happens.
|
|
64
64
|
*/
|
|
65
|
-
|
|
65
|
+
entry: AppEntry;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Cloud resources the workspace uses — discovered at build time, read
|
|
69
|
+
* from `dist/manifest.json` at deploy time.
|
|
70
|
+
*/
|
|
71
|
+
resources: DetectedResources;
|
|
66
72
|
|
|
67
73
|
/**
|
|
68
|
-
* Resource name generator bound to this project+env.
|
|
74
|
+
* Resource name generator bound to this project+env(+tenant).
|
|
69
75
|
*/
|
|
70
76
|
naming: NamingContext;
|
|
71
77
|
|
|
78
|
+
/**
|
|
79
|
+
* Active tenant slug for this deploy (apps with `tenancy: optional |
|
|
80
|
+
* required`), or `undefined` for a base / non-tenanted deploy. Shapes
|
|
81
|
+
* the served host (`<tenant>.<domain>`); resource names already fold it
|
|
82
|
+
* in via {@link naming}.
|
|
83
|
+
*/
|
|
84
|
+
tenant?: string;
|
|
85
|
+
|
|
72
86
|
/**
|
|
73
87
|
* Pre-built mode. When true, the adapter's `build()` should skip the
|
|
74
88
|
* Vite bundle steps and only regenerate the deploy config
|
|
@@ -78,12 +92,11 @@ export interface PlatformContext {
|
|
|
78
92
|
prebuilt?: boolean;
|
|
79
93
|
}
|
|
80
94
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
95
|
+
/**
|
|
96
|
+
* @deprecated Same as `PlatformContext` since the `apps:` collapse —
|
|
97
|
+
* kept as a type alias so existing adapter signatures still compile.
|
|
98
|
+
*/
|
|
99
|
+
export type AppContext = PlatformContext;
|
|
87
100
|
|
|
88
101
|
// ---------------------------------------------------------------------------
|
|
89
102
|
// State types (returned by inspect)
|
|
@@ -158,6 +171,20 @@ export abstract class PlatformAdapter {
|
|
|
158
171
|
*/
|
|
159
172
|
async migrate(_ctx: PlatformContext, _run: RunnerMethod): Promise<void> {}
|
|
160
173
|
|
|
174
|
+
/**
|
|
175
|
+
* Export the deployed database to a local file — the remote → local dev
|
|
176
|
+
* snapshot workflow. Adapter/dialect specific; the default refuses.
|
|
177
|
+
*/
|
|
178
|
+
async exportDb(
|
|
179
|
+
_ctx: PlatformContext,
|
|
180
|
+
_run: RunnerMethod,
|
|
181
|
+
_options: ExportDbOptions = {},
|
|
182
|
+
): Promise<void> {
|
|
183
|
+
throw new AlephaError(
|
|
184
|
+
`Database export is not supported by the '${this.constructor.name}' adapter.`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
161
188
|
/**
|
|
162
189
|
* Push runtime secrets to the deployed worker(s).
|
|
163
190
|
*
|
|
@@ -95,9 +95,7 @@ export class VercelAdapter extends PlatformAdapter {
|
|
|
95
95
|
// -------------------------------------------------------------------------
|
|
96
96
|
|
|
97
97
|
async build(ctx: AppContext, run: RunnerMethod): Promise<void> {
|
|
98
|
-
const appDir = ctx.
|
|
99
|
-
? this.fs.join(ctx.root, ctx.app.path)
|
|
100
|
-
: ctx.root;
|
|
98
|
+
const appDir = ctx.root;
|
|
101
99
|
|
|
102
100
|
await run({
|
|
103
101
|
name: "alepha build -t vercel",
|
|
@@ -117,16 +115,14 @@ export class VercelAdapter extends PlatformAdapter {
|
|
|
117
115
|
ctx: AppContext,
|
|
118
116
|
run: RunnerMethod,
|
|
119
117
|
): Promise<string | undefined> {
|
|
120
|
-
const distDir = ctx.
|
|
121
|
-
? this.fs.join(ctx.root, ctx.app.path, "dist")
|
|
122
|
-
: this.fs.join(ctx.root, "dist");
|
|
118
|
+
const distDir = this.fs.join(ctx.root, "dist");
|
|
123
119
|
|
|
124
120
|
const projectName = ctx.naming.worker();
|
|
125
121
|
|
|
126
122
|
let url: string | undefined;
|
|
127
123
|
|
|
128
124
|
await run({
|
|
129
|
-
name: `deploy ${ctx.
|
|
125
|
+
name: `deploy ${ctx.project}`,
|
|
130
126
|
handler: async () => {
|
|
131
127
|
// Ensure project exists and has framework: null for prebuilt deploys
|
|
132
128
|
let project = await this.api.getProject(projectName);
|
|
@@ -199,7 +195,7 @@ export class VercelAdapter extends PlatformAdapter {
|
|
|
199
195
|
return;
|
|
200
196
|
}
|
|
201
197
|
|
|
202
|
-
|
|
198
|
+
{
|
|
203
199
|
const projectName = ctx.naming.worker();
|
|
204
200
|
|
|
205
201
|
await run({
|
|
@@ -231,7 +227,7 @@ export class VercelAdapter extends PlatformAdapter {
|
|
|
231
227
|
const tasks: Array<{ name: string; handler: () => Promise<void> }> = [];
|
|
232
228
|
|
|
233
229
|
// Projects/deployments (mapped to "workers" in PlatformState)
|
|
234
|
-
|
|
230
|
+
{
|
|
235
231
|
const projectName = ctx.naming.worker();
|
|
236
232
|
|
|
237
233
|
tasks.push({
|
|
@@ -303,7 +299,7 @@ export class VercelAdapter extends PlatformAdapter {
|
|
|
303
299
|
// -------------------------------------------------------------------------
|
|
304
300
|
|
|
305
301
|
async teardown(ctx: PlatformContext, run: RunnerMethod): Promise<void> {
|
|
306
|
-
|
|
302
|
+
{
|
|
307
303
|
const projectName = ctx.naming.worker();
|
|
308
304
|
|
|
309
305
|
await run({
|
|
@@ -23,16 +23,49 @@ export const platformOptions = $atom({
|
|
|
23
23
|
*/
|
|
24
24
|
default: t.optional(t.text()),
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Multi-tenancy mode — controls whether `--tenant <slug>` is
|
|
28
|
+
* accepted/required and how it shapes resource names + the domain.
|
|
29
|
+
*
|
|
30
|
+
* - `none` (default): single instance. `--tenant` is rejected.
|
|
31
|
+
* - `required`: every deploy needs `--tenant`; resources are named
|
|
32
|
+
* `<tenant>-<project>-<env>` and the host becomes
|
|
33
|
+
* `<tenant>.<domain>`. Omitting it errors.
|
|
34
|
+
* - `optional`: a base instance (no `--tenant`) plus per-tenant
|
|
35
|
+
* instances coexist.
|
|
36
|
+
*
|
|
37
|
+
* @default "none"
|
|
38
|
+
*/
|
|
39
|
+
tenancy: t.optional(t.enum(["none", "optional", "required"])),
|
|
40
|
+
|
|
26
41
|
/**
|
|
27
42
|
* Secret store configuration for syncing .env secrets
|
|
28
43
|
* to external providers (e.g. GitHub Actions environments).
|
|
29
44
|
*/
|
|
30
45
|
secrets: t.optional(
|
|
31
46
|
t.object({
|
|
47
|
+
/**
|
|
48
|
+
* Explicit override of the worker secret-key allowlist.
|
|
49
|
+
*
|
|
50
|
+
* By default the deploy `secrets` step uses the build manifest's
|
|
51
|
+
* `env` list (every key the app declares via `$env`, captured at
|
|
52
|
+
* build time) as the allowlist, resolving each value from
|
|
53
|
+
* `.env.<env>[.local]` first, then `process.env`. This lets CI
|
|
54
|
+
* deliver secrets via the job environment (no `.env` file on the
|
|
55
|
+
* runner) while only ever pushing declared keys — ambient runner
|
|
56
|
+
* vars (PATH, GITHUB_*, …) can never leak.
|
|
57
|
+
*
|
|
58
|
+
* Set `keys` to override that auto-detected list (e.g. to narrow it,
|
|
59
|
+
* or to add a key read via `process.env` rather than `$env`). When
|
|
60
|
+
* neither this nor a manifest is present, the `.env.<env>` file is
|
|
61
|
+
* itself the allowlist (legacy fallback).
|
|
62
|
+
*/
|
|
63
|
+
keys: t.optional(t.array(t.text())),
|
|
64
|
+
|
|
32
65
|
/**
|
|
33
66
|
* Secret store backend.
|
|
34
67
|
*/
|
|
35
|
-
store: t.enum(["github"]),
|
|
68
|
+
store: t.optional(t.enum(["github"])),
|
|
36
69
|
|
|
37
70
|
/**
|
|
38
71
|
* Pattern for resolving environment names in the store.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { $module } from "alepha";
|
|
2
|
+
import { CloudflareAdapter } from "./adapters/CloudflareAdapter.ts";
|
|
3
|
+
import { VercelAdapter } from "./adapters/VercelAdapter.ts";
|
|
4
|
+
import { GitHubSecretStore } from "./providers/GitHubSecretStore.ts";
|
|
5
|
+
import { MemorySecretStore } from "./providers/MemorySecretStore.ts";
|
|
6
|
+
import { PlatformCacheProvider } from "./providers/PlatformCacheProvider.ts";
|
|
7
|
+
import { CloudflareApi } from "./services/CloudflareApi.ts";
|
|
8
|
+
import { NamingService } from "./services/NamingService.ts";
|
|
9
|
+
import { PlatformInspector } from "./services/PlatformInspector.ts";
|
|
10
|
+
import { PlatformOrchestrator } from "./services/PlatformOrchestrator.ts";
|
|
11
|
+
import { SecretFilterService } from "./services/SecretFilterService.ts";
|
|
12
|
+
import { VercelApi } from "./services/VercelApi.ts";
|
|
13
|
+
import { VercelCli } from "./services/VercelCli.ts";
|
|
14
|
+
import { WranglerApi } from "./services/WranglerApi.ts";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Framework-agnostic platform deploy services.
|
|
18
|
+
*
|
|
19
|
+
* Exports `PlatformOrchestrator` + adapters + secret stores + the
|
|
20
|
+
* `platformOptions` atom — everything needed to drive a deploy
|
|
21
|
+
* programmatically. **No `$command` instances** and **no
|
|
22
|
+
* `AppEntryProvider` / `ViteBuildProvider` dependency** — so consumers
|
|
23
|
+
* importing this subpath don't pull in the CLI argv-parser or Vite.
|
|
24
|
+
*
|
|
25
|
+
* Used by Alepha Rocket (and other non-CLI deploy orchestrators) to
|
|
26
|
+
* call `orchestrator.up({ ... })` directly. For CLI usage
|
|
27
|
+
* (`alepha platform up`), import `AlephaCliPlatformPlugin` from
|
|
28
|
+
* `alepha/cli/platform` — that one adds the command layer on top.
|
|
29
|
+
*/
|
|
30
|
+
export const AlephaPlatformLibPlugin = $module({
|
|
31
|
+
name: "alepha.cli.platform-lib",
|
|
32
|
+
services: [
|
|
33
|
+
CloudflareAdapter,
|
|
34
|
+
CloudflareApi,
|
|
35
|
+
VercelAdapter,
|
|
36
|
+
VercelApi,
|
|
37
|
+
VercelCli,
|
|
38
|
+
WranglerApi,
|
|
39
|
+
PlatformCacheProvider,
|
|
40
|
+
GitHubSecretStore,
|
|
41
|
+
MemorySecretStore,
|
|
42
|
+
NamingService,
|
|
43
|
+
SecretFilterService,
|
|
44
|
+
PlatformInspector,
|
|
45
|
+
PlatformOrchestrator,
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
export * from "./adapters/CloudflareAdapter.ts";
|
|
50
|
+
export * from "./adapters/PlatformAdapter.ts";
|
|
51
|
+
export * from "./adapters/VercelAdapter.ts";
|
|
52
|
+
export * from "./atoms/platformOptions.ts";
|
|
53
|
+
export * from "./providers/GitHubSecretStore.ts";
|
|
54
|
+
export * from "./providers/MemorySecretStore.ts";
|
|
55
|
+
export * from "./providers/PlatformCacheProvider.ts";
|
|
56
|
+
export * from "./providers/SecretStoreProvider.ts";
|
|
57
|
+
export * from "./schemas/cloudflare.ts";
|
|
58
|
+
export * from "./schemas/platform.ts";
|
|
59
|
+
export * from "./schemas/vercel.ts";
|
|
60
|
+
export * from "./services/CloudflareApi.ts";
|
|
61
|
+
export * from "./services/NamingService.ts";
|
|
62
|
+
export * from "./services/PlatformInspector.ts";
|
|
63
|
+
export * from "./services/PlatformOrchestrator.ts";
|
|
64
|
+
export * from "./services/SecretFilterService.ts";
|
|
65
|
+
export * from "./services/VercelApi.ts";
|
|
66
|
+
export * from "./services/VercelCli.ts";
|
|
67
|
+
export * from "./services/WranglerApi.ts";
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { AlephaError } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Multi-tenancy mode for an app's deployments.
|
|
5
|
+
*
|
|
6
|
+
* - `none` (default): single-instance app. Passing `--tenant` is an
|
|
7
|
+
* error — guards a non-tenanted app (e.g. the SaaS console) from
|
|
8
|
+
* accidentally getting a tenant prefix.
|
|
9
|
+
* - `required`: every deploy targets a tenant. Omitting `--tenant` is an
|
|
10
|
+
* error — kills the "forgot the flag → deployed to the apex" footgun.
|
|
11
|
+
* - `optional`: both work — a base instance (no `--tenant`) and per-tenant
|
|
12
|
+
* instances coexist (distinct names + hosts).
|
|
13
|
+
*/
|
|
14
|
+
export type Tenancy = "none" | "optional" | "required";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Validate a `--tenant` value against the app's declared `tenancy` and
|
|
18
|
+
* return the effective tenant (or `undefined` for a base/non-tenanted
|
|
19
|
+
* deploy). Throws on any matrix violation so a misconfigured deploy fails
|
|
20
|
+
* fast instead of landing on the wrong resource names / host.
|
|
21
|
+
*/
|
|
22
|
+
export function resolveTenant(
|
|
23
|
+
tenancy: Tenancy | undefined,
|
|
24
|
+
tenant: string | undefined,
|
|
25
|
+
): string | undefined {
|
|
26
|
+
const mode = tenancy ?? "none";
|
|
27
|
+
|
|
28
|
+
if (tenant !== undefined && !/^[a-z0-9][a-z0-9-]*$/.test(tenant)) {
|
|
29
|
+
throw new AlephaError(
|
|
30
|
+
`Invalid --tenant "${tenant}": must be a slug (lowercase alphanumeric + dashes, e.g. "b14").`,
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (mode === "none") {
|
|
35
|
+
if (tenant !== undefined) {
|
|
36
|
+
throw new AlephaError(
|
|
37
|
+
`This app is not tenanted (tenancy: "none") but --tenant "${tenant}" was given. ` +
|
|
38
|
+
`Set tenancy: "optional" | "required" in platform() to deploy per-tenant.`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (mode === "required" && tenant === undefined) {
|
|
45
|
+
throw new AlephaError(
|
|
46
|
+
`This app requires a tenant (tenancy: "required"). Pass --tenant <slug>.`,
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// required+value or optional(+/- value) — value may be undefined for the
|
|
51
|
+
// optional base instance.
|
|
52
|
+
return tenant;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Resolve the host a deploy is served on.
|
|
57
|
+
*
|
|
58
|
+
* - `override` (V2 custom domains, e.g. `reservation.club-b14.fr`) wins
|
|
59
|
+
* outright when supplied — not wired to a flag today, but the single
|
|
60
|
+
* seam a future `--domain` / Rocket `config.hostname` plugs into.
|
|
61
|
+
* - else a tenant becomes the leftmost DNS label: `b14` + `alepha.club`
|
|
62
|
+
* → `b14.alepha.club`.
|
|
63
|
+
* - else the base domain is used as-is.
|
|
64
|
+
*/
|
|
65
|
+
export function tenantDomain(
|
|
66
|
+
base: string | undefined,
|
|
67
|
+
tenant: string | undefined,
|
|
68
|
+
override?: string,
|
|
69
|
+
): string | undefined {
|
|
70
|
+
if (override) return override;
|
|
71
|
+
if (!base) return base;
|
|
72
|
+
return tenant ? `${tenant}.${base}` : base;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Generates deterministic resource names for cloud deployments.
|
|
77
|
+
*
|
|
78
|
+
* Pattern: `<tenant>-<project>-<env>` (tenant segment omitted when the
|
|
79
|
+
* deploy isn't tenanted).
|
|
80
|
+
*
|
|
81
|
+
* All segments are slugified (lowercase, alphanumeric + dashes, max 63
|
|
82
|
+
* chars). One app per workspace — see `alepha platform`.
|
|
83
|
+
*/
|
|
84
|
+
export class NamingService {
|
|
85
|
+
public forContext(
|
|
86
|
+
project: string,
|
|
87
|
+
env: string,
|
|
88
|
+
tenant?: string,
|
|
89
|
+
): NamingContext {
|
|
90
|
+
const prefix = [tenant, project, env]
|
|
91
|
+
.filter((segment): segment is string => !!segment)
|
|
92
|
+
.map((segment) => this.slugify(segment))
|
|
93
|
+
.join("-");
|
|
94
|
+
return new NamingContext(prefix);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public slugify(name: string): string {
|
|
98
|
+
return name
|
|
99
|
+
.toLowerCase()
|
|
100
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
101
|
+
.replace(/^-+|-+$/g, "")
|
|
102
|
+
.slice(0, 63);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export class NamingContext {
|
|
107
|
+
protected readonly prefix: string;
|
|
108
|
+
|
|
109
|
+
constructor(prefix: string) {
|
|
110
|
+
this.prefix = prefix;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public worker(): string {
|
|
114
|
+
return this.prefix;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public d1(): string {
|
|
118
|
+
return this.prefix;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
public hyperdrive(): string {
|
|
122
|
+
return this.prefix;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public r2(): string {
|
|
126
|
+
return this.prefix;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public kv(): string {
|
|
130
|
+
return this.prefix;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
public queue(): string {
|
|
134
|
+
return this.prefix;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -6,11 +6,13 @@ import {
|
|
|
6
6
|
type EnvironmentConfig,
|
|
7
7
|
platformOptions,
|
|
8
8
|
} from "../atoms/platformOptions.ts";
|
|
9
|
-
import { NamingService } from "./NamingService.ts";
|
|
9
|
+
import { NamingService, type Tenancy } from "./NamingService.ts";
|
|
10
10
|
|
|
11
11
|
export interface ResolvedPlatformConfig {
|
|
12
12
|
project: string;
|
|
13
13
|
defaultEnv: string;
|
|
14
|
+
/** App tenancy mode (undefined ⇒ "none"). */
|
|
15
|
+
tenancy?: Tenancy;
|
|
14
16
|
environments: Record<string, EnvironmentConfig>;
|
|
15
17
|
}
|
|
16
18
|
|
|
@@ -35,10 +37,42 @@ export class PlatformInspector {
|
|
|
35
37
|
|
|
36
38
|
/**
|
|
37
39
|
* Resolve and validate the full platform configuration.
|
|
40
|
+
*
|
|
41
|
+
* Source priority:
|
|
42
|
+
* 1. `platformOptions` atom (set by `alepha.config.ts` during the
|
|
43
|
+
* configure hook) — local dev / from-source deploys.
|
|
44
|
+
* 2. `dist/manifest.json` (written by `alepha build`) — pre-built
|
|
45
|
+
* deploys via Alepha Rocket or any `--prebuilt` consumer that
|
|
46
|
+
* ships only the build artifact without `alepha.config.ts`.
|
|
38
47
|
*/
|
|
39
48
|
public async resolveConfig(root: string): Promise<ResolvedPlatformConfig> {
|
|
40
|
-
if (
|
|
41
|
-
|
|
49
|
+
if (this.options) {
|
|
50
|
+
const opts = this.options;
|
|
51
|
+
const project = await this.resolveProjectName(root, opts.name);
|
|
52
|
+
return {
|
|
53
|
+
project: this.naming.slugify(project),
|
|
54
|
+
defaultEnv: opts.default ?? "production",
|
|
55
|
+
tenancy: opts.tenancy,
|
|
56
|
+
environments: opts.environments as Record<string, EnvironmentConfig>,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Fallback: read dist/manifest.json. Lets prebuilt artifacts deploy
|
|
61
|
+
// without shipping alepha.config.ts in the tarball.
|
|
62
|
+
const manifest = await this.readManifest(root);
|
|
63
|
+
if (manifest) {
|
|
64
|
+
return {
|
|
65
|
+
project: this.naming.slugify(manifest.project),
|
|
66
|
+
defaultEnv: manifest.defaultEnv ?? "production",
|
|
67
|
+
tenancy: manifest.tenancy,
|
|
68
|
+
environments: manifest.environments as Record<
|
|
69
|
+
string,
|
|
70
|
+
EnvironmentConfig
|
|
71
|
+
>,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
this.log.warn(` alepha.config.ts not found or missing platform config.
|
|
42
76
|
|
|
43
77
|
Please add a "platform" section to alepha.config.ts:
|
|
44
78
|
|
|
@@ -50,17 +84,30 @@ export default defineConfig({
|
|
|
50
84
|
},
|
|
51
85
|
});
|
|
52
86
|
`);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const opts = this.options;
|
|
57
|
-
const project = await this.resolveProjectName(root, opts.name);
|
|
87
|
+
throw new AlephaError("Missing platform configuration.");
|
|
88
|
+
}
|
|
58
89
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
90
|
+
/**
|
|
91
|
+
* Read `dist/manifest.json` if present. Returns null on any error so
|
|
92
|
+
* callers fall back to the strict alepha.config.ts path.
|
|
93
|
+
*/
|
|
94
|
+
protected async readManifest(root: string): Promise<{
|
|
95
|
+
project: string;
|
|
96
|
+
defaultEnv?: string;
|
|
97
|
+
tenancy?: Tenancy;
|
|
98
|
+
environments?: Record<string, unknown>;
|
|
99
|
+
} | null> {
|
|
100
|
+
try {
|
|
101
|
+
const fs = await import("node:fs/promises");
|
|
102
|
+
const path = await import("node:path");
|
|
103
|
+
const raw = await fs.readFile(
|
|
104
|
+
path.join(root, "dist", "manifest.json"),
|
|
105
|
+
"utf-8",
|
|
106
|
+
);
|
|
107
|
+
return JSON.parse(raw);
|
|
108
|
+
} catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
64
111
|
}
|
|
65
112
|
|
|
66
113
|
/**
|