alepha 0.23.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
- package/dist/api/audits/index.browser.js +49 -52
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +629 -565
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +206 -98
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +44 -44
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +292 -293
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +61 -64
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +61 -59
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +546 -347
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +165 -86
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +247 -235
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js +63 -66
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +40 -38
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +339 -209
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +108 -60
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +190 -78
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js +290 -68
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js +14 -14
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +158 -134
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js +18 -18
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +74 -53
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +607 -513
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +205 -127
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +652 -449
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js +159 -93
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +1032 -762
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +166 -185
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +48 -71
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1297 -1143
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +456 -392
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js +17 -17
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +167 -155
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +47 -95
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +0 -1
- package/dist/background/index.d.ts.map +1 -1
- package/dist/background/index.js.map +1 -1
- package/dist/background/index.workerd.js.map +1 -1
- package/dist/batch/index.d.ts +0 -1
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +27 -32
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +56 -26
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +52 -24
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +4 -6
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +4 -10
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +4 -10
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -23
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js +11 -20
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +3 -4
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js +4 -4
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +0 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/core/index.d.ts +205 -442
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +259 -284
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -9
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js +3 -3
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +8 -34
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +6 -6
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +89 -82
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +27 -33
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +351 -404
- package/dist/cli/platform-lib/index.d.ts.map +1 -1
- package/dist/cli/platform-lib/index.js +218 -239
- package/dist/cli/platform-lib/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +17 -41
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js +10 -13
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +83 -195
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +160 -563
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +845 -859
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +787 -527
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +845 -859
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +845 -859
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +845 -859
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +3 -4
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js +6 -3
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +12 -2
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +6 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +0 -1
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js +4 -4
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +0 -1
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +2 -2
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +15 -7
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +14 -5
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js +5 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +8 -9
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +702 -479
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1580 -1238
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +11728 -32131
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -9
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +5 -5
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +0 -1
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +81 -69
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +123 -56
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +27 -90
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +42 -70
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +54 -40
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +140 -106
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +145 -150
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +144 -109
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +64 -54
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +36 -76
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +67 -57
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +62 -75
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +48 -71
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +48 -71
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +7 -4
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +87 -5
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +170 -23
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -5
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +91 -56
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.browser.js.map +1 -1
- package/dist/react/head/index.d.ts +0 -1
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +4 -5
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +2 -2
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -4
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +60 -24
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +378 -377
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +77 -41
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.d.ts +0 -1
- package/dist/react/sitemap/index.d.ts.map +1 -1
- package/dist/react/sitemap/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +4 -5
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +41 -15
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
- package/dist/react/ui/index.d.ts +35 -34
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js +12 -17
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js +5 -5
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +6 -7
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +6 -6
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +0 -1
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +4 -12
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +9 -4
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +9 -4
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +30 -28
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +113 -44
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +452 -37
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js +19 -19
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +198 -274
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +83 -621
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js +103 -5
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +72 -5
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +103 -9
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js +22 -27
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +116 -85
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +105 -118
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +9 -10
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +14 -26
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +2 -3
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/etag/index.js.map +1 -1
- package/dist/server/health/index.d.ts +18 -19
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js +6 -6
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +15 -18
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +29 -32
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +0 -1
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +10 -3
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +0 -1
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +8 -9
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +6 -12
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +0 -1
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +4 -4
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +37 -25
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +0 -1
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +0 -1
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +2 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.d.ts +19 -20
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js +8 -8
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +3 -4
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/package.json +22 -35
- package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
- package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
- package/src/api/audits/controllers/AdminAuditController.ts +41 -41
- package/src/api/audits/entities/audits.ts +22 -22
- package/src/api/audits/index.ts +6 -1
- package/src/api/audits/jobs/AuditJobs.ts +29 -0
- package/src/api/audits/parameters/AuditParameters.ts +51 -0
- package/src/api/audits/primitives/$audit.ts +24 -0
- package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
- package/src/api/audits/schemas/createAuditSchema.ts +18 -18
- package/src/api/audits/services/AuditService.ts +79 -7
- package/src/api/files/__tests__/FileController.spec.ts +5 -5
- package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
- package/src/api/files/controllers/FileController.ts +25 -25
- package/src/api/files/entities/files.ts +15 -15
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
- package/src/api/files/schemas/fileQuerySchema.ts +9 -9
- package/src/api/files/schemas/fileResourceSchema.ts +7 -9
- package/src/api/files/schemas/storageStatsSchema.ts +13 -13
- package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
- package/src/api/jobs/__tests__/$job.spec.ts +18 -18
- package/src/api/jobs/controllers/AdminJobController.ts +8 -8
- package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
- package/src/api/jobs/providers/JobProvider.ts +128 -12
- package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
- package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
- package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
- package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
- package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
- package/src/api/jobs/services/JobService.ts +6 -6
- package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
- package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
- package/src/api/keys/entities/apiKeyEntity.ts +15 -15
- package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
- package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
- package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
- package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
- package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
- package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
- package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
- package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
- package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
- package/src/api/notifications/primitives/$notification.ts +43 -4
- package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
- package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
- package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
- package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
- package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
- package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
- package/src/api/notifications/services/NotificationSenderService.ts +38 -2
- package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
- package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
- package/src/api/oauth/controllers/OAuthController.ts +132 -12
- package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
- package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
- package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
- package/src/api/oauth/index.ts +1 -0
- package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
- package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
- package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
- package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
- package/src/api/oauth/services/OAuthClientService.ts +228 -15
- package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
- package/src/api/organizations/entities/organizations.ts +6 -6
- package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
- package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
- package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
- package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
- package/src/api/parameters/entities/parameters.ts +29 -16
- package/src/api/parameters/primitives/$parameter.ts +3 -3
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
- package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
- package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
- package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
- package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
- package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
- package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
- package/src/api/parameters/services/ParameterProvider.ts +152 -65
- package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
- package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
- package/src/api/payments/controllers/PaymentController.ts +4 -4
- package/src/api/payments/entities/paymentIntents.ts +11 -11
- package/src/api/payments/entities/paymentMethods.ts +11 -11
- package/src/api/payments/entities/refunds.ts +9 -9
- package/src/api/payments/providers/PaymentProvider.ts +18 -0
- package/src/api/payments/schemas/intentSchemas.ts +25 -25
- package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
- package/src/api/payments/services/PaymentService.ts +60 -3
- package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
- package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
- package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
- package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
- package/src/api/subscriptions/entities/subscriptions.ts +22 -22
- package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
- package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
- package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
- package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
- package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
- package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
- package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
- package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
- package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
- package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
- package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
- package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
- package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
- package/src/api/users/controllers/AdminIdentityController.ts +29 -19
- package/src/api/users/controllers/AdminSessionController.ts +37 -27
- package/src/api/users/controllers/AdminUserController.ts +75 -53
- package/src/api/users/controllers/MySessionController.ts +125 -0
- package/src/api/users/controllers/RealmController.ts +9 -10
- package/src/api/users/controllers/UserController.ts +55 -55
- package/src/api/users/entities/identities.ts +8 -8
- package/src/api/users/entities/sessions.ts +17 -17
- package/src/api/users/entities/users.ts +17 -17
- package/src/api/users/index.ts +3 -0
- package/src/api/users/notifications/UserNotifications.ts +76 -24
- package/src/api/users/primitives/$realm.ts +12 -26
- package/src/api/users/providers/RealmProvider.ts +0 -15
- package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
- package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
- package/src/api/users/schemas/createUserSchema.ts +2 -2
- package/src/api/users/schemas/identityQuerySchema.ts +4 -4
- package/src/api/users/schemas/identityResourceSchema.ts +3 -2
- package/src/api/users/schemas/loginSchema.ts +4 -4
- package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
- package/src/api/users/schemas/realmConfigSchema.ts +10 -24
- package/src/api/users/schemas/registerQuerySchema.ts +6 -6
- package/src/api/users/schemas/registerRequestSchema.ts +21 -43
- package/src/api/users/schemas/registerResponseSchema.ts +2 -2
- package/src/api/users/schemas/registerSchema.ts +13 -31
- package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
- package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
- package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
- package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
- package/src/api/users/schemas/updateUserSchema.ts +3 -4
- package/src/api/users/schemas/userQuerySchema.ts +7 -7
- package/src/api/users/services/RegistrationService.ts +25 -11
- package/src/api/users/services/UserService.ts +12 -6
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
- package/src/api/verifications/controllers/VerificationController.ts +13 -27
- package/src/api/verifications/entities/verifications.ts +13 -14
- package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
- package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
- package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
- package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
- package/src/api/verifications/services/VerificationService.ts +12 -0
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
- package/src/batch/__tests__/$batch.spec.ts +22 -22
- package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
- package/src/bin/index.ts +1 -1
- package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
- package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
- package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
- package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
- package/src/cache/core/primitives/$cache.ts +7 -10
- package/src/cache/database/entities/cacheEntries.ts +16 -27
- package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
- package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
- package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
- package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
- package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
- package/src/cli/core/atoms/appEntryOptions.ts +5 -5
- package/src/cli/core/atoms/buildOptions.ts +76 -76
- package/src/cli/core/atoms/changelogOptions.ts +3 -3
- package/src/cli/core/atoms/devOptions.ts +3 -3
- package/src/cli/core/commands/build.ts +36 -39
- package/src/cli/core/commands/db.ts +171 -83
- package/src/cli/core/commands/dev.ts +8 -8
- package/src/cli/core/commands/gen/changelog.ts +12 -14
- package/src/cli/core/commands/gen/env.ts +6 -6
- package/src/cli/core/commands/gen/openapi.ts +6 -6
- package/src/cli/core/commands/init.ts +28 -33
- package/src/cli/core/commands/pack.ts +10 -10
- package/src/cli/core/commands/root.ts +7 -8
- package/src/cli/core/commands/test.ts +17 -20
- package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
- package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
- package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
- package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
- package/src/cli/platform/commands/SecretsCommand.ts +24 -25
- package/src/cli/platform/commands/platform.ts +40 -46
- package/src/cli/platform/index.ts +1 -1
- package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
- package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
- package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
- package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
- package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
- package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
- package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
- package/src/cli/platform-lib/schemas/platform.ts +51 -51
- package/src/cli/platform-lib/schemas/vercel.ts +28 -28
- package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
- package/src/cli/platform-lib/services/VercelApi.ts +4 -4
- package/src/cli/platform-lib/services/VercelCli.ts +6 -15
- package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
- package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
- package/src/cli/vendor/commands/VendorCommand.ts +11 -12
- package/src/command/__tests__/$command.spec.ts +82 -83
- package/src/command/__tests__/Asker.spec.ts +6 -13
- package/src/command/__tests__/CliProvider.spec.ts +136 -149
- package/src/command/__tests__/Runner.spec.ts +86 -110
- package/src/command/helpers/Asker.ts +23 -58
- package/src/command/helpers/Runner.ts +34 -110
- package/src/command/index.ts +4 -9
- package/src/command/primitives/$command.ts +10 -10
- package/src/command/providers/CliProvider.ts +183 -161
- package/src/core/Alepha.ts +62 -13
- package/src/core/__tests__/$atom.spec.ts +52 -3
- package/src/core/__tests__/$computed.spec.ts +129 -0
- package/src/core/__tests__/$env.spec.ts +13 -13
- package/src/core/__tests__/$inject.spec.ts +4 -4
- package/src/core/__tests__/$module.spec.ts +1 -1
- package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
- package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
- package/src/core/__tests__/Alepha-start.spec.ts +3 -3
- package/src/core/__tests__/CodecManager.spec.ts +113 -94
- package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
- package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
- package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
- package/src/core/__tests__/StateManager.spec.ts +423 -0
- package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
- package/src/core/__tests__/TypeProvider.spec.ts +314 -309
- package/src/core/__tests__/dump.spec.ts +6 -6
- package/src/core/__tests__/pagination.spec.ts +4 -4
- package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
- package/src/core/errors/TypeBoxError.ts +10 -4
- package/src/core/helpers/FileLike.ts +5 -5
- package/src/core/helpers/coerceStrings.ts +70 -0
- package/src/core/helpers/jsonSchemaToZod.ts +112 -0
- package/src/core/index.shared.ts +4 -1
- package/src/core/primitives/$atom.ts +95 -27
- package/src/core/primitives/$computed.ts +148 -0
- package/src/core/primitives/$env.ts +5 -5
- package/src/core/primitives/$state.ts +1 -1
- package/src/core/providers/AlsProvider.ts +26 -0
- package/src/core/providers/CodecManager.ts +1 -2
- package/src/core/providers/JsonSchemaCodec.ts +1 -2
- package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
- package/src/core/providers/SchemaValidator.ts +48 -158
- package/src/core/providers/StateManager.ts +383 -9
- package/src/core/providers/TypeProvider.ts +80 -734
- package/src/core/providers/ZodProvider.ts +380 -0
- package/src/core/providers/zodAugment.ts +69 -0
- package/src/core/schemas/pageQuerySchema.ts +19 -21
- package/src/core/schemas/pageSchema.ts +47 -57
- package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
- package/src/crypto/providers/SecretProvider.ts +16 -10
- package/src/datetime/primitives/$throttle.ts +6 -1
- package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
- package/src/email/core/index.ts +7 -2
- package/src/email/core/primitives/$email.ts +5 -1
- package/src/email/core/providers/LocalEmailProvider.ts +5 -5
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
- package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
- package/src/fake/__tests__/keyName.example.ts +21 -21
- package/src/fake/__tests__/keyName.spec.ts +41 -41
- package/src/fake/__tests__/module.example.ts +8 -8
- package/src/fake/providers/FakeProvider.ts +122 -121
- package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
- package/src/lock/core/index.ts +1 -0
- package/src/lock/core/primitives/$lock.ts +13 -6
- package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
- package/src/logger/__tests__/Logger.spec.ts +49 -0
- package/src/logger/index.ts +25 -18
- package/src/logger/providers/CliFormatterProvider.ts +75 -0
- package/src/logger/schemas/logEntrySchema.ts +10 -10
- package/src/logger/services/Logger.ts +18 -0
- package/src/mcp/__tests__/$prompt.spec.ts +21 -23
- package/src/mcp/__tests__/$tool.spec.ts +22 -22
- package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
- package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
- package/src/mcp/__tests__/integration.spec.ts +33 -33
- package/src/mcp/primitives/$prompt.ts +11 -9
- package/src/mcp/primitives/$tool.ts +27 -86
- package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
- package/src/orm/__tests__/$repository-tests.ts +133 -27
- package/src/orm/__tests__/$repository.spec.ts +23 -0
- package/src/orm/__tests__/$transactional-tests.ts +4 -4
- package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
- package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
- package/src/orm/__tests__/QueryManager.spec.ts +5 -5
- package/src/orm/__tests__/delete-returning-tests.ts +11 -11
- package/src/orm/__tests__/deletedAt-tests.ts +3 -3
- package/src/orm/__tests__/enums.spec.ts +29 -25
- package/src/orm/__tests__/execute-tests.ts +8 -8
- package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
- package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
- package/src/orm/__tests__/joins-tests.ts +30 -30
- package/src/orm/__tests__/organization-tests.ts +105 -3
- package/src/orm/__tests__/organization.spec.ts +46 -0
- package/src/orm/__tests__/orm-errors.spec.ts +10 -10
- package/src/orm/__tests__/orm-next-tests.ts +29 -29
- package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
- package/src/orm/__tests__/primaryKey.spec.ts +4 -4
- package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
- package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
- package/src/orm/__tests__/references.spec.ts +7 -7
- package/src/orm/__tests__/security.spec.ts +17 -17
- package/src/orm/__tests__/string-operators-tests.ts +5 -5
- package/src/orm/__tests__/timestamps-tests.ts +14 -14
- package/src/orm/__tests__/validation-tests.ts +5 -5
- package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
- package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
- package/src/orm/core/entities/alephaSequences.ts +8 -8
- package/src/orm/core/helpers/pgAttr.ts +4 -4
- package/src/orm/core/primitives/$entity.ts +10 -6
- package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
- package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
- package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
- package/src/orm/core/schemas/insertSchema.ts +14 -18
- package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
- package/src/orm/core/schemas/updateSchema.ts +10 -16
- package/src/orm/core/services/PgRelationManager.ts +2 -2
- package/src/orm/core/services/QueryManager.ts +13 -2
- package/src/orm/core/services/Repository.ts +88 -33
- package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
- package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
- package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
- package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
- package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
- package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
- package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
- package/src/queue/core/__tests__/shared.ts +6 -6
- package/src/queue/core/primitives/$consumer.ts +5 -5
- package/src/queue/core/primitives/$queue.ts +44 -61
- package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
- package/src/queue/core/providers/WorkerProvider.ts +17 -14
- package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
- package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
- package/src/react/core/__tests__/Router.spec.tsx +4 -4
- package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
- package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
- package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
- package/src/react/core/components/ErrorBoundary.tsx +42 -0
- package/src/react/core/hooks/useAction.ts +56 -19
- package/src/react/core/hooks/useComputed.ts +91 -0
- package/src/react/core/hooks/useSelector.ts +67 -0
- package/src/react/core/hooks/useStore.ts +36 -17
- package/src/react/core/index.ts +3 -0
- package/src/react/core/utils/shallowEqual.ts +36 -0
- package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
- package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
- package/src/react/form/errors/FormValidationError.ts +0 -2
- package/src/react/form/hooks/useForm.ts +19 -4
- package/src/react/form/hooks/useFormQuerySync.ts +0 -0
- package/src/react/form/services/FormModel.ts +67 -47
- package/src/react/form/services/parseField.ts +66 -27
- package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
- package/src/react/i18n/providers/I18nProvider.ts +2 -2
- package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
- package/src/react/router/__tests__/$page.spec.tsx +21 -21
- package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
- package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
- package/src/react/router/components/NestedView.tsx +11 -3
- package/src/react/router/hooks/useQueryParams.ts +1 -1
- package/src/react/router/primitives/$page.ts +2 -2
- package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
- package/src/react/router/providers/ReactPageProvider.ts +26 -12
- package/src/react/router/providers/ReactServerProvider.ts +13 -15
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
- package/src/react/ui/atoms/uiAtom.ts +6 -6
- package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
- package/src/react/ui/hooks/useColorMode.ts +11 -4
- package/src/react/ui/services/SchemaControl.ts +4 -4
- package/src/redis/providers/BunRedisProvider.ts +19 -11
- package/src/redis/providers/NodeRedisProvider.ts +3 -3
- package/src/scheduler/primitives/$scheduler.ts +21 -8
- package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
- package/src/security/atoms/currentTenantAtom.ts +6 -6
- package/src/security/atoms/currentUserAtom.ts +2 -2
- package/src/security/primitives/$issuer.ts +24 -2
- package/src/security/providers/JwtProvider.ts +100 -0
- package/src/security/providers/SecurityProvider.ts +43 -2
- package/src/security/schemas/permissionSchema.ts +19 -19
- package/src/security/schemas/roleSchema.ts +22 -28
- package/src/security/schemas/userAccountInfoSchema.ts +47 -37
- package/src/server/auth/index.ts +0 -3
- package/src/server/auth/primitives/$auth.ts +6 -6
- package/src/server/auth/primitives/$authApple.ts +10 -10
- package/src/server/auth/primitives/$authFacebook.ts +10 -10
- package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
- package/src/server/auth/primitives/$authGithub.ts +10 -10
- package/src/server/auth/primitives/$authGoogle.ts +10 -10
- package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
- package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
- package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
- package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
- package/src/server/auth/schemas/tokensSchema.ts +16 -16
- package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
- package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
- package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
- package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
- package/src/server/cookies/index.browser.ts +4 -1
- package/src/server/cookies/index.ts +8 -1
- package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
- package/src/server/cookies/primitives/$cookie.ts +16 -0
- package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
- package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
- package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
- package/src/server/cookies/services/CookieParser.ts +6 -1
- package/src/server/core/__tests__/$action.spec.ts +13 -13
- package/src/server/core/__tests__/$middleware.spec.ts +10 -10
- package/src/server/core/__tests__/$route.spec.ts +9 -9
- package/src/server/core/__tests__/$sse.spec.ts +26 -26
- package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
- package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
- package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
- package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
- package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
- package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
- package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
- package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
- package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
- package/src/server/core/errors/ValidationError.ts +6 -3
- package/src/server/core/helpers/isMultipart.ts +2 -1
- package/src/server/core/index.ts +5 -2
- package/src/server/core/interfaces/ServerRequest.ts +6 -14
- package/src/server/core/primitives/$action.ts +26 -36
- package/src/server/core/primitives/$sse.ts +3 -3
- package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
- package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
- package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
- package/src/server/core/providers/ServerCompressProvider.ts +9 -10
- package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
- package/src/server/core/providers/ServerRouterProvider.ts +44 -15
- package/src/server/core/schemas/errorSchema.ts +20 -25
- package/src/server/core/schemas/okSchema.ts +9 -14
- package/src/server/core/services/HttpClient.ts +13 -1
- package/src/server/core/services/ServerRequestParser.ts +6 -6
- package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
- package/src/server/health/schemas/healthSchema.ts +6 -6
- package/src/server/links/__tests__/$remote.spec.ts +3 -3
- package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
- package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
- package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
- package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
- package/src/server/links/atoms/apiLinksAtom.ts +2 -2
- package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
- package/src/server/links/primitives/$remote.ts +3 -3
- package/src/server/links/providers/LinkProvider.ts +3 -3
- package/src/server/links/providers/ServerLinksProvider.ts +20 -20
- package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
- package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
- package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
- package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
- package/src/server/swagger/__tests__/ui.spec.ts +3 -3
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
- package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
- package/src/system/providers/NodeShellProvider.ts +4 -1
- package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
- package/src/topic/core/__tests__/shared.ts +8 -8
- package/src/topic/core/primitives/$subscriber.ts +5 -5
- package/src/topic/core/primitives/$topic.ts +14 -14
- package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
- package/dist/container/core/index.d.ts +0 -236
- package/dist/container/core/index.d.ts.map +0 -1
- package/dist/container/core/index.js +0 -231
- package/dist/container/core/index.js.map +0 -1
- package/dist/container/core/index.workerd.js +0 -192
- package/dist/container/core/index.workerd.js.map +0 -1
- package/src/command/helpers/PrettyAsker.ts +0 -256
- package/src/command/helpers/PrettyPrint.ts +0 -332
- package/src/container/core/__tests__/$container.spec.ts +0 -83
- package/src/container/core/index.ts +0 -50
- package/src/container/core/index.workerd.ts +0 -53
- package/src/container/core/interfaces/ContainerOptions.ts +0 -69
- package/src/container/core/primitives/$container.ts +0 -100
- package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
- package/src/container/core/providers/ContainerProvider.ts +0 -92
- package/src/container/core/providers/MockContainerProvider.ts +0 -62
- package/src/container/core/providers/NodeContainerProvider.ts +0 -53
- package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
- package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
- package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
- package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
- package/src/server/auth/helpers/federationAssertion.ts +0 -74
- package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
- package/src/server/auth/primitives/$authFederationClient.ts +0 -89
- /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $inject, $module, Alepha, AlephaError, TypeBoxError, isFileLike,
|
|
1
|
+
import { $inject, $module, Alepha, AlephaError, TypeBoxError, isFileLike, z } from "alepha";
|
|
2
2
|
import { $cache } from "alepha/cache";
|
|
3
3
|
import { $logger } from "alepha/logger";
|
|
4
4
|
//#region ../../src/server/core/errors/HttpError.ts
|
|
@@ -69,35 +69,32 @@ const isMultipart = (options) => {
|
|
|
69
69
|
if (options.contentType === "multipart/form-data" || options.requestBodyType === "multipart/form-data") return true;
|
|
70
70
|
if (options.schema?.body && "properties" in options.schema.body) {
|
|
71
71
|
const properties = options.schema.body.properties;
|
|
72
|
-
for (const key in properties) if (properties[key]
|
|
72
|
+
for (const key in properties) if (z.schema.format(properties[key]) === "binary") return true;
|
|
73
73
|
}
|
|
74
74
|
return false;
|
|
75
75
|
};
|
|
76
76
|
//#endregion
|
|
77
77
|
//#region ../../src/server/core/schemas/errorSchema.ts
|
|
78
|
-
const errorSchema =
|
|
79
|
-
error:
|
|
80
|
-
status:
|
|
81
|
-
message:
|
|
78
|
+
const errorSchema = z.object({
|
|
79
|
+
error: z.text({ description: "HTTP error name" }),
|
|
80
|
+
status: z.integer().describe("HTTP status code"),
|
|
81
|
+
message: z.text({
|
|
82
82
|
description: "Short text which describe the error",
|
|
83
83
|
size: "rich"
|
|
84
84
|
}),
|
|
85
|
-
details:
|
|
85
|
+
details: z.text({
|
|
86
86
|
description: "Detailed description of the error",
|
|
87
87
|
size: "rich"
|
|
88
|
-
})),
|
|
89
|
-
requestId:
|
|
90
|
-
cause:
|
|
91
|
-
name:
|
|
92
|
-
message:
|
|
88
|
+
}).optional(),
|
|
89
|
+
requestId: z.text().optional(),
|
|
90
|
+
cause: z.object({
|
|
91
|
+
name: z.text(),
|
|
92
|
+
message: z.text({
|
|
93
93
|
description: "Cause Error message",
|
|
94
94
|
size: "rich"
|
|
95
95
|
})
|
|
96
|
-
}))
|
|
97
|
-
}
|
|
98
|
-
title: "HttpError",
|
|
99
|
-
description: "Generic response after a failed operation"
|
|
100
|
-
});
|
|
96
|
+
}).optional()
|
|
97
|
+
}).meta({ title: "HttpError" }).describe("Generic response after a failed operation");
|
|
101
98
|
//#endregion
|
|
102
99
|
//#region ../../src/server/core/services/HttpClient.ts
|
|
103
100
|
var HttpClient = class {
|
|
@@ -387,8 +384,9 @@ var ValidationError = class extends HttpError {
|
|
|
387
384
|
let fullMessage = message;
|
|
388
385
|
let details;
|
|
389
386
|
if (cause instanceof TypeBoxError) {
|
|
390
|
-
|
|
391
|
-
|
|
387
|
+
const path = cause.cause.instancePath;
|
|
388
|
+
fullMessage = `${message}: ${cause.cause.message}${path ? ` (${path})` : ""}`;
|
|
389
|
+
if (path) details = path;
|
|
392
390
|
}
|
|
393
391
|
super({
|
|
394
392
|
message: fullMessage,
|
|
@@ -437,14 +435,11 @@ var ServerReply = class {
|
|
|
437
435
|
};
|
|
438
436
|
//#endregion
|
|
439
437
|
//#region ../../src/server/core/schemas/okSchema.ts
|
|
440
|
-
const okSchema =
|
|
441
|
-
ok:
|
|
442
|
-
id:
|
|
443
|
-
count:
|
|
444
|
-
}
|
|
445
|
-
title: "Ok",
|
|
446
|
-
description: "Generic response after a successful operation on a resource"
|
|
447
|
-
});
|
|
438
|
+
const okSchema = z.object({
|
|
439
|
+
ok: z.boolean().describe("True when operation succeed"),
|
|
440
|
+
id: z.union([z.text(), z.integer()]).optional(),
|
|
441
|
+
count: z.number().describe("Number of resources affected").optional()
|
|
442
|
+
}).meta({ title: "Ok" }).describe("Generic response after a successful operation on a resource");
|
|
448
443
|
//#endregion
|
|
449
444
|
//#region ../../src/server/core/index.browser.ts
|
|
450
445
|
const AlephaServer = $module({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/core/errors/HttpError.ts","../../../src/server/core/helpers/isMultipart.ts","../../../src/server/core/schemas/errorSchema.ts","../../../src/server/core/services/HttpClient.ts","../../../src/server/core/constants/routeMethods.ts","../../../src/server/core/errors/BadRequestError.ts","../../../src/server/core/errors/ConflictError.ts","../../../src/server/core/errors/ForbiddenError.ts","../../../src/server/core/errors/NotFoundError.ts","../../../src/server/core/errors/UnauthorizedError.ts","../../../src/server/core/errors/ValidationError.ts","../../../src/server/core/helpers/ServerReply.ts","../../../src/server/core/schemas/okSchema.ts","../../../src/server/core/index.browser.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type { ErrorSchema } from \"../schemas/errorSchema.ts\";\n\nexport const isHttpError = (\n error: unknown,\n status?: number,\n): error is HttpErrorLike => {\n const isError =\n !!error &&\n typeof error === \"object\" &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n \"status\" in error &&\n typeof error.status === \"number\";\n\n if (!isError) {\n return false;\n }\n\n if (status) {\n return (error as HttpErrorLike).status === status;\n }\n\n return true;\n};\n\nexport class HttpError extends AlephaError {\n public name = \"HttpError\";\n\n static is = isHttpError;\n\n static toJSON(error: HttpError): ErrorSchema {\n const json: Record<string, unknown> = {\n error: error.error,\n status: error.status,\n message: error.message,\n };\n\n if (error.details) json.details = error.details;\n if (error.requestId) json.requestId = error.requestId;\n if (error.reason) json.cause = error.reason;\n\n return json as ErrorSchema;\n }\n\n public readonly error: string;\n public readonly status: number;\n\n public readonly requestId?: string;\n public readonly details?: string;\n public readonly reason?: {\n name: string;\n message: string;\n };\n\n constructor(options: Partial<ErrorSchema>, cause?: unknown) {\n super(options.message, {\n cause,\n });\n\n this.status = options.status ?? 500;\n this.details = options.details;\n this.requestId = options.requestId;\n\n if (typeof options.cause === \"object\") {\n this.reason = {\n name: (options.cause as { name: string }).name,\n message: (options.cause as { message: string }).message,\n };\n } else if (cause instanceof Error) {\n this.reason = {\n name: cause.name,\n message: cause.message,\n };\n }\n\n if (this.constructor.name === \"HttpError\") {\n this.error =\n options.error ?? errorNameByStatus[this.status] ?? \"HttpError\";\n } else {\n this.error = this.constructor.name;\n }\n }\n}\n\nexport const errorNameByStatus: Record<number, string> = {\n 400: \"BadRequestError\",\n 401: \"UnauthorizedError\",\n 403: \"ForbiddenError\",\n 404: \"NotFoundError\",\n 405: \"MethodNotAllowedError\",\n 409: \"ConflictError\",\n 410: \"GoneError\",\n 413: \"PayloadTooLargeError\",\n 415: \"UnsupportedMediaTypeError\",\n 429: \"TooManyRequestsError\",\n 500: \"InternalServerError\",\n 501: \"NotImplementedError\",\n 502: \"BadGatewayError\",\n 503: \"ServiceUnavailableError\",\n 504: \"GatewayTimeoutError\",\n};\n\nexport interface HttpErrorLike extends Error {\n status: number;\n}\n","import type { RequestConfigSchema } from \"../interfaces/ServerRequest.ts\";\n\n/**\n * Checks if the route has multipart/form-data request body.\n */\nexport const isMultipart = (options: {\n schema?: RequestConfigSchema;\n contentType?: string;\n requestBodyType?: string;\n}): boolean => {\n if (\n options.contentType === \"multipart/form-data\" ||\n options.requestBodyType === \"multipart/form-data\"\n ) {\n return true;\n }\n\n if (options.schema?.body && \"properties\" in options.schema.body) {\n const properties: Record<string, any> = options.schema.body.properties;\n for (const key in properties) {\n if (properties[key].format === \"binary\") {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { type Static, t } from \"alepha\";\n\nexport const errorSchema = t.object(\n {\n error: t.text({ description: \"HTTP error name\" }),\n status: t.integer({\n description: \"HTTP status code\",\n }),\n message: t.text({\n description: \"Short text which describe the error\",\n size: \"rich\",\n }),\n details: t.optional(\n t.text({\n description: \"Detailed description of the error\",\n size: \"rich\",\n }),\n ),\n requestId: t.optional(t.text()),\n cause: t.optional(\n t.object({\n name: t.text(),\n message: t.text({\n description: \"Cause Error message\",\n size: \"rich\",\n }),\n }),\n ),\n },\n {\n title: \"HttpError\",\n description: \"Generic response after a failed operation\",\n },\n);\n\nexport type ErrorSchema = Static<typeof errorSchema>;\n","import {\n $inject,\n Alepha,\n AlephaError,\n type FileLike,\n isFileLike,\n type Static,\n type TObject,\n type TSchema,\n} from \"alepha\";\nimport { $cache } from \"alepha/cache\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpError } from \"../errors/HttpError.ts\";\nimport { isMultipart } from \"../helpers/isMultipart.ts\";\nimport type {\n ServerRequestConfigEntry,\n TRequestBody,\n TResponseBody,\n} from \"../interfaces/ServerRequest.ts\";\nimport type { ClientRequestOptions } from \"../primitives/$action.ts\";\nimport { errorSchema } from \"../schemas/errorSchema.ts\";\n\nexport class HttpClient {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n public readonly cache = $cache<HttpClientCache>({\n provider: \"memory\",\n name: \"http:client\",\n });\n\n protected readonly pendingRequests: HttpClientPendingRequests = {};\n\n public async fetchAction(args: FetchActionArgs): Promise<FetchResponse> {\n const route = args.action; // our link to fetch\n const options = args.options ?? {}; // fetch standard options, cache, etc.\n const config = args.config ?? {}; // params, query, body, etc.\n const host = args.host ?? \"\"; // remote host, e.g. \"https://api.example.com\" or empty (for browser)\n\n const request: RequestInit = {\n ...options.request,\n };\n\n const method = route.method;\n const headers: Record<string, string> = {};\n const url = this.url(host, route, config);\n\n await this.alepha.events.emit(\"client:onRequest\", {\n route,\n config,\n options,\n headers,\n request,\n });\n\n request.method ??= method;\n\n await this.body(request, headers, route, config);\n\n request.headers = {\n ...config.headers,\n ...Object.fromEntries(new Headers(request.headers).entries()),\n ...headers,\n };\n\n return await this.fetch(url, {\n ...request,\n schema: route.schema,\n ...options,\n });\n }\n\n public async fetch<T extends TSchema>(\n url: string,\n request: RequestInitWithOptions<T> = {}, // standard options\n ): Promise<FetchResponse<Static<T>>> {\n const options = {\n cache: request.localCache,\n schema: request.schema?.response,\n key: request.key,\n };\n\n request.method ??= \"GET\";\n\n this.log.trace(\"Request\", {\n url,\n method: request.method,\n body: request.body,\n headers: request.headers,\n options,\n });\n\n // Only add automatic ETag if user didn't explicitly provide headers\n const cached = await this.cache.get(url);\n if (cached && request.method === \"GET\") {\n if (cached.etag) {\n request.headers = new Headers(request.headers);\n if (!request.headers.has(\"if-none-match\")) {\n request.headers.set(\"if-none-match\", cached.etag);\n }\n } else {\n return {\n data: cached.data as Static<T>,\n status: 200,\n statusText: \"OK\",\n headers: new Headers(),\n };\n }\n }\n\n await this.alepha.events.emit(\"client:beforeFetch\", {\n url,\n options,\n request,\n });\n\n // Deduplicate concurrent identical requests for idempotent methods only.\n // Non-idempotent methods (POST, PUT, PATCH, DELETE) must always execute\n // since each call may produce a different side effect.\n const isIdempotent =\n request.method === \"GET\" ||\n request.method === \"HEAD\" ||\n request.method === \"OPTIONS\";\n const key =\n options.key ??\n (isIdempotent\n ? JSON.stringify({ url, method: request.method })\n : undefined);\n\n if (key) {\n const existing = this.pendingRequests[key];\n if (existing) {\n this.log.info(\"Request already pending\", key);\n return existing;\n }\n }\n\n const promise = fetch(url, request)\n .then(async (response) => {\n this.log.debug(\"Response\", {\n url,\n status: response.status,\n });\n\n const fetchResponse: FetchResponse = {\n data: await this.responseData(response, options),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n raw: response,\n };\n\n if (request.method === \"GET\") {\n if (options.cache) {\n await this.cache.set(\n url,\n { data: fetchResponse.data },\n typeof options.cache === \"boolean\" ? undefined : options.cache,\n );\n } else if (!this.alepha.isBrowser()) {\n // only cache etag on server, browser can handle etag itself\n const etag = response.headers.get(\"etag\") ?? undefined;\n if (etag) {\n await this.cache.set(url, { data: fetchResponse.data, etag });\n }\n }\n }\n\n return fetchResponse;\n })\n .finally(() => {\n if (key) {\n delete this.pendingRequests[key];\n }\n });\n\n if (key) {\n this.pendingRequests[key] = promise;\n }\n\n return promise;\n }\n\n protected url(\n host: string,\n action: HttpAction,\n args: ServerRequestConfigEntry,\n ) {\n let url = host;\n\n if (action.prefix) {\n url += action.prefix;\n }\n\n url += action.path;\n url = this.pathVariables(url, action, args);\n url = this.queryParams(url, action, args);\n\n return url;\n }\n\n protected async body(\n init: RequestInit,\n headers: Record<string, string>,\n action: HttpAction,\n args: ServerRequestConfigEntry = {},\n ) {\n const hasHeader =\n typeof init.headers === \"object\" &&\n \"content-type\" in init.headers &&\n init.headers[\"content-type\"] === \"multipart/form-data\";\n\n if (hasHeader || isMultipart(action)) {\n if (typeof init.headers === \"object\" && \"content-type\" in init.headers) {\n delete (init.headers as Record<string, unknown>)[\"content-type\"]; // fetch() will fill this for us\n }\n\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(args.body ?? {})) {\n if (typeof value === \"string\") {\n formData.append(key, value);\n continue;\n }\n if (value instanceof Blob) {\n formData.append(key, value);\n continue;\n }\n if (isFileLike(value)) {\n // FileLike must be transformed to WebFile\n formData.append(\n key,\n new File([await value.arrayBuffer()], value.name, {\n type: value.type,\n }),\n );\n }\n }\n\n init.body = formData;\n\n return;\n }\n\n if (!init.body && action.schema?.body) {\n headers[\"content-type\"] = \"application/json\";\n init.body = this.alepha.codec.encode(action.schema?.body, args.body, {\n as: \"string\",\n });\n }\n }\n\n protected async responseData(\n response: Response,\n options: FetchOptions,\n ): Promise<any> {\n if (response.status === 304) {\n let cacheKey = response.url;\n if (typeof window !== \"undefined\") {\n cacheKey = cacheKey.replace(window.location.origin, \"\");\n }\n\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n return cached.data;\n }\n\n // if no cached data (etag-only routes), return empty string\n return \"\";\n }\n\n if (response.status === 204) {\n return;\n }\n\n if (this.isMaybeFile(response)) {\n return this.createFileLike(response);\n }\n\n if (response.headers.get(\"Content-Type\")?.startsWith(\"text/\")) {\n return await response.text();\n }\n\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n const json = await response.json();\n\n if (response.status >= 400) {\n const jsonError = this.alepha.codec.decode(errorSchema, json);\n const error = new HttpError(jsonError);\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n if (options.schema) {\n return this.alepha.codec.decode(options.schema, json);\n }\n\n return json;\n }\n\n if (response.status >= 400) {\n const error = new HttpError({\n status: response.status,\n message: `An error occurred while fetching the resource. (${response.statusText})`,\n });\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n return response;\n }\n\n protected isMaybeFile(response: Response): boolean {\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) {\n return false;\n }\n\n if (response.headers.get(\"Content-Disposition\")?.includes(\"attachment\")) {\n return true; // If Content-Disposition indicates an attachment, treat it as a file\n }\n\n return (\n contentType.startsWith(\"application/octet-stream\") ||\n contentType.startsWith(\"application/pdf\") ||\n contentType.startsWith(\"application/zip\") ||\n contentType.startsWith(\"image/\") ||\n contentType.startsWith(\"video/\") ||\n contentType.startsWith(\"audio/\")\n );\n }\n\n protected createFileLike(response: Response, defaultFileName = \"\"): FileLike {\n const match = (response.headers.get(\"Content-Disposition\") ?? \"\").match(\n /filename=\"(.+)\"/,\n );\n return {\n name: match?.[1] ? match[1] : defaultFileName,\n type: response.headers.get(\"Content-Type\") ?? \"application/octet-stream\",\n size: Number(response.headers.get(\"Content-Length\") ?? 0),\n lastModified: Date.now(),\n stream: () => {\n throw new AlephaError(\"Not implemented\");\n },\n arrayBuffer: async () => {\n return await response.arrayBuffer();\n },\n text: async () => {\n return await response.text();\n },\n };\n }\n\n public pathVariables(\n url: string,\n action: { schema?: { params?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.params === \"object\") {\n const params = action.schema?.params\n ? (this.alepha.codec.decode(\n action.schema.params,\n args.params,\n ) as Record<string, any>)\n : args.params;\n\n for (const key of Object.keys(params)) {\n url = url.replace(`:${key}`, params[key]);\n url = url.replace(`{${key}}`, params[key]);\n }\n }\n\n return url;\n }\n\n public queryParams(\n url: string,\n action: { schema?: { query?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.query === \"object\") {\n const query = action.schema?.query\n ? this.alepha.codec.decode(action.schema.query, args.query ?? {})\n : args.query;\n\n for (const key of Object.keys(query)) {\n if (query[key] === undefined) {\n delete query[key];\n }\n if (typeof query[key] === \"object\") {\n query[key] = JSON.stringify(query[key]);\n }\n }\n\n const params = new URLSearchParams(\n query as Record<string, string>,\n ).toString();\n return params ? `${url}?${params}` : url;\n }\n return url;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface FetchOptions<T extends TSchema = TSchema> {\n /**\n * Key to identify the request in the pending requests.\n */\n key?: string;\n\n /**\n * The schema to validate the response against.\n */\n schema?: {\n response?: T;\n };\n\n /**\n * Built-in cache options.\n */\n localCache?: boolean | number | DurationLike;\n}\n\nexport type RequestInitWithOptions<T extends TSchema = TSchema> = RequestInit &\n FetchOptions<T>;\n\nexport interface FetchResponse<T = any> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n raw?: Response;\n}\n\nexport type HttpClientPendingRequests = Record<\n string,\n Promise<any> | undefined\n>;\n\ninterface HttpClientCache {\n data: any;\n etag?: string;\n}\n\nexport interface FetchActionArgs {\n action: HttpAction;\n host?: string;\n config?: ServerRequestConfigEntry;\n options?: ClientRequestOptions;\n}\n\nexport interface HttpAction {\n method?: string;\n prefix?: string;\n path: string;\n contentType?: string;\n requestBodyType?: string;\n schema?: {\n params?: TObject;\n query?: TObject;\n body?: TRequestBody;\n response?: TResponseBody;\n };\n}\n","export const routeMethods = [\n // list of supported http methods\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n] as const;\n\nexport type RouteMethod = (typeof routeMethods)[number];\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class BadRequestError extends HttpError {\n constructor(message = \"Invalid request body\", cause?: unknown) {\n super(\n {\n message,\n status: 400,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ConflictError extends HttpError {\n constructor(message = \"Entity already exists\", cause?: unknown) {\n super(\n {\n message,\n status: 409,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ForbiddenError extends HttpError {\n constructor(\n message = \"No permission to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 403,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class NotFoundError extends HttpError {\n constructor(message = \"Resource not found\", cause?: unknown) {\n super(\n {\n message,\n status: 404,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class UnauthorizedError extends HttpError {\n readonly name = \"UnauthorizedError\";\n\n constructor(\n message = \"Not allowed to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 401,\n },\n cause,\n );\n }\n}\n","import { TypeBoxError } from \"alepha\";\nimport { HttpError } from \"./HttpError.ts\";\n\nexport class ValidationError extends HttpError {\n constructor(message = \"Validation has failed\", cause?: unknown) {\n let fullMessage = message;\n let details: string | undefined;\n\n if (cause instanceof TypeBoxError) {\n fullMessage = `${message}: ${cause.cause.message}`;\n if (cause.cause.instancePath) {\n details = cause.cause.instancePath;\n }\n }\n\n super(\n {\n message: fullMessage,\n status: 400,\n details,\n },\n cause,\n );\n }\n}\n","/**\n * Helper for building server replies.\n */\nexport class ServerReply {\n // TODO: make it private\n public headers: Record<string, string> & {\n \"set-cookie\"?: string[];\n } = {};\n\n public status?: number; // default 200, or 204 (no content)\n\n public body?: any;\n\n /**\n * Redirect to a given URL with optional status code (default 302).\n */\n public redirect(url: string, status: number = 302): void {\n this.status = status;\n this.headers.location = url;\n }\n\n // TODO: check if status / header is already set and throw an error if so (for allow to override with force flag)\n\n /**\n * Set the response status code.\n */\n public setStatus(status: number): this {\n this.status = status;\n return this;\n }\n\n /**\n * Set a response header.\n */\n public setHeader(name: string, value: string): this {\n this.headers[name.toLowerCase()] = value;\n return this;\n }\n\n /**\n * Set the response body.\n */\n public setBody(body: any): this {\n this.body = body;\n return this;\n }\n}\n","import type { Static } from \"alepha\";\nimport { t } from \"alepha\";\n\nexport const okSchema = t.object(\n {\n ok: t.boolean({ description: \"True when operation succeed\" }),\n id: t.optional(t.union([t.text(), t.integer()])),\n count: t.optional(\n t.number({ description: \"Number of resources affected\" }),\n ),\n },\n {\n title: \"Ok\",\n description: \"Generic response after a successful operation on a resource\",\n },\n);\n\nexport type Ok = Static<typeof okSchema>;\n","import { $module } from \"alepha\";\nimport { HttpClient } from \"./services/HttpClient.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaServer = $module({\n name: \"alepha.server\",\n primitives: [],\n services: [HttpClient],\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.browser.js","names":[],"sources":["../../../src/server/core/errors/HttpError.ts","../../../src/server/core/helpers/isMultipart.ts","../../../src/server/core/schemas/errorSchema.ts","../../../src/server/core/services/HttpClient.ts","../../../src/server/core/constants/routeMethods.ts","../../../src/server/core/errors/BadRequestError.ts","../../../src/server/core/errors/ConflictError.ts","../../../src/server/core/errors/ForbiddenError.ts","../../../src/server/core/errors/NotFoundError.ts","../../../src/server/core/errors/UnauthorizedError.ts","../../../src/server/core/errors/ValidationError.ts","../../../src/server/core/helpers/ServerReply.ts","../../../src/server/core/schemas/okSchema.ts","../../../src/server/core/index.browser.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type { ErrorSchema } from \"../schemas/errorSchema.ts\";\n\nexport const isHttpError = (\n error: unknown,\n status?: number,\n): error is HttpErrorLike => {\n const isError =\n !!error &&\n typeof error === \"object\" &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n \"status\" in error &&\n typeof error.status === \"number\";\n\n if (!isError) {\n return false;\n }\n\n if (status) {\n return (error as HttpErrorLike).status === status;\n }\n\n return true;\n};\n\nexport class HttpError extends AlephaError {\n public name = \"HttpError\";\n\n static is = isHttpError;\n\n static toJSON(error: HttpError): ErrorSchema {\n const json: Record<string, unknown> = {\n error: error.error,\n status: error.status,\n message: error.message,\n };\n\n if (error.details) json.details = error.details;\n if (error.requestId) json.requestId = error.requestId;\n if (error.reason) json.cause = error.reason;\n\n return json as ErrorSchema;\n }\n\n public readonly error: string;\n public readonly status: number;\n\n public readonly requestId?: string;\n public readonly details?: string;\n public readonly reason?: {\n name: string;\n message: string;\n };\n\n constructor(options: Partial<ErrorSchema>, cause?: unknown) {\n super(options.message, {\n cause,\n });\n\n this.status = options.status ?? 500;\n this.details = options.details;\n this.requestId = options.requestId;\n\n if (typeof options.cause === \"object\") {\n this.reason = {\n name: (options.cause as { name: string }).name,\n message: (options.cause as { message: string }).message,\n };\n } else if (cause instanceof Error) {\n this.reason = {\n name: cause.name,\n message: cause.message,\n };\n }\n\n if (this.constructor.name === \"HttpError\") {\n this.error =\n options.error ?? errorNameByStatus[this.status] ?? \"HttpError\";\n } else {\n this.error = this.constructor.name;\n }\n }\n}\n\nexport const errorNameByStatus: Record<number, string> = {\n 400: \"BadRequestError\",\n 401: \"UnauthorizedError\",\n 403: \"ForbiddenError\",\n 404: \"NotFoundError\",\n 405: \"MethodNotAllowedError\",\n 409: \"ConflictError\",\n 410: \"GoneError\",\n 413: \"PayloadTooLargeError\",\n 415: \"UnsupportedMediaTypeError\",\n 429: \"TooManyRequestsError\",\n 500: \"InternalServerError\",\n 501: \"NotImplementedError\",\n 502: \"BadGatewayError\",\n 503: \"ServiceUnavailableError\",\n 504: \"GatewayTimeoutError\",\n};\n\nexport interface HttpErrorLike extends Error {\n status: number;\n}\n","import { z } from \"alepha\";\nimport type { RequestConfigSchema } from \"../interfaces/ServerRequest.ts\";\n\n/**\n * Checks if the route has multipart/form-data request body.\n */\nexport const isMultipart = (options: {\n schema?: RequestConfigSchema;\n contentType?: string;\n requestBodyType?: string;\n}): boolean => {\n if (\n options.contentType === \"multipart/form-data\" ||\n options.requestBodyType === \"multipart/form-data\"\n ) {\n return true;\n }\n\n if (options.schema?.body && \"properties\" in options.schema.body) {\n const properties: Record<string, any> = options.schema.body.properties;\n for (const key in properties) {\n if (z.schema.format(properties[key]) === \"binary\") {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { type Static, z } from \"alepha\";\n\nexport const errorSchema = z\n .object({\n error: z.text({ description: \"HTTP error name\" }),\n status: z.integer().describe(\"HTTP status code\"),\n message: z.text({\n description: \"Short text which describe the error\",\n size: \"rich\",\n }),\n details: z\n .text({\n description: \"Detailed description of the error\",\n size: \"rich\",\n })\n .optional(),\n requestId: z.text().optional(),\n cause: z\n .object({\n name: z.text(),\n message: z.text({\n description: \"Cause Error message\",\n size: \"rich\",\n }),\n })\n .optional(),\n })\n .meta({ title: \"HttpError\" })\n .describe(\"Generic response after a failed operation\");\n\nexport type ErrorSchema = Static<typeof errorSchema>;\n","import {\n $inject,\n Alepha,\n AlephaError,\n type FileLike,\n isFileLike,\n type Static,\n type TObject,\n type TSchema,\n} from \"alepha\";\nimport { $cache } from \"alepha/cache\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { HttpError } from \"../errors/HttpError.ts\";\nimport { isMultipart } from \"../helpers/isMultipart.ts\";\nimport type {\n ServerRequestConfigEntry,\n TRequestBody,\n TResponseBody,\n} from \"../interfaces/ServerRequest.ts\";\nimport type { ClientRequestOptions } from \"../primitives/$action.ts\";\nimport { errorSchema } from \"../schemas/errorSchema.ts\";\n\nexport class HttpClient {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n public readonly cache = $cache<HttpClientCache>({\n provider: \"memory\",\n name: \"http:client\",\n });\n\n protected readonly pendingRequests: HttpClientPendingRequests = {};\n\n public async fetchAction(args: FetchActionArgs): Promise<FetchResponse> {\n const route = args.action; // our link to fetch\n const options = args.options ?? {}; // fetch standard options, cache, etc.\n const config = args.config ?? {}; // params, query, body, etc.\n const host = args.host ?? \"\"; // remote host, e.g. \"https://api.example.com\" or empty (for browser)\n\n const request: RequestInit = {\n ...options.request,\n };\n\n const method = route.method;\n const headers: Record<string, string> = {};\n const url = this.url(host, route, config);\n\n await this.alepha.events.emit(\"client:onRequest\", {\n route,\n config,\n options,\n headers,\n request,\n });\n\n request.method ??= method;\n\n await this.body(request, headers, route, config);\n\n request.headers = {\n ...config.headers,\n ...Object.fromEntries(new Headers(request.headers).entries()),\n ...headers,\n };\n\n return await this.fetch(url, {\n ...request,\n schema: route.schema,\n ...options,\n });\n }\n\n public async fetch<T extends TSchema>(\n url: string,\n request: RequestInitWithOptions<T> = {}, // standard options\n ): Promise<FetchResponse<Static<T>>> {\n const options = {\n cache: request.localCache,\n schema: request.schema?.response,\n key: request.key,\n };\n\n request.method ??= \"GET\";\n\n this.log.trace(\"Request\", {\n url,\n method: request.method,\n body: request.body,\n headers: request.headers,\n options,\n });\n\n // Only add automatic ETag if user didn't explicitly provide headers\n const cached = await this.cache.get(url);\n if (cached && request.method === \"GET\") {\n if (cached.etag) {\n request.headers = new Headers(request.headers);\n if (!request.headers.has(\"if-none-match\")) {\n request.headers.set(\"if-none-match\", cached.etag);\n }\n } else {\n return {\n data: cached.data as Static<T>,\n status: 200,\n statusText: \"OK\",\n headers: new Headers(),\n };\n }\n }\n\n await this.alepha.events.emit(\"client:beforeFetch\", {\n url,\n options,\n request,\n });\n\n // Deduplicate concurrent identical requests for idempotent methods only.\n // Non-idempotent methods (POST, PUT, PATCH, DELETE) must always execute\n // since each call may produce a different side effect.\n const isIdempotent =\n request.method === \"GET\" ||\n request.method === \"HEAD\" ||\n request.method === \"OPTIONS\";\n const key =\n options.key ??\n (isIdempotent\n ? JSON.stringify({ url, method: request.method })\n : undefined);\n\n if (key) {\n const existing = this.pendingRequests[key];\n if (existing) {\n this.log.info(\"Request already pending\", key);\n return existing;\n }\n }\n\n const promise = fetch(url, request)\n .then(async (response) => {\n this.log.debug(\"Response\", {\n url,\n status: response.status,\n });\n\n const fetchResponse: FetchResponse = {\n data: await this.responseData(response, options),\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n raw: response,\n };\n\n if (request.method === \"GET\") {\n if (options.cache) {\n await this.cache.set(\n url,\n { data: fetchResponse.data },\n typeof options.cache === \"boolean\" ? undefined : options.cache,\n );\n } else if (!this.alepha.isBrowser()) {\n // only cache etag on server, browser can handle etag itself\n const etag = response.headers.get(\"etag\") ?? undefined;\n if (etag) {\n await this.cache.set(url, { data: fetchResponse.data, etag });\n }\n }\n }\n\n return fetchResponse;\n })\n .finally(() => {\n if (key) {\n delete this.pendingRequests[key];\n }\n });\n\n if (key) {\n this.pendingRequests[key] = promise;\n }\n\n return promise;\n }\n\n protected url(\n host: string,\n action: HttpAction,\n args: ServerRequestConfigEntry,\n ) {\n let url = host;\n\n if (action.prefix) {\n url += action.prefix;\n }\n\n url += action.path;\n url = this.pathVariables(url, action, args);\n url = this.queryParams(url, action, args);\n\n return url;\n }\n\n protected async body(\n init: RequestInit,\n headers: Record<string, string>,\n action: HttpAction,\n args: ServerRequestConfigEntry = {},\n ) {\n const hasHeader =\n typeof init.headers === \"object\" &&\n \"content-type\" in init.headers &&\n init.headers[\"content-type\"] === \"multipart/form-data\";\n\n if (hasHeader || isMultipart(action)) {\n if (typeof init.headers === \"object\" && \"content-type\" in init.headers) {\n delete (init.headers as Record<string, unknown>)[\"content-type\"]; // fetch() will fill this for us\n }\n\n const formData = new FormData();\n\n for (const [key, value] of Object.entries(args.body ?? {})) {\n if (typeof value === \"string\") {\n formData.append(key, value);\n continue;\n }\n if (value instanceof Blob) {\n formData.append(key, value);\n continue;\n }\n if (isFileLike(value)) {\n // FileLike must be transformed to WebFile\n formData.append(\n key,\n new File([await value.arrayBuffer()], value.name, {\n type: value.type,\n }),\n );\n }\n }\n\n init.body = formData;\n\n return;\n }\n\n if (!init.body && action.schema?.body) {\n headers[\"content-type\"] = \"application/json\";\n init.body = this.alepha.codec.encode(action.schema?.body, args.body, {\n as: \"string\",\n });\n }\n }\n\n protected async responseData(\n response: Response,\n options: ResolvedFetchOptions,\n ): Promise<any> {\n if (response.status === 304) {\n let cacheKey = response.url;\n if (typeof window !== \"undefined\") {\n cacheKey = cacheKey.replace(window.location.origin, \"\");\n }\n\n const cached = await this.cache.get(cacheKey);\n if (cached) {\n return cached.data;\n }\n\n // if no cached data (etag-only routes), return empty string\n return \"\";\n }\n\n if (response.status === 204) {\n return;\n }\n\n if (this.isMaybeFile(response)) {\n return this.createFileLike(response);\n }\n\n if (response.headers.get(\"Content-Type\")?.startsWith(\"text/\")) {\n return await response.text();\n }\n\n if (response.headers.get(\"Content-Type\") === \"application/json\") {\n const json = await response.json();\n\n if (response.status >= 400) {\n const jsonError = this.alepha.codec.decode(errorSchema, json);\n const error = new HttpError(jsonError);\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n if (options.schema) {\n return this.alepha.codec.decode(options.schema, json);\n }\n\n return json;\n }\n\n if (response.status >= 400) {\n const error = new HttpError({\n status: response.status,\n message: `An error occurred while fetching the resource. (${response.statusText})`,\n });\n\n await this.alepha.events.emit(\"client:onError\", {\n error,\n });\n\n throw error;\n }\n\n return response;\n }\n\n protected isMaybeFile(response: Response): boolean {\n const contentType = response.headers.get(\"Content-Type\");\n if (!contentType) {\n return false;\n }\n\n if (response.headers.get(\"Content-Disposition\")?.includes(\"attachment\")) {\n return true; // If Content-Disposition indicates an attachment, treat it as a file\n }\n\n return (\n contentType.startsWith(\"application/octet-stream\") ||\n contentType.startsWith(\"application/pdf\") ||\n contentType.startsWith(\"application/zip\") ||\n contentType.startsWith(\"image/\") ||\n contentType.startsWith(\"video/\") ||\n contentType.startsWith(\"audio/\")\n );\n }\n\n protected createFileLike(response: Response, defaultFileName = \"\"): FileLike {\n const match = (response.headers.get(\"Content-Disposition\") ?? \"\").match(\n /filename=\"(.+)\"/,\n );\n return {\n name: match?.[1] ? match[1] : defaultFileName,\n type: response.headers.get(\"Content-Type\") ?? \"application/octet-stream\",\n size: Number(response.headers.get(\"Content-Length\") ?? 0),\n lastModified: Date.now(),\n stream: () => {\n throw new AlephaError(\"Not implemented\");\n },\n arrayBuffer: async () => {\n return await response.arrayBuffer();\n },\n text: async () => {\n return await response.text();\n },\n };\n }\n\n public pathVariables(\n url: string,\n action: { schema?: { params?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.params === \"object\") {\n const params = action.schema?.params\n ? (this.alepha.codec.decode(\n action.schema.params,\n args.params,\n ) as Record<string, any>)\n : args.params;\n\n for (const key of Object.keys(params)) {\n url = url.replace(`:${key}`, params[key]);\n url = url.replace(`{${key}}`, params[key]);\n }\n }\n\n return url;\n }\n\n public queryParams(\n url: string,\n action: { schema?: { query?: TObject } },\n args: ServerRequestConfigEntry = {},\n ): string {\n if (typeof args.query === \"object\") {\n const query = action.schema?.query\n ? this.alepha.codec.decode(action.schema.query, args.query ?? {})\n : args.query;\n\n for (const key of Object.keys(query)) {\n if (query[key] === undefined) {\n delete query[key];\n }\n if (typeof query[key] === \"object\") {\n query[key] = JSON.stringify(query[key]);\n }\n }\n\n const params = new URLSearchParams(\n query as Record<string, string>,\n ).toString();\n return params ? `${url}?${params}` : url;\n }\n return url;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface FetchOptions<T extends TSchema = TSchema> {\n /**\n * Key to identify the request in the pending requests.\n */\n key?: string;\n\n /**\n * The schema to validate the response against.\n */\n schema?: {\n response?: T;\n };\n\n /**\n * Built-in cache options.\n */\n localCache?: boolean | number | DurationLike;\n}\n\nexport type RequestInitWithOptions<T extends TSchema = TSchema> = RequestInit &\n FetchOptions<T>;\n\n/**\n * Internal resolved fetch options — built in {@link HttpClient.fetch},\n * consumed by {@link HttpClient.responseData} and the `client:beforeFetch`\n * event. Distinct from the external {@link FetchOptions}: `schema` is the\n * already-unwrapped response schema and `cache` is the resolved cache directive.\n */\nexport interface ResolvedFetchOptions {\n key?: string;\n schema?: TSchema;\n cache?: boolean | number | DurationLike;\n}\n\nexport interface FetchResponse<T = any> {\n data: T;\n status: number;\n statusText: string;\n headers: Headers;\n raw?: Response;\n}\n\nexport type HttpClientPendingRequests = Record<\n string,\n Promise<any> | undefined\n>;\n\ninterface HttpClientCache {\n data: any;\n etag?: string;\n}\n\nexport interface FetchActionArgs {\n action: HttpAction;\n host?: string;\n config?: ServerRequestConfigEntry;\n options?: ClientRequestOptions;\n}\n\nexport interface HttpAction {\n method?: string;\n prefix?: string;\n path: string;\n contentType?: string;\n requestBodyType?: string;\n schema?: {\n params?: TObject;\n query?: TObject;\n body?: TRequestBody;\n response?: TResponseBody;\n };\n}\n","export const routeMethods = [\n // list of supported http methods\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n \"CONNECT\",\n \"TRACE\",\n] as const;\n\nexport type RouteMethod = (typeof routeMethods)[number];\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class BadRequestError extends HttpError {\n constructor(message = \"Invalid request body\", cause?: unknown) {\n super(\n {\n message,\n status: 400,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ConflictError extends HttpError {\n constructor(message = \"Entity already exists\", cause?: unknown) {\n super(\n {\n message,\n status: 409,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class ForbiddenError extends HttpError {\n constructor(\n message = \"No permission to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 403,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class NotFoundError extends HttpError {\n constructor(message = \"Resource not found\", cause?: unknown) {\n super(\n {\n message,\n status: 404,\n },\n cause,\n );\n }\n}\n","import { HttpError } from \"./HttpError.ts\";\n\nexport class UnauthorizedError extends HttpError {\n readonly name = \"UnauthorizedError\";\n\n constructor(\n message = \"Not allowed to access this resource\",\n cause?: unknown,\n ) {\n super(\n {\n message,\n status: 401,\n },\n cause,\n );\n }\n}\n","import { TypeBoxError } from \"alepha\";\nimport { HttpError } from \"./HttpError.ts\";\n\nexport class ValidationError extends HttpError {\n constructor(message = \"Validation has failed\", cause?: unknown) {\n let fullMessage = message;\n let details: string | undefined;\n\n if (cause instanceof TypeBoxError) {\n const path = cause.cause.instancePath;\n fullMessage = `${message}: ${cause.cause.message}${\n path ? ` (${path})` : \"\"\n }`;\n if (path) {\n details = path;\n }\n }\n\n super(\n {\n message: fullMessage,\n status: 400,\n details,\n },\n cause,\n );\n }\n}\n","/**\n * Helper for building server replies.\n */\nexport class ServerReply {\n // TODO: make it private\n public headers: Record<string, string> & {\n \"set-cookie\"?: string[];\n } = {};\n\n public status?: number; // default 200, or 204 (no content)\n\n public body?: any;\n\n /**\n * Redirect to a given URL with optional status code (default 302).\n */\n public redirect(url: string, status: number = 302): void {\n this.status = status;\n this.headers.location = url;\n }\n\n // TODO: check if status / header is already set and throw an error if so (for allow to override with force flag)\n\n /**\n * Set the response status code.\n */\n public setStatus(status: number): this {\n this.status = status;\n return this;\n }\n\n /**\n * Set a response header.\n */\n public setHeader(name: string, value: string): this {\n this.headers[name.toLowerCase()] = value;\n return this;\n }\n\n /**\n * Set the response body.\n */\n public setBody(body: any): this {\n this.body = body;\n return this;\n }\n}\n","import type { Static } from \"alepha\";\nimport { z } from \"alepha\";\n\nexport const okSchema = z\n .object({\n ok: z.boolean().describe(\"True when operation succeed\"),\n id: z.union([z.text(), z.integer()]).optional(),\n count: z.number().describe(\"Number of resources affected\").optional(),\n })\n .meta({ title: \"Ok\" })\n .describe(\"Generic response after a successful operation on a resource\");\n\nexport type Ok = Static<typeof okSchema>;\n","import { $module } from \"alepha\";\nimport { HttpClient } from \"./services/HttpClient.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./index.shared.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaServer = $module({\n name: \"alepha.server\",\n primitives: [],\n services: [HttpClient],\n});\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Alepha, AlephaError, Async, FileLike, KIND, Middleware, PipelineHandler, PipelinePrimitive, PipelinePrimitiveOptions, Primitive, Static, StreamLike, TArray, TFile, TObject, TRecord, TSchema, TStream, TString, TVoid } from "alepha";
|
|
1
|
+
import { Alepha, AlephaError, Async, FileLike, KIND, Middleware, PipelineHandler, PipelinePrimitive, PipelinePrimitiveOptions, Primitive, SchemaOutput, Static, StreamLike, TArray, TFile, TObject, TRecord, TSchema, TStream, TString, TVoid } from "alepha";
|
|
2
2
|
import { Readable, Transform } from "node:stream";
|
|
3
3
|
import { DateTimeProvider, DurationLike } from "alepha/datetime";
|
|
4
4
|
import { ReadableStream as ReadableStream$1 } from "node:stream/web";
|
|
@@ -7,26 +7,25 @@ import { Route, RouterProvider } from "alepha/router";
|
|
|
7
7
|
import { IncomingMessage, Server, ServerResponse as ServerResponse$1 } from "node:http";
|
|
8
8
|
import { ServerResponse as ServerResponse$2, ServerRoute as ServerRoute$1 } from "alepha/server";
|
|
9
9
|
import { Socket } from "node:net";
|
|
10
|
-
|
|
11
10
|
//#region ../../src/server/core/schemas/errorSchema.d.ts
|
|
12
|
-
declare const errorSchema: import("
|
|
13
|
-
error: import("
|
|
14
|
-
status: import("
|
|
15
|
-
message: import("
|
|
16
|
-
details: import("
|
|
17
|
-
requestId: import("
|
|
18
|
-
cause: import("
|
|
19
|
-
name: import("
|
|
20
|
-
message: import("
|
|
21
|
-
}>>;
|
|
22
|
-
}>;
|
|
11
|
+
declare const errorSchema: import("zod").ZodObject<{
|
|
12
|
+
error: import("zod").ZodString;
|
|
13
|
+
status: import("zod").ZodInt;
|
|
14
|
+
message: import("zod").ZodString;
|
|
15
|
+
details: import("zod").ZodOptional<import("zod").ZodString>;
|
|
16
|
+
requestId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
17
|
+
cause: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
18
|
+
name: import("zod").ZodString;
|
|
19
|
+
message: import("zod").ZodString;
|
|
20
|
+
}, import("zod/v4/core").$strip>>;
|
|
21
|
+
}, import("zod/v4/core").$strip>;
|
|
23
22
|
type ErrorSchema = Static<typeof errorSchema>;
|
|
24
23
|
//#endregion
|
|
25
24
|
//#region ../../src/server/core/errors/HttpError.d.ts
|
|
26
25
|
declare const isHttpError: (error: unknown, status?: number) => error is HttpErrorLike;
|
|
27
26
|
declare class HttpError extends AlephaError {
|
|
28
27
|
name: string;
|
|
29
|
-
static is:
|
|
28
|
+
static is: typeof isHttpError;
|
|
30
29
|
static toJSON(error: HttpError): ErrorSchema;
|
|
31
30
|
readonly error: string;
|
|
32
31
|
readonly status: number;
|
|
@@ -102,10 +101,10 @@ interface RequestConfigSchema {
|
|
|
102
101
|
response?: TResponseBody;
|
|
103
102
|
}
|
|
104
103
|
interface ServerRequestConfig<TConfig extends RequestConfigSchema = RequestConfigSchema> {
|
|
105
|
-
body:
|
|
106
|
-
headers:
|
|
107
|
-
params:
|
|
108
|
-
query:
|
|
104
|
+
body: SchemaOutput<TConfig["body"], any>;
|
|
105
|
+
headers: SchemaOutput<TConfig["headers"], Record<string, string>>;
|
|
106
|
+
params: SchemaOutput<TConfig["params"], Record<string, string>>;
|
|
107
|
+
query: SchemaOutput<TConfig["query"], Record<string, any>>;
|
|
109
108
|
}
|
|
110
109
|
type ServerRequestConfigEntry<TConfig extends RequestConfigSchema = RequestConfigSchema> = Partial<ServerRequestConfig<TConfig>>;
|
|
111
110
|
interface ServerRequest<TConfig extends RequestConfigSchema = RequestConfigSchema> extends ServerRequestConfig<TConfig> {
|
|
@@ -223,7 +222,7 @@ interface ServerRoute<TConfig extends RequestConfigSchema = RequestConfigSchema>
|
|
|
223
222
|
type ServerRouteInput<TConfig extends RequestConfigSchema = RequestConfigSchema> = Omit<ServerRoute<TConfig>, "handler"> & {
|
|
224
223
|
handler: PipelineHandler | ServerHandler<TConfig>;
|
|
225
224
|
};
|
|
226
|
-
type ServerResponseBody<TConfig extends RequestConfigSchema = RequestConfigSchema> =
|
|
225
|
+
type ServerResponseBody<TConfig extends RequestConfigSchema = RequestConfigSchema> = SchemaOutput<TConfig["response"], ResponseBodyType>;
|
|
227
226
|
type ResponseKind = "json" | "text" | "void" | "file" | "any";
|
|
228
227
|
type ResponseBodyType = string | Buffer | StreamLike | undefined | null | void;
|
|
229
228
|
type ServerHandler<TConfig extends RequestConfigSchema = RequestConfigSchema> = (request: ServerRequest<TConfig>) => Async<ServerResponseBody<TConfig>>;
|
|
@@ -310,7 +309,7 @@ declare class ServerRequestParser {
|
|
|
310
309
|
protected readonly rootURL: URL;
|
|
311
310
|
createServerRequest(partialRawRequest: Partial<ServerRequestData>): ServerRequest;
|
|
312
311
|
getRequestId(request: ServerRequestData): string;
|
|
313
|
-
getRequestUserAgent(request: ServerRequestData): UserAgentInfo;
|
|
312
|
+
getRequestUserAgent(request: ServerRequestData): import("alepha/server").UserAgentInfo;
|
|
314
313
|
getRequestIp(request: ServerRequestData): string | undefined;
|
|
315
314
|
protected getConnectionIp(request: ServerRequestData): string | undefined;
|
|
316
315
|
getRequestGeo(request: ServerRequestData): RequestGeo;
|
|
@@ -431,6 +430,15 @@ declare class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
|
|
|
431
430
|
validateRequest(route: {
|
|
432
431
|
schema?: RequestConfigSchema;
|
|
433
432
|
}, request: ServerRequestConfig): void;
|
|
433
|
+
/**
|
|
434
|
+
* Coerce a raw query/header value (always a string on the wire) to the JS
|
|
435
|
+
* type its schema declares, mirroring `z.coerce` at the HTTP boundary.
|
|
436
|
+
*
|
|
437
|
+
* Only the boundary coerces — request bodies and the ORM stay strict. Values
|
|
438
|
+
* that can't be coerced are passed through unchanged so the subsequent
|
|
439
|
+
* validation produces a proper rejection. Arrays coerce element-wise.
|
|
440
|
+
*/
|
|
441
|
+
protected coerceParam(schema: unknown, value: unknown): unknown;
|
|
434
442
|
}
|
|
435
443
|
interface PushMiddlewareOptions {
|
|
436
444
|
method?: RouteMethod | RouteMethod[];
|
|
@@ -528,7 +536,7 @@ declare class HttpClient {
|
|
|
528
536
|
fetch<T extends TSchema>(url: string, request?: RequestInitWithOptions<T>): Promise<FetchResponse<Static<T>>>;
|
|
529
537
|
protected url(host: string, action: HttpAction, args: ServerRequestConfigEntry): string;
|
|
530
538
|
protected body(init: RequestInit, headers: Record<string, string>, action: HttpAction, args?: ServerRequestConfigEntry): Promise<void>;
|
|
531
|
-
protected responseData(response: Response, options:
|
|
539
|
+
protected responseData(response: Response, options: ResolvedFetchOptions): Promise<any>;
|
|
532
540
|
protected isMaybeFile(response: Response): boolean;
|
|
533
541
|
protected createFileLike(response: Response, defaultFileName?: string): FileLike;
|
|
534
542
|
pathVariables(url: string, action: {
|
|
@@ -559,6 +567,17 @@ interface FetchOptions<T extends TSchema = TSchema> {
|
|
|
559
567
|
localCache?: boolean | number | DurationLike;
|
|
560
568
|
}
|
|
561
569
|
type RequestInitWithOptions<T extends TSchema = TSchema> = RequestInit & FetchOptions<T>;
|
|
570
|
+
/**
|
|
571
|
+
* Internal resolved fetch options — built in {@link HttpClient.fetch},
|
|
572
|
+
* consumed by {@link HttpClient.responseData} and the `client:beforeFetch`
|
|
573
|
+
* event. Distinct from the external {@link FetchOptions}: `schema` is the
|
|
574
|
+
* already-unwrapped response schema and `cache` is the resolved cache directive.
|
|
575
|
+
*/
|
|
576
|
+
interface ResolvedFetchOptions {
|
|
577
|
+
key?: string;
|
|
578
|
+
schema?: TSchema;
|
|
579
|
+
cache?: boolean | number | DurationLike;
|
|
580
|
+
}
|
|
562
581
|
interface FetchResponse<T = any> {
|
|
563
582
|
data: T;
|
|
564
583
|
status: number;
|
|
@@ -630,17 +649,17 @@ interface HttpAction {
|
|
|
630
649
|
* getUsers = $action({
|
|
631
650
|
* path: "/users",
|
|
632
651
|
* schema: {
|
|
633
|
-
* query:
|
|
634
|
-
* page:
|
|
635
|
-
* limit:
|
|
652
|
+
* query: z.object({
|
|
653
|
+
* page: z.number({ default: 1 }).optional(),
|
|
654
|
+
* limit: z.number({ default: 10 }).optional()
|
|
636
655
|
* }),
|
|
637
|
-
* response:
|
|
638
|
-
* users:
|
|
639
|
-
* id:
|
|
640
|
-
* name:
|
|
641
|
-
* email:
|
|
656
|
+
* response: z.object({
|
|
657
|
+
* users: z.array(z.object({
|
|
658
|
+
* id: z.text(),
|
|
659
|
+
* name: z.text(),
|
|
660
|
+
* email: z.text()
|
|
642
661
|
* })),
|
|
643
|
-
* total:
|
|
662
|
+
* total: z.number()
|
|
644
663
|
* })
|
|
645
664
|
* },
|
|
646
665
|
* handler: async ({ query }) => {
|
|
@@ -653,11 +672,11 @@ interface HttpAction {
|
|
|
653
672
|
* method: "POST",
|
|
654
673
|
* path: "/users",
|
|
655
674
|
* schema: {
|
|
656
|
-
* body:
|
|
657
|
-
* name:
|
|
658
|
-
* email:
|
|
675
|
+
* body: z.object({
|
|
676
|
+
* name: z.text(),
|
|
677
|
+
* email: z.text({ format: "email" })
|
|
659
678
|
* }),
|
|
660
|
-
* response:
|
|
679
|
+
* response: z.object({ id: z.text(), name: z.text() })
|
|
661
680
|
* },
|
|
662
681
|
* handler: async ({ body }) => {
|
|
663
682
|
* return await this.userService.create(body);
|
|
@@ -739,9 +758,9 @@ interface ActionPrimitiveOptions<TConfig extends RequestConfigSchema> extends Om
|
|
|
739
758
|
/**
|
|
740
759
|
* Server API configuration atom.
|
|
741
760
|
*/
|
|
742
|
-
declare const serverApiOptions: import("alepha").Atom<
|
|
743
|
-
prefix: import("
|
|
744
|
-
}>, "alepha.server.api.options">;
|
|
761
|
+
declare const serverApiOptions: import("alepha").Atom<import("zod").ZodObject<{
|
|
762
|
+
prefix: import("zod").ZodString;
|
|
763
|
+
}, import("zod/v4/core").$strip>, "alepha.server.api.options">;
|
|
745
764
|
type ServerApiOptions = Static<typeof serverApiOptions.schema>;
|
|
746
765
|
declare module "alepha" {
|
|
747
766
|
interface State {
|
|
@@ -792,12 +811,12 @@ declare class ActionPrimitive<TConfig extends RequestConfigSchema> extends Pipel
|
|
|
792
811
|
interface ActionPrimitiveFn<TConfig extends RequestConfigSchema> extends ActionPrimitive<TConfig> {
|
|
793
812
|
(config?: ClientRequestEntry<TConfig>, options?: ClientRequestOptions): Promise<ClientRequestResponse<TConfig>>;
|
|
794
813
|
}
|
|
795
|
-
type ClientRequestEntry<TConfig extends RequestConfigSchema, T = ClientRequestEntryContainer<TConfig>> = { [K in keyof T as T[K] extends undefined ? never : K]: T[K] };
|
|
814
|
+
type ClientRequestEntry<TConfig extends RequestConfigSchema, T = ClientRequestEntryContainer<TConfig>> = { [K in keyof T as T[K] extends undefined ? never : K]: T[K]; };
|
|
796
815
|
type ClientRequestEntryContainer<TConfig extends RequestConfigSchema> = {
|
|
797
|
-
body:
|
|
798
|
-
params:
|
|
799
|
-
headers?:
|
|
800
|
-
query?:
|
|
816
|
+
body: SchemaOutput<TConfig["body"], undefined>;
|
|
817
|
+
params: SchemaOutput<TConfig["params"], undefined>;
|
|
818
|
+
headers?: SchemaOutput<TConfig["headers"], Record<string, string>>;
|
|
819
|
+
query?: Partial<SchemaOutput<TConfig["query"], Record<string, string>>>;
|
|
801
820
|
};
|
|
802
821
|
interface ClientRequestOptions extends FetchOptions {
|
|
803
822
|
/**
|
|
@@ -810,7 +829,7 @@ interface ClientRequestOptions extends FetchOptions {
|
|
|
810
829
|
*/
|
|
811
830
|
query?: Record<string, string | number | boolean>;
|
|
812
831
|
}
|
|
813
|
-
type ClientRequestResponse<TConfig extends RequestConfigSchema> =
|
|
832
|
+
type ClientRequestResponse<TConfig extends RequestConfigSchema> = SchemaOutput<TConfig["response"], any>;
|
|
814
833
|
/**
|
|
815
834
|
* Specific handler for server actions.
|
|
816
835
|
*/
|
|
@@ -866,11 +885,11 @@ declare const isMultipart: (options: {
|
|
|
866
885
|
}) => boolean;
|
|
867
886
|
//#endregion
|
|
868
887
|
//#region ../../src/server/core/schemas/okSchema.d.ts
|
|
869
|
-
declare const okSchema: import("
|
|
870
|
-
ok: import("
|
|
871
|
-
id: import("
|
|
872
|
-
count: import("
|
|
873
|
-
}>;
|
|
888
|
+
declare const okSchema: import("zod").ZodObject<{
|
|
889
|
+
ok: import("zod").ZodBoolean;
|
|
890
|
+
id: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodInt]>>;
|
|
891
|
+
count: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
892
|
+
}, import("zod/v4/core").$strip>;
|
|
874
893
|
type Ok = Static<typeof okSchema>;
|
|
875
894
|
//#endregion
|
|
876
895
|
//#region ../../src/server/core/primitives/$circuit.d.ts
|
|
@@ -1144,9 +1163,9 @@ declare class SseFetchResponse<T> implements AsyncIterable<T> {
|
|
|
1144
1163
|
* class NotificationController {
|
|
1145
1164
|
* events = $sse({
|
|
1146
1165
|
* schema: {
|
|
1147
|
-
* data:
|
|
1148
|
-
* type:
|
|
1149
|
-
* message:
|
|
1166
|
+
* data: z.object({
|
|
1167
|
+
* type: z.text(),
|
|
1168
|
+
* message: z.text(),
|
|
1150
1169
|
* }),
|
|
1151
1170
|
* },
|
|
1152
1171
|
* handler: async ({ emit, close }) => {
|
|
@@ -1237,7 +1256,7 @@ type SseEventData<TConfig extends SseConfigSchema> = TConfig["data"] extends TSc
|
|
|
1237
1256
|
/**
|
|
1238
1257
|
* Request entry type for SSE endpoints (body, params, query, headers).
|
|
1239
1258
|
*/
|
|
1240
|
-
type SseRequestEntry<TConfig extends SseConfigSchema, T = SseRequestEntryContainer<TConfig>> = { [K in keyof T as T[K] extends undefined ? never : K]: T[K] };
|
|
1259
|
+
type SseRequestEntry<TConfig extends SseConfigSchema, T = SseRequestEntryContainer<TConfig>> = { [K in keyof T as T[K] extends undefined ? never : K]: T[K]; };
|
|
1241
1260
|
/**
|
|
1242
1261
|
* Full container type for SSE request entries.
|
|
1243
1262
|
*/
|
|
@@ -1249,10 +1268,10 @@ type SseRequestEntryContainer<TConfig extends SseConfigSchema> = {
|
|
|
1249
1268
|
};
|
|
1250
1269
|
//#endregion
|
|
1251
1270
|
//#region ../../src/server/core/providers/BunHttpServerProvider.d.ts
|
|
1252
|
-
declare const envSchema$1: import("
|
|
1253
|
-
SERVER_PORT: import("
|
|
1254
|
-
SERVER_HOST: import("
|
|
1255
|
-
}>;
|
|
1271
|
+
declare const envSchema$1: import("zod").ZodObject<{
|
|
1272
|
+
SERVER_PORT: import("zod").ZodDefault<import("zod").ZodInt>;
|
|
1273
|
+
SERVER_HOST: import("zod").ZodString;
|
|
1274
|
+
}, import("zod/v4/core").$strip>;
|
|
1256
1275
|
declare module "alepha" {
|
|
1257
1276
|
interface Env extends Partial<Static<typeof envSchema$1>> {}
|
|
1258
1277
|
}
|
|
@@ -1274,10 +1293,10 @@ declare class BunHttpServerProvider extends ServerProvider {
|
|
|
1274
1293
|
}
|
|
1275
1294
|
//#endregion
|
|
1276
1295
|
//#region ../../src/server/core/providers/NodeHttpServerProvider.d.ts
|
|
1277
|
-
declare const envSchema: import("
|
|
1278
|
-
SERVER_PORT: import("
|
|
1279
|
-
SERVER_HOST: import("
|
|
1280
|
-
}>;
|
|
1296
|
+
declare const envSchema: import("zod").ZodObject<{
|
|
1297
|
+
SERVER_PORT: import("zod").ZodDefault<import("zod").ZodInt>;
|
|
1298
|
+
SERVER_HOST: import("zod").ZodString;
|
|
1299
|
+
}, import("zod/v4/core").$strip>;
|
|
1281
1300
|
declare module "alepha" {
|
|
1282
1301
|
interface Env extends Partial<Static<typeof envSchema>> {}
|
|
1283
1302
|
}
|
|
@@ -1327,10 +1346,10 @@ declare class NodeHttpServerProvider extends ServerProvider {
|
|
|
1327
1346
|
/**
|
|
1328
1347
|
* Compression configuration atom.
|
|
1329
1348
|
*/
|
|
1330
|
-
declare const compressOptions: import("alepha").Atom<import("
|
|
1331
|
-
disabled: import("
|
|
1332
|
-
allowedContentTypes: import("
|
|
1333
|
-
}>, "alepha.server.compress.options">;
|
|
1349
|
+
declare const compressOptions: import("alepha").Atom<import("zod").ZodObject<{
|
|
1350
|
+
disabled: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1351
|
+
allowedContentTypes: import("zod").ZodArray<import("zod").ZodString>;
|
|
1352
|
+
}, import("zod/v4/core").$strip>, "alepha.server.compress.options">;
|
|
1334
1353
|
type CompressOptions = Static<typeof compressOptions.schema>;
|
|
1335
1354
|
declare module "alepha" {
|
|
1336
1355
|
interface State {
|
|
@@ -1363,22 +1382,34 @@ declare class ServerCompressProvider {
|
|
|
1363
1382
|
/**
|
|
1364
1383
|
* Helmet security headers configuration atom
|
|
1365
1384
|
*/
|
|
1366
|
-
declare const helmetOptions: import("alepha").Atom<import("
|
|
1367
|
-
disabled: import("
|
|
1368
|
-
isSecure: import("
|
|
1369
|
-
strictTransportSecurity: import("
|
|
1370
|
-
maxAge: import("
|
|
1371
|
-
includeSubDomains: import("
|
|
1372
|
-
preload: import("
|
|
1385
|
+
declare const helmetOptions: import("alepha").Atom<import("zod").ZodObject<{
|
|
1386
|
+
disabled: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1387
|
+
isSecure: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1388
|
+
strictTransportSecurity: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
1389
|
+
maxAge: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
1390
|
+
includeSubDomains: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1391
|
+
preload: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1392
|
+
}, import("zod/v4/core").$strip>>;
|
|
1393
|
+
xContentTypeOptions: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1394
|
+
xFrameOptions: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
1395
|
+
DENY: "DENY";
|
|
1396
|
+
SAMEORIGIN: "SAMEORIGIN";
|
|
1373
1397
|
}>>;
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1398
|
+
xXssProtection: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
1399
|
+
contentSecurityPolicy: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
1400
|
+
directives: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodAny>;
|
|
1401
|
+
}, import("zod/v4/core").$strip>>;
|
|
1402
|
+
referrerPolicy: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
1403
|
+
"no-referrer": "no-referrer";
|
|
1404
|
+
"no-referrer-when-downgrade": "no-referrer-when-downgrade";
|
|
1405
|
+
origin: "origin";
|
|
1406
|
+
"origin-when-cross-origin": "origin-when-cross-origin";
|
|
1407
|
+
"same-origin": "same-origin";
|
|
1408
|
+
"strict-origin": "strict-origin";
|
|
1409
|
+
"strict-origin-when-cross-origin": "strict-origin-when-cross-origin";
|
|
1410
|
+
"unsafe-url": "unsafe-url";
|
|
1379
1411
|
}>>;
|
|
1380
|
-
|
|
1381
|
-
}>, "alepha.server.helmet.options">;
|
|
1412
|
+
}, import("zod/v4/core").$strip>, "alepha.server.helmet.options">;
|
|
1382
1413
|
type HelmetOptions = Static<typeof helmetOptions.schema>;
|
|
1383
1414
|
declare module "alepha" {
|
|
1384
1415
|
interface State {
|
|
@@ -1458,11 +1489,11 @@ declare class ServerLoggerProvider {
|
|
|
1458
1489
|
/**
|
|
1459
1490
|
* Multipart configuration atom.
|
|
1460
1491
|
*/
|
|
1461
|
-
declare const multipartOptions: import("alepha").Atom<import("
|
|
1462
|
-
limit: import("
|
|
1463
|
-
fileLimit: import("
|
|
1464
|
-
fileCount: import("
|
|
1465
|
-
}>, "alepha.server.multipart.options">;
|
|
1492
|
+
declare const multipartOptions: import("alepha").Atom<import("zod").ZodObject<{
|
|
1493
|
+
limit: import("zod").ZodDefault<import("zod").ZodInt>;
|
|
1494
|
+
fileLimit: import("zod").ZodDefault<import("zod").ZodInt>;
|
|
1495
|
+
fileCount: import("zod").ZodDefault<import("zod").ZodInt>;
|
|
1496
|
+
}, import("zod/v4/core").$strip>, "alepha.server.multipart.options">;
|
|
1466
1497
|
type MultipartOptions = Static<typeof multipartOptions.schema>;
|
|
1467
1498
|
declare module "alepha" {
|
|
1468
1499
|
interface State {
|
|
@@ -1561,7 +1592,7 @@ declare module "alepha" {
|
|
|
1561
1592
|
};
|
|
1562
1593
|
"client:beforeFetch": {
|
|
1563
1594
|
url: string;
|
|
1564
|
-
options:
|
|
1595
|
+
options: ResolvedFetchOptions;
|
|
1565
1596
|
request: RequestInit;
|
|
1566
1597
|
};
|
|
1567
1598
|
"client:onError": {
|
|
@@ -1593,5 +1624,5 @@ declare module "alepha" {
|
|
|
1593
1624
|
*/
|
|
1594
1625
|
declare const AlephaServer: import("alepha").Service<import("alepha").Module>;
|
|
1595
1626
|
//#endregion
|
|
1596
|
-
export { $action, $circuit, $middleware, $route, $sse, ActionPrimitive, ActionPrimitiveFn, ActionPrimitiveOptions, AlephaServer, BadRequestError, BunHttpServerProvider, CircuitBreakerOptions, ClientRequestEntry, ClientRequestEntryContainer, ClientRequestOptions, ClientRequestResponse, CompressOptions, ConflictError, CspDirectives, CspOptions, ErrorSchema, FetchActionArgs, FetchOptions, FetchResponse, ForbiddenError, HelmetOptions, HstsOptions, HttpAction, HttpClient, HttpClientPendingRequests, HttpError, HttpErrorLike, MultipartOptions, NodeHttpServerProvider, NodeRequestEvent, NotFoundError, Ok, PushMiddlewareOptions, RequestConfigSchema, RequestGeo, RequestInitWithOptions, RequestReferer, ResponseBodyType, ResponseKind, RouteMethod, RoutePrimitive, RoutePrimitiveOptions, ServerActionHandler, ServerActionRequest, ServerApiOptions, ServerCompressProvider, ServerHandler, ServerHelmetProvider, ServerLoggerProvider, ServerMiddlewarePrimitive, ServerMiddlewarePrimitiveOptions, ServerMultipartProvider, ServerNotReadyProvider, ServerProvider, ServerRawRequest, ServerReply, ServerRequest, ServerRequestConfig, ServerRequestConfigEntry, ServerRequestData, ServerResponse, ServerResponseBody, ServerRoute, ServerRouteInput, ServerRouteMatcher, ServerRouteRequestHandler, ServerRouterProvider, ServerTimingProvider, SseConfigSchema, SseEventData, SseFetchResponse, SseHandler, SseHandlerContext, SsePrimitive, SsePrimitiveFn, SsePrimitiveOptions, SseRequestEntry, SseRequestEntryContainer, SseStream, TRequestBody, TResponseBody, UnauthorizedError, UserAgentInfo, UserAgentParser, ValidationError, WebRequestEvent, compressOptions, errorNameByStatus, errorSchema, helmetOptions, isHttpError, isMultipart, multipartOptions, okSchema, routeMethods, serverApiOptions };
|
|
1627
|
+
export { $action, $circuit, $middleware, $route, $sse, ActionPrimitive, ActionPrimitiveFn, ActionPrimitiveOptions, AlephaServer, BadRequestError, BunHttpServerProvider, CircuitBreakerOptions, ClientRequestEntry, ClientRequestEntryContainer, ClientRequestOptions, ClientRequestResponse, CompressOptions, ConflictError, CspDirectives, CspOptions, ErrorSchema, FetchActionArgs, FetchOptions, FetchResponse, ForbiddenError, HelmetOptions, HstsOptions, HttpAction, HttpClient, HttpClientPendingRequests, HttpError, HttpErrorLike, MultipartOptions, NodeHttpServerProvider, NodeRequestEvent, NotFoundError, Ok, PushMiddlewareOptions, RequestConfigSchema, RequestGeo, RequestInitWithOptions, RequestReferer, ResolvedFetchOptions, ResponseBodyType, ResponseKind, RouteMethod, RoutePrimitive, RoutePrimitiveOptions, ServerActionHandler, ServerActionRequest, ServerApiOptions, ServerCompressProvider, ServerHandler, ServerHelmetProvider, ServerLoggerProvider, ServerMiddlewarePrimitive, ServerMiddlewarePrimitiveOptions, ServerMultipartProvider, ServerNotReadyProvider, ServerProvider, ServerRawRequest, ServerReply, ServerRequest, ServerRequestConfig, ServerRequestConfigEntry, ServerRequestData, ServerResponse, ServerResponseBody, ServerRoute, ServerRouteInput, ServerRouteMatcher, ServerRouteRequestHandler, ServerRouterProvider, ServerTimingProvider, SseConfigSchema, SseEventData, SseFetchResponse, SseHandler, SseHandlerContext, SsePrimitive, SsePrimitiveFn, SsePrimitiveOptions, SseRequestEntry, SseRequestEntryContainer, SseStream, TRequestBody, TResponseBody, UnauthorizedError, UserAgentInfo, UserAgentParser, ValidationError, WebRequestEvent, compressOptions, errorNameByStatus, errorSchema, helmetOptions, isHttpError, isMultipart, multipartOptions, okSchema, routeMethods, serverApiOptions };
|
|
1597
1628
|
//# sourceMappingURL=index.d.ts.map
|