alepha 0.23.0 → 0.24.0
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/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/dist/api/audits/index.browser.js +49 -52
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +629 -565
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +206 -98
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +44 -44
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +292 -293
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +61 -64
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +61 -59
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +546 -347
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +165 -86
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +247 -235
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js +63 -66
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +40 -38
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +339 -209
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +108 -60
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +190 -78
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js +290 -68
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js +14 -14
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +158 -134
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js +18 -18
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +74 -53
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +607 -513
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +205 -127
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +652 -449
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js +159 -93
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +1032 -762
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +166 -185
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +48 -71
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1297 -1143
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +456 -392
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js +17 -17
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +167 -155
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +47 -95
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +0 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/index.workerd.js.map +1 -1
- package/dist/batch/index.d.ts +0 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +27 -32
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +56 -26
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +52 -24
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +4 -6
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +4 -10
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +4 -10
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -23
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js +11 -20
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +3 -4
- 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/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js +4 -4
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +0 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/core/index.d.ts +205 -442
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +259 -284
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -9
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js +3 -3
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +8 -34
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +6 -6
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +89 -82
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +27 -33
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +351 -404
- package/dist/cli/platform-lib/index.d.ts.map +1 -1
- package/dist/cli/platform-lib/index.js +218 -239
- package/dist/cli/platform-lib/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +17 -41
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js +10 -13
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +83 -195
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +160 -563
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +845 -859
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +787 -527
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +845 -859
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +845 -859
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +845 -859
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +3 -4
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js +6 -3
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +12 -2
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +6 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +0 -1
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js +4 -4
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +0 -1
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +2 -2
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +15 -7
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +14 -5
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js +5 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +8 -9
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +702 -479
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1580 -1238
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +11728 -32131
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -9
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +5 -5
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +0 -1
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +81 -69
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +123 -56
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +27 -90
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +42 -70
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +54 -40
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +140 -106
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +145 -150
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +144 -109
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +64 -54
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +36 -76
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +67 -57
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +62 -75
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +48 -71
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +48 -71
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -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.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +7 -4
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +87 -5
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +170 -23
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -5
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +91 -56
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.browser.js.map +1 -1
- package/dist/react/head/index.d.ts +0 -1
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +4 -5
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +2 -2
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -4
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +60 -24
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +378 -377
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +77 -41
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.d.ts +0 -1
- package/dist/react/sitemap/index.d.ts.map +1 -1
- package/dist/react/sitemap/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +4 -5
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +41 -15
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
- package/dist/react/ui/index.d.ts +35 -34
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js +12 -17
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js +5 -5
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +6 -7
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +6 -6
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +0 -1
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +4 -12
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -4
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +9 -4
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +30 -28
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +113 -44
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +452 -37
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js +19 -19
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +198 -274
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +83 -621
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js +103 -5
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +72 -5
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +103 -9
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js +22 -27
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +116 -85
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +105 -118
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +9 -10
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +14 -26
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +2 -3
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/etag/index.js.map +1 -1
- package/dist/server/health/index.d.ts +18 -19
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js +6 -6
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +15 -18
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +29 -32
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +0 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +10 -3
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +0 -1
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +8 -9
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +6 -12
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +0 -1
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +4 -4
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +37 -25
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +0 -1
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +0 -1
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +2 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.d.ts +19 -20
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js +8 -8
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +3 -4
- 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/package.json +22 -35
- package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
- package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
- package/src/api/audits/controllers/AdminAuditController.ts +41 -41
- package/src/api/audits/entities/audits.ts +22 -22
- package/src/api/audits/index.ts +6 -1
- package/src/api/audits/jobs/AuditJobs.ts +29 -0
- package/src/api/audits/parameters/AuditParameters.ts +51 -0
- package/src/api/audits/primitives/$audit.ts +24 -0
- package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
- package/src/api/audits/schemas/createAuditSchema.ts +18 -18
- package/src/api/audits/services/AuditService.ts +79 -7
- package/src/api/files/__tests__/FileController.spec.ts +5 -5
- package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
- package/src/api/files/controllers/FileController.ts +25 -25
- package/src/api/files/entities/files.ts +15 -15
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
- package/src/api/files/schemas/fileQuerySchema.ts +9 -9
- package/src/api/files/schemas/fileResourceSchema.ts +7 -9
- package/src/api/files/schemas/storageStatsSchema.ts +13 -13
- package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
- package/src/api/jobs/__tests__/$job.spec.ts +18 -18
- package/src/api/jobs/controllers/AdminJobController.ts +8 -8
- package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
- package/src/api/jobs/providers/JobProvider.ts +128 -12
- package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
- package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
- package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
- package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
- package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
- package/src/api/jobs/services/JobService.ts +6 -6
- package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
- package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
- package/src/api/keys/entities/apiKeyEntity.ts +15 -15
- package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
- package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
- package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
- package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
- package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
- package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
- package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
- package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
- package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
- package/src/api/notifications/primitives/$notification.ts +43 -4
- package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
- package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
- package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
- package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
- package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
- package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
- package/src/api/notifications/services/NotificationSenderService.ts +38 -2
- package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
- package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
- package/src/api/oauth/controllers/OAuthController.ts +132 -12
- package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
- package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
- package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
- package/src/api/oauth/index.ts +1 -0
- package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
- package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
- package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
- package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
- package/src/api/oauth/services/OAuthClientService.ts +228 -15
- package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
- package/src/api/organizations/entities/organizations.ts +6 -6
- package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
- package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
- package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
- package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
- package/src/api/parameters/entities/parameters.ts +29 -16
- package/src/api/parameters/primitives/$parameter.ts +3 -3
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
- package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
- package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
- package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
- package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
- package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
- package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
- package/src/api/parameters/services/ParameterProvider.ts +152 -65
- package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
- package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
- package/src/api/payments/controllers/PaymentController.ts +4 -4
- package/src/api/payments/entities/paymentIntents.ts +11 -11
- package/src/api/payments/entities/paymentMethods.ts +11 -11
- package/src/api/payments/entities/refunds.ts +9 -9
- package/src/api/payments/providers/PaymentProvider.ts +18 -0
- package/src/api/payments/schemas/intentSchemas.ts +25 -25
- package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
- package/src/api/payments/services/PaymentService.ts +60 -3
- package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
- package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
- package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
- package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
- package/src/api/subscriptions/entities/subscriptions.ts +22 -22
- package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
- package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
- package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
- package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
- package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
- package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
- package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
- package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
- package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
- package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
- package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
- package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
- package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
- package/src/api/users/controllers/AdminIdentityController.ts +29 -19
- package/src/api/users/controllers/AdminSessionController.ts +37 -27
- package/src/api/users/controllers/AdminUserController.ts +75 -53
- package/src/api/users/controllers/MySessionController.ts +125 -0
- package/src/api/users/controllers/RealmController.ts +9 -10
- package/src/api/users/controllers/UserController.ts +55 -55
- package/src/api/users/entities/identities.ts +8 -8
- package/src/api/users/entities/sessions.ts +17 -17
- package/src/api/users/entities/users.ts +17 -17
- package/src/api/users/index.ts +3 -0
- package/src/api/users/notifications/UserNotifications.ts +76 -24
- package/src/api/users/primitives/$realm.ts +12 -26
- package/src/api/users/providers/RealmProvider.ts +0 -15
- package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
- package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
- package/src/api/users/schemas/createUserSchema.ts +2 -2
- package/src/api/users/schemas/identityQuerySchema.ts +4 -4
- package/src/api/users/schemas/identityResourceSchema.ts +3 -2
- package/src/api/users/schemas/loginSchema.ts +4 -4
- package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
- package/src/api/users/schemas/realmConfigSchema.ts +10 -24
- package/src/api/users/schemas/registerQuerySchema.ts +6 -6
- package/src/api/users/schemas/registerRequestSchema.ts +21 -43
- package/src/api/users/schemas/registerResponseSchema.ts +2 -2
- package/src/api/users/schemas/registerSchema.ts +13 -31
- package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
- package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
- package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
- package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
- package/src/api/users/schemas/updateUserSchema.ts +3 -4
- package/src/api/users/schemas/userQuerySchema.ts +7 -7
- package/src/api/users/services/RegistrationService.ts +25 -11
- package/src/api/users/services/UserService.ts +12 -6
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
- package/src/api/verifications/controllers/VerificationController.ts +13 -27
- package/src/api/verifications/entities/verifications.ts +13 -14
- package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
- package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
- package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
- package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
- package/src/api/verifications/services/VerificationService.ts +12 -0
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
- package/src/batch/__tests__/$batch.spec.ts +22 -22
- package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
- package/src/bin/index.ts +1 -1
- package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
- package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
- package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
- package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
- package/src/cache/core/primitives/$cache.ts +7 -10
- package/src/cache/database/entities/cacheEntries.ts +16 -27
- package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
- package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
- package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
- package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
- package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
- package/src/cli/core/atoms/appEntryOptions.ts +5 -5
- package/src/cli/core/atoms/buildOptions.ts +76 -76
- package/src/cli/core/atoms/changelogOptions.ts +3 -3
- package/src/cli/core/atoms/devOptions.ts +3 -3
- package/src/cli/core/commands/build.ts +36 -39
- package/src/cli/core/commands/db.ts +171 -83
- package/src/cli/core/commands/dev.ts +8 -8
- package/src/cli/core/commands/gen/changelog.ts +12 -14
- package/src/cli/core/commands/gen/env.ts +6 -6
- package/src/cli/core/commands/gen/openapi.ts +6 -6
- package/src/cli/core/commands/init.ts +28 -33
- package/src/cli/core/commands/pack.ts +10 -10
- package/src/cli/core/commands/root.ts +7 -8
- package/src/cli/core/commands/test.ts +17 -20
- package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
- package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
- package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
- package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
- package/src/cli/platform/commands/SecretsCommand.ts +24 -25
- package/src/cli/platform/commands/platform.ts +40 -46
- package/src/cli/platform/index.ts +1 -1
- package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
- package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
- package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
- package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
- package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
- package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
- package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
- package/src/cli/platform-lib/schemas/platform.ts +51 -51
- package/src/cli/platform-lib/schemas/vercel.ts +28 -28
- package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
- package/src/cli/platform-lib/services/VercelApi.ts +4 -4
- package/src/cli/platform-lib/services/VercelCli.ts +6 -15
- package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
- package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
- package/src/cli/vendor/commands/VendorCommand.ts +11 -12
- package/src/command/__tests__/$command.spec.ts +82 -83
- package/src/command/__tests__/Asker.spec.ts +6 -13
- package/src/command/__tests__/CliProvider.spec.ts +136 -149
- package/src/command/__tests__/Runner.spec.ts +86 -110
- package/src/command/helpers/Asker.ts +23 -58
- package/src/command/helpers/Runner.ts +34 -110
- package/src/command/index.ts +4 -9
- package/src/command/primitives/$command.ts +10 -10
- package/src/command/providers/CliProvider.ts +183 -161
- package/src/core/Alepha.ts +62 -13
- package/src/core/__tests__/$atom.spec.ts +52 -3
- package/src/core/__tests__/$computed.spec.ts +129 -0
- package/src/core/__tests__/$env.spec.ts +13 -13
- package/src/core/__tests__/$inject.spec.ts +4 -4
- package/src/core/__tests__/$module.spec.ts +1 -1
- package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
- package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
- package/src/core/__tests__/Alepha-start.spec.ts +3 -3
- package/src/core/__tests__/CodecManager.spec.ts +113 -94
- package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
- package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
- package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
- package/src/core/__tests__/StateManager.spec.ts +423 -0
- package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
- package/src/core/__tests__/TypeProvider.spec.ts +314 -309
- package/src/core/__tests__/dump.spec.ts +6 -6
- package/src/core/__tests__/pagination.spec.ts +4 -4
- package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
- package/src/core/errors/TypeBoxError.ts +10 -4
- package/src/core/helpers/FileLike.ts +5 -5
- package/src/core/helpers/coerceStrings.ts +70 -0
- package/src/core/helpers/jsonSchemaToZod.ts +112 -0
- package/src/core/index.shared.ts +4 -1
- package/src/core/primitives/$atom.ts +95 -27
- package/src/core/primitives/$computed.ts +148 -0
- package/src/core/primitives/$env.ts +5 -5
- package/src/core/primitives/$state.ts +1 -1
- package/src/core/providers/AlsProvider.ts +26 -0
- package/src/core/providers/CodecManager.ts +1 -2
- package/src/core/providers/JsonSchemaCodec.ts +1 -2
- package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
- package/src/core/providers/SchemaValidator.ts +48 -158
- package/src/core/providers/StateManager.ts +383 -9
- package/src/core/providers/TypeProvider.ts +80 -734
- package/src/core/providers/ZodProvider.ts +380 -0
- package/src/core/providers/zodAugment.ts +69 -0
- package/src/core/schemas/pageQuerySchema.ts +19 -21
- package/src/core/schemas/pageSchema.ts +47 -57
- package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
- package/src/crypto/providers/SecretProvider.ts +16 -10
- package/src/datetime/primitives/$throttle.ts +6 -1
- package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
- package/src/email/core/index.ts +7 -2
- package/src/email/core/primitives/$email.ts +5 -1
- package/src/email/core/providers/LocalEmailProvider.ts +5 -5
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
- package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
- package/src/fake/__tests__/keyName.example.ts +21 -21
- package/src/fake/__tests__/keyName.spec.ts +41 -41
- package/src/fake/__tests__/module.example.ts +8 -8
- package/src/fake/providers/FakeProvider.ts +122 -121
- package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
- package/src/lock/core/index.ts +1 -0
- package/src/lock/core/primitives/$lock.ts +13 -6
- package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
- package/src/logger/__tests__/Logger.spec.ts +49 -0
- package/src/logger/index.ts +25 -18
- package/src/logger/providers/CliFormatterProvider.ts +75 -0
- package/src/logger/schemas/logEntrySchema.ts +10 -10
- package/src/logger/services/Logger.ts +18 -0
- package/src/mcp/__tests__/$prompt.spec.ts +21 -23
- package/src/mcp/__tests__/$tool.spec.ts +22 -22
- package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
- package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
- package/src/mcp/__tests__/integration.spec.ts +33 -33
- package/src/mcp/primitives/$prompt.ts +11 -9
- package/src/mcp/primitives/$tool.ts +27 -86
- package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
- package/src/orm/__tests__/$repository-tests.ts +133 -27
- package/src/orm/__tests__/$repository.spec.ts +23 -0
- package/src/orm/__tests__/$transactional-tests.ts +4 -4
- package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
- package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
- package/src/orm/__tests__/QueryManager.spec.ts +5 -5
- package/src/orm/__tests__/delete-returning-tests.ts +11 -11
- package/src/orm/__tests__/deletedAt-tests.ts +3 -3
- package/src/orm/__tests__/enums.spec.ts +29 -25
- package/src/orm/__tests__/execute-tests.ts +8 -8
- package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
- package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
- package/src/orm/__tests__/joins-tests.ts +30 -30
- package/src/orm/__tests__/organization-tests.ts +105 -3
- package/src/orm/__tests__/organization.spec.ts +46 -0
- package/src/orm/__tests__/orm-errors.spec.ts +10 -10
- package/src/orm/__tests__/orm-next-tests.ts +29 -29
- package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
- package/src/orm/__tests__/primaryKey.spec.ts +4 -4
- package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
- package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
- package/src/orm/__tests__/references.spec.ts +7 -7
- package/src/orm/__tests__/security.spec.ts +17 -17
- package/src/orm/__tests__/string-operators-tests.ts +5 -5
- package/src/orm/__tests__/timestamps-tests.ts +14 -14
- package/src/orm/__tests__/validation-tests.ts +5 -5
- package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
- package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
- package/src/orm/core/entities/alephaSequences.ts +8 -8
- package/src/orm/core/helpers/pgAttr.ts +4 -4
- package/src/orm/core/primitives/$entity.ts +10 -6
- package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
- package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
- package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
- package/src/orm/core/schemas/insertSchema.ts +14 -18
- package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
- package/src/orm/core/schemas/updateSchema.ts +10 -16
- package/src/orm/core/services/PgRelationManager.ts +2 -2
- package/src/orm/core/services/QueryManager.ts +13 -2
- package/src/orm/core/services/Repository.ts +88 -33
- package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
- package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
- package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
- package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
- package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
- package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
- package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
- package/src/queue/core/__tests__/shared.ts +6 -6
- package/src/queue/core/primitives/$consumer.ts +5 -5
- package/src/queue/core/primitives/$queue.ts +44 -61
- package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
- package/src/queue/core/providers/WorkerProvider.ts +17 -14
- package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
- package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
- package/src/react/core/__tests__/Router.spec.tsx +4 -4
- package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
- package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
- package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
- package/src/react/core/components/ErrorBoundary.tsx +42 -0
- package/src/react/core/hooks/useAction.ts +56 -19
- package/src/react/core/hooks/useComputed.ts +91 -0
- package/src/react/core/hooks/useSelector.ts +67 -0
- package/src/react/core/hooks/useStore.ts +36 -17
- package/src/react/core/index.ts +3 -0
- package/src/react/core/utils/shallowEqual.ts +36 -0
- package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
- package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
- package/src/react/form/errors/FormValidationError.ts +0 -2
- package/src/react/form/hooks/useForm.ts +19 -4
- package/src/react/form/hooks/useFormQuerySync.ts +0 -0
- package/src/react/form/services/FormModel.ts +67 -47
- package/src/react/form/services/parseField.ts +66 -27
- package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
- package/src/react/i18n/providers/I18nProvider.ts +2 -2
- package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
- package/src/react/router/__tests__/$page.spec.tsx +21 -21
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
- package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
- package/src/react/router/components/NestedView.tsx +11 -3
- package/src/react/router/hooks/useQueryParams.ts +1 -1
- package/src/react/router/primitives/$page.ts +2 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
- package/src/react/router/providers/ReactPageProvider.ts +26 -12
- package/src/react/router/providers/ReactServerProvider.ts +13 -15
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
- package/src/react/ui/atoms/uiAtom.ts +6 -6
- package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
- package/src/react/ui/hooks/useColorMode.ts +11 -4
- package/src/react/ui/services/SchemaControl.ts +4 -4
- package/src/redis/providers/BunRedisProvider.ts +19 -11
- package/src/redis/providers/NodeRedisProvider.ts +3 -3
- package/src/scheduler/primitives/$scheduler.ts +21 -8
- package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
- package/src/security/atoms/currentTenantAtom.ts +6 -6
- package/src/security/atoms/currentUserAtom.ts +2 -2
- package/src/security/primitives/$issuer.ts +24 -2
- package/src/security/providers/JwtProvider.ts +100 -0
- package/src/security/providers/SecurityProvider.ts +43 -2
- package/src/security/schemas/permissionSchema.ts +19 -19
- package/src/security/schemas/roleSchema.ts +22 -28
- package/src/security/schemas/userAccountInfoSchema.ts +47 -37
- package/src/server/auth/index.ts +0 -3
- package/src/server/auth/primitives/$auth.ts +6 -6
- package/src/server/auth/primitives/$authApple.ts +10 -10
- package/src/server/auth/primitives/$authFacebook.ts +10 -10
- package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
- package/src/server/auth/primitives/$authGithub.ts +10 -10
- package/src/server/auth/primitives/$authGoogle.ts +10 -10
- package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
- package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
- package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
- package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
- package/src/server/auth/schemas/tokensSchema.ts +16 -16
- package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
- package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
- package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
- package/src/server/cookies/index.browser.ts +4 -1
- package/src/server/cookies/index.ts +8 -1
- package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
- package/src/server/cookies/primitives/$cookie.ts +16 -0
- package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
- package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
- package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
- package/src/server/cookies/services/CookieParser.ts +6 -1
- package/src/server/core/__tests__/$action.spec.ts +13 -13
- package/src/server/core/__tests__/$middleware.spec.ts +10 -10
- package/src/server/core/__tests__/$route.spec.ts +9 -9
- package/src/server/core/__tests__/$sse.spec.ts +26 -26
- package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
- package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
- package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
- package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
- package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
- package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
- package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
- package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
- package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
- package/src/server/core/errors/ValidationError.ts +6 -3
- package/src/server/core/helpers/isMultipart.ts +2 -1
- package/src/server/core/index.ts +5 -2
- package/src/server/core/interfaces/ServerRequest.ts +6 -14
- package/src/server/core/primitives/$action.ts +26 -36
- package/src/server/core/primitives/$sse.ts +3 -3
- package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
- package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
- package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
- package/src/server/core/providers/ServerCompressProvider.ts +9 -10
- package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
- package/src/server/core/providers/ServerRouterProvider.ts +44 -15
- package/src/server/core/schemas/errorSchema.ts +20 -25
- package/src/server/core/schemas/okSchema.ts +9 -14
- package/src/server/core/services/HttpClient.ts +13 -1
- package/src/server/core/services/ServerRequestParser.ts +6 -6
- package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
- package/src/server/health/schemas/healthSchema.ts +6 -6
- package/src/server/links/__tests__/$remote.spec.ts +3 -3
- package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
- package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
- package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
- package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
- package/src/server/links/atoms/apiLinksAtom.ts +2 -2
- package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
- package/src/server/links/primitives/$remote.ts +3 -3
- package/src/server/links/providers/LinkProvider.ts +3 -3
- package/src/server/links/providers/ServerLinksProvider.ts +20 -20
- package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
- package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
- package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
- package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
- package/src/server/swagger/__tests__/ui.spec.ts +3 -3
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
- package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
- package/src/system/providers/NodeShellProvider.ts +4 -1
- package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
- package/src/topic/core/__tests__/shared.ts +8 -8
- package/src/topic/core/primitives/$subscriber.ts +5 -5
- package/src/topic/core/primitives/$topic.ts +14 -14
- package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
- package/dist/container/core/index.d.ts +0 -236
- package/dist/container/core/index.d.ts.map +0 -1
- package/dist/container/core/index.js +0 -231
- package/dist/container/core/index.js.map +0 -1
- package/dist/container/core/index.workerd.js +0 -192
- package/dist/container/core/index.workerd.js.map +0 -1
- package/src/command/helpers/PrettyAsker.ts +0 -256
- package/src/command/helpers/PrettyPrint.ts +0 -332
- package/src/container/core/__tests__/$container.spec.ts +0 -83
- package/src/container/core/index.ts +0 -50
- package/src/container/core/index.workerd.ts +0 -53
- package/src/container/core/interfaces/ContainerOptions.ts +0 -69
- package/src/container/core/primitives/$container.ts +0 -100
- package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
- package/src/container/core/providers/ContainerProvider.ts +0 -92
- package/src/container/core/providers/MockContainerProvider.ts +0 -62
- package/src/container/core/providers/NodeContainerProvider.ts +0 -53
- package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
- package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
- package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
- package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
- package/src/server/auth/helpers/federationAssertion.ts +0 -74
- package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
- package/src/server/auth/primitives/$authFederationClient.ts +0 -89
- /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
OPTIONS,
|
|
11
11
|
PipelineHandler,
|
|
12
12
|
type Static,
|
|
13
|
-
|
|
13
|
+
z,
|
|
14
14
|
} from "alepha";
|
|
15
15
|
import { $logger } from "alepha/logger";
|
|
16
16
|
import { ServerHeadProvider } from "alepha/react/head";
|
|
@@ -686,13 +686,13 @@ export class ReactServerProvider {
|
|
|
686
686
|
|
|
687
687
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
688
688
|
|
|
689
|
-
const envSchema =
|
|
690
|
-
REACT_SSR_ENABLED:
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
689
|
+
const envSchema = z.object({
|
|
690
|
+
REACT_SSR_ENABLED: z
|
|
691
|
+
.boolean()
|
|
692
|
+
.describe(
|
|
693
|
+
"Enable or disable server-side rendering (SSR) for React pages. When set to false, pages are rendered client-side only.",
|
|
694
|
+
)
|
|
695
|
+
.optional(),
|
|
696
696
|
});
|
|
697
697
|
|
|
698
698
|
declare module "alepha" {
|
|
@@ -713,13 +713,11 @@ export const DEFAULT_STATIC_FILE_PATTERN = "\\.[a-zA-Z0-9]{1,10}$";
|
|
|
713
713
|
|
|
714
714
|
export const reactServerOptions = $atom({
|
|
715
715
|
name: "alepha.react.server.options",
|
|
716
|
-
schema:
|
|
717
|
-
publicDir:
|
|
718
|
-
staticServer:
|
|
719
|
-
disabled:
|
|
720
|
-
path:
|
|
721
|
-
description: "URL path where static files will be served.",
|
|
722
|
-
}),
|
|
716
|
+
schema: z.object({
|
|
717
|
+
publicDir: z.string(),
|
|
718
|
+
staticServer: z.object({
|
|
719
|
+
disabled: z.boolean(),
|
|
720
|
+
path: z.string().describe("URL path where static files will be served."),
|
|
723
721
|
}),
|
|
724
722
|
}),
|
|
725
723
|
default: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Alepha,
|
|
1
|
+
import { Alepha, z } from "alepha";
|
|
2
2
|
import { DateTimeProvider } from "alepha/datetime";
|
|
3
3
|
import { $page, AlephaReactRouter } from "alepha/react/router";
|
|
4
4
|
import { ServerRouterProvider } from "alepha/server";
|
|
@@ -35,7 +35,7 @@ describe("$sitemap", () => {
|
|
|
35
35
|
|
|
36
36
|
blog = $page({
|
|
37
37
|
path: "/blog/:slug",
|
|
38
|
-
schema: { params:
|
|
38
|
+
schema: { params: z.object({ slug: z.text() }) },
|
|
39
39
|
static: { entries: [{ params: { slug: "hello" } }] },
|
|
40
40
|
component: () => "post",
|
|
41
41
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, type Static,
|
|
1
|
+
import { $atom, type Static, z } from "alepha";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Persisted UI state — color mode, theme palette, sidebar collapsed state, etc.
|
|
@@ -8,14 +8,14 @@ import { $atom, type Static, t } from "alepha";
|
|
|
8
8
|
*/
|
|
9
9
|
export const uiAtom = $atom({
|
|
10
10
|
name: "alepha.react.ui",
|
|
11
|
-
schema:
|
|
11
|
+
schema: z.object({
|
|
12
12
|
/** Color mode preference. `"system"` follows the OS-level setting. */
|
|
13
|
-
mode:
|
|
13
|
+
mode: z.enum(["light", "dark", "system"]),
|
|
14
14
|
/** Theme palette name. UI consumers map this to a CSS class on the root. */
|
|
15
|
-
theme:
|
|
15
|
+
theme: z.string(),
|
|
16
16
|
/** Sidebar UI state. */
|
|
17
|
-
sidebar:
|
|
18
|
-
collapsed:
|
|
17
|
+
sidebar: z.object({
|
|
18
|
+
collapsed: z.boolean(),
|
|
19
19
|
}),
|
|
20
20
|
}),
|
|
21
21
|
default: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, type Static,
|
|
1
|
+
import { $atom, type Static, z } from "alepha";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Available themes the user can pick from. Apps populate this atom on boot
|
|
@@ -11,22 +11,22 @@ import { $atom, type Static, t } from "alepha";
|
|
|
11
11
|
*/
|
|
12
12
|
export const uiThemeListAtom = $atom({
|
|
13
13
|
name: "alepha.react.ui.themes",
|
|
14
|
-
schema:
|
|
15
|
-
|
|
14
|
+
schema: z.array(
|
|
15
|
+
z.object({
|
|
16
16
|
/** Stable id stored in `uiAtom.theme`. Mapped to a CSS class on `<html>`. */
|
|
17
|
-
id:
|
|
17
|
+
id: z.string(),
|
|
18
18
|
/** Human-readable label shown in the picker. */
|
|
19
|
-
label:
|
|
19
|
+
label: z.string(),
|
|
20
20
|
/**
|
|
21
21
|
* Optional 4-color preview swatch in 2×2 order (TL, TR, BL, BR). Any
|
|
22
22
|
* CSS-valid color string.
|
|
23
23
|
*/
|
|
24
|
-
swatch:
|
|
24
|
+
swatch: z.array(z.string()).min(4).max(4).optional(),
|
|
25
25
|
/**
|
|
26
26
|
* Optional stylesheet URL (typically Google Fonts) loaded lazily when
|
|
27
27
|
* the theme is selected.
|
|
28
28
|
*/
|
|
29
|
-
fontHref:
|
|
29
|
+
fontHref: z.string().optional(),
|
|
30
30
|
}),
|
|
31
31
|
),
|
|
32
32
|
default: [{ id: "default", label: "Default" }],
|
|
@@ -29,15 +29,22 @@ export const useColorMode = () => {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
const useResolvedColorMode = (mode: ColorMode): ResolvedColorMode => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
// Must start `false` on BOTH the server and the client's first (hydration)
|
|
33
|
+
// render — `window.matchMedia` is client-only, so a lazy initializer reading
|
|
34
|
+
// it would make the first client render disagree with the server for
|
|
35
|
+
// `mode === "system"` (server resolves "light", a dark-OS client resolves
|
|
36
|
+
// "dark"), tripping a React hydration mismatch (#418) on any SSR'd page that
|
|
37
|
+
// renders off `resolved` (e.g. the color-mode toggle icon). The real OS
|
|
38
|
+
// preference is synced in the effect below, immediately after mount. No-flash
|
|
39
|
+
// CSS is handled separately by the boot script, so this costs at most a
|
|
40
|
+
// one-frame icon correction, never a color flash.
|
|
41
|
+
const [systemDark, setSystemDark] = useState(false);
|
|
36
42
|
|
|
37
43
|
useEffect(() => {
|
|
38
44
|
if (typeof window === "undefined") return;
|
|
39
45
|
const mq = window.matchMedia?.("(prefers-color-scheme: dark)");
|
|
40
46
|
if (!mq) return;
|
|
47
|
+
setSystemDark(mq.matches);
|
|
41
48
|
const onChange = (ev: MediaQueryListEvent) => setSystemDark(ev.matches);
|
|
42
49
|
mq.addEventListener("change", onChange);
|
|
43
50
|
return () => mq.removeEventListener("change", onChange);
|
|
@@ -8,12 +8,12 @@ import type { FormModel } from "alepha/react/form";
|
|
|
8
8
|
*
|
|
9
9
|
* 1. **Object** — static configuration baked into the schema:
|
|
10
10
|
* ```ts
|
|
11
|
-
*
|
|
11
|
+
* z.string({ $control: { password: true, icon: "key" } })
|
|
12
12
|
* ```
|
|
13
13
|
*
|
|
14
14
|
* 2. **Function** — dynamic, computed from current form state:
|
|
15
15
|
* ```ts
|
|
16
|
-
*
|
|
16
|
+
* z.string({
|
|
17
17
|
* $control: ({ form, value }) => {
|
|
18
18
|
* if (form.currentValues.kind !== "advanced") return false; // hide
|
|
19
19
|
* return { items: () => fetchOptions(form.currentValues.kind) };
|
|
@@ -197,8 +197,8 @@ export const resolveSchemaControl = (
|
|
|
197
197
|
return {};
|
|
198
198
|
};
|
|
199
199
|
|
|
200
|
-
declare module "
|
|
201
|
-
interface
|
|
200
|
+
declare module "alepha" {
|
|
201
|
+
interface SchemaOptions {
|
|
202
202
|
/**
|
|
203
203
|
* UI metadata read by `<Control>` from `@alepha/ui`. See
|
|
204
204
|
* {@link SchemaControl}.
|
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
Alepha,
|
|
6
6
|
AlephaError,
|
|
7
7
|
type Static,
|
|
8
|
-
|
|
8
|
+
z,
|
|
9
9
|
} from "alepha";
|
|
10
10
|
import { $logger } from "alepha/logger";
|
|
11
11
|
import { RedisProvider, type RedisSetOptions } from "./RedisProvider.ts";
|
|
12
12
|
|
|
13
|
-
const envSchema =
|
|
14
|
-
REDIS_URL:
|
|
13
|
+
const envSchema = z.object({
|
|
14
|
+
REDIS_URL: z.text({
|
|
15
15
|
default: "redis://localhost:6379",
|
|
16
16
|
description: "Redis connection URL",
|
|
17
17
|
}),
|
|
@@ -201,15 +201,23 @@ export class BunRedisProvider extends RedisProvider {
|
|
|
201
201
|
args.push("GET");
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
204
|
+
// Capture the reply. With the `GET` option the reply carries the *prior*
|
|
205
|
+
// value, and the entire `$lock` protocol (`SET … NX GET`) depends on reading
|
|
206
|
+
// it. Previously this discarded the reply and always returned the value it
|
|
207
|
+
// just wrote, so under Bun every lock contender saw its own id back and
|
|
208
|
+
// believed it had acquired the lock — RedisLockProvider (and therefore every
|
|
209
|
+
// scheduler dedup / migration guard) became a silent no-op across instances.
|
|
210
|
+
const resp =
|
|
211
|
+
args.length === 2
|
|
212
|
+
? await this.publisher.set(key, buf)
|
|
213
|
+
: await this.publisher.send("SET", args);
|
|
214
|
+
|
|
215
|
+
// Mirror NodeRedisProvider: "OK"/nil means "applied, no prior value" → echo
|
|
216
|
+
// the value we wrote; any other reply is the prior value returned by GET.
|
|
217
|
+
if (resp == null || resp === "OK") {
|
|
218
|
+
return buf;
|
|
210
219
|
}
|
|
211
|
-
|
|
212
|
-
return buf;
|
|
220
|
+
return Buffer.isBuffer(resp) ? resp : Buffer.from(String(resp), "binary");
|
|
213
221
|
}
|
|
214
222
|
|
|
215
223
|
public override async has(key: string): Promise<boolean> {
|
|
@@ -11,13 +11,13 @@ import {
|
|
|
11
11
|
Alepha,
|
|
12
12
|
AlephaError,
|
|
13
13
|
type Static,
|
|
14
|
-
|
|
14
|
+
z,
|
|
15
15
|
} from "alepha";
|
|
16
16
|
import { $logger } from "alepha/logger";
|
|
17
17
|
import { RedisProvider, type RedisSetOptions } from "./RedisProvider.ts";
|
|
18
18
|
|
|
19
|
-
const envSchema =
|
|
20
|
-
REDIS_URL:
|
|
19
|
+
const envSchema = z.object({
|
|
20
|
+
REDIS_URL: z.text({
|
|
21
21
|
default: "redis://localhost:6379",
|
|
22
22
|
description: "Redis connection URL",
|
|
23
23
|
}),
|
|
@@ -9,14 +9,14 @@ import {
|
|
|
9
9
|
KIND,
|
|
10
10
|
Primitive,
|
|
11
11
|
type Static,
|
|
12
|
-
|
|
12
|
+
z,
|
|
13
13
|
} from "alepha";
|
|
14
14
|
import {
|
|
15
15
|
type DateTime,
|
|
16
16
|
DateTimeProvider,
|
|
17
17
|
type DurationLike,
|
|
18
18
|
} from "alepha/datetime";
|
|
19
|
-
import { $lock } from "alepha/lock";
|
|
19
|
+
import { $lock, LockAcquireError } from "alepha/lock";
|
|
20
20
|
import { $logger } from "alepha/logger";
|
|
21
21
|
import { CronProvider } from "../providers/CronProvider.ts";
|
|
22
22
|
|
|
@@ -73,12 +73,12 @@ export type SchedulerPrimitiveOptions = {
|
|
|
73
73
|
*/
|
|
74
74
|
export const schedulerOptions = $atom({
|
|
75
75
|
name: "alepha.scheduler.options",
|
|
76
|
-
schema:
|
|
77
|
-
prefix:
|
|
78
|
-
|
|
76
|
+
schema: z.object({
|
|
77
|
+
prefix: z
|
|
78
|
+
.text({
|
|
79
79
|
description: "Prefix for scheduler lock keys.",
|
|
80
|
-
})
|
|
81
|
-
|
|
80
|
+
})
|
|
81
|
+
.optional(),
|
|
82
82
|
}),
|
|
83
83
|
default: {},
|
|
84
84
|
});
|
|
@@ -138,7 +138,20 @@ export class SchedulerPrimitive extends Primitive<SchedulerPrimitiveOptions> {
|
|
|
138
138
|
});
|
|
139
139
|
|
|
140
140
|
if (this.options.lock !== false) {
|
|
141
|
-
|
|
141
|
+
try {
|
|
142
|
+
await this.schedulerLock.run({ now });
|
|
143
|
+
} catch (error) {
|
|
144
|
+
// A held lock means another instance (or an overlapping run) is
|
|
145
|
+
// already handling this tick — that is exactly what the lock is
|
|
146
|
+
// for (dedup), not a failure. Skip this tick quietly rather than
|
|
147
|
+
// surfacing it as a `scheduler:error`. Other errors still bubble.
|
|
148
|
+
if (!(error instanceof LockAcquireError)) {
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
this.log.debug(
|
|
152
|
+
`Scheduler '${this.name}' tick skipped — lock held by another runner`,
|
|
153
|
+
);
|
|
154
|
+
}
|
|
142
155
|
} else {
|
|
143
156
|
await this.options.handler({ now });
|
|
144
157
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { ForbiddenError } from "alepha/server";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { SecurityProvider } from "../providers/SecurityProvider.ts";
|
|
5
|
+
|
|
6
|
+
describe("SecurityProvider.assertRealmScope", () => {
|
|
7
|
+
const security = () => Alepha.create().inject(SecurityProvider);
|
|
8
|
+
|
|
9
|
+
it("returns the caller's realm when no target realm is requested", () => {
|
|
10
|
+
expect(security().assertRealmScope({ realm: "acme" }, undefined)).toBe(
|
|
11
|
+
"acme",
|
|
12
|
+
);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("allows a target realm that matches the caller's realm", () => {
|
|
16
|
+
expect(security().assertRealmScope({ realm: "acme" }, "acme")).toBe("acme");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("rejects a target realm different from the caller's realm (P0-7)", () => {
|
|
20
|
+
// A realm-A admin must not be able to act on realm B via ?userRealmName=B.
|
|
21
|
+
expect(() =>
|
|
22
|
+
security().assertRealmScope({ realm: "acme" }, "victim-tenant"),
|
|
23
|
+
).toThrow(ForbiddenError);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("is a no-op for single-realm apps (no caller realm claim)", () => {
|
|
27
|
+
expect(security().assertRealmScope(undefined, undefined)).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom,
|
|
1
|
+
import { $atom, z } from "alepha";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Atom storing the active tenant for the current request.
|
|
@@ -24,11 +24,11 @@ import { $atom, t } from "alepha";
|
|
|
24
24
|
*/
|
|
25
25
|
export const currentTenantAtom = $atom({
|
|
26
26
|
name: "alepha.security.tenant",
|
|
27
|
-
schema:
|
|
28
|
-
|
|
29
|
-
id:
|
|
27
|
+
schema: z
|
|
28
|
+
.object({
|
|
29
|
+
id: z.text({
|
|
30
30
|
description: "Tenant identifier (slug, UUID, or composite).",
|
|
31
31
|
}),
|
|
32
|
-
})
|
|
33
|
-
|
|
32
|
+
})
|
|
33
|
+
.optional(),
|
|
34
34
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom
|
|
1
|
+
import { $atom } from "alepha";
|
|
2
2
|
import { userAccountInfoSchema } from "../schemas/userAccountInfoSchema.ts";
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -9,5 +9,5 @@ import { userAccountInfoSchema } from "../schemas/userAccountInfoSchema.ts";
|
|
|
9
9
|
*/
|
|
10
10
|
export const currentUserAtom = $atom({
|
|
11
11
|
name: "alepha.security.user",
|
|
12
|
-
schema:
|
|
12
|
+
schema: userAccountInfoSchema.optional(),
|
|
13
13
|
});
|
|
@@ -17,7 +17,7 @@ import type { JSONWebKeySet, JWTPayload } from "jose";
|
|
|
17
17
|
import { currentTenantAtom } from "../atoms/currentTenantAtom.ts";
|
|
18
18
|
import { SecurityError } from "../errors/SecurityError.ts";
|
|
19
19
|
import type { IssuerResolver } from "../interfaces/IssuerResolver.ts";
|
|
20
|
-
import { JwtProvider } from "../providers/JwtProvider.ts";
|
|
20
|
+
import { JwtProvider, type SigningConfig } from "../providers/JwtProvider.ts";
|
|
21
21
|
import { SecurityProvider } from "../providers/SecurityProvider.ts";
|
|
22
22
|
import type { Role } from "../schemas/roleSchema.ts";
|
|
23
23
|
import type { UserAccount } from "../schemas/userAccountInfoSchema.ts";
|
|
@@ -65,6 +65,13 @@ export type IssuerPrimitiveOptions = {
|
|
|
65
65
|
* Custom resolvers (in addition to default JWT resolver).
|
|
66
66
|
*/
|
|
67
67
|
resolvers?: IssuerResolver[];
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Asymmetric signing config. When set, this issuer's tokens are signed with
|
|
71
|
+
* the given alg + kid and its public keys are published via JWKS. When
|
|
72
|
+
* omitted, the HS256 `secret` path is used (default, backward compatible).
|
|
73
|
+
*/
|
|
74
|
+
signing?: SigningConfig;
|
|
68
75
|
} & (IssuerInternal | IssuerExternal);
|
|
69
76
|
|
|
70
77
|
export interface IssuerSettings {
|
|
@@ -173,6 +180,7 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
|
|
|
173
180
|
name: this.name,
|
|
174
181
|
profile: this.options.profile,
|
|
175
182
|
secret: "jwks" in this.options ? this.options.jwks : this.options.secret,
|
|
183
|
+
signing: this.options.signing,
|
|
176
184
|
roles,
|
|
177
185
|
resolvers: [],
|
|
178
186
|
});
|
|
@@ -331,6 +339,18 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
|
|
|
331
339
|
// `viska.club.alepha.dev` even when the user belongs to both.
|
|
332
340
|
const tenant = this.alepha.store.get(currentTenantAtom)?.id;
|
|
333
341
|
|
|
342
|
+
// Resilient display name: compose from first/last when the caller didn't
|
|
343
|
+
// provide one (credentials users register with first+last but no `name`),
|
|
344
|
+
// and carry the OIDC given/family claims so consumers can re-derive it —
|
|
345
|
+
// otherwise such users surface as "Anonymous User".
|
|
346
|
+
const composedName =
|
|
347
|
+
user.name ??
|
|
348
|
+
([user.firstName, user.lastName]
|
|
349
|
+
.filter((s): s is string => !!s?.trim())
|
|
350
|
+
.join(" ")
|
|
351
|
+
.trim() ||
|
|
352
|
+
undefined);
|
|
353
|
+
|
|
334
354
|
const access_token = await this.jwt.create(
|
|
335
355
|
{
|
|
336
356
|
// jwt
|
|
@@ -340,7 +360,9 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
|
|
|
340
360
|
aud: this.name,
|
|
341
361
|
sid, // session id, if available
|
|
342
362
|
// oidc
|
|
343
|
-
name:
|
|
363
|
+
name: composedName,
|
|
364
|
+
given_name: user.firstName,
|
|
365
|
+
family_name: user.lastName,
|
|
344
366
|
email: user.email,
|
|
345
367
|
preferred_username: user.username,
|
|
346
368
|
picture: user.picture,
|
|
@@ -6,8 +6,12 @@ import {
|
|
|
6
6
|
type CryptoKey,
|
|
7
7
|
createLocalJWKSet,
|
|
8
8
|
createRemoteJWKSet,
|
|
9
|
+
exportJWK,
|
|
9
10
|
type FlattenedJWSInput,
|
|
11
|
+
generateKeyPair,
|
|
12
|
+
importPKCS8,
|
|
10
13
|
type JSONWebKeySet,
|
|
14
|
+
type JWK,
|
|
11
15
|
type JWSHeaderParameters,
|
|
12
16
|
type JWTHeaderParameters,
|
|
13
17
|
type JWTPayload,
|
|
@@ -26,6 +30,7 @@ import { SecurityError } from "../errors/SecurityError.ts";
|
|
|
26
30
|
export class JwtProvider {
|
|
27
31
|
protected readonly log = $logger();
|
|
28
32
|
protected readonly keystore: KeyLoaderHolder[] = [];
|
|
33
|
+
protected readonly signers = new Map<string, SignerHolder>();
|
|
29
34
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
30
35
|
protected readonly encoder = new TextEncoder();
|
|
31
36
|
|
|
@@ -61,6 +66,65 @@ export class JwtProvider {
|
|
|
61
66
|
}
|
|
62
67
|
}
|
|
63
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Configure an asymmetric signing key for a realm/issuer. Tokens minted for
|
|
71
|
+
* `name` are then signed with `alg` + `kid`, and a local verify loader is
|
|
72
|
+
* registered so this process can verify its own tokens (refresh tokens,
|
|
73
|
+
* authorization codes, id_tokens). Public keys are published via `getJwks`.
|
|
74
|
+
*
|
|
75
|
+
* `privateKey` is a PKCS#8 PEM (from env). When it is empty/undefined an
|
|
76
|
+
* **ephemeral per-process keypair** is generated so dev/test work with no env
|
|
77
|
+
* key configured — the published JWKS still resolves; tokens just don't
|
|
78
|
+
* survive a restart. Additive: realms without a signing key keep the HS256
|
|
79
|
+
* path untouched.
|
|
80
|
+
*/
|
|
81
|
+
public async setSigningKey(
|
|
82
|
+
name: string,
|
|
83
|
+
signing: SigningConfig,
|
|
84
|
+
): Promise<void> {
|
|
85
|
+
const key = signing.privateKey
|
|
86
|
+
? await importPKCS8(signing.privateKey, signing.alg, {
|
|
87
|
+
extractable: true,
|
|
88
|
+
})
|
|
89
|
+
: (await generateKeyPair(signing.alg, { extractable: true })).privateKey;
|
|
90
|
+
const exported = await exportJWK(key);
|
|
91
|
+
// Strip every private member so the published JWK is public-only.
|
|
92
|
+
const { d, p, q, dp, dq, qi, ...pub } = exported as Record<string, unknown>;
|
|
93
|
+
const publicJwk: JWK = {
|
|
94
|
+
...(pub as JWK),
|
|
95
|
+
kid: signing.kid,
|
|
96
|
+
use: "sig",
|
|
97
|
+
alg: signing.alg,
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
this.signers.set(name, {
|
|
101
|
+
alg: signing.alg,
|
|
102
|
+
kid: signing.kid,
|
|
103
|
+
key,
|
|
104
|
+
publicJwk,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
this.log.debug(`will sign + verify JWTs for '${name}'`, {
|
|
108
|
+
alg: signing.alg,
|
|
109
|
+
kid: signing.kid,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Register a local verify loader so tokens we sign can be verified.
|
|
113
|
+
this.keystore.push({
|
|
114
|
+
name,
|
|
115
|
+
keyLoader: createLocalJWKSet({ keys: [publicJwk] }),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Public JWK Set for a realm/issuer configured with an asymmetric signing
|
|
121
|
+
* key. Returns an empty set for HS256 / external (URL-based) realms.
|
|
122
|
+
*/
|
|
123
|
+
public async getJwks(name: string): Promise<JSONWebKeySet> {
|
|
124
|
+
const signer = this.signers.get(name);
|
|
125
|
+
return { keys: signer ? [signer.publicJwk] : [] };
|
|
126
|
+
}
|
|
127
|
+
|
|
64
128
|
/**
|
|
65
129
|
* Retrieves the payload from a JSON Web Token (JWT).
|
|
66
130
|
*
|
|
@@ -133,6 +197,21 @@ export class JwtProvider {
|
|
|
133
197
|
keyName?: string,
|
|
134
198
|
signOptions?: JwtSignOptions,
|
|
135
199
|
): Promise<string> {
|
|
200
|
+
// Asymmetric path: when a signing key is configured for this realm, sign
|
|
201
|
+
// with its alg + kid so the token verifies against the published JWKS.
|
|
202
|
+
const signerName = keyName ?? this.keystore[0]?.name;
|
|
203
|
+
const signer = signerName ? this.signers.get(signerName) : undefined;
|
|
204
|
+
if (signer) {
|
|
205
|
+
const signJwt = new SignJWT(payload);
|
|
206
|
+
signJwt.setProtectedHeader({
|
|
207
|
+
alg: signer.alg,
|
|
208
|
+
kid: signer.kid,
|
|
209
|
+
...signOptions?.header,
|
|
210
|
+
});
|
|
211
|
+
return await signJwt.sign(signer.key);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// HS256 path (unchanged default).
|
|
136
215
|
const secretKey = keyName
|
|
137
216
|
? this.keystore.find((it) => it.name === keyName)?.secretKey
|
|
138
217
|
: this.keystore[0]?.secretKey;
|
|
@@ -173,6 +252,27 @@ export interface KeyLoaderHolder {
|
|
|
173
252
|
secretKey?: string;
|
|
174
253
|
}
|
|
175
254
|
|
|
255
|
+
export interface SignerHolder {
|
|
256
|
+
alg: string;
|
|
257
|
+
kid: string;
|
|
258
|
+
key: CryptoKey | KeyObject;
|
|
259
|
+
publicJwk: JWK;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Asymmetric signing config for a realm/issuer. `privateKey` is a PKCS#8 PEM
|
|
264
|
+
* (typically injected from env). EdDSA preferred; RS256 acceptable.
|
|
265
|
+
*/
|
|
266
|
+
export interface SigningConfig {
|
|
267
|
+
alg: "EdDSA" | "RS256";
|
|
268
|
+
/**
|
|
269
|
+
* PKCS#8 PEM private key. Empty/undefined → an ephemeral per-process keypair
|
|
270
|
+
* is generated (dev/test convenience; tokens don't survive a restart).
|
|
271
|
+
*/
|
|
272
|
+
privateKey?: string;
|
|
273
|
+
kid: string;
|
|
274
|
+
}
|
|
275
|
+
|
|
176
276
|
export interface JwtSignOptions {
|
|
177
277
|
header?: Partial<JWTHeaderParameters>;
|
|
178
278
|
}
|
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
type UserAccount,
|
|
25
25
|
userAccountInfoSchema,
|
|
26
26
|
} from "../schemas/userAccountInfoSchema.ts";
|
|
27
|
-
import { JwtProvider } from "./JwtProvider.ts";
|
|
27
|
+
import { JwtProvider, type SigningConfig } from "./JwtProvider.ts";
|
|
28
28
|
|
|
29
29
|
export class SecurityProvider {
|
|
30
30
|
protected readonly UNKNOWN_USER_NAME = "Anonymous User";
|
|
@@ -72,7 +72,9 @@ export class SecurityProvider {
|
|
|
72
72
|
on: "start",
|
|
73
73
|
handler: async () => {
|
|
74
74
|
for (const realm of this.realms) {
|
|
75
|
-
if (realm.
|
|
75
|
+
if (realm.signing) {
|
|
76
|
+
await this.jwt.setSigningKey(realm.name, realm.signing);
|
|
77
|
+
} else if (realm.secret) {
|
|
76
78
|
const secret =
|
|
77
79
|
typeof realm.secret === "function" ? realm.secret() : realm.secret;
|
|
78
80
|
this.jwt.setKeyLoader(realm.name, secret);
|
|
@@ -313,6 +315,10 @@ export class SecurityProvider {
|
|
|
313
315
|
const username = this.getUsernameFromPayload(payload);
|
|
314
316
|
const picture = this.getPictureFromPayload(payload);
|
|
315
317
|
const name = this.getNameFromPayload(payload);
|
|
318
|
+
const firstName =
|
|
319
|
+
typeof payload.given_name === "string" ? payload.given_name : undefined;
|
|
320
|
+
const lastName =
|
|
321
|
+
typeof payload.family_name === "string" ? payload.family_name : undefined;
|
|
316
322
|
const organization = this.getOrganizationFromPayload(payload);
|
|
317
323
|
const rolesFromSystem = this.getRoles(realmName);
|
|
318
324
|
const roles = rolesFromPayload
|
|
@@ -332,6 +338,8 @@ export class SecurityProvider {
|
|
|
332
338
|
id,
|
|
333
339
|
roles,
|
|
334
340
|
name,
|
|
341
|
+
firstName,
|
|
342
|
+
lastName,
|
|
335
343
|
email,
|
|
336
344
|
username,
|
|
337
345
|
picture,
|
|
@@ -703,6 +711,32 @@ export class SecurityProvider {
|
|
|
703
711
|
return this.realms;
|
|
704
712
|
}
|
|
705
713
|
|
|
714
|
+
/**
|
|
715
|
+
* Resolve the realm an authenticated admin action is allowed to operate on.
|
|
716
|
+
*
|
|
717
|
+
* Admin endpoints accept a client-supplied target realm (e.g. a
|
|
718
|
+
* `userRealmName` query param). Without scoping, a realm-A admin could act on
|
|
719
|
+
* realm-B resources by simply naming realm B — a cross-tenant escalation
|
|
720
|
+
* whenever realms are used as tenant boundaries. This binds the target realm
|
|
721
|
+
* to the caller's own realm: omitting the target means "my realm"; naming a
|
|
722
|
+
* *different* realm than the caller's is refused.
|
|
723
|
+
*
|
|
724
|
+
* Returns the effective realm to use (may be `undefined` in single-realm apps
|
|
725
|
+
* where neither the caller nor the request carries a realm).
|
|
726
|
+
*/
|
|
727
|
+
public assertRealmScope(
|
|
728
|
+
user: { realm?: string } | undefined,
|
|
729
|
+
requestedRealm: string | undefined,
|
|
730
|
+
): string | undefined {
|
|
731
|
+
const callerRealm = user?.realm;
|
|
732
|
+
if (requestedRealm && callerRealm && requestedRealm !== callerRealm) {
|
|
733
|
+
throw new ForbiddenError(
|
|
734
|
+
`Cross-realm access denied: authenticated in realm '${callerRealm}', requested realm '${requestedRealm}'.`,
|
|
735
|
+
);
|
|
736
|
+
}
|
|
737
|
+
return requestedRealm ?? callerRealm;
|
|
738
|
+
}
|
|
739
|
+
|
|
706
740
|
/**
|
|
707
741
|
* Retrieves the user account from the provided user ID.
|
|
708
742
|
*
|
|
@@ -983,6 +1017,13 @@ export interface Realm {
|
|
|
983
1017
|
*/
|
|
984
1018
|
secret?: string | JSONWebKeySet | (() => string);
|
|
985
1019
|
|
|
1020
|
+
/**
|
|
1021
|
+
* Asymmetric signing config. When set, this realm signs its tokens with an
|
|
1022
|
+
* asymmetric key and publishes the public keys via JWKS (see
|
|
1023
|
+
* `JwtProvider.getJwks`). Takes precedence over `secret`.
|
|
1024
|
+
*/
|
|
1025
|
+
signing?: SigningConfig;
|
|
1026
|
+
|
|
986
1027
|
/**
|
|
987
1028
|
* Create the user account info based on the raw JWT payload.
|
|
988
1029
|
* By default, SecurityProvider has his own implementation, but this method allow to override it.
|