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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/react/intro/components/GettingStartedAdminSlide.tsx","../../../src/react/intro/components/GettingStartedAuthSlide.tsx","../../../src/react/intro/components/GettingStartedDevtoolsSlide.tsx","../../../src/react/intro/components/GettingStarted.tsx"],"sourcesContent":["import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the admin slide content.\n * Content changes based on user status and admin permissions.\n * Returns undefined if admin routes are not configured.\n */\nexport const useAdminSlide = (): GettingStartedSlide | undefined => {\n const { user, has } = useAuth();\n const router = useRouter();\n\n // Check if admin routes exist\n const hasAdmin = router.pages.find((it) => it.name === \"adminLayout\");\n if (!hasAdmin) {\n return undefined;\n }\n\n const adminAnchorProps = router.anchor(router.path(\"adminLayout\"));\n const canAccessAdmin = has(\"admin:*\");\n\n // User is admin - show success message\n if (canAccessAdmin) {\n return {\n text: \"You're in control.\",\n sub: \"Admin access granted.\",\n steps: [\n {\n num: \"✓\",\n text: \"You have admin privileges\",\n },\n {\n num: \"→\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a> to manage your\n application\n </>\n ),\n },\n ],\n };\n }\n\n // User is logged in but not admin - show how to become admin\n if (user) {\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in two steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show full instructions\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in three steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n { num: \"2\", text: \"Create a user account with that email\" },\n {\n num: \"3\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n};\n","import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the auth slide content.\n * Content changes based on whether user is logged in.\n * Returns undefined if auth routes are not configured.\n */\nexport const useAuthSlide = (): GettingStartedSlide | undefined => {\n const { user, logout } = useAuth();\n const router = useRouter();\n\n // Check if auth routes exist\n const hasAuth = router.pages.find((it) => it.name === \"authLayout\");\n if (!hasAuth) {\n return undefined;\n }\n\n // User is logged in - show user info and logout option\n if (user) {\n return {\n text: \"Welcome back!\",\n sub: `You're signed in as ${user.email || user.username || \"user\"}.`,\n steps: [\n {\n num: \"✓\",\n text: \"Authentication is working correctly\",\n },\n {\n num: \"→\",\n text: (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n logout();\n }}\n >\n Sign out\n </a>{\" \"}\n to test the login flow\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show signup instructions\n const authAnchorProps = router.anchor(router.path(\"login\"));\n\n return {\n text: \"Who are you?\",\n sub: \"Create your first account.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Sign up at <a {...authAnchorProps}>/auth/login</a>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Customize in <code>src/api/AppSecurity.ts</code>\n </>\n ),\n },\n ],\n };\n};\n","import type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the devtools slide content.\n * Only shown when @alepha/devtools is installed and enabled.\n * Returns undefined if devtools are not available.\n */\nexport const useDevtoolsSlide = (): GettingStartedSlide | undefined => {\n if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {\n return undefined;\n }\n\n return {\n text: \"Inspect everything.\",\n sub: \"DevTools are built in.\",\n steps: [\n {\n num: \"→\",\n text: (\n <>\n Open{\" \"}\n <a href=\"/__devtools/\" target=\"_blank\" rel=\"noopener noreferrer\">\n /__devtools\n </a>{\" \"}\n to explore your app\n </>\n ),\n },\n {\n num: \"✓\",\n text: \"Browse entities, logs, configuration and dependencies\",\n },\n ],\n };\n};\n","import type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useAdminSlide } from \"./GettingStartedAdminSlide.tsx\";\nimport { useAuthSlide } from \"./GettingStartedAuthSlide.tsx\";\nimport { useDevtoolsSlide } from \"./GettingStartedDevtoolsSlide.tsx\";\n\nexport type GettingStartedStep = {\n num: string;\n text: ReactNode;\n};\n\nexport type GettingStartedSlide = {\n text: string;\n sub: string;\n detail?: string;\n steps?: GettingStartedStep[];\n links?: { label: string; href: string }[];\n};\n\nexport type GettingStartedWelcome = {\n appName: string;\n serverTime: string;\n};\n\nexport type GettingStartedProps = {\n /**\n * Welcome data loaded from the server via SSR.\n *\n * When provided, displays app name and server timestamp on the first slide,\n * demonstrating the full SSR → hydration data flow.\n */\n welcome?: GettingStartedWelcome;\n};\n\nconst defaultFirstSlide: GettingStartedSlide = {\n text: \"Let's begin.\",\n sub: \"Every story starts with a blank page.\",\n detail: \"This one is yours.\",\n};\n\nconst helpSlide: GettingStartedSlide = {\n text: \"Need help?\",\n sub: \"We've got you covered.\",\n detail: \"Even our AI friends can read the docs.\",\n links: [\n { label: \"alepha.dev\", href: \"https://alepha.dev\" },\n { label: \"llms.txt\", href: \"https://alepha.dev/llms.txt\" },\n ],\n};\n\nconst formatServerTime = (isoString: string): string => {\n try {\n const date = new Date(isoString);\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n } catch {\n return isoString;\n }\n};\n\n/**\n * A welcome component displayed when creating a new Alepha application.\n */\nconst GettingStarted = ({ welcome }: GettingStartedProps) => {\n const [index, setIndex] = useState(0);\n const [direction, setDirection] = useState<\"next\" | \"prev\">(\"next\");\n\n // Get auth-aware slide content (hooks return undefined if routes don't exist)\n const authSlide = useAuthSlide();\n const adminSlide = useAdminSlide();\n const devtoolsSlide = useDevtoolsSlide();\n\n const filteredMessages = useMemo(() => {\n const result: GettingStartedSlide[] = [];\n\n // First slide: use welcome data if provided, otherwise default\n if (welcome) {\n result.push({\n ...defaultFirstSlide,\n detail: `Server time: ${formatServerTime(welcome.serverTime)} - App: ${welcome.appName}`,\n });\n } else {\n result.push(defaultFirstSlide);\n }\n\n // Add auth slide if auth routes exist\n if (authSlide) {\n result.push(authSlide);\n }\n\n // Add admin slide if admin routes exist\n if (adminSlide) {\n result.push(adminSlide);\n }\n\n // Add devtools slide in non-production environments\n if (devtoolsSlide) {\n result.push(devtoolsSlide);\n }\n\n // Add \"Need help?\" message\n result.push(helpSlide);\n\n return result;\n }, [welcome, authSlide, adminSlide, devtoolsSlide]);\n\n const current = filteredMessages[index];\n\n const prev = useCallback(() => {\n setDirection(\"prev\");\n setIndex(\n (i) => (i - 1 + filteredMessages.length) % filteredMessages.length,\n );\n }, [filteredMessages.length]);\n\n const next = useCallback(() => {\n setDirection(\"next\");\n setIndex((i) => (i + 1) % filteredMessages.length);\n }, [filteredMessages.length]);\n\n const goTo = useCallback(\n (i: number) => {\n setDirection(i > index ? \"next\" : \"prev\");\n setIndex(i);\n },\n [index],\n );\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prev();\n } else if (e.key === \"ArrowRight\") {\n next();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [prev, next]);\n\n return (\n <>\n <style>{styles}</style>\n <main className=\"alepha-blank\">\n <div className=\"alepha-blank-content\">\n <div className=\"alepha-blank-text-block\">\n <h1\n className={`alepha-blank-message alepha-blank-slide-${direction}`}\n key={index}\n >\n {current.text}\n </h1>\n <p\n className={`alepha-blank-sub alepha-blank-slide-${direction}`}\n key={`sub-${index}`}\n >\n {current.sub}\n </p>\n {current.detail && (\n <p\n className={`alepha-blank-detail alepha-blank-slide-${direction}`}\n key={`detail-${index}`}\n >\n {current.detail}\n </p>\n )}\n {current.steps && (\n <div\n className={`alepha-blank-steps alepha-blank-slide-${direction}`}\n key={`steps-${index}`}\n >\n {current.steps.map((step, i) => (\n <div\n key={i}\n className=\"alepha-blank-step\"\n style={{ animationDelay: `${0.15 + i * 0.08}s` }}\n >\n <span className=\"alepha-blank-step-num\">{step.num}</span>\n <span className=\"alepha-blank-step-text\">{step.text}</span>\n </div>\n ))}\n </div>\n )}\n {current.links && (\n <div\n className={`alepha-blank-links alepha-blank-slide-${direction}`}\n key={`links-${index}`}\n >\n {current.links.map((link, i) => (\n <a\n key={link.href}\n href={link.href}\n target={link.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={\n link.href.startsWith(\"http\")\n ? \"noopener noreferrer\"\n : undefined\n }\n style={{ animationDelay: `${0.1 + i * 0.05}s` }}\n >\n {link.label}\n </a>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"alepha-blank-slider\">\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={prev}\n aria-label=\"Previous\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M9 3L5 7L9 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div className=\"alepha-blank-dots\">\n {filteredMessages.map((_, i) => (\n <button\n key={i}\n className={`alepha-blank-dot ${i === index ? \"active\" : \"\"}`}\n onClick={() => goTo(i)}\n aria-label={`Go to message ${i + 1}`}\n />\n ))}\n </div>\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={next}\n aria-label=\"Next\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M5 3L9 7L5 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"alepha-blank-hint\">\n <kbd>←</kbd> <kbd>→</kbd> to navigate\n </div>\n </div>\n </main>\n </>\n );\n};\n\nexport default GettingStarted;\n\nconst styles = `\n.alepha-blank {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100svh;\n background: #fafafa;\n font-family: system-ui, -apple-system, sans-serif;\n color: #171717;\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n width: 100%;\n}\n\n.alepha-blank-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n max-width: 640px;\n}\n\n.alepha-blank-text-block {\n min-height: 320px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.alepha-blank-message {\n font-size: clamp(2rem, 8vw, 3rem);\n font-weight: 600;\n letter-spacing: -0.02em;\n margin: 0;\n line-height: 1.1;\n}\n\n.alepha-blank-sub {\n font-size: 1.0625rem;\n color: #525252;\n margin: 1rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-detail {\n font-size: 0.875rem;\n color: #a3a3a3;\n margin: 0.5rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-slide-next {\n animation: alepha-blank-slideNext 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n.alepha-blank-slide-prev {\n animation: alepha-blank-slidePrev 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n@keyframes alepha-blank-slideNext {\n from {\n opacity: 0;\n transform: translateX(20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes alepha-blank-slidePrev {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.alepha-blank-steps {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-top: 1.25rem;\n text-align: left;\n}\n\n.alepha-blank-step {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.25rem 0;\n opacity: 0;\n animation: alepha-blank-stepIn 0.4s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n}\n\n.alepha-blank-step-num {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #171717;\n color: #fff;\n font-size: 0.6875rem;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.alepha-blank-step-text {\n font-size: 0.8125rem;\n color: #525252;\n line-height: 1.5;\n}\n\n.alepha-blank-step-text code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.75rem;\n background: #f5f5f5;\n color: #171717;\n padding: 0.0625rem 0.375rem;\n border-radius: 3px;\n border: 1px solid #e5e5e5;\n}\n\n.alepha-blank-step-text a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n color: #525252;\n text-decoration: underline;\n text-underline-offset: 2px;\n transition: color 0.15s ease;\n}\n\n.alepha-blank-step-text a:hover {\n color: #171717;\n}\n\n@keyframes alepha-blank-stepIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.alepha-blank-links {\n display: flex;\n gap: 1.5rem;\n margin-top: 1.25rem;\n}\n\n.alepha-blank-links a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.875rem;\n color: #525252;\n text-decoration: none;\n position: relative;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.3s ease-out forwards;\n transition: color 0.2s ease;\n}\n\n.alepha-blank-links a::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: -2px;\n height: 1px;\n background: #a3a3a3;\n transform: scaleX(1);\n transform-origin: left;\n transition:\n transform 0.25s cubic-bezier(0.22, 1, 0.36, 1),\n background 0.2s ease;\n}\n\n.alepha-blank-links a:hover {\n color: #171717;\n}\n\n.alepha-blank-links a:hover::after {\n background: #171717;\n transform: scaleX(1.05);\n}\n\n.alepha-blank-slider {\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-top: 2.5rem;\n}\n\n.alepha-blank-dots {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.alepha-blank-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: transparent;\n border: 1.5px solid #d4d4d4;\n padding: 0;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-dot:hover {\n border-color: #a3a3a3;\n transform: scale(1.2);\n}\n\n.alepha-blank-dot:focus-visible {\n outline: 2px solid #737373;\n outline-offset: 2px;\n}\n\n.alepha-blank-dot.active {\n background: #737373;\n border-color: #737373;\n transform: scale(1.1);\n}\n\n.alepha-blank-nav-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-family: inherit;\n background: transparent;\n color: #a3a3a3;\n border: 1.5px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-nav-btn:hover {\n color: #525252;\n background: #f0f0f0;\n}\n\n.alepha-blank-nav-btn:focus-visible {\n outline: none;\n border-color: #737373;\n color: #525252;\n}\n\n.alepha-blank-nav-btn:active {\n transform: scale(0.92);\n background: #e5e5e5;\n}\n\n.alepha-blank-hint {\n margin-top: 2rem;\n font-size: 0.75rem;\n color: #a3a3a3;\n display: flex;\n align-items: center;\n gap: 0.375rem;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.5s ease-out 0.5s forwards;\n}\n\n.alepha-blank-hint kbd {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.6875rem;\n background: #f0f0f0;\n border: 1px solid #e5e5e5;\n border-radius: 4px;\n padding: 0.125rem 0.375rem;\n box-shadow: 0 1px 0 #d4d4d4;\n}\n\n@keyframes alepha-blank-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .alepha-blank-slide-next,\n .alepha-blank-slide-prev,\n .alepha-blank-links a,\n .alepha-blank-hint,\n .alepha-blank-step {\n animation: none;\n opacity: 1;\n }\n\n .alepha-blank-dot,\n .alepha-blank-nav-btn,\n .alepha-blank-links a,\n .alepha-blank-links a::after {\n transition: none;\n }\n}\n`;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/react/intro/components/GettingStartedAdminSlide.tsx","../../../src/react/intro/components/GettingStartedAuthSlide.tsx","../../../src/react/intro/components/GettingStartedDevtoolsSlide.tsx","../../../src/react/intro/components/GettingStarted.tsx"],"sourcesContent":["import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the admin slide content.\n * Content changes based on user status and admin permissions.\n * Returns undefined if admin routes are not configured.\n */\nexport const useAdminSlide = (): GettingStartedSlide | undefined => {\n const { user, has } = useAuth();\n const router = useRouter();\n\n // Check if admin routes exist\n const hasAdmin = router.pages.find((it) => it.name === \"adminLayout\");\n if (!hasAdmin) {\n return undefined;\n }\n\n const adminAnchorProps = router.anchor(router.path(\"adminLayout\"));\n const canAccessAdmin = has(\"admin:*\");\n\n // User is admin - show success message\n if (canAccessAdmin) {\n return {\n text: \"You're in control.\",\n sub: \"Admin access granted.\",\n steps: [\n {\n num: \"✓\",\n text: \"You have admin privileges\",\n },\n {\n num: \"→\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a> to manage your\n application\n </>\n ),\n },\n ],\n };\n }\n\n // User is logged in but not admin - show how to become admin\n if (user) {\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in two steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show full instructions\n return {\n text: \"Take the wheel.\",\n sub: \"Become admin in three steps.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Add your email to <code>adminEmails</code> in{\" \"}\n <code>AppSecurity.ts</code>\n </>\n ),\n },\n { num: \"2\", text: \"Create a user account with that email\" },\n {\n num: \"3\",\n text: (\n <>\n Go to <a {...adminAnchorProps}>/admin</a>\n </>\n ),\n },\n ],\n };\n};\n","import { useAuth } from \"alepha/react/auth\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the auth slide content.\n * Content changes based on whether user is logged in.\n * Returns undefined if auth routes are not configured.\n */\nexport const useAuthSlide = (): GettingStartedSlide | undefined => {\n const { user, logout } = useAuth();\n const router = useRouter();\n\n // Check if auth routes exist\n const hasAuth = router.pages.find((it) => it.name === \"authLayout\");\n if (!hasAuth) {\n return undefined;\n }\n\n // User is logged in - show user info and logout option\n if (user) {\n return {\n text: \"Welcome back!\",\n sub: `You're signed in as ${user.email || user.username || \"user\"}.`,\n steps: [\n {\n num: \"✓\",\n text: \"Authentication is working correctly\",\n },\n {\n num: \"→\",\n text: (\n <>\n <a\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n logout();\n }}\n >\n Sign out\n </a>{\" \"}\n to test the login flow\n </>\n ),\n },\n ],\n };\n }\n\n // User is not logged in - show signup instructions\n const authAnchorProps = router.anchor(router.path(\"login\"));\n\n return {\n text: \"Who are you?\",\n sub: \"Create your first account.\",\n steps: [\n {\n num: \"1\",\n text: (\n <>\n Sign up at <a {...authAnchorProps}>/auth/login</a>\n </>\n ),\n },\n {\n num: \"2\",\n text: (\n <>\n Customize in <code>src/api/AppSecurity.ts</code>\n </>\n ),\n },\n ],\n };\n};\n","import type { GettingStartedSlide } from \"./GettingStarted.tsx\";\n\n/**\n * Hook that provides the devtools slide content.\n * Only shown when @alepha/devtools is installed and enabled.\n * Returns undefined if devtools are not available.\n */\nexport const useDevtoolsSlide = (): GettingStartedSlide | undefined => {\n if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {\n return undefined;\n }\n\n return {\n text: \"Inspect everything.\",\n sub: \"DevTools are built in.\",\n steps: [\n {\n num: \"→\",\n text: (\n <>\n Open{\" \"}\n <a href=\"/__devtools/\" target=\"_blank\" rel=\"noopener noreferrer\">\n /__devtools\n </a>{\" \"}\n to explore your app\n </>\n ),\n },\n {\n num: \"✓\",\n text: \"Browse entities, logs, configuration and dependencies\",\n },\n ],\n };\n};\n","import type { ReactNode } from \"react\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useAdminSlide } from \"./GettingStartedAdminSlide.tsx\";\nimport { useAuthSlide } from \"./GettingStartedAuthSlide.tsx\";\nimport { useDevtoolsSlide } from \"./GettingStartedDevtoolsSlide.tsx\";\n\nexport type GettingStartedStep = {\n num: string;\n text: ReactNode;\n};\n\nexport type GettingStartedSlide = {\n text: string;\n sub: string;\n detail?: string;\n steps?: GettingStartedStep[];\n links?: { label: string; href: string }[];\n};\n\nexport type GettingStartedWelcome = {\n appName: string;\n serverTime: string;\n};\n\nexport type GettingStartedProps = {\n /**\n * Welcome data loaded from the server via SSR.\n *\n * When provided, displays app name and server timestamp on the first slide,\n * demonstrating the full SSR → hydration data flow.\n */\n welcome?: GettingStartedWelcome;\n};\n\nconst defaultFirstSlide: GettingStartedSlide = {\n text: \"Let's begin.\",\n sub: \"Every story starts with a blank page.\",\n detail: \"This one is yours.\",\n};\n\nconst helpSlide: GettingStartedSlide = {\n text: \"Need help?\",\n sub: \"We've got you covered.\",\n detail: \"Even our AI friends can read the docs.\",\n links: [\n { label: \"alepha.dev\", href: \"https://alepha.dev\" },\n { label: \"llms.txt\", href: \"https://alepha.dev/llms.txt\" },\n ],\n};\n\nconst formatServerTime = (isoString: string): string => {\n try {\n const date = new Date(isoString);\n return date.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n } catch {\n return isoString;\n }\n};\n\n/**\n * A welcome component displayed when creating a new Alepha application.\n */\nconst GettingStarted = ({ welcome }: GettingStartedProps) => {\n const [index, setIndex] = useState(0);\n const [direction, setDirection] = useState<\"next\" | \"prev\">(\"next\");\n\n // Get auth-aware slide content (hooks return undefined if routes don't exist)\n const authSlide = useAuthSlide();\n const adminSlide = useAdminSlide();\n const devtoolsSlide = useDevtoolsSlide();\n\n const filteredMessages = useMemo(() => {\n const result: GettingStartedSlide[] = [];\n\n // First slide: use welcome data if provided, otherwise default\n if (welcome) {\n result.push({\n ...defaultFirstSlide,\n detail: `Server time: ${formatServerTime(welcome.serverTime)} - App: ${welcome.appName}`,\n });\n } else {\n result.push(defaultFirstSlide);\n }\n\n // Add auth slide if auth routes exist\n if (authSlide) {\n result.push(authSlide);\n }\n\n // Add admin slide if admin routes exist\n if (adminSlide) {\n result.push(adminSlide);\n }\n\n // Add devtools slide in non-production environments\n if (devtoolsSlide) {\n result.push(devtoolsSlide);\n }\n\n // Add \"Need help?\" message\n result.push(helpSlide);\n\n return result;\n }, [welcome, authSlide, adminSlide, devtoolsSlide]);\n\n const current = filteredMessages[index];\n\n const prev = useCallback(() => {\n setDirection(\"prev\");\n setIndex(\n (i) => (i - 1 + filteredMessages.length) % filteredMessages.length,\n );\n }, [filteredMessages.length]);\n\n const next = useCallback(() => {\n setDirection(\"next\");\n setIndex((i) => (i + 1) % filteredMessages.length);\n }, [filteredMessages.length]);\n\n const goTo = useCallback(\n (i: number) => {\n setDirection(i > index ? \"next\" : \"prev\");\n setIndex(i);\n },\n [index],\n );\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\") {\n prev();\n } else if (e.key === \"ArrowRight\") {\n next();\n }\n };\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [prev, next]);\n\n return (\n <>\n <style>{styles}</style>\n <main className=\"alepha-blank\">\n <div className=\"alepha-blank-content\">\n <div className=\"alepha-blank-text-block\">\n <h1\n className={`alepha-blank-message alepha-blank-slide-${direction}`}\n key={index}\n >\n {current.text}\n </h1>\n <p\n className={`alepha-blank-sub alepha-blank-slide-${direction}`}\n key={`sub-${index}`}\n >\n {current.sub}\n </p>\n {current.detail && (\n <p\n className={`alepha-blank-detail alepha-blank-slide-${direction}`}\n key={`detail-${index}`}\n >\n {current.detail}\n </p>\n )}\n {current.steps && (\n <div\n className={`alepha-blank-steps alepha-blank-slide-${direction}`}\n key={`steps-${index}`}\n >\n {current.steps.map((step, i) => (\n <div\n key={i}\n className=\"alepha-blank-step\"\n style={{ animationDelay: `${0.15 + i * 0.08}s` }}\n >\n <span className=\"alepha-blank-step-num\">{step.num}</span>\n <span className=\"alepha-blank-step-text\">{step.text}</span>\n </div>\n ))}\n </div>\n )}\n {current.links && (\n <div\n className={`alepha-blank-links alepha-blank-slide-${direction}`}\n key={`links-${index}`}\n >\n {current.links.map((link, i) => (\n <a\n key={link.href}\n href={link.href}\n target={link.href.startsWith(\"http\") ? \"_blank\" : undefined}\n rel={\n link.href.startsWith(\"http\")\n ? \"noopener noreferrer\"\n : undefined\n }\n style={{ animationDelay: `${0.1 + i * 0.05}s` }}\n >\n {link.label}\n </a>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"alepha-blank-slider\">\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={prev}\n aria-label=\"Previous\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M9 3L5 7L9 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div className=\"alepha-blank-dots\">\n {filteredMessages.map((_, i) => (\n <button\n key={i}\n className={`alepha-blank-dot ${i === index ? \"active\" : \"\"}`}\n onClick={() => goTo(i)}\n aria-label={`Go to message ${i + 1}`}\n />\n ))}\n </div>\n <button\n className=\"alepha-blank-nav-btn\"\n onClick={next}\n aria-label=\"Next\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M5 3L9 7L5 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"alepha-blank-hint\">\n <kbd>←</kbd> <kbd>→</kbd> to navigate\n </div>\n </div>\n </main>\n </>\n );\n};\n\nexport default GettingStarted;\n\nconst styles = `\n.alepha-blank {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100svh;\n background: #fafafa;\n font-family: system-ui, -apple-system, sans-serif;\n color: #171717;\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n width: 100%;\n}\n\n.alepha-blank-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n max-width: 640px;\n}\n\n.alepha-blank-text-block {\n min-height: 320px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n}\n\n.alepha-blank-message {\n font-size: clamp(2rem, 8vw, 3rem);\n font-weight: 600;\n letter-spacing: -0.02em;\n margin: 0;\n line-height: 1.1;\n}\n\n.alepha-blank-sub {\n font-size: 1.0625rem;\n color: #525252;\n margin: 1rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-detail {\n font-size: 0.875rem;\n color: #a3a3a3;\n margin: 0.5rem 0 0;\n font-weight: 400;\n line-height: 1.5;\n}\n\n.alepha-blank-slide-next {\n animation: alepha-blank-slideNext 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n.alepha-blank-slide-prev {\n animation: alepha-blank-slidePrev 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;\n}\n\n@keyframes alepha-blank-slideNext {\n from {\n opacity: 0;\n transform: translateX(20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n@keyframes alepha-blank-slidePrev {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.alepha-blank-steps {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-top: 1.25rem;\n text-align: left;\n}\n\n.alepha-blank-step {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n padding: 0.25rem 0;\n opacity: 0;\n animation: alepha-blank-stepIn 0.4s cubic-bezier(0.22, 1, 0.36, 1) forwards;\n}\n\n.alepha-blank-step-num {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #171717;\n color: #fff;\n font-size: 0.6875rem;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.alepha-blank-step-text {\n font-size: 0.8125rem;\n color: #525252;\n line-height: 1.5;\n}\n\n.alepha-blank-step-text code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.75rem;\n background: #f5f5f5;\n color: #171717;\n padding: 0.0625rem 0.375rem;\n border-radius: 3px;\n border: 1px solid #e5e5e5;\n}\n\n.alepha-blank-step-text a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n color: #525252;\n text-decoration: underline;\n text-underline-offset: 2px;\n transition: color 0.15s ease;\n}\n\n.alepha-blank-step-text a:hover {\n color: #171717;\n}\n\n@keyframes alepha-blank-stepIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.alepha-blank-links {\n display: flex;\n gap: 1.5rem;\n margin-top: 1.25rem;\n}\n\n.alepha-blank-links a {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.875rem;\n color: #525252;\n text-decoration: none;\n position: relative;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.3s ease-out forwards;\n transition: color 0.2s ease;\n}\n\n.alepha-blank-links a::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n bottom: -2px;\n height: 1px;\n background: #a3a3a3;\n transform: scaleX(1);\n transform-origin: left;\n transition:\n transform 0.25s cubic-bezier(0.22, 1, 0.36, 1),\n background 0.2s ease;\n}\n\n.alepha-blank-links a:hover {\n color: #171717;\n}\n\n.alepha-blank-links a:hover::after {\n background: #171717;\n transform: scaleX(1.05);\n}\n\n.alepha-blank-slider {\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-top: 2.5rem;\n}\n\n.alepha-blank-dots {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.alepha-blank-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: transparent;\n border: 1.5px solid #d4d4d4;\n padding: 0;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-dot:hover {\n border-color: #a3a3a3;\n transform: scale(1.2);\n}\n\n.alepha-blank-dot:focus-visible {\n outline: 2px solid #737373;\n outline-offset: 2px;\n}\n\n.alepha-blank-dot.active {\n background: #737373;\n border-color: #737373;\n transform: scale(1.1);\n}\n\n.alepha-blank-nav-btn {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n font-family: inherit;\n background: transparent;\n color: #a3a3a3;\n border: 1.5px solid transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.22, 1, 0.36, 1);\n}\n\n.alepha-blank-nav-btn:hover {\n color: #525252;\n background: #f0f0f0;\n}\n\n.alepha-blank-nav-btn:focus-visible {\n outline: none;\n border-color: #737373;\n color: #525252;\n}\n\n.alepha-blank-nav-btn:active {\n transform: scale(0.92);\n background: #e5e5e5;\n}\n\n.alepha-blank-hint {\n margin-top: 2rem;\n font-size: 0.75rem;\n color: #a3a3a3;\n display: flex;\n align-items: center;\n gap: 0.375rem;\n opacity: 0;\n animation: alepha-blank-fadeIn 0.5s ease-out 0.5s forwards;\n}\n\n.alepha-blank-hint kbd {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 0.6875rem;\n background: #f0f0f0;\n border: 1px solid #e5e5e5;\n border-radius: 4px;\n padding: 0.125rem 0.375rem;\n box-shadow: 0 1px 0 #d4d4d4;\n}\n\n@keyframes alepha-blank-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .alepha-blank-slide-next,\n .alepha-blank-slide-prev,\n .alepha-blank-links a,\n .alepha-blank-hint,\n .alepha-blank-step {\n animation: none;\n opacity: 1;\n }\n\n .alepha-blank-dot,\n .alepha-blank-nav-btn,\n .alepha-blank-links a,\n .alepha-blank-links a::after {\n transition: none;\n }\n}\n`;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, OPTIONS, PipelineHandler, Primitive, createPrimitive,
|
|
1
|
+
import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, KIND, OPTIONS, PipelineHandler, Primitive, SchemaValidator, coerceObject, createPrimitive, z } from "alepha";
|
|
2
2
|
import { AlephaDateTime, DateTimeProvider } from "alepha/datetime";
|
|
3
3
|
import { AlephaContext, AlephaReact, ClientOnly, ErrorBoundary, useAlepha, useEvents, useInject, useStore } from "alepha/react";
|
|
4
4
|
import { AlephaReactHead, BrowserHeadProvider } from "alepha/react/head";
|
|
@@ -69,8 +69,8 @@ var ReactPageService = class {
|
|
|
69
69
|
* const userProfile = $page({
|
|
70
70
|
* path: "/users/:id",
|
|
71
71
|
* schema: {
|
|
72
|
-
* params:
|
|
73
|
-
* query:
|
|
72
|
+
* params: z.object({ id: z.integer() }),
|
|
73
|
+
* query: z.object({ tab: z.text().optional() })
|
|
74
74
|
* },
|
|
75
75
|
* loader: async ({ params }) => {
|
|
76
76
|
* const user = await userApi.getUser(params.id);
|
|
@@ -617,7 +617,7 @@ const NestedView = (props) => {
|
|
|
617
617
|
const onError = routerLayer?.onError;
|
|
618
618
|
const state = useRouterState();
|
|
619
619
|
const alepha = useAlepha();
|
|
620
|
-
const
|
|
620
|
+
const boundaryResetKeys = [state.url.pathname];
|
|
621
621
|
const [view, setView] = useState(state.layers[index]?.element);
|
|
622
622
|
const [animation, setAnimation] = useState("");
|
|
623
623
|
const animationExitDuration = useRef(0);
|
|
@@ -677,8 +677,9 @@ const NestedView = (props) => {
|
|
|
677
677
|
if (props.errorBoundary === false) return /* @__PURE__ */ jsx(Fragment, { children: element });
|
|
678
678
|
if (props.errorBoundary) return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
679
679
|
fallback: props.errorBoundary,
|
|
680
|
+
resetKeys: boundaryResetKeys,
|
|
680
681
|
children: element
|
|
681
|
-
}
|
|
682
|
+
});
|
|
682
683
|
const fallback = (error) => {
|
|
683
684
|
const result = onError?.(error, state) ?? /* @__PURE__ */ jsx(ErrorViewer, {
|
|
684
685
|
error,
|
|
@@ -689,8 +690,9 @@ const NestedView = (props) => {
|
|
|
689
690
|
};
|
|
690
691
|
return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
691
692
|
fallback,
|
|
693
|
+
resetKeys: boundaryResetKeys,
|
|
692
694
|
children: element
|
|
693
|
-
}
|
|
695
|
+
});
|
|
694
696
|
};
|
|
695
697
|
var NestedView_default = memo(NestedView);
|
|
696
698
|
function parseAnimation(animationLike, state, type = "enter") {
|
|
@@ -719,15 +721,126 @@ function parseAnimation(animationLike, state, type = "enter") {
|
|
|
719
721
|
}
|
|
720
722
|
}
|
|
721
723
|
//#endregion
|
|
724
|
+
//#region ../../src/react/router/providers/RootComponentsProvider.ts
|
|
725
|
+
/**
|
|
726
|
+
* Extension point letting any module contribute root-level React nodes that
|
|
727
|
+
* render on every page (siblings of the page view, inside AlephaContext).
|
|
728
|
+
*
|
|
729
|
+
* A module pushes into `rootComponents` from its `register` hook; the array
|
|
730
|
+
* is rendered by `ReactPageProvider.root()`. SSR-safe (same element feeds
|
|
731
|
+
* server render + client hydrate).
|
|
732
|
+
*/
|
|
733
|
+
var RootComponentsProvider = class {
|
|
734
|
+
rootComponents = [];
|
|
735
|
+
};
|
|
736
|
+
//#endregion
|
|
737
|
+
//#region ../../src/react/router/providers/RouterLocaleProvider.ts
|
|
738
|
+
/**
|
|
739
|
+
* Generic locale path-prefix mechanism for the router.
|
|
740
|
+
*
|
|
741
|
+
* This provider knows nothing about i18n — it only deals with URL path
|
|
742
|
+
* segments. It is configured by the i18n module (`I18nProvider`) when
|
|
743
|
+
* `routing: "prefix"` is enabled, which keeps the dependency one-directional
|
|
744
|
+
* (`i18n → router`) and avoids a module cycle.
|
|
745
|
+
*
|
|
746
|
+
* The default locale is served WITHOUT a prefix (`/about` = default,
|
|
747
|
+
* `/fr/about` = French). The active locale is derived from the current
|
|
748
|
+
* request/navigation and stored under `alepha.react.router.locale`, so every
|
|
749
|
+
* URL the router builds (`pathname()`) automatically carries the right prefix.
|
|
750
|
+
*/
|
|
751
|
+
var RouterLocaleProvider = class {
|
|
752
|
+
alepha = $inject(Alepha);
|
|
753
|
+
/**
|
|
754
|
+
* Whether locale path-prefixing is active. Off by default — opt-in via the
|
|
755
|
+
* i18n module.
|
|
756
|
+
*/
|
|
757
|
+
enabled = false;
|
|
758
|
+
/**
|
|
759
|
+
* The default locale, served without a path prefix (e.g. `"en"` → `/about`).
|
|
760
|
+
*/
|
|
761
|
+
defaultLocale = "";
|
|
762
|
+
/**
|
|
763
|
+
* All known locales, including the default one.
|
|
764
|
+
*/
|
|
765
|
+
locales = [];
|
|
766
|
+
/**
|
|
767
|
+
* Configure the provider. Called by the i18n module before the SSR routes
|
|
768
|
+
* are registered.
|
|
769
|
+
*/
|
|
770
|
+
configure(options) {
|
|
771
|
+
if (options.enabled !== void 0) this.enabled = options.enabled;
|
|
772
|
+
if (options.defaultLocale !== void 0) this.defaultLocale = options.defaultLocale;
|
|
773
|
+
if (options.locales !== void 0) this.locales = options.locales;
|
|
774
|
+
}
|
|
775
|
+
/**
|
|
776
|
+
* Locales that carry a URL prefix — every known locale except the default.
|
|
777
|
+
*/
|
|
778
|
+
get prefixedLocales() {
|
|
779
|
+
return this.locales.filter((locale) => locale !== this.defaultLocale);
|
|
780
|
+
}
|
|
781
|
+
/**
|
|
782
|
+
* Splits a leading locale segment off a pathname.
|
|
783
|
+
*
|
|
784
|
+
* - `/fr/about` → `{ locale: "fr", pathname: "/about" }` when `fr` is a
|
|
785
|
+
* prefixed locale.
|
|
786
|
+
* - `/about` → `{ locale: defaultLocale, pathname: "/about" }`.
|
|
787
|
+
*
|
|
788
|
+
* When prefixing is disabled the pathname is returned untouched.
|
|
789
|
+
*/
|
|
790
|
+
detect(pathname) {
|
|
791
|
+
if (this.enabled) {
|
|
792
|
+
const first = pathname.split("/")[1];
|
|
793
|
+
if (first && this.prefixedLocales.includes(first)) {
|
|
794
|
+
const rest = pathname.slice(first.length + 1);
|
|
795
|
+
return {
|
|
796
|
+
locale: first,
|
|
797
|
+
pathname: this.normalize(rest)
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
return {
|
|
802
|
+
locale: this.defaultLocale,
|
|
803
|
+
pathname
|
|
804
|
+
};
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* Prepends the locale prefix to a pathname when needed. The default locale
|
|
808
|
+
* (and any unknown/disabled case) returns the pathname unchanged.
|
|
809
|
+
*/
|
|
810
|
+
withPrefix(pathname, locale = this.current) {
|
|
811
|
+
if (!this.enabled || !locale || locale === this.defaultLocale || !this.prefixedLocales.includes(locale)) return pathname;
|
|
812
|
+
return `/${locale}${pathname === "/" ? "" : pathname}`;
|
|
813
|
+
}
|
|
814
|
+
/**
|
|
815
|
+
* The active locale, derived from the current request/navigation. Falls back
|
|
816
|
+
* to the default locale when nothing has been detected.
|
|
817
|
+
*/
|
|
818
|
+
get current() {
|
|
819
|
+
return this.alepha.store.get("alepha.react.router.locale") || this.defaultLocale;
|
|
820
|
+
}
|
|
821
|
+
set current(locale) {
|
|
822
|
+
this.alepha.store.set("alepha.react.router.locale", locale);
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Normalizes a stripped pathname so it always starts with a single slash and
|
|
826
|
+
* carries no trailing slash (except the root `/`).
|
|
827
|
+
*/
|
|
828
|
+
normalize(pathname) {
|
|
829
|
+
if (!pathname || pathname === "/") return "/";
|
|
830
|
+
const withLeading = pathname.startsWith("/") ? pathname : `/${pathname}`;
|
|
831
|
+
return withLeading.length > 1 && withLeading.endsWith("/") ? withLeading.slice(0, -1) : withLeading;
|
|
832
|
+
}
|
|
833
|
+
};
|
|
834
|
+
//#endregion
|
|
722
835
|
//#region ../../src/react/router/providers/ReactPageProvider.ts
|
|
723
836
|
const reactPageOptions = $atom({
|
|
724
837
|
name: "alepha.react.page.options",
|
|
725
838
|
description: "Configuration options for the React page provider.",
|
|
726
|
-
schema:
|
|
839
|
+
schema: z.object({
|
|
727
840
|
/**
|
|
728
841
|
* Enable React StrictMode wrapper.
|
|
729
842
|
*/
|
|
730
|
-
strictMode:
|
|
843
|
+
strictMode: z.boolean().default(true),
|
|
731
844
|
/**
|
|
732
845
|
* RegExp pattern (as string) to detect file-like URLs (e.g. /hello.txt, /wp-login.php).
|
|
733
846
|
* When a request hits the catch-all wildcard route and matches this pattern,
|
|
@@ -737,7 +850,7 @@ const reactPageOptions = $atom({
|
|
|
737
850
|
*
|
|
738
851
|
* @default "\\.[a-zA-Z0-9]{1,10}$"
|
|
739
852
|
*/
|
|
740
|
-
staticFilePattern:
|
|
853
|
+
staticFilePattern: z.string()
|
|
741
854
|
}),
|
|
742
855
|
default: {
|
|
743
856
|
strictMode: true,
|
|
@@ -752,6 +865,8 @@ var ReactPageProvider = class {
|
|
|
752
865
|
log = $logger();
|
|
753
866
|
options = $state(reactPageOptions);
|
|
754
867
|
alepha = $inject(Alepha);
|
|
868
|
+
rootComponentsProvider = $inject(RootComponentsProvider);
|
|
869
|
+
localeProvider = $inject(RouterLocaleProvider);
|
|
755
870
|
pages = [];
|
|
756
871
|
nextIdCursor = 0;
|
|
757
872
|
configure = $hook({
|
|
@@ -834,24 +949,27 @@ var ReactPageProvider = class {
|
|
|
834
949
|
parent = parent.parent;
|
|
835
950
|
}
|
|
836
951
|
url = this.compile(url, options.params ?? {});
|
|
952
|
+
url = url.replace(/\/\/+/g, "/") || "/";
|
|
953
|
+
url = this.localeProvider.withPrefix(url);
|
|
837
954
|
if (options.query) {
|
|
838
955
|
const query = new URLSearchParams(options.query);
|
|
839
956
|
if (query.toString()) url += `?${query.toString()}`;
|
|
840
957
|
}
|
|
841
|
-
return url
|
|
958
|
+
return url;
|
|
842
959
|
}
|
|
843
960
|
url(name, options = {}) {
|
|
844
961
|
return new URL(this.pathname(name, options), options.host ?? `http://localhost`);
|
|
845
962
|
}
|
|
846
963
|
root(state) {
|
|
847
|
-
const root = createElement(AlephaContext.Provider, { value: this.alepha }, createElement(NestedView_default, {}, state.layers[0]?.element));
|
|
964
|
+
const root = createElement(AlephaContext.Provider, { value: this.alepha }, createElement(NestedView_default, {}, state.layers[0]?.element), ...this.rootComponentsProvider.rootComponents);
|
|
848
965
|
if (this.options.strictMode) return createElement(StrictMode, {}, root);
|
|
849
966
|
return root;
|
|
850
967
|
}
|
|
851
968
|
convertStringObjectToObject = (schema, value) => {
|
|
852
|
-
if (
|
|
853
|
-
|
|
854
|
-
|
|
969
|
+
if (z.schema.isObject(schema) && typeof value === "object") for (const key in schema.properties) {
|
|
970
|
+
const propSchema = z.schema.unwrap(schema.properties[key]);
|
|
971
|
+
if (z.schema.isObject(propSchema) && typeof value[key] === "string") try {
|
|
972
|
+
value[key] = this.alepha.codec.decode(propSchema, decodeURIComponent(value[key]));
|
|
855
973
|
} catch (e) {}
|
|
856
974
|
}
|
|
857
975
|
return value;
|
|
@@ -876,13 +994,13 @@ var ReactPageProvider = class {
|
|
|
876
994
|
const config = {};
|
|
877
995
|
try {
|
|
878
996
|
this.convertStringObjectToObject(route.schema?.query, state.query);
|
|
879
|
-
config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, state.query) : {};
|
|
997
|
+
config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, coerceObject(route.schema.query, state.query)) : {};
|
|
880
998
|
} catch (e) {
|
|
881
999
|
it.error = e instanceof Error ? e : new Error(String(e));
|
|
882
1000
|
break;
|
|
883
1001
|
}
|
|
884
1002
|
try {
|
|
885
|
-
config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, state.params) : {};
|
|
1003
|
+
config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, coerceObject(route.schema.params, state.params)) : {};
|
|
886
1004
|
} catch (e) {
|
|
887
1005
|
it.error = e instanceof Error ? e : new Error(String(e));
|
|
888
1006
|
break;
|
|
@@ -1162,6 +1280,7 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
|
|
|
1162
1280
|
alepha = $inject(Alepha);
|
|
1163
1281
|
pageApi = $inject(ReactPageProvider);
|
|
1164
1282
|
browserHeadProvider = $inject(BrowserHeadProvider);
|
|
1283
|
+
localeProvider = $inject(RouterLocaleProvider);
|
|
1165
1284
|
add(entry) {
|
|
1166
1285
|
this.pageApi.add(entry);
|
|
1167
1286
|
}
|
|
@@ -1190,7 +1309,13 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
|
|
|
1190
1309
|
state
|
|
1191
1310
|
});
|
|
1192
1311
|
try {
|
|
1193
|
-
|
|
1312
|
+
let matchPathname = pathname;
|
|
1313
|
+
if (this.localeProvider.enabled) {
|
|
1314
|
+
const detected = this.localeProvider.detect(pathname);
|
|
1315
|
+
this.localeProvider.current = detected.locale;
|
|
1316
|
+
matchPathname = detected.pathname;
|
|
1317
|
+
}
|
|
1318
|
+
const { route, params } = this.match(matchPathname);
|
|
1194
1319
|
const query = {};
|
|
1195
1320
|
if (search) for (const [key, value] of new URLSearchParams(search).entries()) query[key] = String(value);
|
|
1196
1321
|
state.name = route?.page.name;
|
|
@@ -1257,8 +1382,8 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
|
|
|
1257
1382
|
*/
|
|
1258
1383
|
const reactBrowserOptions = $atom({
|
|
1259
1384
|
name: "alepha.react.browser.options",
|
|
1260
|
-
schema:
|
|
1261
|
-
scrollRestoration:
|
|
1385
|
+
schema: z.object({
|
|
1386
|
+
scrollRestoration: z.enum(["top", "manual"]),
|
|
1262
1387
|
/**
|
|
1263
1388
|
* Intercept clicks on plain `<a href="/...">` anchors and route them
|
|
1264
1389
|
* through the SPA router, so authors don't need `<Link>` everywhere
|
|
@@ -1268,7 +1393,7 @@ const reactBrowserOptions = $atom({
|
|
|
1268
1393
|
* `_self`, `download`, `data-no-router`, non-http(s) schemes, hash-only
|
|
1269
1394
|
* hrefs, external origins, and clicks already `defaultPrevented`.
|
|
1270
1395
|
*/
|
|
1271
|
-
interceptAnchorClicks:
|
|
1396
|
+
interceptAnchorClicks: z.boolean().default(true)
|
|
1272
1397
|
}),
|
|
1273
1398
|
default: {
|
|
1274
1399
|
scrollRestoration: "top",
|
|
@@ -1282,6 +1407,7 @@ var ReactBrowserProvider = class {
|
|
|
1282
1407
|
router = $inject(ReactBrowserRouterProvider);
|
|
1283
1408
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
1284
1409
|
browserHeadProvider = $inject(BrowserHeadProvider);
|
|
1410
|
+
validator = $inject(SchemaValidator);
|
|
1285
1411
|
options = $state(reactBrowserOptions);
|
|
1286
1412
|
get rootId() {
|
|
1287
1413
|
return "root";
|
|
@@ -1332,7 +1458,7 @@ var ReactBrowserProvider = class {
|
|
|
1332
1458
|
return base;
|
|
1333
1459
|
}
|
|
1334
1460
|
get url() {
|
|
1335
|
-
const url = this.location.pathname + this.location.search;
|
|
1461
|
+
const url = this.location.pathname + this.location.search + this.location.hash;
|
|
1336
1462
|
if (this.base) return url.replace(this.base, "");
|
|
1337
1463
|
return url;
|
|
1338
1464
|
}
|
|
@@ -1376,8 +1502,9 @@ var ReactBrowserProvider = class {
|
|
|
1376
1502
|
transitionId: myTransitionId
|
|
1377
1503
|
});
|
|
1378
1504
|
if (myTransitionId !== this.transitionId) return;
|
|
1379
|
-
|
|
1380
|
-
|
|
1505
|
+
const committed = this.state.url.pathname + this.state.url.search + this.state.url.hash;
|
|
1506
|
+
if (committed !== url) {
|
|
1507
|
+
this.pushState(committed);
|
|
1381
1508
|
return;
|
|
1382
1509
|
}
|
|
1383
1510
|
this.pushState(url, options.replace);
|
|
@@ -1421,6 +1548,39 @@ var ReactBrowserProvider = class {
|
|
|
1421
1548
|
console.error(error);
|
|
1422
1549
|
}
|
|
1423
1550
|
}
|
|
1551
|
+
/**
|
|
1552
|
+
* Apply the SSR hydration payload (the `#__ssr` script tag) to the atom
|
|
1553
|
+
* store.
|
|
1554
|
+
*
|
|
1555
|
+
* Every key except `alepha.react.router.layers` is treated as an atom
|
|
1556
|
+
* value. A registered atom's value is explicitly schema-validated: an
|
|
1557
|
+
* invalid value is dropped (warn + keep the atom's default) instead of
|
|
1558
|
+
* being trusted, so a tampered payload can't smuggle bad data into a
|
|
1559
|
+
* validated atom. Atoms not registered yet fall through to
|
|
1560
|
+
* `Alepha.set()`, which lets `StateManager.register()` decode them
|
|
1561
|
+
* against the schema the moment they first get used.
|
|
1562
|
+
*
|
|
1563
|
+
* `alepha.react.router.layers` is deliberately skipped by this loop: it
|
|
1564
|
+
* carries render instructions (`part`, `name`, `config`, `props`,
|
|
1565
|
+
* `error`), not atom values. Those are NOT hardened here and are trusted
|
|
1566
|
+
* as-is from the SSR payload — a tampered payload can still influence
|
|
1567
|
+
* rendering through this key. Validating router layers is separate,
|
|
1568
|
+
* future work; this method only guarantees atom values.
|
|
1569
|
+
*/
|
|
1570
|
+
applyHydration(hydration) {
|
|
1571
|
+
for (const [key, value] of Object.entries(hydration)) {
|
|
1572
|
+
if (key === "alepha.react.router.layers") continue;
|
|
1573
|
+
const atom = this.alepha.store.getAtom(key);
|
|
1574
|
+
if (atom) {
|
|
1575
|
+
const result = this.validator.safeValidate(atom.schema, value);
|
|
1576
|
+
if (!result.success) {
|
|
1577
|
+
this.log.warn(`Hydrated value for atom "${key}" failed schema validation, keeping default`);
|
|
1578
|
+
continue;
|
|
1579
|
+
}
|
|
1580
|
+
this.alepha.store.set(key, result.data, { skipValidation: true });
|
|
1581
|
+
} else this.alepha.set(key, value);
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1424
1584
|
onTransitionEnd = $hook({
|
|
1425
1585
|
on: "react:transition:end",
|
|
1426
1586
|
handler: () => {
|
|
@@ -1435,9 +1595,7 @@ var ReactBrowserProvider = class {
|
|
|
1435
1595
|
handler: async () => {
|
|
1436
1596
|
const hydration = this.getHydrationState();
|
|
1437
1597
|
const previous = hydration?.["alepha.react.router.layers"] ?? [];
|
|
1438
|
-
if (hydration)
|
|
1439
|
-
for (const [key, value] of Object.entries(hydration)) if (key !== "alepha.react.router.layers") this.alepha.set(key, value);
|
|
1440
|
-
}
|
|
1598
|
+
if (hydration) this.applyHydration(hydration);
|
|
1441
1599
|
await this.render({ previous });
|
|
1442
1600
|
const element = this.router.root(this.state);
|
|
1443
1601
|
await this.alepha.events.emit("react:browser:render", {
|
|
@@ -1745,7 +1903,7 @@ const useActive = (args) => {
|
|
|
1745
1903
|
*
|
|
1746
1904
|
* @example
|
|
1747
1905
|
* const [params, setParams] = useQueryParams(
|
|
1748
|
-
*
|
|
1906
|
+
* z.object({ tab: z.string().optional() }),
|
|
1749
1907
|
* { format: "querystring" },
|
|
1750
1908
|
* );
|
|
1751
1909
|
* // params.tab reads from `?tab=…`; setParams({ tab: "security" }) writes it.
|
|
@@ -1822,11 +1980,12 @@ const AlephaReactRouter = $module({
|
|
|
1822
1980
|
ReactBrowserProvider,
|
|
1823
1981
|
ReactRouter,
|
|
1824
1982
|
ReactBrowserRendererProvider,
|
|
1983
|
+
RouterLocaleProvider,
|
|
1825
1984
|
ReactPageService
|
|
1826
1985
|
],
|
|
1827
|
-
register: (alepha) => alepha.with(AlephaReact).with(AlephaReactHead).with(AlephaDateTime).with(AlephaServer).with(AlephaServerLinks).with(ReactPageProvider).with(ReactBrowserProvider).with(ReactBrowserRouterProvider).with(ReactBrowserRendererProvider).with(ReactRouter)
|
|
1986
|
+
register: (alepha) => alepha.with(AlephaReact).with(AlephaReactHead).with(AlephaDateTime).with(AlephaServer).with(AlephaServerLinks).with(ReactPageProvider).with(ReactBrowserProvider).with(ReactBrowserRouterProvider).with(ReactBrowserRendererProvider).with(RouterLocaleProvider).with(ReactRouter)
|
|
1828
1987
|
});
|
|
1829
1988
|
//#endregion
|
|
1830
|
-
export { $page, AlephaReactRouter, ErrorViewer, Link, NestedView_default as NestedView, NotFound, PAGE_PRELOAD_KEY, PagePrimitive, ReactBrowserProvider, ReactBrowserRendererProvider, ReactBrowserRouterProvider, ReactPageProvider, ReactPageService, ReactRouter, Redirection, RouterLayerContext, isPageRoute, reactBrowserOptions, reactPageOptions, useActive, useQueryParams, useRouter, useRouterState };
|
|
1989
|
+
export { $page, AlephaReactRouter, ErrorViewer, Link, NestedView_default as NestedView, NotFound, PAGE_PRELOAD_KEY, PagePrimitive, ReactBrowserProvider, ReactBrowserRendererProvider, ReactBrowserRouterProvider, ReactPageProvider, ReactPageService, ReactRouter, Redirection, RootComponentsProvider, RouterLayerContext, RouterLocaleProvider, isPageRoute, reactBrowserOptions, reactPageOptions, useActive, useQueryParams, useRouter, useRouterState };
|
|
1831
1990
|
|
|
1832
1991
|
//# sourceMappingURL=index.browser.js.map
|