alepha 0.15.0 → 0.15.2
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 +43 -98
- package/dist/api/audits/index.d.ts +630 -653
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +12 -35
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.d.ts +365 -358
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +12 -5
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +255 -248
- 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.browser.js +4 -4
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +84 -78
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +14 -8
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +528 -535
- 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 +1221 -910
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +2556 -248
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +142 -136
- 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 +142 -162
- 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 +595 -171
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +1856 -12
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +225 -53
- 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 +6 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/index.d.ts +834 -226
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2872 -417
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +458 -310
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2011 -76
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +309 -97
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +796 -701
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +329 -97
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +309 -97
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.d.ts +59 -44
- 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 +314 -19
- package/dist/email/index.d.ts.map +1 -1
- package/dist/email/index.js +1852 -7
- package/dist/email/index.js.map +1 -1
- package/dist/fake/index.d.ts +5500 -5418
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +113 -42
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +219 -212
- 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/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +41 -90
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +15 -68
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +228 -230
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +32 -31
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.browser.js +12 -12
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.bun.js +90 -80
- package/dist/orm/index.bun.js.map +1 -1
- package/dist/orm/index.d.ts +1434 -1459
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +112 -130
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +262 -254
- 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/queue/redis/index.d.ts.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 +1980 -0
- package/dist/react/router/index.browser.js.map +1 -0
- package/dist/react/router/index.d.ts +2068 -0
- package/dist/react/router/index.d.ts.map +1 -0
- package/dist/react/router/index.js +4932 -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 +127 -130
- 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 +80 -71
- 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/router/index.d.ts +6 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +119 -28
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +404 -3
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +642 -228
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1579 -37
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +1141 -111
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1261 -25
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +63 -78
- 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 +13 -5
- 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 +46 -22
- 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 +307 -196
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +271 -38
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +24 -34
- 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 +25 -19
- 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 +13 -5
- 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.browser.js +9 -1
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +133 -128
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +24 -11
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +524 -4
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js +4472 -7
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/multipart/index.d.ts +15 -9
- 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 +110 -104
- 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 +46 -51
- 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 +181 -48
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js +1848 -5
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +348 -53
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +1849 -6
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +312 -18
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +1854 -10
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js +496 -0
- package/dist/system/index.browser.js.map +1 -0
- package/dist/system/index.d.ts +1158 -0
- package/dist/system/index.d.ts.map +1 -0
- package/dist/{file → system}/index.js +412 -20
- package/dist/system/index.js.map +1 -0
- package/dist/thread/index.d.ts +82 -73
- package/dist/thread/index.d.ts.map +1 -1
- package/dist/thread/index.js +13 -4
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/index.d.ts +330 -323
- 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/topic/redis/index.d.ts +6 -6
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/vite/index.d.ts +163 -5825
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +130 -477
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +3 -3
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +287 -283
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +15 -11
- package/dist/websocket/index.js.map +1 -1
- package/package.json +86 -17
- 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 +52 -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 -11
- 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 +3 -16
- package/src/cli/apps/AlephaPackageBuilderCli.ts +10 -2
- package/src/cli/atoms/appEntryOptions.ts +13 -0
- package/src/cli/atoms/buildOptions.ts +1 -1
- package/src/cli/atoms/changelogOptions.ts +1 -1
- package/src/cli/commands/build.ts +64 -52
- package/src/cli/commands/db.ts +17 -11
- package/src/cli/commands/deploy.ts +1 -1
- package/src/cli/commands/dev.ts +13 -49
- package/src/cli/commands/gen/env.ts +6 -3
- package/src/cli/commands/gen/openapi.ts +5 -2
- package/src/cli/commands/init.spec.ts +544 -0
- package/src/cli/commands/init.ts +101 -58
- package/src/cli/commands/lint.ts +8 -2
- package/src/cli/commands/typecheck.ts +11 -0
- package/src/cli/defineConfig.ts +9 -0
- package/src/cli/index.ts +2 -1
- package/src/cli/providers/AppEntryProvider.ts +131 -0
- package/src/cli/providers/ViteBuildProvider.ts +40 -0
- package/src/cli/providers/ViteDevServerProvider.ts +378 -0
- package/src/cli/services/AlephaCliUtils.ts +39 -93
- package/src/cli/services/PackageManagerUtils.ts +140 -17
- package/src/cli/services/ProjectScaffolder.ts +169 -101
- package/src/cli/services/ViteUtils.ts +82 -0
- package/src/cli/{assets/claudeMd.ts → templates/agentMd.ts} +41 -28
- package/src/cli/{assets → templates}/apiHelloControllerTs.ts +2 -1
- package/src/cli/{assets → templates}/biomeJson.ts +2 -1
- package/src/cli/{assets → templates}/dummySpecTs.ts +2 -1
- package/src/cli/{assets → templates}/editorconfig.ts +2 -1
- package/src/cli/templates/gitignore.ts +39 -0
- package/src/cli/{assets → templates}/mainBrowserTs.ts +2 -1
- package/src/cli/templates/mainCss.ts +33 -0
- package/src/cli/templates/mainServerTs.ts +33 -0
- package/src/cli/{assets → templates}/tsconfigJson.ts +2 -1
- package/src/cli/templates/webAppRouterTs.ts +50 -0
- package/src/cli/templates/webHelloComponentTsx.ts +20 -0
- package/src/command/helpers/Runner.spec.ts +4 -0
- package/src/command/helpers/Runner.ts +3 -21
- package/src/command/index.ts +12 -4
- package/src/command/providers/CliProvider.spec.ts +1067 -0
- package/src/command/providers/CliProvider.ts +203 -40
- package/src/core/Alepha.ts +3 -9
- 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/primitives/$module.ts +12 -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/core/providers/KeylessJsonSchemaCodec.spec.ts +257 -0
- package/src/core/providers/KeylessJsonSchemaCodec.ts +396 -14
- package/src/core/providers/SchemaValidator.spec.ts +236 -0
- 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/logger/providers/PrettyFormatterProvider.ts +0 -9
- package/src/mcp/errors/McpError.ts +30 -0
- package/src/mcp/index.ts +13 -27
- package/src/mcp/transports/SseMcpTransport.ts +6 -7
- package/src/orm/__tests__/PostgresProvider.spec.ts +2 -2
- package/src/orm/index.browser.ts +2 -2
- package/src/orm/index.bun.ts +4 -2
- package/src/orm/index.ts +21 -47
- package/src/orm/providers/DrizzleKitProvider.ts +3 -5
- package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -0
- package/src/orm/services/Repository.ts +18 -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 +142 -0
- package/src/react/router/primitives/$page.browser.spec.tsx +851 -0
- package/src/react/router/primitives/$page.spec.tsx +708 -0
- package/src/react/router/primitives/$page.ts +497 -0
- package/src/react/router/providers/ReactBrowserProvider.ts +309 -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/ReactServerProvider.spec.tsx +316 -0
- package/src/react/router/providers/ReactServerProvider.ts +558 -0
- package/src/react/router/providers/ReactServerTemplateProvider.ts +979 -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 +13 -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 +36 -22
- 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 +17 -7
- 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/BunHttpServerProvider.ts +1 -1
- package/src/server/core/providers/NodeHttpServerProvider.spec.ts +125 -0
- package/src/server/core/providers/NodeHttpServerProvider.ts +77 -22
- package/src/server/core/providers/ServerLoggerProvider.ts +2 -2
- package/src/server/core/providers/ServerProvider.ts +9 -12
- 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/atoms/apiLinksAtom.ts +7 -0
- package/src/server/links/index.browser.ts +2 -0
- package/src/server/links/index.ts +13 -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 +11 -0
- package/src/system/index.ts +62 -0
- package/src/{file → system}/providers/FileSystemProvider.ts +16 -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 +36 -0
- 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/index.ts +3 -2
- package/src/vite/tasks/buildClient.ts +2 -8
- package/src/vite/tasks/buildServer.ts +84 -21
- package/src/vite/tasks/copyAssets.ts +5 -4
- package/src/vite/tasks/generateSitemap.ts +64 -23
- package/src/vite/tasks/index.ts +0 -2
- package/src/vite/tasks/prerenderPages.ts +49 -24
- package/src/websocket/index.ts +12 -8
- package/dist/file/index.d.ts +0 -839
- package/dist/file/index.d.ts.map +0 -1
- package/dist/file/index.js.map +0 -1
- package/src/cli/assets/indexHtml.ts +0 -15
- package/src/cli/assets/mainServerTs.ts +0 -24
- package/src/cli/assets/webAppRouterTs.ts +0 -15
- package/src/cli/assets/webHelloComponentTsx.ts +0 -16
- package/src/cli/commands/format.ts +0 -23
- package/src/file/index.ts +0 -43
- package/src/vite/helpers/boot.ts +0 -117
- package/src/vite/plugins/viteAlephaDev.ts +0 -177
- package/src/vite/tasks/devServer.ts +0 -71
- package/src/vite/tasks/runAlepha.ts +0 -270
- /package/dist/orm/{chunk-DtkW-qnP.js → chunk-DH6iiROE.js} +0 -0
- /package/src/cli/{assets → templates}/apiIndexTs.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
package/dist/vite/index.js
CHANGED
|
@@ -1,90 +1,13 @@
|
|
|
1
1
|
import m, { createRequire } from "node:module";
|
|
2
|
-
import { access, cp, mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
-
import path, { basename, dirname, join, relative, resolve } from "node:path";
|
|
4
|
-
import { AlephaError } from "alepha";
|
|
5
|
-
import { pathToFileURL } from "node:url";
|
|
6
2
|
import { createHash } from "node:crypto";
|
|
7
3
|
import { existsSync, mkdirSync, promises, writeFileSync } from "node:fs";
|
|
4
|
+
import { basename, dirname, join, relative, resolve } from "node:path";
|
|
8
5
|
import { promisify } from "node:util";
|
|
9
6
|
import { brotliCompress, gzip } from "node:zlib";
|
|
10
7
|
import { analyzer } from "vite-bundle-analyzer";
|
|
8
|
+
import { access, cp, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
9
|
+
import { AlephaError } from "alepha";
|
|
11
10
|
|
|
12
|
-
//#region ../../src/vite/helpers/boot.ts
|
|
13
|
-
/**
|
|
14
|
-
* Remember:
|
|
15
|
-
* At first, functions was inside alepha/vite package, but it's now used in alepha too.
|
|
16
|
-
* For avoiding cli -> vite, all code moved here.
|
|
17
|
-
*/
|
|
18
|
-
/**
|
|
19
|
-
* Server entry files in priority order.
|
|
20
|
-
* main.server.ts is preferred over main.ts for consistency.
|
|
21
|
-
*/
|
|
22
|
-
const SERVER_ENTRIES = [
|
|
23
|
-
"main.server.ts",
|
|
24
|
-
"main.server.tsx",
|
|
25
|
-
"main.ts",
|
|
26
|
-
"main.tsx"
|
|
27
|
-
];
|
|
28
|
-
/**
|
|
29
|
-
* Find browser/client entry file path.
|
|
30
|
-
*/
|
|
31
|
-
const getClientEntry = async (root = process.cwd()) => {
|
|
32
|
-
const indexPath = join(root, "index.html");
|
|
33
|
-
try {
|
|
34
|
-
return extractFirstModuleScriptSrc(await readFile(indexPath, "utf8")).replace(/\\/g, "/");
|
|
35
|
-
} catch {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Find server entry file path.
|
|
41
|
-
*
|
|
42
|
-
* Optimized to use a single readdir() call instead of multiple access() calls.
|
|
43
|
-
*/
|
|
44
|
-
const getServerEntry = async (root = process.cwd(), explicitEntry) => {
|
|
45
|
-
if (explicitEntry) {
|
|
46
|
-
const explicitPath = join(root, explicitEntry);
|
|
47
|
-
try {
|
|
48
|
-
await access(explicitPath);
|
|
49
|
-
return explicitPath;
|
|
50
|
-
} catch {
|
|
51
|
-
throw new AlephaError(`Explicit server entry file "${explicitEntry}" not found.`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const srcDir = join(root, "src");
|
|
55
|
-
try {
|
|
56
|
-
const files = new Set(await readdir(srcDir));
|
|
57
|
-
for (const entry of SERVER_ENTRIES) if (files.has(entry)) return join(srcDir, entry).replace(/\\/g, "/");
|
|
58
|
-
} catch {}
|
|
59
|
-
const clientEntry = await getClientEntry(root);
|
|
60
|
-
if (clientEntry) return clientEntry;
|
|
61
|
-
throw new AlephaError(`Could not find a server entry file. Supported entries: ${SERVER_ENTRIES.map((e) => `src/${e}`).join(", ")}`);
|
|
62
|
-
};
|
|
63
|
-
/**
|
|
64
|
-
* Extract first module script src from HTML.
|
|
65
|
-
*/
|
|
66
|
-
function extractFirstModuleScriptSrc(html) {
|
|
67
|
-
const scriptRegex = /<script\b[^>]*>[\s\S]*?<\/script>/gi;
|
|
68
|
-
let match = scriptRegex.exec(html);
|
|
69
|
-
while (match) {
|
|
70
|
-
const tag = match[0];
|
|
71
|
-
if (/type=["']module["']/i.test(tag)) {
|
|
72
|
-
const entry = tag.match(/\bsrc=["']([^"']+)["']/i)?.[1];
|
|
73
|
-
if (entry) {
|
|
74
|
-
if (entry.startsWith("/")) return entry.substring(1);
|
|
75
|
-
return entry;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
match = scriptRegex.exec(html);
|
|
79
|
-
}
|
|
80
|
-
throw new AlephaError(`No module script found in the provided HTML.`);
|
|
81
|
-
}
|
|
82
|
-
const boot = {
|
|
83
|
-
getClientEntry,
|
|
84
|
-
getServerEntry
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
//#endregion
|
|
88
11
|
//#region ../../src/vite/helpers/createBufferedLogger.ts
|
|
89
12
|
/**
|
|
90
13
|
* Creates a Vite logger that buffers all messages instead of printing them.
|
|
@@ -172,281 +95,20 @@ const importVite = async () => {
|
|
|
172
95
|
} catch (_error) {
|
|
173
96
|
try {
|
|
174
97
|
return createRequire(import.meta.url)("vite");
|
|
175
|
-
} catch (_error
|
|
98
|
+
} catch (_error) {
|
|
176
99
|
throw new Error("Vite is not installed. Please install it with `npm install vite`.");
|
|
177
100
|
}
|
|
178
101
|
}
|
|
179
102
|
};
|
|
180
103
|
|
|
181
104
|
//#endregion
|
|
182
|
-
//#region ../../src/vite/
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
*/
|
|
189
|
-
function createAlephaRunner(opts) {
|
|
190
|
-
return new AlephaRunner({
|
|
191
|
-
root: process.cwd().replace(/\\/g, "/"),
|
|
192
|
-
started: false,
|
|
193
|
-
log: opts.debug ? (...msg) => console.log(...msg) : () => {},
|
|
194
|
-
entry: opts.entry,
|
|
195
|
-
onReload: () => {}
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
var AlephaRunner = class {
|
|
199
|
-
state;
|
|
200
|
-
constructor(state) {
|
|
201
|
-
this.state = state;
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Set resolved Vite config.
|
|
205
|
-
*/
|
|
206
|
-
setConfig(config) {
|
|
207
|
-
this.state.config = config;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Check if SSR is enabled for the running app.
|
|
211
|
-
*/
|
|
212
|
-
isSsrEnabled() {
|
|
213
|
-
if (!this.state.app) return false;
|
|
214
|
-
return this.state.app.store.get("alepha.react.server.ssr") ?? false;
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Check if app is started.
|
|
218
|
-
*/
|
|
219
|
-
get isStarted() {
|
|
220
|
-
return this.state.started;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Get the running Alepha app instance.
|
|
224
|
-
*/
|
|
225
|
-
get app() {
|
|
226
|
-
return this.state.app;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Start the Alepha application.
|
|
230
|
-
*/
|
|
231
|
-
async start(server) {
|
|
232
|
-
const { loadEnv } = await importVite();
|
|
233
|
-
global.ssrFixStacktrace = (e) => {
|
|
234
|
-
server.ssrFixStacktrace(e);
|
|
235
|
-
let it = e;
|
|
236
|
-
do {
|
|
237
|
-
server.ssrFixStacktrace(it);
|
|
238
|
-
it = it.cause;
|
|
239
|
-
} while (it instanceof Error);
|
|
240
|
-
};
|
|
241
|
-
if (this.state.started) {
|
|
242
|
-
await this.restart(server, true);
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
if (!this.state.config) {
|
|
246
|
-
this.state.log("[DEBUG] No config - skip starting");
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
this.state.onReload?.();
|
|
250
|
-
this.state.log("[DEBUG] Starting Alepha app...");
|
|
251
|
-
this.state.started = false;
|
|
252
|
-
this.state.app = void 0;
|
|
253
|
-
const fileUrl = pathToFileURL(`${path.resolve(this.state.config.root, this.state.entry)}`).href;
|
|
254
|
-
const env = loadEnv("development", this.state.config.root, "");
|
|
255
|
-
const before = { ...process.env };
|
|
256
|
-
for (const key in env) process.env[key] = env[key];
|
|
257
|
-
let port = 5173;
|
|
258
|
-
const address = server.httpServer?.address();
|
|
259
|
-
if (typeof address === "object" && address?.port) port = address.port;
|
|
260
|
-
process.env.NODE_ENV ??= "development";
|
|
261
|
-
process.env.VITE_ALEPHA_DEV = "true";
|
|
262
|
-
process.env.SERVER_HOST ??= typeof server.config.server.host === "string" ? server.config.server.host : "localhost";
|
|
263
|
-
process.env.SERVER_PORT ??= String(port);
|
|
264
|
-
try {
|
|
265
|
-
const now = Date.now();
|
|
266
|
-
await server.ssrLoadModule(fileUrl, { fixStacktrace: true });
|
|
267
|
-
this.state.log(`[DEBUG] Alepha app loaded in ${Date.now() - now}ms`);
|
|
268
|
-
await new Promise((r) => setTimeout(r, 10));
|
|
269
|
-
this.state.app = globalThis.__alepha;
|
|
270
|
-
if (!this.state.app) {
|
|
271
|
-
this.state.log("[DEBUG] No app found - skip starting");
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
this.state.app.store.set("alepha.node.server", server.httpServer);
|
|
275
|
-
console.log("");
|
|
276
|
-
await this.state.app.start();
|
|
277
|
-
this.state.started = true;
|
|
278
|
-
process.env = { ...before };
|
|
279
|
-
this.state.log("[DEBUG] Starting Done!");
|
|
280
|
-
} catch (e) {
|
|
281
|
-
if (e instanceof Error) {
|
|
282
|
-
let it = e;
|
|
283
|
-
do {
|
|
284
|
-
server.ssrFixStacktrace(it);
|
|
285
|
-
it = it.cause;
|
|
286
|
-
} while (it instanceof Error);
|
|
287
|
-
server.ssrFixStacktrace(e);
|
|
288
|
-
if (e.cause instanceof Error) server.ssrFixStacktrace(e.cause);
|
|
289
|
-
this.state.app?.log?.error("App failed to start:", e);
|
|
290
|
-
this.state.app?.log?.info("Waiting for changes to restart...");
|
|
291
|
-
}
|
|
292
|
-
this.state.log("[DEBUG] Alepha app start error");
|
|
293
|
-
this.state.started = false;
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Stop the Alepha application.
|
|
298
|
-
*/
|
|
299
|
-
async stop() {
|
|
300
|
-
if (this.state.app?.stop && this.state.started) {
|
|
301
|
-
this.state.log("[DEBUG] Stopping Alepha app...");
|
|
302
|
-
await this.state.app.stop();
|
|
303
|
-
this.state.started = false;
|
|
304
|
-
this.state.log("[DEBUG] Stopping Done!");
|
|
305
|
-
} else this.state.log("[DEBUG] Alepha app not started - skip stop");
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Restart the Alepha application.
|
|
309
|
-
*
|
|
310
|
-
* @returns true if the restart was skipped due to locking
|
|
311
|
-
*/
|
|
312
|
-
async restart(server, invalidate) {
|
|
313
|
-
if (this.state.lock) {
|
|
314
|
-
this.state.log("[DEBUG] STILL LOCKING");
|
|
315
|
-
return true;
|
|
316
|
-
}
|
|
317
|
-
this.state.log("[DEBUG] LOCK RESTART");
|
|
318
|
-
this.state.lock = Promise.withResolvers();
|
|
319
|
-
const now = Date.now();
|
|
320
|
-
this.state.log("[DEBUG] RESTART");
|
|
321
|
-
await this.stop();
|
|
322
|
-
this.state.log(`[DEBUG] RESTART (stop) in ${Date.now() - now}ms`);
|
|
323
|
-
if (invalidate) server.moduleGraph.invalidateAll();
|
|
324
|
-
await this.start(server);
|
|
325
|
-
this.state.log(`[DEBUG] RESTART OK in ${Date.now() - now}ms`);
|
|
326
|
-
setTimeout(() => {
|
|
327
|
-
this.state.log("[DEBUG] UNLOCK RESTART");
|
|
328
|
-
this.state.lock?.resolve();
|
|
329
|
-
this.state.lock = void 0;
|
|
330
|
-
}, 500);
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Send reload event to client.
|
|
335
|
-
*/
|
|
336
|
-
sendReload(server) {
|
|
337
|
-
server.ws.send({
|
|
338
|
-
type: "custom",
|
|
339
|
-
event: "alepha:reload",
|
|
340
|
-
data: {}
|
|
341
|
-
});
|
|
342
|
-
}
|
|
105
|
+
//#region ../../src/vite/helpers/importViteReact.ts
|
|
106
|
+
const importViteReact = async () => {
|
|
107
|
+
try {
|
|
108
|
+
const { default: viteReact } = createRequire(import.meta.url)("@vitejs/plugin-react");
|
|
109
|
+
return viteReact;
|
|
110
|
+
} catch {}
|
|
343
111
|
};
|
|
344
|
-
/**
|
|
345
|
-
* Check if a URL path is a Vite internal file.
|
|
346
|
-
*/
|
|
347
|
-
function isViteInternalPath(pathname) {
|
|
348
|
-
const [path$1] = pathname.split("?");
|
|
349
|
-
if (path$1.startsWith("/@") || path$1.startsWith("/src") || path$1.includes("/node_modules/")) return true;
|
|
350
|
-
return false;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
//#endregion
|
|
354
|
-
//#region ../../src/vite/plugins/viteAlephaDev.ts
|
|
355
|
-
/**
|
|
356
|
-
* Plug Alepha into Vite development server.
|
|
357
|
-
*
|
|
358
|
-
* This plugin manages the Alepha application lifecycle during development,
|
|
359
|
-
* handling hot module replacement and request forwarding.
|
|
360
|
-
*/
|
|
361
|
-
async function viteAlephaDev(options = {}) {
|
|
362
|
-
let entry = options.serverEntry;
|
|
363
|
-
if (!entry) {
|
|
364
|
-
entry = await boot.getServerEntry();
|
|
365
|
-
if (!entry) return {
|
|
366
|
-
name: "alepha-dev",
|
|
367
|
-
apply: "serve",
|
|
368
|
-
config() {}
|
|
369
|
-
};
|
|
370
|
-
}
|
|
371
|
-
const runner = createAlephaRunner({
|
|
372
|
-
entry,
|
|
373
|
-
debug: options.debug
|
|
374
|
-
});
|
|
375
|
-
const { loadEnv } = await importVite();
|
|
376
|
-
const env = loadEnv("development", process.cwd(), "SERVER");
|
|
377
|
-
const config = {};
|
|
378
|
-
if (env.SERVER_PORT) config.server = { port: parseInt(env.SERVER_PORT, 10) };
|
|
379
|
-
return {
|
|
380
|
-
name: "alepha-dev",
|
|
381
|
-
apply: "serve",
|
|
382
|
-
config: () => config,
|
|
383
|
-
configResolved(resolvedConfig) {
|
|
384
|
-
runner.setConfig(resolvedConfig);
|
|
385
|
-
},
|
|
386
|
-
async handleHotUpdate(ctx) {
|
|
387
|
-
if (options.debug) console.log("[DEBUG] HMR", ctx.file);
|
|
388
|
-
if (ctx.file.includes("/.idea/")) return [];
|
|
389
|
-
const isServerOnly = !ctx.modules[0]?._clientModule;
|
|
390
|
-
const isBrowserOnly = !ctx.modules[0]?._ssrModule;
|
|
391
|
-
const isSsrEnabled = runner.isSsrEnabled();
|
|
392
|
-
if (isBrowserOnly) {
|
|
393
|
-
if (options.debug) console.log("[DEBUG] HMR - browser only - no reason to reload server");
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
const root = process.cwd().replace(/\\/g, "/");
|
|
397
|
-
const invalidate = !ctx.file.startsWith(root);
|
|
398
|
-
if (invalidate && options.debug) console.log("[DEBUG] HMR - outside root - invalidate all");
|
|
399
|
-
if (!isSsrEnabled && isServerOnly) {
|
|
400
|
-
await runner.restart(ctx.server, invalidate);
|
|
401
|
-
return [];
|
|
402
|
-
}
|
|
403
|
-
if (isSsrEnabled && ctx.modules[0]) {
|
|
404
|
-
if (await runner.restart(ctx.server, invalidate)) return [];
|
|
405
|
-
if (!runner.isStarted) {
|
|
406
|
-
if (options.debug) console.log("[DEBUG] HMR - abort due to app not started");
|
|
407
|
-
return [];
|
|
408
|
-
}
|
|
409
|
-
if (isServerOnly && runner.isStarted) {
|
|
410
|
-
runner.sendReload(ctx.server);
|
|
411
|
-
return [];
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
},
|
|
415
|
-
async configureServer(server) {
|
|
416
|
-
if (env.SERVER_PORT) server.config.server.port = parseInt(env.SERVER_PORT, 10);
|
|
417
|
-
const middleware = (req, res, next) => {
|
|
418
|
-
if (runner.isStarted && runner.app && req.url && !isViteInternalPath(req.url)) {
|
|
419
|
-
let ended = false;
|
|
420
|
-
const writeHead = res.writeHead.bind(res);
|
|
421
|
-
res.writeHead = (...args) => {
|
|
422
|
-
ended = true;
|
|
423
|
-
return writeHead(args[0], args[1], args[2]);
|
|
424
|
-
};
|
|
425
|
-
return runner.app.events.emit("node:request", {
|
|
426
|
-
req,
|
|
427
|
-
res
|
|
428
|
-
}).then(() => {
|
|
429
|
-
if (!ended) next();
|
|
430
|
-
});
|
|
431
|
-
}
|
|
432
|
-
next();
|
|
433
|
-
};
|
|
434
|
-
server.middlewares.use((req, res, next) => {
|
|
435
|
-
middleware(req, res, next);
|
|
436
|
-
});
|
|
437
|
-
server.config.logger.info = (msg) => {
|
|
438
|
-
console.log(msg);
|
|
439
|
-
};
|
|
440
|
-
server.config.logger.clearScreen = () => {};
|
|
441
|
-
return () => {
|
|
442
|
-
server.httpServer?.once("listening", () => {
|
|
443
|
-
runner.start(server);
|
|
444
|
-
});
|
|
445
|
-
};
|
|
446
|
-
},
|
|
447
|
-
async closeBundle() {}
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
112
|
|
|
451
113
|
//#endregion
|
|
452
114
|
//#region ../../src/vite/plugins/viteAlephaSsrPreload.ts
|
|
@@ -609,11 +271,11 @@ function viteCompress(options = {}) {
|
|
|
609
271
|
};
|
|
610
272
|
}
|
|
611
273
|
async function compressFile(options = {}, filePath) {
|
|
612
|
-
const { brotli = true, gzip
|
|
274
|
+
const { brotli = true, gzip = true } = options;
|
|
613
275
|
const compressionTasks = [];
|
|
614
276
|
const fileContentPromise = promises.readFile(filePath);
|
|
615
|
-
if (gzip
|
|
616
|
-
const gzipOptions = typeof gzip
|
|
277
|
+
if (gzip) {
|
|
278
|
+
const gzipOptions = typeof gzip === "object" ? gzip : { level: 9 };
|
|
617
279
|
compressionTasks.push(fileContentPromise.then(async (content) => {
|
|
618
280
|
const compressed = await gzipCompress(content, gzipOptions);
|
|
619
281
|
await promises.writeFile(`${filePath}.gz`, compressed);
|
|
@@ -629,15 +291,6 @@ async function compressFile(options = {}, filePath) {
|
|
|
629
291
|
await Promise.all(compressionTasks);
|
|
630
292
|
}
|
|
631
293
|
|
|
632
|
-
//#endregion
|
|
633
|
-
//#region ../../src/vite/helpers/importViteReact.ts
|
|
634
|
-
const importViteReact = async () => {
|
|
635
|
-
try {
|
|
636
|
-
const { default: viteReact } = createRequire(import.meta.url)("@vitejs/plugin-react");
|
|
637
|
-
return viteReact;
|
|
638
|
-
} catch {}
|
|
639
|
-
};
|
|
640
|
-
|
|
641
294
|
//#endregion
|
|
642
295
|
//#region ../../src/vite/tasks/buildClient.ts
|
|
643
296
|
/**
|
|
@@ -647,7 +300,7 @@ const importViteReact = async () => {
|
|
|
647
300
|
* including code splitting, minification, and optional compression.
|
|
648
301
|
*/
|
|
649
302
|
async function buildClient(opts) {
|
|
650
|
-
const { build: viteBuild
|
|
303
|
+
const { build: viteBuild } = await importVite();
|
|
651
304
|
const plugins = [];
|
|
652
305
|
const viteReact = await importViteReact();
|
|
653
306
|
if (viteReact) plugins.push(viteReact());
|
|
@@ -665,7 +318,6 @@ async function buildClient(opts) {
|
|
|
665
318
|
chunkSizeWarningLimit: 1e3,
|
|
666
319
|
outDir: opts.dist,
|
|
667
320
|
manifest: true,
|
|
668
|
-
ssrManifest: true,
|
|
669
321
|
rollupOptions: { output: {
|
|
670
322
|
entryFileNames: "entry.[hash].js",
|
|
671
323
|
chunkFileNames: "chunk.[hash].js",
|
|
@@ -677,7 +329,7 @@ async function buildClient(opts) {
|
|
|
677
329
|
plugins
|
|
678
330
|
};
|
|
679
331
|
try {
|
|
680
|
-
await viteBuild(
|
|
332
|
+
await viteBuild(viteBuildClientConfig);
|
|
681
333
|
} catch (error) {
|
|
682
334
|
logger?.flush();
|
|
683
335
|
throw error;
|
|
@@ -721,7 +373,7 @@ async function generateExternals(opts) {
|
|
|
721
373
|
* the dist/index.js entry wrapper.
|
|
722
374
|
*/
|
|
723
375
|
async function buildServer(opts) {
|
|
724
|
-
const { build: viteBuild,
|
|
376
|
+
const { build: viteBuild, resolveConfig } = await importVite();
|
|
725
377
|
const plugins = [];
|
|
726
378
|
const viteReact = await importViteReact();
|
|
727
379
|
if (viteReact && opts.clientDir) plugins.push(viteReact());
|
|
@@ -769,12 +421,14 @@ async function buildServer(opts) {
|
|
|
769
421
|
};
|
|
770
422
|
let result;
|
|
771
423
|
try {
|
|
772
|
-
result = await viteBuild(
|
|
424
|
+
result = await viteBuild(viteBuildServerConfig);
|
|
773
425
|
} catch (error) {
|
|
774
426
|
logger?.flush();
|
|
775
427
|
throw error;
|
|
776
428
|
}
|
|
777
|
-
const
|
|
429
|
+
const resolvedConfig = await resolveConfig(viteBuildServerConfig, "build");
|
|
430
|
+
const externals = [];
|
|
431
|
+
if (Array.isArray(resolvedConfig?.ssr?.external)) externals.push(...resolvedConfig.ssr.external);
|
|
778
432
|
await generateExternals({
|
|
779
433
|
distDir: opts.distDir,
|
|
780
434
|
externals
|
|
@@ -783,14 +437,22 @@ async function buildServer(opts) {
|
|
|
783
437
|
let template = "";
|
|
784
438
|
if (opts.clientDir) template = `__alepha.set("alepha.react.server.template", \`${(await readFile(`${opts.distDir}/${opts.clientDir}/index.html`, "utf-8")).replace(/>\s*</g, "><").trim()}\`);\n`;
|
|
785
439
|
let manifest = "";
|
|
440
|
+
let manifestData;
|
|
786
441
|
if (opts.clientDir) {
|
|
787
442
|
const viteDir = `${opts.distDir}/${opts.clientDir}/.vite`;
|
|
788
|
-
const
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
443
|
+
const clientManifest = await loadJsonFile(`${viteDir}/manifest.json`);
|
|
444
|
+
const preloadManifest = await loadJsonFile(`${viteDir}/preload-manifest.json`);
|
|
445
|
+
const strippedClientManifest = stripClientManifest(clientManifest);
|
|
446
|
+
let base = resolvedConfig.base || "/";
|
|
447
|
+
if (!base.startsWith("/")) base = `/${base}`;
|
|
448
|
+
if (base.length > 1 && base.endsWith("/")) base = base.slice(0, -1);
|
|
449
|
+
manifestData = {
|
|
450
|
+
base: base !== "/" ? base : void 0,
|
|
451
|
+
client: strippedClientManifest,
|
|
452
|
+
preload: preloadManifest
|
|
792
453
|
};
|
|
793
|
-
manifest = `__alepha.set("alepha.react.ssr.manifest", ${JSON.stringify(
|
|
454
|
+
manifest = `__alepha.set("alepha.react.ssr.manifest", ${JSON.stringify(manifestData)});\n`;
|
|
455
|
+
opts.alepha.store.set("alepha.react.ssr.manifest", manifestData);
|
|
794
456
|
await rm(viteDir, {
|
|
795
457
|
recursive: true,
|
|
796
458
|
force: true
|
|
@@ -799,20 +461,38 @@ async function buildServer(opts) {
|
|
|
799
461
|
await writeFile(`${opts.distDir}/index.js`, `// This file was automatically generated. DO NOT MODIFY.
|
|
800
462
|
// Changes to this file will be lost when the code is regenerated.
|
|
801
463
|
\n${template}${manifest}import './server/${entryFile}';\n`.trim());
|
|
802
|
-
return {
|
|
464
|
+
return {
|
|
465
|
+
entryFile,
|
|
466
|
+
manifest: manifestData
|
|
467
|
+
};
|
|
803
468
|
}
|
|
804
469
|
/**
|
|
805
470
|
* Load a JSON file, returning undefined if it doesn't exist.
|
|
806
471
|
*/
|
|
807
|
-
async function loadJsonFile(path
|
|
472
|
+
async function loadJsonFile(path) {
|
|
808
473
|
try {
|
|
809
|
-
const content = await readFile(path
|
|
474
|
+
const content = await readFile(path, "utf-8");
|
|
810
475
|
return JSON.parse(content);
|
|
811
476
|
} catch {
|
|
812
477
|
return;
|
|
813
478
|
}
|
|
814
479
|
}
|
|
815
480
|
/**
|
|
481
|
+
* Strip unused fields from client manifest to reduce bundle size.
|
|
482
|
+
* Only keeps: file, isEntry, imports, css
|
|
483
|
+
*/
|
|
484
|
+
function stripClientManifest(manifest) {
|
|
485
|
+
if (!manifest) return void 0;
|
|
486
|
+
const stripped = {};
|
|
487
|
+
for (const [key, entry] of Object.entries(manifest)) stripped[key] = {
|
|
488
|
+
file: entry.file,
|
|
489
|
+
...entry.isEntry && { isEntry: entry.isEntry },
|
|
490
|
+
...entry.imports?.length && { imports: entry.imports },
|
|
491
|
+
...entry.css?.length && { css: entry.css }
|
|
492
|
+
};
|
|
493
|
+
return stripped;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
816
496
|
* Extract entry filename from Vite build result.
|
|
817
497
|
*/
|
|
818
498
|
function extractEntryFromBundle(entry, result) {
|
|
@@ -822,28 +502,6 @@ function extractEntryFromBundle(entry, result) {
|
|
|
822
502
|
return entryFile;
|
|
823
503
|
}
|
|
824
504
|
|
|
825
|
-
//#endregion
|
|
826
|
-
//#region ../../src/vite/helpers/importAlepha.ts
|
|
827
|
-
/**
|
|
828
|
-
* Import Alepha instance from a transpiled server entry file.
|
|
829
|
-
*/
|
|
830
|
-
const importAlepha = async (entry, options) => {
|
|
831
|
-
if (global.__cli_alepha) return global.__cli_alepha;
|
|
832
|
-
const { loadEnv } = await importVite();
|
|
833
|
-
const env = loadEnv("development", process.cwd(), "");
|
|
834
|
-
for (const key in env) process.env[key] = env[key];
|
|
835
|
-
if (options?.env) for (const key in options.env) process.env[key] = options.env[key];
|
|
836
|
-
process.env.ALEPHA_CLI_IMPORT = "true";
|
|
837
|
-
process.env.LOG_LEVEL = "error";
|
|
838
|
-
process.env.LOG_FORMAT = "pretty";
|
|
839
|
-
process.env.NODE_ENV = "production";
|
|
840
|
-
const mod = await import(pathToFileURL(join(process.cwd(), entry)).href);
|
|
841
|
-
if (mod.default) return mod.default;
|
|
842
|
-
const alepha = global.__cli_alepha;
|
|
843
|
-
if (!alepha) throw new AlephaError("Alepha instance not found. Ensure Alepha is initialized.");
|
|
844
|
-
return alepha;
|
|
845
|
-
};
|
|
846
|
-
|
|
847
505
|
//#endregion
|
|
848
506
|
//#region ../../src/vite/tasks/copyAssets.ts
|
|
849
507
|
/**
|
|
@@ -856,8 +514,8 @@ const importAlepha = async (entry, options) => {
|
|
|
856
514
|
* Used by modules like AlephaServerSwagger to distribute UI files.
|
|
857
515
|
*/
|
|
858
516
|
async function copyAssets(opts) {
|
|
859
|
-
const root = opts.root
|
|
860
|
-
const assets =
|
|
517
|
+
const root = opts.root;
|
|
518
|
+
const assets = opts.alepha.store.get("alepha.build.assets");
|
|
861
519
|
if (!assets || assets.length === 0) return;
|
|
862
520
|
const fn = async () => {
|
|
863
521
|
const require = createRequire(join(root, opts.entry));
|
|
@@ -872,39 +530,6 @@ async function copyAssets(opts) {
|
|
|
872
530
|
else await fn();
|
|
873
531
|
}
|
|
874
532
|
|
|
875
|
-
//#endregion
|
|
876
|
-
//#region ../../src/vite/tasks/devServer.ts
|
|
877
|
-
/**
|
|
878
|
-
* Start Vite development server with Alepha plugins.
|
|
879
|
-
*
|
|
880
|
-
* This task starts the Vite dev server with all required plugins:
|
|
881
|
-
* - @vitejs/plugin-react (JSX/TSX compilation)
|
|
882
|
-
* - viteAlephaDev (Alepha server integration)
|
|
883
|
-
* - viteAlephaSsrPreload (SSR module preloading)
|
|
884
|
-
*/
|
|
885
|
-
async function devServer(opts = {}) {
|
|
886
|
-
const { createServer, mergeConfig } = await importVite();
|
|
887
|
-
const plugins = [];
|
|
888
|
-
const viteReact = await importViteReact();
|
|
889
|
-
if (viteReact) plugins.push(viteReact());
|
|
890
|
-
plugins.push(viteAlephaSsrPreload());
|
|
891
|
-
plugins.push(await viteAlephaDev({
|
|
892
|
-
serverEntry: opts.entry,
|
|
893
|
-
debug: opts.debug
|
|
894
|
-
}));
|
|
895
|
-
const server = await createServer(mergeConfig({
|
|
896
|
-
plugins,
|
|
897
|
-
server: {
|
|
898
|
-
port: opts.port,
|
|
899
|
-
host: opts.host
|
|
900
|
-
}
|
|
901
|
-
}, {}));
|
|
902
|
-
await server.listen();
|
|
903
|
-
console.log("");
|
|
904
|
-
server.printUrls();
|
|
905
|
-
server.bindCLIShortcuts({ print: true });
|
|
906
|
-
}
|
|
907
|
-
|
|
908
533
|
//#endregion
|
|
909
534
|
//#region ../../src/vite/tasks/generateCloudflare.ts
|
|
910
535
|
const WARNING_COMMENT$1 = "// This file was automatically generated. DO NOT MODIFY.\n// Changes to this file will be lost when the code is regenerated.\n";
|
|
@@ -938,15 +563,15 @@ async function generateCloudflare(opts = {}) {
|
|
|
938
563
|
};
|
|
939
564
|
const url = process.env.DATABASE_URL;
|
|
940
565
|
if (url?.startsWith("cloudflare-d1:")) {
|
|
941
|
-
const [name
|
|
566
|
+
const [name, id] = url.replace("cloudflare-d1://", "").replace("cloudflare-d1:", "").split(":");
|
|
942
567
|
wrangler.d1_databases = wrangler.d1_databases || [];
|
|
943
568
|
wrangler.d1_databases.push({
|
|
944
|
-
binding: name
|
|
945
|
-
database_name: name
|
|
569
|
+
binding: name,
|
|
570
|
+
database_name: name,
|
|
946
571
|
database_id: id
|
|
947
572
|
});
|
|
948
573
|
wrangler.vars ??= {};
|
|
949
|
-
wrangler.vars.DATABASE_URL = `cloudflare-d1://${name
|
|
574
|
+
wrangler.vars.DATABASE_URL = `cloudflare-d1://${name}:${id}`;
|
|
950
575
|
}
|
|
951
576
|
await writeFile(join(root, distDir, "wrangler.jsonc"), JSON.stringify(wrangler, null, 2));
|
|
952
577
|
await writeWorkerEntryPoint(root, distDir);
|
|
@@ -976,8 +601,8 @@ export default {
|
|
|
976
601
|
|
|
977
602
|
//#endregion
|
|
978
603
|
//#region ../../src/vite/helpers/fileExists.ts
|
|
979
|
-
const fileExists = async (path
|
|
980
|
-
return await access(join(process.cwd(), path
|
|
604
|
+
const fileExists = async (path) => {
|
|
605
|
+
return await access(join(process.cwd(), path)).then(() => true).catch(() => false);
|
|
981
606
|
};
|
|
982
607
|
|
|
983
608
|
//#endregion
|
|
@@ -1023,41 +648,56 @@ CMD ["${command}", "index.js"]
|
|
|
1023
648
|
/**
|
|
1024
649
|
* Generate sitemap.xml from Alepha page primitives.
|
|
1025
650
|
*
|
|
1026
|
-
*
|
|
1027
|
-
* queries all page primitives, and generates a sitemap.xml
|
|
651
|
+
* Queries all page primitives and generates a sitemap.xml
|
|
1028
652
|
* containing URLs for all accessible pages.
|
|
1029
653
|
*/
|
|
1030
654
|
async function generateSitemap(opts) {
|
|
1031
|
-
const
|
|
1032
|
-
if (
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
655
|
+
const pages = getSitemapPages(opts.alepha);
|
|
656
|
+
if (pages.length === 0) return "";
|
|
657
|
+
let result = "";
|
|
658
|
+
const fn = async () => {
|
|
659
|
+
result = generateSitemapFromPages(pages, opts.baseUrl);
|
|
660
|
+
if (opts.output) await writeFile(opts.output, result);
|
|
661
|
+
};
|
|
662
|
+
if (opts.run) await opts.run({
|
|
663
|
+
name: "generate sitemap",
|
|
664
|
+
handler: fn
|
|
665
|
+
});
|
|
666
|
+
else await fn();
|
|
667
|
+
return result;
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* Get all pages that should be included in the sitemap.
|
|
671
|
+
*/
|
|
672
|
+
function getSitemapPages(alepha) {
|
|
673
|
+
return alepha.primitives("page").filter((page) => {
|
|
674
|
+
const options = page.options;
|
|
675
|
+
if (options.children) return false;
|
|
676
|
+
if (!options.schema?.params) return true;
|
|
677
|
+
if (options.static && typeof options.static === "object" && options.static.entries) return true;
|
|
678
|
+
return false;
|
|
679
|
+
});
|
|
1038
680
|
}
|
|
1039
|
-
function
|
|
1040
|
-
const pages = alepha.primitives("page");
|
|
681
|
+
function generateSitemapFromPages(pages, baseUrl) {
|
|
1041
682
|
const urls = [];
|
|
683
|
+
const normalizedBaseUrl = baseUrl.replace(/\/$/, "");
|
|
1042
684
|
for (const page of pages) {
|
|
1043
685
|
const options = page.options;
|
|
1044
|
-
if (options.children) continue;
|
|
1045
686
|
if (!options.schema?.params) {
|
|
1046
|
-
const path
|
|
1047
|
-
const url = `${
|
|
687
|
+
const path = options.path || "";
|
|
688
|
+
const url = `${normalizedBaseUrl}${path === "" ? "/" : path}`;
|
|
1048
689
|
urls.push(url);
|
|
1049
690
|
} else if (options.static && typeof options.static === "object" && options.static.entries) for (const entry of options.static.entries) {
|
|
1050
|
-
const
|
|
1051
|
-
const url = `${baseUrl.replace(/\/$/, "")}${path$1}`;
|
|
691
|
+
const url = `${normalizedBaseUrl}${buildPathFromParams(options.path || "", entry.params || {})}`;
|
|
1052
692
|
urls.push(url);
|
|
1053
693
|
}
|
|
1054
694
|
}
|
|
1055
695
|
return buildSitemapXml(urls);
|
|
1056
696
|
}
|
|
1057
697
|
function buildPathFromParams(pathPattern, params) {
|
|
1058
|
-
let path
|
|
1059
|
-
for (const [key, value] of Object.entries(params)) path
|
|
1060
|
-
return path
|
|
698
|
+
let path = pathPattern;
|
|
699
|
+
for (const [key, value] of Object.entries(params)) path = path.replace(`:${key}`, String(value));
|
|
700
|
+
return path || "/";
|
|
1061
701
|
}
|
|
1062
702
|
function buildSitemapXml(urls) {
|
|
1063
703
|
const lastMod = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
@@ -1097,8 +737,8 @@ async function generateVercel(opts = {}) {
|
|
|
1097
737
|
/**
|
|
1098
738
|
* Check if a file or directory exists at the given path
|
|
1099
739
|
*/
|
|
1100
|
-
async function exists(path
|
|
1101
|
-
return stat(path
|
|
740
|
+
async function exists(path) {
|
|
741
|
+
return stat(path).then(() => true).catch(() => false);
|
|
1102
742
|
}
|
|
1103
743
|
/**
|
|
1104
744
|
* Create the serverless function entry point that bootstraps Alepha and handles requests
|
|
@@ -1144,10 +784,10 @@ async function writeProjectConfig(distDir, projectId, projectName, orgId) {
|
|
|
1144
784
|
* Create the client directory with a .keep file if it doesn't exist to avoid Vercel errors
|
|
1145
785
|
*/
|
|
1146
786
|
async function ensureClientDir(distDir, clientDir) {
|
|
1147
|
-
const path
|
|
1148
|
-
if (!await exists(path
|
|
1149
|
-
await mkdir(path
|
|
1150
|
-
await writeFile(`${path
|
|
787
|
+
const path = `${distDir}/${clientDir}`;
|
|
788
|
+
if (!await exists(path)) {
|
|
789
|
+
await mkdir(path, { recursive: true });
|
|
790
|
+
await writeFile(`${path}/.keep`, "");
|
|
1151
791
|
}
|
|
1152
792
|
}
|
|
1153
793
|
|
|
@@ -1156,26 +796,39 @@ async function ensureClientDir(distDir, clientDir) {
|
|
|
1156
796
|
/**
|
|
1157
797
|
* Pre-render static pages defined in the Alepha application.
|
|
1158
798
|
*
|
|
1159
|
-
*
|
|
1160
|
-
*
|
|
1161
|
-
*
|
|
1162
|
-
* `static.entries` configuration.
|
|
799
|
+
* Queries all page primitives with `static: true` and generates
|
|
800
|
+
* static HTML files for each page. Supports pages with parameterized
|
|
801
|
+
* routes via `static.entries` configuration.
|
|
1163
802
|
*/
|
|
1164
803
|
async function prerenderPages(opts) {
|
|
1165
|
-
const alepha =
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
804
|
+
const alepha = opts.alepha;
|
|
805
|
+
const pages = getStaticPages(alepha);
|
|
806
|
+
if (pages.length === 0) return { count: 0 };
|
|
807
|
+
let result = { count: 0 };
|
|
808
|
+
const fn = async () => {
|
|
809
|
+
if (!alepha.isConfigured()) await alepha.events.emit("configure", alepha);
|
|
810
|
+
result = await prerenderFromAlepha(pages, opts.dist, opts.compress);
|
|
811
|
+
};
|
|
812
|
+
if (opts.run) await opts.run({
|
|
813
|
+
name: "pre-render pages",
|
|
814
|
+
handler: fn
|
|
815
|
+
});
|
|
816
|
+
else await fn();
|
|
817
|
+
return result;
|
|
818
|
+
}
|
|
819
|
+
/**
|
|
820
|
+
* Get all static pages from the Alepha instance.
|
|
821
|
+
*/
|
|
822
|
+
function getStaticPages(alepha) {
|
|
823
|
+
return alepha.primitives("page").filter((page) => {
|
|
824
|
+
const options = page.options;
|
|
825
|
+
return options.static && !options.children;
|
|
826
|
+
});
|
|
1171
827
|
}
|
|
1172
|
-
async function prerenderFromAlepha(
|
|
828
|
+
async function prerenderFromAlepha(pages, dist, compress) {
|
|
1173
829
|
let count = 0;
|
|
1174
|
-
const pages = alepha.primitives("page");
|
|
1175
830
|
for (const page of pages) {
|
|
1176
831
|
const options = page.options;
|
|
1177
|
-
if (options.children) continue;
|
|
1178
|
-
if (!options.static) continue;
|
|
1179
832
|
const config = typeof options.static === "object" ? options.static : {};
|
|
1180
833
|
if (!options.schema?.params) {
|
|
1181
834
|
count += 1;
|
|
@@ -1202,5 +855,5 @@ async function renderFile(page, options, dist, compress) {
|
|
|
1202
855
|
}
|
|
1203
856
|
|
|
1204
857
|
//#endregion
|
|
1205
|
-
export {
|
|
858
|
+
export { buildClient, buildServer, compressFile, copyAssets, createBufferedLogger, generateCloudflare, generateDocker, generateExternals, generateSitemap, generateVercel, importVite, importViteReact, prerenderPages, viteAlephaSsrPreload, viteCompress };
|
|
1206
859
|
//# sourceMappingURL=index.js.map
|