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
|
@@ -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.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $hook, $inject, $pipeline, $
|
|
1
|
+
import { $hook, $inject, $pipeline, $state, Alepha, AlephaError } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import { $retry } from "alepha/retry";
|
|
4
4
|
import type { ServiceAccountPrimitive } from "alepha/security";
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import { LinkProvider } from "./LinkProvider.ts";
|
|
13
13
|
|
|
14
14
|
export class RemotePrimitiveProvider {
|
|
15
|
-
protected readonly serverApi = $
|
|
15
|
+
protected readonly serverApi = $state(serverApiOptions);
|
|
16
16
|
protected readonly alepha = $inject(Alepha);
|
|
17
17
|
protected readonly proxyProvider = $inject(ServerProxyProvider);
|
|
18
18
|
protected readonly linkProvider = $inject(LinkProvider);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { $hook, $inject, $
|
|
2
|
+
import { $hook, $inject, $state, Alepha, AlephaError, t } from "alepha";
|
|
3
3
|
import { $logger } from "alepha/logger";
|
|
4
4
|
import type { SecurityProvider, UserAccountToken } from "alepha/security";
|
|
5
5
|
import {
|
|
@@ -17,7 +17,7 @@ import { type HttpClientLink, LinkProvider } from "./LinkProvider.ts";
|
|
|
17
17
|
import { RemotePrimitiveProvider } from "./RemotePrimitiveProvider.ts";
|
|
18
18
|
|
|
19
19
|
export class ServerLinksProvider {
|
|
20
|
-
protected readonly serverApi = $
|
|
20
|
+
protected readonly serverApi = $state(serverApiOptions);
|
|
21
21
|
protected readonly alepha = $inject(Alepha);
|
|
22
22
|
protected readonly linkProvider = $inject(LinkProvider);
|
|
23
23
|
protected readonly remoteProvider = $inject(RemotePrimitiveProvider);
|
|
@@ -3,7 +3,7 @@ import { AlephaCache } from "alepha/cache";
|
|
|
3
3
|
import { AlephaServer, HttpError, type ServerRequest } from "alepha/server";
|
|
4
4
|
import { describe, test } from "vitest";
|
|
5
5
|
import { AlephaServerRateLimit } from "../index.ts";
|
|
6
|
-
import { $rateLimit } from "
|
|
6
|
+
import { $rateLimit } from "../primitives/$rateLimit.ts";
|
|
7
7
|
|
|
8
8
|
// -----------------------------------------------------------------------------------------------------------------
|
|
9
9
|
// Test helpers
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $hook, $inject, $
|
|
1
|
+
import { $atom, $hook, $inject, $state, type Static, t } from "alepha";
|
|
2
2
|
import { CacheProvider } from "alepha/cache";
|
|
3
3
|
import { DateTimeProvider } from "alepha/datetime";
|
|
4
4
|
import { $logger } from "alepha/logger";
|
|
@@ -74,7 +74,7 @@ export class ServerRateLimitProvider {
|
|
|
74
74
|
protected readonly dateTime = $inject(DateTimeProvider);
|
|
75
75
|
protected readonly serverRouterProvider = $inject(ServerRouterProvider);
|
|
76
76
|
protected readonly cacheProvider = $inject(CacheProvider);
|
|
77
|
-
protected readonly globalOptions = $
|
|
77
|
+
protected readonly globalOptions = $state(rateLimitOptions);
|
|
78
78
|
|
|
79
79
|
protected static readonly CACHE_NAME = "rate-limit";
|
|
80
80
|
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
$atom,
|
|
5
5
|
$hook,
|
|
6
6
|
$inject,
|
|
7
|
-
$
|
|
7
|
+
$state,
|
|
8
8
|
Alepha,
|
|
9
9
|
isTypeFile,
|
|
10
10
|
type Static,
|
|
@@ -64,7 +64,7 @@ export class ServerSwaggerProvider {
|
|
|
64
64
|
protected readonly serverProvider = $inject(ServerProvider);
|
|
65
65
|
protected readonly alepha = $inject(Alepha);
|
|
66
66
|
protected readonly log = $logger();
|
|
67
|
-
protected readonly options = $
|
|
67
|
+
protected readonly options = $state(swaggerOptions);
|
|
68
68
|
protected readonly fs = $inject(FileSystemProvider);
|
|
69
69
|
|
|
70
70
|
public json?: OpenApiDocument;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { FileSystemProvider, MemoryFileSystemProvider } from "alepha/system";
|
|
3
|
-
import { beforeEach, describe, expect,
|
|
3
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
4
4
|
import { SmsError } from "../errors/SmsError.ts";
|
|
5
|
-
import { LocalSmsProvider } from "
|
|
5
|
+
import { LocalSmsProvider } from "../providers/LocalSmsProvider.ts";
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
8
8
|
|
|
9
9
|
describe("LocalSmsProvider", () => {
|
|
10
10
|
describe("send", () => {
|
|
11
|
-
|
|
11
|
+
it("should successfully send SMS to local file", async () => {
|
|
12
12
|
const alepha = Alepha.create().with({
|
|
13
13
|
provide: FileSystemProvider,
|
|
14
14
|
use: MemoryFileSystemProvider,
|
|
@@ -29,10 +29,14 @@ describe("LocalSmsProvider", () => {
|
|
|
29
29
|
|
|
30
30
|
expect(memoryFs.writeFileCalls).toHaveLength(1);
|
|
31
31
|
expect(memoryFs.writeFileCalls[0].path).toContain("+1234567890");
|
|
32
|
-
|
|
32
|
+
|
|
33
|
+
const written = JSON.parse(memoryFs.writeFileCalls[0].data as string);
|
|
34
|
+
expect(written.to).toBe("+1234567890");
|
|
35
|
+
expect(written.message).toBe("Test message");
|
|
36
|
+
expect(written.sentAt).toBeDefined();
|
|
33
37
|
});
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
it("should create proper filename with sanitized phone and timestamp", async () => {
|
|
36
40
|
const alepha = Alepha.create().with({
|
|
37
41
|
provide: FileSystemProvider,
|
|
38
42
|
use: MemoryFileSystemProvider,
|
|
@@ -54,13 +58,13 @@ describe("LocalSmsProvider", () => {
|
|
|
54
58
|
expect(memoryFs.joinCalls).toHaveLength(1);
|
|
55
59
|
expect(memoryFs.joinCalls[0]).toEqual([
|
|
56
60
|
"node_modules/.alepha/sms",
|
|
57
|
-
"+1__234__567_8900
|
|
61
|
+
"+1__234__567_8900,2023-01-01T12-00-00-000Z.sms.json",
|
|
58
62
|
]);
|
|
59
63
|
|
|
60
64
|
vi.useRealTimers();
|
|
61
65
|
});
|
|
62
66
|
|
|
63
|
-
|
|
67
|
+
it("should sanitize special characters in phone number", async () => {
|
|
64
68
|
const alepha = Alepha.create().with({
|
|
65
69
|
provide: FileSystemProvider,
|
|
66
70
|
use: MemoryFileSystemProvider,
|
|
@@ -77,11 +81,11 @@ describe("LocalSmsProvider", () => {
|
|
|
77
81
|
|
|
78
82
|
expect(memoryFs.joinCalls).toHaveLength(1);
|
|
79
83
|
expect(memoryFs.joinCalls[0][1]).toMatch(
|
|
80
|
-
/\+1_234_567_8900______123
|
|
84
|
+
/\+1_234_567_8900______123,.+\.sms\.json/,
|
|
81
85
|
);
|
|
82
86
|
});
|
|
83
87
|
|
|
84
|
-
|
|
88
|
+
it("should create proper JSON content", async () => {
|
|
85
89
|
const alepha = Alepha.create().with({
|
|
86
90
|
provide: FileSystemProvider,
|
|
87
91
|
use: MemoryFileSystemProvider,
|
|
@@ -91,20 +95,23 @@ describe("LocalSmsProvider", () => {
|
|
|
91
95
|
const memoryFs = alepha.inject(MemoryFileSystemProvider);
|
|
92
96
|
await alepha.start();
|
|
93
97
|
|
|
98
|
+
const mockDate = new Date("2023-01-01T12:00:00.000Z");
|
|
99
|
+
vi.setSystemTime(mockDate);
|
|
100
|
+
|
|
94
101
|
await provider.send({
|
|
95
102
|
to: "+1234567890",
|
|
96
103
|
message: "Test message with content",
|
|
97
104
|
});
|
|
98
105
|
|
|
99
|
-
const
|
|
106
|
+
const written = JSON.parse(memoryFs.writeFileCalls[0].data as string);
|
|
107
|
+
expect(written.to).toBe("+1234567890");
|
|
108
|
+
expect(written.message).toBe("Test message with content");
|
|
109
|
+
expect(written.sentAt).toBe("2023-01-01T12:00:00.000Z");
|
|
100
110
|
|
|
101
|
-
|
|
102
|
-
expect(textContent).toContain("+1234567890");
|
|
103
|
-
expect(textContent).toContain("Test message with content");
|
|
104
|
-
expect(textContent).toContain("Sent:");
|
|
111
|
+
vi.useRealTimers();
|
|
105
112
|
});
|
|
106
113
|
|
|
107
|
-
|
|
114
|
+
it("should throw SmsError when mkdir fails", async () => {
|
|
108
115
|
const alepha = Alepha.create().with({
|
|
109
116
|
provide: FileSystemProvider,
|
|
110
117
|
use: MemoryFileSystemProvider,
|
|
@@ -131,7 +138,7 @@ describe("LocalSmsProvider", () => {
|
|
|
131
138
|
).rejects.toThrow("Failed to save SMS to local file: Permission denied");
|
|
132
139
|
});
|
|
133
140
|
|
|
134
|
-
|
|
141
|
+
it("should throw SmsError when writeFile fails", async () => {
|
|
135
142
|
const alepha = Alepha.create().with({
|
|
136
143
|
provide: FileSystemProvider,
|
|
137
144
|
use: MemoryFileSystemProvider,
|
|
@@ -158,7 +165,7 @@ describe("LocalSmsProvider", () => {
|
|
|
158
165
|
).rejects.toThrow("Failed to save SMS to local file: Disk full");
|
|
159
166
|
});
|
|
160
167
|
|
|
161
|
-
|
|
168
|
+
it("should handle non-Error exceptions", async () => {
|
|
162
169
|
const alepha = Alepha.create().with({
|
|
163
170
|
provide: FileSystemProvider,
|
|
164
171
|
use: MemoryFileSystemProvider,
|
|
@@ -179,7 +186,7 @@ describe("LocalSmsProvider", () => {
|
|
|
179
186
|
).rejects.toThrow(SmsError);
|
|
180
187
|
});
|
|
181
188
|
|
|
182
|
-
|
|
189
|
+
it("should handle multiple recipients", async () => {
|
|
183
190
|
const alepha = Alepha.create().with({
|
|
184
191
|
provide: FileSystemProvider,
|
|
185
192
|
use: MemoryFileSystemProvider,
|
|
@@ -199,7 +206,7 @@ describe("LocalSmsProvider", () => {
|
|
|
199
206
|
expect(memoryFs.writeFileCalls[1].path).toContain("+2222222222");
|
|
200
207
|
});
|
|
201
208
|
|
|
202
|
-
|
|
209
|
+
it("should use custom directory when provided", async () => {
|
|
203
210
|
const alepha = Alepha.create().with({
|
|
204
211
|
provide: FileSystemProvider,
|
|
205
212
|
use: MemoryFileSystemProvider,
|
|
@@ -225,7 +232,7 @@ describe("LocalSmsProvider", () => {
|
|
|
225
232
|
});
|
|
226
233
|
});
|
|
227
234
|
|
|
228
|
-
describe("
|
|
235
|
+
describe("createSmsJson", () => {
|
|
229
236
|
let provider: LocalSmsProvider;
|
|
230
237
|
|
|
231
238
|
beforeEach(async () => {
|
|
@@ -237,30 +244,29 @@ describe("LocalSmsProvider", () => {
|
|
|
237
244
|
await alepha.start();
|
|
238
245
|
});
|
|
239
246
|
|
|
240
|
-
|
|
247
|
+
it("should create proper JSON structure", () => {
|
|
241
248
|
const mockDate = new Date("2023-01-01T12:00:00.000Z");
|
|
242
249
|
vi.setSystemTime(mockDate);
|
|
243
250
|
|
|
244
|
-
const
|
|
251
|
+
const result = provider.createSmsJson({
|
|
245
252
|
to: "+1234567890",
|
|
246
253
|
message: "Test message",
|
|
247
254
|
});
|
|
248
255
|
|
|
249
|
-
expect(
|
|
250
|
-
expect(
|
|
251
|
-
expect(
|
|
252
|
-
expect(text).toContain("2023-01-01T12:00:00.000Z");
|
|
256
|
+
expect(result.to).toBe("+1234567890");
|
|
257
|
+
expect(result.message).toBe("Test message");
|
|
258
|
+
expect(result.sentAt).toBe("2023-01-01T12:00:00.000Z");
|
|
253
259
|
|
|
254
260
|
vi.useRealTimers();
|
|
255
261
|
});
|
|
256
262
|
|
|
257
|
-
|
|
258
|
-
const
|
|
263
|
+
it("should handle multiline messages", () => {
|
|
264
|
+
const result = provider.createSmsJson({
|
|
259
265
|
to: "+1234567890",
|
|
260
266
|
message: "Line 1\nLine 2\nLine 3",
|
|
261
267
|
});
|
|
262
268
|
|
|
263
|
-
expect(
|
|
269
|
+
expect(result.message).toBe("Line 1\nLine 2\nLine 3");
|
|
264
270
|
});
|
|
265
271
|
});
|
|
266
272
|
});
|
|
@@ -34,21 +34,14 @@ export class LocalSmsProvider implements SmsProvider {
|
|
|
34
34
|
// Ensure directory exists
|
|
35
35
|
await this.fs.mkdir(this.directory, { recursive: true });
|
|
36
36
|
|
|
37
|
-
// Create filename: phone+date
|
|
38
37
|
const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
|
|
39
38
|
for (const recipient of Array.isArray(to) ? to : [to]) {
|
|
40
39
|
const sanitizedPhone = recipient.replace(/[^0-9+]/g, "_");
|
|
41
|
-
const filename = `${sanitizedPhone}
|
|
40
|
+
const filename = `${sanitizedPhone},${timestamp}.sms.json`;
|
|
42
41
|
const filepath = this.fs.join(this.directory, filename);
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
to: recipient,
|
|
47
|
-
message,
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Write to file
|
|
51
|
-
await this.fs.writeFile(filepath, textContent);
|
|
43
|
+
const content = this.createSmsJson({ to: recipient, message });
|
|
44
|
+
await this.fs.writeFile(filepath, JSON.stringify(content, null, 2));
|
|
52
45
|
|
|
53
46
|
this.log.info("SMS saved to local file", { filepath, to });
|
|
54
47
|
}
|
|
@@ -59,19 +52,15 @@ export class LocalSmsProvider implements SmsProvider {
|
|
|
59
52
|
}
|
|
60
53
|
}
|
|
61
54
|
|
|
62
|
-
public
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
Message:
|
|
73
|
-
--------
|
|
74
|
-
${message}
|
|
75
|
-
`;
|
|
55
|
+
public createSmsJson(options: { to: string; message: string }): {
|
|
56
|
+
to: string;
|
|
57
|
+
message: string;
|
|
58
|
+
sentAt: string;
|
|
59
|
+
} {
|
|
60
|
+
return {
|
|
61
|
+
to: options.to,
|
|
62
|
+
message: options.message,
|
|
63
|
+
sentAt: new Date().toISOString(),
|
|
64
|
+
};
|
|
76
65
|
}
|
|
77
66
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
3
|
-
import { MemoryFileSystemProvider } from "
|
|
3
|
+
import { MemoryFileSystemProvider } from "../providers/MemoryFileSystemProvider.ts";
|
|
4
4
|
|
|
5
5
|
describe("MemoryFileSystemProvider", () => {
|
|
6
6
|
let alepha: Alepha;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { MemoryShellProvider } from "
|
|
2
|
+
import { MemoryShellProvider } from "../providers/MemoryShellProvider.ts";
|
|
3
3
|
|
|
4
4
|
describe("MemoryShellProvider", () => {
|
|
5
5
|
let shell: MemoryShellProvider;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $hook, $inject, $
|
|
1
|
+
import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import { RedisProvider, RedisSubscriberProvider } from "alepha/redis";
|
|
4
4
|
import {
|
|
@@ -38,7 +38,7 @@ declare module "alepha" {
|
|
|
38
38
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
39
39
|
|
|
40
40
|
export class RedisTopicProvider extends TopicProvider {
|
|
41
|
-
protected readonly options = $
|
|
41
|
+
protected readonly options = $state(redisTopicOptions);
|
|
42
42
|
protected readonly alepha = $inject(Alepha);
|
|
43
43
|
protected readonly redisProvider = $inject(RedisProvider);
|
|
44
44
|
protected readonly redisSubscriberProvider = $inject(RedisSubscriberProvider);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Alepha } from "alepha";
|
|
2
2
|
import { describe, expect, it } from "vitest";
|
|
3
3
|
import { AlephaWebSocket } from "../index.ts";
|
|
4
|
-
import { RoomManager } from "
|
|
4
|
+
import { RoomManager } from "../services/RoomManager.ts";
|
|
5
5
|
|
|
6
6
|
describe("RoomManager", () => {
|
|
7
7
|
const createRoomManager = () => {
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
$atom,
|
|
4
4
|
$hook,
|
|
5
5
|
$inject,
|
|
6
|
-
$
|
|
6
|
+
$state,
|
|
7
7
|
Alepha,
|
|
8
8
|
AlephaError,
|
|
9
9
|
type Static,
|
|
@@ -58,7 +58,7 @@ export class NodeWebSocketServerProvider extends WebSocketServerProvider {
|
|
|
58
58
|
protected readonly roomManager = $inject(RoomManager);
|
|
59
59
|
protected readonly topicService = $inject(WebSocketTopicService);
|
|
60
60
|
protected readonly log = $logger();
|
|
61
|
-
protected readonly wsOptions = $
|
|
61
|
+
protected readonly wsOptions = $state(websocketOptions);
|
|
62
62
|
|
|
63
63
|
protected wss?: WebSocketServer;
|
|
64
64
|
protected endpoints = new Map<string, WebSocketPrimitiveOptions<any, any>>();
|