alepha 0.19.1 → 0.19.2
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 +528 -496
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +3 -3
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +207 -207
- 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 +978 -913
- 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 +135 -135
- 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 +12 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +4 -0
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +183 -140
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +279 -89
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +45 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +170 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +383 -492
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +42 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +196 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +384 -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 +4 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +4 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +4 -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 +5 -2
- 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 +53 -16
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +95 -51
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +55 -14
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +18 -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 +36 -14
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +3 -3
- 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 +20 -0
- 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 +54 -66
- package/src/cli/core/services/PackageManagerUtils.ts +8 -3
- package/src/cli/core/services/ProjectScaffolder.ts +18 -18
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- 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 +194 -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 +34 -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 +43 -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/{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 +10 -4
- 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 +1 -1
- 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/tsconfig.base.json +1 -0
- 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
|
type Static,
|
|
8
8
|
type TSchema,
|
|
@@ -61,7 +61,7 @@ declare module "alepha" {
|
|
|
61
61
|
|
|
62
62
|
export class WorkerProvider {
|
|
63
63
|
protected readonly log = $logger();
|
|
64
|
-
protected readonly options = $
|
|
64
|
+
protected readonly options = $state(queueWorkerOptions);
|
|
65
65
|
protected readonly alepha = $inject(Alepha);
|
|
66
66
|
protected readonly queueProvider = $inject(QueueProvider);
|
|
67
67
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $inject, $
|
|
1
|
+
import { $atom, $inject, $state, type Static, t } from "alepha";
|
|
2
2
|
import type { QueueProvider } from "alepha/queue";
|
|
3
3
|
import { RedisProvider } from "alepha/redis";
|
|
4
4
|
|
|
@@ -31,7 +31,7 @@ declare module "alepha" {
|
|
|
31
31
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
32
32
|
|
|
33
33
|
export class RedisQueueProvider implements QueueProvider {
|
|
34
|
-
protected readonly options = $
|
|
34
|
+
protected readonly options = $state(redisQueueOptions);
|
|
35
35
|
protected readonly redisProvider: RedisProvider = $inject(RedisProvider);
|
|
36
36
|
|
|
37
37
|
public prefix(queue: string): string {
|
|
@@ -4,7 +4,7 @@ import { AlephaDateTime } from "alepha/datetime";
|
|
|
4
4
|
import type { ReactNode } from "react";
|
|
5
5
|
import { describe, test, vi } from "vitest";
|
|
6
6
|
import { AlephaContext } from "../contexts/AlephaContext.ts";
|
|
7
|
-
import { useAction } from "
|
|
7
|
+
import { useAction } from "../hooks/useAction.ts";
|
|
8
8
|
|
|
9
9
|
describe("useAction", () => {
|
|
10
10
|
test("should handle successful action", async ({ expect }) => {
|
|
@@ -134,8 +134,10 @@ export function useAction<Args extends any[], Result = void>(
|
|
|
134
134
|
const isMountedRef = useRef(true);
|
|
135
135
|
const intervalRef = useRef<Interval | undefined>(undefined);
|
|
136
136
|
|
|
137
|
-
//
|
|
137
|
+
// Track mount state — must set true in body for React StrictMode double-invoke
|
|
138
138
|
useEffect(() => {
|
|
139
|
+
isMountedRef.current = true;
|
|
140
|
+
|
|
139
141
|
return () => {
|
|
140
142
|
isMountedRef.current = false;
|
|
141
143
|
|
|
@@ -179,12 +181,11 @@ export function useAction<Args extends any[], Result = void>(
|
|
|
179
181
|
setLoading(true);
|
|
180
182
|
setError(undefined);
|
|
181
183
|
|
|
182
|
-
await alepha.events.emit("react:action:begin", {
|
|
183
|
-
type: "custom",
|
|
184
|
-
id: options.id,
|
|
185
|
-
});
|
|
186
|
-
|
|
187
184
|
try {
|
|
185
|
+
await alepha.events.emit("react:action:begin", {
|
|
186
|
+
type: "custom",
|
|
187
|
+
id: options.id,
|
|
188
|
+
});
|
|
188
189
|
// Pass abort signal as last argument to handler
|
|
189
190
|
const result = await options.handler(...args, {
|
|
190
191
|
signal: abortController.signal,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
3
3
|
import type { Head } from "../interfaces/Head.ts";
|
|
4
|
-
import { BrowserHeadProvider } from "
|
|
4
|
+
import { BrowserHeadProvider } from "../providers/BrowserHeadProvider.ts";
|
|
5
5
|
|
|
6
6
|
describe("BrowserHeadProvider", () => {
|
|
7
7
|
let alepha: Alepha;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { describe, it } from "vitest";
|
|
3
|
-
import { SeoExpander } from "
|
|
3
|
+
import { SeoExpander } from "../helpers/SeoExpander.ts";
|
|
4
4
|
|
|
5
5
|
describe("SeoExpander", () => {
|
|
6
6
|
it("should expand basic SEO configuration", ({ expect }) => {
|
|
@@ -2,7 +2,7 @@ import { Alepha } from "alepha";
|
|
|
2
2
|
import { describe, test } from "vitest";
|
|
3
3
|
import { AlephaReactI18n } from "../index.ts";
|
|
4
4
|
import { $dictionary } from "../primitives/$dictionary.ts";
|
|
5
|
-
import { I18nProvider } from "
|
|
5
|
+
import { I18nProvider } from "../providers/I18nProvider.ts";
|
|
6
6
|
|
|
7
7
|
describe("I18nProvider", () => {
|
|
8
8
|
test("should register dictionaries on initialization", async ({ expect }) => {
|
|
@@ -4,10 +4,10 @@ import { AlephaContext } from "alepha/react";
|
|
|
4
4
|
import type { ReactNode } from "react";
|
|
5
5
|
import { act } from "react";
|
|
6
6
|
import { describe, test } from "vitest";
|
|
7
|
+
import { useI18n } from "../hooks/useI18n.ts";
|
|
7
8
|
import { AlephaReactI18n } from "../index.ts";
|
|
8
9
|
import { $dictionary } from "../primitives/$dictionary.ts";
|
|
9
10
|
import { I18nProvider } from "../providers/I18nProvider.ts";
|
|
10
|
-
import { useI18n } from "./useI18n.ts";
|
|
11
11
|
|
|
12
12
|
describe("useI18n hook", () => {
|
|
13
13
|
const renderWithAlepha = (alepha: Alepha, element: ReactNode) => {
|
|
@@ -6,7 +6,7 @@ import type { GettingStartedSlide } from "./GettingStarted.tsx";
|
|
|
6
6
|
* Returns undefined if devtools are not available.
|
|
7
7
|
*/
|
|
8
8
|
export const useDevtoolsSlide = (): GettingStartedSlide | undefined => {
|
|
9
|
-
if (!import.meta.env
|
|
9
|
+
if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {
|
|
10
10
|
return undefined;
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
-
import { ReactBrowserProvider } from "
|
|
3
|
+
import { ReactBrowserProvider } from "../providers/ReactBrowserProvider.ts";
|
|
4
4
|
|
|
5
5
|
class TestReactBrowserProvider extends ReactBrowserProvider {
|
|
6
6
|
public testGetHydrationState = this.getHydrationState.bind(this);
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
$atom,
|
|
3
3
|
$hook,
|
|
4
4
|
$inject,
|
|
5
|
-
$
|
|
5
|
+
$state,
|
|
6
6
|
Alepha,
|
|
7
7
|
type State,
|
|
8
8
|
type Static,
|
|
@@ -54,7 +54,7 @@ export class ReactBrowserProvider {
|
|
|
54
54
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
55
55
|
protected readonly browserHeadProvider = $inject(BrowserHeadProvider);
|
|
56
56
|
|
|
57
|
-
protected readonly options = $
|
|
57
|
+
protected readonly options = $state(reactBrowserOptions);
|
|
58
58
|
|
|
59
59
|
public get rootId() {
|
|
60
60
|
return "root";
|
|
@@ -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
|
|