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
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
ReactPageProvider,
|
|
14
14
|
type ReactRouterState,
|
|
15
15
|
} from "./ReactPageProvider.ts";
|
|
16
|
+
import { RouterLocaleProvider } from "./RouterLocaleProvider.ts";
|
|
16
17
|
|
|
17
18
|
export interface BrowserRoute extends Route {
|
|
18
19
|
page: PageRoute;
|
|
@@ -26,6 +27,7 @@ export class ReactBrowserRouterProvider extends RouterProvider<BrowserRoute> {
|
|
|
26
27
|
protected readonly alepha = $inject(Alepha);
|
|
27
28
|
protected readonly pageApi = $inject(ReactPageProvider);
|
|
28
29
|
protected readonly browserHeadProvider = $inject(BrowserHeadProvider);
|
|
30
|
+
protected readonly localeProvider = $inject(RouterLocaleProvider);
|
|
29
31
|
|
|
30
32
|
public add(entry: PageRouteEntry) {
|
|
31
33
|
this.pageApi.add(entry);
|
|
@@ -75,7 +77,19 @@ export class ReactBrowserRouterProvider extends RouterProvider<BrowserRoute> {
|
|
|
75
77
|
});
|
|
76
78
|
|
|
77
79
|
try {
|
|
78
|
-
|
|
80
|
+
// In locale-prefix mode the URL is the source of truth for language:
|
|
81
|
+
// strip a leading `/fr`-style segment and remember it (the i18n module
|
|
82
|
+
// reacts to this to switch dictionaries), then match on the canonical
|
|
83
|
+
// path so the single page tree still resolves. `state.url` keeps the
|
|
84
|
+
// full prefixed URL so generated links carry the prefix forward.
|
|
85
|
+
let matchPathname = pathname;
|
|
86
|
+
if (this.localeProvider.enabled) {
|
|
87
|
+
const detected = this.localeProvider.detect(pathname);
|
|
88
|
+
this.localeProvider.current = detected.locale;
|
|
89
|
+
matchPathname = detected.pathname;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const { route, params } = this.match(matchPathname);
|
|
79
93
|
|
|
80
94
|
const query: Record<string, string> = {};
|
|
81
95
|
if (search) {
|
|
@@ -5,10 +5,11 @@ import {
|
|
|
5
5
|
$state,
|
|
6
6
|
Alepha,
|
|
7
7
|
AlephaError,
|
|
8
|
+
coerceObject,
|
|
8
9
|
OPTIONS,
|
|
9
10
|
PipelineHandler,
|
|
10
11
|
type TSchema,
|
|
11
|
-
|
|
12
|
+
z,
|
|
12
13
|
} from "alepha";
|
|
13
14
|
import { DateTimeProvider } from "alepha/datetime";
|
|
14
15
|
import { $logger } from "alepha/logger";
|
|
@@ -27,17 +28,19 @@ import {
|
|
|
27
28
|
type PagePrimitive,
|
|
28
29
|
type PagePrimitiveOptions,
|
|
29
30
|
} from "../primitives/$page.ts";
|
|
31
|
+
import { RootComponentsProvider } from "./RootComponentsProvider.ts";
|
|
32
|
+
import { RouterLocaleProvider } from "./RouterLocaleProvider.ts";
|
|
30
33
|
|
|
31
34
|
// -------------------------------------------------------------------------------------------------------------------
|
|
32
35
|
|
|
33
36
|
export const reactPageOptions = $atom({
|
|
34
37
|
name: "alepha.react.page.options",
|
|
35
38
|
description: "Configuration options for the React page provider.",
|
|
36
|
-
schema:
|
|
39
|
+
schema: z.object({
|
|
37
40
|
/**
|
|
38
41
|
* Enable React StrictMode wrapper.
|
|
39
42
|
*/
|
|
40
|
-
strictMode:
|
|
43
|
+
strictMode: z.boolean().default(true),
|
|
41
44
|
/**
|
|
42
45
|
* RegExp pattern (as string) to detect file-like URLs (e.g. /hello.txt, /wp-login.php).
|
|
43
46
|
* When a request hits the catch-all wildcard route and matches this pattern,
|
|
@@ -47,7 +50,7 @@ export const reactPageOptions = $atom({
|
|
|
47
50
|
*
|
|
48
51
|
* @default "\\.[a-zA-Z0-9]{1,10}$"
|
|
49
52
|
*/
|
|
50
|
-
staticFilePattern:
|
|
53
|
+
staticFilePattern: z.string(),
|
|
51
54
|
}),
|
|
52
55
|
default: {
|
|
53
56
|
strictMode: true,
|
|
@@ -65,6 +68,8 @@ export class ReactPageProvider {
|
|
|
65
68
|
protected readonly log = $logger();
|
|
66
69
|
protected readonly options = $state(reactPageOptions);
|
|
67
70
|
protected readonly alepha = $inject(Alepha);
|
|
71
|
+
protected readonly rootComponentsProvider = $inject(RootComponentsProvider);
|
|
72
|
+
protected readonly localeProvider = $inject(RouterLocaleProvider);
|
|
68
73
|
protected readonly pages: PageRoute[] = [];
|
|
69
74
|
protected nextIdCursor = 0;
|
|
70
75
|
|
|
@@ -213,6 +218,12 @@ export class ReactPageProvider {
|
|
|
213
218
|
}
|
|
214
219
|
|
|
215
220
|
url = this.compile(url, options.params ?? {});
|
|
221
|
+
url = url.replace(/\/\/+/g, "/") || "/";
|
|
222
|
+
|
|
223
|
+
// Apply the active locale prefix (e.g. `/about` → `/fr/about`) to the path
|
|
224
|
+
// portion only, before any query string is appended. A no-op unless
|
|
225
|
+
// `routing: "prefix"` is enabled on the i18n module.
|
|
226
|
+
url = this.localeProvider.withPrefix(url);
|
|
216
227
|
|
|
217
228
|
if (options.query) {
|
|
218
229
|
const query = new URLSearchParams(options.query);
|
|
@@ -221,7 +232,7 @@ export class ReactPageProvider {
|
|
|
221
232
|
}
|
|
222
233
|
}
|
|
223
234
|
|
|
224
|
-
return url
|
|
235
|
+
return url;
|
|
225
236
|
}
|
|
226
237
|
|
|
227
238
|
public url(
|
|
@@ -240,6 +251,7 @@ export class ReactPageProvider {
|
|
|
240
251
|
AlephaContext.Provider,
|
|
241
252
|
{ value: this.alepha },
|
|
242
253
|
createElement(NestedView, {}, state.layers[0]?.element),
|
|
254
|
+
...this.rootComponentsProvider.rootComponents,
|
|
243
255
|
);
|
|
244
256
|
|
|
245
257
|
if (this.options.strictMode) {
|
|
@@ -253,15 +265,16 @@ export class ReactPageProvider {
|
|
|
253
265
|
schema?: TSchema,
|
|
254
266
|
value?: any,
|
|
255
267
|
): any => {
|
|
256
|
-
if (
|
|
268
|
+
if (z.schema.isObject(schema) && typeof value === "object") {
|
|
257
269
|
for (const key in schema.properties) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
)
|
|
270
|
+
// Peel optional/nullable/default wrappers so a field declared as
|
|
271
|
+
// `z.object(...).optional()` is still recognised as an object whose
|
|
272
|
+
// JSON-encoded query value needs parsing.
|
|
273
|
+
const propSchema = z.schema.unwrap(schema.properties[key]);
|
|
274
|
+
if (z.schema.isObject(propSchema) && typeof value[key] === "string") {
|
|
262
275
|
try {
|
|
263
276
|
value[key] = this.alepha.codec.decode(
|
|
264
|
-
|
|
277
|
+
propSchema,
|
|
265
278
|
decodeURIComponent(value[key]),
|
|
266
279
|
);
|
|
267
280
|
} catch (e) {
|
|
@@ -302,7 +315,13 @@ export class ReactPageProvider {
|
|
|
302
315
|
try {
|
|
303
316
|
this.convertStringObjectToObject(route.schema?.query, state.query);
|
|
304
317
|
config.query = route.schema?.query
|
|
305
|
-
? this.alepha.codec.decode(
|
|
318
|
+
? this.alepha.codec.decode(
|
|
319
|
+
route.schema.query,
|
|
320
|
+
// Query params arrive as strings from the URL; coerce declared
|
|
321
|
+
// scalar fields (number/integer/boolean) to their schema type
|
|
322
|
+
// before strict validation, mirroring the HTTP server boundary.
|
|
323
|
+
coerceObject(route.schema.query, state.query),
|
|
324
|
+
)
|
|
306
325
|
: {};
|
|
307
326
|
} catch (e) {
|
|
308
327
|
it.error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -311,7 +330,13 @@ export class ReactPageProvider {
|
|
|
311
330
|
|
|
312
331
|
try {
|
|
313
332
|
config.params = route.schema?.params
|
|
314
|
-
? this.alepha.codec.decode(
|
|
333
|
+
? this.alepha.codec.decode(
|
|
334
|
+
route.schema.params,
|
|
335
|
+
// URL path params arrive as strings; coerce declared scalar
|
|
336
|
+
// fields (number/integer/boolean) to their schema type before
|
|
337
|
+
// strict validation, mirroring `query` above and the HTTP server.
|
|
338
|
+
coerceObject(route.schema.params, state.params),
|
|
339
|
+
)
|
|
315
340
|
: {};
|
|
316
341
|
} catch (e) {
|
|
317
342
|
it.error = e instanceof Error ? e : new Error(String(e));
|
|
@@ -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";
|
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
reactPageOptions,
|
|
33
33
|
} from "./ReactPageProvider.ts";
|
|
34
34
|
import { ReactServerTemplateProvider } from "./ReactServerTemplateProvider.ts";
|
|
35
|
+
import { RouterLocaleProvider } from "./RouterLocaleProvider.ts";
|
|
35
36
|
import { SSRManifestProvider } from "./SSRManifestProvider.ts";
|
|
36
37
|
|
|
37
38
|
/**
|
|
@@ -66,6 +67,7 @@ export class ReactServerProvider {
|
|
|
66
67
|
protected readonly serverStaticProvider = $inject(ServerStaticProvider);
|
|
67
68
|
protected readonly serverRouterProvider = $inject(ServerRouterProvider);
|
|
68
69
|
protected readonly ssrManifestProvider = $inject(SSRManifestProvider);
|
|
70
|
+
protected readonly localeProvider = $inject(RouterLocaleProvider);
|
|
69
71
|
|
|
70
72
|
/**
|
|
71
73
|
* Cached check for ServerLinksProvider - avoids has() lookup per request.
|
|
@@ -148,13 +150,39 @@ export class ReactServerProvider {
|
|
|
148
150
|
? new PipelineHandler(rawHandler, serverMiddleware)
|
|
149
151
|
: rawHandler;
|
|
150
152
|
|
|
153
|
+
// Canonical (default-locale) route, served unprefixed.
|
|
151
154
|
this.serverRouterProvider.createRoute({
|
|
152
155
|
...page,
|
|
153
156
|
schema: undefined, // schema is handled by the page primitive provider
|
|
157
|
+
// A page's `static` is page-shaped (`{ entries }`) and handled by the
|
|
158
|
+
// page prerender pass — it must not leak into the route's boolean
|
|
159
|
+
// `static` snapshot flag.
|
|
160
|
+
static: undefined,
|
|
154
161
|
method: "GET",
|
|
155
162
|
path: page.match,
|
|
156
163
|
handler,
|
|
157
164
|
});
|
|
165
|
+
|
|
166
|
+
// Locale-prefixed variants (`/fr/about`, …) point at the SAME handler.
|
|
167
|
+
// The handler reads the active locale back out of the request URL, so
|
|
168
|
+
// no extra route param is needed and matching stays native.
|
|
169
|
+
if (this.localeProvider.enabled) {
|
|
170
|
+
for (const locale of this.localeProvider.prefixedLocales) {
|
|
171
|
+
const prefixedPath = this.localeProvider.withPrefix(
|
|
172
|
+
page.match,
|
|
173
|
+
locale,
|
|
174
|
+
);
|
|
175
|
+
this.log.debug(`+ ${prefixedPath} -> ${page.name} (${locale})`);
|
|
176
|
+
this.serverRouterProvider.createRoute({
|
|
177
|
+
...page,
|
|
178
|
+
schema: undefined,
|
|
179
|
+
static: undefined,
|
|
180
|
+
method: "GET",
|
|
181
|
+
path: prefixedPath,
|
|
182
|
+
handler,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
158
186
|
}
|
|
159
187
|
}
|
|
160
188
|
}
|
|
@@ -315,6 +343,15 @@ export class ReactServerProvider {
|
|
|
315
343
|
|
|
316
344
|
this.log.trace("Rendering page", { name: route.name });
|
|
317
345
|
|
|
346
|
+
// Locale-prefix mode: the URL is the source of truth for language.
|
|
347
|
+
// Record the active locale so links built during SSR (`pathname()`)
|
|
348
|
+
// carry the prefix, and so hreflang alternates can be emitted.
|
|
349
|
+
if (this.localeProvider.enabled) {
|
|
350
|
+
this.localeProvider.current = this.localeProvider.detect(
|
|
351
|
+
url.pathname,
|
|
352
|
+
).locale;
|
|
353
|
+
}
|
|
354
|
+
|
|
318
355
|
// Initialize router state
|
|
319
356
|
const state: ReactRouterState = {
|
|
320
357
|
url,
|
|
@@ -386,7 +423,20 @@ export class ReactServerProvider {
|
|
|
386
423
|
}
|
|
387
424
|
|
|
388
425
|
// Resolve global head for early streaming (htmlAttributes only)
|
|
389
|
-
|
|
426
|
+
let globalHead = this.serverHeadProvider.resolveGlobalHead();
|
|
427
|
+
|
|
428
|
+
// In locale-prefix mode the language is known from the URL before any
|
|
429
|
+
// rendering, so stamp the correct `<html lang>` onto the early head
|
|
430
|
+
// (per-request copy — never mutate the shared global head).
|
|
431
|
+
if (this.localeProvider.enabled) {
|
|
432
|
+
globalHead = {
|
|
433
|
+
...globalHead,
|
|
434
|
+
htmlAttributes: {
|
|
435
|
+
...globalHead?.htmlAttributes,
|
|
436
|
+
lang: this.localeProvider.current,
|
|
437
|
+
},
|
|
438
|
+
};
|
|
439
|
+
}
|
|
390
440
|
|
|
391
441
|
// Create optimized HTML stream with early head
|
|
392
442
|
const htmlStream = this.templateProvider.createEarlyHtmlStream(
|
|
@@ -450,6 +500,44 @@ export class ReactServerProvider {
|
|
|
450
500
|
* @param state - The router state
|
|
451
501
|
* @returns Render result with redirect or React stream
|
|
452
502
|
*/
|
|
503
|
+
/**
|
|
504
|
+
* Inject SEO `hreflang` alternate links for the current route when
|
|
505
|
+
* locale-prefix routing is enabled. Each registered locale gets an absolute
|
|
506
|
+
* alternate URL (the default locale stays unprefixed), plus an `x-default`
|
|
507
|
+
* pointing at the unprefixed URL — this is what lets crawlers index every
|
|
508
|
+
* language. Also sets a best-effort `<html lang>` for the non-streaming /
|
|
509
|
+
* prerender path; the streamed path's `<html lang>` is finalized on the
|
|
510
|
+
* client (the early HTML head is flushed before the route is known).
|
|
511
|
+
*
|
|
512
|
+
* No-op unless `routing: "prefix"` is enabled on the i18n module.
|
|
513
|
+
*/
|
|
514
|
+
protected injectLocaleHead(state: ReactRouterState): void {
|
|
515
|
+
if (!this.localeProvider.enabled) {
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
const { origin, search } = state.url;
|
|
520
|
+
const canonical = this.localeProvider.detect(state.url.pathname).pathname;
|
|
521
|
+
|
|
522
|
+
const links = this.localeProvider.locales.map((locale) => ({
|
|
523
|
+
rel: "alternate",
|
|
524
|
+
hreflang: locale,
|
|
525
|
+
href: `${origin}${this.localeProvider.withPrefix(canonical, locale)}${search}`,
|
|
526
|
+
}));
|
|
527
|
+
links.push({
|
|
528
|
+
rel: "alternate",
|
|
529
|
+
hreflang: "x-default",
|
|
530
|
+
href: `${origin}${canonical}${search}`,
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
state.head ??= {};
|
|
534
|
+
state.head.link = [...(state.head.link ?? []), ...links];
|
|
535
|
+
state.head.htmlAttributes = {
|
|
536
|
+
...state.head.htmlAttributes,
|
|
537
|
+
lang: this.localeProvider.current,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
|
|
453
541
|
protected async renderPage(
|
|
454
542
|
route: PageRoute,
|
|
455
543
|
state: ReactRouterState,
|
|
@@ -471,6 +559,9 @@ export class ReactServerProvider {
|
|
|
471
559
|
state.head.link = [...(state.head.link ?? []), ...preloadLinks];
|
|
472
560
|
}
|
|
473
561
|
|
|
562
|
+
// Inject SEO hreflang alternates for locale-prefix routing
|
|
563
|
+
this.injectLocaleHead(state);
|
|
564
|
+
|
|
474
565
|
// Render React to stream
|
|
475
566
|
|
|
476
567
|
const element = this.pageApi.root(state);
|
|
@@ -595,13 +686,13 @@ export class ReactServerProvider {
|
|
|
595
686
|
|
|
596
687
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
597
688
|
|
|
598
|
-
const envSchema =
|
|
599
|
-
REACT_SSR_ENABLED:
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
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(),
|
|
605
696
|
});
|
|
606
697
|
|
|
607
698
|
declare module "alepha" {
|
|
@@ -622,13 +713,11 @@ export const DEFAULT_STATIC_FILE_PATTERN = "\\.[a-zA-Z0-9]{1,10}$";
|
|
|
622
713
|
|
|
623
714
|
export const reactServerOptions = $atom({
|
|
624
715
|
name: "alepha.react.server.options",
|
|
625
|
-
schema:
|
|
626
|
-
publicDir:
|
|
627
|
-
staticServer:
|
|
628
|
-
disabled:
|
|
629
|
-
path:
|
|
630
|
-
description: "URL path where static files will be served.",
|
|
631
|
-
}),
|
|
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."),
|
|
632
721
|
}),
|
|
633
722
|
}),
|
|
634
723
|
default: {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extension point letting any module contribute root-level React nodes that
|
|
5
|
+
* render on every page (siblings of the page view, inside AlephaContext).
|
|
6
|
+
*
|
|
7
|
+
* A module pushes into `rootComponents` from its `register` hook; the array
|
|
8
|
+
* is rendered by `ReactPageProvider.root()`. SSR-safe (same element feeds
|
|
9
|
+
* server render + client hydrate).
|
|
10
|
+
*/
|
|
11
|
+
export class RootComponentsProvider {
|
|
12
|
+
public rootComponents: ReactNode[] = [];
|
|
13
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { $inject, Alepha } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Generic locale path-prefix mechanism for the router.
|
|
5
|
+
*
|
|
6
|
+
* This provider knows nothing about i18n — it only deals with URL path
|
|
7
|
+
* segments. It is configured by the i18n module (`I18nProvider`) when
|
|
8
|
+
* `routing: "prefix"` is enabled, which keeps the dependency one-directional
|
|
9
|
+
* (`i18n → router`) and avoids a module cycle.
|
|
10
|
+
*
|
|
11
|
+
* The default locale is served WITHOUT a prefix (`/about` = default,
|
|
12
|
+
* `/fr/about` = French). The active locale is derived from the current
|
|
13
|
+
* request/navigation and stored under `alepha.react.router.locale`, so every
|
|
14
|
+
* URL the router builds (`pathname()`) automatically carries the right prefix.
|
|
15
|
+
*/
|
|
16
|
+
export class RouterLocaleProvider {
|
|
17
|
+
protected readonly alepha = $inject(Alepha);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Whether locale path-prefixing is active. Off by default — opt-in via the
|
|
21
|
+
* i18n module.
|
|
22
|
+
*/
|
|
23
|
+
public enabled = false;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The default locale, served without a path prefix (e.g. `"en"` → `/about`).
|
|
27
|
+
*/
|
|
28
|
+
public defaultLocale = "";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* All known locales, including the default one.
|
|
32
|
+
*/
|
|
33
|
+
public locales: string[] = [];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Configure the provider. Called by the i18n module before the SSR routes
|
|
37
|
+
* are registered.
|
|
38
|
+
*/
|
|
39
|
+
public configure(options: {
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
defaultLocale?: string;
|
|
42
|
+
locales?: string[];
|
|
43
|
+
}): void {
|
|
44
|
+
if (options.enabled !== undefined) {
|
|
45
|
+
this.enabled = options.enabled;
|
|
46
|
+
}
|
|
47
|
+
if (options.defaultLocale !== undefined) {
|
|
48
|
+
this.defaultLocale = options.defaultLocale;
|
|
49
|
+
}
|
|
50
|
+
if (options.locales !== undefined) {
|
|
51
|
+
this.locales = options.locales;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Locales that carry a URL prefix — every known locale except the default.
|
|
57
|
+
*/
|
|
58
|
+
public get prefixedLocales(): string[] {
|
|
59
|
+
return this.locales.filter((locale) => locale !== this.defaultLocale);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Splits a leading locale segment off a pathname.
|
|
64
|
+
*
|
|
65
|
+
* - `/fr/about` → `{ locale: "fr", pathname: "/about" }` when `fr` is a
|
|
66
|
+
* prefixed locale.
|
|
67
|
+
* - `/about` → `{ locale: defaultLocale, pathname: "/about" }`.
|
|
68
|
+
*
|
|
69
|
+
* When prefixing is disabled the pathname is returned untouched.
|
|
70
|
+
*/
|
|
71
|
+
public detect(pathname: string): { locale: string; pathname: string } {
|
|
72
|
+
if (this.enabled) {
|
|
73
|
+
const first = pathname.split("/")[1];
|
|
74
|
+
if (first && this.prefixedLocales.includes(first)) {
|
|
75
|
+
const rest = pathname.slice(first.length + 1);
|
|
76
|
+
return { locale: first, pathname: this.normalize(rest) };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return { locale: this.defaultLocale, pathname };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Prepends the locale prefix to a pathname when needed. The default locale
|
|
84
|
+
* (and any unknown/disabled case) returns the pathname unchanged.
|
|
85
|
+
*/
|
|
86
|
+
public withPrefix(pathname: string, locale: string = this.current): string {
|
|
87
|
+
if (
|
|
88
|
+
!this.enabled ||
|
|
89
|
+
!locale ||
|
|
90
|
+
locale === this.defaultLocale ||
|
|
91
|
+
!this.prefixedLocales.includes(locale)
|
|
92
|
+
) {
|
|
93
|
+
return pathname;
|
|
94
|
+
}
|
|
95
|
+
return `/${locale}${pathname === "/" ? "" : pathname}`;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* The active locale, derived from the current request/navigation. Falls back
|
|
100
|
+
* to the default locale when nothing has been detected.
|
|
101
|
+
*/
|
|
102
|
+
public get current(): string {
|
|
103
|
+
return (
|
|
104
|
+
this.alepha.store.get("alepha.react.router.locale") || this.defaultLocale
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public set current(locale: string) {
|
|
109
|
+
this.alepha.store.set("alepha.react.router.locale", locale);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Normalizes a stripped pathname so it always starts with a single slash and
|
|
114
|
+
* carries no trailing slash (except the root `/`).
|
|
115
|
+
*/
|
|
116
|
+
protected normalize(pathname: string): string {
|
|
117
|
+
if (!pathname || pathname === "/") {
|
|
118
|
+
return "/";
|
|
119
|
+
}
|
|
120
|
+
const withLeading = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
121
|
+
return withLeading.length > 1 && withLeading.endsWith("/")
|
|
122
|
+
? withLeading.slice(0, -1)
|
|
123
|
+
: withLeading;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { RootComponentsProvider } from "../RootComponentsProvider.ts";
|
|
4
|
+
|
|
5
|
+
describe("RootComponentsProvider", () => {
|
|
6
|
+
it("starts empty and accepts pushed nodes", () => {
|
|
7
|
+
const alepha = Alepha.create();
|
|
8
|
+
const provider = alepha.inject(RootComponentsProvider);
|
|
9
|
+
expect(provider.rootComponents).toEqual([]);
|
|
10
|
+
provider.rootComponents.push("x" as any);
|
|
11
|
+
expect(alepha.inject(RootComponentsProvider).rootComponents).toHaveLength(
|
|
12
|
+
1,
|
|
13
|
+
);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { createElement } from "react";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import type { ReactRouterState } from "../ReactPageProvider.ts";
|
|
5
|
+
import { ReactPageProvider } from "../ReactPageProvider.ts";
|
|
6
|
+
import { RootComponentsProvider } from "../RootComponentsProvider.ts";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Walk a React element tree (non-circular, element children only) and collect
|
|
10
|
+
* all "data-testid" values found in any element's props.
|
|
11
|
+
*/
|
|
12
|
+
function collectTestIds(node: any, seen = new Set<any>()): string[] {
|
|
13
|
+
if (!node || typeof node !== "object" || seen.has(node)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
seen.add(node);
|
|
17
|
+
|
|
18
|
+
const ids: string[] = [];
|
|
19
|
+
|
|
20
|
+
if (node.props?.["data-testid"]) {
|
|
21
|
+
ids.push(node.props["data-testid"]);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Children may be a single node or an array
|
|
25
|
+
const children = node.props?.children;
|
|
26
|
+
if (Array.isArray(children)) {
|
|
27
|
+
for (const child of children) {
|
|
28
|
+
ids.push(...collectTestIds(child, seen));
|
|
29
|
+
}
|
|
30
|
+
} else if (children) {
|
|
31
|
+
ids.push(...collectTestIds(children, seen));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Also walk positional children (args 2+ on createElement are spread as props.children
|
|
35
|
+
// but StrictMode wraps with a single child — unwrap one level manually)
|
|
36
|
+
return ids;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
describe("rootComponents in ReactPageProvider.root", () => {
|
|
40
|
+
it("includes pushed components in the rendered root element tree", () => {
|
|
41
|
+
const alepha = Alepha.create();
|
|
42
|
+
alepha
|
|
43
|
+
.inject(RootComponentsProvider)
|
|
44
|
+
.rootComponents.push(
|
|
45
|
+
createElement("div", { "data-testid": "sigil-marker", key: "m" }),
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const page = alepha.inject(ReactPageProvider);
|
|
49
|
+
|
|
50
|
+
const state: ReactRouterState = {
|
|
51
|
+
layers: [{ element: null } as any],
|
|
52
|
+
url: new URL("http://localhost/"),
|
|
53
|
+
onError: () => undefined as any,
|
|
54
|
+
params: {},
|
|
55
|
+
query: {},
|
|
56
|
+
meta: {},
|
|
57
|
+
head: {} as any,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const element: any = page.root(state);
|
|
61
|
+
|
|
62
|
+
// StrictMode wraps the root — unwrap one level
|
|
63
|
+
const inner = element?.props?.children ?? element;
|
|
64
|
+
const ids = collectTestIds(inner);
|
|
65
|
+
expect(ids).toContain("sigil-marker");
|
|
66
|
+
});
|
|
67
|
+
});
|