alepha 0.22.0 → 0.24.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/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/dist/api/audits/index.browser.js +49 -52
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +629 -565
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +206 -98
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +44 -44
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +292 -293
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +61 -64
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +61 -59
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +546 -347
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +165 -86
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +242 -230
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js +63 -66
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +40 -38
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +339 -209
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +108 -60
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +190 -78
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js +290 -68
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js +14 -14
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +158 -134
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js +18 -18
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +74 -53
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +607 -513
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +205 -127
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +652 -449
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js +159 -93
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +1032 -762
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +166 -185
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +48 -71
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1297 -1109
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +454 -369
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js +17 -17
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +169 -157
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +47 -95
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +0 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/index.workerd.js.map +1 -1
- package/dist/batch/index.d.ts +0 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +27 -32
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +56 -26
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +52 -24
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +4 -6
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +4 -10
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +4 -10
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -23
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js +11 -20
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +3 -4
- 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/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js +4 -4
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +0 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/core/index.d.ts +244 -475
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +308 -383
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -9
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js +3 -3
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +20 -39
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +51 -17
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +89 -82
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +27 -33
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +383 -410
- package/dist/cli/platform-lib/index.d.ts.map +1 -1
- package/dist/cli/platform-lib/index.js +300 -258
- package/dist/cli/platform-lib/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +17 -41
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js +10 -13
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +82 -194
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +160 -563
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +845 -859
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +787 -527
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +845 -859
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +845 -859
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +845 -859
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +3 -4
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js +6 -3
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +12 -2
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +6 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +0 -1
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js +4 -4
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +0 -1
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +2 -2
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +15 -7
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +14 -5
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js +5 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +8 -9
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +702 -479
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1580 -1238
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +11728 -32131
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -9
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +5 -5
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +0 -1
- 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 +81 -69
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +123 -56
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +36 -90
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +65 -70
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +54 -40
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +140 -106
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +145 -150
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +144 -109
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +64 -54
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +36 -76
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +67 -57
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +62 -75
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +48 -71
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +48 -71
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -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.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +7 -4
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +87 -5
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +170 -23
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -6
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +107 -71
- 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 +0 -1
- 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 -5
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +116 -12
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -4
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +188 -29
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +480 -372
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +261 -47
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.browser.js +35 -0
- package/dist/react/sitemap/index.browser.js.map +1 -0
- package/dist/react/sitemap/index.d.ts +91 -0
- package/dist/react/sitemap/index.d.ts.map +1 -0
- package/dist/react/sitemap/index.js +131 -0
- package/dist/react/sitemap/index.js.map +1 -0
- package/dist/react/testing/index.d.ts +4 -5
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +41 -15
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
- package/dist/react/ui/index.d.ts +35 -34
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js +12 -17
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js +5 -5
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +6 -7
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +6 -6
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +0 -1
- 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 +4 -12
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -4
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +9 -4
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +30 -28
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +113 -44
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +452 -37
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js +19 -19
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +215 -187
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1145 -86
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js +103 -5
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +86 -4
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +121 -8
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js +22 -27
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +134 -85
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +130 -118
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +9 -10
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +14 -26
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +2 -3
- 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 -19
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js +6 -6
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +15 -18
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +29 -32
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +0 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +10 -3
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +0 -1
- 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 +8 -9
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +6 -12
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +0 -1
- 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 +4 -4
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +37 -25
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +0 -1
- 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 +0 -1
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +2 -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 +19 -20
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js +8 -8
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +3 -4
- 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/package.json +36 -36
- package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
- package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
- package/src/api/audits/controllers/AdminAuditController.ts +41 -41
- package/src/api/audits/entities/audits.ts +22 -22
- package/src/api/audits/index.ts +6 -1
- package/src/api/audits/jobs/AuditJobs.ts +29 -0
- package/src/api/audits/parameters/AuditParameters.ts +51 -0
- package/src/api/audits/primitives/$audit.ts +24 -0
- package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
- package/src/api/audits/schemas/createAuditSchema.ts +18 -18
- package/src/api/audits/services/AuditService.ts +79 -7
- package/src/api/files/__tests__/FileController.spec.ts +5 -5
- package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
- package/src/api/files/controllers/FileController.ts +25 -25
- package/src/api/files/entities/files.ts +15 -15
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
- package/src/api/files/schemas/fileQuerySchema.ts +9 -9
- package/src/api/files/schemas/fileResourceSchema.ts +7 -9
- package/src/api/files/schemas/storageStatsSchema.ts +13 -13
- package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
- package/src/api/jobs/__tests__/$job.spec.ts +18 -18
- package/src/api/jobs/controllers/AdminJobController.ts +8 -8
- package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
- package/src/api/jobs/providers/JobProvider.ts +128 -12
- package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
- package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
- package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
- package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
- package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
- package/src/api/jobs/services/JobService.ts +6 -6
- package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
- package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
- package/src/api/keys/entities/apiKeyEntity.ts +15 -15
- package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
- package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
- package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
- package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
- package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
- package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
- package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
- package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
- package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
- package/src/api/notifications/primitives/$notification.ts +43 -4
- package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
- package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
- package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
- package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
- package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
- package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
- package/src/api/notifications/services/NotificationSenderService.ts +38 -2
- package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
- package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
- package/src/api/oauth/controllers/OAuthController.ts +132 -12
- package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
- package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
- package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
- package/src/api/oauth/index.ts +1 -0
- package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
- package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
- package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
- package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
- package/src/api/oauth/services/OAuthClientService.ts +228 -15
- package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
- package/src/api/organizations/entities/organizations.ts +6 -6
- package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
- package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
- package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
- package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
- package/src/api/parameters/entities/parameters.ts +29 -16
- package/src/api/parameters/primitives/$parameter.ts +3 -3
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
- package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
- package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
- package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
- package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
- package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
- package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
- package/src/api/parameters/services/ParameterProvider.ts +152 -65
- package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
- package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
- package/src/api/payments/controllers/PaymentController.ts +4 -4
- package/src/api/payments/entities/paymentIntents.ts +11 -11
- package/src/api/payments/entities/paymentMethods.ts +11 -11
- package/src/api/payments/entities/refunds.ts +9 -9
- package/src/api/payments/providers/PaymentProvider.ts +18 -0
- package/src/api/payments/schemas/intentSchemas.ts +25 -25
- package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
- package/src/api/payments/services/PaymentService.ts +60 -3
- package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
- package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
- package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
- package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
- package/src/api/subscriptions/entities/subscriptions.ts +22 -22
- package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
- package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
- package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
- package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
- package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
- package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
- package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
- package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
- package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
- package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
- package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
- package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
- package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
- package/src/api/users/controllers/AdminIdentityController.ts +29 -19
- package/src/api/users/controllers/AdminSessionController.ts +37 -27
- package/src/api/users/controllers/AdminUserController.ts +75 -53
- package/src/api/users/controllers/MySessionController.ts +125 -0
- package/src/api/users/controllers/RealmController.ts +9 -9
- package/src/api/users/controllers/UserController.ts +55 -55
- package/src/api/users/entities/identities.ts +8 -8
- package/src/api/users/entities/sessions.ts +17 -17
- package/src/api/users/entities/users.ts +17 -17
- package/src/api/users/index.ts +3 -0
- package/src/api/users/notifications/UserNotifications.ts +76 -24
- package/src/api/users/primitives/$realm.ts +12 -0
- package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
- package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
- package/src/api/users/schemas/createUserSchema.ts +2 -2
- package/src/api/users/schemas/identityQuerySchema.ts +4 -4
- package/src/api/users/schemas/identityResourceSchema.ts +3 -2
- package/src/api/users/schemas/loginSchema.ts +4 -4
- package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
- package/src/api/users/schemas/realmConfigSchema.ts +10 -10
- package/src/api/users/schemas/registerQuerySchema.ts +6 -6
- package/src/api/users/schemas/registerRequestSchema.ts +21 -43
- package/src/api/users/schemas/registerResponseSchema.ts +2 -2
- package/src/api/users/schemas/registerSchema.ts +13 -31
- package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
- package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
- package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
- package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
- package/src/api/users/schemas/updateUserSchema.ts +3 -4
- package/src/api/users/schemas/userQuerySchema.ts +7 -7
- package/src/api/users/services/RegistrationService.ts +25 -11
- package/src/api/users/services/UserService.ts +12 -6
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
- package/src/api/verifications/controllers/VerificationController.ts +13 -27
- package/src/api/verifications/entities/verifications.ts +13 -14
- package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
- package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
- package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
- package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
- package/src/api/verifications/services/VerificationService.ts +12 -0
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
- package/src/batch/__tests__/$batch.spec.ts +22 -22
- package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
- package/src/bin/index.ts +1 -1
- package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
- package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
- package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
- package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
- package/src/cache/core/primitives/$cache.ts +7 -10
- package/src/cache/database/entities/cacheEntries.ts +16 -27
- package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
- package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
- package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
- package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
- package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
- package/src/cli/core/atoms/appEntryOptions.ts +5 -5
- package/src/cli/core/atoms/buildOptions.ts +76 -88
- package/src/cli/core/atoms/changelogOptions.ts +3 -3
- package/src/cli/core/atoms/devOptions.ts +3 -3
- package/src/cli/core/commands/build.ts +36 -49
- package/src/cli/core/commands/db.ts +171 -83
- package/src/cli/core/commands/dev.ts +8 -8
- package/src/cli/core/commands/gen/changelog.ts +12 -14
- package/src/cli/core/commands/gen/env.ts +6 -6
- package/src/cli/core/commands/gen/openapi.ts +6 -6
- package/src/cli/core/commands/init.ts +28 -33
- package/src/cli/core/commands/pack.ts +10 -10
- package/src/cli/core/commands/root.ts +7 -8
- package/src/cli/core/commands/test.ts +17 -20
- package/src/cli/core/index.ts +0 -3
- package/src/cli/core/tasks/BuildCloudflareTask.ts +138 -245
- package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
- package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
- package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
- package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
- package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
- package/src/cli/i18n/services/I18nCheckService.ts +65 -11
- package/src/cli/platform/commands/SecretsCommand.ts +24 -25
- package/src/cli/platform/commands/platform.ts +40 -46
- package/src/cli/platform/index.ts +1 -1
- package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
- package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
- package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
- package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +141 -50
- package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
- package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
- package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
- package/src/cli/platform-lib/schemas/platform.ts +51 -51
- package/src/cli/platform-lib/schemas/vercel.ts +28 -28
- package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
- package/src/cli/platform-lib/services/VercelApi.ts +4 -4
- package/src/cli/platform-lib/services/VercelCli.ts +6 -15
- package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
- package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
- package/src/cli/vendor/commands/VendorCommand.ts +11 -12
- package/src/command/__tests__/$command.spec.ts +82 -83
- package/src/command/__tests__/Asker.spec.ts +6 -13
- package/src/command/__tests__/CliProvider.spec.ts +136 -149
- package/src/command/__tests__/Runner.spec.ts +86 -110
- package/src/command/helpers/Asker.ts +23 -58
- package/src/command/helpers/Runner.ts +34 -110
- package/src/command/index.ts +4 -9
- package/src/command/primitives/$command.ts +10 -10
- package/src/command/providers/CliProvider.ts +183 -161
- package/src/core/Alepha.ts +62 -13
- package/src/core/__tests__/$atom.spec.ts +52 -3
- package/src/core/__tests__/$computed.spec.ts +129 -0
- package/src/core/__tests__/$env.spec.ts +13 -13
- package/src/core/__tests__/$inject.spec.ts +4 -4
- package/src/core/__tests__/$module.spec.ts +1 -1
- package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
- package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
- package/src/core/__tests__/Alepha-start.spec.ts +3 -3
- package/src/core/__tests__/CodecManager.spec.ts +113 -94
- package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
- package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
- package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
- package/src/core/__tests__/StateManager.spec.ts +423 -0
- package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
- package/src/core/__tests__/TypeProvider.spec.ts +314 -309
- package/src/core/__tests__/dump.spec.ts +6 -6
- package/src/core/__tests__/pagination.spec.ts +4 -4
- package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
- package/src/core/errors/TypeBoxError.ts +10 -4
- package/src/core/helpers/FileLike.ts +5 -5
- package/src/core/helpers/coerceStrings.ts +70 -0
- package/src/core/helpers/jsonSchemaToZod.ts +112 -0
- package/src/core/index.shared.ts +4 -1
- package/src/core/primitives/$atom.ts +95 -27
- package/src/core/primitives/$computed.ts +148 -0
- package/src/core/primitives/$env.ts +5 -5
- package/src/core/primitives/$state.ts +1 -1
- package/src/core/providers/AlsProvider.ts +26 -0
- package/src/core/providers/CodecManager.ts +1 -2
- package/src/core/providers/JsonSchemaCodec.ts +1 -2
- package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
- package/src/core/providers/SchemaValidator.ts +48 -158
- package/src/core/providers/StateManager.ts +383 -9
- package/src/core/providers/TypeProvider.ts +80 -734
- package/src/core/providers/ZodProvider.ts +380 -0
- package/src/core/providers/zodAugment.ts +69 -0
- package/src/core/schemas/pageQuerySchema.ts +19 -21
- package/src/core/schemas/pageSchema.ts +47 -57
- package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
- package/src/crypto/providers/SecretProvider.ts +16 -10
- package/src/datetime/primitives/$throttle.ts +6 -1
- package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
- package/src/email/core/index.ts +7 -2
- package/src/email/core/primitives/$email.ts +5 -1
- package/src/email/core/providers/LocalEmailProvider.ts +5 -5
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
- package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
- package/src/fake/__tests__/keyName.example.ts +21 -21
- package/src/fake/__tests__/keyName.spec.ts +41 -41
- package/src/fake/__tests__/module.example.ts +8 -8
- package/src/fake/providers/FakeProvider.ts +122 -121
- package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
- package/src/lock/core/index.ts +1 -0
- package/src/lock/core/primitives/$lock.ts +13 -6
- package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
- package/src/logger/__tests__/Logger.spec.ts +49 -0
- package/src/logger/index.ts +25 -18
- package/src/logger/providers/CliFormatterProvider.ts +75 -0
- package/src/logger/schemas/logEntrySchema.ts +10 -10
- package/src/logger/services/Logger.ts +18 -0
- package/src/mcp/__tests__/$prompt.spec.ts +21 -23
- package/src/mcp/__tests__/$tool.spec.ts +22 -22
- package/src/mcp/__tests__/McpServerProvider.spec.ts +82 -11
- package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
- package/src/mcp/__tests__/integration.spec.ts +33 -33
- package/src/mcp/primitives/$prompt.ts +11 -9
- package/src/mcp/primitives/$tool.ts +27 -86
- package/src/mcp/providers/McpServerProvider.ts +55 -0
- package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
- package/src/orm/__tests__/$repository-tests.ts +133 -27
- package/src/orm/__tests__/$repository.spec.ts +23 -0
- package/src/orm/__tests__/$transactional-tests.ts +4 -4
- package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
- package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
- package/src/orm/__tests__/QueryManager.spec.ts +5 -5
- package/src/orm/__tests__/delete-returning-tests.ts +11 -11
- package/src/orm/__tests__/deletedAt-tests.ts +3 -3
- package/src/orm/__tests__/enums.spec.ts +29 -25
- package/src/orm/__tests__/execute-tests.ts +8 -8
- package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
- package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
- package/src/orm/__tests__/joins-tests.ts +30 -30
- package/src/orm/__tests__/organization-tests.ts +105 -3
- package/src/orm/__tests__/organization.spec.ts +46 -0
- package/src/orm/__tests__/orm-errors.spec.ts +10 -10
- package/src/orm/__tests__/orm-next-tests.ts +29 -29
- package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
- package/src/orm/__tests__/primaryKey.spec.ts +4 -4
- package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
- package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
- package/src/orm/__tests__/references.spec.ts +7 -7
- package/src/orm/__tests__/security.spec.ts +17 -17
- package/src/orm/__tests__/string-operators-tests.ts +5 -5
- package/src/orm/__tests__/timestamps-tests.ts +14 -14
- package/src/orm/__tests__/validation-tests.ts +5 -5
- package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
- package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
- package/src/orm/core/entities/alephaSequences.ts +8 -8
- package/src/orm/core/helpers/pgAttr.ts +4 -4
- package/src/orm/core/primitives/$entity.ts +10 -6
- package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
- package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
- package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
- package/src/orm/core/schemas/insertSchema.ts +14 -18
- package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
- package/src/orm/core/schemas/updateSchema.ts +10 -16
- package/src/orm/core/services/PgRelationManager.ts +2 -2
- package/src/orm/core/services/QueryManager.ts +13 -2
- package/src/orm/core/services/Repository.ts +88 -33
- package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
- package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
- package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
- package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
- package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
- package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
- package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
- package/src/queue/core/__tests__/shared.ts +6 -6
- package/src/queue/core/primitives/$consumer.ts +5 -5
- package/src/queue/core/primitives/$queue.ts +44 -61
- package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
- package/src/queue/core/providers/WorkerProvider.ts +17 -14
- package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
- package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
- package/src/react/core/__tests__/Router.spec.tsx +4 -4
- package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
- package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
- package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
- package/src/react/core/components/ErrorBoundary.tsx +42 -0
- package/src/react/core/hooks/useAction.ts +56 -19
- package/src/react/core/hooks/useComputed.ts +91 -0
- package/src/react/core/hooks/useSelector.ts +67 -0
- package/src/react/core/hooks/useStore.ts +36 -17
- package/src/react/core/index.ts +3 -0
- package/src/react/core/utils/shallowEqual.ts +36 -0
- package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
- package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
- package/src/react/form/errors/FormValidationError.ts +0 -2
- package/src/react/form/hooks/useForm.ts +19 -4
- package/src/react/form/hooks/useFormQuerySync.ts +0 -0
- package/src/react/form/services/FormModel.ts +124 -86
- package/src/react/form/services/parseField.ts +66 -27
- package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
- package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
- package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
- package/src/react/i18n/providers/I18nProvider.ts +173 -14
- package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
- package/src/react/router/__tests__/$page.spec.tsx +21 -21
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
- package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
- package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
- package/src/react/router/components/NestedView.tsx +11 -3
- package/src/react/router/hooks/useQueryParams.ts +1 -1
- package/src/react/router/index.browser.ts +4 -0
- package/src/react/router/index.shared.ts +1 -0
- package/src/react/router/index.ts +9 -0
- package/src/react/router/primitives/$page.ts +2 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +15 -1
- package/src/react/router/providers/ReactPageProvider.ts +38 -13
- package/src/react/router/providers/ReactServerProvider.ts +105 -16
- package/src/react/router/providers/RootComponentsProvider.ts +13 -0
- package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
- package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
- package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
- package/src/react/sitemap/index.browser.ts +21 -0
- package/src/react/sitemap/index.ts +25 -0
- package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
- package/src/react/sitemap/primitives/$sitemap.ts +196 -0
- package/src/react/ui/atoms/uiAtom.ts +6 -6
- package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
- package/src/react/ui/hooks/useColorMode.ts +11 -4
- package/src/react/ui/services/SchemaControl.ts +4 -4
- package/src/redis/providers/BunRedisProvider.ts +19 -11
- package/src/redis/providers/NodeRedisProvider.ts +3 -3
- package/src/scheduler/primitives/$scheduler.ts +21 -8
- package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
- package/src/security/atoms/currentTenantAtom.ts +6 -6
- package/src/security/atoms/currentUserAtom.ts +2 -2
- package/src/security/primitives/$issuer.ts +24 -2
- package/src/security/providers/JwtProvider.ts +100 -0
- package/src/security/providers/SecurityProvider.ts +43 -2
- package/src/security/schemas/permissionSchema.ts +19 -19
- package/src/security/schemas/roleSchema.ts +22 -28
- package/src/security/schemas/userAccountInfoSchema.ts +47 -37
- package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
- package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
- package/src/server/auth/helpers/appleClientSecret.ts +24 -0
- package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
- package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
- package/src/server/auth/index.ts +1 -0
- package/src/server/auth/primitives/$auth.ts +6 -6
- package/src/server/auth/primitives/$authApple.ts +10 -10
- package/src/server/auth/primitives/$authFacebook.ts +10 -10
- package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
- package/src/server/auth/primitives/$authGithub.ts +10 -10
- package/src/server/auth/primitives/$authGoogle.ts +10 -10
- package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
- package/src/server/auth/providers/ServerAuthProvider.ts +67 -52
- package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
- package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
- package/src/server/auth/schemas/tokensSchema.ts +16 -16
- package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
- package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
- package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +82 -12
- package/src/server/cookies/index.browser.ts +4 -1
- package/src/server/cookies/index.ts +8 -1
- package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
- package/src/server/cookies/primitives/$cookie.ts +16 -0
- package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
- package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
- package/src/server/cookies/providers/ServerCookiesProvider.ts +32 -4
- package/src/server/cookies/services/CookieParser.ts +6 -1
- package/src/server/core/__tests__/$action.spec.ts +13 -13
- package/src/server/core/__tests__/$middleware.spec.ts +10 -10
- package/src/server/core/__tests__/$route.spec.ts +9 -9
- package/src/server/core/__tests__/$sse.spec.ts +26 -26
- package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
- package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
- package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
- package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
- package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
- package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
- package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
- package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
- package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
- package/src/server/core/errors/ValidationError.ts +6 -3
- package/src/server/core/helpers/isMultipart.ts +2 -1
- package/src/server/core/index.ts +5 -2
- package/src/server/core/interfaces/ServerRequest.ts +14 -14
- package/src/server/core/primitives/$action.ts +26 -36
- package/src/server/core/primitives/$route.ts +27 -0
- package/src/server/core/primitives/$sse.ts +3 -3
- package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
- package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
- package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
- package/src/server/core/providers/ServerCompressProvider.ts +9 -10
- package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
- package/src/server/core/providers/ServerRouterProvider.ts +44 -15
- package/src/server/core/schemas/errorSchema.ts +20 -25
- package/src/server/core/schemas/okSchema.ts +9 -14
- package/src/server/core/services/HttpClient.ts +13 -1
- package/src/server/core/services/ServerRequestParser.ts +6 -6
- package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
- package/src/server/health/schemas/healthSchema.ts +6 -6
- package/src/server/links/__tests__/$remote.spec.ts +3 -3
- package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
- package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
- package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
- package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
- package/src/server/links/atoms/apiLinksAtom.ts +2 -2
- package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
- package/src/server/links/primitives/$remote.ts +3 -3
- package/src/server/links/providers/LinkProvider.ts +3 -3
- package/src/server/links/providers/ServerLinksProvider.ts +20 -20
- package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
- package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
- package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
- package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
- package/src/server/swagger/__tests__/ui.spec.ts +3 -3
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
- package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
- package/src/system/providers/NodeShellProvider.ts +4 -1
- package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
- package/src/topic/core/__tests__/shared.ts +8 -8
- package/src/topic/core/primitives/$subscriber.ts +5 -5
- package/src/topic/core/primitives/$topic.ts +14 -14
- package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
- package/dist/container/core/index.d.ts +0 -236
- package/dist/container/core/index.d.ts.map +0 -1
- package/dist/container/core/index.js +0 -231
- package/dist/container/core/index.js.map +0 -1
- package/dist/container/core/index.workerd.js +0 -192
- package/dist/container/core/index.workerd.js.map +0 -1
- package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
- package/src/command/helpers/PrettyAsker.ts +0 -256
- package/src/command/helpers/PrettyPrint.ts +0 -332
- package/src/container/core/__tests__/$container.spec.ts +0 -83
- package/src/container/core/index.ts +0 -50
- package/src/container/core/index.workerd.ts +0 -53
- package/src/container/core/interfaces/ContainerOptions.ts +0 -69
- package/src/container/core/primitives/$container.ts +0 -100
- package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
- package/src/container/core/providers/ContainerProvider.ts +0 -92
- package/src/container/core/providers/MockContainerProvider.ts +0 -62
- package/src/container/core/providers/NodeContainerProvider.ts +0 -53
- package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
- package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
- /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/platform/commands/SecretsCommand.ts","../../../src/cli/platform/commands/platform.ts","../../../src/cli/platform/index.ts"],"sourcesContent":["import { $inject, $state, AlephaError, t } from \"alepha\";\nimport {\n GitHubSecretStore,\n NamingService,\n PlatformInspector,\n platformOptions,\n SecretFilterService,\n type SecretStoreProvider,\n} from \"alepha/cli/platform-lib\";\nimport { $command, EnvUtils } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\n\nexport class SecretsCommand {\n protected readonly log = $logger();\n protected readonly options = $state(platformOptions);\n protected readonly inspector = $inject(PlatformInspector);\n protected readonly naming = $inject(NamingService);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly githubStore = $inject(GitHubSecretStore);\n protected readonly filter = $inject(SecretFilterService);\n protected readonly color = $inject(ConsoleColorProvider);\n\n protected readonly envFlags = t.object({\n env: t.optional(\n t.text({\n aliases: [\"e\"],\n description: \"Target environment\",\n }),\n ),\n });\n\n // -----------------------------------------------------------------------\n // alepha p secrets list\n // -----------------------------------------------------------------------\n\n protected readonly list = $command({\n name: \"list\",\n aliases: [\"ls\"],\n description:\n \"List secret names stored in the remote store for an environment (values are never returned). Use --format=gha to emit a ready-to-paste GitHub Actions env: block.\",\n flags: t.object({\n env: t.optional(\n t.text({\n aliases: [\"e\"],\n description: \"Target environment\",\n }),\n ),\n format: t.optional(\n t.text({\n aliases: [\"f\"],\n description: \"Output format: table (default), gha\",\n }),\n ),\n }),\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envName = this.resolveEnvironmentName(config.project, env);\n const format = flags.format ?? \"table\";\n\n const store = this.resolveStore();\n await store.ensureAvailable();\n const remoteSecrets = await store.list(envName);\n\n run.end();\n\n if (format === \"gha\") {\n process.stdout.write(\n `# Generated by alepha — environment: ${envName}\\n`,\n );\n process.stdout.write(\"env:\\n\");\n for (const secret of remoteSecrets) {\n const localName = this.filter.toLocalName(secret.name);\n process.stdout.write(\n ` ${localName}: \\${{ secrets.${secret.name} }}\\n`,\n );\n }\n return;\n }\n\n // table format\n const c = this.color;\n\n if (remoteSecrets.length === 0) {\n process.stdout.write(\n `\\nNo secrets in environment ${c.set(\"CYAN\", envName)}.\\n\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `\\n${c.set(\"GREY_LIGHT\", \"Environment:\")} ${c.set(\"CYAN\", envName)}\\n\\n`,\n );\n\n const maxNameLen = Math.max(\n ...remoteSecrets.map((s) => s.name.length),\n 4,\n );\n\n process.stdout.write(\n ` ${c.set(\"GREY_LIGHT\", \"NAME\".padEnd(maxNameLen + 2))}${c.set(\"GREY_LIGHT\", \"UPDATED\")}\\n`,\n );\n\n for (const secret of remoteSecrets) {\n const updated = secret.updatedAt\n ? new Date(secret.updatedAt).toLocaleString()\n : \"-\";\n process.stdout.write(\n ` ${c.set(\"CYAN\", secret.name.padEnd(maxNameLen + 2))}${c.set(\"GREY_DARK\", updated)}\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p secrets diff\n // -----------------------------------------------------------------------\n\n protected readonly diff = $command({\n name: \"diff\",\n description:\n \"Compare keys in local .env.<env> against the remote store. Shows + (only local, would be pushed), - (only remote, orphaned), = (in sync). Compares names only — values are not read from remote.\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envName = this.resolveEnvironmentName(config.project, env);\n\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n const filtered = this.filter.filter(envVars);\n const localKeys = new Set(\n Object.keys(filtered).map((k) => this.filter.toRemoteName(k)),\n );\n\n const store = this.resolveStore();\n await store.ensureAvailable();\n const remoteSecrets = await store.list(envName);\n const remoteKeys = new Set(remoteSecrets.map((s) => s.name));\n\n run.end();\n\n const c = this.color;\n const allKeys = [...new Set([...localKeys, ...remoteKeys])].sort();\n\n process.stdout.write(\n `\\n${c.set(\"GREY_LIGHT\", \"Environment:\")} ${c.set(\"CYAN\", envName)}\\n\\n`,\n );\n\n let hasChanges = false;\n for (const key of allKeys) {\n const inLocal = localKeys.has(key);\n const inRemote = remoteKeys.has(key);\n\n if (inLocal && !inRemote) {\n process.stdout.write(` ${c.set(\"GREEN\", \"+\")} ${key}\\n`);\n hasChanges = true;\n } else if (!inLocal && inRemote) {\n process.stdout.write(` ${c.set(\"RED\", \"-\")} ${key}\\n`);\n hasChanges = true;\n } else {\n process.stdout.write(` ${c.set(\"GREY_DARK\", \"=\")} ${key}\\n`);\n }\n }\n\n if (!hasChanges) {\n process.stdout.write(\n ` ${c.set(\"GREEN\", \"Local and remote are in sync.\")}\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p secrets apply\n // -----------------------------------------------------------------------\n\n protected readonly apply = $command({\n name: \"apply\",\n description:\n \"Push secrets from local .env.<env> to the remote store (one upsert per key). Use --dry-run to preview. Existing remote keys not present locally are left untouched — this command never deletes.\",\n flags: t.object({\n env: t.optional(\n t.text({\n aliases: [\"e\"],\n description: \"Target environment\",\n }),\n ),\n \"dry-run\": t.optional(\n t.boolean({\n description: \"Preview changes without pushing\",\n }),\n ),\n }),\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envName = this.resolveEnvironmentName(config.project, env);\n const dryRun = flags[\"dry-run\"] ?? false;\n\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n const filtered = this.filter.filter(envVars);\n const keys = Object.keys(filtered);\n\n if (keys.length === 0) {\n run.end();\n process.stdout.write(\"\\nNo secrets to push.\\n\\n\");\n return;\n }\n\n if (dryRun) {\n run.end();\n const c = this.color;\n process.stdout.write(\n `\\n${c.set(\"GREY_LIGHT\", \"Dry run — environment:\")} ${c.set(\"CYAN\", envName)}\\n\\n`,\n );\n for (const key of keys) {\n process.stdout.write(` ${c.set(\"GREEN\", \"+\")} ${key}\\n`);\n }\n process.stdout.write(\n `\\n ${keys.length} secret(s) would be pushed.\\n\\n`,\n );\n return;\n }\n\n const store = this.resolveStore();\n await store.ensureAvailable();\n await store.ensureEnvironment(envName);\n\n for (const key of keys) {\n const remoteName = this.filter.toRemoteName(key);\n await run({\n name: `push ${remoteName}`,\n handler: async () => {\n await store.set(envName, remoteName, filtered[key]);\n },\n });\n }\n\n run.end();\n process.stdout.write(\n `\\n${keys.length} secret(s) pushed to ${envName}.\\n`,\n );\n },\n });\n\n // -----------------------------------------------------------------------\n // Parent command\n // -----------------------------------------------------------------------\n\n public readonly secrets = $command({\n name: \"secrets\",\n aliases: [\"sec\"],\n description:\n \"Sync secrets from .env.<env> to an external CI store (currently GitHub Actions environments via the `gh` CLI). Resolves the target environment name from `secrets.environmentPattern` (default `{project}-{env}`) and filters keys via SecretFilterService. Runtime secrets for Cloudflare Workers / Vercel are pushed separately during `alepha platform up`.\",\n children: [this.list, this.diff, this.apply],\n handler: async ({ help }) => {\n help();\n },\n });\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n public resolveStore(): SecretStoreProvider {\n const storeName = this.options?.secrets?.store ?? \"github\";\n switch (storeName) {\n case \"github\":\n return this.githubStore;\n default:\n throw new AlephaError(\n `Unknown secret store \"${storeName}\". Available: github`,\n );\n }\n }\n\n protected resolveEnvironmentName(project: string, env: string): string {\n const pattern =\n this.options?.secrets?.environmentPattern ?? \"{project}-{env}\";\n\n return pattern\n .replace(\"{project}\", this.naming.slugify(project))\n .replace(\"{env}\", this.naming.slugify(env));\n }\n}\n","import { $inject, $state, AlephaError, t } from \"alepha\";\nimport { type AppEntry, AppEntryProvider, ViteBuildProvider } from \"alepha/cli\";\nimport {\n CloudflareAdapter,\n type DetectedResources,\n NamingService,\n PlatformInspector,\n PlatformOrchestrator,\n type PlatformPlanOutput,\n type PlatformStatusOutput,\n platformOptions,\n type ResolvedPlatformConfig,\n resolveTenant,\n VercelAdapter,\n} from \"alepha/cli/platform-lib\";\nimport { $command, EnvUtils } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { SecretsCommand } from \"./SecretsCommand.ts\";\n\nexport class PlatformCommand {\n protected readonly log = $logger();\n protected readonly options = $state(platformOptions);\n protected readonly orchestrator = $inject(PlatformOrchestrator);\n protected readonly inspector = $inject(PlatformInspector);\n protected readonly naming = $inject(NamingService);\n protected readonly boot = $inject(AppEntryProvider);\n protected readonly viteBuild = $inject(ViteBuildProvider);\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly secretsCommand = $inject(SecretsCommand);\n\n /**\n * Common flags for env targeting.\n */\n protected readonly envFlags = t.object({\n env: t.optional(\n t.text({\n aliases: [\"e\"],\n description: \"Target environment\",\n }),\n ),\n tenant: t.optional(\n t.text({\n description:\n \"Tenant slug (apps with tenancy: optional | required). Names resources <tenant>-<project>-<env> and serves <tenant>.<domain>.\",\n }),\n ),\n verbose: t.optional(\n t.boolean({\n aliases: [\"v\"],\n description: \"Verbose output\",\n }),\n ),\n json: t.optional(\n t.boolean({\n description: \"Output as JSON\",\n }),\n ),\n });\n\n // -----------------------------------------------------------------------\n // alepha p plan\n // -----------------------------------------------------------------------\n\n protected readonly plan = $command({\n name: \"plan\",\n description: \"Show project topology and resource names\",\n flags: this.envFlags,\n handler: async ({ flags, root }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapterName = envConfig?.adapter ?? \"cloudflare\";\n\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapterName),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n // --- Data collection ---\n\n const hasDB = apps.some((a) => a.resources.hasDatabase);\n const hasBucket = apps.some((a) => a.resources.hasBucket);\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n\n const resources: Array<{ label: string; value: string }> = [];\n\n const deployLabel = adapterName === \"vercel\" ? \"Project\" : \"Worker\";\n resources.push({ label: deployLabel, value: namingCtx.worker() });\n\n if (adapterName === \"cloudflare\") {\n if (hasDB) {\n const dbUrl = envVars.DATABASE_URL ?? process.env.DATABASE_URL;\n if (dbUrl?.startsWith(\"postgres:\")) {\n resources.push({\n label: \"Hyperdrive\",\n value: namingCtx.hyperdrive(),\n });\n } else {\n resources.push({ label: \"D1\", value: namingCtx.d1() });\n }\n }\n\n if (hasBucket) {\n resources.push({ label: \"R2\", value: namingCtx.r2() });\n }\n\n for (const app of apps) {\n if (app.resources.hasKV) {\n resources.push({ label: \"KV\", value: namingCtx.kv() });\n }\n if (app.resources.hasQueue) {\n resources.push({ label: \"Queue\", value: namingCtx.queue() });\n }\n }\n }\n\n const excludedKeys =\n adapterName === \"vercel\"\n ? VercelAdapter.EXCLUDED_SECRET_KEYS\n : CloudflareAdapter.EXCLUDED_SECRET_KEYS;\n const secretCount = Object.entries(envVars).filter(\n ([key, value]) =>\n value && !excludedKeys.has(key) && !key.startsWith(\"VITE_\"),\n ).length;\n\n // --- JSON output ---\n\n if (flags.json) {\n const environments: Record<\n string,\n { adapter: string; domain?: string }\n > = {};\n for (const [key, val] of Object.entries(config.environments)) {\n environments[key] = {\n adapter: val.adapter,\n ...(val.domain ? { domain: val.domain } : {}),\n };\n }\n\n const output: PlatformPlanOutput = {\n project: config.project,\n env,\n mode: \"standalone\",\n apps: apps.map((a) => ({\n name: a.name,\n path: a.path,\n resources: a.resources,\n })),\n environments,\n resources,\n secretCount,\n };\n\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n return;\n }\n\n // --- Tree output ---\n\n const c = this.color;\n\n process.stdout.write(\n `\\n\\u{1F4E6} ${c.set(\"WHITE_BOLD\", config.project)} ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"CYAN\", env)}\\n\\n`,\n );\n\n process.stdout.write(` ${c.set(\"GREY_LIGHT\", \"Mode:\")} standalone\\n`);\n\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Environments:\")}\\n`);\n const envKeys = Object.keys(config.environments);\n for (const [i, envKey] of envKeys.entries()) {\n const envConfig = config.environments[envKey];\n const prefix =\n i === envKeys.length - 1\n ? \"\\u2514\\u2500\\u2500\"\n : \"\\u251C\\u2500\\u2500\";\n const domain = envConfig.domain\n ? ` ${c.set(\"GREY_DARK\", envConfig.domain)}`\n : \"\";\n const marker = envKey === env ? ` ${c.set(\"GREEN\", \"\\u25C0\")}` : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", prefix)} ${c.set(\"CYAN\", envKey.padEnd(10))} ${c.set(\"GREY_LIGHT\", envConfig.adapter)}${domain}${marker}\\n`,\n );\n }\n\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Resources:\")}\\n`);\n\n if (secretCount > 0) {\n resources.push({\n label: \"Secrets\",\n value: `${secretCount} from .env.${env}`,\n });\n }\n\n for (const [i, res] of resources.entries()) {\n const isLast = i === resources.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"GREY_LIGHT\", res.label.padEnd(11))} ${c.set(\"CYAN\", res.value)}\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p up\n // -----------------------------------------------------------------------\n\n protected readonly up = $command({\n name: \"up\",\n mode: \"production\",\n description: \"Build, migrate, and deploy\",\n flags: t.object({\n ...this.envFlags.properties,\n prebuilt: t.optional(\n t.boolean({\n description:\n \"Pre-built mode. Skips the Vite bundle steps; only regenerates the target deploy config (wrangler.jsonc) so it reflects current bindings and per-tenant overrides. Use when `dist/` is already produced upstream (e.g. inside Alepha Rocket).\",\n }),\n ),\n }),\n handler: async ({ flags, root, run }) => {\n process.env.NODE_ENV = \"production\";\n\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const adapter = config.environments[env]?.adapter ?? \"cloudflare\";\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapter),\n { prebuilt: flags.prebuilt },\n );\n\n const result = await this.orchestrator.up({\n root,\n env,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n run,\n prebuilt: flags.prebuilt,\n tenant: flags.tenant,\n });\n\n if (flags.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n status: \"succeeded\",\n project: config.project,\n env,\n urls: result.urls,\n domain: result.domain,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n this.orchestrator.printUpSummary(result);\n }\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p down\n // -----------------------------------------------------------------------\n\n protected readonly down = $command({\n name: \"down\",\n description: \"Tear down an environment\",\n flags: t.object({\n ...this.envFlags.properties,\n yes: t.optional(\n t.boolean({\n aliases: [\"y\"],\n description:\n \"Skip the interactive confirmation. Required for non-interactive callers (CI, Alepha Rocket). The caller is responsible for not invoking this accidentally — there's no second chance.\",\n }),\n ),\n }),\n handler: async ({ flags, root, run, ask }) => {\n if (!flags.env) {\n throw new AlephaError(\n \"--env is required for teardown. This command deletes resources.\",\n );\n }\n\n const config = await this.inspector.resolveConfig(root);\n const adapter = config.environments[flags.env]?.adapter ?? \"cloudflare\";\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapter),\n );\n\n const completed = await this.orchestrator.down({\n root,\n env: flags.env,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n run,\n tenant: flags.tenant,\n confirm: async (prompt) => {\n if (flags.yes) {\n return flags.env as string;\n }\n ask.intro(\"Confirm teardown\");\n const value = await ask(prompt);\n ask.outro(\"\");\n return value;\n },\n });\n\n if (flags.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n status: completed ? \"succeeded\" : \"aborted\",\n project: config.project,\n env: flags.env,\n },\n null,\n 2,\n )}\\n`,\n );\n }\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p status\n // -----------------------------------------------------------------------\n\n protected readonly status = $command({\n name: \"status\",\n aliases: [\"s\"],\n description: \"Show deployed state\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const adapter = config.environments[env]?.adapter ?? \"cloudflare\";\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapter),\n );\n\n const { state } = await this.orchestrator.status({\n root,\n env,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n run,\n tenant: flags.tenant,\n });\n\n // --- JSON output ---\n\n if (flags.json) {\n run.end();\n\n const output: PlatformStatusOutput = {\n project: config.project,\n env,\n adapter: config.environments[env].adapter,\n ...state,\n };\n\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n return;\n }\n\n // --- Tree output ---\n\n run.end();\n\n const c = this.color;\n\n process.stdout.write(\n `\\n\\u{1F4E6} ${c.set(\"WHITE_BOLD\", config.project)} ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"CYAN\", env)} ${c.set(\"GREY_DARK\", `(${config.environments[env].adapter})`)}\\n\\n`,\n );\n\n const hasDB = state.databases.length > 0;\n const hasBuckets = state.buckets.length > 0;\n\n process.stdout.write(` ${c.set(\"GREY_LIGHT\", \"Workers:\")}\\n`);\n for (const [i, w] of state.workers.entries()) {\n const isLast = i === state.workers.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (w.exists) {\n const versionShort = w.version?.slice(0, 8) ?? \"unknown\";\n const tag = w.tag ? ` ${c.set(\"GREY_DARK\", `(${w.tag})`)}` : \"\";\n const date = w.createdAt\n ? ` ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"GREY_DARK\", new Date(w.createdAt).toLocaleString())}`\n : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", w.name)} ${c.set(\"GREEN\", \"\\u2713\")} ${c.set(\"GREY_LIGHT\", versionShort)}${tag}${date}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", w.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not deployed\")}\\n`,\n );\n }\n }\n\n if (hasDB) {\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n const dbUrl = envVars.DATABASE_URL ?? process.env.DATABASE_URL;\n const dbLabel = dbUrl?.startsWith(\"postgres:\")\n ? \"Hyperdrive:\"\n : \"Database:\";\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", dbLabel)}\\n`);\n for (const [i, db] of state.databases.entries()) {\n const isLast = i === state.databases.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (db.exists) {\n const id = db.id\n ? ` ${c.set(\"GREY_LIGHT\", db.id.slice(0, 8))}`\n : \"\";\n const detail = db.detail\n ? ` ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"GREY_DARK\", db.detail.slice(0, 40))}`\n : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", db.name)} ${c.set(\"GREEN\", \"\\u2713\")}${id}${detail}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", db.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (hasBuckets) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Buckets:\")}\\n`);\n for (const [i, b] of state.buckets.entries()) {\n const isLast = i === state.buckets.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (b.exists) {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", b.name)} ${c.set(\"GREEN\", \"\\u2713\")}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", b.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (state.kvNamespaces.length > 0) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"KV:\")}\\n`);\n for (const [i, kv] of state.kvNamespaces.entries()) {\n const isLast = i === state.kvNamespaces.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (kv.exists) {\n const id = kv.id\n ? ` ${c.set(\"GREY_LIGHT\", kv.id.slice(0, 8))}`\n : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", kv.name)} ${c.set(\"GREEN\", \"\\u2713\")}${id}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", kv.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (state.queues.length > 0) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Queues:\")}\\n`);\n for (const [i, q] of state.queues.entries()) {\n const isLast = i === state.queues.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (q.exists) {\n const id = q.id ? ` ${c.set(\"GREY_LIGHT\", q.id.slice(0, 8))}` : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", q.name)} ${c.set(\"GREEN\", \"\\u2713\")}${id}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", q.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (state.secrets.length > 0) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Secrets:\")}\\n`);\n for (const [i, s] of state.secrets.entries()) {\n const isLast = i === state.secrets.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n const icon = s.deployed\n ? c.set(\"GREEN\", \"\\u2713\")\n : c.set(\"RED\", \"\\u2717\");\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", s.name)} ${icon}\\n`,\n );\n }\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // Granular commands\n // -----------------------------------------------------------------------\n\n protected readonly build = $command({\n name: \"build\",\n mode: \"production\",\n description: \"Build all apps locally\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n process.env.NODE_ENV = \"production\";\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.build(ctx, run);\n },\n });\n\n protected readonly deploy = $command({\n name: \"deploy\",\n description: \"Deploy apps to cloud\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.authenticate(ctx, run);\n await adapter.deploy(ctx, run);\n },\n });\n\n protected readonly migrate = $command({\n name: \"migrate\",\n description: \"Run database migrations\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.authenticate(ctx, run);\n await adapter.migrate(ctx, run);\n\n if (flags.json) {\n process.stdout.write(\n `${JSON.stringify(\n { status: \"succeeded\", project: config.project, env },\n null,\n 2,\n )}\\n`,\n );\n }\n },\n });\n\n protected readonly dbExport = $command({\n name: \"export\",\n description:\n \"Export the deployed database to a local snapshot (remote → local dev DB).\",\n flags: t.object({\n ...this.envFlags.properties,\n output: t.optional(\n t.text({\n description:\n \"Destination SQLite file. Defaults to the dev DB path (node_modules/.alepha/sqlite.db).\",\n }),\n ),\n keepSql: t.optional(\n t.boolean({\n description: \"Keep the intermediate .sql dump file.\",\n }),\n ),\n }),\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const app = await this.resolveApp(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: app.entry,\n resources: app.resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.authenticate(ctx, run);\n await adapter.exportDb(ctx, run, {\n output: flags.output,\n keepSql: flags.keepSql,\n });\n },\n });\n\n /**\n * `db` subgroup — operations against the *deployed* database (export,\n * migrate). They live under `platform` (not core `alepha db`) because\n * they need the env config, tenancy, adapter, and resource naming.\n */\n protected readonly db = $command({\n name: \"db\",\n description: \"Deployed-database operations (export, migrate).\",\n children: [this.dbExport, this.migrate],\n handler: async ({ help, root }) => {\n await this.inspector.resolveConfig(root);\n help();\n },\n });\n\n // -----------------------------------------------------------------------\n // Parent command\n // -----------------------------------------------------------------------\n\n public readonly platform = $command({\n name: \"platform\",\n aliases: [\"p\"],\n description: \"Cloud deployment orchestrator\",\n children: [\n this.plan,\n this.up,\n this.down,\n this.status,\n this.build,\n this.deploy,\n this.db,\n this.secretsCommand.secrets,\n ],\n handler: async ({ help, root }) => {\n await this.inspector.resolveConfig(root);\n help();\n },\n });\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n /**\n * Resolve app definitions.\n *\n * For standalone: returns a single app from the root.\n * For monorepo: resolves each app path, introspects for resources.\n *\n * NOTE: Resource detection (hasDatabase, hasBucket, etc.) requires\n * ViteBuildProvider.init() per app. This is expensive -- only done\n * for up/down/status, not for plan.\n */\n protected async resolveApp(\n root: string,\n _config: ResolvedPlatformConfig,\n isServerless: boolean,\n options: { prebuilt?: boolean } = {},\n ): Promise<{ entry: AppEntry; resources: DetectedResources }> {\n // Prebuilt + manifest fast-path: read `dist/manifest.json` produced\n // by the original `alepha build` instead of re-booting the workspace\n // via Vite. Lets external orchestrators (Alepha Rocket) avoid the\n // workspace's runtime `npm install` — the app source is never\n // imported here, so missing deps (react-dom, etc.) don't matter.\n if (options.prebuilt) {\n const manifest = await this.readManifest(root);\n if (manifest) {\n return {\n entry: { root, server: \"\" },\n resources: manifest.resources,\n };\n }\n // No manifest — fall through to introspection. Useful for older\n // artifacts that pre-date the manifest emission.\n }\n\n const entry = await this.boot.getAppEntry(root);\n if (isServerless) {\n process.env.ALEPHA_SERVERLESS = \"true\";\n }\n const appAlepha = await this.viteBuild.init({ entry });\n delete process.env.ALEPHA_SERVERLESS;\n const resources = this.detectResources(appAlepha);\n\n return { entry, resources };\n }\n\n /**\n * @deprecated single-app projects; use `resolveApp` directly.\n * Kept temporarily so existing commands can be migrated one at a time.\n */\n protected async resolveApps(\n root: string,\n config: ResolvedPlatformConfig,\n isServerless: boolean,\n options: { prebuilt?: boolean } = {},\n ): Promise<\n Array<{\n name: string;\n path: string;\n entry: AppEntry;\n resources: DetectedResources;\n }>\n > {\n const { entry, resources } = await this.resolveApp(\n root,\n config,\n isServerless,\n options,\n );\n return [{ name: config.project, path: \"\", entry, resources }];\n }\n\n protected isServerless(adapter: string): boolean {\n return adapter === \"vercel\" || adapter === \"cloudflare\";\n }\n\n /**\n * Read `dist/manifest.json` if present. Returns `null` when the file\n * doesn't exist or isn't parseable — caller falls back to the\n * Vite-introspection path.\n */\n protected async readManifest(root: string): Promise<{\n version: number;\n project: string;\n resources: DetectedResources;\n } | null> {\n try {\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const raw = await fs.readFile(\n path.join(root, \"dist\", \"manifest.json\"),\n \"utf-8\",\n );\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n\n protected detectResources(alepha: any): DetectedResources {\n let hasDatabase = false;\n let hasBucket = false;\n let hasKV = false;\n let hasQueue = false;\n let hasCron = false;\n\n try {\n const repo = alepha.inject(\"RepositoryProvider\");\n hasDatabase = repo.getRepositories().length > 0;\n } catch {}\n\n try {\n const buckets = alepha.primitives(\"$bucket\");\n hasBucket = buckets.length > 0;\n } catch {}\n\n try {\n // Provision KV only when the user actually wants it: a `$cache` declared\n // *without* an explicit `provider` falls back to the runtime default\n // (CloudflareKVProvider on workerd). Any explicit choice — `\"memory\"`,\n // `DatabaseCacheProvider`, a Redis provider, or a custom one — opts out\n // of the platform default and therefore should not trigger KV\n // provisioning. See platform.ts hasKV docs and `$cache.options.provider`.\n hasKV =\n alepha\n .primitives(\"cache\")\n .filter((it: any) => it.options?.provider == null).length > 0;\n } catch {}\n\n try {\n hasQueue = alepha.primitives(\"queue\").length > 0;\n } catch {}\n\n try {\n const cron = alepha.inject(\"CronProvider\");\n hasCron = cron.getCronJobs().length > 0;\n } catch {}\n\n return { hasDatabase, hasBucket, hasKV, hasQueue, hasCron };\n }\n}\n","import { $context, $module } from \"alepha\";\nimport { AlephaCli } from \"alepha/cli\";\nimport {\n AlephaPlatformLibPlugin,\n type PlatformOptions,\n platformOptions,\n} from \"alepha/cli/platform-lib\";\nimport { PlatformCommand } from \"./commands/platform.ts\";\nimport { SecretsCommand } from \"./commands/SecretsCommand.ts\";\n\n// ---------------------------------------------------------------------------\n\n/**\n * CLI plugin for multi-cloud deployment orchestration.\n *\n * Wraps `AlephaPlatformLibPlugin` (the framework-agnostic deploy\n * services) with `$command` instances so the orchestration is\n * reachable from `alepha platform …`. Non-CLI consumers (e.g. Alepha\n * Rocket) should depend on `alepha/cli/platform-lib` directly instead\n * of pulling in this command surface.\n *\n * Commands:\n * - `alepha platform plan` — show project topology and resource names\n * - `alepha platform up` — full deployment pipeline\n * - `alepha platform down` — teardown an environment\n * - `alepha platform status` — inspect deployed resources\n * - `alepha platform build` — build apps locally\n * - `alepha platform deploy` — deploy to cloud\n * - `alepha platform db migrate` — run database migrations\n * - `alepha platform db export` — pull the deployed DB into a local snapshot\n * - `alepha platform secrets` — manage external secret stores\n *\n * Configuration in `alepha.config.ts`:\n *\n * ```typescript\n * import { platform } from \"alepha/cli/platform\";\n *\n * export default defineConfig({\n * plugins: [\n * platform({\n * environments: {\n * production: { adapter: \"cloudflare\", domain: \"myapp.com\" },\n * },\n * }),\n * ],\n * });\n * ```\n */\nexport const AlephaCliPlatformPlugin = $module({\n name: \"alepha.cli.plugins.platform\",\n services: [\n AlephaCli,\n AlephaPlatformLibPlugin,\n PlatformCommand,\n SecretsCommand,\n ],\n});\n\nexport const platform = (options: PlatformOptions) => {\n // When a `production` environment with a `domain` is configured, default\n // `process.env.PUBLIC_URL` to `https://<domain>` if the host hasn't set\n // it already. Lets app code render absolute links (emails, OAuth\n // callbacks, etc.) without restating the production hostname in two\n // places. Honors an explicit env override and any non-production-only\n // setup (we don't override prod-set values).\n if (!process.env.PUBLIC_URL) {\n const productionDomain = options.environments?.production?.domain;\n if (productionDomain) {\n process.env.PUBLIC_URL = `https://${productionDomain}`;\n }\n }\n\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliPlatformPlugin).set(platformOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------\n\nexport * from \"./commands/platform.ts\";\nexport * from \"./commands/SecretsCommand.ts\";\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/cli/platform/commands/SecretsCommand.ts","../../../src/cli/platform/commands/platform.ts","../../../src/cli/platform/index.ts"],"sourcesContent":["import { $inject, $state, AlephaError, z } from \"alepha\";\nimport {\n GitHubSecretStore,\n NamingService,\n PlatformInspector,\n platformOptions,\n SecretFilterService,\n type SecretStoreProvider,\n} from \"alepha/cli/platform-lib\";\nimport { $command, EnvUtils } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\n\nexport class SecretsCommand {\n protected readonly log = $logger();\n protected readonly options = $state(platformOptions);\n protected readonly inspector = $inject(PlatformInspector);\n protected readonly naming = $inject(NamingService);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly githubStore = $inject(GitHubSecretStore);\n protected readonly filter = $inject(SecretFilterService);\n protected readonly color = $inject(ConsoleColorProvider);\n\n protected readonly envFlags = z.object({\n env: z\n .text({\n aliases: [\"e\"],\n description: \"Target environment\",\n })\n .optional(),\n });\n\n // -----------------------------------------------------------------------\n // alepha p secrets list\n // -----------------------------------------------------------------------\n\n protected readonly list = $command({\n name: \"list\",\n aliases: [\"ls\"],\n description:\n \"List secret names stored in the remote store for an environment (values are never returned). Use --format=gha to emit a ready-to-paste GitHub Actions env: block.\",\n flags: z.object({\n env: z\n .text({\n aliases: [\"e\"],\n description: \"Target environment\",\n })\n .optional(),\n format: z\n .text({\n aliases: [\"f\"],\n description: \"Output format: table (default), gha\",\n })\n .optional(),\n }),\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envName = this.resolveEnvironmentName(config.project, env);\n const format = flags.format ?? \"table\";\n\n const store = this.resolveStore();\n await store.ensureAvailable();\n const remoteSecrets = await store.list(envName);\n\n run.end();\n\n if (format === \"gha\") {\n process.stdout.write(\n `# Generated by alepha — environment: ${envName}\\n`,\n );\n process.stdout.write(\"env:\\n\");\n for (const secret of remoteSecrets) {\n const localName = this.filter.toLocalName(secret.name);\n process.stdout.write(\n ` ${localName}: \\${{ secrets.${secret.name} }}\\n`,\n );\n }\n return;\n }\n\n // table format\n const c = this.color;\n\n if (remoteSecrets.length === 0) {\n process.stdout.write(\n `\\nNo secrets in environment ${c.set(\"CYAN\", envName)}.\\n\\n`,\n );\n return;\n }\n\n process.stdout.write(\n `\\n${c.set(\"GREY_LIGHT\", \"Environment:\")} ${c.set(\"CYAN\", envName)}\\n\\n`,\n );\n\n const maxNameLen = Math.max(\n ...remoteSecrets.map((s) => s.name.length),\n 4,\n );\n\n process.stdout.write(\n ` ${c.set(\"GREY_LIGHT\", \"NAME\".padEnd(maxNameLen + 2))}${c.set(\"GREY_LIGHT\", \"UPDATED\")}\\n`,\n );\n\n for (const secret of remoteSecrets) {\n const updated = secret.updatedAt\n ? new Date(secret.updatedAt).toLocaleString()\n : \"-\";\n process.stdout.write(\n ` ${c.set(\"CYAN\", secret.name.padEnd(maxNameLen + 2))}${c.set(\"GREY_DARK\", updated)}\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p secrets diff\n // -----------------------------------------------------------------------\n\n protected readonly diff = $command({\n name: \"diff\",\n description:\n \"Compare keys in local .env.<env> against the remote store. Shows + (only local, would be pushed), - (only remote, orphaned), = (in sync). Compares names only — values are not read from remote.\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envName = this.resolveEnvironmentName(config.project, env);\n\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n const filtered = this.filter.filter(envVars);\n const localKeys = new Set(\n Object.keys(filtered).map((k) => this.filter.toRemoteName(k)),\n );\n\n const store = this.resolveStore();\n await store.ensureAvailable();\n const remoteSecrets = await store.list(envName);\n const remoteKeys = new Set(remoteSecrets.map((s) => s.name));\n\n run.end();\n\n const c = this.color;\n const allKeys = [...new Set([...localKeys, ...remoteKeys])].sort();\n\n process.stdout.write(\n `\\n${c.set(\"GREY_LIGHT\", \"Environment:\")} ${c.set(\"CYAN\", envName)}\\n\\n`,\n );\n\n let hasChanges = false;\n for (const key of allKeys) {\n const inLocal = localKeys.has(key);\n const inRemote = remoteKeys.has(key);\n\n if (inLocal && !inRemote) {\n process.stdout.write(` ${c.set(\"GREEN\", \"+\")} ${key}\\n`);\n hasChanges = true;\n } else if (!inLocal && inRemote) {\n process.stdout.write(` ${c.set(\"RED\", \"-\")} ${key}\\n`);\n hasChanges = true;\n } else {\n process.stdout.write(` ${c.set(\"GREY_DARK\", \"=\")} ${key}\\n`);\n }\n }\n\n if (!hasChanges) {\n process.stdout.write(\n ` ${c.set(\"GREEN\", \"Local and remote are in sync.\")}\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p secrets apply\n // -----------------------------------------------------------------------\n\n protected readonly apply = $command({\n name: \"apply\",\n description:\n \"Push secrets from local .env.<env> to the remote store (one upsert per key). Use --dry-run to preview. Existing remote keys not present locally are left untouched — this command never deletes.\",\n flags: z.object({\n env: z\n .text({\n aliases: [\"e\"],\n description: \"Target environment\",\n })\n .optional(),\n \"dry-run\": z\n .boolean()\n .describe(\"Preview changes without pushing\")\n .optional(),\n }),\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envName = this.resolveEnvironmentName(config.project, env);\n const dryRun = flags[\"dry-run\"] ?? false;\n\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n const filtered = this.filter.filter(envVars);\n const keys = Object.keys(filtered);\n\n if (keys.length === 0) {\n run.end();\n process.stdout.write(\"\\nNo secrets to push.\\n\\n\");\n return;\n }\n\n if (dryRun) {\n run.end();\n const c = this.color;\n process.stdout.write(\n `\\n${c.set(\"GREY_LIGHT\", \"Dry run — environment:\")} ${c.set(\"CYAN\", envName)}\\n\\n`,\n );\n for (const key of keys) {\n process.stdout.write(` ${c.set(\"GREEN\", \"+\")} ${key}\\n`);\n }\n process.stdout.write(\n `\\n ${keys.length} secret(s) would be pushed.\\n\\n`,\n );\n return;\n }\n\n const store = this.resolveStore();\n await store.ensureAvailable();\n await store.ensureEnvironment(envName);\n\n for (const key of keys) {\n const remoteName = this.filter.toRemoteName(key);\n await run({\n name: `push ${remoteName}`,\n handler: async () => {\n await store.set(envName, remoteName, filtered[key]);\n },\n });\n }\n\n run.end();\n process.stdout.write(\n `\\n${keys.length} secret(s) pushed to ${envName}.\\n`,\n );\n },\n });\n\n // -----------------------------------------------------------------------\n // Parent command\n // -----------------------------------------------------------------------\n\n public readonly secrets = $command({\n name: \"secrets\",\n aliases: [\"sec\"],\n description:\n \"Sync secrets from .env.<env> to an external CI store (currently GitHub Actions environments via the `gh` CLI). Resolves the target environment name from `secrets.environmentPattern` (default `{project}-{env}`) and filters keys via SecretFilterService. Runtime secrets for Cloudflare Workers / Vercel are pushed separately during `alepha platform up`.\",\n children: [this.list, this.diff, this.apply],\n handler: async ({ help }) => {\n help();\n },\n });\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n public resolveStore(): SecretStoreProvider {\n const storeName = this.options?.secrets?.store ?? \"github\";\n switch (storeName) {\n case \"github\":\n return this.githubStore;\n default:\n throw new AlephaError(\n `Unknown secret store \"${storeName}\". Available: github`,\n );\n }\n }\n\n protected resolveEnvironmentName(project: string, env: string): string {\n const pattern =\n this.options?.secrets?.environmentPattern ?? \"{project}-{env}\";\n\n return pattern\n .replace(\"{project}\", this.naming.slugify(project))\n .replace(\"{env}\", this.naming.slugify(env));\n }\n}\n","import { $inject, $state, AlephaError, z } from \"alepha\";\nimport { type AppEntry, AppEntryProvider, ViteBuildProvider } from \"alepha/cli\";\nimport {\n CloudflareAdapter,\n type DetectedResources,\n NamingService,\n PlatformInspector,\n PlatformOrchestrator,\n type PlatformPlanOutput,\n type PlatformStatusOutput,\n platformOptions,\n type ResolvedPlatformConfig,\n resolveTenant,\n VercelAdapter,\n} from \"alepha/cli/platform-lib\";\nimport { $command, EnvUtils } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { SecretsCommand } from \"./SecretsCommand.ts\";\n\nexport class PlatformCommand {\n protected readonly log = $logger();\n protected readonly options = $state(platformOptions);\n protected readonly orchestrator = $inject(PlatformOrchestrator);\n protected readonly inspector = $inject(PlatformInspector);\n protected readonly naming = $inject(NamingService);\n protected readonly boot = $inject(AppEntryProvider);\n protected readonly viteBuild = $inject(ViteBuildProvider);\n protected readonly color = $inject(ConsoleColorProvider);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly secretsCommand = $inject(SecretsCommand);\n\n /**\n * Common flags for env targeting.\n */\n protected readonly envFlags = z.object({\n env: z\n .text({\n aliases: [\"e\"],\n description: \"Target environment\",\n })\n .optional(),\n tenant: z\n .text({\n description:\n \"Tenant slug (apps with tenancy: optional | required). Names resources <tenant>-<project>-<env> and serves <tenant>.<domain>.\",\n })\n .optional(),\n verbose: z\n .boolean()\n .meta({ aliases: [\"v\"] })\n .describe(\"Verbose output\")\n .optional(),\n json: z.boolean().describe(\"Output as JSON\").optional(),\n });\n\n // -----------------------------------------------------------------------\n // alepha p plan\n // -----------------------------------------------------------------------\n\n protected readonly plan = $command({\n name: \"plan\",\n description: \"Show project topology and resource names\",\n flags: this.envFlags,\n handler: async ({ flags, root }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapterName = envConfig?.adapter ?? \"cloudflare\";\n\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapterName),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n // --- Data collection ---\n\n const hasDB = apps.some((a) => a.resources.hasDatabase);\n const hasBucket = apps.some((a) => a.resources.hasBucket);\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n\n const resources: Array<{ label: string; value: string }> = [];\n\n const deployLabel = adapterName === \"vercel\" ? \"Project\" : \"Worker\";\n resources.push({ label: deployLabel, value: namingCtx.worker() });\n\n if (adapterName === \"cloudflare\") {\n if (hasDB) {\n const dbUrl = envVars.DATABASE_URL ?? process.env.DATABASE_URL;\n if (dbUrl?.startsWith(\"postgres:\")) {\n resources.push({\n label: \"Hyperdrive\",\n value: namingCtx.hyperdrive(),\n });\n } else {\n resources.push({ label: \"D1\", value: namingCtx.d1() });\n }\n }\n\n if (hasBucket) {\n resources.push({ label: \"R2\", value: namingCtx.r2() });\n }\n\n for (const app of apps) {\n if (app.resources.hasKV) {\n resources.push({ label: \"KV\", value: namingCtx.kv() });\n }\n if (app.resources.hasQueue) {\n resources.push({ label: \"Queue\", value: namingCtx.queue() });\n }\n }\n }\n\n const excludedKeys =\n adapterName === \"vercel\"\n ? VercelAdapter.EXCLUDED_SECRET_KEYS\n : CloudflareAdapter.EXCLUDED_SECRET_KEYS;\n const secretCount = Object.entries(envVars).filter(\n ([key, value]) =>\n value && !excludedKeys.has(key) && !key.startsWith(\"VITE_\"),\n ).length;\n\n // --- JSON output ---\n\n if (flags.json) {\n const environments: Record<\n string,\n { adapter: string; domain?: string }\n > = {};\n for (const [key, val] of Object.entries(config.environments)) {\n environments[key] = {\n adapter: val.adapter,\n ...(val.domain ? { domain: val.domain } : {}),\n };\n }\n\n const output: PlatformPlanOutput = {\n project: config.project,\n env,\n mode: \"standalone\",\n apps: apps.map((a) => ({\n name: a.name,\n path: a.path,\n resources: a.resources,\n })),\n environments,\n resources,\n secretCount,\n };\n\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n return;\n }\n\n // --- Tree output ---\n\n const c = this.color;\n\n process.stdout.write(\n `\\n\\u{1F4E6} ${c.set(\"WHITE_BOLD\", config.project)} ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"CYAN\", env)}\\n\\n`,\n );\n\n process.stdout.write(` ${c.set(\"GREY_LIGHT\", \"Mode:\")} standalone\\n`);\n\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Environments:\")}\\n`);\n const envKeys = Object.keys(config.environments);\n for (const [i, envKey] of envKeys.entries()) {\n const envConfig = config.environments[envKey];\n const prefix =\n i === envKeys.length - 1\n ? \"\\u2514\\u2500\\u2500\"\n : \"\\u251C\\u2500\\u2500\";\n const domain = envConfig.domain\n ? ` ${c.set(\"GREY_DARK\", envConfig.domain)}`\n : \"\";\n const marker = envKey === env ? ` ${c.set(\"GREEN\", \"\\u25C0\")}` : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", prefix)} ${c.set(\"CYAN\", envKey.padEnd(10))} ${c.set(\"GREY_LIGHT\", envConfig.adapter)}${domain}${marker}\\n`,\n );\n }\n\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Resources:\")}\\n`);\n\n if (secretCount > 0) {\n resources.push({\n label: \"Secrets\",\n value: `${secretCount} from .env.${env}`,\n });\n }\n\n for (const [i, res] of resources.entries()) {\n const isLast = i === resources.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"GREY_LIGHT\", res.label.padEnd(11))} ${c.set(\"CYAN\", res.value)}\\n`,\n );\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p up\n // -----------------------------------------------------------------------\n\n protected readonly up = $command({\n name: \"up\",\n mode: \"production\",\n description: \"Build, migrate, and deploy\",\n flags: z.object({\n ...this.envFlags.properties,\n prebuilt: z\n .boolean()\n .describe(\n \"Pre-built mode. Skips the Vite bundle steps; only regenerates the target deploy config (wrangler.jsonc) so it reflects current bindings and per-tenant overrides. Use when `dist/` is already produced upstream (e.g. inside Alepha Rocket).\",\n )\n .optional(),\n }),\n handler: async ({ flags, root, run }) => {\n process.env.NODE_ENV = \"production\";\n\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const adapter = config.environments[env]?.adapter ?? \"cloudflare\";\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapter),\n { prebuilt: flags.prebuilt },\n );\n\n const result = await this.orchestrator.up({\n root,\n env,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n run,\n prebuilt: flags.prebuilt,\n tenant: flags.tenant,\n });\n\n if (flags.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n status: \"succeeded\",\n project: config.project,\n env,\n urls: result.urls,\n domain: result.domain,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n this.orchestrator.printUpSummary(result);\n }\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p down\n // -----------------------------------------------------------------------\n\n protected readonly down = $command({\n name: \"down\",\n description: \"Tear down an environment\",\n flags: z.object({\n ...this.envFlags.properties,\n yes: z\n .boolean()\n .meta({ aliases: [\"y\"] })\n .describe(\n \"Skip the interactive confirmation. Required for non-interactive callers (CI, Alepha Rocket). The caller is responsible for not invoking this accidentally — there's no second chance.\",\n )\n .optional(),\n }),\n handler: async ({ flags, root, run, ask }) => {\n if (!flags.env) {\n throw new AlephaError(\n \"--env is required for teardown. This command deletes resources.\",\n );\n }\n\n const config = await this.inspector.resolveConfig(root);\n const adapter = config.environments[flags.env]?.adapter ?? \"cloudflare\";\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapter),\n );\n\n const completed = await this.orchestrator.down({\n root,\n env: flags.env,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n run,\n tenant: flags.tenant,\n confirm: async (prompt) => {\n if (flags.yes) {\n return flags.env as string;\n }\n ask.intro(\"Confirm teardown\");\n const value = await ask(prompt);\n ask.outro(\"\");\n return value;\n },\n });\n\n if (flags.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n status: completed ? \"succeeded\" : \"aborted\",\n project: config.project,\n env: flags.env,\n },\n null,\n 2,\n )}\\n`,\n );\n }\n },\n });\n\n // -----------------------------------------------------------------------\n // alepha p status\n // -----------------------------------------------------------------------\n\n protected readonly status = $command({\n name: \"status\",\n aliases: [\"s\"],\n description: \"Show deployed state\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const adapter = config.environments[env]?.adapter ?? \"cloudflare\";\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(adapter),\n );\n\n const { state } = await this.orchestrator.status({\n root,\n env,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n run,\n tenant: flags.tenant,\n });\n\n // --- JSON output ---\n\n if (flags.json) {\n run.end();\n\n const output: PlatformStatusOutput = {\n project: config.project,\n env,\n adapter: config.environments[env].adapter,\n ...state,\n };\n\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n return;\n }\n\n // --- Tree output ---\n\n run.end();\n\n const c = this.color;\n\n process.stdout.write(\n `\\n\\u{1F4E6} ${c.set(\"WHITE_BOLD\", config.project)} ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"CYAN\", env)} ${c.set(\"GREY_DARK\", `(${config.environments[env].adapter})`)}\\n\\n`,\n );\n\n const hasDB = state.databases.length > 0;\n const hasBuckets = state.buckets.length > 0;\n\n process.stdout.write(` ${c.set(\"GREY_LIGHT\", \"Workers:\")}\\n`);\n for (const [i, w] of state.workers.entries()) {\n const isLast = i === state.workers.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (w.exists) {\n const versionShort = w.version?.slice(0, 8) ?? \"unknown\";\n const tag = w.tag ? ` ${c.set(\"GREY_DARK\", `(${w.tag})`)}` : \"\";\n const date = w.createdAt\n ? ` ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"GREY_DARK\", new Date(w.createdAt).toLocaleString())}`\n : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", w.name)} ${c.set(\"GREEN\", \"\\u2713\")} ${c.set(\"GREY_LIGHT\", versionShort)}${tag}${date}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", w.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not deployed\")}\\n`,\n );\n }\n }\n\n if (hasDB) {\n const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);\n const dbUrl = envVars.DATABASE_URL ?? process.env.DATABASE_URL;\n const dbLabel = dbUrl?.startsWith(\"postgres:\")\n ? \"Hyperdrive:\"\n : \"Database:\";\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", dbLabel)}\\n`);\n for (const [i, db] of state.databases.entries()) {\n const isLast = i === state.databases.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (db.exists) {\n const id = db.id\n ? ` ${c.set(\"GREY_LIGHT\", db.id.slice(0, 8))}`\n : \"\";\n const detail = db.detail\n ? ` ${c.set(\"GREY_DARK\", \"\\u2014\")} ${c.set(\"GREY_DARK\", db.detail.slice(0, 40))}`\n : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", db.name)} ${c.set(\"GREEN\", \"\\u2713\")}${id}${detail}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", db.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (hasBuckets) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Buckets:\")}\\n`);\n for (const [i, b] of state.buckets.entries()) {\n const isLast = i === state.buckets.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (b.exists) {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", b.name)} ${c.set(\"GREEN\", \"\\u2713\")}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", b.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (state.kvNamespaces.length > 0) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"KV:\")}\\n`);\n for (const [i, kv] of state.kvNamespaces.entries()) {\n const isLast = i === state.kvNamespaces.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (kv.exists) {\n const id = kv.id\n ? ` ${c.set(\"GREY_LIGHT\", kv.id.slice(0, 8))}`\n : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", kv.name)} ${c.set(\"GREEN\", \"\\u2713\")}${id}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", kv.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (state.queues.length > 0) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Queues:\")}\\n`);\n for (const [i, q] of state.queues.entries()) {\n const isLast = i === state.queues.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n if (q.exists) {\n const id = q.id ? ` ${c.set(\"GREY_LIGHT\", q.id.slice(0, 8))}` : \"\";\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", q.name)} ${c.set(\"GREEN\", \"\\u2713\")}${id}\\n`,\n );\n } else {\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", q.name)} ${c.set(\"RED\", \"\\u2717\")} ${c.set(\"RED\", \"not provisioned\")}\\n`,\n );\n }\n }\n }\n\n if (state.secrets.length > 0) {\n process.stdout.write(`\\n ${c.set(\"GREY_LIGHT\", \"Secrets:\")}\\n`);\n for (const [i, s] of state.secrets.entries()) {\n const isLast = i === state.secrets.length - 1;\n const branch = isLast ? \"\\u2514\\u2500\\u2500\" : \"\\u251C\\u2500\\u2500\";\n const icon = s.deployed\n ? c.set(\"GREEN\", \"\\u2713\")\n : c.set(\"RED\", \"\\u2717\");\n process.stdout.write(\n ` ${c.set(\"GREY_DARK\", branch)} ${c.set(\"CYAN\", s.name)} ${icon}\\n`,\n );\n }\n }\n\n process.stdout.write(\"\\n\");\n },\n });\n\n // -----------------------------------------------------------------------\n // Granular commands\n // -----------------------------------------------------------------------\n\n protected readonly build = $command({\n name: \"build\",\n mode: \"production\",\n description: \"Build all apps locally\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n process.env.NODE_ENV = \"production\";\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.build(ctx, run);\n },\n });\n\n protected readonly deploy = $command({\n name: \"deploy\",\n description: \"Deploy apps to cloud\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.authenticate(ctx, run);\n await adapter.deploy(ctx, run);\n },\n });\n\n protected readonly migrate = $command({\n name: \"migrate\",\n description: \"Run database migrations\",\n flags: this.envFlags,\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const apps = await this.resolveApps(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: apps[0].entry,\n resources: apps[0].resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.authenticate(ctx, run);\n await adapter.migrate(ctx, run);\n\n if (flags.json) {\n process.stdout.write(\n `${JSON.stringify(\n { status: \"succeeded\", project: config.project, env },\n null,\n 2,\n )}\\n`,\n );\n }\n },\n });\n\n protected readonly dbExport = $command({\n name: \"export\",\n description:\n \"Export the deployed database to a local snapshot (remote → local dev DB).\",\n flags: z.object({\n ...this.envFlags.properties,\n output: z\n .text({\n description:\n \"Destination SQLite file. Defaults to the dev DB path (node_modules/.alepha/sqlite.db).\",\n })\n .optional(),\n keepSql: z\n .boolean()\n .describe(\"Keep the intermediate .sql dump file.\")\n .optional(),\n }),\n handler: async ({ flags, root, run }) => {\n const config = await this.inspector.resolveConfig(root);\n const env = flags.env ?? config.defaultEnv;\n const envConfig = config.environments[env];\n const adapter = this.orchestrator.resolveAdapter(envConfig.adapter);\n const app = await this.resolveApp(\n root,\n config,\n this.isServerless(envConfig.adapter),\n );\n const tenant = resolveTenant(config.tenancy, flags.tenant);\n const namingCtx = this.naming.forContext(config.project, env, tenant);\n\n const ctx = {\n project: config.project,\n env,\n envConfig,\n entry: app.entry,\n resources: app.resources,\n\n root,\n naming: namingCtx,\n tenant,\n };\n\n await adapter.authenticate(ctx, run);\n await adapter.exportDb(ctx, run, {\n output: flags.output,\n keepSql: flags.keepSql,\n });\n },\n });\n\n /**\n * `db` subgroup — operations against the *deployed* database (export,\n * migrate). They live under `platform` (not core `alepha db`) because\n * they need the env config, tenancy, adapter, and resource naming.\n */\n protected readonly db = $command({\n name: \"db\",\n description: \"Deployed-database operations (export, migrate).\",\n children: [this.dbExport, this.migrate],\n handler: async ({ help, root }) => {\n await this.inspector.resolveConfig(root);\n help();\n },\n });\n\n // -----------------------------------------------------------------------\n // Parent command\n // -----------------------------------------------------------------------\n\n public readonly platform = $command({\n name: \"platform\",\n aliases: [\"p\"],\n description: \"Cloud deployment orchestrator\",\n children: [\n this.plan,\n this.up,\n this.down,\n this.status,\n this.build,\n this.deploy,\n this.db,\n this.secretsCommand.secrets,\n ],\n handler: async ({ help, root }) => {\n await this.inspector.resolveConfig(root);\n help();\n },\n });\n\n // -----------------------------------------------------------------------\n // Helpers\n // -----------------------------------------------------------------------\n\n /**\n * Resolve app definitions.\n *\n * For standalone: returns a single app from the root.\n * For monorepo: resolves each app path, introspects for resources.\n *\n * NOTE: Resource detection (hasDatabase, hasBucket, etc.) requires\n * ViteBuildProvider.init() per app. This is expensive -- only done\n * for up/down/status, not for plan.\n */\n protected async resolveApp(\n root: string,\n _config: ResolvedPlatformConfig,\n isServerless: boolean,\n options: { prebuilt?: boolean } = {},\n ): Promise<{ entry: AppEntry; resources: DetectedResources }> {\n // Prebuilt + manifest fast-path: read `dist/manifest.json` produced\n // by the original `alepha build` instead of re-booting the workspace\n // via Vite. Lets external orchestrators (Alepha Rocket) avoid the\n // workspace's runtime `npm install` — the app source is never\n // imported here, so missing deps (react-dom, etc.) don't matter.\n if (options.prebuilt) {\n const manifest = await this.readManifest(root);\n if (manifest) {\n return {\n entry: { root, server: \"\" },\n resources: manifest.resources,\n };\n }\n // No manifest — fall through to introspection. Useful for older\n // artifacts that pre-date the manifest emission.\n }\n\n const entry = await this.boot.getAppEntry(root);\n if (isServerless) {\n process.env.ALEPHA_SERVERLESS = \"true\";\n }\n const appAlepha = await this.viteBuild.init({ entry });\n delete process.env.ALEPHA_SERVERLESS;\n const resources = this.detectResources(appAlepha);\n\n return { entry, resources };\n }\n\n /**\n * @deprecated single-app projects; use `resolveApp` directly.\n * Kept temporarily so existing commands can be migrated one at a time.\n */\n protected async resolveApps(\n root: string,\n config: ResolvedPlatformConfig,\n isServerless: boolean,\n options: { prebuilt?: boolean } = {},\n ): Promise<\n Array<{\n name: string;\n path: string;\n entry: AppEntry;\n resources: DetectedResources;\n }>\n > {\n const { entry, resources } = await this.resolveApp(\n root,\n config,\n isServerless,\n options,\n );\n return [{ name: config.project, path: \"\", entry, resources }];\n }\n\n protected isServerless(adapter: string): boolean {\n return adapter === \"vercel\" || adapter === \"cloudflare\";\n }\n\n /**\n * Read `dist/manifest.json` if present. Returns `null` when the file\n * doesn't exist or isn't parseable — caller falls back to the\n * Vite-introspection path.\n */\n protected async readManifest(root: string): Promise<{\n version: number;\n project: string;\n resources: DetectedResources;\n } | null> {\n try {\n const fs = await import(\"node:fs/promises\");\n const path = await import(\"node:path\");\n const raw = await fs.readFile(\n path.join(root, \"dist\", \"manifest.json\"),\n \"utf-8\",\n );\n return JSON.parse(raw);\n } catch {\n return null;\n }\n }\n\n protected detectResources(alepha: any): DetectedResources {\n let hasDatabase = false;\n let hasBucket = false;\n let hasKV = false;\n let hasQueue = false;\n let hasCron = false;\n\n try {\n const repo = alepha.inject(\"RepositoryProvider\");\n hasDatabase = repo.getRepositories().length > 0;\n } catch {}\n\n try {\n const buckets = alepha.primitives(\"$bucket\");\n hasBucket = buckets.length > 0;\n } catch {}\n\n try {\n // Provision KV only when the user actually wants it: a `$cache` declared\n // *without* an explicit `provider` falls back to the runtime default\n // (CloudflareKVProvider on workerd). Any explicit choice — `\"memory\"`,\n // `DatabaseCacheProvider`, a Redis provider, or a custom one — opts out\n // of the platform default and therefore should not trigger KV\n // provisioning. See platform.ts hasKV docs and `$cache.options.provider`.\n hasKV =\n alepha\n .primitives(\"cache\")\n .filter((it: any) => it.options?.provider == null).length > 0;\n } catch {}\n\n try {\n hasQueue = alepha.primitives(\"queue\").length > 0;\n } catch {}\n\n try {\n const cron = alepha.inject(\"CronProvider\");\n hasCron = cron.getCronJobs().length > 0;\n } catch {}\n\n return { hasDatabase, hasBucket, hasKV, hasQueue, hasCron };\n }\n}\n","import { $context, $module } from \"alepha\";\nimport { AlephaCli } from \"alepha/cli\";\nimport {\n AlephaPlatformLibPlugin,\n type PlatformOptions,\n platformOptions,\n} from \"alepha/cli/platform-lib\";\nimport { PlatformCommand } from \"./commands/platform.ts\";\nimport { SecretsCommand } from \"./commands/SecretsCommand.ts\";\n\n// ---------------------------------------------------------------------------\n\n/**\n * CLI plugin for multi-cloud deployment orchestration.\n *\n * Wraps `AlephaPlatformLibPlugin` (the framework-agnostic deploy\n * services) with `$command` instances so the orchestration is\n * reachable from `alepha platform …`. Non-CLI consumers (e.g. Alepha\n * Rocket) should depend on `alepha/cli/platform-lib` directly instead\n * of pulling in this command surface.\n *\n * Commands:\n * - `alepha platform plan` — show project topology and resource names\n * - `alepha platform up` — full deployment pipeline\n * - `alepha platform down` — teardown an environment\n * - `alepha platform status` — inspect deployed resources\n * - `alepha platform build` — build apps locally\n * - `alepha platform deploy` — deploy to cloud\n * - `alepha platform db migrate` — run database migrations\n * - `alepha platform db export` — pull the deployed DB into a local snapshot\n * - `alepha platform secrets` — manage external secret stores\n *\n * Configuration in `alepha.config.ts`:\n *\n * ```typescript\n * import { platform } from \"alepha/cli/platform\";\n *\n * export default defineConfig({\n * plugins: [\n * platform({\n * environments: {\n * production: { adapter: \"cloudflare\", domain: \"myapp.com\" },\n * },\n * }),\n * ],\n * });\n * ```\n */\nexport const AlephaCliPlatformPlugin = $module({\n name: \"alepha.cli.plugins.platform\",\n services: [\n AlephaCli,\n AlephaPlatformLibPlugin,\n PlatformCommand,\n SecretsCommand,\n ],\n});\n\nexport const platform = (options: PlatformOptions) => {\n // When a `production` environment with a `domain` is configured, default\n // `process.env.PUBLIC_URL` to `https://<domain>` if the host hasn't set\n // it already. Lets app code render absolute links (emails, OAuth\n // callbacks, etc.) without restating the production hostname in two\n // places. Honors an explicit env override and any non-production-only\n // setup (we don't override prod-set values).\n if (!process.env.PUBLIC_URL) {\n const productionDomain = options?.environments?.production?.domain;\n if (productionDomain) {\n process.env.PUBLIC_URL = `https://${productionDomain}`;\n }\n }\n\n return () => {\n const { alepha } = $context();\n alepha.with(AlephaCliPlatformPlugin).set(platformOptions, options);\n };\n};\n\n// ---------------------------------------------------------------------------\n\nexport * from \"./commands/platform.ts\";\nexport * from \"./commands/SecretsCommand.ts\";\n"],"mappings":"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"}
|