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
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
$atom,
|
|
3
3
|
$hook,
|
|
4
4
|
$inject,
|
|
5
|
-
$
|
|
5
|
+
$state,
|
|
6
6
|
Alepha,
|
|
7
7
|
AlephaError,
|
|
8
8
|
type TSchema,
|
|
@@ -60,7 +60,7 @@ export const reactPageOptions = $atom({
|
|
|
60
60
|
export class ReactPageProvider {
|
|
61
61
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
62
62
|
protected readonly log = $logger();
|
|
63
|
-
protected readonly options = $
|
|
63
|
+
protected readonly options = $state(reactPageOptions);
|
|
64
64
|
protected readonly alepha = $inject(Alepha);
|
|
65
65
|
protected readonly pages: PageRoute[] = [];
|
|
66
66
|
protected nextIdCursor = 0;
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
$env,
|
|
5
5
|
$hook,
|
|
6
6
|
$inject,
|
|
7
|
-
$
|
|
7
|
+
$state,
|
|
8
8
|
Alepha,
|
|
9
9
|
type Middleware,
|
|
10
10
|
OPTIONS,
|
|
@@ -72,8 +72,8 @@ export class ReactServerProvider {
|
|
|
72
72
|
*/
|
|
73
73
|
protected hasServerLinksProvider = false;
|
|
74
74
|
|
|
75
|
-
protected readonly options = $
|
|
76
|
-
protected readonly pageOptions = $
|
|
75
|
+
protected readonly options = $state(reactServerOptions);
|
|
76
|
+
protected readonly pageOptions = $state(reactPageOptions);
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
79
|
* Configure the React server provider.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { afterAll, beforeAll, describe, expect, it } from "bun:test";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { Alepha } from "alepha";
|
|
4
|
-
import { BunRedisProvider } from "
|
|
5
|
-
import { BunRedisSubscriberProvider } from "
|
|
6
|
-
import { RedisProvider } from "
|
|
7
|
-
import { RedisSubscriberProvider } from "
|
|
4
|
+
import { BunRedisProvider } from "../providers/BunRedisProvider.ts";
|
|
5
|
+
import { BunRedisSubscriberProvider } from "../providers/BunRedisSubscriberProvider.ts";
|
|
6
|
+
import { RedisProvider } from "../providers/RedisProvider.ts";
|
|
7
|
+
import { RedisSubscriberProvider } from "../providers/RedisSubscriberProvider.ts";
|
|
8
8
|
|
|
9
9
|
// -------------------------------------------------------------------------------------------------------------------
|
|
10
10
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { $pipeline, Alepha } from "alepha";
|
|
2
2
|
import { describe, test } from "vitest";
|
|
3
|
-
import { $retry } from "
|
|
3
|
+
import { $retry } from "../primitives/$retry.ts";
|
|
4
4
|
|
|
5
5
|
describe("$retry middleware", () => {
|
|
6
6
|
test("retries handler on failure", async ({ expect }) => {
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
$atom,
|
|
3
3
|
$inject,
|
|
4
4
|
$pipeline,
|
|
5
|
-
$
|
|
5
|
+
$state,
|
|
6
6
|
Alepha,
|
|
7
7
|
type Async,
|
|
8
8
|
createPrimitive,
|
|
@@ -93,7 +93,7 @@ declare module "alepha" {
|
|
|
93
93
|
|
|
94
94
|
export class SchedulerPrimitive extends Primitive<SchedulerPrimitiveOptions> {
|
|
95
95
|
protected readonly log = $logger();
|
|
96
|
-
protected readonly settings = $
|
|
96
|
+
protected readonly settings = $state(schedulerOptions);
|
|
97
97
|
protected readonly alepha = $inject(Alepha);
|
|
98
98
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
99
99
|
protected readonly cronProvider = $inject(CronProvider);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { $pipeline, Alepha } from "alepha";
|
|
2
2
|
import { describe, it } from "vitest";
|
|
3
3
|
import { currentUserAtom } from "../atoms/currentUserAtom.ts";
|
|
4
|
-
import { $secure } from "
|
|
4
|
+
import { $secure } from "../primitives/$secure.browser.ts";
|
|
5
5
|
|
|
6
6
|
describe("$secure (browser)", () => {
|
|
7
7
|
describe("authentication", () => {
|
|
@@ -3,8 +3,8 @@ import { ForbiddenError, UnauthorizedError } from "alepha/server";
|
|
|
3
3
|
import { describe, test } from "vitest";
|
|
4
4
|
import { currentUserAtom } from "../atoms/currentUserAtom.ts";
|
|
5
5
|
import type { UserAccountToken } from "../interfaces/UserAccountToken.ts";
|
|
6
|
+
import { $secure } from "../primitives/$secure.ts";
|
|
6
7
|
import { SecurityProvider } from "../providers/SecurityProvider.ts";
|
|
7
|
-
import { $secure } from "./$secure.ts";
|
|
8
8
|
|
|
9
9
|
// -----------------------------------------------------------------------------------------------------------------
|
|
10
10
|
// Test helpers
|
|
@@ -311,7 +311,7 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
|
|
|
311
311
|
preferred_username: user.username,
|
|
312
312
|
picture: user.picture,
|
|
313
313
|
// our claims
|
|
314
|
-
|
|
314
|
+
organization: user.organization,
|
|
315
315
|
roles: user.roles,
|
|
316
316
|
},
|
|
317
317
|
this.name,
|
|
@@ -37,27 +37,23 @@ export class JwtProvider {
|
|
|
37
37
|
*/
|
|
38
38
|
public setKeyLoader(name: string, secretKeyOrJwks: string | JSONWebKeySet) {
|
|
39
39
|
if (typeof secretKeyOrJwks === "object") {
|
|
40
|
-
this.log.
|
|
41
|
-
`will verify JWTs from key '${name}' with JWKS object (x${secretKeyOrJwks.keys.length})`,
|
|
42
|
-
);
|
|
40
|
+
this.log.debug(`will verify JWTs from key '${name}' with JWKS object`);
|
|
43
41
|
this.keystore.push({
|
|
44
42
|
name,
|
|
45
43
|
keyLoader: createLocalJWKSet(secretKeyOrJwks),
|
|
46
44
|
});
|
|
47
45
|
} else if (this.isSecretKey(secretKeyOrJwks)) {
|
|
48
46
|
const secretKey = this.encoder.encode(secretKeyOrJwks);
|
|
49
|
-
this.log.
|
|
50
|
-
`will verify JWTs from issuer '${name}' with secret key (${secretKey.length} bytes)`,
|
|
51
|
-
);
|
|
47
|
+
this.log.debug(`will verify JWTs from issuer '${name}' with secret key`);
|
|
52
48
|
this.keystore.push({
|
|
53
49
|
name,
|
|
54
50
|
secretKey: secretKeyOrJwks,
|
|
55
51
|
keyLoader: () => Promise.resolve(createSecretKey(secretKey)),
|
|
56
52
|
});
|
|
57
53
|
} else {
|
|
58
|
-
this.log.
|
|
59
|
-
|
|
60
|
-
);
|
|
54
|
+
this.log.debug(`will verify JWTs from issuer '${name}' with JWKS`, {
|
|
55
|
+
url: secretKeyOrJwks,
|
|
56
|
+
});
|
|
61
57
|
this.keystore.push({
|
|
62
58
|
name,
|
|
63
59
|
keyLoader: createRemoteJWKSet(new URL(secretKeyOrJwks)),
|
|
@@ -187,7 +183,7 @@ export interface ExtendedJWTPayload extends JWTPayload {
|
|
|
187
183
|
name?: string;
|
|
188
184
|
roles?: string[];
|
|
189
185
|
email?: string;
|
|
190
|
-
|
|
186
|
+
organization?: string;
|
|
191
187
|
// keycloak specific
|
|
192
188
|
realm_access?: { roles: string[] };
|
|
193
189
|
}
|
|
@@ -295,7 +295,7 @@ export class SecurityProvider {
|
|
|
295
295
|
const username = this.getUsernameFromPayload(payload);
|
|
296
296
|
const picture = this.getPictureFromPayload(payload);
|
|
297
297
|
const name = this.getNameFromPayload(payload);
|
|
298
|
-
const
|
|
298
|
+
const organization = this.getOrganizationFromPayload(payload);
|
|
299
299
|
const rolesFromSystem = this.getRoles(realmName);
|
|
300
300
|
const roles = rolesFromPayload
|
|
301
301
|
.reduce<Role[]>(
|
|
@@ -317,7 +317,7 @@ export class SecurityProvider {
|
|
|
317
317
|
email,
|
|
318
318
|
username,
|
|
319
319
|
picture,
|
|
320
|
-
|
|
320
|
+
organization,
|
|
321
321
|
sessionId,
|
|
322
322
|
};
|
|
323
323
|
}
|
|
@@ -916,20 +916,15 @@ export class SecurityProvider {
|
|
|
916
916
|
return this.UNKNOWN_USER_NAME;
|
|
917
917
|
}
|
|
918
918
|
|
|
919
|
-
public
|
|
919
|
+
public getOrganizationFromPayload(
|
|
920
920
|
payload: Record<string, any>,
|
|
921
|
-
): string
|
|
921
|
+
): string | undefined {
|
|
922
922
|
if (!payload) {
|
|
923
923
|
return;
|
|
924
924
|
}
|
|
925
925
|
|
|
926
|
-
if (payload.organization) {
|
|
927
|
-
|
|
928
|
-
return [payload.organization];
|
|
929
|
-
}
|
|
930
|
-
if (Array.isArray(payload.organization)) {
|
|
931
|
-
return payload.organization;
|
|
932
|
-
}
|
|
926
|
+
if (typeof payload.organization === "string") {
|
|
927
|
+
return payload.organization;
|
|
933
928
|
}
|
|
934
929
|
}
|
|
935
930
|
}
|
|
@@ -39,9 +39,9 @@ export const userAccountInfoSchema = t.object({
|
|
|
39
39
|
|
|
40
40
|
// -------------------------------------------------------------------------------------------------------------------
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
t.
|
|
44
|
-
description: "
|
|
42
|
+
organization: t.optional(
|
|
43
|
+
t.uuid({
|
|
44
|
+
description: "Organization the user belongs to.",
|
|
45
45
|
}),
|
|
46
46
|
),
|
|
47
47
|
|
|
@@ -50,6 +50,7 @@ export class ServerAuthProvider {
|
|
|
50
50
|
realm: t.optional(t.text()),
|
|
51
51
|
codeVerifier: t.optional(t.text({ size: "long" })),
|
|
52
52
|
redirectUri: t.optional(t.text({ size: "long" })),
|
|
53
|
+
loginUri: t.optional(t.text({ size: "long" })),
|
|
53
54
|
state: t.optional(t.text()),
|
|
54
55
|
nonce: t.optional(t.text()),
|
|
55
56
|
}),
|
|
@@ -278,7 +279,11 @@ export class ServerAuthProvider {
|
|
|
278
279
|
redirect_uri: t.optional(t.text({ size: "rich" })),
|
|
279
280
|
}),
|
|
280
281
|
},
|
|
281
|
-
handler: async ({ query, url, reply }) => {
|
|
282
|
+
handler: async ({ query, url, reply, headers }) => {
|
|
283
|
+
const loginUri = headers.referer
|
|
284
|
+
? new URL(headers.referer).pathname + new URL(headers.referer).search
|
|
285
|
+
: undefined;
|
|
286
|
+
|
|
282
287
|
const provider = this.provider({
|
|
283
288
|
provider: query.provider,
|
|
284
289
|
realm: query.realm,
|
|
@@ -318,6 +323,7 @@ export class ServerAuthProvider {
|
|
|
318
323
|
state,
|
|
319
324
|
nonce: parameters.nonce,
|
|
320
325
|
redirectUri: query.redirect_uri ?? "/",
|
|
326
|
+
loginUri,
|
|
321
327
|
provider: query.provider,
|
|
322
328
|
realm: query.realm,
|
|
323
329
|
});
|
|
@@ -345,6 +351,7 @@ export class ServerAuthProvider {
|
|
|
345
351
|
this.authorizationCode.set({
|
|
346
352
|
codeVerifier,
|
|
347
353
|
redirectUri: query.redirect_uri ?? "/",
|
|
354
|
+
loginUri,
|
|
348
355
|
provider: query.provider,
|
|
349
356
|
realm: query.realm,
|
|
350
357
|
});
|
|
@@ -374,6 +381,7 @@ export class ServerAuthProvider {
|
|
|
374
381
|
}
|
|
375
382
|
|
|
376
383
|
const redirectUri = authorizationCode.redirectUri ?? "/";
|
|
384
|
+
const loginUri = authorizationCode.loginUri;
|
|
377
385
|
|
|
378
386
|
const externalTokens = await authorizationCodeGrant(oauth, url, {
|
|
379
387
|
pkceCodeVerifier: authorizationCode.codeVerifier,
|
|
@@ -405,7 +413,21 @@ export class ServerAuthProvider {
|
|
|
405
413
|
|
|
406
414
|
// internal, we need to create our own tokens
|
|
407
415
|
|
|
408
|
-
|
|
416
|
+
let user: UserAccount;
|
|
417
|
+
try {
|
|
418
|
+
user = await provider.user(externalTokens);
|
|
419
|
+
} catch (e) {
|
|
420
|
+
this.log.warn("OAuth2 account linking failed", e);
|
|
421
|
+
const errorTarget = loginUri || redirectUri;
|
|
422
|
+
const errorUrl = new URL(errorTarget, url.origin);
|
|
423
|
+
errorUrl.searchParams.set(
|
|
424
|
+
"error",
|
|
425
|
+
e instanceof BadRequestError ? e.message : "Authentication failed",
|
|
426
|
+
);
|
|
427
|
+
reply.redirect(errorUrl.pathname + errorUrl.search, 302);
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
|
|
409
431
|
const tokens = await issuer.createToken(user);
|
|
410
432
|
|
|
411
433
|
this.setTokens(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { $pipeline, Alepha } from "alepha";
|
|
2
2
|
import { DateTimeProvider } from "alepha/datetime";
|
|
3
3
|
import { describe, test } from "vitest";
|
|
4
|
-
import { $circuit } from "
|
|
4
|
+
import { $circuit } from "../primitives/$circuit.ts";
|
|
5
5
|
|
|
6
6
|
// -----------------------------------------------------------------------------------------------------------------
|
|
7
7
|
// $circuit — core behavior
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { afterEach, describe, expect, test } from "vitest";
|
|
3
|
-
import { NodeHttpServerProvider } from "
|
|
3
|
+
import { NodeHttpServerProvider } from "../providers/NodeHttpServerProvider.ts";
|
|
4
4
|
|
|
5
5
|
describe("NodeHttpServerProvider", () => {
|
|
6
6
|
describe("graceful shutdown", () => {
|
|
@@ -5,7 +5,7 @@ import { $action, HttpError } from "../index.ts";
|
|
|
5
5
|
import {
|
|
6
6
|
bodyParserOptions,
|
|
7
7
|
ServerBodyParserProvider,
|
|
8
|
-
} from "
|
|
8
|
+
} from "../providers/ServerBodyParserProvider.ts";
|
|
9
9
|
|
|
10
10
|
describe("ServerBodyParserProvider", () => {
|
|
11
11
|
it("should parse JSON body", async ({ expect }) => {
|
|
@@ -309,6 +309,36 @@ describe("ServerBodyParserProvider", () => {
|
|
|
309
309
|
expect(result).toBeUndefined();
|
|
310
310
|
});
|
|
311
311
|
|
|
312
|
+
it("should cancel stream reader when body exceeds limit", async ({
|
|
313
|
+
expect,
|
|
314
|
+
}) => {
|
|
315
|
+
const alepha = Alepha.create();
|
|
316
|
+
alepha.store.mut(bodyParserOptions, () => ({
|
|
317
|
+
inflate: true,
|
|
318
|
+
limit: 10,
|
|
319
|
+
}));
|
|
320
|
+
const parser = alepha.inject(ServerBodyParserProvider);
|
|
321
|
+
await alepha.start();
|
|
322
|
+
|
|
323
|
+
let readerCancelled = false;
|
|
324
|
+
|
|
325
|
+
// Stream must stay open (not closed) so cancel() is invocable
|
|
326
|
+
const stream = new ReadableStream({
|
|
327
|
+
pull(controller) {
|
|
328
|
+
controller.enqueue(new TextEncoder().encode("A".repeat(20)));
|
|
329
|
+
},
|
|
330
|
+
cancel() {
|
|
331
|
+
readerCancelled = true;
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
await expect(parser.parseText(stream)).rejects.toThrowError(
|
|
336
|
+
"Request body size limit exceeded",
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
expect(readerCancelled).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
|
|
312
342
|
it("should return undefined for unsupported content-type", async ({
|
|
313
343
|
expect,
|
|
314
344
|
}) => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { $action, $route, AlephaServer, ServerProvider } from "alepha/server";
|
|
3
3
|
import { describe, it } from "vitest";
|
|
4
|
-
import { compressOptions } from "
|
|
4
|
+
import { compressOptions } from "../providers/ServerCompressProvider.ts";
|
|
5
5
|
|
|
6
6
|
class App {
|
|
7
7
|
hello = $action({
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { $action, AlephaServer, ServerProvider } from "alepha/server";
|
|
3
3
|
import { describe, expect, test } from "vitest";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
type HelmetOptions,
|
|
6
|
+
helmetOptions,
|
|
7
|
+
} from "../providers/ServerHelmetProvider.ts";
|
|
5
8
|
|
|
6
9
|
class TestApp {
|
|
7
10
|
ping = $action({ handler: () => "pong" });
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Alepha, t } from "alepha";
|
|
2
2
|
import { $action, AlephaServer, ServerProvider } from "alepha/server";
|
|
3
3
|
import { describe, test } from "vitest";
|
|
4
|
-
import { multipartOptions } from "
|
|
4
|
+
import { multipartOptions } from "../providers/ServerMultipartProvider.ts";
|
|
5
5
|
|
|
6
6
|
class App {
|
|
7
7
|
upload = $action({
|
|
@@ -2,7 +2,7 @@ import { Alepha } from "alepha";
|
|
|
2
2
|
import { describe, it } from "vitest";
|
|
3
3
|
import { CryptoProvider } from "../../../crypto/index.ts";
|
|
4
4
|
import type { ServerRequestData } from "../interfaces/ServerRequest.ts";
|
|
5
|
-
import { ServerRequestParser } from "
|
|
5
|
+
import { ServerRequestParser } from "../services/ServerRequestParser.ts";
|
|
6
6
|
|
|
7
7
|
const createMockRequestData = (
|
|
8
8
|
headers: Record<string, string> = {},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
$atom,
|
|
3
3
|
$inject,
|
|
4
|
-
$
|
|
4
|
+
$state,
|
|
5
5
|
AlephaError,
|
|
6
6
|
type Async,
|
|
7
7
|
createPrimitive,
|
|
@@ -235,7 +235,7 @@ export class ActionPrimitive<
|
|
|
235
235
|
TConfig extends RequestConfigSchema,
|
|
236
236
|
> extends PipelinePrimitive<ActionPrimitiveOptions<TConfig>> {
|
|
237
237
|
protected readonly log = $logger();
|
|
238
|
-
protected readonly settings = $
|
|
238
|
+
protected readonly settings = $state(serverApiOptions);
|
|
239
239
|
protected readonly httpClient = $inject(HttpClient);
|
|
240
240
|
protected readonly serverProvider = $inject(ServerProvider);
|
|
241
241
|
protected readonly serverRouterProvider = $inject(ServerRouterProvider);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
$inject,
|
|
3
|
-
$
|
|
3
|
+
$state,
|
|
4
4
|
AlephaError,
|
|
5
5
|
type Async,
|
|
6
6
|
createPrimitive,
|
|
@@ -392,7 +392,7 @@ export class SsePrimitive<
|
|
|
392
392
|
TConfig extends SseConfigSchema,
|
|
393
393
|
> extends PipelinePrimitive<SsePrimitiveOptions<TConfig>> {
|
|
394
394
|
protected readonly log = $logger();
|
|
395
|
-
protected readonly settings = $
|
|
395
|
+
protected readonly settings = $state(serverApiOptions);
|
|
396
396
|
protected readonly serverProvider = $inject(ServerProvider);
|
|
397
397
|
protected readonly serverRouterProvider = $inject(ServerRouterProvider);
|
|
398
398
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Readable } from "node:stream";
|
|
2
2
|
import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib";
|
|
3
3
|
import type { TSchema } from "alepha";
|
|
4
|
-
import { $atom, $hook, $inject, $
|
|
4
|
+
import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
|
|
5
5
|
import { $logger } from "alepha/logger";
|
|
6
6
|
import { HttpError } from "../errors/HttpError.ts";
|
|
7
7
|
|
|
@@ -42,7 +42,7 @@ declare module "alepha" {
|
|
|
42
42
|
export class ServerBodyParserProvider {
|
|
43
43
|
protected readonly alepha = $inject(Alepha);
|
|
44
44
|
protected readonly log = $logger();
|
|
45
|
-
protected readonly options = $
|
|
45
|
+
protected readonly options = $state(bodyParserOptions);
|
|
46
46
|
|
|
47
47
|
public readonly onRequest = $hook({
|
|
48
48
|
on: "server:onRequest",
|
|
@@ -99,14 +99,20 @@ export class ServerBodyParserProvider {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
if (route.schema?.body) {
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
102
|
+
const contentType = request.headers["content-type"] ?? "";
|
|
103
|
+
|
|
104
|
+
// Skip body size check for multipart requests — ServerMultipartProvider
|
|
105
|
+
// handles its own limits (multipartOptions.limit / fileLimit).
|
|
106
|
+
if (!contentType.startsWith("multipart/")) {
|
|
107
|
+
const contentLength = request.headers["content-length"];
|
|
108
|
+
if (contentLength) {
|
|
109
|
+
const size = Number.parseInt(contentLength, 10);
|
|
110
|
+
if (!Number.isNaN(size) && size > this.options.limit) {
|
|
111
|
+
throw new HttpError({
|
|
112
|
+
status: 413,
|
|
113
|
+
message: "Request body size limit exceeded",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
110
116
|
}
|
|
111
117
|
}
|
|
112
118
|
|
|
@@ -260,12 +266,14 @@ export class ServerBodyParserProvider {
|
|
|
260
266
|
let totalLength = 0;
|
|
261
267
|
|
|
262
268
|
const reader = stream.getReader();
|
|
269
|
+
let needsCancel = true;
|
|
263
270
|
|
|
264
271
|
try {
|
|
265
272
|
while (true) {
|
|
266
273
|
const { done, value } = await reader.read();
|
|
267
274
|
|
|
268
275
|
if (done) {
|
|
276
|
+
needsCancel = false;
|
|
269
277
|
break;
|
|
270
278
|
}
|
|
271
279
|
|
|
@@ -277,8 +285,6 @@ export class ServerBodyParserProvider {
|
|
|
277
285
|
`Body size limit exceeded: ${totalLength} > ${limit}`,
|
|
278
286
|
);
|
|
279
287
|
|
|
280
|
-
await reader.cancel();
|
|
281
|
-
|
|
282
288
|
throw new HttpError({
|
|
283
289
|
status: 413,
|
|
284
290
|
message: "Request body size limit exceeded",
|
|
@@ -303,6 +309,9 @@ export class ServerBodyParserProvider {
|
|
|
303
309
|
combined.byteLength,
|
|
304
310
|
);
|
|
305
311
|
} finally {
|
|
312
|
+
if (needsCancel) {
|
|
313
|
+
await reader.cancel().catch(() => {});
|
|
314
|
+
}
|
|
306
315
|
reader.releaseLock();
|
|
307
316
|
}
|
|
308
317
|
}
|
|
@@ -2,7 +2,7 @@ import { Readable, type Transform } from "node:stream";
|
|
|
2
2
|
import { ReadableStream } from "node:stream/web";
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import * as zlib from "node:zlib";
|
|
5
|
-
import { $atom, $hook, $inject, $
|
|
5
|
+
import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
|
|
6
6
|
import type { ServerResponse } from "alepha/server";
|
|
7
7
|
|
|
8
8
|
const gzip = promisify(zlib.gzip);
|
|
@@ -77,7 +77,7 @@ export class ServerCompressProvider {
|
|
|
77
77
|
};
|
|
78
78
|
|
|
79
79
|
protected readonly alepha = $inject(Alepha);
|
|
80
|
-
protected readonly options = $
|
|
80
|
+
protected readonly options = $state(compressOptions);
|
|
81
81
|
|
|
82
82
|
public readonly onResponse = $hook({
|
|
83
83
|
on: "server:onResponse",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $hook, $inject, $
|
|
1
|
+
import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
|
|
2
2
|
|
|
3
3
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
4
4
|
|
|
@@ -102,7 +102,7 @@ export class ServerHelmetProvider {
|
|
|
102
102
|
/**
|
|
103
103
|
* The configuration options loaded from the atom.
|
|
104
104
|
*/
|
|
105
|
-
protected readonly options = $
|
|
105
|
+
protected readonly options = $state(helmetOptions);
|
|
106
106
|
|
|
107
107
|
protected defaultCspDirectives(): CspDirectives {
|
|
108
108
|
return {
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
$atom,
|
|
4
4
|
$hook,
|
|
5
5
|
$inject,
|
|
6
|
-
$
|
|
6
|
+
$state,
|
|
7
7
|
Alepha,
|
|
8
8
|
type FileLike,
|
|
9
9
|
isTypeFile,
|
|
@@ -57,7 +57,7 @@ declare module "alepha" {
|
|
|
57
57
|
export class ServerMultipartProvider {
|
|
58
58
|
protected readonly alepha = $inject(Alepha);
|
|
59
59
|
protected readonly log = $logger();
|
|
60
|
-
protected readonly options = $
|
|
60
|
+
protected readonly options = $state(multipartOptions);
|
|
61
61
|
|
|
62
62
|
public readonly onRequest = $hook({
|
|
63
63
|
on: "server:onRequest",
|
|
@@ -310,11 +310,7 @@ export class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
|
|
|
310
310
|
if (responseKind === "text") {
|
|
311
311
|
reply.body = String(reply.body);
|
|
312
312
|
// Detect HTML responses (starts with <!DOCTYPE html>)
|
|
313
|
-
if (
|
|
314
|
-
reply.body.length > 15 &&
|
|
315
|
-
reply.body.charCodeAt(0) === 60 &&
|
|
316
|
-
reply.body.startsWith("<!DOCTYPE html>")
|
|
317
|
-
) {
|
|
313
|
+
if (reply.body.startsWith("<!DOCTYPE html>")) {
|
|
318
314
|
headers["content-type"] ??= "text/html; charset=UTF-8";
|
|
319
315
|
} else {
|
|
320
316
|
headers["content-type"] ??= "text/plain";
|
|
@@ -2,7 +2,7 @@ import { $pipeline, Alepha } from "alepha";
|
|
|
2
2
|
import { AlephaServer } from "alepha/server";
|
|
3
3
|
import { describe, test } from "vitest";
|
|
4
4
|
import { AlephaServerCors } from "../index.ts";
|
|
5
|
-
import { $cors } from "
|
|
5
|
+
import { $cors } from "../primitives/$cors.ts";
|
|
6
6
|
|
|
7
7
|
// -----------------------------------------------------------------------------------------------------------------
|
|
8
8
|
// $cors — core behavior
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $hook, $inject, $
|
|
1
|
+
import { $atom, $hook, $inject, $state, type Static, t } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import { ServerRouterProvider } from "alepha/server";
|
|
4
4
|
|
|
@@ -69,7 +69,7 @@ export interface CorsRegistration extends Partial<CorsOptions> {
|
|
|
69
69
|
export class ServerCorsProvider {
|
|
70
70
|
protected readonly log = $logger();
|
|
71
71
|
protected readonly serverRouterProvider = $inject(ServerRouterProvider);
|
|
72
|
-
protected readonly globalOptions = $
|
|
72
|
+
protected readonly globalOptions = $state(corsOptions);
|
|
73
73
|
|
|
74
74
|
/**
|
|
75
75
|
* Registered CORS configurations with their path patterns
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { describe, it } from "vitest";
|
|
3
|
-
import { BatchCollector } from "
|
|
3
|
+
import { BatchCollector } from "../services/BatchCollector.ts";
|
|
4
4
|
|
|
5
5
|
describe("BatchCollector", () => {
|
|
6
6
|
it("should deduplicate identical entries", ({ expect }) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $inject, $
|
|
1
|
+
import { $inject, $state, Alepha, AlephaError, type Async, t } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import type { SecureOptions } from "alepha/security";
|
|
4
4
|
import {
|
|
@@ -50,7 +50,7 @@ export class LinkProvider {
|
|
|
50
50
|
// Browser-only: batch collector for coalescing multiple calls
|
|
51
51
|
protected batchCollector?: BatchCollector;
|
|
52
52
|
|
|
53
|
-
protected readonly options = $
|
|
53
|
+
protected readonly options = $state(linkOptionsAtom);
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Get applicative links registered on the server.
|