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
|
@@ -20,6 +20,7 @@ import type {
|
|
|
20
20
|
ServerRequest,
|
|
21
21
|
ServerResponseBody,
|
|
22
22
|
ServerRoute,
|
|
23
|
+
TRequestBody,
|
|
23
24
|
} from "../interfaces/ServerRequest.ts";
|
|
24
25
|
import { ServerProvider } from "../providers/ServerProvider.ts";
|
|
25
26
|
import { ServerRouterProvider } from "../providers/ServerRouterProvider.ts";
|
|
@@ -445,7 +446,9 @@ export type ClientRequestEntry<
|
|
|
445
446
|
};
|
|
446
447
|
|
|
447
448
|
export type ClientRequestEntryContainer<TConfig extends RequestConfigSchema> = {
|
|
448
|
-
body: TConfig["body"] extends
|
|
449
|
+
body: TConfig["body"] extends TRequestBody
|
|
450
|
+
? Static<TConfig["body"]>
|
|
451
|
+
: undefined;
|
|
449
452
|
|
|
450
453
|
params: TConfig["params"] extends TObject
|
|
451
454
|
? Static<TConfig["params"]>
|
|
@@ -453,11 +456,11 @@ export type ClientRequestEntryContainer<TConfig extends RequestConfigSchema> = {
|
|
|
453
456
|
|
|
454
457
|
headers?: TConfig["headers"] extends TObject
|
|
455
458
|
? Static<TConfig["headers"]>
|
|
456
|
-
:
|
|
459
|
+
: Record<string, string>;
|
|
457
460
|
|
|
458
461
|
query?: TConfig["query"] extends TObject
|
|
459
462
|
? Partial<Static<TConfig["query"]>>
|
|
460
|
-
:
|
|
463
|
+
: Record<string, string>;
|
|
461
464
|
};
|
|
462
465
|
|
|
463
466
|
export interface ClientRequestOptions extends FetchOptions {
|
|
@@ -465,6 +468,8 @@ export interface ClientRequestOptions extends FetchOptions {
|
|
|
465
468
|
* Standard request fetch options.
|
|
466
469
|
*/
|
|
467
470
|
request?: RequestInit;
|
|
471
|
+
|
|
472
|
+
query?: Record<string, string | number | boolean>;
|
|
468
473
|
}
|
|
469
474
|
|
|
470
475
|
export type ClientRequestResponse<TConfig extends RequestConfigSchema> =
|
|
@@ -107,7 +107,7 @@ export class BunHttpServerProvider extends ServerProvider {
|
|
|
107
107
|
},
|
|
108
108
|
});
|
|
109
109
|
|
|
110
|
-
this.log.info(`Server listening on ${this.hostname}
|
|
110
|
+
this.log.info(`Server listening on ${this.hostname}/`);
|
|
111
111
|
} catch (err) {
|
|
112
112
|
this.log.error("Failed to start Bun server", err);
|
|
113
113
|
throw err;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { afterEach, describe, expect, test } from "vitest";
|
|
3
|
+
import { NodeHttpServerProvider } from "./NodeHttpServerProvider.ts";
|
|
4
|
+
|
|
5
|
+
describe("NodeHttpServerProvider", () => {
|
|
6
|
+
describe("graceful shutdown", () => {
|
|
7
|
+
let alepha: Alepha;
|
|
8
|
+
let server: NodeHttpServerProvider;
|
|
9
|
+
|
|
10
|
+
afterEach(async () => {
|
|
11
|
+
await alepha?.stop().catch(() => {});
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test("dev mode: destroys connections immediately on close", async () => {
|
|
15
|
+
alepha = Alepha.create({ env: { NODE_ENV: "development" } });
|
|
16
|
+
alepha.with(NodeHttpServerProvider);
|
|
17
|
+
|
|
18
|
+
await alepha.start();
|
|
19
|
+
server = alepha.inject(NodeHttpServerProvider);
|
|
20
|
+
|
|
21
|
+
// Make a request to establish connection
|
|
22
|
+
await fetch(`${server.hostname}/`);
|
|
23
|
+
|
|
24
|
+
const startTime = Date.now();
|
|
25
|
+
await alepha.stop();
|
|
26
|
+
const elapsed = Date.now() - startTime;
|
|
27
|
+
|
|
28
|
+
// Should close instantly (under 100ms)
|
|
29
|
+
expect(elapsed).toBeLessThan(100);
|
|
30
|
+
expect(server.getConnectionsCount()).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("production mode: waits for connections then closes", async () => {
|
|
34
|
+
alepha = Alepha.create({ env: { NODE_ENV: "production" } });
|
|
35
|
+
alepha.with(NodeHttpServerProvider);
|
|
36
|
+
|
|
37
|
+
await alepha.start();
|
|
38
|
+
server = alepha.inject(NodeHttpServerProvider);
|
|
39
|
+
server.options.shutdownTimeout = 500;
|
|
40
|
+
|
|
41
|
+
// Make a request to establish keep-alive connection
|
|
42
|
+
await fetch(`${server.hostname}/`);
|
|
43
|
+
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
await alepha.stop();
|
|
46
|
+
const elapsed = Date.now() - startTime;
|
|
47
|
+
|
|
48
|
+
// In production, should not be instant (waits for graceful close or timeout)
|
|
49
|
+
// But should complete within timeout
|
|
50
|
+
expect(elapsed).toBeLessThan(server.options.shutdownTimeout + 100);
|
|
51
|
+
expect(server.getConnectionsCount()).toBe(0);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("production mode: forces close after timeout", async () => {
|
|
55
|
+
alepha = Alepha.create({ env: { NODE_ENV: "production" } });
|
|
56
|
+
alepha.with(NodeHttpServerProvider);
|
|
57
|
+
|
|
58
|
+
await alepha.start();
|
|
59
|
+
server = alepha.inject(NodeHttpServerProvider);
|
|
60
|
+
server.options.shutdownTimeout = 50;
|
|
61
|
+
|
|
62
|
+
// Make a request to establish connection
|
|
63
|
+
await fetch(`${server.hostname}/`);
|
|
64
|
+
|
|
65
|
+
const startTime = Date.now();
|
|
66
|
+
await alepha.stop();
|
|
67
|
+
const elapsed = Date.now() - startTime;
|
|
68
|
+
|
|
69
|
+
// Should close around timeout
|
|
70
|
+
expect(elapsed).toBeLessThan(200);
|
|
71
|
+
expect(server.getConnectionsCount()).toBe(0);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("connections are tracked and cleared", async () => {
|
|
75
|
+
alepha = Alepha.create({ env: { NODE_ENV: "development" } });
|
|
76
|
+
alepha.with(NodeHttpServerProvider);
|
|
77
|
+
|
|
78
|
+
await alepha.start();
|
|
79
|
+
server = alepha.inject(NodeHttpServerProvider);
|
|
80
|
+
|
|
81
|
+
// Make multiple requests
|
|
82
|
+
await fetch(`${server.hostname}/`);
|
|
83
|
+
await fetch(`${server.hostname}/`);
|
|
84
|
+
|
|
85
|
+
await alepha.stop();
|
|
86
|
+
|
|
87
|
+
// All connections cleared after stop
|
|
88
|
+
expect(server.getConnectionsCount()).toBe(0);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("rejects new requests during shutdown", async () => {
|
|
92
|
+
alepha = Alepha.create({ env: { NODE_ENV: "production" } });
|
|
93
|
+
alepha.with(NodeHttpServerProvider);
|
|
94
|
+
|
|
95
|
+
await alepha.start();
|
|
96
|
+
server = alepha.inject(NodeHttpServerProvider);
|
|
97
|
+
server.options.shutdownTimeout = 500;
|
|
98
|
+
|
|
99
|
+
// Establish a connection to keep server busy
|
|
100
|
+
await fetch(`${server.hostname}/`);
|
|
101
|
+
|
|
102
|
+
// Start shutdown (don't await yet)
|
|
103
|
+
const stopPromise = alepha.stop();
|
|
104
|
+
|
|
105
|
+
// Give server.close() time to be called
|
|
106
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
107
|
+
|
|
108
|
+
// New request should fail (server no longer accepting connections)
|
|
109
|
+
let error: Error | null = null;
|
|
110
|
+
try {
|
|
111
|
+
await fetch(`${server.hostname}/`, {
|
|
112
|
+
signal: AbortSignal.timeout(100),
|
|
113
|
+
});
|
|
114
|
+
} catch (e) {
|
|
115
|
+
error = e as Error;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Should get a connection error (ECONNREFUSED or similar)
|
|
119
|
+
expect(error).not.toBeNull();
|
|
120
|
+
|
|
121
|
+
// Wait for shutdown to complete
|
|
122
|
+
await stopPromise;
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type Server,
|
|
5
5
|
type ServerResponse,
|
|
6
6
|
} from "node:http";
|
|
7
|
+
import type { Socket } from "node:net";
|
|
7
8
|
import { $env, $hook, $inject, Alepha, type Static, t } from "alepha";
|
|
8
9
|
import { DateTimeProvider } from "alepha/datetime";
|
|
9
10
|
import { $logger } from "alepha/logger";
|
|
@@ -34,6 +35,30 @@ export class NodeHttpServerProvider extends ServerProvider {
|
|
|
34
35
|
protected readonly env = $env(envSchema);
|
|
35
36
|
protected readonly router = $inject(ServerRouterProvider);
|
|
36
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Track active connections for fast shutdown.
|
|
40
|
+
*/
|
|
41
|
+
protected readonly connections = new Set<Socket>();
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get number of active connections.
|
|
45
|
+
*/
|
|
46
|
+
public getConnectionsCount(): number {
|
|
47
|
+
return this.connections.size;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Server options.
|
|
52
|
+
*/
|
|
53
|
+
public readonly options = {
|
|
54
|
+
/**
|
|
55
|
+
* Graceful shutdown timeout in ms.
|
|
56
|
+
* After this, remaining connections are forcefully closed.
|
|
57
|
+
* @default 30000
|
|
58
|
+
*/
|
|
59
|
+
shutdownTimeout: 10000,
|
|
60
|
+
};
|
|
61
|
+
|
|
37
62
|
public get hostname(): string {
|
|
38
63
|
if (this.server.listening) {
|
|
39
64
|
const address = this.server.address();
|
|
@@ -45,10 +70,7 @@ export class NodeHttpServerProvider extends ServerProvider {
|
|
|
45
70
|
}
|
|
46
71
|
|
|
47
72
|
// Pre-bound error handler to avoid function allocation per request
|
|
48
|
-
protected readonly handleRequestError = (
|
|
49
|
-
res: import("node:http").ServerResponse,
|
|
50
|
-
err: Error,
|
|
51
|
-
) => {
|
|
73
|
+
protected readonly handleRequestError = (res: ServerResponse, err: Error) => {
|
|
52
74
|
this.log.error("Error handling request", err);
|
|
53
75
|
res.statusCode = 500;
|
|
54
76
|
res.end("Internal Server Error");
|
|
@@ -83,25 +105,27 @@ export class NodeHttpServerProvider extends ServerProvider {
|
|
|
83
105
|
protected createHttpServer(
|
|
84
106
|
func: (req: IncomingMessage, res: ServerResponse) => void,
|
|
85
107
|
): Server {
|
|
86
|
-
|
|
108
|
+
const server = createServer(
|
|
87
109
|
{
|
|
88
110
|
// nov 25 - keep connections alive for better performance, cuz we http/1.1 by default
|
|
89
111
|
keepAlive: this.alepha.isProduction(),
|
|
90
112
|
},
|
|
91
113
|
func,
|
|
92
114
|
);
|
|
115
|
+
|
|
116
|
+
// Track connections for fast shutdown
|
|
117
|
+
server.on("connection", (socket) => {
|
|
118
|
+
this.connections.add(socket);
|
|
119
|
+
socket.on("close", () => this.connections.delete(socket));
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return server;
|
|
93
123
|
}
|
|
94
124
|
|
|
95
125
|
protected readonly stop = $hook({
|
|
96
126
|
on: "stop",
|
|
97
127
|
handler: async () => {
|
|
98
|
-
|
|
99
|
-
await this.close();
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// do not await in development & test
|
|
104
|
-
this.close().catch(() => {});
|
|
128
|
+
await this.close();
|
|
105
129
|
},
|
|
106
130
|
});
|
|
107
131
|
|
|
@@ -115,7 +139,7 @@ export class NodeHttpServerProvider extends ServerProvider {
|
|
|
115
139
|
|
|
116
140
|
await new Promise<void>((resolve, reject) => {
|
|
117
141
|
this.server?.listen(port, this.env.SERVER_HOST, () => {
|
|
118
|
-
this.log.info(`Server listening on ${this.hostname}
|
|
142
|
+
this.log.info(`Server listening on ${this.hostname}/`);
|
|
119
143
|
resolve();
|
|
120
144
|
});
|
|
121
145
|
|
|
@@ -126,18 +150,49 @@ export class NodeHttpServerProvider extends ServerProvider {
|
|
|
126
150
|
}
|
|
127
151
|
|
|
128
152
|
protected async close() {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
153
|
+
// Dev/Test: instant shutdown (destroy connections immediately)
|
|
154
|
+
// Production: graceful shutdown (wait for requests to complete, then close)
|
|
155
|
+
if (!this.alepha.isProduction()) {
|
|
156
|
+
this.destroyAllConnections();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Stop accepting new connections
|
|
160
|
+
const closePromise = new Promise<void>((resolve, reject) => {
|
|
161
|
+
this.server?.close((err) => (err ? reject(err) : resolve()));
|
|
137
162
|
});
|
|
138
163
|
|
|
139
|
-
|
|
164
|
+
if (this.alepha.isProduction() && this.connections.size > 0) {
|
|
165
|
+
// In production, wait for connections with timeout
|
|
166
|
+
const timeout = this.options.shutdownTimeout;
|
|
167
|
+
|
|
168
|
+
// Set up timeout to force-close connections
|
|
169
|
+
const timeoutId = setTimeout(() => {
|
|
170
|
+
if (this.connections.size > 0) {
|
|
171
|
+
this.log.warn(
|
|
172
|
+
`Shutdown timeout (${timeout}ms) reached, forcing ${this.connections.size} connections to close`,
|
|
173
|
+
);
|
|
174
|
+
// Destroy sockets - this triggers 'close' events which eventually resolves closePromise
|
|
175
|
+
for (const socket of this.connections) {
|
|
176
|
+
socket.destroy();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}, timeout);
|
|
180
|
+
|
|
181
|
+
// Wait for server to fully close (all connections closed)
|
|
182
|
+
await closePromise;
|
|
183
|
+
clearTimeout(timeoutId);
|
|
184
|
+
this.connections.clear();
|
|
185
|
+
} else {
|
|
186
|
+
await closePromise;
|
|
187
|
+
}
|
|
140
188
|
|
|
141
189
|
this.log.info("Server closed");
|
|
142
190
|
}
|
|
191
|
+
|
|
192
|
+
protected destroyAllConnections() {
|
|
193
|
+
for (const socket of this.connections) {
|
|
194
|
+
socket.destroy();
|
|
195
|
+
}
|
|
196
|
+
this.connections.clear();
|
|
197
|
+
}
|
|
143
198
|
}
|
|
@@ -9,7 +9,7 @@ export class ServerLoggerProvider {
|
|
|
9
9
|
on: "server:onRequest",
|
|
10
10
|
priority: "first",
|
|
11
11
|
handler: ({ route, request }) => {
|
|
12
|
-
if (route.silent) {
|
|
12
|
+
if (route.silent || request.metadata.vite) {
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -44,7 +44,7 @@ export class ServerLoggerProvider {
|
|
|
44
44
|
on: "server:onResponse",
|
|
45
45
|
priority: "last",
|
|
46
46
|
handler: ({ route, request, response }) => {
|
|
47
|
-
if (route.silent) {
|
|
47
|
+
if (route.silent || request.metadata.vite) {
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -140,14 +140,6 @@ export class ServerProvider {
|
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
/**
|
|
144
|
-
* Extract pathname from URL without creating URL object.
|
|
145
|
-
*/
|
|
146
|
-
protected getPathname(rawUrl: string): string {
|
|
147
|
-
const qIndex = rawUrl.indexOf("?");
|
|
148
|
-
return qIndex === -1 ? rawUrl : rawUrl.slice(0, qIndex);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
143
|
public get hostname(): string {
|
|
152
144
|
if (this.alepha.isViteDev()) {
|
|
153
145
|
return `http://localhost:${this.alepha.env.SERVER_PORT}`;
|
|
@@ -185,11 +177,11 @@ export class ServerProvider {
|
|
|
185
177
|
const rawUrl = req.url!;
|
|
186
178
|
const { route, params } = this.router.match(`/${req.method}${rawUrl}`);
|
|
187
179
|
|
|
188
|
-
if (this.isViteNotFound(rawUrl, route, params)) {
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
180
|
if (!route) {
|
|
181
|
+
// Skip if response was already sent (e.g., by Vite middleware)
|
|
182
|
+
if (res.headersSent) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
193
185
|
// if no route is found, return basic 404
|
|
194
186
|
// note: you should not use this in production, use a custom 404 page instead by adding a route /*
|
|
195
187
|
res.writeHead(404, { "content-type": "text/plain" });
|
|
@@ -221,6 +213,11 @@ export class ServerProvider {
|
|
|
221
213
|
.handler(request)
|
|
222
214
|
.catch(this.handleInternalError);
|
|
223
215
|
|
|
216
|
+
// Skip if response was already sent (e.g., by Vite middleware)
|
|
217
|
+
if (res.headersSent) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
|
|
224
221
|
// empty body - just send status & headers
|
|
225
222
|
if (!response.body) {
|
|
226
223
|
res.writeHead(response.status, response.headers).end();
|