alepha 0.19.1 → 0.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +6 -9
- package/dist/api/audits/index.d.ts +378 -346
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +216 -184
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +534 -502
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +13 -7
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +202 -202
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/notifications/index.d.ts +152 -152
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/organizations/index.browser.js +48 -0
- package/dist/api/organizations/index.browser.js.map +1 -0
- package/dist/api/organizations/index.d.ts +516 -0
- package/dist/api/organizations/index.d.ts.map +1 -0
- package/dist/api/organizations/index.js +202 -0
- package/dist/api/organizations/index.js.map +1 -0
- package/dist/api/parameters/index.d.ts +391 -358
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +5 -1
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -5
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +986 -931
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +160 -112
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +137 -137
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -2
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +6 -6
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/billing/index.d.ts +1048 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +713 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/bin/index.js +0 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +10 -10
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +2 -2
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +9 -9
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +2 -2
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +2 -2
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/redis/index.d.ts +6 -6
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +6 -18
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +5 -6
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +11811 -323
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +324 -98
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +50 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +174 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +438 -542
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +46 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +201 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +388 -0
- package/dist/cli/vendor/index.js.map +1 -0
- package/dist/command/index.d.ts +18 -18
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2 -2
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +4 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +10 -10
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +8 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +8 -4
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.d.ts +7 -7
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/datetime/index.d.ts +4 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/email/brevo/index.d.ts +4 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/core/index.d.ts +15 -11
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +12 -35
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.d.ts +12 -12
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +7 -4
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +4 -8
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +55 -889
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -13
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +2 -2
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +4 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +16 -15
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +6 -3
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +11 -11
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +11 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +78 -72
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +103 -69
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +80 -70
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +19 -17
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/queue/core/index.d.ts +14 -14
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +2 -2
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +2 -2
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +4 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.d.ts +9 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +5 -4
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/head/index.d.ts +4 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/i18n/index.d.ts +9 -9
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/intro/index.d.ts +2 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +4 -5
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +215 -215
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +6 -7
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +2 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +2 -4
- package/dist/react/testing/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +4 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +13 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -2
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +47 -47
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -12
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +170 -169
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -2
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +76 -76
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +23 -17
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -13
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +2 -2
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +9 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +2 -2
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -66
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +7 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +5 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +12 -12
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +2 -2
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +5 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +7 -7
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +11 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +9 -15
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +4 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/topic/core/index.d.ts +6 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +7 -7
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/dist/websocket/index.d.ts +36 -36
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +2 -2
- package/dist/websocket/index.js.map +1 -1
- package/package.json +37 -15
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +13 -9
- package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
- package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
- package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
- package/src/api/organizations/entities/organizations.ts +20 -0
- package/src/api/organizations/index.browser.ts +10 -0
- package/src/api/organizations/index.ts +31 -0
- package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
- package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
- package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
- package/src/api/organizations/services/OrganizationService.ts +75 -0
- package/src/api/parameters/services/ParameterProvider.ts +6 -1
- package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -4
- package/src/api/users/primitives/$realm.ts +6 -4
- package/src/api/users/providers/RealmProvider.ts +1 -1
- package/src/api/users/services/RegistrationService.ts +1 -1
- package/src/api/users/services/SessionService.ts +92 -5
- package/src/api/users/services/UserService.ts +1 -1
- package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
- package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
- package/src/billing/__tests__/BillingService.spec.ts +136 -0
- package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
- package/src/billing/controllers/AdminBillingController.ts +149 -0
- package/src/billing/controllers/BillingController.ts +108 -0
- package/src/billing/entities/paymentIntents.ts +34 -0
- package/src/billing/entities/paymentMethods.ts +24 -0
- package/src/billing/entities/refunds.ts +22 -0
- package/src/billing/errors/BillingError.ts +5 -0
- package/src/billing/index.ts +76 -0
- package/src/billing/providers/BillingProvider.ts +79 -0
- package/src/billing/providers/MemoryBillingProvider.ts +139 -0
- package/src/billing/schemas/intentSchemas.ts +60 -0
- package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
- package/src/billing/schemas/refundSchemas.ts +6 -0
- package/src/billing/services/BillingService.ts +325 -0
- package/src/billing/services/PaymentMethodService.ts +82 -0
- package/src/bin/index.ts +0 -2
- package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
- package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
- package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
- package/src/cache/core/primitives/$cache.ts +2 -2
- package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
- package/src/cli/config/defineConfig.ts +17 -26
- package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
- package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
- package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
- package/src/cli/core/atoms/devOptions.ts +0 -5
- package/src/cli/core/commands/build.ts +2 -2
- package/src/cli/core/commands/dev.ts +165 -30
- package/src/cli/core/commands/gen/changelog.ts +2 -2
- package/src/cli/core/commands/init.ts +2 -7
- package/src/cli/core/commands/verify.ts +0 -1
- package/src/cli/core/providers/AppEntryProvider.ts +2 -2
- package/src/cli/core/providers/ViteDevServerProvider.ts +99 -69
- package/src/cli/core/services/PackageManagerUtils.ts +8 -1
- package/src/cli/core/services/ProjectScaffolder.ts +23 -23
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- package/src/cli/core/templates/agentMd.ts +14 -5
- package/src/cli/core/templates/alephaConfigTs.ts +0 -6
- package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
- package/src/cli/core/templates/webAppRouterTs.ts +85 -2
- package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
- package/src/cli/devtools/index.ts +214 -0
- package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
- package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
- package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
- package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
- package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
- package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
- package/src/cli/platform/atoms/platformOptions.ts +2 -10
- package/src/cli/platform/commands/SecretsCommand.ts +2 -2
- package/src/cli/platform/commands/platform.ts +2 -11
- package/src/cli/platform/index.ts +55 -11
- package/src/cli/platform/services/PlatformInspector.ts +2 -2
- package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
- package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
- package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
- package/src/cli/vendor/commands/VendorCommand.ts +204 -0
- package/src/cli/vendor/index.ts +60 -0
- package/src/cli/vendor/services/VendorService.ts +338 -0
- package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
- package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
- package/src/command/providers/CliProvider.ts +2 -2
- package/src/core/Alepha.ts +10 -0
- package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
- package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
- package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
- package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
- package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
- package/src/core/index.shared.ts +1 -1
- package/src/core/primitives/{$use.ts → $state.ts} +4 -4
- package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
- package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
- package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
- package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
- package/src/email/core/providers/LocalEmailProvider.ts +13 -51
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
- package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
- package/src/lock/core/primitives/$lock.ts +2 -2
- package/src/logger/index.ts +16 -5
- package/src/mcp/transports/SseMcpTransport.ts +2 -2
- package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
- package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
- package/src/orm/__tests__/organization-tests.ts +200 -0
- package/src/orm/__tests__/organization.spec.ts +103 -0
- package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
- package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
- package/src/orm/core/index.shared.ts +1 -0
- package/src/orm/core/primitives/$entity.ts +31 -0
- package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
- package/src/orm/core/providers/DrizzleKitProvider.ts +57 -106
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
- package/src/orm/core/services/ModelBuilder.ts +11 -0
- package/src/orm/core/services/QueryManager.ts +16 -2
- package/src/orm/core/services/Repository.ts +70 -10
- package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
- package/src/queue/core/providers/WorkerProvider.ts +2 -2
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
- package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
- package/src/react/core/hooks/useAction.ts +7 -6
- package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
- package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
- package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
- package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
- package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
- package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
- package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
- package/src/react/router/providers/ReactPageProvider.ts +2 -2
- package/src/react/router/providers/ReactServerProvider.ts +3 -3
- package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
- package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
- package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
- package/src/scheduler/primitives/$scheduler.ts +2 -2
- package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
- package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
- package/src/security/primitives/$issuer.ts +1 -1
- package/src/security/providers/JwtProvider.ts +6 -10
- package/src/security/providers/SecurityProvider.ts +6 -11
- package/src/security/schemas/userAccountInfoSchema.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
- package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
- package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
- package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
- package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
- package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +2 -2
- package/src/server/core/primitives/$sse.ts +2 -2
- package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
- package/src/server/core/providers/ServerCompressProvider.ts +2 -2
- package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
- package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
- package/src/server/core/providers/ServerRouterProvider.ts +1 -5
- package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
- package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
- package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
- package/src/server/links/providers/LinkProvider.ts +2 -2
- package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
- package/src/server/links/providers/ServerLinksProvider.ts +2 -2
- package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
- package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
- package/src/sms/providers/LocalSmsProvider.ts +13 -24
- package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
- package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
- package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
- package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
- package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
- package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
- package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
- package/src/cli/platform/services/DockerSshService.ts +0 -61
- /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
- /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
- /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
- /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
- /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
- /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
- /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
- /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
- /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
- /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
- /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
- /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
- /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
- /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
- /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
- /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
- /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
- /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
- /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
- /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
- /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
- /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
- /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
- /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
- /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
- /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
- /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
- /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
- /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
- /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
- /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
- /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
- /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
- /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
- /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
- /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
- /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
- /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
- /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
- /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
- /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
- /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
- /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
- /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
- /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
- /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
- /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
- /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
- /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
- /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
- /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
- /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
- /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
package/dist/cli/core/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createRequire } from "node:module";
|
|
2
|
-
import { $atom, $hook, $inject, $module, $
|
|
2
|
+
import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, __alephaRef, t } from "alepha";
|
|
3
3
|
import { $command, CliProvider, EnvUtils, Runner } from "alepha/command";
|
|
4
4
|
import { $logger, ConsoleColorProvider } from "alepha/logger";
|
|
5
5
|
import { FileSystemProvider, ShellProvider } from "alepha/system";
|
|
6
6
|
import { createHash } from "node:crypto";
|
|
7
7
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
-
import { readFile } from "node:fs/promises";
|
|
8
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
9
9
|
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
10
10
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
11
11
|
import { analyzer } from "vite-bundle-analyzer";
|
|
@@ -13,7 +13,7 @@ import { KV_DEFAULT_BINDING } from "alepha/cache";
|
|
|
13
13
|
import { QUEUE_DEFAULT_BINDING } from "alepha/queue";
|
|
14
14
|
import { promisify } from "node:util";
|
|
15
15
|
import { brotliCompress, gzip } from "node:zlib";
|
|
16
|
-
import { exec } from "node:child_process";
|
|
16
|
+
import { exec, spawn } from "node:child_process";
|
|
17
17
|
import { ServerSwaggerProvider } from "alepha/server/swagger";
|
|
18
18
|
//#region ../../src/cli/core/atoms/appEntryOptions.ts
|
|
19
19
|
const appEntryOptions = $atom({
|
|
@@ -89,10 +89,7 @@ const buildOptions = $atom({
|
|
|
89
89
|
const devOptions = $atom({
|
|
90
90
|
name: "alepha.cli.dev.options",
|
|
91
91
|
description: "Dev configuration options",
|
|
92
|
-
schema: t.object({
|
|
93
|
-
noDevtools: t.optional(t.boolean({ default: false })),
|
|
94
|
-
noViteReactPlugin: t.optional(t.boolean({ default: false }))
|
|
95
|
-
}),
|
|
92
|
+
schema: t.object({ noViteReactPlugin: t.optional(t.boolean({ default: false })) }),
|
|
96
93
|
default: {}
|
|
97
94
|
});
|
|
98
95
|
//#endregion
|
|
@@ -104,7 +101,7 @@ const devOptions = $atom({
|
|
|
104
101
|
*/
|
|
105
102
|
var AppEntryProvider = class {
|
|
106
103
|
fs = $inject(FileSystemProvider);
|
|
107
|
-
options = $
|
|
104
|
+
options = $state(appEntryOptions);
|
|
108
105
|
serverEntries = [
|
|
109
106
|
"main.server.ts",
|
|
110
107
|
"main.server.tsx",
|
|
@@ -589,13 +586,13 @@ var AlephaCliUtils = class {
|
|
|
589
586
|
//#endregion
|
|
590
587
|
//#region ../../package.json
|
|
591
588
|
var devDependencies = {
|
|
592
|
-
"@biomejs/biome": "^2.4.
|
|
593
|
-
"@electric-sql/pglite": "^0.4.
|
|
594
|
-
"@faker-js/faker": "^10.
|
|
589
|
+
"@biomejs/biome": "^2.4.10",
|
|
590
|
+
"@electric-sql/pglite": "^0.4.3",
|
|
591
|
+
"@faker-js/faker": "^10.4.0",
|
|
595
592
|
"@testing-library/dom": "^10.4.1",
|
|
596
593
|
"@testing-library/react": "^16.3.2",
|
|
597
594
|
"@types/bun": "^1.3.11",
|
|
598
|
-
"@types/node": "^25.5.
|
|
595
|
+
"@types/node": "^25.5.2",
|
|
599
596
|
"@types/nodemailer": "^7.0.11",
|
|
600
597
|
"@types/react": "^19.2.14",
|
|
601
598
|
"@types/react-dom": "^19.2.3",
|
|
@@ -603,15 +600,16 @@ var devDependencies = {
|
|
|
603
600
|
"cron-schedule": "^6.0.0",
|
|
604
601
|
"drizzle-kit": "^0.31.10",
|
|
605
602
|
"jose": "^6.2.2",
|
|
606
|
-
"jsdom": "^29.0.
|
|
607
|
-
"nodemailer": "^8.0.
|
|
603
|
+
"jsdom": "^29.0.1",
|
|
604
|
+
"nodemailer": "^8.0.4",
|
|
608
605
|
"openid-client": "^6.8.2",
|
|
609
606
|
"prom-client": "^15.1.3",
|
|
610
607
|
"react": "^19.2.4",
|
|
611
608
|
"react-dom": "^19.2.4",
|
|
612
609
|
"swagger-ui-dist": "^5.32.1",
|
|
613
|
-
"tsdown": "^0.21.
|
|
614
|
-
"
|
|
610
|
+
"tsdown": "^0.21.7",
|
|
611
|
+
"vite": "^8.0.3",
|
|
612
|
+
"vitest": "^4.1.2"
|
|
615
613
|
};
|
|
616
614
|
const version = JSON.parse(readFileSync(new URL("../../../package.json", import.meta.url), "utf-8")).version;
|
|
617
615
|
//#endregion
|
|
@@ -864,7 +862,8 @@ var PackageManagerUtils = class {
|
|
|
864
862
|
generatePackageJsonContent(modes) {
|
|
865
863
|
const alephaDeps = devDependencies;
|
|
866
864
|
const dependencies = { alepha: `^${version}` };
|
|
867
|
-
const devDependencies$1 = {
|
|
865
|
+
const devDependencies$1 = { vite: alephaDeps.vite };
|
|
866
|
+
if (!(modes.react && !modes.ui)) devDependencies$1["drizzle-kit"] = alephaDeps["drizzle-kit"];
|
|
868
867
|
if (!modes.isPackage) {
|
|
869
868
|
devDependencies$1["@biomejs/biome"] = alephaDeps["@biomejs/biome"];
|
|
870
869
|
if (modes.test) devDependencies$1.vitest = alephaDeps.vitest;
|
|
@@ -907,8 +906,12 @@ var PackageManagerUtils = class {
|
|
|
907
906
|
const cliAssets = { logo: join(join(fileURLToPath(import.meta.url), "../../../.."), "assets/logo.svg") };
|
|
908
907
|
//#endregion
|
|
909
908
|
//#region ../../src/cli/core/templates/agentMd.ts
|
|
910
|
-
const agentMd = (
|
|
911
|
-
|
|
909
|
+
const agentMd = (options) => {
|
|
910
|
+
const header = options.type === "claude" ? `# CLAUDE.md` : `# AGENTS.md`;
|
|
911
|
+
const docs = [`- Framework source: \`node_modules/alepha/src/\``];
|
|
912
|
+
if (options.ui) docs.push(`- UI components: \`node_modules/@alepha/ui/src/\``);
|
|
913
|
+
docs.push(`- Docs: https://alepha.dev/llms.txt`);
|
|
914
|
+
return `${header}
|
|
912
915
|
|
|
913
916
|
This is an **Alepha** project.
|
|
914
917
|
|
|
@@ -930,9 +933,7 @@ alepha build # Build
|
|
|
930
933
|
|
|
931
934
|
## Documentation
|
|
932
935
|
|
|
933
|
-
|
|
934
|
-
- UI components: \`node_modules/@alepha/ui/src/\`
|
|
935
|
-
- Docs: https://alepha.dev/llms.txt
|
|
936
|
+
${docs.join("\n")}
|
|
936
937
|
`.trim();
|
|
937
938
|
};
|
|
938
939
|
//#endregion
|
|
@@ -956,12 +957,6 @@ export default defineConfig({
|
|
|
956
957
|
// runtime: "node",
|
|
957
958
|
// },
|
|
958
959
|
//
|
|
959
|
-
// platform: {
|
|
960
|
-
// environments: {
|
|
961
|
-
// production: { adapter: "cloudflare" },
|
|
962
|
-
// },
|
|
963
|
-
// },
|
|
964
|
-
//
|
|
965
960
|
// env: {
|
|
966
961
|
// VITE_BUILD_DATE: new Date().toISOString(),
|
|
967
962
|
// VITE_VERSION: pkg.version,
|
|
@@ -1275,13 +1270,45 @@ export default defineConfig({
|
|
|
1275
1270
|
`;
|
|
1276
1271
|
};
|
|
1277
1272
|
//#endregion
|
|
1273
|
+
//#region ../../src/cli/core/templates/webAdminDashboardTsx.ts
|
|
1274
|
+
const webAdminDashboardTsx = () => {
|
|
1275
|
+
return `import { Flex, Text } from "@alepha/ui";
|
|
1276
|
+
|
|
1277
|
+
const AdminDashboard = () => {
|
|
1278
|
+
return (
|
|
1279
|
+
<Flex direction="column" align="center" justify="center" mih="60vh" gap="md">
|
|
1280
|
+
<Text size="xl" fw={600}>
|
|
1281
|
+
Admin Panel
|
|
1282
|
+
</Text>
|
|
1283
|
+
<Text c="dimmed">Welcome to the admin panel.</Text>
|
|
1284
|
+
</Flex>
|
|
1285
|
+
);
|
|
1286
|
+
};
|
|
1287
|
+
|
|
1288
|
+
export default AdminDashboard;
|
|
1289
|
+
`;
|
|
1290
|
+
};
|
|
1291
|
+
//#endregion
|
|
1278
1292
|
//#region ../../src/cli/core/templates/webAppRouterTs.ts
|
|
1279
1293
|
const webAppRouterTs = (options) => {
|
|
1280
1294
|
const imports = [];
|
|
1281
1295
|
const classMembers = [];
|
|
1282
1296
|
if (options.ui) imports.push("import { $ui } from \"@alepha/ui\";");
|
|
1283
1297
|
if (options.auth) imports.push("import { $uiAuth } from \"@alepha/ui/auth\";");
|
|
1284
|
-
if (options.admin)
|
|
1298
|
+
if (options.admin) {
|
|
1299
|
+
imports.push("import { $uiAdmin } from \"@alepha/ui/admin\";");
|
|
1300
|
+
imports.push("import { AdminUserRouter } from \"@alepha/ui/admin-users\";");
|
|
1301
|
+
imports.push("import { AdminSessionRouter } from \"@alepha/ui/admin-sessions\";");
|
|
1302
|
+
imports.push("import { AdminAuditRouter } from \"@alepha/ui/admin-audits\";");
|
|
1303
|
+
imports.push("import { AdminFileRouter } from \"@alepha/ui/admin-files\";");
|
|
1304
|
+
imports.push("import { AdminParameterRouter } from \"@alepha/ui/admin-parameters\";");
|
|
1305
|
+
imports.push("import { AdminJobRouter } from \"@alepha/ui/admin-jobs\";");
|
|
1306
|
+
imports.push("import { AdminApiKeyRouter } from \"@alepha/ui/admin-keys\";");
|
|
1307
|
+
imports.push("import { AdminNotificationRouter } from \"@alepha/ui/admin-notifications\";");
|
|
1308
|
+
imports.push("import { AdminBillingRouter } from \"@alepha/ui/admin-billing\";");
|
|
1309
|
+
imports.push("import { $inject } from \"alepha\";");
|
|
1310
|
+
imports.push("import { IconLayoutDashboard, IconLockPassword, IconCreditCard } from \"@tabler/icons-react\";");
|
|
1311
|
+
}
|
|
1285
1312
|
imports.push("import { $page } from \"alepha/react/router\";");
|
|
1286
1313
|
if (options.api) {
|
|
1287
1314
|
imports.push("import { $client } from \"alepha/server/links\";");
|
|
@@ -1291,7 +1318,69 @@ const webAppRouterTs = (options) => {
|
|
|
1291
1318
|
if (options.ui) {
|
|
1292
1319
|
classMembers.push(" ui = $ui();");
|
|
1293
1320
|
if (options.auth) classMembers.push(" uiAuth = $uiAuth();");
|
|
1294
|
-
if (options.admin) classMembers.push(
|
|
1321
|
+
if (options.admin) classMembers.push(` // ── Admin Domain Routers ──────────────────────────
|
|
1322
|
+
protected users = $inject(AdminUserRouter);
|
|
1323
|
+
protected sessions = $inject(AdminSessionRouter);
|
|
1324
|
+
protected audits = $inject(AdminAuditRouter);
|
|
1325
|
+
protected files = $inject(AdminFileRouter);
|
|
1326
|
+
protected parameters = $inject(AdminParameterRouter);
|
|
1327
|
+
protected jobs = $inject(AdminJobRouter);
|
|
1328
|
+
protected apiKeys = $inject(AdminApiKeyRouter);
|
|
1329
|
+
protected notifications = $inject(AdminNotificationRouter);
|
|
1330
|
+
protected billing = $inject(AdminBillingRouter);
|
|
1331
|
+
|
|
1332
|
+
// ── Admin Panel ─────────────────────────────────
|
|
1333
|
+
admin = $uiAdmin({
|
|
1334
|
+
pages: [
|
|
1335
|
+
this.users.adminUsers,
|
|
1336
|
+
this.sessions.adminSessions,
|
|
1337
|
+
this.audits.adminAudits,
|
|
1338
|
+
this.files.adminFiles,
|
|
1339
|
+
this.parameters.adminParameters,
|
|
1340
|
+
this.jobs.adminJobs,
|
|
1341
|
+
this.apiKeys.adminApiKeys,
|
|
1342
|
+
this.notifications.adminNotifications,
|
|
1343
|
+
this.billing.adminBilling,
|
|
1344
|
+
],
|
|
1345
|
+
sidebarItems: [
|
|
1346
|
+
{
|
|
1347
|
+
label: "Security",
|
|
1348
|
+
children: [
|
|
1349
|
+
{ label: "Identity", icon: IconLockPassword, children: [
|
|
1350
|
+
this.users.adminUsers,
|
|
1351
|
+
this.sessions.adminSessions,
|
|
1352
|
+
this.apiKeys.adminApiKeys,
|
|
1353
|
+
]},
|
|
1354
|
+
this.audits.adminAudits,
|
|
1355
|
+
],
|
|
1356
|
+
},
|
|
1357
|
+
{
|
|
1358
|
+
label: "System",
|
|
1359
|
+
children: [
|
|
1360
|
+
this.files.adminFiles,
|
|
1361
|
+
this.jobs.adminJobs,
|
|
1362
|
+
this.notifications.adminNotifications,
|
|
1363
|
+
this.parameters.adminParameters,
|
|
1364
|
+
],
|
|
1365
|
+
},
|
|
1366
|
+
{
|
|
1367
|
+
label: "Commerce",
|
|
1368
|
+
icon: IconCreditCard,
|
|
1369
|
+
children: [
|
|
1370
|
+
this.billing.adminBilling,
|
|
1371
|
+
],
|
|
1372
|
+
},
|
|
1373
|
+
],
|
|
1374
|
+
});
|
|
1375
|
+
|
|
1376
|
+
// ── Admin Dashboard ─────────────────────────────
|
|
1377
|
+
adminDashboard = $page({
|
|
1378
|
+
parent: this.admin.adminLayout,
|
|
1379
|
+
path: "/",
|
|
1380
|
+
label: "Dashboard",
|
|
1381
|
+
icon: IconLayoutDashboard,
|
|
1382
|
+
lazy: () => import("./components/AdminDashboard.tsx"),
|
|
1383
|
+
});`);
|
|
1295
1384
|
classMembers.push(` layout = $page({
|
|
1296
1385
|
parent: this.ui.root,
|
|
1297
1386
|
children: () => [this.home],
|
|
@@ -1432,7 +1521,7 @@ var ProjectScaffolder = class {
|
|
|
1432
1521
|
}
|
|
1433
1522
|
async ensureAgentMd(root, options) {
|
|
1434
1523
|
const filename = options.type === "claude" ? "CLAUDE.md" : "AGENTS.md";
|
|
1435
|
-
await this.ensureFile(root, filename, agentMd(options
|
|
1524
|
+
await this.ensureFile(root, filename, agentMd(options), options.force);
|
|
1436
1525
|
}
|
|
1437
1526
|
/**
|
|
1438
1527
|
* Ensure alepha.config.ts exists with documented options.
|
|
@@ -1497,6 +1586,7 @@ var ProjectScaffolder = class {
|
|
|
1497
1586
|
admin: opts.admin
|
|
1498
1587
|
}), opts.force);
|
|
1499
1588
|
await this.ensureFile(root, "src/web/components/Home.tsx", webHomeComponentTsx({ api: opts.api }), opts.force);
|
|
1589
|
+
if (opts.admin) await this.ensureFile(root, "src/web/components/AdminDashboard.tsx", webAdminDashboardTsx(), opts.force);
|
|
1500
1590
|
await this.ensureFile(root, "src/main.browser.ts", mainBrowserTs(), opts.force);
|
|
1501
1591
|
}
|
|
1502
1592
|
/**
|
|
@@ -1520,21 +1610,20 @@ var ProjectScaffolder = class {
|
|
|
1520
1610
|
root = this.fs.join(root, args);
|
|
1521
1611
|
await this.fs.mkdir(root, { force: true });
|
|
1522
1612
|
}
|
|
1523
|
-
if (flags.
|
|
1524
|
-
if (flags.auth) {
|
|
1613
|
+
if (flags.saas) {
|
|
1525
1614
|
flags.api = true;
|
|
1526
1615
|
flags.ui = true;
|
|
1527
1616
|
}
|
|
1528
1617
|
if (flags.ui) flags.react = true;
|
|
1529
1618
|
if (flags.tailwind) flags.react = true;
|
|
1530
|
-
if ((flags.
|
|
1619
|
+
if ((flags.saas || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
|
|
1531
1620
|
if ((await this.fs.ls(root)).filter((f) => f !== "package.json").length > 0) throw new AlephaError(`Target directory is not empty (${root}). Use --force to overwrite existing files.`);
|
|
1532
1621
|
}
|
|
1533
1622
|
const workspace = await this.pm.getWorkspaceContext(root);
|
|
1534
1623
|
let agentType = false;
|
|
1535
1624
|
if (!workspace.isPackage) agentType = await this.utils.isInstalledAsync("claude") ? "claude" : "agents";
|
|
1536
1625
|
const isExpo = await this.pm.hasExpo(root);
|
|
1537
|
-
const adminEmail = flags.
|
|
1626
|
+
const adminEmail = flags.saas ? await this.utils.getGitEmail() : void 0;
|
|
1538
1627
|
const force = !!flags.force;
|
|
1539
1628
|
await run({
|
|
1540
1629
|
name: "ensuring configuration files",
|
|
@@ -1548,7 +1637,10 @@ var ProjectScaffolder = class {
|
|
|
1548
1637
|
tsconfigJson: !workspace.config.tsconfigJson,
|
|
1549
1638
|
biomeJson: true,
|
|
1550
1639
|
editorconfig: !workspace.config.editorconfig,
|
|
1551
|
-
agentMd: agentType ? {
|
|
1640
|
+
agentMd: agentType ? {
|
|
1641
|
+
type: agentType,
|
|
1642
|
+
ui: !!flags.ui
|
|
1643
|
+
} : false
|
|
1552
1644
|
});
|
|
1553
1645
|
await this.ensureAlephaConfig(root, { force });
|
|
1554
1646
|
await this.ensureMainServerTs(root, {
|
|
@@ -1557,15 +1649,15 @@ var ProjectScaffolder = class {
|
|
|
1557
1649
|
force
|
|
1558
1650
|
});
|
|
1559
1651
|
if (flags.api) await this.ensureApiProject(root, {
|
|
1560
|
-
auth: !!flags.
|
|
1652
|
+
auth: !!flags.saas,
|
|
1561
1653
|
adminEmail,
|
|
1562
1654
|
force
|
|
1563
1655
|
});
|
|
1564
1656
|
if (flags.react && !isExpo) await this.ensureWebProject(root, {
|
|
1565
1657
|
api: !!flags.api,
|
|
1566
1658
|
ui: !!flags.ui,
|
|
1567
|
-
auth: !!flags.
|
|
1568
|
-
admin: !!flags.
|
|
1659
|
+
auth: !!flags.saas,
|
|
1660
|
+
admin: !!flags.saas,
|
|
1569
1661
|
tailwind: !!flags.tailwind,
|
|
1570
1662
|
force
|
|
1571
1663
|
});
|
|
@@ -1722,6 +1814,12 @@ var BuildClientTask = class extends BuildTask {
|
|
|
1722
1814
|
mode: "production",
|
|
1723
1815
|
logLevel: opts.silent ? "silent" : void 0,
|
|
1724
1816
|
define: { "process.env.NODE_ENV": "\"production\"" },
|
|
1817
|
+
resolve: { dedupe: [
|
|
1818
|
+
"react",
|
|
1819
|
+
"react-dom",
|
|
1820
|
+
"react/jsx-runtime",
|
|
1821
|
+
"react/jsx-dev-runtime"
|
|
1822
|
+
] },
|
|
1725
1823
|
publicDir: "public",
|
|
1726
1824
|
build: {
|
|
1727
1825
|
outDir: opts.dist,
|
|
@@ -2193,6 +2291,7 @@ var BuildServerTask = class extends BuildTask {
|
|
|
2193
2291
|
name: "build server",
|
|
2194
2292
|
handler: async () => {
|
|
2195
2293
|
await this.buildServer({
|
|
2294
|
+
root: ctx.root,
|
|
2196
2295
|
entry: ctx.entry.server,
|
|
2197
2296
|
distDir,
|
|
2198
2297
|
clientDir: clientBuilt ? publicDir : void 0,
|
|
@@ -2225,6 +2324,12 @@ var BuildServerTask = class extends BuildTask {
|
|
|
2225
2324
|
mode: "production",
|
|
2226
2325
|
logLevel: opts.silent ? "silent" : void 0,
|
|
2227
2326
|
define: { "process.env.NODE_ENV": "\"production\"" },
|
|
2327
|
+
resolve: { dedupe: [
|
|
2328
|
+
"react",
|
|
2329
|
+
"react-dom",
|
|
2330
|
+
"react/jsx-runtime",
|
|
2331
|
+
"react/jsx-dev-runtime"
|
|
2332
|
+
] },
|
|
2228
2333
|
publicDir: false,
|
|
2229
2334
|
ssr: {
|
|
2230
2335
|
noExternal: true,
|
|
@@ -2267,7 +2372,7 @@ var BuildServerTask = class extends BuildTask {
|
|
|
2267
2372
|
const externals = [];
|
|
2268
2373
|
if (Array.isArray(resolvedConfig?.ssr?.external)) externals.push(...resolvedConfig.ssr.external);
|
|
2269
2374
|
await this.generateExternals(opts.distDir, externals);
|
|
2270
|
-
const entryFile = this.extractEntryFromBundle(opts.entry, result);
|
|
2375
|
+
const entryFile = this.extractEntryFromBundle(opts.root, opts.entry, result);
|
|
2271
2376
|
let manifest = "";
|
|
2272
2377
|
let manifestData;
|
|
2273
2378
|
if (opts.clientDir) {
|
|
@@ -2340,8 +2445,8 @@ var BuildServerTask = class extends BuildTask {
|
|
|
2340
2445
|
};
|
|
2341
2446
|
return stripped;
|
|
2342
2447
|
}
|
|
2343
|
-
extractEntryFromBundle(entry, result) {
|
|
2344
|
-
const entryFilePath = isAbsolute(entry) ? entry : join(
|
|
2448
|
+
extractEntryFromBundle(root, entry, result) {
|
|
2449
|
+
const entryFilePath = isAbsolute(entry) ? entry : join(root, entry);
|
|
2345
2450
|
const normalizedEntryPath = entryFilePath.replace(/\\/g, "/");
|
|
2346
2451
|
const entryFile = (Array.isArray(result) ? result[0] : result).output.find((it) => "facadeModuleId" in it && it.facadeModuleId === normalizedEntryPath)?.fileName;
|
|
2347
2452
|
if (!entryFile) throw new AlephaError(`Could not find the entry file "${entryFilePath}" in the build output. Please check your entry file and try again.`);
|
|
@@ -2608,7 +2713,7 @@ var BuildCommand = class {
|
|
|
2608
2713
|
scaffolder = $inject(ProjectScaffolder);
|
|
2609
2714
|
boot = $inject(AppEntryProvider);
|
|
2610
2715
|
viteBuildProvider = $inject(ViteBuildProvider);
|
|
2611
|
-
options = $
|
|
2716
|
+
options = $state(buildOptions);
|
|
2612
2717
|
/**
|
|
2613
2718
|
* Build pipeline: tasks run sequentially in this order.
|
|
2614
2719
|
* Each task self-guards (checks target, hasClient, etc.).
|
|
@@ -3114,7 +3219,30 @@ var ViteDevServerProvider = class {
|
|
|
3114
3219
|
isReloading = false;
|
|
3115
3220
|
needsBrowserReload = false;
|
|
3116
3221
|
currentReloadPromise = null;
|
|
3117
|
-
|
|
3222
|
+
extraVitePlugins = [];
|
|
3223
|
+
alephaLoadedHooks = [];
|
|
3224
|
+
/**
|
|
3225
|
+
* Register an additional Vite plugin.
|
|
3226
|
+
* Must be called before init().
|
|
3227
|
+
*/
|
|
3228
|
+
addVitePlugin(plugin) {
|
|
3229
|
+
this.extraVitePlugins.push(plugin);
|
|
3230
|
+
}
|
|
3231
|
+
/**
|
|
3232
|
+
* Register a hook called after Alepha is loaded/reloaded.
|
|
3233
|
+
*/
|
|
3234
|
+
onAlephaLoaded(hook) {
|
|
3235
|
+
this.alephaLoadedHooks.push(hook);
|
|
3236
|
+
}
|
|
3237
|
+
/**
|
|
3238
|
+
* Trigger a full Alepha reload programmatically.
|
|
3239
|
+
*/
|
|
3240
|
+
reload() {
|
|
3241
|
+
this.hasError = true;
|
|
3242
|
+
this.needsBrowserReload = true;
|
|
3243
|
+
this.changedFiles.add("__manual_reload__");
|
|
3244
|
+
this.scheduleReload();
|
|
3245
|
+
}
|
|
3118
3246
|
/**
|
|
3119
3247
|
* Initialize the dev server and load Alepha.
|
|
3120
3248
|
*/
|
|
@@ -3138,10 +3266,8 @@ var ViteDevServerProvider = class {
|
|
|
3138
3266
|
try {
|
|
3139
3267
|
await this.alepha?.start();
|
|
3140
3268
|
await this.listen();
|
|
3141
|
-
|
|
3142
|
-
this.
|
|
3143
|
-
this.server.bindCLIShortcuts({ print: true });
|
|
3144
|
-
console.log("");
|
|
3269
|
+
const url = `http://localhost:${this.server.config.server.port ?? 5173}/`;
|
|
3270
|
+
(this.alepha?.log ?? this.log).info(`Listening on ${this.colors.set("CYAN", url)}`);
|
|
3145
3271
|
} catch (err) {
|
|
3146
3272
|
this.hasError = true;
|
|
3147
3273
|
this.currentError = err instanceof Error ? err : new Error(String(err));
|
|
@@ -3173,6 +3299,7 @@ var ViteDevServerProvider = class {
|
|
|
3173
3299
|
if (viteReact && !this.options.noViteReactPlugin) plugins.push(viteReact());
|
|
3174
3300
|
plugins.push(this.viteUtils.createTsconfigPathsPlugin());
|
|
3175
3301
|
plugins.push(this.viteUtils.createSsrPreloadPlugin());
|
|
3302
|
+
plugins.push(...this.extraVitePlugins);
|
|
3176
3303
|
plugins.push(this.createAlephaPlugin());
|
|
3177
3304
|
let port;
|
|
3178
3305
|
if (process.env.SERVER_PORT) port = Number(process.env.SERVER_PORT);
|
|
@@ -3184,6 +3311,12 @@ var ViteDevServerProvider = class {
|
|
|
3184
3311
|
root: this.options.root,
|
|
3185
3312
|
plugins,
|
|
3186
3313
|
appType: "custom",
|
|
3314
|
+
resolve: { dedupe: [
|
|
3315
|
+
"react",
|
|
3316
|
+
"react-dom",
|
|
3317
|
+
"react/jsx-runtime",
|
|
3318
|
+
"react/jsx-dev-runtime"
|
|
3319
|
+
] },
|
|
3187
3320
|
server: { port },
|
|
3188
3321
|
optimizeDeps: { entries: [...this.options.entry.browser ? [this.options.entry.browser] : []] }
|
|
3189
3322
|
});
|
|
@@ -3230,31 +3363,23 @@ var ViteDevServerProvider = class {
|
|
|
3230
3363
|
return {
|
|
3231
3364
|
name: "alepha",
|
|
3232
3365
|
configureServer: (server) => {
|
|
3233
|
-
if (!this.options.noDevtools) try {
|
|
3234
|
-
this.devtoolsAssetsPath = join(dirname(createRequire(import.meta.url).resolve("@alepha/devtools/package.json")), "assets/ui");
|
|
3235
|
-
process.env.VITE_ALEPHA_DEVTOOLS = "true";
|
|
3236
|
-
} catch {
|
|
3237
|
-
this.log.debug("@alepha/devtools not installed, skipping devtools");
|
|
3238
|
-
}
|
|
3239
|
-
if (this.devtoolsAssetsPath) {
|
|
3240
|
-
const assetsPath = this.devtoolsAssetsPath;
|
|
3241
|
-
server.middlewares.use(async (req, res, next) => {
|
|
3242
|
-
if (!(req.url || "/").startsWith("/__devtools") || !req.headers.accept?.includes("text/html")) return next();
|
|
3243
|
-
const indexPath = join(assetsPath, "index.html");
|
|
3244
|
-
try {
|
|
3245
|
-
let html = await readFile(indexPath, "utf-8");
|
|
3246
|
-
html = html.replace("<head>", `<head><script type="module" src="/@vite/client"><\/script>`);
|
|
3247
|
-
res.writeHead(200, { "content-type": "text/html" });
|
|
3248
|
-
res.end(html);
|
|
3249
|
-
} catch (err) {
|
|
3250
|
-
this.log.error("Failed to serve devtools UI", err);
|
|
3251
|
-
next();
|
|
3252
|
-
}
|
|
3253
|
-
});
|
|
3254
|
-
}
|
|
3255
3366
|
server.hot.on("connection", () => {
|
|
3256
3367
|
if (this.currentError) setTimeout(() => this.sendErrorOverlay(this.currentError), 50);
|
|
3257
3368
|
});
|
|
3369
|
+
server.middlewares.use(async (req, res, next) => {
|
|
3370
|
+
if (req.url !== "/__alepha/ready") {
|
|
3371
|
+
next();
|
|
3372
|
+
return;
|
|
3373
|
+
}
|
|
3374
|
+
if (this.currentReloadPromise) await this.currentReloadPromise;
|
|
3375
|
+
if (this.alepha?.isReady()) {
|
|
3376
|
+
res.writeHead(200, { "content-type": "text/plain" });
|
|
3377
|
+
res.end("ok");
|
|
3378
|
+
} else {
|
|
3379
|
+
res.writeHead(503, { "content-type": "text/plain" });
|
|
3380
|
+
res.end("not ready");
|
|
3381
|
+
}
|
|
3382
|
+
});
|
|
3258
3383
|
return () => {
|
|
3259
3384
|
server.middlewares.use(async (req, res, next) => {
|
|
3260
3385
|
const url = req.url || "/";
|
|
@@ -3262,6 +3387,7 @@ var ViteDevServerProvider = class {
|
|
|
3262
3387
|
next();
|
|
3263
3388
|
return;
|
|
3264
3389
|
}
|
|
3390
|
+
if (this.currentReloadPromise) await this.currentReloadPromise;
|
|
3265
3391
|
if (this.hasError && !this.alepha) {
|
|
3266
3392
|
if (req.headers.accept?.includes("text/html")) {
|
|
3267
3393
|
res.writeHead(200, { "content-type": "text/html" });
|
|
@@ -3310,9 +3436,10 @@ var ViteDevServerProvider = class {
|
|
|
3310
3436
|
}
|
|
3311
3437
|
/**
|
|
3312
3438
|
* Send full browser reload via Vite's HMR.
|
|
3439
|
+
* Uses a custom event so the client can poll for readiness before reloading.
|
|
3313
3440
|
*/
|
|
3314
3441
|
sendBrowserReload() {
|
|
3315
|
-
this.server.hot.send(
|
|
3442
|
+
this.server.hot.send("alepha:reload", {});
|
|
3316
3443
|
}
|
|
3317
3444
|
/**
|
|
3318
3445
|
* Send error to Vite's native error overlay.
|
|
@@ -3401,12 +3528,7 @@ var ViteDevServerProvider = class {
|
|
|
3401
3528
|
}
|
|
3402
3529
|
const alepha = this.getLoadedAlepha();
|
|
3403
3530
|
alepha.store.set("alepha.vite.server", this.server);
|
|
3404
|
-
|
|
3405
|
-
const mod = await this.server.ssrLoadModule("@alepha/devtools");
|
|
3406
|
-
alepha.with(mod.AlephaDevtools);
|
|
3407
|
-
} catch (err) {
|
|
3408
|
-
this.log.warn("Failed to load @alepha/devtools", err);
|
|
3409
|
-
}
|
|
3531
|
+
for (const hook of this.alephaLoadedHooks) await hook(alepha, this.server);
|
|
3410
3532
|
this.alepha = alepha;
|
|
3411
3533
|
await this.setupAlepha();
|
|
3412
3534
|
this.hasError = false;
|
|
@@ -3459,6 +3581,20 @@ var ViteDevServerProvider = class {
|
|
|
3459
3581
|
const preamble = (await this.server.transformIndexHtml("/", "<!DOCTYPE html><html><head></head><body></body></html>")).match(/<head>([\s\S]*?)<\/head>/i)?.[1]?.trim() ?? "";
|
|
3460
3582
|
const tags = [];
|
|
3461
3583
|
if (preamble) tags.push(preamble);
|
|
3584
|
+
tags.push(`<script type="module">
|
|
3585
|
+
if (import.meta.hot) {
|
|
3586
|
+
import.meta.hot.on("alepha:reload", async () => {
|
|
3587
|
+
for (let i = 0; i < 50; i++) {
|
|
3588
|
+
try {
|
|
3589
|
+
const res = await fetch("/__alepha/ready");
|
|
3590
|
+
if (res.ok) { window.location.reload(); return; }
|
|
3591
|
+
} catch {}
|
|
3592
|
+
await new Promise(r => setTimeout(r, 200));
|
|
3593
|
+
}
|
|
3594
|
+
window.location.reload();
|
|
3595
|
+
});
|
|
3596
|
+
}
|
|
3597
|
+
<\/script>`);
|
|
3462
3598
|
if (style) tags.push(`<link rel="stylesheet" href="/${style}">`);
|
|
3463
3599
|
if (browser) tags.push(`<script type="module" src="/${browser}"><\/script>`);
|
|
3464
3600
|
return tags.join("\n");
|
|
@@ -3563,10 +3699,12 @@ var ViteDevServerProvider = class {
|
|
|
3563
3699
|
/**
|
|
3564
3700
|
* Log a formatted error with stack trace.
|
|
3565
3701
|
*/
|
|
3566
|
-
logError(title,
|
|
3702
|
+
logError(title, err) {
|
|
3567
3703
|
const c = this.colors;
|
|
3568
3704
|
console.log();
|
|
3569
3705
|
console.log(c.set("RED", ` ✗ ${title}`));
|
|
3706
|
+
this.logErrorWithCause(err);
|
|
3707
|
+
console.log();
|
|
3570
3708
|
console.log(c.set("GREY_DARK", " Waiting for file changes to retry..."));
|
|
3571
3709
|
console.log();
|
|
3572
3710
|
}
|
|
@@ -3601,32 +3739,122 @@ var DevCommand = class {
|
|
|
3601
3739
|
alepha = $inject(Alepha);
|
|
3602
3740
|
viteDevServer = $inject(ViteDevServerProvider);
|
|
3603
3741
|
boot = $inject(AppEntryProvider);
|
|
3604
|
-
options = $
|
|
3742
|
+
options = $state(devOptions);
|
|
3605
3743
|
/**
|
|
3606
3744
|
* Will run the project in watch mode.
|
|
3745
|
+
*
|
|
3746
|
+
* When run from a workspace root (with apps/ directory), spawns all apps in parallel.
|
|
3747
|
+
* When run from an app directory, starts a single Vite dev server.
|
|
3607
3748
|
*/
|
|
3608
3749
|
dev = $command({
|
|
3609
3750
|
name: "dev",
|
|
3610
3751
|
mode: true,
|
|
3611
3752
|
description: "Run the project in development mode",
|
|
3612
|
-
flags: t.object({
|
|
3613
|
-
"no-devtools": t.optional(t.boolean({ description: "Disable devtools" })),
|
|
3614
|
-
"no-vite-react-plugin": t.optional(t.boolean({ description: "Disable Vite React plugin" }))
|
|
3615
|
-
}),
|
|
3753
|
+
flags: t.object({ only: t.optional(t.string({ description: "Run only specific apps (comma-separated: --only api,companion)" })) }),
|
|
3616
3754
|
handler: async ({ root, flags }) => {
|
|
3617
|
-
await this.
|
|
3618
|
-
|
|
3619
|
-
this.
|
|
3620
|
-
const options = this.options;
|
|
3621
|
-
await this.viteDevServer.init({
|
|
3622
|
-
root,
|
|
3623
|
-
entry,
|
|
3624
|
-
noDevtools: flags["no-devtools"] ?? options.noDevtools ?? false,
|
|
3625
|
-
noViteReactPlugin: flags["no-vite-react-plugin"] ?? options.noViteReactPlugin ?? false
|
|
3626
|
-
});
|
|
3627
|
-
await this.viteDevServer.start();
|
|
3755
|
+
const apps = await this.discoverApps(root);
|
|
3756
|
+
if (apps.length > 0) await this.runMultiple(root, apps, flags);
|
|
3757
|
+
else await this.runSingle(root);
|
|
3628
3758
|
}
|
|
3629
3759
|
});
|
|
3760
|
+
/**
|
|
3761
|
+
* Discover apps in the workspace root.
|
|
3762
|
+
*
|
|
3763
|
+
* Looks for directories under apps/ that contain a package.json.
|
|
3764
|
+
* Supports scoped directories (e.g., apps/@passeo/api).
|
|
3765
|
+
* Returns empty array if not in a workspace root.
|
|
3766
|
+
*/
|
|
3767
|
+
async discoverApps(root) {
|
|
3768
|
+
const appsDir = join(root, "apps");
|
|
3769
|
+
if (!await this.fs.exists(appsDir)) return [];
|
|
3770
|
+
const entries = await readdir(appsDir);
|
|
3771
|
+
const apps = [];
|
|
3772
|
+
for (const entry of entries) {
|
|
3773
|
+
const appPath = join(appsDir, entry);
|
|
3774
|
+
const pkgPath = join(appPath, "package.json");
|
|
3775
|
+
if (await this.fs.exists(pkgPath)) {
|
|
3776
|
+
apps.push({
|
|
3777
|
+
name: entry,
|
|
3778
|
+
path: appPath
|
|
3779
|
+
});
|
|
3780
|
+
continue;
|
|
3781
|
+
}
|
|
3782
|
+
if ((await stat(appPath).catch(() => null))?.isDirectory()) {
|
|
3783
|
+
const scopedEntries = await readdir(appPath);
|
|
3784
|
+
for (const scopedEntry of scopedEntries) {
|
|
3785
|
+
const scopedPath = join(appPath, scopedEntry);
|
|
3786
|
+
const scopedPkgPath = join(scopedPath, "package.json");
|
|
3787
|
+
if (await this.fs.exists(scopedPkgPath)) apps.push({
|
|
3788
|
+
name: scopedEntry,
|
|
3789
|
+
path: scopedPath
|
|
3790
|
+
});
|
|
3791
|
+
}
|
|
3792
|
+
}
|
|
3793
|
+
}
|
|
3794
|
+
return apps;
|
|
3795
|
+
}
|
|
3796
|
+
/**
|
|
3797
|
+
* Run a single app (existing behavior).
|
|
3798
|
+
*/
|
|
3799
|
+
async runSingle(root) {
|
|
3800
|
+
await this.scaffolder.ensureConfig(root, { tsconfigJson: true });
|
|
3801
|
+
const entry = await this.boot.getAppEntry(root);
|
|
3802
|
+
this.log.debug("Entry file found", { entry });
|
|
3803
|
+
const options = this.options;
|
|
3804
|
+
await this.viteDevServer.init({
|
|
3805
|
+
root,
|
|
3806
|
+
entry,
|
|
3807
|
+
noViteReactPlugin: options.noViteReactPlugin ?? false
|
|
3808
|
+
});
|
|
3809
|
+
await this.viteDevServer.start();
|
|
3810
|
+
}
|
|
3811
|
+
/**
|
|
3812
|
+
* Run multiple apps in parallel with colored prefixed output.
|
|
3813
|
+
*/
|
|
3814
|
+
async runMultiple(_root, apps, flags) {
|
|
3815
|
+
const only = flags.only;
|
|
3816
|
+
if (only) {
|
|
3817
|
+
const filter = only.split(",").map((s) => s.trim().toLowerCase());
|
|
3818
|
+
apps = apps.filter((app) => filter.includes(app.name.toLowerCase()));
|
|
3819
|
+
}
|
|
3820
|
+
if (apps.length === 0) {
|
|
3821
|
+
this.log.warn("No apps found to run");
|
|
3822
|
+
return;
|
|
3823
|
+
}
|
|
3824
|
+
this.log.debug(`Starting ${apps.length} apps: ${apps.map((a) => a.name).join(", ")}`);
|
|
3825
|
+
const basePort = 5173;
|
|
3826
|
+
const processes = apps.map((app, i) => this.spawnApp(app, basePort + i));
|
|
3827
|
+
const cleanup = () => {
|
|
3828
|
+
for (const proc of processes) proc.kill("SIGTERM");
|
|
3829
|
+
};
|
|
3830
|
+
process.once("SIGINT", cleanup);
|
|
3831
|
+
process.once("SIGTERM", cleanup);
|
|
3832
|
+
await Promise.allSettled(processes.map((proc) => new Promise((resolve) => {
|
|
3833
|
+
proc.on("exit", () => resolve());
|
|
3834
|
+
})));
|
|
3835
|
+
}
|
|
3836
|
+
/**
|
|
3837
|
+
* Spawn a single app process with inherited stdio.
|
|
3838
|
+
*
|
|
3839
|
+
* Each child process gets APP_NAME set, so the Alepha logger
|
|
3840
|
+
* handles prefixing automatically.
|
|
3841
|
+
*/
|
|
3842
|
+
spawnApp(app, port) {
|
|
3843
|
+
const proc = spawn("yarn", ["alepha", "dev"], {
|
|
3844
|
+
cwd: app.path,
|
|
3845
|
+
stdio: "inherit",
|
|
3846
|
+
env: {
|
|
3847
|
+
...process.env,
|
|
3848
|
+
APP_NAME: app.name.toUpperCase(),
|
|
3849
|
+
SERVER_PORT: String(port),
|
|
3850
|
+
FORCE_COLOR: "1"
|
|
3851
|
+
}
|
|
3852
|
+
});
|
|
3853
|
+
proc.on("exit", (code) => {
|
|
3854
|
+
if (code !== 0 && code !== null) this.log.error(`${app.name} exited with code ${code}`);
|
|
3855
|
+
});
|
|
3856
|
+
return proc;
|
|
3857
|
+
}
|
|
3630
3858
|
};
|
|
3631
3859
|
//#endregion
|
|
3632
3860
|
//#region ../../src/cli/core/atoms/changelogOptions.ts
|
|
@@ -3737,7 +3965,7 @@ var ChangelogCommand = class {
|
|
|
3737
3965
|
log = $logger();
|
|
3738
3966
|
git = $inject(GitProvider);
|
|
3739
3967
|
parser = $inject(GitMessageParser);
|
|
3740
|
-
config = $
|
|
3968
|
+
config = $state(changelogOptions);
|
|
3741
3969
|
/**
|
|
3742
3970
|
* Format a single commit line.
|
|
3743
3971
|
* Example: `- **cli**: add new command (\`abc1234\`)`
|
|
@@ -3967,8 +4195,7 @@ var InitCommand = class {
|
|
|
3967
4195
|
description: "Include React dependencies and web module (src/web/)"
|
|
3968
4196
|
})),
|
|
3969
4197
|
ui: t.optional(t.boolean({ description: "Include @alepha/ui (components, auth portal, admin portal)" })),
|
|
3970
|
-
|
|
3971
|
-
admin: t.optional(t.boolean({ description: "Include admin portal ($uiAdmin). Implies --auth" })),
|
|
4198
|
+
saas: t.optional(t.boolean({ description: "Include authentication, admin portal, API, UI, and React. Everything you need for a SaaS app." })),
|
|
3972
4199
|
tailwind: t.optional(t.boolean({ description: "Include Tailwind CSS with Vite plugin. Implies --react" })),
|
|
3973
4200
|
test: t.optional(t.boolean({ description: "Include Vitest and create test directory" })),
|
|
3974
4201
|
force: t.optional(t.boolean({
|
|
@@ -4109,7 +4336,6 @@ var VerifyCommand = class {
|
|
|
4109
4336
|
description: "Verify the Alepha project",
|
|
4110
4337
|
handler: async ({ root, run }) => {
|
|
4111
4338
|
await run("alepha clean");
|
|
4112
|
-
await run("alepha format");
|
|
4113
4339
|
await run("alepha lint");
|
|
4114
4340
|
await run("alepha typecheck");
|
|
4115
4341
|
if ((await this.pm.readPackageJson(root)).devDependencies?.vitest) await run("alepha test");
|