alepha 0.19.1 → 0.19.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +6 -9
- package/dist/api/audits/index.d.ts +378 -346
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +216 -184
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +534 -502
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +13 -7
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +202 -202
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/notifications/index.d.ts +152 -152
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/organizations/index.browser.js +48 -0
- package/dist/api/organizations/index.browser.js.map +1 -0
- package/dist/api/organizations/index.d.ts +516 -0
- package/dist/api/organizations/index.d.ts.map +1 -0
- package/dist/api/organizations/index.js +202 -0
- package/dist/api/organizations/index.js.map +1 -0
- package/dist/api/parameters/index.d.ts +391 -358
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +5 -1
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -5
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +986 -931
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +160 -112
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +137 -137
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -2
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +6 -6
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/billing/index.d.ts +1048 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +713 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/bin/index.js +0 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +10 -10
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +2 -2
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +9 -9
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +2 -2
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +2 -2
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/redis/index.d.ts +6 -6
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +6 -18
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +5 -6
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +11811 -323
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +324 -98
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +50 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +174 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +438 -542
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +46 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +201 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +388 -0
- package/dist/cli/vendor/index.js.map +1 -0
- package/dist/command/index.d.ts +18 -18
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2 -2
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +4 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +10 -10
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +8 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +8 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +8 -4
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.d.ts +7 -7
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/datetime/index.d.ts +4 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/email/brevo/index.d.ts +4 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/core/index.d.ts +15 -11
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +12 -35
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.d.ts +12 -12
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +7 -4
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +4 -8
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +55 -889
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -13
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +2 -2
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +4 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +16 -15
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +6 -3
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +11 -11
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +11 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +78 -72
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +103 -69
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +80 -70
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +19 -17
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/queue/core/index.d.ts +14 -14
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +2 -2
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +2 -2
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +4 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.d.ts +9 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +5 -4
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/head/index.d.ts +4 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/i18n/index.d.ts +9 -9
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/intro/index.d.ts +2 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +4 -5
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +215 -215
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +6 -7
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +2 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +2 -4
- package/dist/react/testing/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +4 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +13 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -2
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +47 -47
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -12
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +170 -169
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -2
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +76 -76
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +23 -17
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -13
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +2 -2
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +9 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +2 -2
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -66
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +7 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +5 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +12 -12
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +2 -2
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +5 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +7 -7
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +11 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +9 -15
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +4 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/topic/core/index.d.ts +6 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +7 -7
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/dist/websocket/index.d.ts +36 -36
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +2 -2
- package/dist/websocket/index.js.map +1 -1
- package/package.json +37 -15
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +13 -9
- package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
- package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
- package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
- package/src/api/organizations/entities/organizations.ts +20 -0
- package/src/api/organizations/index.browser.ts +10 -0
- package/src/api/organizations/index.ts +31 -0
- package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
- package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
- package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
- package/src/api/organizations/services/OrganizationService.ts +75 -0
- package/src/api/parameters/services/ParameterProvider.ts +6 -1
- package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -4
- package/src/api/users/primitives/$realm.ts +6 -4
- package/src/api/users/providers/RealmProvider.ts +1 -1
- package/src/api/users/services/RegistrationService.ts +1 -1
- package/src/api/users/services/SessionService.ts +92 -5
- package/src/api/users/services/UserService.ts +1 -1
- package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
- package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
- package/src/billing/__tests__/BillingService.spec.ts +136 -0
- package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
- package/src/billing/controllers/AdminBillingController.ts +149 -0
- package/src/billing/controllers/BillingController.ts +108 -0
- package/src/billing/entities/paymentIntents.ts +34 -0
- package/src/billing/entities/paymentMethods.ts +24 -0
- package/src/billing/entities/refunds.ts +22 -0
- package/src/billing/errors/BillingError.ts +5 -0
- package/src/billing/index.ts +76 -0
- package/src/billing/providers/BillingProvider.ts +79 -0
- package/src/billing/providers/MemoryBillingProvider.ts +139 -0
- package/src/billing/schemas/intentSchemas.ts +60 -0
- package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
- package/src/billing/schemas/refundSchemas.ts +6 -0
- package/src/billing/services/BillingService.ts +325 -0
- package/src/billing/services/PaymentMethodService.ts +82 -0
- package/src/bin/index.ts +0 -2
- package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
- package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
- package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
- package/src/cache/core/primitives/$cache.ts +2 -2
- package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
- package/src/cli/config/defineConfig.ts +17 -26
- package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
- package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
- package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
- package/src/cli/core/atoms/devOptions.ts +0 -5
- package/src/cli/core/commands/build.ts +2 -2
- package/src/cli/core/commands/dev.ts +165 -30
- package/src/cli/core/commands/gen/changelog.ts +2 -2
- package/src/cli/core/commands/init.ts +2 -7
- package/src/cli/core/commands/verify.ts +0 -1
- package/src/cli/core/providers/AppEntryProvider.ts +2 -2
- package/src/cli/core/providers/ViteDevServerProvider.ts +99 -69
- package/src/cli/core/services/PackageManagerUtils.ts +8 -1
- package/src/cli/core/services/ProjectScaffolder.ts +23 -23
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- package/src/cli/core/templates/agentMd.ts +14 -5
- package/src/cli/core/templates/alephaConfigTs.ts +0 -6
- package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
- package/src/cli/core/templates/webAppRouterTs.ts +85 -2
- package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
- package/src/cli/devtools/index.ts +214 -0
- package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
- package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
- package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
- package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
- package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
- package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
- package/src/cli/platform/atoms/platformOptions.ts +2 -10
- package/src/cli/platform/commands/SecretsCommand.ts +2 -2
- package/src/cli/platform/commands/platform.ts +2 -11
- package/src/cli/platform/index.ts +55 -11
- package/src/cli/platform/services/PlatformInspector.ts +2 -2
- package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
- package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
- package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
- package/src/cli/vendor/commands/VendorCommand.ts +204 -0
- package/src/cli/vendor/index.ts +60 -0
- package/src/cli/vendor/services/VendorService.ts +338 -0
- package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
- package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
- package/src/command/providers/CliProvider.ts +2 -2
- package/src/core/Alepha.ts +10 -0
- package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
- package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
- package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
- package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
- package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
- package/src/core/index.shared.ts +1 -1
- package/src/core/primitives/{$use.ts → $state.ts} +4 -4
- package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
- package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
- package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
- package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
- package/src/email/core/providers/LocalEmailProvider.ts +13 -51
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
- package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
- package/src/lock/core/primitives/$lock.ts +2 -2
- package/src/logger/index.ts +16 -5
- package/src/mcp/transports/SseMcpTransport.ts +2 -2
- package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
- package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
- package/src/orm/__tests__/organization-tests.ts +200 -0
- package/src/orm/__tests__/organization.spec.ts +103 -0
- package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
- package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
- package/src/orm/core/index.shared.ts +1 -0
- package/src/orm/core/primitives/$entity.ts +31 -0
- package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
- package/src/orm/core/providers/DrizzleKitProvider.ts +57 -106
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
- package/src/orm/core/services/ModelBuilder.ts +11 -0
- package/src/orm/core/services/QueryManager.ts +16 -2
- package/src/orm/core/services/Repository.ts +70 -10
- package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
- package/src/queue/core/providers/WorkerProvider.ts +2 -2
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
- package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
- package/src/react/core/hooks/useAction.ts +7 -6
- package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
- package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
- package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
- package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
- package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
- package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
- package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
- package/src/react/router/providers/ReactPageProvider.ts +2 -2
- package/src/react/router/providers/ReactServerProvider.ts +3 -3
- package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
- package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
- package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
- package/src/scheduler/primitives/$scheduler.ts +2 -2
- package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
- package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
- package/src/security/primitives/$issuer.ts +1 -1
- package/src/security/providers/JwtProvider.ts +6 -10
- package/src/security/providers/SecurityProvider.ts +6 -11
- package/src/security/schemas/userAccountInfoSchema.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
- package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
- package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
- package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
- package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
- package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +2 -2
- package/src/server/core/primitives/$sse.ts +2 -2
- package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
- package/src/server/core/providers/ServerCompressProvider.ts +2 -2
- package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
- package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
- package/src/server/core/providers/ServerRouterProvider.ts +1 -5
- package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
- package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
- package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
- package/src/server/links/providers/LinkProvider.ts +2 -2
- package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
- package/src/server/links/providers/ServerLinksProvider.ts +2 -2
- package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
- package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
- package/src/sms/providers/LocalSmsProvider.ts +13 -24
- package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
- package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
- package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
- package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
- package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
- package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
- package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
- package/src/cli/platform/services/DockerSshService.ts +0 -61
- /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
- /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
- /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
- /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
- /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
- /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
- /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
- /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
- /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
- /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
- /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
- /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
- /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
- /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
- /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
- /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
- /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
- /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
- /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
- /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
- /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
- /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
- /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
- /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
- /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
- /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
- /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
- /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
- /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
- /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
- /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
- /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
- /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
- /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
- /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
- /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
- /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
- /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
- /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
- /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
- /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
- /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
- /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
- /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
- /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
- /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
- /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
- /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
- /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
- /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
- /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
- /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
- /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.workerd.js","names":[],"sources":["../../../../node_modules/cron-schedule/dist/utils.js","../../../../node_modules/cron-schedule/dist/cron.js","../../../../node_modules/cron-schedule/dist/cron-parser.js","../../src/scheduler/providers/CronProvider.ts","../../src/scheduler/primitives/$scheduler.ts","../../src/scheduler/providers/WorkerdCronProvider.ts","../../src/scheduler/constants/CRON.ts","../../src/scheduler/index.workerd.ts"],"sourcesContent":["export const TIMEOUT_MAX = 2147483647; // 2^31-1\n/**\n * Creates a new timeout, which can exceed the max timeout limit of 2^31-1.\n * Since multiple timeouts are used internally, the timeoutId used to clear the timeout\n * is returned as a handle (object) and changes whenever the max timeout limit is exceeded.\n * The handle parameter can be ignored, it is used internally for updating the timeoutId\n * in the handle after creating the next timeout.\n */\nexport function longTimeout(fn, timeout, previousHandle) {\n let nextTimeout = timeout;\n let remainingTimeout = 0;\n if (nextTimeout > TIMEOUT_MAX) {\n remainingTimeout = nextTimeout - TIMEOUT_MAX;\n nextTimeout = TIMEOUT_MAX;\n }\n const handle = previousHandle !== null && previousHandle !== void 0 ? previousHandle : {\n timeoutId: undefined,\n };\n handle.timeoutId = setTimeout(() => {\n if (remainingTimeout > 0) {\n longTimeout(fn, remainingTimeout, previousHandle);\n }\n else {\n fn();\n }\n }, nextTimeout);\n return handle;\n}\n/* Extracts second, minute, hour, date, month and the weekday from a date. */\nexport function extractDateElements(date) {\n return {\n second: date.getSeconds(),\n minute: date.getMinutes(),\n hour: date.getHours(),\n day: date.getDate(),\n month: date.getMonth(),\n weekday: date.getDay(),\n year: date.getFullYear(),\n };\n}\n/* Gets the amount of days in the given month (indexed by 0) of the given year. */\nexport function getDaysInMonth(year, month) {\n return new Date(year, month + 1, 0).getDate();\n}\n/* Gets the amount of days from weekday1 to weekday2. */\nexport function getDaysBetweenWeekdays(weekday1, weekday2) {\n if (weekday1 <= weekday2) {\n return weekday2 - weekday1;\n }\n return 6 - weekday1 + weekday2 + 1;\n}\nexport function wrapFunction(fn, errorHandler) {\n return () => {\n try {\n const res = fn();\n if (res instanceof Promise) {\n res.catch((err) => {\n if (errorHandler) {\n errorHandler(err);\n }\n });\n }\n }\n catch (err) {\n if (errorHandler) {\n errorHandler(err);\n }\n }\n };\n}\n//# sourceMappingURL=utils.js.map","import { extractDateElements, getDaysBetweenWeekdays, getDaysInMonth, } from './utils.js';\nexport class Cron {\n constructor({ seconds, minutes, hours, days, months, weekdays, }) {\n // Validate that there are values provided.\n if (!seconds || seconds.size === 0)\n throw new Error('There must be at least one allowed second.');\n if (!minutes || minutes.size === 0)\n throw new Error('There must be at least one allowed minute.');\n if (!hours || hours.size === 0)\n throw new Error('There must be at least one allowed hour.');\n if (!months || months.size === 0)\n throw new Error('There must be at least one allowed month.');\n if ((!weekdays || weekdays.size === 0) && (!days || days.size === 0))\n throw new Error('There must be at least one allowed day or weekday.');\n // Convert set to array and sort in ascending order.\n this.seconds = Array.from(seconds).sort((a, b) => a - b);\n this.minutes = Array.from(minutes).sort((a, b) => a - b);\n this.hours = Array.from(hours).sort((a, b) => a - b);\n this.days = Array.from(days).sort((a, b) => a - b);\n this.months = Array.from(months).sort((a, b) => a - b);\n this.weekdays = Array.from(weekdays).sort((a, b) => a - b);\n // Validate that all values are integers within the constraint.\n const validateData = (name, data, constraint) => {\n if (data.some((x) => typeof x !== 'number' ||\n x % 1 !== 0 ||\n x < constraint.min ||\n x > constraint.max)) {\n throw new Error(`${name} must only consist of integers which are within the range of ${constraint.min} and ${constraint.max}`);\n }\n };\n validateData('seconds', this.seconds, { min: 0, max: 59 });\n validateData('minutes', this.minutes, { min: 0, max: 59 });\n validateData('hours', this.hours, { min: 0, max: 23 });\n validateData('days', this.days, { min: 1, max: 31 });\n validateData('months', this.months, { min: 0, max: 11 });\n validateData('weekdays', this.weekdays, { min: 0, max: 6 });\n // For each element, store a reversed copy in the reversed attribute for finding prev dates.\n this.reversed = {\n seconds: this.seconds.map((x) => x).reverse(),\n minutes: this.minutes.map((x) => x).reverse(),\n hours: this.hours.map((x) => x).reverse(),\n days: this.days.map((x) => x).reverse(),\n months: this.months.map((x) => x).reverse(),\n weekdays: this.weekdays.map((x) => x).reverse(),\n };\n }\n /**\n * Find the next or previous hour, starting from the given start hour that matches the hour constraint.\n * startHour itself might also be allowed.\n */\n findAllowedHour(dir, startHour) {\n return dir === 'next'\n ? this.hours.find((x) => x >= startHour)\n : this.reversed.hours.find((x) => x <= startHour);\n }\n /**\n * Find the next or previous minute, starting from the given start minute that matches the minute constraint.\n * startMinute itself might also be allowed.\n */\n findAllowedMinute(dir, startMinute) {\n return dir === 'next'\n ? this.minutes.find((x) => x >= startMinute)\n : this.reversed.minutes.find((x) => x <= startMinute);\n }\n /**\n * Find the next or previous second, starting from the given start second that matches the second constraint.\n * startSecond itself IS NOT allowed.\n */\n findAllowedSecond(dir, startSecond) {\n return dir === 'next'\n ? this.seconds.find((x) => x > startSecond)\n : this.reversed.seconds.find((x) => x < startSecond);\n }\n /**\n * Find the next or previous time, starting from the given start time that matches the hour, minute\n * and second constraints. startTime itself might also be allowed.\n */\n findAllowedTime(dir, startTime) {\n // Try to find an allowed hour.\n let hour = this.findAllowedHour(dir, startTime.hour);\n if (hour !== undefined) {\n if (hour === startTime.hour) {\n // We found an hour that is the start hour. Try to find an allowed minute.\n let minute = this.findAllowedMinute(dir, startTime.minute);\n if (minute !== undefined) {\n if (minute === startTime.minute) {\n // We found a minute that is the start minute. Try to find an allowed second.\n const second = this.findAllowedSecond(dir, startTime.second);\n if (second !== undefined) {\n // We found a second within the start hour and minute.\n return { hour, minute, second };\n }\n // We did not find a valid second within the start minute. Try to find another minute.\n minute = this.findAllowedMinute(dir, dir === 'next' ? startTime.minute + 1 : startTime.minute - 1);\n if (minute !== undefined) {\n // We found a minute which is not the start minute. Return that minute together with the hour and the first / last allowed second.\n return {\n hour,\n minute,\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n else {\n // We found a minute which is not the start minute. Return that minute together with the hour and the first / last allowed second.\n return {\n hour,\n minute,\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n // We did not find an allowed minute / second combination inside the start hour. Try to find the next / previous allowed hour.\n hour = this.findAllowedHour(dir, dir === 'next' ? startTime.hour + 1 : startTime.hour - 1);\n if (hour !== undefined) {\n // We found an allowed hour which is not the start hour. Return that hour together with the first / last allowed minutes / seconds.\n return {\n hour,\n minute: dir === 'next' ? this.minutes[0] : this.reversed.minutes[0],\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n else {\n // We found an allowed hour which is not the start hour. Return that hour together with the first / last allowed minutes / seconds.\n return {\n hour,\n minute: dir === 'next' ? this.minutes[0] : this.reversed.minutes[0],\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n // No allowed time found.\n return undefined;\n }\n /**\n * Find the next or previous day in the given month, starting from the given startDay\n * that matches either the day or the weekday constraint. startDay itself might also be allowed.\n */\n findAllowedDayInMonth(dir, year, month, startDay) {\n var _a, _b;\n if (startDay < 1)\n throw new Error('startDay must not be smaller than 1.');\n // If only days are restricted: allow day based on day constraint only.\n // If only weekdays are restricted: allow day based on weekday constraint only.\n // If both are restricted: allow day based on both day and weekday constraint. pick day that is closer to startDay.\n // If none are restricted: return the day closest to startDay (respecting dir) that is allowed (or startDay itself).\n const daysInMonth = getDaysInMonth(year, month);\n const daysRestricted = this.days.length !== 31;\n const weekdaysRestricted = this.weekdays.length !== 7;\n if (!daysRestricted && !weekdaysRestricted) {\n if (startDay > daysInMonth) {\n return dir === 'next' ? undefined : daysInMonth;\n }\n return startDay;\n }\n // Try to find a day based on the days constraint.\n let allowedDayByDays;\n if (daysRestricted) {\n allowedDayByDays =\n dir === 'next'\n ? this.days.find((x) => x >= startDay)\n : this.reversed.days.find((x) => x <= startDay);\n // Make sure the day does not exceed the amount of days in month.\n if (allowedDayByDays !== undefined && allowedDayByDays > daysInMonth) {\n allowedDayByDays = undefined;\n }\n }\n // Try to find a day based on the weekday constraint.\n let allowedDayByWeekdays;\n if (weekdaysRestricted) {\n const startWeekday = new Date(year, month, startDay).getDay();\n const nearestAllowedWeekday = dir === 'next'\n ? ((_a = this.weekdays.find((x) => x >= startWeekday)) !== null && _a !== void 0 ? _a : this.weekdays[0])\n : ((_b = this.reversed.weekdays.find((x) => x <= startWeekday)) !== null && _b !== void 0 ? _b : this.reversed.weekdays[0]);\n if (nearestAllowedWeekday !== undefined) {\n const daysBetweenWeekdays = dir === 'next'\n ? getDaysBetweenWeekdays(startWeekday, nearestAllowedWeekday)\n : getDaysBetweenWeekdays(nearestAllowedWeekday, startWeekday);\n allowedDayByWeekdays =\n dir === 'next'\n ? startDay + daysBetweenWeekdays\n : startDay - daysBetweenWeekdays;\n // Make sure the day does not exceed the month boundaries.\n if (allowedDayByWeekdays > daysInMonth || allowedDayByWeekdays < 1) {\n allowedDayByWeekdays = undefined;\n }\n }\n }\n if (allowedDayByDays !== undefined && allowedDayByWeekdays !== undefined) {\n // If a day is found both via the days and the weekdays constraint, pick the day\n // that is closer to start date.\n return dir === 'next'\n ? Math.min(allowedDayByDays, allowedDayByWeekdays)\n : Math.max(allowedDayByDays, allowedDayByWeekdays);\n }\n if (allowedDayByDays !== undefined) {\n return allowedDayByDays;\n }\n if (allowedDayByWeekdays !== undefined) {\n return allowedDayByWeekdays;\n }\n return undefined;\n }\n /** Gets the next date starting from the given start date or now. */\n getNextDate(startDate = new Date()) {\n const startDateElements = extractDateElements(startDate);\n let minYear = startDateElements.year;\n let startIndexMonth = this.months.findIndex((x) => x >= startDateElements.month);\n if (startIndexMonth === -1) {\n startIndexMonth = 0;\n minYear++;\n }\n // We try every month within the next 5 years to make sure that we tried to\n // find a matching date insidde a whole leap year.\n const maxIterations = this.months.length * 5;\n for (let i = 0; i < maxIterations; i++) {\n // Get the next year and month.\n const year = minYear + Math.floor((startIndexMonth + i) / this.months.length);\n const month = this.months[(startIndexMonth + i) % this.months.length];\n const isStartMonth = year === startDateElements.year && month === startDateElements.month;\n // Find the next day.\n let day = this.findAllowedDayInMonth('next', year, month, isStartMonth ? startDateElements.day : 1);\n let isStartDay = isStartMonth && day === startDateElements.day;\n // If we found a day and it is the start day, try to find a valid time beginning from the start date time.\n if (day !== undefined && isStartDay) {\n const nextTime = this.findAllowedTime('next', startDateElements);\n if (nextTime !== undefined) {\n return new Date(year, month, day, nextTime.hour, nextTime.minute, nextTime.second);\n }\n // If no valid time has been found for the start date, try the next day.\n day = this.findAllowedDayInMonth('next', year, month, day + 1);\n isStartDay = false;\n }\n // If we found a next day and it is not the start day, just use the next day with the first allowed values\n // for hours, minutes and seconds.\n if (day !== undefined && !isStartDay) {\n return new Date(year, month, day, this.hours[0], this.minutes[0], this.seconds[0]);\n }\n // No allowed day has been found for this month. Continue to search in next month.\n }\n throw new Error('No valid next date was found.');\n }\n /** Gets the specified amount of future dates starting from the given start date or now. */\n getNextDates(amount, startDate) {\n const dates = [];\n let nextDate;\n for (let i = 0; i < amount; i++) {\n nextDate = this.getNextDate(nextDate !== null && nextDate !== void 0 ? nextDate : startDate);\n dates.push(nextDate);\n }\n return dates;\n }\n /**\n * Get an ES6 compatible iterator which iterates over the next dates starting from startDate or now.\n * The iterator runs until the optional endDate is reached or forever.\n */\n *getNextDatesIterator(startDate, endDate) {\n let nextDate;\n while (true) {\n nextDate = this.getNextDate(nextDate !== null && nextDate !== void 0 ? nextDate : startDate);\n if (endDate && endDate.getTime() < nextDate.getTime()) {\n return;\n }\n yield nextDate;\n }\n }\n /** Gets the previous date starting from the given start date or now. */\n getPrevDate(startDate = new Date()) {\n const startDateElements = extractDateElements(startDate);\n let maxYear = startDateElements.year;\n let startIndexMonth = this.reversed.months.findIndex((x) => x <= startDateElements.month);\n if (startIndexMonth === -1) {\n startIndexMonth = 0;\n maxYear--;\n }\n // We try every month within the past 5 years to make sure that we tried to\n // find a matching date inside a whole leap year.\n const maxIterations = this.reversed.months.length * 5;\n for (let i = 0; i < maxIterations; i++) {\n // Get the next year and month.\n const year = maxYear -\n Math.floor((startIndexMonth + i) / this.reversed.months.length);\n const month = this.reversed.months[(startIndexMonth + i) % this.reversed.months.length];\n const isStartMonth = year === startDateElements.year && month === startDateElements.month;\n // Find the previous day.\n let day = this.findAllowedDayInMonth('prev', year, month, isStartMonth\n ? startDateElements.day\n : // Start searching from the last day of the month.\n getDaysInMonth(year, month));\n let isStartDay = isStartMonth && day === startDateElements.day;\n // If we found a day and it is the start day, try to find a valid time beginning from the start date time.\n if (day !== undefined && isStartDay) {\n const prevTime = this.findAllowedTime('prev', startDateElements);\n if (prevTime !== undefined) {\n return new Date(year, month, day, prevTime.hour, prevTime.minute, prevTime.second);\n }\n // If no valid time has been found for the start date, try the previous day.\n if (day > 1) {\n day = this.findAllowedDayInMonth('prev', year, month, day - 1);\n isStartDay = false;\n }\n }\n // If we found a previous day and it is not the start day, just use the previous day with the first allowed values\n // for hours, minutes and seconds (which will be the latest time due to using the reversed array).\n if (day !== undefined && !isStartDay) {\n return new Date(year, month, day, this.reversed.hours[0], this.reversed.minutes[0], this.reversed.seconds[0]);\n }\n // No allowed day has been found for this month. Continue to search in previous month.\n }\n throw new Error('No valid previous date was found.');\n }\n /** Gets the specified amount of previous dates starting from the given start date or now. */\n getPrevDates(amount, startDate) {\n const dates = [];\n let prevDate;\n for (let i = 0; i < amount; i++) {\n prevDate = this.getPrevDate(prevDate !== null && prevDate !== void 0 ? prevDate : startDate);\n dates.push(prevDate);\n }\n return dates;\n }\n /**\n * Get an ES6 compatible iterator which iterates over the previous dates starting from startDate or now.\n * The iterator runs until the optional endDate is reached or forever.\n */\n *getPrevDatesIterator(startDate, endDate) {\n let prevDate;\n while (true) {\n prevDate = this.getPrevDate(prevDate !== null && prevDate !== void 0 ? prevDate : startDate);\n if (endDate && endDate.getTime() > prevDate.getTime()) {\n return;\n }\n yield prevDate;\n }\n }\n /** Returns true when there is a cron date at the given date. */\n matchDate(date) {\n const { second, minute, hour, day, month, weekday } = extractDateElements(date);\n if (this.seconds.indexOf(second) === -1 ||\n this.minutes.indexOf(minute) === -1 ||\n this.hours.indexOf(hour) === -1 ||\n this.months.indexOf(month) === -1) {\n return false;\n }\n if (this.days.length !== 31 && this.weekdays.length !== 7) {\n return (this.days.indexOf(day) !== -1 || this.weekdays.indexOf(weekday) !== -1);\n }\n return (this.days.indexOf(day) !== -1 && this.weekdays.indexOf(weekday) !== -1);\n }\n}\n//# sourceMappingURL=cron.js.map","import { Cron } from './cron.js';\nconst secondConstraint = {\n min: 0,\n max: 59,\n};\nconst minuteConstraint = {\n min: 0,\n max: 59,\n};\nconst hourConstraint = {\n min: 0,\n max: 23,\n};\nconst dayConstraint = {\n min: 1,\n max: 31,\n};\nconst monthConstraint = {\n min: 1,\n max: 12,\n aliases: {\n jan: '1',\n feb: '2',\n mar: '3',\n apr: '4',\n may: '5',\n jun: '6',\n jul: '7',\n aug: '8',\n sep: '9',\n oct: '10',\n nov: '11',\n dec: '12',\n },\n};\nconst weekdayConstraint = {\n min: 0,\n max: 7,\n aliases: {\n mon: '1',\n tue: '2',\n wed: '3',\n thu: '4',\n fri: '5',\n sat: '6',\n sun: '7',\n },\n};\nconst timeNicknames = {\n '@yearly': '0 0 1 1 *',\n '@annually': '0 0 1 1 *',\n '@monthly': '0 0 1 * *',\n '@weekly': '0 0 * * 0',\n '@daily': '0 0 * * *',\n '@hourly': '0 * * * *',\n '@minutely': '* * * * *',\n};\nfunction parseElement(element, constraint) {\n const result = new Set();\n // If returned set of numbers is empty, the scheduler class interpretes the emtpy set of numbers as all valid values of the constraint\n if (element === '*') {\n for (let i = constraint.min; i <= constraint.max; i = i + 1) {\n result.add(i);\n }\n return result;\n }\n // If the element is a list, parse each element in the list.\n const listElements = element.split(',');\n if (listElements.length > 1) {\n for (const listElement of listElements) {\n const parsedListElement = parseElement(listElement, constraint);\n for (const x of parsedListElement) {\n result.add(x);\n }\n }\n return result;\n }\n // Helper function to parse a single element, which includes checking for alias, valid number and constraint min and max.\n const parseSingleElement = (singleElement) => {\n var _a, _b;\n singleElement =\n (_b = (_a = constraint.aliases) === null || _a === void 0 ? void 0 : _a[singleElement.toLowerCase()]) !== null && _b !== void 0 ? _b : singleElement;\n const parsedElement = Number.parseInt(singleElement, 10);\n if (Number.isNaN(parsedElement)) {\n throw new Error(`Failed to parse ${element}: ${singleElement} is NaN.`);\n }\n if (parsedElement < constraint.min || parsedElement > constraint.max) {\n throw new Error(`Failed to parse ${element}: ${singleElement} is outside of constraint range of ${constraint.min} - ${constraint.max}.`);\n }\n return parsedElement;\n };\n // Detect if the element is a range.\n // Possible range formats: 'start-end', 'start-end/step', '*', '*/step'.\n // Where start and end can be numbers or aliases.\n // Capture groups: 1: start-end, 2: start, 3: end, 4: /step, 5: step.\n const rangeSegments = /^(([0-9a-zA-Z]+)-([0-9a-zA-Z]+)|\\*)(\\/([0-9]+))?$/.exec(element);\n // If not, it must be a single element.\n if (rangeSegments === null) {\n result.add(parseSingleElement(element));\n return result;\n }\n // If it is a range, get start and end of the range.\n let parsedStart = rangeSegments[1] === '*'\n ? constraint.min\n : parseSingleElement(rangeSegments[2]);\n const parsedEnd = rangeSegments[1] === '*'\n ? constraint.max\n : parseSingleElement(rangeSegments[3]);\n // need to catch Sunday, which gets parsed here as 7, but is also legitimate at the start of a range as 0, to avoid the out of order error\n if (constraint === weekdayConstraint &&\n parsedStart === 7 &&\n // this check ensures that sun-sun is not incorrectly parsed as [0,1,2,3,4,5,6]\n parsedEnd !== 7) {\n parsedStart = 0;\n }\n if (parsedStart > parsedEnd) {\n throw new Error(`Failed to parse ${element}: Invalid range (start: ${parsedStart}, end: ${parsedEnd}).`);\n }\n // Check whether there is a custom step defined for the range, defaulting to 1.\n const step = rangeSegments[5];\n let parsedStep = 1;\n if (step !== undefined) {\n parsedStep = Number.parseInt(step, 10);\n if (Number.isNaN(parsedStep)) {\n throw new Error(`Failed to parse step: ${step} is NaN.`);\n }\n if (parsedStep < 1) {\n throw new Error(`Failed to parse step: Expected ${step} to be greater than 0.`);\n }\n }\n // Go from start to end of the range by the given steps.\n for (let i = parsedStart; i <= parsedEnd; i = i + parsedStep) {\n result.add(i);\n }\n return result;\n}\n/** Parses a cron expression into a Cron instance. */\nexport function parseCronExpression(cronExpression) {\n var _a;\n if (typeof cronExpression !== 'string') {\n throw new TypeError('Invalid cron expression: must be of type string.');\n }\n // Convert time nicknames.\n cronExpression = (_a = timeNicknames[cronExpression.toLowerCase()]) !== null && _a !== void 0 ? _a : cronExpression;\n // Split the cron expression into its elements, removing empty elements (extra whitespaces).\n const elements = cronExpression.split(' ').filter((elem) => elem.length > 0);\n if (elements.length < 5 || elements.length > 6) {\n throw new Error('Invalid cron expression: expected 5 or 6 elements.');\n }\n const rawSeconds = elements.length === 6 ? elements[0] : '0';\n const rawMinutes = elements.length === 6 ? elements[1] : elements[0];\n const rawHours = elements.length === 6 ? elements[2] : elements[1];\n const rawDays = elements.length === 6 ? elements[3] : elements[2];\n const rawMonths = elements.length === 6 ? elements[4] : elements[3];\n const rawWeekdays = elements.length === 6 ? elements[5] : elements[4];\n return new Cron({\n seconds: parseElement(rawSeconds, secondConstraint),\n minutes: parseElement(rawMinutes, minuteConstraint),\n hours: parseElement(rawHours, hourConstraint),\n days: parseElement(rawDays, dayConstraint),\n // months in cron are indexed by 1, but Cron expects indexes by 0, so we need to reduce all set values by one.\n months: new Set(Array.from(parseElement(rawMonths, monthConstraint)).map((x) => x - 1)),\n weekdays: new Set(Array.from(parseElement(rawWeekdays, weekdayConstraint)).map((x) => x % 7)),\n });\n}\n//# sourceMappingURL=cron-parser.js.map","import { $hook, $inject, Alepha } from \"alepha\";\nimport { type DateTime, DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { type Cron, parseCronExpression } from \"cron-schedule\";\n\nexport class CronProvider {\n protected readonly dt = $inject(DateTimeProvider);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly cronJobs: Array<CronJob> = [];\n\n public getCronJobs(): Array<CronJob> {\n return this.cronJobs;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => {\n if (this.alepha.isServerless()) {\n this.log.info(\"Ignoring cron jobs in serverless environment\");\n return;\n }\n\n for (const cron of this.cronJobs) {\n if (!cron.running) {\n cron.running = true;\n this.log.debug(\n `Starting cron task '${cron.name}' with '${cron.expression}'`,\n );\n this.run(cron);\n }\n }\n },\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => {\n for (const cron of this.cronJobs) {\n this.abort(cron);\n }\n },\n });\n\n protected boot(name: string | CronJob) {\n const cron =\n typeof name === \"string\"\n ? this.cronJobs.find((c) => c.name === name)\n : name;\n\n if (!cron) {\n return;\n }\n\n cron.running = true;\n\n this.log.debug(\n `Starting cron task '${cron.name}' with '${cron.expression}'`,\n );\n\n this.run(cron);\n }\n\n public abort(name: string | CronJob): void {\n const cron =\n typeof name === \"string\"\n ? this.cronJobs.find((c) => c.name === name)\n : name;\n\n if (!cron || !cron.running) {\n return;\n }\n\n cron.running = false;\n cron.abort?.abort();\n this.log.debug(`Cron task '${cron.name}' stopped`);\n }\n\n /**\n * Registers a cron job.\n *\n * It's automatically done when using the `$scheduler` primitive but can also be used manually.\n */\n public createCronJob(\n name: string,\n expression: string,\n handler: (context: { now: DateTime }) => Promise<void>,\n start?: boolean,\n ): void {\n const cron: CronJob = {\n name,\n cron: parseCronExpression(expression),\n expression,\n handler,\n loop: true,\n abort: new AbortController(),\n };\n\n this.cronJobs.push(cron);\n\n if (start && this.alepha.isStarted()) {\n this.boot(cron);\n }\n }\n\n protected run(task: CronJob, now = this.dt.now()): void {\n if (!task.running) {\n return;\n }\n\n const [next] = task.cron.getNextDates(1, now.toDate());\n if (!next) {\n return;\n }\n\n const duration = next.getTime() - now.toDate().getTime();\n const abort = new AbortController();\n task.abort = abort;\n\n this.dt\n .wait(duration, {\n now: now.valueOf(),\n signal: abort.signal,\n })\n .then(() => {\n if (!task.running) {\n this.log.trace(\"Cron task stopped before execution\");\n return;\n }\n\n this.log.trace(\"Running cron task\");\n\n if (task.executing) {\n this.log.warn(\n `Cron task '${task.name}' is still running, skipping this invocation`,\n );\n if (task.loop) {\n this.run(task, this.dt.of(next));\n }\n return;\n }\n\n task.executing = true;\n task\n .handler({ now: this.dt.of(next) })\n .catch((err) => {\n if (task.onError) {\n task.onError(err);\n } else {\n this.log.error(\"Error in cron task:\", err);\n }\n })\n .finally(() => {\n task.executing = false;\n });\n\n if (task.loop) {\n this.run(task, this.dt.of(next));\n }\n })\n .catch((err) => {\n this.log.warn(\"Issue during cron waiting timer\", err as Error);\n });\n }\n\n /**\n * Trigger a specific cron job by name.\n */\n public async trigger(name: string): Promise<void> {\n const job = this.cronJobs.find((j) => j.name === name);\n if (!job) {\n this.log.warn(`Cron job '${name}' not found`);\n return;\n }\n await this.runJobs([job], this.dt.now());\n }\n\n /**\n * Trigger all registered cron jobs.\n */\n public async triggerAll(): Promise<void> {\n await this.runJobs(this.cronJobs, this.dt.now());\n }\n\n /**\n * Run multiple cron jobs in parallel.\n */\n protected async runJobs(jobs: CronJob[], now: DateTime): Promise<void> {\n const results = await Promise.allSettled(\n jobs.map(async (job) => {\n this.log.debug(`Running cron job '${job.name}'`);\n try {\n await job.handler({ now });\n this.log.debug(`Cron job '${job.name}' completed`);\n } catch (error) {\n this.log.error(`Cron job '${job.name}' failed`, error);\n throw error;\n }\n }),\n );\n\n const failures = results.filter((r) => r.status === \"rejected\");\n if (failures.length > 0) {\n this.log.error(`${failures.length}/${jobs.length} cron jobs failed`);\n }\n }\n}\n\nexport interface CronJob {\n name: string;\n expression: string;\n handler: (context: { now: DateTime }) => Promise<void>;\n cron: Cron;\n loop: boolean;\n running?: boolean;\n executing?: boolean;\n onError?: (error: Error) => void;\n abort?: AbortController;\n}\n","import {\n $atom,\n $inject,\n $pipeline,\n $use,\n Alepha,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $lock } from \"alepha/lock\";\nimport { $logger } from \"alepha/logger\";\nimport { CronProvider } from \"../providers/CronProvider.ts\";\n\n/**\n * Scheduler primitive.\n */\nexport const $scheduler = (\n options: SchedulerPrimitiveOptions,\n): SchedulerPrimitive => {\n return createPrimitive(SchedulerPrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type SchedulerPrimitiveOptions = {\n /**\n * Function to run on schedule.\n */\n handler: (args: SchedulerHandlerArguments) => Async<void>;\n\n /**\n * Name of the scheduler. Defaults to the function name.\n */\n name?: string;\n\n /**\n * Optional description of the scheduler.\n */\n description?: string;\n\n /**\n * Cron expression or interval to run the scheduler.\n */\n cron?: string;\n\n /**\n * Cron expression or interval to run the scheduler.\n */\n interval?: DurationLike;\n\n /**\n * If true, the scheduler will be locked and only one instance will run at a time.\n * You probably need to import {@link AlephaLockRedis} for distributed locking.\n *\n * @default true\n */\n lock?: boolean;\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Scheduler configuration atom.\n */\nexport const schedulerOptions = $atom({\n name: \"alepha.scheduler.options\",\n schema: t.object({\n prefix: t.optional(\n t.text({\n description: \"Prefix for scheduler lock keys.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type SchedulerAtomOptions = Static<typeof schedulerOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [schedulerOptions.key]: SchedulerAtomOptions;\n }\n}\n\nexport class SchedulerPrimitive extends Primitive<SchedulerPrimitiveOptions> {\n protected readonly log = $logger();\n protected readonly settings = $use(schedulerOptions);\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly cronProvider = $inject(CronProvider);\n\n public get name(): string {\n return (\n this.options.name ??\n `${this.config.service.name}.${this.config.propertyKey}`\n );\n }\n\n protected onInit() {\n if (this.options.interval) {\n this.dateTimeProvider.createInterval(\n () => this.trigger(),\n this.options.interval,\n );\n }\n if (this.options.cron) {\n this.cronProvider.createCronJob(this.name, this.options.cron, () =>\n this.trigger(),\n );\n }\n }\n\n public async trigger(): Promise<void> {\n if (!this.alepha.isStarted()) {\n return;\n }\n\n const context = this.alepha.context.createContextId();\n\n await this.alepha.context.run(\n async () => {\n try {\n const now = this.dateTimeProvider.now();\n\n await this.alepha.events.emit(\"scheduler:begin\", {\n name: this.name,\n now,\n context,\n });\n\n if (this.options.lock !== false) {\n await this.schedulerLock.run({ now });\n } else {\n await this.options.handler({ now });\n }\n\n await this.alepha.events.emit(\n \"scheduler:success\",\n {\n name: this.name,\n context,\n },\n {\n catch: true,\n },\n );\n } catch (error) {\n await this.alepha.events.emit(\n \"scheduler:error\",\n {\n name: this.name,\n error: error as Error,\n context,\n },\n {\n catch: true,\n },\n );\n\n this.log.error(\"Error running scheduler:\", error);\n }\n\n await this.alepha.events.emit(\n \"scheduler:end\",\n {\n name: this.name,\n context,\n },\n {\n catch: true,\n },\n );\n },\n {\n context,\n },\n );\n }\n\n protected schedulerLock = $pipeline({\n use: [\n $lock({\n name: () => {\n const prefix = this.settings.prefix ? `${this.settings.prefix}:` : \"\";\n return `${prefix}scheduler:${this.name}`;\n },\n }),\n ],\n handler: async (args: SchedulerHandlerArguments) => {\n await this.options.handler(args);\n },\n });\n}\n\n$scheduler[KIND] = SchedulerPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SchedulerHandlerArguments {\n now: DateTime;\n}\n","import { $hook } from \"alepha\";\nimport type { DateTime } from \"alepha/datetime\";\nimport { parseCronExpression } from \"cron-schedule\";\nimport { CronProvider } from \"./CronProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Cloudflare Workers scheduled event.\n *\n * Emitted when a cron trigger fires in Cloudflare Workers.\n */\n \"cloudflare:scheduled\": {\n cron: string;\n scheduledTime: number;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Cloudflare Workers cron provider.\n *\n * This provider handles scheduled events from Cloudflare Workers Cron Triggers.\n * Unlike the Node.js CronProvider, this doesn't use intervals/timeouts - instead,\n * it reacts to scheduled events triggered by Cloudflare.\n *\n * **Usage:**\n * 1. Define schedulers with `$scheduler({ cron: \"0 * * * *\", handler: ... })`\n * 2. Build your app with `alepha build` - cron triggers are automatically added to `wrangler.jsonc`\n * 3. Deploy to Cloudflare Workers\n *\n * **How it works:**\n * - During build, all registered `$scheduler` cron expressions are collected\n * - The build generates `wrangler.jsonc` with `triggers.crons` automatically filled\n * - When Cloudflare fires a cron trigger, the `scheduled` handler emits `cloudflare:scheduled`\n * - This provider listens to that event and runs matching schedulers\n *\n * @see https://developers.cloudflare.com/workers/configuration/cron-triggers/\n */\nexport class WorkerdCronProvider extends CronProvider {\n /**\n * Override to avoid creating AbortController in global scope.\n * Cloudflare Workers doesn't allow this during initialization.\n */\n public override createCronJob(\n name: string,\n expression: string,\n handler: (context: { now: DateTime }) => Promise<void>,\n ): void {\n this.cronJobs.push({\n name,\n cron: parseCronExpression(expression),\n expression,\n handler,\n loop: false,\n });\n }\n\n /**\n * Handle a scheduled event from Cloudflare Workers.\n */\n protected readonly onScheduledEvent = $hook({\n on: \"cloudflare:scheduled\",\n handler: async (event) => {\n const now = this.dt.of(event.scheduledTime);\n\n this.log.info(\"Received scheduled event\", {\n cron: event.cron,\n scheduledTime: now.format(),\n });\n\n // Find jobs that match this cron expression\n const matchingJobs = this.cronJobs.filter(\n (job) => job.expression === event.cron,\n );\n\n if (matchingJobs.length === 0) {\n // No exact match - try to find jobs that would fire at this time\n const matchingByTime = this.cronJobs.filter((job) =>\n job.cron.matchDate(now.toDate()),\n );\n\n if (matchingByTime.length > 0) {\n this.log.debug(\n `No exact cron match for '${event.cron}', found ${matchingByTime.length} jobs matching by time`,\n );\n await this.runJobs(matchingByTime, now);\n return;\n }\n\n this.log.warn(`No cron jobs found for expression '${event.cron}'`);\n return;\n }\n\n await this.runJobs(matchingJobs, now);\n },\n });\n}\n","export const CRON = {\n EVERY_MINUTE: \"* * * * *\",\n EVERY_5_MINUTES: \"*/5 * * * *\",\n EVERY_15_MINUTES: \"*/15 * * * *\",\n EVERY_30_MINUTES: \"*/30 * * * *\",\n EVERY_HOUR: \"0 * * * *\",\n EVERY_DAY_AT_MIDNIGHT: \"0 0 * * *\",\n};\n","import { $module } from \"alepha\";\nimport { AlephaLock } from \"alepha/lock\";\nimport { $scheduler } from \"./primitives/$scheduler.ts\";\nimport { CronProvider } from \"./providers/CronProvider.ts\";\nimport { WorkerdCronProvider } from \"./providers/WorkerdCronProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./constants/CRON.ts\";\nexport * from \"./primitives/$scheduler.ts\";\nexport * from \"./providers/CronProvider.ts\";\nexport * from \"./providers/WorkerdCronProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Cloudflare Workers scheduled event.\n *\n * Emitted when a cron trigger fires in Cloudflare Workers.\n */\n \"cloudflare:scheduled\": {\n cron: string;\n scheduledTime: number;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaScheduler = $module({\n name: \"alepha.scheduler\",\n primitives: [$scheduler],\n services: [AlephaLock, CronProvider, WorkerdCronProvider],\n register: (alepha) =>\n // Replace CronProvider with WorkerdCronProvider for Cloudflare Workers\n alepha.with({\n provide: CronProvider,\n use: WorkerdCronProvider,\n }),\n});\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.workerd.js","names":[],"sources":["../../../../node_modules/cron-schedule/dist/utils.js","../../../../node_modules/cron-schedule/dist/cron.js","../../../../node_modules/cron-schedule/dist/cron-parser.js","../../src/scheduler/providers/CronProvider.ts","../../src/scheduler/primitives/$scheduler.ts","../../src/scheduler/providers/WorkerdCronProvider.ts","../../src/scheduler/constants/CRON.ts","../../src/scheduler/index.workerd.ts"],"sourcesContent":["export const TIMEOUT_MAX = 2147483647; // 2^31-1\n/**\n * Creates a new timeout, which can exceed the max timeout limit of 2^31-1.\n * Since multiple timeouts are used internally, the timeoutId used to clear the timeout\n * is returned as a handle (object) and changes whenever the max timeout limit is exceeded.\n * The handle parameter can be ignored, it is used internally for updating the timeoutId\n * in the handle after creating the next timeout.\n */\nexport function longTimeout(fn, timeout, previousHandle) {\n let nextTimeout = timeout;\n let remainingTimeout = 0;\n if (nextTimeout > TIMEOUT_MAX) {\n remainingTimeout = nextTimeout - TIMEOUT_MAX;\n nextTimeout = TIMEOUT_MAX;\n }\n const handle = previousHandle !== null && previousHandle !== void 0 ? previousHandle : {\n timeoutId: undefined,\n };\n handle.timeoutId = setTimeout(() => {\n if (remainingTimeout > 0) {\n longTimeout(fn, remainingTimeout, previousHandle);\n }\n else {\n fn();\n }\n }, nextTimeout);\n return handle;\n}\n/* Extracts second, minute, hour, date, month and the weekday from a date. */\nexport function extractDateElements(date) {\n return {\n second: date.getSeconds(),\n minute: date.getMinutes(),\n hour: date.getHours(),\n day: date.getDate(),\n month: date.getMonth(),\n weekday: date.getDay(),\n year: date.getFullYear(),\n };\n}\n/* Gets the amount of days in the given month (indexed by 0) of the given year. */\nexport function getDaysInMonth(year, month) {\n return new Date(year, month + 1, 0).getDate();\n}\n/* Gets the amount of days from weekday1 to weekday2. */\nexport function getDaysBetweenWeekdays(weekday1, weekday2) {\n if (weekday1 <= weekday2) {\n return weekday2 - weekday1;\n }\n return 6 - weekday1 + weekday2 + 1;\n}\nexport function wrapFunction(fn, errorHandler) {\n return () => {\n try {\n const res = fn();\n if (res instanceof Promise) {\n res.catch((err) => {\n if (errorHandler) {\n errorHandler(err);\n }\n });\n }\n }\n catch (err) {\n if (errorHandler) {\n errorHandler(err);\n }\n }\n };\n}\n//# sourceMappingURL=utils.js.map","import { extractDateElements, getDaysBetweenWeekdays, getDaysInMonth, } from './utils.js';\nexport class Cron {\n constructor({ seconds, minutes, hours, days, months, weekdays, }) {\n // Validate that there are values provided.\n if (!seconds || seconds.size === 0)\n throw new Error('There must be at least one allowed second.');\n if (!minutes || minutes.size === 0)\n throw new Error('There must be at least one allowed minute.');\n if (!hours || hours.size === 0)\n throw new Error('There must be at least one allowed hour.');\n if (!months || months.size === 0)\n throw new Error('There must be at least one allowed month.');\n if ((!weekdays || weekdays.size === 0) && (!days || days.size === 0))\n throw new Error('There must be at least one allowed day or weekday.');\n // Convert set to array and sort in ascending order.\n this.seconds = Array.from(seconds).sort((a, b) => a - b);\n this.minutes = Array.from(minutes).sort((a, b) => a - b);\n this.hours = Array.from(hours).sort((a, b) => a - b);\n this.days = Array.from(days).sort((a, b) => a - b);\n this.months = Array.from(months).sort((a, b) => a - b);\n this.weekdays = Array.from(weekdays).sort((a, b) => a - b);\n // Validate that all values are integers within the constraint.\n const validateData = (name, data, constraint) => {\n if (data.some((x) => typeof x !== 'number' ||\n x % 1 !== 0 ||\n x < constraint.min ||\n x > constraint.max)) {\n throw new Error(`${name} must only consist of integers which are within the range of ${constraint.min} and ${constraint.max}`);\n }\n };\n validateData('seconds', this.seconds, { min: 0, max: 59 });\n validateData('minutes', this.minutes, { min: 0, max: 59 });\n validateData('hours', this.hours, { min: 0, max: 23 });\n validateData('days', this.days, { min: 1, max: 31 });\n validateData('months', this.months, { min: 0, max: 11 });\n validateData('weekdays', this.weekdays, { min: 0, max: 6 });\n // For each element, store a reversed copy in the reversed attribute for finding prev dates.\n this.reversed = {\n seconds: this.seconds.map((x) => x).reverse(),\n minutes: this.minutes.map((x) => x).reverse(),\n hours: this.hours.map((x) => x).reverse(),\n days: this.days.map((x) => x).reverse(),\n months: this.months.map((x) => x).reverse(),\n weekdays: this.weekdays.map((x) => x).reverse(),\n };\n }\n /**\n * Find the next or previous hour, starting from the given start hour that matches the hour constraint.\n * startHour itself might also be allowed.\n */\n findAllowedHour(dir, startHour) {\n return dir === 'next'\n ? this.hours.find((x) => x >= startHour)\n : this.reversed.hours.find((x) => x <= startHour);\n }\n /**\n * Find the next or previous minute, starting from the given start minute that matches the minute constraint.\n * startMinute itself might also be allowed.\n */\n findAllowedMinute(dir, startMinute) {\n return dir === 'next'\n ? this.minutes.find((x) => x >= startMinute)\n : this.reversed.minutes.find((x) => x <= startMinute);\n }\n /**\n * Find the next or previous second, starting from the given start second that matches the second constraint.\n * startSecond itself IS NOT allowed.\n */\n findAllowedSecond(dir, startSecond) {\n return dir === 'next'\n ? this.seconds.find((x) => x > startSecond)\n : this.reversed.seconds.find((x) => x < startSecond);\n }\n /**\n * Find the next or previous time, starting from the given start time that matches the hour, minute\n * and second constraints. startTime itself might also be allowed.\n */\n findAllowedTime(dir, startTime) {\n // Try to find an allowed hour.\n let hour = this.findAllowedHour(dir, startTime.hour);\n if (hour !== undefined) {\n if (hour === startTime.hour) {\n // We found an hour that is the start hour. Try to find an allowed minute.\n let minute = this.findAllowedMinute(dir, startTime.minute);\n if (minute !== undefined) {\n if (minute === startTime.minute) {\n // We found a minute that is the start minute. Try to find an allowed second.\n const second = this.findAllowedSecond(dir, startTime.second);\n if (second !== undefined) {\n // We found a second within the start hour and minute.\n return { hour, minute, second };\n }\n // We did not find a valid second within the start minute. Try to find another minute.\n minute = this.findAllowedMinute(dir, dir === 'next' ? startTime.minute + 1 : startTime.minute - 1);\n if (minute !== undefined) {\n // We found a minute which is not the start minute. Return that minute together with the hour and the first / last allowed second.\n return {\n hour,\n minute,\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n else {\n // We found a minute which is not the start minute. Return that minute together with the hour and the first / last allowed second.\n return {\n hour,\n minute,\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n // We did not find an allowed minute / second combination inside the start hour. Try to find the next / previous allowed hour.\n hour = this.findAllowedHour(dir, dir === 'next' ? startTime.hour + 1 : startTime.hour - 1);\n if (hour !== undefined) {\n // We found an allowed hour which is not the start hour. Return that hour together with the first / last allowed minutes / seconds.\n return {\n hour,\n minute: dir === 'next' ? this.minutes[0] : this.reversed.minutes[0],\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n else {\n // We found an allowed hour which is not the start hour. Return that hour together with the first / last allowed minutes / seconds.\n return {\n hour,\n minute: dir === 'next' ? this.minutes[0] : this.reversed.minutes[0],\n second: dir === 'next' ? this.seconds[0] : this.reversed.seconds[0],\n };\n }\n }\n // No allowed time found.\n return undefined;\n }\n /**\n * Find the next or previous day in the given month, starting from the given startDay\n * that matches either the day or the weekday constraint. startDay itself might also be allowed.\n */\n findAllowedDayInMonth(dir, year, month, startDay) {\n var _a, _b;\n if (startDay < 1)\n throw new Error('startDay must not be smaller than 1.');\n // If only days are restricted: allow day based on day constraint only.\n // If only weekdays are restricted: allow day based on weekday constraint only.\n // If both are restricted: allow day based on both day and weekday constraint. pick day that is closer to startDay.\n // If none are restricted: return the day closest to startDay (respecting dir) that is allowed (or startDay itself).\n const daysInMonth = getDaysInMonth(year, month);\n const daysRestricted = this.days.length !== 31;\n const weekdaysRestricted = this.weekdays.length !== 7;\n if (!daysRestricted && !weekdaysRestricted) {\n if (startDay > daysInMonth) {\n return dir === 'next' ? undefined : daysInMonth;\n }\n return startDay;\n }\n // Try to find a day based on the days constraint.\n let allowedDayByDays;\n if (daysRestricted) {\n allowedDayByDays =\n dir === 'next'\n ? this.days.find((x) => x >= startDay)\n : this.reversed.days.find((x) => x <= startDay);\n // Make sure the day does not exceed the amount of days in month.\n if (allowedDayByDays !== undefined && allowedDayByDays > daysInMonth) {\n allowedDayByDays = undefined;\n }\n }\n // Try to find a day based on the weekday constraint.\n let allowedDayByWeekdays;\n if (weekdaysRestricted) {\n const startWeekday = new Date(year, month, startDay).getDay();\n const nearestAllowedWeekday = dir === 'next'\n ? ((_a = this.weekdays.find((x) => x >= startWeekday)) !== null && _a !== void 0 ? _a : this.weekdays[0])\n : ((_b = this.reversed.weekdays.find((x) => x <= startWeekday)) !== null && _b !== void 0 ? _b : this.reversed.weekdays[0]);\n if (nearestAllowedWeekday !== undefined) {\n const daysBetweenWeekdays = dir === 'next'\n ? getDaysBetweenWeekdays(startWeekday, nearestAllowedWeekday)\n : getDaysBetweenWeekdays(nearestAllowedWeekday, startWeekday);\n allowedDayByWeekdays =\n dir === 'next'\n ? startDay + daysBetweenWeekdays\n : startDay - daysBetweenWeekdays;\n // Make sure the day does not exceed the month boundaries.\n if (allowedDayByWeekdays > daysInMonth || allowedDayByWeekdays < 1) {\n allowedDayByWeekdays = undefined;\n }\n }\n }\n if (allowedDayByDays !== undefined && allowedDayByWeekdays !== undefined) {\n // If a day is found both via the days and the weekdays constraint, pick the day\n // that is closer to start date.\n return dir === 'next'\n ? Math.min(allowedDayByDays, allowedDayByWeekdays)\n : Math.max(allowedDayByDays, allowedDayByWeekdays);\n }\n if (allowedDayByDays !== undefined) {\n return allowedDayByDays;\n }\n if (allowedDayByWeekdays !== undefined) {\n return allowedDayByWeekdays;\n }\n return undefined;\n }\n /** Gets the next date starting from the given start date or now. */\n getNextDate(startDate = new Date()) {\n const startDateElements = extractDateElements(startDate);\n let minYear = startDateElements.year;\n let startIndexMonth = this.months.findIndex((x) => x >= startDateElements.month);\n if (startIndexMonth === -1) {\n startIndexMonth = 0;\n minYear++;\n }\n // We try every month within the next 5 years to make sure that we tried to\n // find a matching date insidde a whole leap year.\n const maxIterations = this.months.length * 5;\n for (let i = 0; i < maxIterations; i++) {\n // Get the next year and month.\n const year = minYear + Math.floor((startIndexMonth + i) / this.months.length);\n const month = this.months[(startIndexMonth + i) % this.months.length];\n const isStartMonth = year === startDateElements.year && month === startDateElements.month;\n // Find the next day.\n let day = this.findAllowedDayInMonth('next', year, month, isStartMonth ? startDateElements.day : 1);\n let isStartDay = isStartMonth && day === startDateElements.day;\n // If we found a day and it is the start day, try to find a valid time beginning from the start date time.\n if (day !== undefined && isStartDay) {\n const nextTime = this.findAllowedTime('next', startDateElements);\n if (nextTime !== undefined) {\n return new Date(year, month, day, nextTime.hour, nextTime.minute, nextTime.second);\n }\n // If no valid time has been found for the start date, try the next day.\n day = this.findAllowedDayInMonth('next', year, month, day + 1);\n isStartDay = false;\n }\n // If we found a next day and it is not the start day, just use the next day with the first allowed values\n // for hours, minutes and seconds.\n if (day !== undefined && !isStartDay) {\n return new Date(year, month, day, this.hours[0], this.minutes[0], this.seconds[0]);\n }\n // No allowed day has been found for this month. Continue to search in next month.\n }\n throw new Error('No valid next date was found.');\n }\n /** Gets the specified amount of future dates starting from the given start date or now. */\n getNextDates(amount, startDate) {\n const dates = [];\n let nextDate;\n for (let i = 0; i < amount; i++) {\n nextDate = this.getNextDate(nextDate !== null && nextDate !== void 0 ? nextDate : startDate);\n dates.push(nextDate);\n }\n return dates;\n }\n /**\n * Get an ES6 compatible iterator which iterates over the next dates starting from startDate or now.\n * The iterator runs until the optional endDate is reached or forever.\n */\n *getNextDatesIterator(startDate, endDate) {\n let nextDate;\n while (true) {\n nextDate = this.getNextDate(nextDate !== null && nextDate !== void 0 ? nextDate : startDate);\n if (endDate && endDate.getTime() < nextDate.getTime()) {\n return;\n }\n yield nextDate;\n }\n }\n /** Gets the previous date starting from the given start date or now. */\n getPrevDate(startDate = new Date()) {\n const startDateElements = extractDateElements(startDate);\n let maxYear = startDateElements.year;\n let startIndexMonth = this.reversed.months.findIndex((x) => x <= startDateElements.month);\n if (startIndexMonth === -1) {\n startIndexMonth = 0;\n maxYear--;\n }\n // We try every month within the past 5 years to make sure that we tried to\n // find a matching date inside a whole leap year.\n const maxIterations = this.reversed.months.length * 5;\n for (let i = 0; i < maxIterations; i++) {\n // Get the next year and month.\n const year = maxYear -\n Math.floor((startIndexMonth + i) / this.reversed.months.length);\n const month = this.reversed.months[(startIndexMonth + i) % this.reversed.months.length];\n const isStartMonth = year === startDateElements.year && month === startDateElements.month;\n // Find the previous day.\n let day = this.findAllowedDayInMonth('prev', year, month, isStartMonth\n ? startDateElements.day\n : // Start searching from the last day of the month.\n getDaysInMonth(year, month));\n let isStartDay = isStartMonth && day === startDateElements.day;\n // If we found a day and it is the start day, try to find a valid time beginning from the start date time.\n if (day !== undefined && isStartDay) {\n const prevTime = this.findAllowedTime('prev', startDateElements);\n if (prevTime !== undefined) {\n return new Date(year, month, day, prevTime.hour, prevTime.minute, prevTime.second);\n }\n // If no valid time has been found for the start date, try the previous day.\n if (day > 1) {\n day = this.findAllowedDayInMonth('prev', year, month, day - 1);\n isStartDay = false;\n }\n }\n // If we found a previous day and it is not the start day, just use the previous day with the first allowed values\n // for hours, minutes and seconds (which will be the latest time due to using the reversed array).\n if (day !== undefined && !isStartDay) {\n return new Date(year, month, day, this.reversed.hours[0], this.reversed.minutes[0], this.reversed.seconds[0]);\n }\n // No allowed day has been found for this month. Continue to search in previous month.\n }\n throw new Error('No valid previous date was found.');\n }\n /** Gets the specified amount of previous dates starting from the given start date or now. */\n getPrevDates(amount, startDate) {\n const dates = [];\n let prevDate;\n for (let i = 0; i < amount; i++) {\n prevDate = this.getPrevDate(prevDate !== null && prevDate !== void 0 ? prevDate : startDate);\n dates.push(prevDate);\n }\n return dates;\n }\n /**\n * Get an ES6 compatible iterator which iterates over the previous dates starting from startDate or now.\n * The iterator runs until the optional endDate is reached or forever.\n */\n *getPrevDatesIterator(startDate, endDate) {\n let prevDate;\n while (true) {\n prevDate = this.getPrevDate(prevDate !== null && prevDate !== void 0 ? prevDate : startDate);\n if (endDate && endDate.getTime() > prevDate.getTime()) {\n return;\n }\n yield prevDate;\n }\n }\n /** Returns true when there is a cron date at the given date. */\n matchDate(date) {\n const { second, minute, hour, day, month, weekday } = extractDateElements(date);\n if (this.seconds.indexOf(second) === -1 ||\n this.minutes.indexOf(minute) === -1 ||\n this.hours.indexOf(hour) === -1 ||\n this.months.indexOf(month) === -1) {\n return false;\n }\n if (this.days.length !== 31 && this.weekdays.length !== 7) {\n return (this.days.indexOf(day) !== -1 || this.weekdays.indexOf(weekday) !== -1);\n }\n return (this.days.indexOf(day) !== -1 && this.weekdays.indexOf(weekday) !== -1);\n }\n}\n//# sourceMappingURL=cron.js.map","import { Cron } from './cron.js';\nconst secondConstraint = {\n min: 0,\n max: 59,\n};\nconst minuteConstraint = {\n min: 0,\n max: 59,\n};\nconst hourConstraint = {\n min: 0,\n max: 23,\n};\nconst dayConstraint = {\n min: 1,\n max: 31,\n};\nconst monthConstraint = {\n min: 1,\n max: 12,\n aliases: {\n jan: '1',\n feb: '2',\n mar: '3',\n apr: '4',\n may: '5',\n jun: '6',\n jul: '7',\n aug: '8',\n sep: '9',\n oct: '10',\n nov: '11',\n dec: '12',\n },\n};\nconst weekdayConstraint = {\n min: 0,\n max: 7,\n aliases: {\n mon: '1',\n tue: '2',\n wed: '3',\n thu: '4',\n fri: '5',\n sat: '6',\n sun: '7',\n },\n};\nconst timeNicknames = {\n '@yearly': '0 0 1 1 *',\n '@annually': '0 0 1 1 *',\n '@monthly': '0 0 1 * *',\n '@weekly': '0 0 * * 0',\n '@daily': '0 0 * * *',\n '@hourly': '0 * * * *',\n '@minutely': '* * * * *',\n};\nfunction parseElement(element, constraint) {\n const result = new Set();\n // If returned set of numbers is empty, the scheduler class interpretes the emtpy set of numbers as all valid values of the constraint\n if (element === '*') {\n for (let i = constraint.min; i <= constraint.max; i = i + 1) {\n result.add(i);\n }\n return result;\n }\n // If the element is a list, parse each element in the list.\n const listElements = element.split(',');\n if (listElements.length > 1) {\n for (const listElement of listElements) {\n const parsedListElement = parseElement(listElement, constraint);\n for (const x of parsedListElement) {\n result.add(x);\n }\n }\n return result;\n }\n // Helper function to parse a single element, which includes checking for alias, valid number and constraint min and max.\n const parseSingleElement = (singleElement) => {\n var _a, _b;\n singleElement =\n (_b = (_a = constraint.aliases) === null || _a === void 0 ? void 0 : _a[singleElement.toLowerCase()]) !== null && _b !== void 0 ? _b : singleElement;\n const parsedElement = Number.parseInt(singleElement, 10);\n if (Number.isNaN(parsedElement)) {\n throw new Error(`Failed to parse ${element}: ${singleElement} is NaN.`);\n }\n if (parsedElement < constraint.min || parsedElement > constraint.max) {\n throw new Error(`Failed to parse ${element}: ${singleElement} is outside of constraint range of ${constraint.min} - ${constraint.max}.`);\n }\n return parsedElement;\n };\n // Detect if the element is a range.\n // Possible range formats: 'start-end', 'start-end/step', '*', '*/step'.\n // Where start and end can be numbers or aliases.\n // Capture groups: 1: start-end, 2: start, 3: end, 4: /step, 5: step.\n const rangeSegments = /^(([0-9a-zA-Z]+)-([0-9a-zA-Z]+)|\\*)(\\/([0-9]+))?$/.exec(element);\n // If not, it must be a single element.\n if (rangeSegments === null) {\n result.add(parseSingleElement(element));\n return result;\n }\n // If it is a range, get start and end of the range.\n let parsedStart = rangeSegments[1] === '*'\n ? constraint.min\n : parseSingleElement(rangeSegments[2]);\n const parsedEnd = rangeSegments[1] === '*'\n ? constraint.max\n : parseSingleElement(rangeSegments[3]);\n // need to catch Sunday, which gets parsed here as 7, but is also legitimate at the start of a range as 0, to avoid the out of order error\n if (constraint === weekdayConstraint &&\n parsedStart === 7 &&\n // this check ensures that sun-sun is not incorrectly parsed as [0,1,2,3,4,5,6]\n parsedEnd !== 7) {\n parsedStart = 0;\n }\n if (parsedStart > parsedEnd) {\n throw new Error(`Failed to parse ${element}: Invalid range (start: ${parsedStart}, end: ${parsedEnd}).`);\n }\n // Check whether there is a custom step defined for the range, defaulting to 1.\n const step = rangeSegments[5];\n let parsedStep = 1;\n if (step !== undefined) {\n parsedStep = Number.parseInt(step, 10);\n if (Number.isNaN(parsedStep)) {\n throw new Error(`Failed to parse step: ${step} is NaN.`);\n }\n if (parsedStep < 1) {\n throw new Error(`Failed to parse step: Expected ${step} to be greater than 0.`);\n }\n }\n // Go from start to end of the range by the given steps.\n for (let i = parsedStart; i <= parsedEnd; i = i + parsedStep) {\n result.add(i);\n }\n return result;\n}\n/** Parses a cron expression into a Cron instance. */\nexport function parseCronExpression(cronExpression) {\n var _a;\n if (typeof cronExpression !== 'string') {\n throw new TypeError('Invalid cron expression: must be of type string.');\n }\n // Convert time nicknames.\n cronExpression = (_a = timeNicknames[cronExpression.toLowerCase()]) !== null && _a !== void 0 ? _a : cronExpression;\n // Split the cron expression into its elements, removing empty elements (extra whitespaces).\n const elements = cronExpression.split(' ').filter((elem) => elem.length > 0);\n if (elements.length < 5 || elements.length > 6) {\n throw new Error('Invalid cron expression: expected 5 or 6 elements.');\n }\n const rawSeconds = elements.length === 6 ? elements[0] : '0';\n const rawMinutes = elements.length === 6 ? elements[1] : elements[0];\n const rawHours = elements.length === 6 ? elements[2] : elements[1];\n const rawDays = elements.length === 6 ? elements[3] : elements[2];\n const rawMonths = elements.length === 6 ? elements[4] : elements[3];\n const rawWeekdays = elements.length === 6 ? elements[5] : elements[4];\n return new Cron({\n seconds: parseElement(rawSeconds, secondConstraint),\n minutes: parseElement(rawMinutes, minuteConstraint),\n hours: parseElement(rawHours, hourConstraint),\n days: parseElement(rawDays, dayConstraint),\n // months in cron are indexed by 1, but Cron expects indexes by 0, so we need to reduce all set values by one.\n months: new Set(Array.from(parseElement(rawMonths, monthConstraint)).map((x) => x - 1)),\n weekdays: new Set(Array.from(parseElement(rawWeekdays, weekdayConstraint)).map((x) => x % 7)),\n });\n}\n//# sourceMappingURL=cron-parser.js.map","import { $hook, $inject, Alepha } from \"alepha\";\nimport { type DateTime, DateTimeProvider } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { type Cron, parseCronExpression } from \"cron-schedule\";\n\nexport class CronProvider {\n protected readonly dt = $inject(DateTimeProvider);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly cronJobs: Array<CronJob> = [];\n\n public getCronJobs(): Array<CronJob> {\n return this.cronJobs;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => {\n if (this.alepha.isServerless()) {\n this.log.info(\"Ignoring cron jobs in serverless environment\");\n return;\n }\n\n for (const cron of this.cronJobs) {\n if (!cron.running) {\n cron.running = true;\n this.log.debug(\n `Starting cron task '${cron.name}' with '${cron.expression}'`,\n );\n this.run(cron);\n }\n }\n },\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => {\n for (const cron of this.cronJobs) {\n this.abort(cron);\n }\n },\n });\n\n protected boot(name: string | CronJob) {\n const cron =\n typeof name === \"string\"\n ? this.cronJobs.find((c) => c.name === name)\n : name;\n\n if (!cron) {\n return;\n }\n\n cron.running = true;\n\n this.log.debug(\n `Starting cron task '${cron.name}' with '${cron.expression}'`,\n );\n\n this.run(cron);\n }\n\n public abort(name: string | CronJob): void {\n const cron =\n typeof name === \"string\"\n ? this.cronJobs.find((c) => c.name === name)\n : name;\n\n if (!cron || !cron.running) {\n return;\n }\n\n cron.running = false;\n cron.abort?.abort();\n this.log.debug(`Cron task '${cron.name}' stopped`);\n }\n\n /**\n * Registers a cron job.\n *\n * It's automatically done when using the `$scheduler` primitive but can also be used manually.\n */\n public createCronJob(\n name: string,\n expression: string,\n handler: (context: { now: DateTime }) => Promise<void>,\n start?: boolean,\n ): void {\n const cron: CronJob = {\n name,\n cron: parseCronExpression(expression),\n expression,\n handler,\n loop: true,\n abort: new AbortController(),\n };\n\n this.cronJobs.push(cron);\n\n if (start && this.alepha.isStarted()) {\n this.boot(cron);\n }\n }\n\n protected run(task: CronJob, now = this.dt.now()): void {\n if (!task.running) {\n return;\n }\n\n const [next] = task.cron.getNextDates(1, now.toDate());\n if (!next) {\n return;\n }\n\n const duration = next.getTime() - now.toDate().getTime();\n const abort = new AbortController();\n task.abort = abort;\n\n this.dt\n .wait(duration, {\n now: now.valueOf(),\n signal: abort.signal,\n })\n .then(() => {\n if (!task.running) {\n this.log.trace(\"Cron task stopped before execution\");\n return;\n }\n\n this.log.trace(\"Running cron task\");\n\n if (task.executing) {\n this.log.warn(\n `Cron task '${task.name}' is still running, skipping this invocation`,\n );\n if (task.loop) {\n this.run(task, this.dt.of(next));\n }\n return;\n }\n\n task.executing = true;\n task\n .handler({ now: this.dt.of(next) })\n .catch((err) => {\n if (task.onError) {\n task.onError(err);\n } else {\n this.log.error(\"Error in cron task:\", err);\n }\n })\n .finally(() => {\n task.executing = false;\n });\n\n if (task.loop) {\n this.run(task, this.dt.of(next));\n }\n })\n .catch((err) => {\n this.log.warn(\"Issue during cron waiting timer\", err as Error);\n });\n }\n\n /**\n * Trigger a specific cron job by name.\n */\n public async trigger(name: string): Promise<void> {\n const job = this.cronJobs.find((j) => j.name === name);\n if (!job) {\n this.log.warn(`Cron job '${name}' not found`);\n return;\n }\n await this.runJobs([job], this.dt.now());\n }\n\n /**\n * Trigger all registered cron jobs.\n */\n public async triggerAll(): Promise<void> {\n await this.runJobs(this.cronJobs, this.dt.now());\n }\n\n /**\n * Run multiple cron jobs in parallel.\n */\n protected async runJobs(jobs: CronJob[], now: DateTime): Promise<void> {\n const results = await Promise.allSettled(\n jobs.map(async (job) => {\n this.log.debug(`Running cron job '${job.name}'`);\n try {\n await job.handler({ now });\n this.log.debug(`Cron job '${job.name}' completed`);\n } catch (error) {\n this.log.error(`Cron job '${job.name}' failed`, error);\n throw error;\n }\n }),\n );\n\n const failures = results.filter((r) => r.status === \"rejected\");\n if (failures.length > 0) {\n this.log.error(`${failures.length}/${jobs.length} cron jobs failed`);\n }\n }\n}\n\nexport interface CronJob {\n name: string;\n expression: string;\n handler: (context: { now: DateTime }) => Promise<void>;\n cron: Cron;\n loop: boolean;\n running?: boolean;\n executing?: boolean;\n onError?: (error: Error) => void;\n abort?: AbortController;\n}\n","import {\n $atom,\n $inject,\n $pipeline,\n $state,\n Alepha,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $lock } from \"alepha/lock\";\nimport { $logger } from \"alepha/logger\";\nimport { CronProvider } from \"../providers/CronProvider.ts\";\n\n/**\n * Scheduler primitive.\n */\nexport const $scheduler = (\n options: SchedulerPrimitiveOptions,\n): SchedulerPrimitive => {\n return createPrimitive(SchedulerPrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport type SchedulerPrimitiveOptions = {\n /**\n * Function to run on schedule.\n */\n handler: (args: SchedulerHandlerArguments) => Async<void>;\n\n /**\n * Name of the scheduler. Defaults to the function name.\n */\n name?: string;\n\n /**\n * Optional description of the scheduler.\n */\n description?: string;\n\n /**\n * Cron expression or interval to run the scheduler.\n */\n cron?: string;\n\n /**\n * Cron expression or interval to run the scheduler.\n */\n interval?: DurationLike;\n\n /**\n * If true, the scheduler will be locked and only one instance will run at a time.\n * You probably need to import {@link AlephaLockRedis} for distributed locking.\n *\n * @default true\n */\n lock?: boolean;\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Scheduler configuration atom.\n */\nexport const schedulerOptions = $atom({\n name: \"alepha.scheduler.options\",\n schema: t.object({\n prefix: t.optional(\n t.text({\n description: \"Prefix for scheduler lock keys.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type SchedulerAtomOptions = Static<typeof schedulerOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [schedulerOptions.key]: SchedulerAtomOptions;\n }\n}\n\nexport class SchedulerPrimitive extends Primitive<SchedulerPrimitiveOptions> {\n protected readonly log = $logger();\n protected readonly settings = $state(schedulerOptions);\n protected readonly alepha = $inject(Alepha);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly cronProvider = $inject(CronProvider);\n\n public get name(): string {\n return (\n this.options.name ??\n `${this.config.service.name}.${this.config.propertyKey}`\n );\n }\n\n protected onInit() {\n if (this.options.interval) {\n this.dateTimeProvider.createInterval(\n () => this.trigger(),\n this.options.interval,\n );\n }\n if (this.options.cron) {\n this.cronProvider.createCronJob(this.name, this.options.cron, () =>\n this.trigger(),\n );\n }\n }\n\n public async trigger(): Promise<void> {\n if (!this.alepha.isStarted()) {\n return;\n }\n\n const context = this.alepha.context.createContextId();\n\n await this.alepha.context.run(\n async () => {\n try {\n const now = this.dateTimeProvider.now();\n\n await this.alepha.events.emit(\"scheduler:begin\", {\n name: this.name,\n now,\n context,\n });\n\n if (this.options.lock !== false) {\n await this.schedulerLock.run({ now });\n } else {\n await this.options.handler({ now });\n }\n\n await this.alepha.events.emit(\n \"scheduler:success\",\n {\n name: this.name,\n context,\n },\n {\n catch: true,\n },\n );\n } catch (error) {\n await this.alepha.events.emit(\n \"scheduler:error\",\n {\n name: this.name,\n error: error as Error,\n context,\n },\n {\n catch: true,\n },\n );\n\n this.log.error(\"Error running scheduler:\", error);\n }\n\n await this.alepha.events.emit(\n \"scheduler:end\",\n {\n name: this.name,\n context,\n },\n {\n catch: true,\n },\n );\n },\n {\n context,\n },\n );\n }\n\n protected schedulerLock = $pipeline({\n use: [\n $lock({\n name: () => {\n const prefix = this.settings.prefix ? `${this.settings.prefix}:` : \"\";\n return `${prefix}scheduler:${this.name}`;\n },\n }),\n ],\n handler: async (args: SchedulerHandlerArguments) => {\n await this.options.handler(args);\n },\n });\n}\n\n$scheduler[KIND] = SchedulerPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SchedulerHandlerArguments {\n now: DateTime;\n}\n","import { $hook } from \"alepha\";\nimport type { DateTime } from \"alepha/datetime\";\nimport { parseCronExpression } from \"cron-schedule\";\nimport { CronProvider } from \"./CronProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Cloudflare Workers scheduled event.\n *\n * Emitted when a cron trigger fires in Cloudflare Workers.\n */\n \"cloudflare:scheduled\": {\n cron: string;\n scheduledTime: number;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Cloudflare Workers cron provider.\n *\n * This provider handles scheduled events from Cloudflare Workers Cron Triggers.\n * Unlike the Node.js CronProvider, this doesn't use intervals/timeouts - instead,\n * it reacts to scheduled events triggered by Cloudflare.\n *\n * **Usage:**\n * 1. Define schedulers with `$scheduler({ cron: \"0 * * * *\", handler: ... })`\n * 2. Build your app with `alepha build` - cron triggers are automatically added to `wrangler.jsonc`\n * 3. Deploy to Cloudflare Workers\n *\n * **How it works:**\n * - During build, all registered `$scheduler` cron expressions are collected\n * - The build generates `wrangler.jsonc` with `triggers.crons` automatically filled\n * - When Cloudflare fires a cron trigger, the `scheduled` handler emits `cloudflare:scheduled`\n * - This provider listens to that event and runs matching schedulers\n *\n * @see https://developers.cloudflare.com/workers/configuration/cron-triggers/\n */\nexport class WorkerdCronProvider extends CronProvider {\n /**\n * Override to avoid creating AbortController in global scope.\n * Cloudflare Workers doesn't allow this during initialization.\n */\n public override createCronJob(\n name: string,\n expression: string,\n handler: (context: { now: DateTime }) => Promise<void>,\n ): void {\n this.cronJobs.push({\n name,\n cron: parseCronExpression(expression),\n expression,\n handler,\n loop: false,\n });\n }\n\n /**\n * Handle a scheduled event from Cloudflare Workers.\n */\n protected readonly onScheduledEvent = $hook({\n on: \"cloudflare:scheduled\",\n handler: async (event) => {\n const now = this.dt.of(event.scheduledTime);\n\n this.log.info(\"Received scheduled event\", {\n cron: event.cron,\n scheduledTime: now.format(),\n });\n\n // Find jobs that match this cron expression\n const matchingJobs = this.cronJobs.filter(\n (job) => job.expression === event.cron,\n );\n\n if (matchingJobs.length === 0) {\n // No exact match - try to find jobs that would fire at this time\n const matchingByTime = this.cronJobs.filter((job) =>\n job.cron.matchDate(now.toDate()),\n );\n\n if (matchingByTime.length > 0) {\n this.log.debug(\n `No exact cron match for '${event.cron}', found ${matchingByTime.length} jobs matching by time`,\n );\n await this.runJobs(matchingByTime, now);\n return;\n }\n\n this.log.warn(`No cron jobs found for expression '${event.cron}'`);\n return;\n }\n\n await this.runJobs(matchingJobs, now);\n },\n });\n}\n","export const CRON = {\n EVERY_MINUTE: \"* * * * *\",\n EVERY_5_MINUTES: \"*/5 * * * *\",\n EVERY_15_MINUTES: \"*/15 * * * *\",\n EVERY_30_MINUTES: \"*/30 * * * *\",\n EVERY_HOUR: \"0 * * * *\",\n EVERY_DAY_AT_MIDNIGHT: \"0 0 * * *\",\n};\n","import { $module } from \"alepha\";\nimport { AlephaLock } from \"alepha/lock\";\nimport { $scheduler } from \"./primitives/$scheduler.ts\";\nimport { CronProvider } from \"./providers/CronProvider.ts\";\nimport { WorkerdCronProvider } from \"./providers/WorkerdCronProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./constants/CRON.ts\";\nexport * from \"./primitives/$scheduler.ts\";\nexport * from \"./providers/CronProvider.ts\";\nexport * from \"./providers/WorkerdCronProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n interface Hooks {\n /**\n * Cloudflare Workers scheduled event.\n *\n * Emitted when a cron trigger fires in Cloudflare Workers.\n */\n \"cloudflare:scheduled\": {\n cron: string;\n scheduledTime: number;\n };\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaScheduler = $module({\n name: \"alepha.scheduler\",\n primitives: [$scheduler],\n services: [AlephaLock, CronProvider, WorkerdCronProvider],\n register: (alepha) =>\n // Replace CronProvider with WorkerdCronProvider for Cloudflare Workers\n alepha.with({\n provide: CronProvider,\n use: WorkerdCronProvider,\n }),\n});\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ const userAccountInfoSchema = t.object({
|
|
|
11
11
|
username: t.optional(t.text({ description: "Preferred username of the user." })),
|
|
12
12
|
picture: t.optional(t.text({ description: "URL to the user's profile picture." })),
|
|
13
13
|
sessionId: t.optional(t.text({ description: "Session identifier for the user, if applicable." })),
|
|
14
|
-
|
|
14
|
+
organization: t.optional(t.uuid({ description: "Organization the user belongs to." })),
|
|
15
15
|
roles: t.optional(t.array(t.text(), { description: "List of roles assigned to the user." })),
|
|
16
16
|
realm: t.optional(t.text({ description: "The realm (issuer) the user was authenticated from." }))
|
|
17
17
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.js","names":[],"sources":["../../src/security/schemas/userAccountInfoSchema.ts","../../src/security/atoms/currentUserAtom.ts","../../src/security/errors/InvalidCredentialsError.ts","../../src/security/errors/InvalidPermissionError.ts","../../src/security/errors/SecurityError.ts","../../src/security/primitives/$secure.browser.ts","../../src/security/schemas/permissionSchema.ts","../../src/security/schemas/roleSchema.ts","../../src/security/index.browser.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const userAccountInfoSchema = t.object({\n id: t.text({\n description: \"Unique identifier for the user.\",\n }),\n\n name: t.optional(\n t.text({\n description: \"Full name of the user.\",\n }),\n ),\n\n email: t.optional(\n t.text({\n description: \"Email address of the user.\",\n format: \"email\",\n }),\n ),\n\n username: t.optional(\n t.text({\n description: \"Preferred username of the user.\",\n }),\n ),\n\n picture: t.optional(\n t.text({\n description: \"URL to the user's profile picture.\",\n }),\n ),\n\n sessionId: t.optional(\n t.text({\n description: \"Session identifier for the user, if applicable.\",\n }),\n ),\n\n // -------------------------------------------------------------------------------------------------------------------\n\n organizations: t.optional(\n t.array(t.text(), {\n description: \"List of organizations the user belongs to.\",\n }),\n ),\n\n roles: t.optional(\n t.array(t.text(), {\n description: \"List of roles assigned to the user.\",\n }),\n ),\n\n realm: t.optional(\n t.text({\n description: \"The realm (issuer) the user was authenticated from.\",\n }),\n ),\n});\n\nexport type UserAccount = Static<typeof userAccountInfoSchema>;\n","import { $atom, t } from \"alepha\";\nimport { userAccountInfoSchema } from \"../schemas/userAccountInfoSchema.ts\";\n\n/**\n * Atom storing the current authenticated user.\n *\n * Transport-agnostic — works with HTTP, MCP, pipelines, jobs, and any context\n * that sets the atom before calling secured logic.\n */\nexport const currentUserAtom = $atom({\n name: \"alepha.security.user\",\n schema: t.optional(userAccountInfoSchema),\n});\n","import { UnauthorizedError } from \"alepha/server\";\n\n/**\n * Error thrown when the provided credentials are invalid.\n *\n * Message can not be changed to avoid leaking information.\n * Cause is omitted for the same reason.\n */\nexport class InvalidCredentialsError extends UnauthorizedError {\n readonly name = \"UnauthorizedError\";\n constructor() {\n super(\"Invalid credentials\");\n }\n}\n","export class InvalidPermissionError extends Error {\n constructor(name: string) {\n super(`Permission '${name}' is invalid`);\n }\n}\n","export class SecurityError extends Error {\n public name = \"SecurityError\";\n public readonly status = 403;\n}\n","import { createMiddleware, type Middleware } from \"alepha\";\nimport { currentUserAtom } from \"../atoms/currentUserAtom.ts\";\nimport type { UserAccountToken } from \"../interfaces/UserAccountToken.ts\";\nimport type { SecureOptions } from \"./$secure.ts\";\n\nexport type { SecureOptions };\n\n/**\n * Browser-side middleware that enforces authentication and authorization.\n *\n * Resolves the user from `currentUserAtom` only (no HTTP header resolution).\n * Checks roles from the user object and permissions from the user's roles.\n *\n * In the browser, an unauthenticated or unauthorized user is not an exception —\n * the middleware short-circuits by returning `undefined` and the handler is not called.\n * Components should use `action.can()` to conditionally render UI elements.\n *\n * ```typescript\n * class OrderController {\n * getOrders = $action({\n * use: [$secure()],\n * handler: async ({ query }) => { ... },\n * });\n *\n * deleteOrder = $action({\n * use: [$secure({ permissions: [\"orders:delete\"] })],\n * handler: async ({ params }) => { ... },\n * });\n * }\n * ```\n */\nexport function $secure(options?: SecureOptions): Middleware {\n return createMiddleware({\n name: \"$secure\",\n options: (options as unknown as Record<string, unknown>) ?? undefined,\n handler: ({ alepha, next }) => {\n return async (...args: any[]) => {\n const user: UserAccountToken | undefined =\n alepha.store.get(currentUserAtom);\n\n if (!user) {\n return undefined;\n }\n\n // Issuer check\n if (options?.issuers?.length) {\n if (!user.realm || !options.issuers.includes(user.realm)) {\n return undefined;\n }\n }\n\n // Role check\n if (options?.roles?.length) {\n const hasRole = options.roles.some((role) =>\n user.roles?.includes(role),\n );\n if (!hasRole) {\n return undefined;\n }\n }\n\n // Permission check (browser-side: check against user roles)\n // Server-side permissions are enforced by the API — the browser version\n // trusts that the API registry already filtered actions by permission.\n\n // Custom guard\n if (options?.guard) {\n if (!options.guard(user)) {\n return undefined;\n }\n }\n\n return next(...args);\n };\n },\n });\n}\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const permissionSchema = t.object({\n name: t.text({\n description: \"Name of the permission.\",\n }),\n\n group: t.optional(\n t.text({\n description: \"Group of the permission.\",\n }),\n ),\n\n description: t.optional(\n t.text({\n description: \"Describe the permission.\",\n }),\n ),\n\n // HTTP Only\n\n method: t.optional(\n t.text({\n description: \"HTTP method of the permission. When available.\",\n }),\n ),\n\n path: t.optional(\n t.text({\n description: \"Pathname of the permission. When available.\",\n }),\n ),\n});\n\nexport type Permission = Static<typeof permissionSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const roleSchema = t.object({\n name: t.text({\n description: \"Name of the role.\",\n }),\n\n description: t.optional(\n t.text({\n description: \"Describe the role.\",\n }),\n ),\n\n default: t.optional(\n t.boolean({\n description:\n \"If true, this role will be assigned to all users by default.\",\n }),\n ),\n\n permissions: t.array(\n t.object({\n name: t.text({\n description: \"Name of the permission.\",\n }),\n ownership: t.optional(\n t.boolean({\n description:\n \"If true, user will only have access to it's own resources.\",\n }),\n ),\n exclude: t.optional(\n t.array(t.text(), {\n description:\n \"Exclude some permissions. Useful when 'name' is a wildcard.\",\n }),\n ),\n }),\n ),\n});\n\nexport type Role = Static<typeof roleSchema>;\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/currentUserAtom.ts\";\nexport * from \"./errors/InvalidCredentialsError.ts\";\nexport * from \"./errors/InvalidPermissionError.ts\";\nexport * from \"./errors/SecurityError.ts\";\nexport * from \"./interfaces/UserAccountToken.ts\";\nexport * from \"./primitives/$secure.browser.ts\";\nexport * from \"./schemas/permissionSchema.ts\";\nexport * from \"./schemas/roleSchema.ts\";\nexport * from \"./schemas/userAccountInfoSchema.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaSecurity = $module({\n name: \"alepha.security\",\n});\n"],"mappings":";;;AAGA,MAAa,wBAAwB,EAAE,OAAO;CAC5C,IAAI,EAAE,KAAK,EACT,aAAa,mCACd,CAAC;CAEF,MAAM,EAAE,SACN,EAAE,KAAK,EACL,aAAa,0BACd,CAAC,CACH;CAED,OAAO,EAAE,SACP,EAAE,KAAK;EACL,aAAa;EACb,QAAQ;EACT,CAAC,CACH;CAED,UAAU,EAAE,SACV,EAAE,KAAK,EACL,aAAa,mCACd,CAAC,CACH;CAED,SAAS,EAAE,SACT,EAAE,KAAK,EACL,aAAa,sCACd,CAAC,CACH;CAED,WAAW,EAAE,SACX,EAAE,KAAK,EACL,aAAa,mDACd,CAAC,CACH;CAID,eAAe,EAAE,SACf,EAAE,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,8CACd,CAAC,CACH;CAED,OAAO,EAAE,SACP,EAAE,MAAM,EAAE,MAAM,EAAE,EAChB,aAAa,uCACd,CAAC,CACH;CAED,OAAO,EAAE,SACP,EAAE,KAAK,EACL,aAAa,uDACd,CAAC,CACH;CACF,CAAC;;;;;;;;;ACjDF,MAAa,kBAAkB,MAAM;CACnC,MAAM;CACN,QAAQ,EAAE,SAAS,sBAAsB;CAC1C,CAAC;;;;;;;;;ACJF,IAAa,0BAAb,cAA6C,kBAAkB;CAC7D,OAAgB;CAChB,cAAc;AACZ,QAAM,sBAAsB;;;;;ACXhC,IAAa,yBAAb,cAA4C,MAAM;CAChD,YAAY,MAAc;AACxB,QAAM,eAAe,KAAK,cAAc;;;;;ACF5C,IAAa,gBAAb,cAAmC,MAAM;CACvC,OAAc;CACd,SAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC6B3B,SAAgB,QAAQ,SAAqC;AAC3D,QAAO,iBAAiB;EACtB,MAAM;EACN,SAAU,WAAkD,KAAA;EAC5D,UAAU,EAAE,QAAQ,WAAW;AAC7B,UAAO,OAAO,GAAG,SAAgB;IAC/B,MAAM,OACJ,OAAO,MAAM,IAAI,gBAAgB;AAEnC,QAAI,CAAC,KACH;AAIF,QAAI,SAAS,SAAS;SAChB,CAAC,KAAK,SAAS,CAAC,QAAQ,QAAQ,SAAS,KAAK,MAAM,CACtD;;AAKJ,QAAI,SAAS,OAAO;SAId,CAHY,QAAQ,MAAM,MAAM,SAClC,KAAK,OAAO,SAAS,KAAK,CAC3B,CAEC;;AASJ,QAAI,SAAS;SACP,CAAC,QAAQ,MAAM,KAAK,CACtB;;AAIJ,WAAO,KAAK,GAAG,KAAK;;;EAGzB,CAAC;;;;ACxEJ,MAAa,mBAAmB,EAAE,OAAO;CACvC,MAAM,EAAE,KAAK,EACX,aAAa,2BACd,CAAC;CAEF,OAAO,EAAE,SACP,EAAE,KAAK,EACL,aAAa,4BACd,CAAC,CACH;CAED,aAAa,EAAE,SACb,EAAE,KAAK,EACL,aAAa,4BACd,CAAC,CACH;CAID,QAAQ,EAAE,SACR,EAAE,KAAK,EACL,aAAa,kDACd,CAAC,CACH;CAED,MAAM,EAAE,SACN,EAAE,KAAK,EACL,aAAa,+CACd,CAAC,CACH;CACF,CAAC;;;AC9BF,MAAa,aAAa,EAAE,OAAO;CACjC,MAAM,EAAE,KAAK,EACX,aAAa,qBACd,CAAC;CAEF,aAAa,EAAE,SACb,EAAE,KAAK,EACL,aAAa,sBACd,CAAC,CACH;CAED,SAAS,EAAE,SACT,EAAE,QAAQ,EACR,aACE,gEACH,CAAC,CACH;CAED,aAAa,EAAE,MACb,EAAE,OAAO;EACP,MAAM,EAAE,KAAK,EACX,aAAa,2BACd,CAAC;EACF,WAAW,EAAE,SACX,EAAE,QAAQ,EACR,aACE,8DACH,CAAC,CACH;EACD,SAAS,EAAE,SACT,EAAE,MAAM,EAAE,MAAM,EAAE,EAChB,aACE,+DACH,CAAC,CACH;EACF,CAAC,CACH;CACF,CAAC;;;ACxBF,MAAa,iBAAiB,QAAQ,EACpC,MAAM,mBACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.browser.js","names":[],"sources":["../../src/security/schemas/userAccountInfoSchema.ts","../../src/security/atoms/currentUserAtom.ts","../../src/security/errors/InvalidCredentialsError.ts","../../src/security/errors/InvalidPermissionError.ts","../../src/security/errors/SecurityError.ts","../../src/security/primitives/$secure.browser.ts","../../src/security/schemas/permissionSchema.ts","../../src/security/schemas/roleSchema.ts","../../src/security/index.browser.ts"],"sourcesContent":["import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const userAccountInfoSchema = t.object({\n id: t.text({\n description: \"Unique identifier for the user.\",\n }),\n\n name: t.optional(\n t.text({\n description: \"Full name of the user.\",\n }),\n ),\n\n email: t.optional(\n t.text({\n description: \"Email address of the user.\",\n format: \"email\",\n }),\n ),\n\n username: t.optional(\n t.text({\n description: \"Preferred username of the user.\",\n }),\n ),\n\n picture: t.optional(\n t.text({\n description: \"URL to the user's profile picture.\",\n }),\n ),\n\n sessionId: t.optional(\n t.text({\n description: \"Session identifier for the user, if applicable.\",\n }),\n ),\n\n // -------------------------------------------------------------------------------------------------------------------\n\n organization: t.optional(\n t.uuid({\n description: \"Organization the user belongs to.\",\n }),\n ),\n\n roles: t.optional(\n t.array(t.text(), {\n description: \"List of roles assigned to the user.\",\n }),\n ),\n\n realm: t.optional(\n t.text({\n description: \"The realm (issuer) the user was authenticated from.\",\n }),\n ),\n});\n\nexport type UserAccount = Static<typeof userAccountInfoSchema>;\n","import { $atom, t } from \"alepha\";\nimport { userAccountInfoSchema } from \"../schemas/userAccountInfoSchema.ts\";\n\n/**\n * Atom storing the current authenticated user.\n *\n * Transport-agnostic — works with HTTP, MCP, pipelines, jobs, and any context\n * that sets the atom before calling secured logic.\n */\nexport const currentUserAtom = $atom({\n name: \"alepha.security.user\",\n schema: t.optional(userAccountInfoSchema),\n});\n","import { UnauthorizedError } from \"alepha/server\";\n\n/**\n * Error thrown when the provided credentials are invalid.\n *\n * Message can not be changed to avoid leaking information.\n * Cause is omitted for the same reason.\n */\nexport class InvalidCredentialsError extends UnauthorizedError {\n readonly name = \"UnauthorizedError\";\n constructor() {\n super(\"Invalid credentials\");\n }\n}\n","export class InvalidPermissionError extends Error {\n constructor(name: string) {\n super(`Permission '${name}' is invalid`);\n }\n}\n","export class SecurityError extends Error {\n public name = \"SecurityError\";\n public readonly status = 403;\n}\n","import { createMiddleware, type Middleware } from \"alepha\";\nimport { currentUserAtom } from \"../atoms/currentUserAtom.ts\";\nimport type { UserAccountToken } from \"../interfaces/UserAccountToken.ts\";\nimport type { SecureOptions } from \"./$secure.ts\";\n\nexport type { SecureOptions };\n\n/**\n * Browser-side middleware that enforces authentication and authorization.\n *\n * Resolves the user from `currentUserAtom` only (no HTTP header resolution).\n * Checks roles from the user object and permissions from the user's roles.\n *\n * In the browser, an unauthenticated or unauthorized user is not an exception —\n * the middleware short-circuits by returning `undefined` and the handler is not called.\n * Components should use `action.can()` to conditionally render UI elements.\n *\n * ```typescript\n * class OrderController {\n * getOrders = $action({\n * use: [$secure()],\n * handler: async ({ query }) => { ... },\n * });\n *\n * deleteOrder = $action({\n * use: [$secure({ permissions: [\"orders:delete\"] })],\n * handler: async ({ params }) => { ... },\n * });\n * }\n * ```\n */\nexport function $secure(options?: SecureOptions): Middleware {\n return createMiddleware({\n name: \"$secure\",\n options: (options as unknown as Record<string, unknown>) ?? undefined,\n handler: ({ alepha, next }) => {\n return async (...args: any[]) => {\n const user: UserAccountToken | undefined =\n alepha.store.get(currentUserAtom);\n\n if (!user) {\n return undefined;\n }\n\n // Issuer check\n if (options?.issuers?.length) {\n if (!user.realm || !options.issuers.includes(user.realm)) {\n return undefined;\n }\n }\n\n // Role check\n if (options?.roles?.length) {\n const hasRole = options.roles.some((role) =>\n user.roles?.includes(role),\n );\n if (!hasRole) {\n return undefined;\n }\n }\n\n // Permission check (browser-side: check against user roles)\n // Server-side permissions are enforced by the API — the browser version\n // trusts that the API registry already filtered actions by permission.\n\n // Custom guard\n if (options?.guard) {\n if (!options.guard(user)) {\n return undefined;\n }\n }\n\n return next(...args);\n };\n },\n });\n}\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const permissionSchema = t.object({\n name: t.text({\n description: \"Name of the permission.\",\n }),\n\n group: t.optional(\n t.text({\n description: \"Group of the permission.\",\n }),\n ),\n\n description: t.optional(\n t.text({\n description: \"Describe the permission.\",\n }),\n ),\n\n // HTTP Only\n\n method: t.optional(\n t.text({\n description: \"HTTP method of the permission. When available.\",\n }),\n ),\n\n path: t.optional(\n t.text({\n description: \"Pathname of the permission. When available.\",\n }),\n ),\n});\n\nexport type Permission = Static<typeof permissionSchema>;\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const roleSchema = t.object({\n name: t.text({\n description: \"Name of the role.\",\n }),\n\n description: t.optional(\n t.text({\n description: \"Describe the role.\",\n }),\n ),\n\n default: t.optional(\n t.boolean({\n description:\n \"If true, this role will be assigned to all users by default.\",\n }),\n ),\n\n permissions: t.array(\n t.object({\n name: t.text({\n description: \"Name of the permission.\",\n }),\n ownership: t.optional(\n t.boolean({\n description:\n \"If true, user will only have access to it's own resources.\",\n }),\n ),\n exclude: t.optional(\n t.array(t.text(), {\n description:\n \"Exclude some permissions. Useful when 'name' is a wildcard.\",\n }),\n ),\n }),\n ),\n});\n\nexport type Role = Static<typeof roleSchema>;\n","import { $module } from \"alepha\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./atoms/currentUserAtom.ts\";\nexport * from \"./errors/InvalidCredentialsError.ts\";\nexport * from \"./errors/InvalidPermissionError.ts\";\nexport * from \"./errors/SecurityError.ts\";\nexport * from \"./interfaces/UserAccountToken.ts\";\nexport * from \"./primitives/$secure.browser.ts\";\nexport * from \"./schemas/permissionSchema.ts\";\nexport * from \"./schemas/roleSchema.ts\";\nexport * from \"./schemas/userAccountInfoSchema.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaSecurity = $module({\n name: \"alepha.security\",\n});\n"],"mappings":"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"}
|
package/dist/security/index.d.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import * as alepha from "alepha";
|
|
1
|
+
import * as _$alepha from "alepha";
|
|
2
2
|
import { Alepha, KIND, Middleware, Primitive, Static } from "alepha";
|
|
3
3
|
import { DateTimeProvider, Duration, DurationLike } from "alepha/datetime";
|
|
4
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
4
|
+
import * as _$alepha_logger0 from "alepha/logger";
|
|
5
5
|
import { SecretProvider } from "alepha/crypto";
|
|
6
6
|
import { FetchOptions, ServerRequest, UnauthorizedError } from "alepha/server";
|
|
7
7
|
export * from "alepha/crypto";
|
|
8
8
|
|
|
9
9
|
//#region ../../src/security/schemas/userAccountInfoSchema.d.ts
|
|
10
|
-
declare const userAccountInfoSchema: alepha.TObject<{
|
|
11
|
-
id: alepha.TString;
|
|
12
|
-
name: alepha.TOptional<alepha.TString>;
|
|
13
|
-
email: alepha.TOptional<alepha.TString>;
|
|
14
|
-
username: alepha.TOptional<alepha.TString>;
|
|
15
|
-
picture: alepha.TOptional<alepha.TString>;
|
|
16
|
-
sessionId: alepha.TOptional<alepha.TString>;
|
|
17
|
-
|
|
18
|
-
roles: alepha.TOptional<alepha.TArray<alepha.TString>>;
|
|
19
|
-
realm: alepha.TOptional<alepha.TString>;
|
|
10
|
+
declare const userAccountInfoSchema: _$alepha.TObject<{
|
|
11
|
+
id: _$alepha.TString;
|
|
12
|
+
name: _$alepha.TOptional<_$alepha.TString>;
|
|
13
|
+
email: _$alepha.TOptional<_$alepha.TString>;
|
|
14
|
+
username: _$alepha.TOptional<_$alepha.TString>;
|
|
15
|
+
picture: _$alepha.TOptional<_$alepha.TString>;
|
|
16
|
+
sessionId: _$alepha.TOptional<_$alepha.TString>;
|
|
17
|
+
organization: _$alepha.TOptional<_$alepha.TString>;
|
|
18
|
+
roles: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
|
|
19
|
+
realm: _$alepha.TOptional<_$alepha.TString>;
|
|
20
20
|
}>;
|
|
21
21
|
type UserAccount = Static<typeof userAccountInfoSchema>;
|
|
22
22
|
//#endregion
|
|
@@ -48,16 +48,16 @@ interface UserAccountToken extends UserAccount {
|
|
|
48
48
|
* Transport-agnostic — works with HTTP, MCP, pipelines, jobs, and any context
|
|
49
49
|
* that sets the atom before calling secured logic.
|
|
50
50
|
*/
|
|
51
|
-
declare const currentUserAtom: alepha.Atom<alepha.TOptional<alepha.TObject<{
|
|
52
|
-
id: alepha.TString;
|
|
53
|
-
name: alepha.TOptional<alepha.TString>;
|
|
54
|
-
email: alepha.TOptional<alepha.TString>;
|
|
55
|
-
username: alepha.TOptional<alepha.TString>;
|
|
56
|
-
picture: alepha.TOptional<alepha.TString>;
|
|
57
|
-
sessionId: alepha.TOptional<alepha.TString>;
|
|
58
|
-
|
|
59
|
-
roles: alepha.TOptional<alepha.TArray<alepha.TString>>;
|
|
60
|
-
realm: alepha.TOptional<alepha.TString>;
|
|
51
|
+
declare const currentUserAtom: _$alepha.Atom<_$alepha.TOptional<_$alepha.TObject<{
|
|
52
|
+
id: _$alepha.TString;
|
|
53
|
+
name: _$alepha.TOptional<_$alepha.TString>;
|
|
54
|
+
email: _$alepha.TOptional<_$alepha.TString>;
|
|
55
|
+
username: _$alepha.TOptional<_$alepha.TString>;
|
|
56
|
+
picture: _$alepha.TOptional<_$alepha.TString>;
|
|
57
|
+
sessionId: _$alepha.TOptional<_$alepha.TString>;
|
|
58
|
+
organization: _$alepha.TOptional<_$alepha.TString>;
|
|
59
|
+
roles: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
|
|
60
|
+
realm: _$alepha.TOptional<_$alepha.TString>;
|
|
61
61
|
}>>, "alepha.security.user">;
|
|
62
62
|
//#endregion
|
|
63
63
|
//#region ../../src/security/errors/InvalidCredentialsError.d.ts
|
|
@@ -459,7 +459,7 @@ interface JWTVerifyOptions extends VerifyOptions, JWTClaimVerificationOptions {}
|
|
|
459
459
|
* Provides utilities for working with JSON Web Tokens (JWT).
|
|
460
460
|
*/
|
|
461
461
|
declare class JwtProvider {
|
|
462
|
-
protected readonly log: alepha_logger0.Logger;
|
|
462
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
463
463
|
protected readonly keystore: KeyLoaderHolder[];
|
|
464
464
|
protected readonly dateTimeProvider: DateTimeProvider;
|
|
465
465
|
protected readonly encoder: TextEncoder;
|
|
@@ -510,7 +510,7 @@ interface ExtendedJWTPayload extends JWTPayload {
|
|
|
510
510
|
name?: string;
|
|
511
511
|
roles?: string[];
|
|
512
512
|
email?: string;
|
|
513
|
-
|
|
513
|
+
organization?: string;
|
|
514
514
|
realm_access?: {
|
|
515
515
|
roles: string[];
|
|
516
516
|
};
|
|
@@ -521,24 +521,24 @@ interface JwtParseResult {
|
|
|
521
521
|
}
|
|
522
522
|
//#endregion
|
|
523
523
|
//#region ../../src/security/schemas/permissionSchema.d.ts
|
|
524
|
-
declare const permissionSchema: alepha.TObject<{
|
|
525
|
-
name: alepha.TString;
|
|
526
|
-
group: alepha.TOptional<alepha.TString>;
|
|
527
|
-
description: alepha.TOptional<alepha.TString>;
|
|
528
|
-
method: alepha.TOptional<alepha.TString>;
|
|
529
|
-
path: alepha.TOptional<alepha.TString>;
|
|
524
|
+
declare const permissionSchema: _$alepha.TObject<{
|
|
525
|
+
name: _$alepha.TString;
|
|
526
|
+
group: _$alepha.TOptional<_$alepha.TString>;
|
|
527
|
+
description: _$alepha.TOptional<_$alepha.TString>;
|
|
528
|
+
method: _$alepha.TOptional<_$alepha.TString>;
|
|
529
|
+
path: _$alepha.TOptional<_$alepha.TString>;
|
|
530
530
|
}>;
|
|
531
531
|
type Permission = Static<typeof permissionSchema>;
|
|
532
532
|
//#endregion
|
|
533
533
|
//#region ../../src/security/schemas/roleSchema.d.ts
|
|
534
|
-
declare const roleSchema: alepha.TObject<{
|
|
535
|
-
name: alepha.TString;
|
|
536
|
-
description: alepha.TOptional<alepha.TString>;
|
|
537
|
-
default: alepha.TOptional<alepha.TBoolean>;
|
|
538
|
-
permissions: alepha.TArray<alepha.TObject<{
|
|
539
|
-
name: alepha.TString;
|
|
540
|
-
ownership: alepha.TOptional<alepha.TBoolean>;
|
|
541
|
-
exclude: alepha.TOptional<alepha.TArray<alepha.TString>>;
|
|
534
|
+
declare const roleSchema: _$alepha.TObject<{
|
|
535
|
+
name: _$alepha.TString;
|
|
536
|
+
description: _$alepha.TOptional<_$alepha.TString>;
|
|
537
|
+
default: _$alepha.TOptional<_$alepha.TBoolean>;
|
|
538
|
+
permissions: _$alepha.TArray<_$alepha.TObject<{
|
|
539
|
+
name: _$alepha.TString;
|
|
540
|
+
ownership: _$alepha.TOptional<_$alepha.TBoolean>;
|
|
541
|
+
exclude: _$alepha.TOptional<_$alepha.TArray<_$alepha.TString>>;
|
|
542
542
|
}>>;
|
|
543
543
|
}>;
|
|
544
544
|
type Role = Static<typeof roleSchema>;
|
|
@@ -548,7 +548,7 @@ declare class SecurityProvider {
|
|
|
548
548
|
protected readonly UNKNOWN_USER_NAME = "Anonymous User";
|
|
549
549
|
protected readonly PERMISSION_REGEXP: RegExp;
|
|
550
550
|
protected readonly PERMISSION_REGEXP_WILDCARD: RegExp;
|
|
551
|
-
protected readonly log: alepha_logger0.Logger;
|
|
551
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
552
552
|
protected readonly jwt: JwtProvider;
|
|
553
553
|
protected readonly alepha: Alepha;
|
|
554
554
|
protected readonly secretProvider: SecretProvider;
|
|
@@ -561,7 +561,7 @@ declare class SecurityProvider {
|
|
|
561
561
|
* The realms configured for the security provider.
|
|
562
562
|
*/
|
|
563
563
|
protected readonly realms: Realm[];
|
|
564
|
-
protected start: alepha.HookPrimitive<"start">;
|
|
564
|
+
protected start: _$alepha.HookPrimitive<"start">;
|
|
565
565
|
/**
|
|
566
566
|
* Creates a default JWT resolver for a realm.
|
|
567
567
|
*/
|
|
@@ -719,7 +719,7 @@ declare class SecurityProvider {
|
|
|
719
719
|
* @returns The name extracted from the payload, or an empty string if the payload is falsy or no name is found.
|
|
720
720
|
*/
|
|
721
721
|
getNameFromPayload(payload: Record<string, any>): string;
|
|
722
|
-
|
|
722
|
+
getOrganizationFromPayload(payload: Record<string, any>): string | undefined;
|
|
723
723
|
}
|
|
724
724
|
/**
|
|
725
725
|
* A realm definition.
|
|
@@ -830,7 +830,7 @@ declare class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
|
|
|
830
830
|
protected readonly securityProvider: SecurityProvider;
|
|
831
831
|
protected readonly dateTimeProvider: DateTimeProvider;
|
|
832
832
|
protected readonly jwt: JwtProvider;
|
|
833
|
-
protected readonly log: alepha_logger0.Logger;
|
|
833
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
834
834
|
get name(): string;
|
|
835
835
|
get accessTokenExpiration(): Duration;
|
|
836
836
|
get refreshTokenExpiration(): Duration;
|
|
@@ -1065,14 +1065,14 @@ interface ServiceAccountStore {
|
|
|
1065
1065
|
//#endregion
|
|
1066
1066
|
//#region ../../src/security/providers/ServerSecurityProvider.d.ts
|
|
1067
1067
|
declare class ServerSecurityProvider {
|
|
1068
|
-
protected readonly log: alepha_logger0.Logger;
|
|
1068
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
1069
1069
|
protected readonly securityProvider: SecurityProvider;
|
|
1070
1070
|
protected readonly jwtProvider: JwtProvider;
|
|
1071
1071
|
protected readonly alepha: Alepha;
|
|
1072
|
-
protected readonly onServerRequest: alepha.HookPrimitive<"server:onRequest">;
|
|
1073
|
-
protected readonly onActionRequest: alepha.HookPrimitive<"action:onRequest">;
|
|
1072
|
+
protected readonly onServerRequest: _$alepha.HookPrimitive<"server:onRequest">;
|
|
1073
|
+
protected readonly onActionRequest: _$alepha.HookPrimitive<"action:onRequest">;
|
|
1074
1074
|
protected createTestUser(): UserAccountToken;
|
|
1075
|
-
protected readonly onClientRequest: alepha.HookPrimitive<"client:onRequest">;
|
|
1075
|
+
protected readonly onClientRequest: _$alepha.HookPrimitive<"client:onRequest">;
|
|
1076
1076
|
}
|
|
1077
1077
|
type ServerSecurityUserResolver = (request: ServerRequest) => Promise<UserAccountToken | undefined>;
|
|
1078
1078
|
//#endregion
|
|
@@ -1132,7 +1132,7 @@ declare module "alepha/server" {
|
|
|
1132
1132
|
*
|
|
1133
1133
|
* @module alepha.security
|
|
1134
1134
|
*/
|
|
1135
|
-
declare const AlephaSecurity: alepha.Service<alepha.Module>;
|
|
1135
|
+
declare const AlephaSecurity: _$alepha.Service<_$alepha.Module>;
|
|
1136
1136
|
//#endregion
|
|
1137
1137
|
export { $basicAuth, $issuer, $permission, $role, $secure, $serviceAccount, AccessTokenResponse, AlephaSecurity, BasicAuthOptions, CreateTokenOptions, ExtendedJWTPayload, InvalidCredentialsError, InvalidPermissionError, IssuerExternal, IssuerInternal, IssuerPrimitive, IssuerPrimitiveOptions, IssuerResolver, IssuerSettings, JwtParseResult, JwtProvider, JwtSignOptions, KeyLoader, KeyLoaderHolder, Oauth2ServiceAccountPrimitiveOptions, Permission, PermissionPrimitive, PermissionPrimitiveOptions, Realm, Role, RolePrimitive, RolePrimitiveOptions, SecureOptions, SecurityCheckResult, SecurityError, SecurityProvider, ServerSecurityProvider, ServerSecurityUserResolver, ServiceAccountPrimitive, ServiceAccountPrimitiveOptions, ServiceAccountStore, UserAccount, UserAccountToken, UserInfo, currentUserAtom, permissionSchema, roleSchema, userAccountInfoSchema };
|
|
1138
1138
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["JWKParameters","kty","alg","key_ops","ext","use","x5c","x5t","x5u","kid","JWK_OKP_Public","crv","x","JWK_OKP_Private","d","JWK_AKP_Public","pub","JWK_AKP_Private","priv","JWK_EC_Public","y","JWK_EC_Private","JWK_RSA_Public","e","n","JWK_RSA_Private","dp","dq","p","q","qi","JWK_oct","k","JWK","GenericGetKeyFunction","IProtectedHeader","IToken","ReturnKeyTypes","Promise","protectedHeader","token","GetKeyFunction","CryptoKey","KeyObject","Uint8Array","FlattenedJWSInput","JWSHeaderParameters","header","payload","protected","signature","GeneralJWSInput","Omit","signatures","FlattenedJWS","Partial","GeneralJWS","JoseHeaderParameters","Pick","jku","jwk","typ","cty","b64","crit","propName","JWEKeyManagementHeaderParameters","apu","apv","p2c","p2s","iv","epk","FlattenedJWE","JWEHeaderParameters","aad","ciphertext","encrypted_key","tag","unprotected","GeneralJWE","recipients","enc","zip","CritOption","DecryptOptions","keyManagementAlgorithms","contentEncryptionAlgorithms","maxPBES2Count","maxDecompressedLength","EncryptOptions","JWTClaimVerificationOptions","Date","audience","clockTolerance","issuer","maxTokenAge","subject","currentDate","requiredClaims","VerifyOptions","algorithms","SignOptions","JWTPayload","iss","sub","aud","jti","nbf","exp","iat","FlattenedDecryptResult","additionalAuthenticatedData","plaintext","sharedUnprotectedHeader","unprotectedHeader","GeneralDecryptResult","CompactDecryptResult","CompactJWEHeaderParameters","FlattenedVerifyResult","GeneralVerifyResult","CompactVerifyResult","CompactJWSHeaderParameters","JWTVerifyResult","PayloadType","JWTHeaderParameters","JWTDecryptResult","ResolvedKey","key","JSONWebKeySet","keys","type","crypto","subtle","generateKey","ReturnType","Awaited","Extract","ProduceJWT","setIssuer","setSubject","setAudience","setJti","jwtId","setNotBefore","input","setExpirationTime","setIssuedAt","types","JWTVerifyOptions","VerifyOptions","JWTClaimVerificationOptions","JWTVerifyGetKey","JWTHeaderParameters","FlattenedJWSInput","CryptoKey","KeyObject","JWK","Uint8Array","GenericGetKeyFunction","jwtVerify","PayloadType","JWTPayload","JWTVerifyResult","Promise","jwt","key","options","ResolvedKey","getKey"],"sources":["../../src/security/schemas/userAccountInfoSchema.ts","../../src/security/interfaces/UserAccountToken.ts","../../src/security/atoms/currentUserAtom.ts","../../src/security/errors/InvalidCredentialsError.ts","../../src/security/errors/InvalidPermissionError.ts","../../src/security/errors/SecurityError.ts","../../src/security/interfaces/IssuerResolver.ts","../../src/security/primitives/$basicAuth.ts","../../../../node_modules/jose/dist/types/types.d.ts","../../../../node_modules/jose/dist/types/jwt/verify.d.ts","../../src/security/providers/JwtProvider.ts","../../src/security/schemas/permissionSchema.ts","../../src/security/schemas/roleSchema.ts","../../src/security/providers/SecurityProvider.ts","../../src/security/primitives/$issuer.ts","../../src/security/primitives/$permission.ts","../../src/security/primitives/$role.ts","../../src/security/primitives/$secure.ts","../../src/security/primitives/$serviceAccount.ts","../../src/security/providers/ServerSecurityProvider.ts","../../src/security/index.ts"],"x_google_ignoreList":[8,9],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["JWKParameters","kty","alg","key_ops","ext","use","x5c","x5t","x5u","kid","JWK_OKP_Public","crv","x","JWK_OKP_Private","d","JWK_AKP_Public","pub","JWK_AKP_Private","priv","JWK_EC_Public","y","JWK_EC_Private","JWK_RSA_Public","e","n","JWK_RSA_Private","dp","dq","p","q","qi","JWK_oct","k","JWK","GenericGetKeyFunction","IProtectedHeader","IToken","ReturnKeyTypes","Promise","protectedHeader","token","GetKeyFunction","CryptoKey","KeyObject","Uint8Array","FlattenedJWSInput","JWSHeaderParameters","header","payload","protected","signature","GeneralJWSInput","Omit","signatures","FlattenedJWS","Partial","GeneralJWS","JoseHeaderParameters","Pick","jku","jwk","typ","cty","b64","crit","propName","JWEKeyManagementHeaderParameters","apu","apv","p2c","p2s","iv","epk","FlattenedJWE","JWEHeaderParameters","aad","ciphertext","encrypted_key","tag","unprotected","GeneralJWE","recipients","enc","zip","CritOption","DecryptOptions","keyManagementAlgorithms","contentEncryptionAlgorithms","maxPBES2Count","maxDecompressedLength","EncryptOptions","JWTClaimVerificationOptions","Date","audience","clockTolerance","issuer","maxTokenAge","subject","currentDate","requiredClaims","VerifyOptions","algorithms","SignOptions","JWTPayload","iss","sub","aud","jti","nbf","exp","iat","FlattenedDecryptResult","additionalAuthenticatedData","plaintext","sharedUnprotectedHeader","unprotectedHeader","GeneralDecryptResult","CompactDecryptResult","CompactJWEHeaderParameters","FlattenedVerifyResult","GeneralVerifyResult","CompactVerifyResult","CompactJWSHeaderParameters","JWTVerifyResult","PayloadType","JWTHeaderParameters","JWTDecryptResult","ResolvedKey","key","JSONWebKeySet","keys","type","crypto","subtle","generateKey","ReturnType","Awaited","Extract","ProduceJWT","setIssuer","setSubject","setAudience","setJti","jwtId","setNotBefore","input","setExpirationTime","setIssuedAt","types","JWTVerifyOptions","VerifyOptions","JWTClaimVerificationOptions","JWTVerifyGetKey","JWTHeaderParameters","FlattenedJWSInput","CryptoKey","KeyObject","JWK","Uint8Array","GenericGetKeyFunction","jwtVerify","PayloadType","JWTPayload","JWTVerifyResult","Promise","jwt","key","options","ResolvedKey","getKey"],"sources":["../../src/security/schemas/userAccountInfoSchema.ts","../../src/security/interfaces/UserAccountToken.ts","../../src/security/atoms/currentUserAtom.ts","../../src/security/errors/InvalidCredentialsError.ts","../../src/security/errors/InvalidPermissionError.ts","../../src/security/errors/SecurityError.ts","../../src/security/interfaces/IssuerResolver.ts","../../src/security/primitives/$basicAuth.ts","../../../../node_modules/jose/dist/types/types.d.ts","../../../../node_modules/jose/dist/types/jwt/verify.d.ts","../../src/security/providers/JwtProvider.ts","../../src/security/schemas/permissionSchema.ts","../../src/security/schemas/roleSchema.ts","../../src/security/providers/SecurityProvider.ts","../../src/security/primitives/$issuer.ts","../../src/security/primitives/$permission.ts","../../src/security/primitives/$role.ts","../../src/security/primitives/$secure.ts","../../src/security/primitives/$serviceAccount.ts","../../src/security/providers/ServerSecurityProvider.ts","../../src/security/index.ts"],"x_google_ignoreList":[8,9],"mappings":"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"}
|