alepha 0.21.2 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +393 -403
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +25 -56
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +31 -1
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +313 -208
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +152 -42
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +2 -2
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +282 -285
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +39 -33
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +217 -222
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +188 -195
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +71 -76
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +104 -109
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +43 -16
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +488 -344
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +175 -35
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +396 -402
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +644 -652
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +1 -1
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -0
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1106 -1005
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +307 -64
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +137 -143
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +95 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +121 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/index.workerd.js +110 -0
- package/dist/background/index.workerd.js.map +1 -0
- package/dist/batch/index.d.ts +5 -7
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +76 -54
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +58 -11
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +200 -5
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +7 -10
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -26
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +4 -7
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/captcha/index.d.ts +3 -6
- package/dist/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +458 -249
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +372 -660
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -5
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +20 -17
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +45 -11
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +126 -1342
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +136 -2374
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +1472 -0
- package/dist/cli/platform-lib/index.d.ts.map +1 -0
- package/dist/cli/platform-lib/index.js +2660 -0
- package/dist/cli/platform-lib/index.js.map +1 -0
- package/dist/cli/vendor/index.d.ts +17 -21
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +20 -19
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +39 -10
- package/dist/command/index.js.map +1 -1
- package/dist/{containers → container}/core/index.d.ts +13 -15
- package/dist/container/core/index.d.ts.map +1 -0
- package/dist/{containers → container}/core/index.js +23 -14
- package/dist/container/core/index.js.map +1 -0
- package/dist/{containers → container}/core/index.workerd.js +37 -22
- package/dist/container/core/index.workerd.js.map +1 -0
- package/dist/core/index.browser.js +27 -1
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +48 -24
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +27 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +27 -1
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +27 -1
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +5 -8
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +3 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +2 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +20 -7
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +46 -9
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +6 -9
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +10 -13
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +107 -32
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1 -2
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +9 -14
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +2 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +105 -76
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +196 -174
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +25 -20
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +23 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +19 -1
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +76 -62
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +20 -2
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +28 -20
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +12 -15
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -5
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.browser.js +9 -2
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +14 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js +9 -2
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +7 -8
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +6 -3
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +2 -5
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +16 -15
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.browser.js.map +1 -1
- package/dist/react/head/index.d.ts +2 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +90 -11
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +147 -11
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +2 -2
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +193 -24
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +434 -222
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +249 -35
- 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 +92 -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 +1 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +16 -17
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/ui/index.d.ts +20 -25
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +17 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +2 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +10 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +45 -48
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +272 -173
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1608 -15
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +20 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +22 -3
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +106 -73
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +44 -0
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +11 -14
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +6 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/etag/index.js.map +1 -1
- package/dist/server/health/index.d.ts +18 -21
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +2 -0
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +63 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +2 -0
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +5 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +3 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +10 -13
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +3 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +5 -8
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +3 -5
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +2 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.d.ts +4 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +5 -8
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js.map +1 -1
- package/package.json +59 -23
- package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
- package/src/api/audits/controllers/AdminAuditController.ts +14 -0
- package/src/api/audits/services/AuditService.ts +21 -88
- package/src/api/files/__tests__/FileService.spec.ts +207 -2
- package/src/api/files/index.ts +3 -0
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
- package/src/api/files/schemas/fileResourceSchema.ts +10 -1
- package/src/api/files/services/FileService.ts +170 -72
- package/src/api/jobs/__tests__/$job.spec.ts +24 -1
- package/src/api/jobs/index.ts +4 -3
- package/src/api/jobs/primitives/$job.ts +7 -3
- package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
- package/src/api/jobs/providers/JobProvider.ts +53 -24
- package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
- package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
- package/src/api/parameters/audits/ParameterAudits.ts +17 -0
- package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
- package/src/api/parameters/index.ts +3 -0
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
- package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
- package/src/api/parameters/services/ParameterProvider.ts +69 -6
- package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
- package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
- package/src/api/users/audits/SessionAudits.ts +33 -0
- package/src/api/users/audits/UserAudits.ts +19 -43
- package/src/api/users/controllers/AdminUserController.ts +66 -1
- package/src/api/users/controllers/RealmController.ts +1 -0
- package/src/api/users/entities/sessions.ts +6 -0
- package/src/api/users/entities/users.ts +2 -0
- package/src/api/users/index.ts +9 -1
- package/src/api/users/primitives/$realm.ts +29 -0
- package/src/api/users/providers/RealmProvider.ts +15 -0
- package/src/api/users/schemas/realmConfigSchema.ts +14 -0
- package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
- package/src/api/users/schemas/updateUserSchema.ts +1 -8
- package/src/api/users/schemas/userQuerySchema.ts +7 -0
- package/src/api/users/services/CredentialService.ts +15 -6
- package/src/api/users/services/IdentityService.ts +2 -1
- package/src/api/users/services/RegistrationService.ts +2 -1
- package/src/api/users/services/SessionCrudService.ts +19 -2
- package/src/api/users/services/SessionService.ts +39 -19
- package/src/api/users/services/UserService.ts +106 -8
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
- package/src/background/index.ts +37 -0
- package/src/background/index.workerd.ts +28 -0
- package/src/background/providers/BackgroundTaskProvider.ts +70 -0
- package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
- package/src/bucket/__tests__/$bucket.spec.ts +18 -0
- package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
- package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
- package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
- package/src/bucket/__tests__/shared.ts +30 -0
- package/src/bucket/index.ts +5 -5
- package/src/bucket/index.workerd.ts +11 -4
- package/src/bucket/primitives/$bucket.ts +27 -0
- package/src/bucket/providers/FileStorageProvider.ts +13 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
- package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
- package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
- package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
- package/src/cli/core/__tests__/init.spec.ts +0 -219
- package/src/cli/core/atoms/buildOptions.ts +0 -12
- package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
- package/src/cli/core/commands/build.ts +105 -37
- package/src/cli/core/commands/init.ts +0 -12
- package/src/cli/core/commands/pack.ts +133 -0
- package/src/cli/core/index.ts +3 -3
- package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
- package/src/cli/core/services/PackageManagerUtils.ts +0 -16
- package/src/cli/core/services/ProjectScaffolder.ts +29 -291
- package/src/cli/core/tasks/BuildCloudflareTask.ts +382 -56
- package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
- package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
- package/src/cli/core/tasks/BuildTask.ts +34 -0
- package/src/cli/core/templates/apiIndexTs.ts +1 -22
- package/src/cli/core/templates/mainCss.ts +0 -1
- package/src/cli/core/templates/webAppRouterTs.ts +0 -99
- package/src/cli/core/templates/webIndexTs.ts +1 -22
- package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
- package/src/cli/i18n/services/I18nCheckService.ts +65 -11
- package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
- package/src/cli/platform/commands/SecretsCommand.ts +8 -6
- package/src/cli/platform/commands/platform.ts +192 -46
- package/src/cli/platform/index.ts +12 -52
- package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
- package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
- package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
- package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +519 -190
- package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
- package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
- package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
- package/src/cli/platform-lib/index.ts +67 -0
- package/src/cli/platform-lib/services/NamingService.ts +136 -0
- package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
- package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
- package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
- package/src/command/__tests__/Runner.spec.ts +20 -0
- package/src/command/helpers/EnvUtils.ts +19 -3
- package/src/command/helpers/Runner.ts +12 -2
- package/src/command/providers/CliProvider.ts +34 -1
- package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
- package/src/{containers → container}/core/index.ts +4 -4
- package/src/{containers → container}/core/index.workerd.ts +19 -3
- package/src/{containers → container}/core/primitives/$container.ts +1 -1
- package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
- package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
- package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
- package/src/core/Alepha.ts +49 -1
- package/src/core/__tests__/$env.spec.ts +42 -0
- package/src/core/__tests__/dump.spec.ts +47 -0
- package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
- package/src/email/cloudflare/index.ts +14 -5
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
- package/src/logger/__tests__/Logger.spec.ts +55 -0
- package/src/logger/index.ts +13 -0
- package/src/logger/services/Logger.ts +31 -1
- package/src/mcp/__tests__/McpServerProvider.spec.ts +71 -0
- package/src/mcp/providers/McpServerProvider.ts +55 -0
- package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
- package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
- package/src/orm/core/interfaces/PgQuery.ts +4 -1
- package/src/orm/core/services/Repository.ts +27 -11
- package/src/react/auth/hooks/useAuth.ts +10 -5
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
- package/src/react/core/hooks/useAction.ts +14 -3
- package/src/react/core/hooks/useQuery.ts +24 -4
- package/src/react/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/services/FormModel.ts +57 -39
- package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
- package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
- package/src/react/i18n/components/Translate.tsx +47 -0
- package/src/react/i18n/index.ts +2 -0
- package/src/react/i18n/providers/I18nProvider.ts +171 -12
- package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
- package/src/react/router/__tests__/$page.spec.tsx +3 -2
- package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
- package/src/react/router/__tests__/page-can.spec.ts +18 -13
- package/src/react/router/hooks/useQueryParams.ts +114 -14
- 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 +85 -4
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +18 -8
- package/src/react/router/providers/ReactPageProvider.ts +12 -1
- package/src/react/router/providers/ReactServerProvider.ts +96 -14
- 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/services/SchemaControl.ts +3 -4
- package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
- package/src/server/auth/__tests__/authFederationClient.spec.ts +40 -0
- package/src/server/auth/__tests__/federationAssertion.spec.ts +146 -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/federationAssertion.ts +74 -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 +4 -0
- package/src/server/auth/primitives/$authFederationBroker.ts +273 -0
- package/src/server/auth/primitives/$authFederationClient.ts +89 -0
- package/src/server/auth/providers/ServerAuthProvider.ts +18 -4
- package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +70 -0
- package/src/server/cookies/providers/ServerCookiesProvider.ts +23 -3
- package/src/server/core/interfaces/ServerRequest.ts +8 -0
- package/src/server/core/primitives/$route.ts +27 -0
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
- package/src/server/links/providers/LinkProvider.ts +10 -0
- package/dist/containers/core/index.d.ts.map +0 -1
- package/dist/containers/core/index.js.map +0 -1
- package/dist/containers/core/index.workerd.js.map +0 -1
- package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
- package/src/cli/core/templates/componentsJsonTs.ts +0 -39
- package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
- package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
- package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
- package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
- package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
- package/src/cli/platform/services/NamingService.ts +0 -54
- /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
- /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
- /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
- /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
|
@@ -2,14 +2,13 @@ import { basename, dirname } from "node:path";
|
|
|
2
2
|
import { $inject, AlephaError } from "alepha";
|
|
3
3
|
import type { RunnerMethod } from "alepha/command";
|
|
4
4
|
import { $logger, ConsoleColorProvider } from "alepha/logger";
|
|
5
|
-
import { FileSystemProvider
|
|
5
|
+
import { FileSystemProvider } from "alepha/system";
|
|
6
6
|
import { agentMd } from "../templates/agentMd.ts";
|
|
7
7
|
import { alephaConfigTs } from "../templates/alephaConfigTs.ts";
|
|
8
8
|
import { apiHelloControllerTs } from "../templates/apiHelloControllerTs.ts";
|
|
9
9
|
import { apiHelloResponseSchemaTs } from "../templates/apiHelloResponseSchemaTs.ts";
|
|
10
10
|
import { apiIndexTs } from "../templates/apiIndexTs.ts";
|
|
11
11
|
import { biomeJson } from "../templates/biomeJson.ts";
|
|
12
|
-
import { componentsJsonTs } from "../templates/componentsJsonTs.ts";
|
|
13
12
|
import { dummySpecTs } from "../templates/dummySpecTs.ts";
|
|
14
13
|
import { editorconfig } from "../templates/editorconfig.ts";
|
|
15
14
|
import { gitignore } from "../templates/gitignore.ts";
|
|
@@ -17,19 +16,6 @@ import { logoSvg } from "../templates/logoSvg.ts";
|
|
|
17
16
|
import { mainBrowserTs } from "../templates/mainBrowserTs.ts";
|
|
18
17
|
import { mainCss } from "../templates/mainCss.ts";
|
|
19
18
|
import { mainServerTs } from "../templates/mainServerTs.ts";
|
|
20
|
-
import { saasAdminLayoutTsx } from "../templates/saasAdminLayoutTsx.ts";
|
|
21
|
-
import {
|
|
22
|
-
saasAdminSessionsTsx,
|
|
23
|
-
saasAdminUsersTsx,
|
|
24
|
-
} from "../templates/saasAdminPagesTsx.ts";
|
|
25
|
-
import { saasAuthLayoutTsx } from "../templates/saasAuthLayoutTsx.ts";
|
|
26
|
-
import {
|
|
27
|
-
saasAuthLoginTsx,
|
|
28
|
-
saasAuthRegisterTsx,
|
|
29
|
-
saasAuthResetPasswordTsx,
|
|
30
|
-
saasAuthVerifyEmailTsx,
|
|
31
|
-
} from "../templates/saasAuthPagesTsx.ts";
|
|
32
|
-
import { saasRealmProviderTs } from "../templates/saasRealmProviderTs.ts";
|
|
33
19
|
import { tsconfigJson } from "../templates/tsconfigJson.ts";
|
|
34
20
|
import { viteConfigTs } from "../templates/viteConfigTs.ts";
|
|
35
21
|
import { vitestConfigTs } from "../templates/vitestConfigTs.ts";
|
|
@@ -56,7 +42,6 @@ export class ProjectScaffolder {
|
|
|
56
42
|
protected readonly log = $logger();
|
|
57
43
|
protected readonly colors = $inject(ConsoleColorProvider);
|
|
58
44
|
protected readonly fs = $inject(FileSystemProvider);
|
|
59
|
-
protected readonly shell = $inject(ShellProvider);
|
|
60
45
|
protected readonly pm = $inject(PackageManagerUtils);
|
|
61
46
|
protected readonly utils = $inject(AlephaCliUtils);
|
|
62
47
|
|
|
@@ -86,13 +71,7 @@ export class ProjectScaffolder {
|
|
|
86
71
|
*/
|
|
87
72
|
checkWorkspace?: boolean;
|
|
88
73
|
packageJson?: boolean | DependencyModes;
|
|
89
|
-
|
|
90
|
-
* `true` writes a tsconfig.json if one doesn't already exist (parent
|
|
91
|
-
* dirs included). `"local"` writes one when none exists *in this
|
|
92
|
-
* directory* — used by shadcn since the CLI reads the local
|
|
93
|
-
* tsconfig directly for import-alias detection.
|
|
94
|
-
*/
|
|
95
|
-
tsconfigJson?: boolean | "local";
|
|
74
|
+
tsconfigJson?: boolean;
|
|
96
75
|
biomeJson?: boolean;
|
|
97
76
|
editorconfig?: boolean;
|
|
98
77
|
agentMd?: boolean;
|
|
@@ -118,12 +97,7 @@ export class ProjectScaffolder {
|
|
|
118
97
|
);
|
|
119
98
|
}
|
|
120
99
|
if (opts.tsconfigJson) {
|
|
121
|
-
tasks.push(
|
|
122
|
-
this.ensureTsConfig(root, {
|
|
123
|
-
force,
|
|
124
|
-
localOnly: opts.tsconfigJson === "local",
|
|
125
|
-
}),
|
|
126
|
-
);
|
|
100
|
+
tasks.push(this.ensureTsConfig(root, { force }));
|
|
127
101
|
}
|
|
128
102
|
if (opts.biomeJson) {
|
|
129
103
|
tasks.push(this.ensureBiomeConfig(root, { force, checkWorkspace }));
|
|
@@ -147,14 +121,9 @@ export class ProjectScaffolder {
|
|
|
147
121
|
|
|
148
122
|
public async ensureTsConfig(
|
|
149
123
|
root: string,
|
|
150
|
-
opts: { force?: boolean
|
|
124
|
+
opts: { force?: boolean } = {},
|
|
151
125
|
): Promise<void> {
|
|
152
|
-
|
|
153
|
-
// `localOnly: true` skips the parent walk — needed when a tool reads the
|
|
154
|
-
// local tsconfig directly (shadcn does this for import-alias detection).
|
|
155
|
-
const exists = opts.localOnly
|
|
156
|
-
? await this.fs.exists(this.fs.join(root, "tsconfig.json"))
|
|
157
|
-
: await this.existsInParents(root, "tsconfig.json");
|
|
126
|
+
const exists = await this.existsInParents(root, "tsconfig.json");
|
|
158
127
|
if (!opts.force && exists) {
|
|
159
128
|
return;
|
|
160
129
|
}
|
|
@@ -312,7 +281,7 @@ export class ProjectScaffolder {
|
|
|
312
281
|
*/
|
|
313
282
|
public async ensureApiProject(
|
|
314
283
|
root: string,
|
|
315
|
-
opts: {
|
|
284
|
+
opts: { force?: boolean } = {},
|
|
316
285
|
): Promise<void> {
|
|
317
286
|
const appName = this.getAppName(root);
|
|
318
287
|
|
|
@@ -328,7 +297,7 @@ export class ProjectScaffolder {
|
|
|
328
297
|
await this.ensureFile(
|
|
329
298
|
root,
|
|
330
299
|
"src/api/index.ts",
|
|
331
|
-
apiIndexTs({ appName
|
|
300
|
+
apiIndexTs({ appName }),
|
|
332
301
|
opts.force,
|
|
333
302
|
);
|
|
334
303
|
await this.ensureFile(
|
|
@@ -343,46 +312,6 @@ export class ProjectScaffolder {
|
|
|
343
312
|
apiHelloResponseSchemaTs(),
|
|
344
313
|
opts.force,
|
|
345
314
|
);
|
|
346
|
-
|
|
347
|
-
if (opts.saas) {
|
|
348
|
-
await this.fs.mkdir(this.fs.join(root, "src/api/providers"), {
|
|
349
|
-
recursive: true,
|
|
350
|
-
});
|
|
351
|
-
await this.ensureFile(
|
|
352
|
-
root,
|
|
353
|
-
"src/api/providers/RealmProvider.ts",
|
|
354
|
-
saasRealmProviderTs(),
|
|
355
|
-
opts.force,
|
|
356
|
-
);
|
|
357
|
-
// Seed the admin email into .env (gitignored) — never into source.
|
|
358
|
-
// Detected from `git config user.email`; neutral fallback otherwise.
|
|
359
|
-
const adminEmail = (await this.detectGitEmail()) ?? "admin@alepha.dev";
|
|
360
|
-
await this.ensureFile(
|
|
361
|
-
root,
|
|
362
|
-
".env",
|
|
363
|
-
`ADMIN_EMAILS=${adminEmail}\n`,
|
|
364
|
-
opts.force,
|
|
365
|
-
);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
/**
|
|
370
|
-
* Best-effort lookup for the developer's git email — seeded as
|
|
371
|
-
* `ADMIN_EMAILS` in the SaaS project's `.env`. Returns undefined if git
|
|
372
|
-
* isn't available or `user.email` isn't configured; the caller then falls
|
|
373
|
-
* back to the neutral `admin@alepha.dev`.
|
|
374
|
-
*/
|
|
375
|
-
protected async detectGitEmail(): Promise<string | undefined> {
|
|
376
|
-
try {
|
|
377
|
-
const stdout = (await this.shell.run("git config --get user.email", {
|
|
378
|
-
capture: true,
|
|
379
|
-
})) as unknown as string;
|
|
380
|
-
const email = (stdout ?? "").trim();
|
|
381
|
-
if (!email || !email.includes("@")) return undefined;
|
|
382
|
-
return email;
|
|
383
|
-
} catch {
|
|
384
|
-
return undefined;
|
|
385
|
-
}
|
|
386
315
|
}
|
|
387
316
|
|
|
388
317
|
// ===========================================
|
|
@@ -402,8 +331,6 @@ export class ProjectScaffolder {
|
|
|
402
331
|
opts: {
|
|
403
332
|
api?: boolean;
|
|
404
333
|
tailwind?: boolean;
|
|
405
|
-
shadcn?: boolean;
|
|
406
|
-
saas?: boolean;
|
|
407
334
|
force?: boolean;
|
|
408
335
|
} = {},
|
|
409
336
|
): Promise<void> {
|
|
@@ -414,15 +341,6 @@ export class ProjectScaffolder {
|
|
|
414
341
|
recursive: true,
|
|
415
342
|
});
|
|
416
343
|
|
|
417
|
-
if (opts.saas) {
|
|
418
|
-
await this.fs.mkdir(this.fs.join(root, "src/web/components/auth"), {
|
|
419
|
-
recursive: true,
|
|
420
|
-
});
|
|
421
|
-
await this.fs.mkdir(this.fs.join(root, "src/web/components/admin"), {
|
|
422
|
-
recursive: true,
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
|
|
426
344
|
// public/favicon.svg
|
|
427
345
|
await this.fs.mkdir(this.fs.join(root, "public"), { recursive: true });
|
|
428
346
|
await this.ensureFile(root, "public/favicon.svg", logoSvg, opts.force);
|
|
@@ -440,32 +358,17 @@ export class ProjectScaffolder {
|
|
|
440
358
|
await this.ensureFile(root, "vite.config.ts", viteConfigTs(), opts.force);
|
|
441
359
|
}
|
|
442
360
|
|
|
443
|
-
// shadcn/ui: write components.json before running `shadcn init` — the
|
|
444
|
-
// CLI respects an existing config and skips its interactive prompts,
|
|
445
|
-
// which lets us pin our aliases (`@/web/*`) and the `@alepha` registry.
|
|
446
|
-
// The CLI itself writes the cn() helper, theme tokens, and installs
|
|
447
|
-
// runtime deps (clsx, tailwind-merge, class-variance-authority,
|
|
448
|
-
// lucide-react, tw-animate-css) — see runShadcnInit below.
|
|
449
|
-
if (opts.shadcn) {
|
|
450
|
-
await this.ensureFile(
|
|
451
|
-
root,
|
|
452
|
-
"components.json",
|
|
453
|
-
componentsJsonTs(),
|
|
454
|
-
opts.force,
|
|
455
|
-
);
|
|
456
|
-
}
|
|
457
|
-
|
|
458
361
|
// Web structure
|
|
459
362
|
await this.ensureFile(
|
|
460
363
|
root,
|
|
461
364
|
"src/web/index.ts",
|
|
462
|
-
webIndexTs({ appName
|
|
365
|
+
webIndexTs({ appName }),
|
|
463
366
|
opts.force,
|
|
464
367
|
);
|
|
465
368
|
await this.ensureFile(
|
|
466
369
|
root,
|
|
467
370
|
"src/web/AppRouter.ts",
|
|
468
|
-
webAppRouterTs({ api: opts.api
|
|
371
|
+
webAppRouterTs({ api: opts.api }),
|
|
469
372
|
opts.force,
|
|
470
373
|
);
|
|
471
374
|
await this.ensureFile(
|
|
@@ -480,62 +383,6 @@ export class ProjectScaffolder {
|
|
|
480
383
|
mainBrowserTs(),
|
|
481
384
|
opts.force,
|
|
482
385
|
);
|
|
483
|
-
|
|
484
|
-
if (opts.saas) {
|
|
485
|
-
// Auth — layout + 4 pages, each a thin wrapper around the registry
|
|
486
|
-
// component that `shadcn add @alepha/auth-*` drops at
|
|
487
|
-
// src/web/components/auth-*.tsx.
|
|
488
|
-
await this.ensureFile(
|
|
489
|
-
root,
|
|
490
|
-
"src/web/components/auth/AuthLayout.tsx",
|
|
491
|
-
saasAuthLayoutTsx(),
|
|
492
|
-
opts.force,
|
|
493
|
-
);
|
|
494
|
-
await this.ensureFile(
|
|
495
|
-
root,
|
|
496
|
-
"src/web/components/auth/Login.tsx",
|
|
497
|
-
saasAuthLoginTsx(),
|
|
498
|
-
opts.force,
|
|
499
|
-
);
|
|
500
|
-
await this.ensureFile(
|
|
501
|
-
root,
|
|
502
|
-
"src/web/components/auth/Register.tsx",
|
|
503
|
-
saasAuthRegisterTsx(),
|
|
504
|
-
opts.force,
|
|
505
|
-
);
|
|
506
|
-
await this.ensureFile(
|
|
507
|
-
root,
|
|
508
|
-
"src/web/components/auth/ResetPassword.tsx",
|
|
509
|
-
saasAuthResetPasswordTsx(),
|
|
510
|
-
opts.force,
|
|
511
|
-
);
|
|
512
|
-
await this.ensureFile(
|
|
513
|
-
root,
|
|
514
|
-
"src/web/components/auth/VerifyEmail.tsx",
|
|
515
|
-
saasAuthVerifyEmailTsx(),
|
|
516
|
-
opts.force,
|
|
517
|
-
);
|
|
518
|
-
|
|
519
|
-
// Admin — AppShell layout + 5 admin-* pages
|
|
520
|
-
await this.ensureFile(
|
|
521
|
-
root,
|
|
522
|
-
"src/web/components/admin/AdminLayout.tsx",
|
|
523
|
-
saasAdminLayoutTsx(),
|
|
524
|
-
opts.force,
|
|
525
|
-
);
|
|
526
|
-
await this.ensureFile(
|
|
527
|
-
root,
|
|
528
|
-
"src/web/components/admin/Users.tsx",
|
|
529
|
-
saasAdminUsersTsx(),
|
|
530
|
-
opts.force,
|
|
531
|
-
);
|
|
532
|
-
await this.ensureFile(
|
|
533
|
-
root,
|
|
534
|
-
"src/web/components/admin/Sessions.tsx",
|
|
535
|
-
saasAdminSessionsTsx(),
|
|
536
|
-
opts.force,
|
|
537
|
-
);
|
|
538
|
-
}
|
|
539
386
|
}
|
|
540
387
|
|
|
541
388
|
// ===========================================
|
|
@@ -588,54 +435,36 @@ export class ProjectScaffolder {
|
|
|
588
435
|
api?: boolean;
|
|
589
436
|
react?: boolean;
|
|
590
437
|
tailwind?: boolean;
|
|
591
|
-
/** boolean toggle, or a string preset id (default `b0` when bare). */
|
|
592
|
-
shadcn?: boolean | string;
|
|
593
|
-
/** boolean toggle, or a string preset id (default `b0` when bare). */
|
|
594
|
-
saas?: boolean | string;
|
|
595
438
|
force?: boolean;
|
|
596
439
|
};
|
|
597
440
|
args?: string;
|
|
598
441
|
}) {
|
|
442
|
+
if (!args) {
|
|
443
|
+
// If the current directory doesn't look like an existing project
|
|
444
|
+
// (no package.json), default to creating a `my-app/` subdirectory
|
|
445
|
+
// rather than scaffolding into a random cwd.
|
|
446
|
+
const hasPackageJson = await this.fs.exists(
|
|
447
|
+
this.fs.join(root, "package.json"),
|
|
448
|
+
);
|
|
449
|
+
if (!hasPackageJson) {
|
|
450
|
+
args = "my-app";
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
599
454
|
if (args) {
|
|
600
455
|
root = this.fs.join(root, args);
|
|
601
456
|
await this.fs.mkdir(root, { force: true });
|
|
602
457
|
}
|
|
603
458
|
|
|
604
|
-
//
|
|
605
|
-
// Capture the preset string (default `b0`), then normalize both flags
|
|
606
|
-
// to plain booleans so the rest of the pipeline keeps its boolean
|
|
607
|
-
// contract with PackageManagerUtils + ensureWebProject etc.
|
|
608
|
-
const shadcnPreset =
|
|
609
|
-
(typeof flags.saas === "string" && flags.saas) ||
|
|
610
|
-
(typeof flags.shadcn === "string" && flags.shadcn) ||
|
|
611
|
-
"b0";
|
|
612
|
-
|
|
613
|
-
// Cast to a narrower view so downstream sees pure booleans.
|
|
614
|
-
const f = flags as Omit<typeof flags, "shadcn" | "saas"> & {
|
|
615
|
-
shadcn?: boolean;
|
|
616
|
-
saas?: boolean;
|
|
617
|
-
};
|
|
618
|
-
f.shadcn = !!flags.shadcn;
|
|
619
|
-
f.saas = !!flags.saas;
|
|
620
|
-
|
|
621
|
-
// Flag cascading:
|
|
622
|
-
// --saas → --shadcn + --api
|
|
623
|
-
// --shadcn → --tailwind
|
|
624
|
-
// --tailwind→ --react
|
|
625
|
-
if (f.saas) {
|
|
626
|
-
f.shadcn = true;
|
|
627
|
-
f.api = true;
|
|
628
|
-
}
|
|
629
|
-
if (f.shadcn) {
|
|
630
|
-
f.tailwind = true;
|
|
631
|
-
}
|
|
459
|
+
// Flag cascading: --tailwind → --react
|
|
632
460
|
if (flags.tailwind) {
|
|
633
461
|
flags.react = true;
|
|
634
462
|
}
|
|
635
463
|
|
|
464
|
+
const f = flags;
|
|
465
|
+
|
|
636
466
|
// When codegen flags are set, target directory must be empty (unless --force)
|
|
637
|
-
const hasCodegenFlags =
|
|
638
|
-
flags.api || flags.react || flags.tailwind || flags.shadcn || flags.saas;
|
|
467
|
+
const hasCodegenFlags = flags.api || flags.react || flags.tailwind;
|
|
639
468
|
if (hasCodegenFlags && !flags.force) {
|
|
640
469
|
const files = await this.fs.ls(root);
|
|
641
470
|
// Allow a directory that only has package.json (common for monorepo packages)
|
|
@@ -664,11 +493,7 @@ export class ProjectScaffolder {
|
|
|
664
493
|
await this.ensureConfig(root, {
|
|
665
494
|
force,
|
|
666
495
|
packageJson: { ...f, isPackage: workspace.isPackage },
|
|
667
|
-
|
|
668
|
-
// unless --shadcn is set: the shadcn CLI reads the local
|
|
669
|
-
// tsconfig.json directly to detect import aliases (it doesn't
|
|
670
|
-
// follow `extends`), so we must ensure one exists in the package.
|
|
671
|
-
tsconfigJson: f.shadcn ? "local" : !workspace.config.tsconfigJson,
|
|
496
|
+
tsconfigJson: !workspace.config.tsconfigJson,
|
|
672
497
|
biomeJson: true,
|
|
673
498
|
editorconfig: !workspace.config.editorconfig,
|
|
674
499
|
agentMd: writeAgentMd,
|
|
@@ -687,14 +512,12 @@ export class ProjectScaffolder {
|
|
|
687
512
|
force,
|
|
688
513
|
});
|
|
689
514
|
if (flags.api) {
|
|
690
|
-
await this.ensureApiProject(root, {
|
|
515
|
+
await this.ensureApiProject(root, { force });
|
|
691
516
|
}
|
|
692
517
|
if (flags.react && !isExpo) {
|
|
693
518
|
await this.ensureWebProject(root, {
|
|
694
519
|
api: !!flags.api,
|
|
695
520
|
tailwind: !!flags.tailwind,
|
|
696
|
-
shadcn: !!flags.shadcn,
|
|
697
|
-
saas: !!flags.saas,
|
|
698
521
|
force,
|
|
699
522
|
});
|
|
700
523
|
}
|
|
@@ -733,63 +556,8 @@ export class ProjectScaffolder {
|
|
|
733
556
|
// worked example for both humans and AI agents.
|
|
734
557
|
await this.ensureTestDir(root);
|
|
735
558
|
|
|
736
|
-
//
|
|
737
|
-
//
|
|
738
|
-
// injects theme tokens into src/main.css, writes src/web/lib/utils.ts,
|
|
739
|
-
// and installs runtime deps (clsx, tailwind-merge, etc.).
|
|
740
|
-
//
|
|
741
|
-
// Flags chosen to keep this fully non-interactive:
|
|
742
|
-
// --yes skip confirmation prompts (default in shadcn v4 but
|
|
743
|
-
// passed explicitly so older versions also behave)
|
|
744
|
-
// --no-monorepo skip the monorepo prompt — we ship a single-app
|
|
745
|
-
// layout; users opt into monorepo via `--monorepo`
|
|
746
|
-
// on the alepha side later
|
|
747
|
-
//
|
|
748
|
-
// We deliberately do NOT pass `--defaults` (would force Next.js +
|
|
749
|
-
// base-nova preset) or `--template` (only applies to scratch projects;
|
|
750
|
-
// ours already has main.server.ts / main.browser.ts).
|
|
751
|
-
// Each PM has a different way to exec a project-local binary.
|
|
752
|
-
const exec = pmExecPrefix(pmName);
|
|
753
|
-
|
|
754
|
-
if (flags.shadcn) {
|
|
755
|
-
// Fully non-interactive shadcn init. The `--preset` arg is what makes
|
|
756
|
-
// this work — without it shadcn falls back to interactive prompts even
|
|
757
|
-
// with --yes/--force. Defaults: vite template + radix base + reinstall
|
|
758
|
-
// (so the components.json we pre-wrote stays canonical).
|
|
759
|
-
await run(
|
|
760
|
-
`${exec} shadcn init --no-monorepo --base radix -t vite --yes --force --reinstall --preset ${escapeShellArg(shadcnPreset)}`,
|
|
761
|
-
{ alias: `running shadcn init (preset ${shadcnPreset})`, root },
|
|
762
|
-
);
|
|
763
|
-
// Re-pin our aliases + alepha registry — `shadcn init --force`
|
|
764
|
-
// overwrites components.json with the template defaults.
|
|
765
|
-
await this.fs.writeFile(
|
|
766
|
-
this.fs.join(root, "components.json"),
|
|
767
|
-
componentsJsonTs(),
|
|
768
|
-
);
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
// SaaS preset: pull in the auth + admin registry components from the
|
|
772
|
-
// public alepha registry (already wired via components.json's
|
|
773
|
-
// `registries: { "@alepha": "https://alepha.dev/r/{name}.json" }`).
|
|
774
|
-
// Each `shadcn add` writes the component into src/web/components/* and
|
|
775
|
-
// pulls its peer primitives + dependencies (sonner, etc.).
|
|
776
|
-
if (flags.saas) {
|
|
777
|
-
// Pull the public SaaS bundle in one shot — it aggregates control,
|
|
778
|
-
// auto-form, alepha-table, use-dialog, app-shell, every auth-*, and
|
|
779
|
-
// every admin-* block. Definition lives at
|
|
780
|
-
// https://alepha.dev/r/saas.json (see @alepha/ui-registry).
|
|
781
|
-
// `--yes --overwrite` is the only combo that works non-interactively
|
|
782
|
-
// when registry items would replace files we pre-wrote (auth-login etc.
|
|
783
|
-
// overlap with shadcn primitives like button/input).
|
|
784
|
-
await run(`${exec} shadcn add @alepha/saas --yes --overwrite`, {
|
|
785
|
-
alias: "adding alepha saas registry bundle",
|
|
786
|
-
root,
|
|
787
|
-
});
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
// Best-effort lint: shadcn-imported registry components occasionally
|
|
791
|
-
// trip biome rules (e.g. noArrayIndexKey on a Fragment loop). The user
|
|
792
|
-
// can fix or silence these later — don't block the whole init.
|
|
559
|
+
// Best-effort lint pass — don't block init if it fails. The user can
|
|
560
|
+
// fix or silence issues later.
|
|
793
561
|
try {
|
|
794
562
|
await run(`${pmName} run lint`, {
|
|
795
563
|
alias: "running linter",
|
|
@@ -881,33 +649,3 @@ export class ProjectScaffolder {
|
|
|
881
649
|
}
|
|
882
650
|
}
|
|
883
651
|
}
|
|
884
|
-
|
|
885
|
-
/**
|
|
886
|
-
* Map a package manager name to the command that runs a project-local binary.
|
|
887
|
-
*
|
|
888
|
-
* - npm: `npx`
|
|
889
|
-
* - yarn: `yarn` (yarn auto-resolves binary names; `yarn shadcn ...` works)
|
|
890
|
-
* - pnpm: `pnpm exec`
|
|
891
|
-
* - bun: `bunx`
|
|
892
|
-
*
|
|
893
|
-
* Used to invoke `shadcn init` / `shadcn add` regardless of the user's PM —
|
|
894
|
-
* `npm shadcn ...` is invalid (it tries to run a script named `shadcn`).
|
|
895
|
-
*/
|
|
896
|
-
/** Quote a value so it survives shell parsing. */
|
|
897
|
-
const escapeShellArg = (value: string): string => {
|
|
898
|
-
if (/^[A-Za-z0-9_./@:-]+$/.test(value)) return value;
|
|
899
|
-
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
900
|
-
};
|
|
901
|
-
|
|
902
|
-
const pmExecPrefix = (pmName: string): string => {
|
|
903
|
-
switch (pmName) {
|
|
904
|
-
case "npm":
|
|
905
|
-
return "npx";
|
|
906
|
-
case "pnpm":
|
|
907
|
-
return "pnpm exec";
|
|
908
|
-
case "bun":
|
|
909
|
-
return "bunx";
|
|
910
|
-
default:
|
|
911
|
-
return "yarn";
|
|
912
|
-
}
|
|
913
|
-
};
|