alepha 0.15.1 → 0.15.3
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/README.md +68 -80
- package/dist/api/audits/index.d.ts +10 -33
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +10 -33
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts +10 -3
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +10 -3
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +162 -155
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +10 -3
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +413 -0
- package/dist/api/keys/index.d.ts.map +1 -0
- package/dist/api/keys/index.js +476 -0
- package/dist/api/keys/index.js.map +1 -0
- package/dist/api/notifications/index.d.ts +10 -4
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +10 -4
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +43 -50
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +30 -37
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.d.ts +1081 -760
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +2539 -218
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +138 -132
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +12 -4
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +20 -40
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js +31 -44
- package/dist/batch/index.js.map +1 -1
- package/dist/bucket/index.d.ts +440 -8
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +1861 -12
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +179 -7
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +213 -7
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +1 -0
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +4 -0
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/index.d.ts +638 -5645
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2550 -368
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +203 -45
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2060 -71
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +70 -40
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +34 -13
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +90 -40
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +70 -40
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts +15 -0
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js +15 -0
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/index.d.ts +323 -20
- package/dist/email/index.d.ts.map +1 -1
- package/dist/email/index.js +1857 -7
- package/dist/email/index.js.map +1 -1
- package/dist/fake/index.d.ts +90 -8
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +91 -20
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +11 -4
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +11 -4
- package/dist/lock/core/index.js.map +1 -1
- package/dist/logger/index.d.ts +17 -66
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +14 -63
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +10 -30
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +12 -35
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.browser.js +3 -3
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.bun.js +39 -20
- package/dist/orm/index.bun.js.map +1 -1
- package/dist/orm/index.d.ts +517 -540
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +58 -71
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +18 -10
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +14 -6
- package/dist/queue/core/index.js.map +1 -1
- package/dist/react/auth/index.browser.js +108 -0
- package/dist/react/auth/index.browser.js.map +1 -0
- package/dist/react/auth/index.d.ts +100 -0
- package/dist/react/auth/index.d.ts.map +1 -0
- package/dist/react/auth/index.js +145 -0
- package/dist/react/auth/index.js.map +1 -0
- package/dist/react/core/index.d.ts +469 -0
- package/dist/react/core/index.d.ts.map +1 -0
- package/dist/react/core/index.js +464 -0
- package/dist/react/core/index.js.map +1 -0
- package/dist/react/form/index.d.ts +232 -0
- package/dist/react/form/index.d.ts.map +1 -0
- package/dist/react/form/index.js +432 -0
- package/dist/react/form/index.js.map +1 -0
- package/dist/react/head/index.browser.js +423 -0
- package/dist/react/head/index.browser.js.map +1 -0
- package/dist/react/head/index.d.ts +288 -0
- package/dist/react/head/index.d.ts.map +1 -0
- package/dist/react/head/index.js +465 -0
- package/dist/react/head/index.js.map +1 -0
- package/dist/react/i18n/index.d.ts +175 -0
- package/dist/react/i18n/index.d.ts.map +1 -0
- package/dist/react/i18n/index.js +224 -0
- package/dist/react/i18n/index.js.map +1 -0
- package/dist/react/router/index.browser.js +1974 -0
- package/dist/react/router/index.browser.js.map +1 -0
- package/dist/react/router/index.d.ts +1956 -0
- package/dist/react/router/index.d.ts.map +1 -0
- package/dist/react/router/index.js +4722 -0
- package/dist/react/router/index.js.map +1 -0
- package/dist/react/websocket/index.d.ts +117 -0
- package/dist/react/websocket/index.d.ts.map +1 -0
- package/dist/react/websocket/index.js +107 -0
- package/dist/react/websocket/index.js.map +1 -0
- package/dist/redis/index.bun.js +4 -0
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +41 -44
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js +16 -25
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +11 -2
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js +11 -2
- package/dist/retry/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +11 -2
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +11 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +140 -49
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +164 -32
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +12 -7
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +12 -7
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +7 -22
- package/dist/server/cache/index.d.ts.map +1 -1
- package/dist/server/cache/index.js +7 -22
- package/dist/server/cache/index.js.map +1 -1
- package/dist/server/compress/index.d.ts +10 -2
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +10 -2
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +40 -16
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +7 -5
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.d.ts +124 -23
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +231 -14
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -23
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +7 -21
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/health/index.d.ts +8 -2
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js +8 -2
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/helmet/index.d.ts +11 -3
- package/dist/server/helmet/index.d.ts.map +1 -1
- package/dist/server/helmet/index.js +11 -3
- package/dist/server/helmet/index.js.map +1 -1
- package/dist/server/links/index.d.ts +11 -6
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +11 -6
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +10 -3
- 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/multipart/index.d.ts +9 -3
- package/dist/server/multipart/index.d.ts.map +1 -1
- package/dist/server/multipart/index.js +9 -3
- package/dist/server/multipart/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +8 -2
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js +8 -2
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +30 -35
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +18 -55
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +137 -4
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js +1853 -5
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +309 -6
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +1854 -6
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +309 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +1856 -7
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js +1218 -0
- package/dist/system/index.browser.js.map +1 -0
- package/dist/{file → system}/index.d.ts +343 -16
- package/dist/system/index.d.ts.map +1 -0
- package/dist/{file → system}/index.js +419 -22
- package/dist/system/index.js.map +1 -0
- package/dist/thread/index.d.ts +11 -2
- package/dist/thread/index.d.ts.map +1 -1
- package/dist/thread/index.js +11 -2
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/index.d.ts +12 -5
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js +12 -5
- package/dist/topic/core/index.js.map +1 -1
- package/dist/vite/index.d.ts +5 -6272
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +23 -10
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts +12 -8
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +12 -8
- package/dist/websocket/index.js.map +1 -1
- package/package.json +82 -11
- package/src/api/audits/index.ts +10 -33
- package/src/api/files/__tests__/$bucket.spec.ts +1 -1
- package/src/api/files/controllers/AdminFileStatsController.spec.ts +1 -1
- package/src/api/files/controllers/FileController.spec.ts +1 -1
- package/src/api/files/index.ts +10 -3
- package/src/api/files/jobs/FileJobs.spec.ts +1 -1
- package/src/api/files/services/FileService.spec.ts +1 -1
- package/src/api/jobs/index.ts +10 -3
- package/src/api/keys/controllers/AdminApiKeyController.ts +75 -0
- package/src/api/keys/controllers/ApiKeyController.ts +103 -0
- package/src/api/keys/entities/apiKeyEntity.ts +41 -0
- package/src/api/keys/index.ts +49 -0
- package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +7 -0
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +17 -0
- package/src/api/keys/schemas/createApiKeyBodySchema.ts +7 -0
- package/src/api/keys/schemas/createApiKeyResponseSchema.ts +11 -0
- package/src/api/keys/schemas/listApiKeyResponseSchema.ts +15 -0
- package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +5 -0
- package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +5 -0
- package/src/api/keys/services/ApiKeyService.spec.ts +553 -0
- package/src/api/keys/services/ApiKeyService.ts +306 -0
- package/src/api/logs/TODO.md +55 -0
- package/src/api/notifications/index.ts +10 -4
- package/src/api/parameters/index.ts +9 -30
- package/src/api/parameters/primitives/$config.ts +12 -4
- package/src/api/parameters/services/ConfigStore.ts +9 -3
- package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1035 -0
- package/src/api/users/__tests__/ApiKeys.spec.ts +401 -0
- package/src/api/users/index.ts +14 -3
- package/src/api/users/primitives/$realm.ts +33 -5
- package/src/api/users/providers/RealmProvider.ts +1 -12
- package/src/api/users/services/SessionService.ts +1 -1
- package/src/api/verifications/controllers/VerificationController.ts +2 -0
- package/src/api/verifications/index.ts +10 -4
- package/src/batch/index.ts +9 -36
- package/src/batch/primitives/$batch.ts +0 -8
- package/src/batch/providers/BatchProvider.ts +29 -2
- package/src/bucket/__tests__/shared.ts +1 -1
- package/src/bucket/index.ts +13 -6
- package/src/bucket/primitives/$bucket.ts +1 -1
- package/src/bucket/providers/LocalFileStorageProvider.ts +1 -1
- package/src/bucket/providers/MemoryFileStorageProvider.ts +1 -1
- package/src/cache/core/__tests__/shared.ts +30 -0
- package/src/cache/core/index.ts +11 -6
- package/src/cache/core/primitives/$cache.spec.ts +5 -0
- package/src/cache/core/providers/CacheProvider.ts +17 -0
- package/src/cache/core/providers/MemoryCacheProvider.ts +300 -1
- package/src/cache/redis/__tests__/cache-redis.spec.ts +5 -0
- package/src/cache/redis/providers/RedisCacheProvider.ts +9 -0
- package/src/cli/apps/AlephaCli.ts +1 -14
- package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -1
- package/src/cli/atoms/buildOptions.ts +99 -9
- package/src/cli/commands/build.ts +150 -37
- package/src/cli/commands/db.ts +22 -18
- package/src/cli/commands/deploy.ts +1 -1
- package/src/cli/commands/dev.ts +1 -20
- package/src/cli/commands/gen/env.ts +5 -2
- package/src/cli/commands/gen/openapi.ts +5 -2
- package/src/cli/commands/init.spec.ts +588 -0
- package/src/cli/commands/init.ts +115 -58
- package/src/cli/commands/lint.ts +7 -1
- package/src/cli/commands/typecheck.ts +11 -0
- package/src/cli/providers/AppEntryProvider.ts +1 -1
- package/src/cli/providers/ViteBuildProvider.ts +8 -50
- package/src/cli/providers/ViteDevServerProvider.ts +35 -16
- package/src/cli/services/AlephaCliUtils.ts +52 -121
- package/src/cli/services/PackageManagerUtils.ts +129 -11
- package/src/cli/services/ProjectScaffolder.spec.ts +97 -0
- package/src/cli/services/ProjectScaffolder.ts +148 -81
- package/src/cli/services/ViteUtils.ts +82 -0
- package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +37 -24
- package/src/cli/templates/apiAppSecurityTs.ts +11 -0
- package/src/cli/templates/apiIndexTs.ts +30 -0
- package/src/cli/templates/gitignore.ts +39 -0
- package/src/cli/{assets → templates}/mainCss.ts +11 -2
- package/src/cli/templates/mainServerTs.ts +33 -0
- package/src/cli/templates/webAppRouterTs.ts +74 -0
- package/src/cli/templates/webHelloComponentTsx.ts +30 -0
- package/src/command/helpers/Runner.spec.ts +139 -0
- package/src/command/helpers/Runner.ts +7 -22
- package/src/command/index.ts +12 -4
- package/src/command/providers/CliProvider.spec.ts +1392 -0
- package/src/command/providers/CliProvider.ts +320 -47
- package/src/core/Alepha.ts +34 -27
- package/src/core/__tests__/Alepha-start.spec.ts +4 -4
- package/src/core/helpers/jsonSchemaToTypeBox.spec.ts +771 -0
- package/src/core/helpers/jsonSchemaToTypeBox.ts +62 -10
- package/src/core/index.shared.ts +1 -0
- package/src/core/index.ts +20 -0
- package/src/core/providers/EventManager.spec.ts +0 -71
- package/src/core/providers/EventManager.ts +3 -15
- package/src/core/providers/Json.ts +2 -14
- package/src/datetime/index.ts +15 -0
- package/src/email/index.ts +10 -5
- package/src/email/providers/LocalEmailProvider.spec.ts +1 -1
- package/src/email/providers/LocalEmailProvider.ts +1 -1
- package/src/fake/__tests__/keyName.example.ts +1 -1
- package/src/fake/__tests__/keyName.spec.ts +5 -5
- package/src/fake/index.ts +9 -6
- package/src/fake/providers/FakeProvider.spec.ts +258 -40
- package/src/fake/providers/FakeProvider.ts +133 -19
- package/src/lock/core/index.ts +11 -4
- package/src/logger/index.ts +17 -66
- package/src/mcp/index.ts +10 -27
- package/src/mcp/transports/SseMcpTransport.ts +0 -11
- package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
- package/src/orm/index.browser.ts +2 -2
- package/src/orm/index.bun.ts +5 -3
- package/src/orm/index.ts +23 -53
- package/src/orm/providers/drivers/BunSqliteProvider.ts +5 -1
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +57 -30
- package/src/orm/providers/drivers/DatabaseProvider.ts +9 -1
- package/src/orm/providers/drivers/NodeSqliteProvider.ts +4 -1
- package/src/orm/services/Repository.ts +7 -3
- package/src/queue/core/index.ts +14 -6
- package/src/react/auth/__tests__/$auth.spec.ts +202 -0
- package/src/react/auth/hooks/useAuth.ts +32 -0
- package/src/react/auth/index.browser.ts +13 -0
- package/src/react/auth/index.shared.ts +2 -0
- package/src/react/auth/index.ts +48 -0
- package/src/react/auth/providers/ReactAuthProvider.ts +16 -0
- package/src/react/auth/services/ReactAuth.ts +135 -0
- package/src/react/core/__tests__/Router.spec.tsx +169 -0
- package/src/react/core/components/ClientOnly.tsx +49 -0
- package/src/react/core/components/ErrorBoundary.tsx +73 -0
- package/src/react/core/contexts/AlephaContext.ts +7 -0
- package/src/react/core/contexts/AlephaProvider.tsx +42 -0
- package/src/react/core/hooks/useAction.browser.spec.tsx +569 -0
- package/src/react/core/hooks/useAction.ts +480 -0
- package/src/react/core/hooks/useAlepha.ts +26 -0
- package/src/react/core/hooks/useClient.ts +17 -0
- package/src/react/core/hooks/useEvents.ts +51 -0
- package/src/react/core/hooks/useInject.ts +12 -0
- package/src/react/core/hooks/useStore.ts +52 -0
- package/src/react/core/index.ts +90 -0
- package/src/react/form/components/FormState.tsx +17 -0
- package/src/react/form/errors/FormValidationError.ts +18 -0
- package/src/react/form/hooks/useForm.browser.spec.tsx +366 -0
- package/src/react/form/hooks/useForm.ts +47 -0
- package/src/react/form/hooks/useFormState.ts +130 -0
- package/src/react/form/index.ts +44 -0
- package/src/react/form/services/FormModel.ts +614 -0
- package/src/react/head/helpers/SeoExpander.spec.ts +203 -0
- package/src/react/head/helpers/SeoExpander.ts +142 -0
- package/src/react/head/hooks/useHead.spec.tsx +288 -0
- package/src/react/head/hooks/useHead.ts +62 -0
- package/src/react/head/index.browser.ts +26 -0
- package/src/react/head/index.ts +44 -0
- package/src/react/head/interfaces/Head.ts +105 -0
- package/src/react/head/primitives/$head.ts +25 -0
- package/src/react/head/providers/BrowserHeadProvider.browser.spec.ts +196 -0
- package/src/react/head/providers/BrowserHeadProvider.ts +212 -0
- package/src/react/head/providers/HeadProvider.ts +168 -0
- package/src/react/head/providers/ServerHeadProvider.ts +31 -0
- package/src/react/i18n/__tests__/integration.spec.tsx +239 -0
- package/src/react/i18n/components/Localize.spec.tsx +357 -0
- package/src/react/i18n/components/Localize.tsx +35 -0
- package/src/react/i18n/hooks/useI18n.browser.spec.tsx +438 -0
- package/src/react/i18n/hooks/useI18n.ts +18 -0
- package/src/react/i18n/index.ts +41 -0
- package/src/react/i18n/primitives/$dictionary.ts +69 -0
- package/src/react/i18n/providers/I18nProvider.spec.ts +389 -0
- package/src/react/i18n/providers/I18nProvider.ts +278 -0
- package/src/react/router/__tests__/page-head-browser.browser.spec.ts +95 -0
- package/src/react/router/__tests__/page-head.spec.ts +48 -0
- package/src/react/router/__tests__/seo-head.spec.ts +125 -0
- package/src/react/router/atoms/ssrManifestAtom.ts +58 -0
- package/src/react/router/components/ErrorViewer.tsx +872 -0
- package/src/react/router/components/Link.tsx +23 -0
- package/src/react/router/components/NestedView.tsx +223 -0
- package/src/react/router/components/NotFound.tsx +30 -0
- package/src/react/router/constants/PAGE_PRELOAD_KEY.ts +6 -0
- package/src/react/router/contexts/RouterLayerContext.ts +12 -0
- package/src/react/router/errors/Redirection.ts +28 -0
- package/src/react/router/hooks/useActive.ts +52 -0
- package/src/react/router/hooks/useQueryParams.ts +63 -0
- package/src/react/router/hooks/useRouter.ts +20 -0
- package/src/react/router/hooks/useRouterState.ts +11 -0
- package/src/react/router/index.browser.ts +45 -0
- package/src/react/router/index.shared.ts +19 -0
- package/src/react/router/index.ts +146 -0
- package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
- package/src/react/router/primitives/$page.spec.tsx +676 -0
- package/src/react/router/primitives/$page.ts +489 -0
- package/src/react/router/providers/ReactBrowserProvider.ts +312 -0
- package/src/react/router/providers/ReactBrowserRendererProvider.ts +25 -0
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +168 -0
- package/src/react/router/providers/ReactPageProvider.ts +726 -0
- package/src/react/router/providers/ReactPreloadProvider.spec.ts +142 -0
- package/src/react/router/providers/ReactPreloadProvider.ts +85 -0
- package/src/react/router/providers/ReactServerProvider.spec.tsx +316 -0
- package/src/react/router/providers/ReactServerProvider.ts +487 -0
- package/src/react/router/providers/ReactServerTemplateProvider.spec.ts +210 -0
- package/src/react/router/providers/ReactServerTemplateProvider.ts +542 -0
- package/src/react/router/providers/SSRManifestProvider.ts +334 -0
- package/src/react/router/services/ReactPageServerService.ts +48 -0
- package/src/react/router/services/ReactPageService.ts +27 -0
- package/src/react/router/services/ReactRouter.ts +262 -0
- package/src/react/websocket/hooks/useRoom.tsx +242 -0
- package/src/react/websocket/index.ts +7 -0
- package/src/redis/__tests__/redis.spec.ts +13 -0
- package/src/redis/index.ts +9 -25
- package/src/redis/providers/BunRedisProvider.ts +9 -0
- package/src/redis/providers/NodeRedisProvider.ts +8 -0
- package/src/redis/providers/RedisProvider.ts +16 -0
- package/src/retry/index.ts +11 -2
- package/src/router/index.ts +15 -0
- package/src/scheduler/index.ts +11 -2
- package/src/security/__tests__/BasicAuth.spec.ts +2 -0
- package/src/security/__tests__/ServerSecurityProvider.spec.ts +90 -5
- package/src/security/index.ts +15 -10
- package/src/security/interfaces/IssuerResolver.ts +27 -0
- package/src/security/primitives/$issuer.ts +55 -0
- package/src/security/providers/SecurityProvider.ts +179 -0
- package/src/security/providers/ServerBasicAuthProvider.ts +6 -2
- package/src/security/providers/ServerSecurityProvider.ts +63 -41
- package/src/server/auth/index.ts +12 -7
- package/src/server/cache/index.ts +7 -22
- package/src/server/compress/index.ts +10 -2
- package/src/server/cookies/index.ts +7 -5
- package/src/server/cookies/primitives/$cookie.ts +33 -11
- package/src/server/core/index.ts +16 -6
- package/src/server/core/interfaces/ServerRequest.ts +83 -1
- package/src/server/core/primitives/$action.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +8 -3
- package/src/server/core/providers/NodeHttpServerProvider.spec.ts +9 -3
- package/src/server/core/providers/NodeHttpServerProvider.ts +9 -3
- package/src/server/core/services/ServerRequestParser.spec.ts +520 -0
- package/src/server/core/services/ServerRequestParser.ts +306 -13
- package/src/server/cors/index.ts +7 -21
- package/src/server/cors/primitives/$cors.ts +6 -2
- package/src/server/health/index.ts +8 -2
- package/src/server/helmet/index.ts +11 -3
- package/src/server/links/index.ts +11 -6
- package/src/server/metrics/index.ts +10 -3
- package/src/server/multipart/index.ts +9 -3
- package/src/server/proxy/index.ts +8 -2
- package/src/server/rate-limit/index.ts +21 -25
- package/src/server/rate-limit/primitives/$rateLimit.ts +6 -2
- package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +38 -14
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +22 -56
- package/src/server/static/index.ts +8 -2
- package/src/server/static/providers/ServerStaticProvider.ts +1 -1
- package/src/server/swagger/index.ts +9 -4
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +1 -1
- package/src/sms/index.ts +9 -5
- package/src/sms/providers/LocalSmsProvider.spec.ts +1 -1
- package/src/sms/providers/LocalSmsProvider.ts +1 -1
- package/src/system/index.browser.ts +36 -0
- package/src/system/index.ts +62 -0
- package/src/system/index.workerd.ts +1 -0
- package/src/{file → system}/providers/FileSystemProvider.ts +24 -0
- package/src/{file → system}/providers/MemoryFileSystemProvider.ts +116 -3
- package/src/system/providers/MemoryShellProvider.ts +164 -0
- package/src/{file → system}/providers/NodeFileSystemProvider.spec.ts +2 -2
- package/src/{file → system}/providers/NodeFileSystemProvider.ts +47 -2
- package/src/system/providers/NodeShellProvider.ts +184 -0
- package/src/system/providers/ShellProvider.ts +74 -0
- package/src/{file → system}/services/FileDetector.spec.ts +2 -2
- package/src/thread/index.ts +11 -2
- package/src/topic/core/index.ts +12 -5
- package/src/vite/tasks/buildClient.ts +2 -7
- package/src/vite/tasks/buildServer.ts +19 -13
- package/src/vite/tasks/generateCloudflare.ts +10 -7
- package/src/vite/tasks/generateDocker.ts +4 -0
- package/src/websocket/index.ts +12 -8
- package/dist/file/index.d.ts.map +0 -1
- package/dist/file/index.js.map +0 -1
- package/src/cli/assets/apiIndexTs.ts +0 -16
- package/src/cli/assets/mainServerTs.ts +0 -24
- package/src/cli/assets/webAppRouterTs.ts +0 -16
- package/src/cli/assets/webHelloComponentTsx.ts +0 -20
- package/src/cli/providers/ViteTemplateProvider.ts +0 -27
- package/src/file/index.ts +0 -43
- /package/src/cli/{assets → templates}/apiHelloControllerTs.ts +0 -0
- /package/src/cli/{assets → templates}/biomeJson.ts +0 -0
- /package/src/cli/{assets → templates}/dummySpecTs.ts +0 -0
- /package/src/cli/{assets → templates}/editorconfig.ts +0 -0
- /package/src/cli/{assets → templates}/mainBrowserTs.ts +0 -0
- /package/src/cli/{assets → templates}/tsconfigJson.ts +0 -0
- /package/src/cli/{assets → templates}/webIndexTs.ts +0 -0
- /package/src/{file → system}/errors/FileError.ts +0 -0
- /package/src/{file → system}/services/FileDetector.ts +0 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import {
|
|
2
|
+
$inject,
|
|
3
|
+
type Async,
|
|
4
|
+
createPrimitive,
|
|
5
|
+
KIND,
|
|
6
|
+
Primitive,
|
|
7
|
+
type Static,
|
|
8
|
+
type TSchema,
|
|
9
|
+
} from "alepha";
|
|
10
|
+
import type { ClientOnlyProps } from "alepha/react";
|
|
11
|
+
import type { Head } from "alepha/react/head";
|
|
12
|
+
import type { ServerRequest } from "alepha/server";
|
|
13
|
+
import type { ServerRouteCache } from "alepha/server/cache";
|
|
14
|
+
import type { FC, ReactNode } from "react";
|
|
15
|
+
import { PAGE_PRELOAD_KEY } from "../constants/PAGE_PRELOAD_KEY.ts";
|
|
16
|
+
import type { Redirection } from "../errors/Redirection.ts";
|
|
17
|
+
import type { ReactRouterState } from "../providers/ReactPageProvider.ts";
|
|
18
|
+
import { ReactPageService } from "../services/ReactPageService.ts";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Main primitive for defining a React route in the application.
|
|
22
|
+
*
|
|
23
|
+
* The $page primitive is the core building block for creating type-safe, SSR-enabled React routes.
|
|
24
|
+
* It provides a declarative way to define pages with powerful features:
|
|
25
|
+
*
|
|
26
|
+
* **Routing & Navigation**
|
|
27
|
+
* - URL pattern matching with parameters (e.g., `/users/:id`)
|
|
28
|
+
* - Nested routing with parent-child relationships
|
|
29
|
+
* - Type-safe URL parameter and query string validation
|
|
30
|
+
*
|
|
31
|
+
* **Data Loading**
|
|
32
|
+
* - Server-side data fetching with the `loader` function
|
|
33
|
+
* - Automatic serialization and hydration for SSR
|
|
34
|
+
* - Access to request context, URL params, and parent data
|
|
35
|
+
*
|
|
36
|
+
* **Component Loading**
|
|
37
|
+
* - Direct component rendering or lazy loading for code splitting
|
|
38
|
+
* - Client-only rendering when browser APIs are needed
|
|
39
|
+
* - Automatic fallback handling during hydration
|
|
40
|
+
*
|
|
41
|
+
* **Performance Optimization**
|
|
42
|
+
* - Static generation for pre-rendered pages at build time
|
|
43
|
+
* - Server-side caching with configurable TTL and providers
|
|
44
|
+
* - Code splitting through lazy component loading
|
|
45
|
+
*
|
|
46
|
+
* **Error Handling**
|
|
47
|
+
* - Custom error handlers with support for redirects
|
|
48
|
+
* - Hierarchical error handling (child → parent)
|
|
49
|
+
* - HTTP status code handling (404, 401, etc.)
|
|
50
|
+
*
|
|
51
|
+
* **Page Animations**
|
|
52
|
+
* - CSS-based enter/exit animations
|
|
53
|
+
* - Dynamic animations based on page state
|
|
54
|
+
* - Custom timing and easing functions
|
|
55
|
+
*
|
|
56
|
+
* **Lifecycle Management**
|
|
57
|
+
* - Server response hooks for headers and status codes
|
|
58
|
+
* - Page leave handlers for cleanup (browser only)
|
|
59
|
+
* - Permission-based access control
|
|
60
|
+
*
|
|
61
|
+
* @example Simple page with data fetching
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const userProfile = $page({
|
|
64
|
+
* path: "/users/:id",
|
|
65
|
+
* schema: {
|
|
66
|
+
* params: t.object({ id: t.integer() }),
|
|
67
|
+
* query: t.object({ tab: t.optional(t.text()) })
|
|
68
|
+
* },
|
|
69
|
+
* loader: async ({ params }) => {
|
|
70
|
+
* const user = await userApi.getUser(params.id);
|
|
71
|
+
* return { user };
|
|
72
|
+
* },
|
|
73
|
+
* lazy: () => import("./UserProfile.tsx")
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @example Nested routing with error handling
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const projectSection = $page({
|
|
80
|
+
* path: "/projects/:id",
|
|
81
|
+
* children: () => [projectBoard, projectSettings],
|
|
82
|
+
* loader: async ({ params }) => {
|
|
83
|
+
* const project = await projectApi.get(params.id);
|
|
84
|
+
* return { project };
|
|
85
|
+
* },
|
|
86
|
+
* errorHandler: (error) => {
|
|
87
|
+
* if (HttpError.is(error, 404)) {
|
|
88
|
+
* return <ProjectNotFound />;
|
|
89
|
+
* }
|
|
90
|
+
* }
|
|
91
|
+
* });
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* @example Static generation with caching
|
|
95
|
+
* ```typescript
|
|
96
|
+
* const blogPost = $page({
|
|
97
|
+
* path: "/blog/:slug",
|
|
98
|
+
* static: {
|
|
99
|
+
* entries: posts.map(p => ({ params: { slug: p.slug } }))
|
|
100
|
+
* },
|
|
101
|
+
* loader: async ({ params }) => {
|
|
102
|
+
* const post = await loadPost(params.slug);
|
|
103
|
+
* return { post };
|
|
104
|
+
* }
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export const $page = <
|
|
109
|
+
TConfig extends PageConfigSchema = PageConfigSchema,
|
|
110
|
+
TProps extends object = TPropsDefault,
|
|
111
|
+
TPropsParent extends object = TPropsParentDefault,
|
|
112
|
+
>(
|
|
113
|
+
options: PagePrimitiveOptions<TConfig, TProps, TPropsParent>,
|
|
114
|
+
): PagePrimitive<TConfig, TProps, TPropsParent> => {
|
|
115
|
+
return createPrimitive(PagePrimitive<TConfig, TProps, TPropsParent>, options);
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
119
|
+
|
|
120
|
+
export interface PagePrimitiveOptions<
|
|
121
|
+
TConfig extends PageConfigSchema = PageConfigSchema,
|
|
122
|
+
TProps extends object = TPropsDefault,
|
|
123
|
+
TPropsParent extends object = TPropsParentDefault,
|
|
124
|
+
> {
|
|
125
|
+
/**
|
|
126
|
+
* Identifier name for the page. Must be unique.
|
|
127
|
+
*
|
|
128
|
+
* @default Primitive key
|
|
129
|
+
*/
|
|
130
|
+
name?: string;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Add a pathname to the page.
|
|
134
|
+
*
|
|
135
|
+
* Pathname can contain parameters, like `/post/:slug`.
|
|
136
|
+
*
|
|
137
|
+
* @default ""
|
|
138
|
+
*/
|
|
139
|
+
path?: string;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Add an input schema to define:
|
|
143
|
+
* - `params`: parameters from the pathname.
|
|
144
|
+
* - `query`: query parameters from the URL.
|
|
145
|
+
*/
|
|
146
|
+
schema?: TConfig;
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Load data before rendering the page.
|
|
150
|
+
*
|
|
151
|
+
* This function receives
|
|
152
|
+
* - the request context (params, query, etc.)
|
|
153
|
+
* - the parent props (if page has a parent)
|
|
154
|
+
*
|
|
155
|
+
* > In SSR, the returned data will be serialized and sent to the client, then reused during the client-side hydration.
|
|
156
|
+
*
|
|
157
|
+
* Loader can be stopped by throwing an error, which will be handled by the `errorHandler` function.
|
|
158
|
+
* It's common to throw a `NotFoundError` to display a 404 page.
|
|
159
|
+
*
|
|
160
|
+
* RedirectError can be thrown to redirect the user to another page.
|
|
161
|
+
*/
|
|
162
|
+
loader?: (context: PageLoader<TConfig, TPropsParent>) => Async<TProps>;
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Default props to pass to the component when rendering the page.
|
|
166
|
+
*
|
|
167
|
+
* Resolved props from the `resolve` function will override these default props.
|
|
168
|
+
*/
|
|
169
|
+
props?: () => Partial<TProps>;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* The component to render when the page is loaded.
|
|
173
|
+
*
|
|
174
|
+
* If `lazy` is defined, this will be ignored.
|
|
175
|
+
* Prefer using `lazy` to improve the initial loading time.
|
|
176
|
+
*/
|
|
177
|
+
component?: FC<TProps & TPropsParent>;
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Lazy load the component when the page is loaded.
|
|
181
|
+
*
|
|
182
|
+
* It's recommended to use this for components to improve the initial loading time
|
|
183
|
+
* and enable code-splitting.
|
|
184
|
+
*/
|
|
185
|
+
lazy?: () => Promise<{ default: FC<TProps & TPropsParent> }>;
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Attach child pages to create nested routes.
|
|
189
|
+
* This will make the page a parent route.
|
|
190
|
+
*/
|
|
191
|
+
children?: Array<PagePrimitive> | (() => Array<PagePrimitive>);
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Define a parent page for nested routing.
|
|
195
|
+
*/
|
|
196
|
+
parent?: PagePrimitive<PageConfigSchema, TPropsParent, any>;
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Function to determine if the page can be accessed.
|
|
200
|
+
*
|
|
201
|
+
* If it returns false, the page will not be accessible and a 403 Forbidden error will be returned.
|
|
202
|
+
* This function can be used to implement permission-based access control.
|
|
203
|
+
*/
|
|
204
|
+
can?: () => boolean;
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Catch any error from the `loader` function or during `rendering`.
|
|
208
|
+
*
|
|
209
|
+
* Expected to return one of the following:
|
|
210
|
+
* - a ReactNode to render an error page
|
|
211
|
+
* - a Redirection to redirect the user
|
|
212
|
+
* - undefined to let the error propagate
|
|
213
|
+
*
|
|
214
|
+
* If not defined, the error will be thrown and handled by the server or client error handler.
|
|
215
|
+
* If a leaf $page does not define an error handler, the error can be caught by parent pages.
|
|
216
|
+
*
|
|
217
|
+
* @example Catch a 404 from API and render a custom not found component:
|
|
218
|
+
* ```ts
|
|
219
|
+
* loader: async ({ params, query }) => {
|
|
220
|
+
* api.fetch("/api/resource", { params, query });
|
|
221
|
+
* },
|
|
222
|
+
* errorHandler: (error, context) => {
|
|
223
|
+
* if (HttpError.is(error, 404)) {
|
|
224
|
+
* return <ResourceNotFound />;
|
|
225
|
+
* }
|
|
226
|
+
* }
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* @example Catch an 401 error and redirect the user to the login page:
|
|
230
|
+
* ```ts
|
|
231
|
+
* loader: async ({ params, query }) => {
|
|
232
|
+
* // but the user is not authenticated
|
|
233
|
+
* api.fetch("/api/resource", { params, query });
|
|
234
|
+
* },
|
|
235
|
+
* errorHandler: (error, context) => {
|
|
236
|
+
* if (HttpError.is(error, 401)) {
|
|
237
|
+
* // throwing a Redirection is also valid!
|
|
238
|
+
* return new Redirection("/login");
|
|
239
|
+
* }
|
|
240
|
+
* }
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
errorHandler?: ErrorHandler;
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* If true, the page will be considered as a static page, immutable and cacheable.
|
|
247
|
+
* Replace boolean by an object to define static entries. (e.g. list of params/query)
|
|
248
|
+
*
|
|
249
|
+
* Browser-side: it only works with `alepha/vite`, which can pre-render the page at build time.
|
|
250
|
+
*
|
|
251
|
+
* Server-side: It will act as timeless cached page. You can use `cache` to configure the cache behavior.
|
|
252
|
+
*/
|
|
253
|
+
static?:
|
|
254
|
+
| boolean
|
|
255
|
+
| {
|
|
256
|
+
entries?: Array<Partial<PageRequestConfig<TConfig>>>;
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
cache?: ServerRouteCache;
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* If true, force the page to be rendered only on the client-side (browser).
|
|
263
|
+
* It uses the `<ClientOnly/>` component to render the page.
|
|
264
|
+
*/
|
|
265
|
+
client?: boolean | ClientOnlyProps;
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Called before the server response is sent to the client. (server only)
|
|
269
|
+
*/
|
|
270
|
+
onServerResponse?: (request: ServerRequest) => unknown;
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Called when user enters the page. (browser only)
|
|
274
|
+
*
|
|
275
|
+
* Useful for browser-only side effects like analytics, scroll management,
|
|
276
|
+
* or focus handling that don't need to return data to the component.
|
|
277
|
+
*
|
|
278
|
+
* @example
|
|
279
|
+
* ```ts
|
|
280
|
+
* onEnter: () => {
|
|
281
|
+
* analytics.trackPageView("/dashboard");
|
|
282
|
+
* window.scrollTo(0, 0);
|
|
283
|
+
* }
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
onEnter?: () => void;
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Called when user leaves the page. (browser only)
|
|
290
|
+
*/
|
|
291
|
+
onLeave?: () => void;
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* @experimental
|
|
295
|
+
*
|
|
296
|
+
* Add a css animation when the page is loaded or unloaded.
|
|
297
|
+
* It uses CSS animations, so you need to define the keyframes in your CSS.
|
|
298
|
+
*
|
|
299
|
+
* @example Simple animation name
|
|
300
|
+
* ```ts
|
|
301
|
+
* animation: "fadeIn"
|
|
302
|
+
* ```
|
|
303
|
+
*
|
|
304
|
+
* CSS example:
|
|
305
|
+
* ```css
|
|
306
|
+
* @keyframes fadeIn {
|
|
307
|
+
* from { opacity: 0; }
|
|
308
|
+
* to { opacity: 1; }
|
|
309
|
+
* }
|
|
310
|
+
* ```
|
|
311
|
+
*
|
|
312
|
+
* @example Detailed animation
|
|
313
|
+
* ```ts
|
|
314
|
+
* animation: {
|
|
315
|
+
* enter: { name: "fadeIn", duration: 300 },
|
|
316
|
+
* exit: { name: "fadeOut", duration: 200, timing: "ease-in-out" },
|
|
317
|
+
* }
|
|
318
|
+
* ```
|
|
319
|
+
*
|
|
320
|
+
* @example Only exit animation
|
|
321
|
+
* ```ts
|
|
322
|
+
* animation: {
|
|
323
|
+
* exit: "fadeOut"
|
|
324
|
+
* }
|
|
325
|
+
* ```
|
|
326
|
+
*
|
|
327
|
+
* @example With custom timing function
|
|
328
|
+
* ```ts
|
|
329
|
+
* animation: {
|
|
330
|
+
* enter: { name: "fadeIn", duration: 300, timing: "cubic-bezier(0.4, 0, 0.2, 1)" },
|
|
331
|
+
* exit: { name: "fadeOut", duration: 200, timing: "ease-in-out" },
|
|
332
|
+
* }
|
|
333
|
+
* ```
|
|
334
|
+
*/
|
|
335
|
+
animation?: PageAnimation;
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Head configuration for the page (title, meta tags, etc.).
|
|
339
|
+
*
|
|
340
|
+
* Can be a static object or a function that receives resolved props.
|
|
341
|
+
*
|
|
342
|
+
* @example Static head
|
|
343
|
+
* ```ts
|
|
344
|
+
* head: {
|
|
345
|
+
* title: "My Page",
|
|
346
|
+
* description: "Page description",
|
|
347
|
+
* }
|
|
348
|
+
* ```
|
|
349
|
+
*
|
|
350
|
+
* @example Dynamic head based on props
|
|
351
|
+
* ```ts
|
|
352
|
+
* head: (props) => ({
|
|
353
|
+
* title: props.user.name,
|
|
354
|
+
* description: `Profile of ${props.user.name}`,
|
|
355
|
+
* })
|
|
356
|
+
* ```
|
|
357
|
+
*/
|
|
358
|
+
head?: Head | ((props: TProps, previous?: Head) => Head);
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Source path for SSR module preloading.
|
|
362
|
+
*
|
|
363
|
+
* This is automatically injected by the viteAlephaPreload plugin.
|
|
364
|
+
* It maps to the source file path used in Vite's SSR manifest.
|
|
365
|
+
*
|
|
366
|
+
* @internal
|
|
367
|
+
*/
|
|
368
|
+
[PAGE_PRELOAD_KEY]?: string;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
372
|
+
|
|
373
|
+
export class PagePrimitive<
|
|
374
|
+
TConfig extends PageConfigSchema = PageConfigSchema,
|
|
375
|
+
TProps extends object = TPropsDefault,
|
|
376
|
+
TPropsParent extends object = TPropsParentDefault,
|
|
377
|
+
> extends Primitive<PagePrimitiveOptions<TConfig, TProps, TPropsParent>> {
|
|
378
|
+
protected readonly reactPageService = $inject(ReactPageService);
|
|
379
|
+
|
|
380
|
+
protected onInit() {
|
|
381
|
+
if (this.options.static) {
|
|
382
|
+
this.options.cache ??= {
|
|
383
|
+
store: {
|
|
384
|
+
provider: "memory",
|
|
385
|
+
ttl: [1, "week"],
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
public get name(): string {
|
|
392
|
+
return this.options.name ?? this.config.propertyKey;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* For testing or build purposes.
|
|
397
|
+
*
|
|
398
|
+
* This will render the page (HTML layout included or not) and return the HTML + context.
|
|
399
|
+
* Only valid for server-side rendering, it will throw an error if called on the client-side.
|
|
400
|
+
*/
|
|
401
|
+
public async render(
|
|
402
|
+
options?: PagePrimitiveRenderOptions,
|
|
403
|
+
): Promise<PagePrimitiveRenderResult> {
|
|
404
|
+
return this.reactPageService.render(this.name, options);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
public async fetch(options?: PagePrimitiveRenderOptions): Promise<{
|
|
408
|
+
html: string;
|
|
409
|
+
response: Response;
|
|
410
|
+
}> {
|
|
411
|
+
return this.reactPageService.fetch(this.options.path || "", options);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
$page[KIND] = PagePrimitive;
|
|
416
|
+
|
|
417
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
418
|
+
|
|
419
|
+
export type ErrorHandler = (
|
|
420
|
+
error: Error,
|
|
421
|
+
state: ReactRouterState,
|
|
422
|
+
) => ReactNode | Redirection | undefined;
|
|
423
|
+
|
|
424
|
+
export interface PageConfigSchema {
|
|
425
|
+
query?: TSchema;
|
|
426
|
+
params?: TSchema;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
export type TPropsDefault = any;
|
|
430
|
+
|
|
431
|
+
export type TPropsParentDefault = {};
|
|
432
|
+
|
|
433
|
+
export interface PagePrimitiveRenderOptions {
|
|
434
|
+
params?: Record<string, string>;
|
|
435
|
+
query?: Record<string, string>;
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* If true, the HTML layout will be included in the response.
|
|
439
|
+
* If false, only the page content will be returned.
|
|
440
|
+
*
|
|
441
|
+
* @default true
|
|
442
|
+
*/
|
|
443
|
+
html?: boolean;
|
|
444
|
+
hydration?: boolean;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export interface PagePrimitiveRenderResult {
|
|
448
|
+
html: string;
|
|
449
|
+
state: ReactRouterState;
|
|
450
|
+
redirect?: string;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
export interface PageRequestConfig<
|
|
454
|
+
TConfig extends PageConfigSchema = PageConfigSchema,
|
|
455
|
+
> {
|
|
456
|
+
params: TConfig["params"] extends TSchema
|
|
457
|
+
? Static<TConfig["params"]>
|
|
458
|
+
: Record<string, string>;
|
|
459
|
+
|
|
460
|
+
query: TConfig["query"] extends TSchema
|
|
461
|
+
? Static<TConfig["query"]>
|
|
462
|
+
: Record<string, string>;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
export type PageLoader<
|
|
466
|
+
TConfig extends PageConfigSchema = PageConfigSchema,
|
|
467
|
+
TPropsParent extends object = TPropsParentDefault,
|
|
468
|
+
> = PageRequestConfig<TConfig> &
|
|
469
|
+
TPropsParent &
|
|
470
|
+
Omit<ReactRouterState, "layers" | "onError">;
|
|
471
|
+
|
|
472
|
+
export type PageAnimation =
|
|
473
|
+
| PageAnimationObject
|
|
474
|
+
| ((state: ReactRouterState) => PageAnimationObject | undefined);
|
|
475
|
+
|
|
476
|
+
type PageAnimationObject =
|
|
477
|
+
| CssAnimationName
|
|
478
|
+
| {
|
|
479
|
+
enter?: CssAnimation | CssAnimationName;
|
|
480
|
+
exit?: CssAnimation | CssAnimationName;
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
type CssAnimationName = string;
|
|
484
|
+
|
|
485
|
+
type CssAnimation = {
|
|
486
|
+
name: string;
|
|
487
|
+
duration?: number;
|
|
488
|
+
timing?: string;
|
|
489
|
+
};
|