alepha 0.22.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 +242 -230
- 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 -1109
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +454 -369
- 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 +169 -157
- 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 +244 -475
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +308 -383
- 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 +20 -39
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +51 -17
- 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 +383 -410
- package/dist/cli/platform-lib/index.d.ts.map +1 -1
- package/dist/cli/platform-lib/index.js +300 -258
- 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 +82 -194
- 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 +36 -90
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +65 -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 -6
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +107 -71
- 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 +47 -5
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +116 -12
- 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 +188 -29
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +480 -372
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +261 -47
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.browser.js +35 -0
- package/dist/react/sitemap/index.browser.js.map +1 -0
- package/dist/react/sitemap/index.d.ts +91 -0
- package/dist/react/sitemap/index.d.ts.map +1 -0
- package/dist/react/sitemap/index.js +131 -0
- package/dist/react/sitemap/index.js.map +1 -0
- 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 +215 -187
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1145 -86
- 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 +86 -4
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +121 -8
- 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 +134 -85
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +130 -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 +36 -36
- 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 -9
- 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 -0
- 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 -10
- 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 -88
- 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 -49
- 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/index.ts +0 -3
- package/src/cli/core/tasks/BuildCloudflareTask.ts +138 -245
- package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
- package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
- package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
- package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
- package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
- package/src/cli/i18n/services/I18nCheckService.ts +65 -11
- 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 +141 -50
- 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 +82 -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/providers/McpServerProvider.ts +55 -0
- 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 +71 -0
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
- 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 +124 -86
- package/src/react/form/services/parseField.ts +66 -27
- package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
- package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
- package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
- package/src/react/i18n/providers/I18nProvider.ts +173 -14
- 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/__tests__/RouterLocaleProvider.spec.ts +127 -0
- 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/index.browser.ts +4 -0
- package/src/react/router/index.shared.ts +1 -0
- package/src/react/router/index.ts +9 -0
- package/src/react/router/primitives/$page.ts +2 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +15 -1
- package/src/react/router/providers/ReactPageProvider.ts +38 -13
- package/src/react/router/providers/ReactServerProvider.ts +105 -16
- package/src/react/router/providers/RootComponentsProvider.ts +13 -0
- package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
- package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
- package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
- package/src/react/sitemap/index.browser.ts +21 -0
- package/src/react/sitemap/index.ts +25 -0
- package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
- package/src/react/sitemap/primitives/$sitemap.ts +196 -0
- 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/__tests__/appleClientSecret.spec.ts +34 -0
- package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
- package/src/server/auth/helpers/appleClientSecret.ts +24 -0
- package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
- package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
- package/src/server/auth/index.ts +1 -0
- 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 +67 -52
- 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 +82 -12
- 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 +32 -4
- 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 +14 -14
- package/src/server/core/primitives/$action.ts +26 -36
- package/src/server/core/primitives/$route.ts +27 -0
- 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/cli/core/tasks/BuildSitemapTask.ts +0 -130
- 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/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Alepha,
|
|
1
|
+
import { Alepha, z } from "alepha";
|
|
2
2
|
import { DateTimeProvider } from "alepha/datetime";
|
|
3
3
|
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
4
4
|
import { $batch, AlephaBatch } from "../index.ts";
|
|
@@ -27,7 +27,7 @@ describe("$batch primitive", () => {
|
|
|
27
27
|
const mockHandler = createMockHandler();
|
|
28
28
|
class TestApp {
|
|
29
29
|
batcher = $batch({
|
|
30
|
-
schema:
|
|
30
|
+
schema: z.text(),
|
|
31
31
|
maxSize: 3,
|
|
32
32
|
handler: mockHandler,
|
|
33
33
|
});
|
|
@@ -57,7 +57,7 @@ describe("$batch primitive", () => {
|
|
|
57
57
|
const mockHandler = createMockHandler();
|
|
58
58
|
class TestApp {
|
|
59
59
|
batcher = $batch({
|
|
60
|
-
schema:
|
|
60
|
+
schema: z.text(),
|
|
61
61
|
maxSize: 10,
|
|
62
62
|
maxDuration: [5, "seconds"],
|
|
63
63
|
handler: mockHandler,
|
|
@@ -83,7 +83,7 @@ describe("$batch primitive", () => {
|
|
|
83
83
|
const mockHandler = createMockHandler();
|
|
84
84
|
class TestApp {
|
|
85
85
|
batcher = $batch({
|
|
86
|
-
schema:
|
|
86
|
+
schema: z.object({ id: z.number(), value: z.text() }),
|
|
87
87
|
maxSize: 2,
|
|
88
88
|
partitionBy: (item) => `partition-${item.id}`,
|
|
89
89
|
handler: mockHandler,
|
|
@@ -126,7 +126,7 @@ describe("$batch primitive", () => {
|
|
|
126
126
|
const mockHandler = createMockHandler();
|
|
127
127
|
class TestApp {
|
|
128
128
|
batcher = $batch({
|
|
129
|
-
schema:
|
|
129
|
+
schema: z.text(),
|
|
130
130
|
maxSize: 10,
|
|
131
131
|
handler: mockHandler,
|
|
132
132
|
});
|
|
@@ -151,7 +151,7 @@ describe("$batch primitive", () => {
|
|
|
151
151
|
|
|
152
152
|
class TestApp {
|
|
153
153
|
batcher = $batch({
|
|
154
|
-
schema:
|
|
154
|
+
schema: z.text(),
|
|
155
155
|
maxSize: 1,
|
|
156
156
|
handler: failingHandler,
|
|
157
157
|
retry: { max: 2 }, // Try a total of 2 times
|
|
@@ -185,7 +185,7 @@ describe("$batch primitive", () => {
|
|
|
185
185
|
});
|
|
186
186
|
class TestApp {
|
|
187
187
|
batcher = $batch({
|
|
188
|
-
schema:
|
|
188
|
+
schema: z.text(),
|
|
189
189
|
maxSize: 1,
|
|
190
190
|
handler: mockHandler,
|
|
191
191
|
});
|
|
@@ -225,7 +225,7 @@ describe("$batch primitive", () => {
|
|
|
225
225
|
|
|
226
226
|
class TestApp {
|
|
227
227
|
batcher = $batch({
|
|
228
|
-
schema:
|
|
228
|
+
schema: z.text(),
|
|
229
229
|
maxSize: 1,
|
|
230
230
|
concurrency: 2,
|
|
231
231
|
handler: slowHandler,
|
|
@@ -254,7 +254,7 @@ describe("$batch primitive", () => {
|
|
|
254
254
|
const mockHandler = createMockHandler();
|
|
255
255
|
class TestApp {
|
|
256
256
|
batcher = $batch({
|
|
257
|
-
schema:
|
|
257
|
+
schema: z.object({ id: z.number(), value: z.text() }),
|
|
258
258
|
maxSize: 5,
|
|
259
259
|
partitionBy: (item) => `p-${item.id}`,
|
|
260
260
|
handler: mockHandler,
|
|
@@ -293,7 +293,7 @@ describe("$batch primitive", () => {
|
|
|
293
293
|
const mockHandler = createMockHandler();
|
|
294
294
|
class TestApp {
|
|
295
295
|
batcher = $batch({
|
|
296
|
-
schema:
|
|
296
|
+
schema: z.object({ id: z.number(), value: z.text() }),
|
|
297
297
|
maxSize: 5,
|
|
298
298
|
partitionBy: (item) => `p-${item.id}`,
|
|
299
299
|
handler: mockHandler,
|
|
@@ -319,7 +319,7 @@ describe("$batch primitive", () => {
|
|
|
319
319
|
const mockHandler = createMockHandler();
|
|
320
320
|
class TestApp {
|
|
321
321
|
batcher = $batch({
|
|
322
|
-
schema:
|
|
322
|
+
schema: z.number(), // Expects numbers
|
|
323
323
|
maxSize: 1,
|
|
324
324
|
handler: mockHandler,
|
|
325
325
|
});
|
|
@@ -344,7 +344,7 @@ describe("$batch primitive", () => {
|
|
|
344
344
|
const mockHandler = createMockHandler();
|
|
345
345
|
class TestApp {
|
|
346
346
|
batcher = $batch({
|
|
347
|
-
schema:
|
|
347
|
+
schema: z.text(),
|
|
348
348
|
maxSize: 5,
|
|
349
349
|
handler: mockHandler,
|
|
350
350
|
});
|
|
@@ -362,7 +362,7 @@ describe("$batch primitive", () => {
|
|
|
362
362
|
const mockHandler = createMockHandler();
|
|
363
363
|
class TestApp {
|
|
364
364
|
batcher = $batch({
|
|
365
|
-
schema:
|
|
365
|
+
schema: z.text(),
|
|
366
366
|
maxSize: 5,
|
|
367
367
|
maxDuration: [1, "second"],
|
|
368
368
|
partitionBy: (item) => item,
|
|
@@ -380,7 +380,7 @@ describe("$batch primitive", () => {
|
|
|
380
380
|
|
|
381
381
|
class TestApp {
|
|
382
382
|
httpBatch = $batch({
|
|
383
|
-
schema:
|
|
383
|
+
schema: z.text(),
|
|
384
384
|
maxSize: 10,
|
|
385
385
|
maxDuration: [100, "milliseconds"],
|
|
386
386
|
handler: async (urls) => {
|
|
@@ -435,7 +435,7 @@ describe("$batch primitive", () => {
|
|
|
435
435
|
|
|
436
436
|
class TestApp {
|
|
437
437
|
batcher = $batch({
|
|
438
|
-
schema:
|
|
438
|
+
schema: z.text(),
|
|
439
439
|
maxSize: 2,
|
|
440
440
|
maxDuration: [10, "seconds"],
|
|
441
441
|
handler: async (items: string[]) => {
|
|
@@ -482,7 +482,7 @@ describe("$batch primitive", () => {
|
|
|
482
482
|
|
|
483
483
|
class TestApp {
|
|
484
484
|
batcher = $batch({
|
|
485
|
-
schema:
|
|
485
|
+
schema: z.object({ id: z.number(), value: z.text() }),
|
|
486
486
|
maxSize: 2,
|
|
487
487
|
partitionBy: (item) => `p-${item.id}`,
|
|
488
488
|
handler: async (items) => {
|
|
@@ -526,7 +526,7 @@ describe("$batch primitive", () => {
|
|
|
526
526
|
|
|
527
527
|
class TestApp {
|
|
528
528
|
batcher = $batch({
|
|
529
|
-
schema:
|
|
529
|
+
schema: z.text(),
|
|
530
530
|
// Not providing maxSize, concurrency, or maxDuration
|
|
531
531
|
handler: mockHandler,
|
|
532
532
|
});
|
|
@@ -565,7 +565,7 @@ describe("$batch primitive", () => {
|
|
|
565
565
|
|
|
566
566
|
class TestApp {
|
|
567
567
|
batcher = $batch({
|
|
568
|
-
schema:
|
|
568
|
+
schema: z.text(),
|
|
569
569
|
// Not providing maxDuration, should default to 1 second
|
|
570
570
|
handler: mockHandler,
|
|
571
571
|
});
|
|
@@ -599,7 +599,7 @@ describe("$batch primitive", () => {
|
|
|
599
599
|
|
|
600
600
|
class TestApp {
|
|
601
601
|
batcher = $batch({
|
|
602
|
-
schema:
|
|
602
|
+
schema: z.text(),
|
|
603
603
|
maxSize: 1,
|
|
604
604
|
// Not providing concurrency, should default to 1
|
|
605
605
|
handler: slowHandler,
|
|
@@ -625,7 +625,7 @@ describe("$batch primitive", () => {
|
|
|
625
625
|
test("should track item status through lifecycle", async () => {
|
|
626
626
|
class TestApp {
|
|
627
627
|
batcher = $batch({
|
|
628
|
-
schema:
|
|
628
|
+
schema: z.text(),
|
|
629
629
|
maxSize: 10,
|
|
630
630
|
maxDuration: [100, "milliseconds"],
|
|
631
631
|
handler: async (items: string[]) => {
|
|
@@ -679,7 +679,7 @@ describe("$batch primitive", () => {
|
|
|
679
679
|
|
|
680
680
|
class TestApp {
|
|
681
681
|
batcher = $batch({
|
|
682
|
-
schema:
|
|
682
|
+
schema: z.text(),
|
|
683
683
|
maxSize: 10,
|
|
684
684
|
maxDuration: [100, "milliseconds"],
|
|
685
685
|
handler: mockHandler,
|
|
@@ -735,7 +735,7 @@ describe("$batch primitive", () => {
|
|
|
735
735
|
const mockHandler = createMockHandler();
|
|
736
736
|
class TestApp {
|
|
737
737
|
batcher = $batch({
|
|
738
|
-
schema:
|
|
738
|
+
schema: z.text(),
|
|
739
739
|
maxSize: 10,
|
|
740
740
|
handler: mockHandler,
|
|
741
741
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $hook, Alepha,
|
|
1
|
+
import { $hook, Alepha, z } from "alepha";
|
|
2
2
|
import { DateTimeProvider } from "alepha/datetime";
|
|
3
3
|
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
4
4
|
import { $batch, AlephaBatch } from "../index.ts";
|
|
@@ -33,7 +33,7 @@ describe("Batch startup buffering", () => {
|
|
|
33
33
|
|
|
34
34
|
class TestApp {
|
|
35
35
|
batcher = $batch({
|
|
36
|
-
schema:
|
|
36
|
+
schema: z.text(),
|
|
37
37
|
maxSize: 10, // Would normally trigger flush at 10 items
|
|
38
38
|
maxDuration: [1, "second"],
|
|
39
39
|
handler: mockHandler,
|
|
@@ -108,7 +108,7 @@ describe("Batch startup buffering", () => {
|
|
|
108
108
|
|
|
109
109
|
class TestApp {
|
|
110
110
|
batcher = $batch({
|
|
111
|
-
schema:
|
|
111
|
+
schema: z.text(),
|
|
112
112
|
maxSize: 100,
|
|
113
113
|
maxDuration: [100, "milliseconds"], // Short timeout
|
|
114
114
|
handler: mockHandler,
|
|
@@ -161,7 +161,7 @@ describe("Batch startup buffering", () => {
|
|
|
161
161
|
|
|
162
162
|
class TestApp {
|
|
163
163
|
batcher = $batch({
|
|
164
|
-
schema:
|
|
164
|
+
schema: z.text(),
|
|
165
165
|
maxSize: 100,
|
|
166
166
|
maxDuration: [1, "second"],
|
|
167
167
|
handler: mockHandler,
|
|
@@ -210,7 +210,7 @@ describe("Batch startup buffering", () => {
|
|
|
210
210
|
|
|
211
211
|
class TestApp {
|
|
212
212
|
batcher = $batch({
|
|
213
|
-
schema:
|
|
213
|
+
schema: z.object({ partition: z.text(), value: z.text() }),
|
|
214
214
|
maxSize: 5,
|
|
215
215
|
partitionBy: (item) => item.partition,
|
|
216
216
|
handler: mockHandler,
|
|
@@ -287,7 +287,7 @@ describe("Batch startup buffering", () => {
|
|
|
287
287
|
|
|
288
288
|
class TestApp {
|
|
289
289
|
batcher = $batch({
|
|
290
|
-
schema:
|
|
290
|
+
schema: z.text(),
|
|
291
291
|
maxSize: 3,
|
|
292
292
|
maxDuration: [500, "milliseconds"],
|
|
293
293
|
handler: mockHandler,
|
|
@@ -344,7 +344,7 @@ describe("Batch startup buffering", () => {
|
|
|
344
344
|
|
|
345
345
|
class TestApp {
|
|
346
346
|
batcher = $batch({
|
|
347
|
-
schema:
|
|
347
|
+
schema: z.text(),
|
|
348
348
|
maxSize: 10,
|
|
349
349
|
handler: mockHandler,
|
|
350
350
|
});
|
|
@@ -384,7 +384,7 @@ describe("Batch startup buffering", () => {
|
|
|
384
384
|
|
|
385
385
|
class TestApp {
|
|
386
386
|
batcher = $batch({
|
|
387
|
-
schema:
|
|
387
|
+
schema: z.text(),
|
|
388
388
|
maxSize: 5,
|
|
389
389
|
maxDuration: [10, "seconds"], // Long timeout so it doesn't interfere
|
|
390
390
|
handler: mockHandler,
|
|
@@ -426,7 +426,7 @@ describe("Batch startup buffering", () => {
|
|
|
426
426
|
|
|
427
427
|
class TestApp {
|
|
428
428
|
batcher = $batch({
|
|
429
|
-
schema:
|
|
429
|
+
schema: z.text(),
|
|
430
430
|
maxSize: 10,
|
|
431
431
|
handler: mockHandler,
|
|
432
432
|
});
|
package/src/bin/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ const alepha = Alepha.create({
|
|
|
7
7
|
APP_NAME: "CLI",
|
|
8
8
|
CLI_NAME: "alepha",
|
|
9
9
|
CLI_DESCRIPTION: `Alepha CLI v${version} - Create and manage Alepha projects.`,
|
|
10
|
-
LOG_FORMAT: (process.env.LOG_FORMAT ?? "
|
|
10
|
+
LOG_FORMAT: (process.env.LOG_FORMAT ?? "cli") as any,
|
|
11
11
|
LOG_LEVEL: process.env.LOG_LEVEL ?? "alepha.core:warn,info",
|
|
12
12
|
},
|
|
13
13
|
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { currentTenantAtom } from "alepha/security";
|
|
3
|
+
import { FileSystemProvider } from "alepha/system";
|
|
4
|
+
import { describe, expect, it } from "vitest";
|
|
5
|
+
import { MemoryFileStorageProvider } from "../providers/MemoryFileStorageProvider.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A tenant active on the current request/job (`currentTenantAtom`) scopes every
|
|
9
|
+
* file under a `{tenantId}/…` key prefix, so a pooled multi-tenant app keeps
|
|
10
|
+
* each tenant's objects isolated even when they reuse the same fileId. No tenant
|
|
11
|
+
* → the historical un-prefixed layout (covered tenant-less by the per-provider
|
|
12
|
+
* shared suites). Exercised here on the Memory provider; R2/S3/Local share the
|
|
13
|
+
* same `currentTenantAtom` resolution in their key/path builders.
|
|
14
|
+
*/
|
|
15
|
+
describe("tenant-scoped bucket storage", () => {
|
|
16
|
+
const BUCKET = "media";
|
|
17
|
+
const ID = "shared-id";
|
|
18
|
+
|
|
19
|
+
const setup = () => {
|
|
20
|
+
const alepha = Alepha.create();
|
|
21
|
+
const fs = alepha.inject(FileSystemProvider);
|
|
22
|
+
return {
|
|
23
|
+
alepha,
|
|
24
|
+
provider: alepha.inject(MemoryFileStorageProvider),
|
|
25
|
+
file: (text: string) => fs.createFile({ text, name: "f.txt" }),
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
it("isolates files per tenant and never collides on a shared fileId", async () => {
|
|
30
|
+
const { alepha, provider, file } = setup();
|
|
31
|
+
|
|
32
|
+
// Tenant A uploads under a shared id.
|
|
33
|
+
alepha.store.set(currentTenantAtom, { id: "org-a" });
|
|
34
|
+
await provider.upload(BUCKET, file("a"), ID);
|
|
35
|
+
expect(await provider.exists(BUCKET, ID)).toBe(true);
|
|
36
|
+
expect(await provider.list(BUCKET)).toEqual([ID]);
|
|
37
|
+
|
|
38
|
+
// Tenant B sees nothing of A's, and the same id does not collide.
|
|
39
|
+
alepha.store.set(currentTenantAtom, { id: "org-b" });
|
|
40
|
+
expect(await provider.exists(BUCKET, ID)).toBe(false);
|
|
41
|
+
expect(await provider.list(BUCKET)).toEqual([]);
|
|
42
|
+
await provider.upload(BUCKET, file("b"), ID);
|
|
43
|
+
expect(await provider.list(BUCKET)).toEqual([ID]);
|
|
44
|
+
expect(await (await provider.download(BUCKET, ID)).text()).toBe("b");
|
|
45
|
+
|
|
46
|
+
// Back to A — still A's bytes, untouched by B.
|
|
47
|
+
alepha.store.set(currentTenantAtom, { id: "org-a" });
|
|
48
|
+
expect(await (await provider.download(BUCKET, ID)).text()).toBe("a");
|
|
49
|
+
|
|
50
|
+
// Deleting in A leaves B intact.
|
|
51
|
+
await provider.delete(BUCKET, ID);
|
|
52
|
+
expect(await provider.exists(BUCKET, ID)).toBe(false);
|
|
53
|
+
alepha.store.set(currentTenantAtom, { id: "org-b" });
|
|
54
|
+
expect(await provider.exists(BUCKET, ID)).toBe(true);
|
|
55
|
+
|
|
56
|
+
// No tenant → a separate, un-prefixed namespace (neither tenant's files).
|
|
57
|
+
alepha.store.set(currentTenantAtom, undefined);
|
|
58
|
+
expect(await provider.list(BUCKET)).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -12,10 +12,11 @@ import {
|
|
|
12
12
|
AlephaError,
|
|
13
13
|
type FileLike,
|
|
14
14
|
type Static,
|
|
15
|
-
|
|
15
|
+
z,
|
|
16
16
|
} from "alepha";
|
|
17
17
|
import { CryptoProvider } from "alepha/crypto";
|
|
18
18
|
import { $logger } from "alepha/logger";
|
|
19
|
+
import { currentTenantAtom } from "alepha/security";
|
|
19
20
|
import { FileDetector, FileSystemProvider } from "alepha/system";
|
|
20
21
|
import { FileNotFoundError } from "../errors/FileNotFoundError.ts";
|
|
21
22
|
import { $bucket } from "../primitives/$bucket.ts";
|
|
@@ -28,10 +29,10 @@ import type { FileStorageProvider } from "./FileStorageProvider.ts";
|
|
|
28
29
|
*/
|
|
29
30
|
export const localFileStorageOptions = $atom({
|
|
30
31
|
name: "alepha.bucket.local.options",
|
|
31
|
-
schema:
|
|
32
|
-
storagePath:
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
schema: z.object({
|
|
33
|
+
storagePath: z
|
|
34
|
+
.string()
|
|
35
|
+
.describe("Directory path where files will be stored"),
|
|
35
36
|
}),
|
|
36
37
|
default: {
|
|
37
38
|
storagePath: "node_modules/.alepha/buckets",
|
|
@@ -106,6 +107,9 @@ export class LocalFileStorageProvider implements FileStorageProvider {
|
|
|
106
107
|
|
|
107
108
|
this.log.trace(`Uploading file to ${bucketName}`);
|
|
108
109
|
|
|
110
|
+
// The per-tenant sub-directory isn't pre-created by `onStart` (which only
|
|
111
|
+
// knows the un-scoped bucket name), so ensure it exists before writing.
|
|
112
|
+
await mkdir(this.path(bucketName), { recursive: true });
|
|
109
113
|
await this.fileSystemProvider.writeFile(
|
|
110
114
|
this.path(bucketName, fileId),
|
|
111
115
|
file,
|
|
@@ -198,7 +202,11 @@ export class LocalFileStorageProvider implements FileStorageProvider {
|
|
|
198
202
|
}
|
|
199
203
|
|
|
200
204
|
protected path(bucket: string, fileId = ""): string {
|
|
201
|
-
|
|
205
|
+
// Per-tenant directory when a tenant is active, mirroring R2/S3 isolation.
|
|
206
|
+
const tenantId = this.alepha.store.get(currentTenantAtom)?.id;
|
|
207
|
+
return tenantId
|
|
208
|
+
? join(this.storagePath, tenantId, bucket, fileId)
|
|
209
|
+
: join(this.storagePath, bucket, fileId);
|
|
202
210
|
}
|
|
203
211
|
|
|
204
212
|
protected isErrorNoEntry(error: unknown): boolean {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { $inject, type FileLike } from "alepha";
|
|
1
|
+
import { $inject, Alepha, type FileLike } from "alepha";
|
|
2
2
|
import { CryptoProvider } from "alepha/crypto";
|
|
3
|
+
import { currentTenantAtom } from "alepha/security";
|
|
3
4
|
import { FileDetector, FileSystemProvider } from "alepha/system";
|
|
4
5
|
import { FileNotFoundError } from "../errors/FileNotFoundError.ts";
|
|
5
6
|
import type { FileStorageProvider } from "./FileStorageProvider.ts";
|
|
@@ -13,6 +14,7 @@ interface StoredFile {
|
|
|
13
14
|
|
|
14
15
|
export class MemoryFileStorageProvider implements FileStorageProvider {
|
|
15
16
|
public readonly files: Record<string, StoredFile> = {};
|
|
17
|
+
protected readonly alepha = $inject(Alepha);
|
|
16
18
|
protected readonly fileSystem = $inject(FileSystemProvider);
|
|
17
19
|
protected readonly fileDetector = $inject(FileDetector);
|
|
18
20
|
protected readonly crypto = $inject(CryptoProvider);
|
|
@@ -31,7 +33,7 @@ export class MemoryFileStorageProvider implements FileStorageProvider {
|
|
|
31
33
|
}
|
|
32
34
|
const buffer = Buffer.concat(chunks);
|
|
33
35
|
|
|
34
|
-
this.files[
|
|
36
|
+
this.files[this.key(bucketName, fileId)] = {
|
|
35
37
|
buffer,
|
|
36
38
|
name: file.name,
|
|
37
39
|
type: file.type,
|
|
@@ -42,7 +44,7 @@ export class MemoryFileStorageProvider implements FileStorageProvider {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
public async download(bucketName: string, fileId: string): Promise<FileLike> {
|
|
45
|
-
const fileKey =
|
|
47
|
+
const fileKey = this.key(bucketName, fileId);
|
|
46
48
|
const stored = this.files[fileKey];
|
|
47
49
|
|
|
48
50
|
if (!stored) {
|
|
@@ -59,11 +61,11 @@ export class MemoryFileStorageProvider implements FileStorageProvider {
|
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
public async exists(bucketName: string, fileId: string): Promise<boolean> {
|
|
62
|
-
return
|
|
64
|
+
return this.key(bucketName, fileId) in this.files;
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
public async delete(bucketName: string, fileId: string): Promise<void> {
|
|
66
|
-
const fileKey =
|
|
68
|
+
const fileKey = this.key(bucketName, fileId);
|
|
67
69
|
if (!(fileKey in this.files)) {
|
|
68
70
|
throw new FileNotFoundError(`File with ID ${fileId} not found.`);
|
|
69
71
|
}
|
|
@@ -76,17 +78,26 @@ export class MemoryFileStorageProvider implements FileStorageProvider {
|
|
|
76
78
|
fileIds: string[],
|
|
77
79
|
): Promise<void> {
|
|
78
80
|
for (const id of fileIds) {
|
|
79
|
-
delete this.files[
|
|
81
|
+
delete this.files[this.key(bucketName, id)];
|
|
80
82
|
}
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
public async list(bucketName: string): Promise<string[]> {
|
|
84
|
-
const prefix =
|
|
86
|
+
const prefix = this.key(bucketName, "");
|
|
85
87
|
return Object.keys(this.files)
|
|
86
88
|
.filter((key) => key.startsWith(prefix))
|
|
87
89
|
.map((key) => key.slice(prefix.length));
|
|
88
90
|
}
|
|
89
91
|
|
|
92
|
+
/**
|
|
93
|
+
* In-memory key, tenant-scoped when a tenant is active (`currentTenantAtom`),
|
|
94
|
+
* mirroring the R2/Local/S3 layout: `{tenantId}/{bucket}/{fileId}`.
|
|
95
|
+
*/
|
|
96
|
+
protected key(bucket: string, fileId = ""): string {
|
|
97
|
+
const tenantId = this.alepha.store.get(currentTenantAtom)?.id;
|
|
98
|
+
return tenantId ? `${tenantId}/${bucket}/${fileId}` : `${bucket}/${fileId}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
90
101
|
protected createId(): string {
|
|
91
102
|
return this.crypto.randomUUID();
|
|
92
103
|
}
|
|
@@ -6,10 +6,11 @@ import {
|
|
|
6
6
|
Alepha,
|
|
7
7
|
AlephaError,
|
|
8
8
|
type FileLike,
|
|
9
|
-
|
|
9
|
+
z,
|
|
10
10
|
} from "alepha";
|
|
11
11
|
import { CryptoProvider } from "alepha/crypto";
|
|
12
12
|
import { $logger } from "alepha/logger";
|
|
13
|
+
import { currentTenantAtom } from "alepha/security";
|
|
13
14
|
import { FileNotFoundError } from "../errors/FileNotFoundError.ts";
|
|
14
15
|
import { $bucket } from "../primitives/$bucket.ts";
|
|
15
16
|
import type { FileStorageProvider } from "./FileStorageProvider.ts";
|
|
@@ -66,13 +67,11 @@ export class R2FileStorageProvider implements FileStorageProvider {
|
|
|
66
67
|
protected readonly log = $logger();
|
|
67
68
|
protected readonly crypto = $inject(CryptoProvider);
|
|
68
69
|
protected readonly env = $env(
|
|
69
|
-
|
|
70
|
+
z.object({
|
|
70
71
|
/**
|
|
71
72
|
* The actual R2 bucket name in Cloudflare.
|
|
72
73
|
*/
|
|
73
|
-
R2_BUCKET_NAME:
|
|
74
|
-
description: "R2 bucket name in Cloudflare",
|
|
75
|
-
}),
|
|
74
|
+
R2_BUCKET_NAME: z.string().describe("R2 bucket name in Cloudflare"),
|
|
76
75
|
}),
|
|
77
76
|
);
|
|
78
77
|
|
|
@@ -237,10 +236,19 @@ export class R2FileStorageProvider implements FileStorageProvider {
|
|
|
237
236
|
}
|
|
238
237
|
|
|
239
238
|
/**
|
|
240
|
-
* Build the full R2 key: {prefix}/{bucketName}/{fileId}
|
|
239
|
+
* Build the full R2 key: {prefix}/{tenantId}/{bucketName}/{fileId}
|
|
240
|
+
*
|
|
241
|
+
* When a tenant is active on the current request/job (`currentTenantAtom`),
|
|
242
|
+
* its id is inserted as a directory so a pooled multi-tenant worker keeps
|
|
243
|
+
* each tenant's objects isolated. No tenant → the historical
|
|
244
|
+
* `{prefix}/{bucketName}/{fileId}` layout is unchanged.
|
|
241
245
|
*/
|
|
242
246
|
protected key(bucketName: string, fileId: string): string {
|
|
243
247
|
const parts = [bucketName, fileId];
|
|
248
|
+
const tenantId = this.alepha.store.get(currentTenantAtom)?.id;
|
|
249
|
+
if (tenantId) {
|
|
250
|
+
parts.unshift(tenantId);
|
|
251
|
+
}
|
|
244
252
|
if (this.prefix) {
|
|
245
253
|
parts.unshift(this.prefix);
|
|
246
254
|
}
|
|
@@ -9,17 +9,18 @@ import {
|
|
|
9
9
|
AlephaError,
|
|
10
10
|
type FileLike,
|
|
11
11
|
type Static,
|
|
12
|
-
|
|
12
|
+
z,
|
|
13
13
|
} from "alepha";
|
|
14
14
|
import { CryptoProvider } from "alepha/crypto";
|
|
15
15
|
import { $logger } from "alepha/logger";
|
|
16
|
+
import { currentTenantAtom } from "alepha/security";
|
|
16
17
|
import { FileDetector, FileSystemProvider } from "alepha/system";
|
|
17
18
|
import { S3mini } from "s3mini";
|
|
18
19
|
import { FileNotFoundError } from "../errors/FileNotFoundError.ts";
|
|
19
20
|
import { $bucket } from "../primitives/$bucket.ts";
|
|
20
21
|
import type { FileStorageProvider } from "./FileStorageProvider.ts";
|
|
21
22
|
|
|
22
|
-
const envSchema =
|
|
23
|
+
const envSchema = z.object({
|
|
23
24
|
/**
|
|
24
25
|
* S3 endpoint URL. The bucket name is appended (path-style) per request.
|
|
25
26
|
*
|
|
@@ -29,24 +30,24 @@ const envSchema = t.object({
|
|
|
29
30
|
* - MinIO: `http://localhost:9000`
|
|
30
31
|
* - DigitalOcean Spaces: `https://<region>.digitaloceanspaces.com`
|
|
31
32
|
*/
|
|
32
|
-
S3_ENDPOINT:
|
|
33
|
+
S3_ENDPOINT: z.string(),
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* AWS region or "auto" for R2.
|
|
36
37
|
*
|
|
37
38
|
* @default "auto"
|
|
38
39
|
*/
|
|
39
|
-
S3_REGION:
|
|
40
|
+
S3_REGION: z.string().optional(),
|
|
40
41
|
|
|
41
42
|
/**
|
|
42
43
|
* Access key ID for S3 authentication.
|
|
43
44
|
*/
|
|
44
|
-
S3_ACCESS_KEY_ID:
|
|
45
|
+
S3_ACCESS_KEY_ID: z.string(),
|
|
45
46
|
|
|
46
47
|
/**
|
|
47
48
|
* Secret access key for S3 authentication.
|
|
48
49
|
*/
|
|
49
|
-
S3_SECRET_ACCESS_KEY:
|
|
50
|
+
S3_SECRET_ACCESS_KEY: z.string(),
|
|
50
51
|
});
|
|
51
52
|
|
|
52
53
|
declare module "alepha" {
|
|
@@ -121,6 +122,15 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
121
122
|
},
|
|
122
123
|
});
|
|
123
124
|
|
|
125
|
+
/**
|
|
126
|
+
* Object key, tenant-scoped when a tenant is active (`currentTenantAtom`):
|
|
127
|
+
* `{tenantId}/{fileId}` within the per-bucket S3 bucket. No tenant → `{fileId}`.
|
|
128
|
+
*/
|
|
129
|
+
protected key(fileId: string): string {
|
|
130
|
+
const tenantId = this.alepha.store.get(currentTenantAtom)?.id;
|
|
131
|
+
return tenantId ? `${tenantId}/${fileId}` : fileId;
|
|
132
|
+
}
|
|
133
|
+
|
|
124
134
|
protected createId(mimeType: string): string {
|
|
125
135
|
const ext = this.fileDetector.getExtensionFromMimeType(mimeType);
|
|
126
136
|
return `${this.crypto.randomUUID()}.${ext}`;
|
|
@@ -142,7 +152,7 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
142
152
|
try {
|
|
143
153
|
const buffer = new Uint8Array(await file.arrayBuffer());
|
|
144
154
|
await client.putObject(
|
|
145
|
-
fileId,
|
|
155
|
+
this.key(fileId),
|
|
146
156
|
buffer,
|
|
147
157
|
file.type || "application/octet-stream",
|
|
148
158
|
undefined,
|
|
@@ -169,7 +179,7 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
169
179
|
);
|
|
170
180
|
|
|
171
181
|
const client = this.getClient(bucketName);
|
|
172
|
-
const response = await client.getObjectResponse(fileId);
|
|
182
|
+
const response = await client.getObjectResponse(this.key(fileId));
|
|
173
183
|
|
|
174
184
|
if (!response) {
|
|
175
185
|
throw new FileNotFoundError(
|
|
@@ -211,7 +221,7 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
211
221
|
);
|
|
212
222
|
|
|
213
223
|
const client = this.getClient(bucketName);
|
|
214
|
-
const result = await client.objectExists(fileId);
|
|
224
|
+
const result = await client.objectExists(this.key(fileId));
|
|
215
225
|
return result === true;
|
|
216
226
|
}
|
|
217
227
|
|
|
@@ -221,7 +231,7 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
221
231
|
const client = this.getClient(bucketName);
|
|
222
232
|
|
|
223
233
|
try {
|
|
224
|
-
await client.deleteObject(fileId);
|
|
234
|
+
await client.deleteObject(this.key(fileId));
|
|
225
235
|
} catch (error) {
|
|
226
236
|
this.log.error(`Failed to delete file: ${error}`);
|
|
227
237
|
if (error instanceof Error) {
|
|
@@ -234,10 +244,16 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
234
244
|
public async list(bucketName: string): Promise<string[]> {
|
|
235
245
|
this.log.trace(`Listing files in bucket '${bucketName}'...`);
|
|
236
246
|
const client = this.getClient(bucketName);
|
|
247
|
+
const tenantId = this.alepha.store.get(currentTenantAtom)?.id;
|
|
248
|
+
const prefix = tenantId ? `${tenantId}/` : undefined;
|
|
237
249
|
// Flat, single-page listing (~1000 keys). Not a search API.
|
|
238
|
-
const objects = await client.listObjects();
|
|
250
|
+
const objects = await client.listObjects(undefined, prefix);
|
|
239
251
|
if (!objects) return [];
|
|
240
|
-
return objects.map((object) =>
|
|
252
|
+
return objects.map((object) =>
|
|
253
|
+
prefix && object.Key.startsWith(prefix)
|
|
254
|
+
? object.Key.slice(prefix.length)
|
|
255
|
+
: object.Key,
|
|
256
|
+
);
|
|
241
257
|
}
|
|
242
258
|
|
|
243
259
|
public async deleteMany(
|
|
@@ -251,7 +267,7 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
251
267
|
const client = this.getClient(bucketName);
|
|
252
268
|
// S3 DeleteObjects caps at 1000 keys per request.
|
|
253
269
|
for (let i = 0; i < fileIds.length; i += 1000) {
|
|
254
|
-
const
|
|
270
|
+
const keys = fileIds.slice(i, i + 1000).map((id) => this.key(id));
|
|
255
271
|
try {
|
|
256
272
|
// bun:s3 client exposes a per-key deleteObject; some SDKs also expose
|
|
257
273
|
// deleteObjects(keys: string[]). Prefer batch when available.
|
|
@@ -261,9 +277,9 @@ export class S3FileStorageProvider implements FileStorageProvider {
|
|
|
261
277
|
}
|
|
262
278
|
).deleteObjects;
|
|
263
279
|
if (typeof batch === "function") {
|
|
264
|
-
await batch.call(client,
|
|
280
|
+
await batch.call(client, keys);
|
|
265
281
|
} else {
|
|
266
|
-
await Promise.all(
|
|
282
|
+
await Promise.all(keys.map((key) => client.deleteObject(key)));
|
|
267
283
|
}
|
|
268
284
|
} catch (error) {
|
|
269
285
|
this.log.error(`Failed to delete files: ${error}`);
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
Primitive,
|
|
11
11
|
type Service,
|
|
12
12
|
type Static,
|
|
13
|
-
|
|
13
|
+
z,
|
|
14
14
|
} from "alepha";
|
|
15
15
|
import { DateTimeProvider, type DurationLike } from "alepha/datetime";
|
|
16
16
|
import { CacheProvider } from "../providers/CacheProvider.ts";
|
|
@@ -225,15 +225,12 @@ export interface CachePrimitiveOptions<
|
|
|
225
225
|
*/
|
|
226
226
|
export const cacheOptions = $atom({
|
|
227
227
|
name: "alepha.cache.options",
|
|
228
|
-
schema:
|
|
229
|
-
enabled:
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
default: 300,
|
|
235
|
-
description: "Default time to live for cache entries in seconds.",
|
|
236
|
-
}),
|
|
228
|
+
schema: z.object({
|
|
229
|
+
enabled: z.boolean().describe("Whether caching is enabled.").default(true),
|
|
230
|
+
defaultTtl: z
|
|
231
|
+
.number()
|
|
232
|
+
.describe("Default time to live for cache entries in seconds.")
|
|
233
|
+
.default(300),
|
|
237
234
|
}),
|
|
238
235
|
default: {
|
|
239
236
|
enabled: true,
|