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
|
@@ -259,6 +259,7 @@ const $module = (options) => {
|
|
|
259
259
|
const $ = class extends Module {
|
|
260
260
|
options = options;
|
|
261
261
|
register(alepha) {
|
|
262
|
+
if (options.atoms) for (const atom of options.atoms) alepha.store.register(atom);
|
|
262
263
|
if (typeof options.register === "function") {
|
|
263
264
|
options.register(alepha);
|
|
264
265
|
return;
|
|
@@ -357,12 +358,8 @@ var InjectPrimitive = class extends Primitive {};
|
|
|
357
358
|
* Used across the codebase via dependency injection.
|
|
358
359
|
*/
|
|
359
360
|
var Json = class {
|
|
360
|
-
stringify
|
|
361
|
-
|
|
362
|
-
}
|
|
363
|
-
parse(text, reviver) {
|
|
364
|
-
return JSON.parse(text, reviver);
|
|
365
|
-
}
|
|
361
|
+
stringify = JSON.stringify;
|
|
362
|
+
parse = JSON.parse;
|
|
366
363
|
};
|
|
367
364
|
|
|
368
365
|
//#endregion
|
|
@@ -395,6 +392,64 @@ var JsonSchemaCodec = class extends SchemaCodec {
|
|
|
395
392
|
}
|
|
396
393
|
};
|
|
397
394
|
|
|
395
|
+
//#endregion
|
|
396
|
+
//#region ../../src/core/primitives/$hook.ts
|
|
397
|
+
/**
|
|
398
|
+
* Registers a new hook.
|
|
399
|
+
*
|
|
400
|
+
* ```ts
|
|
401
|
+
* import { $hook } from "alepha";
|
|
402
|
+
*
|
|
403
|
+
* class MyProvider {
|
|
404
|
+
* onStart = $hook({
|
|
405
|
+
* name: "start", // or "configure", "ready", "stop", ...
|
|
406
|
+
* handler: async (app) => {
|
|
407
|
+
* // await db.connect(); ...
|
|
408
|
+
* }
|
|
409
|
+
* });
|
|
410
|
+
* }
|
|
411
|
+
* ```
|
|
412
|
+
*
|
|
413
|
+
* Hooks are used to run async functions from all registered providers/services.
|
|
414
|
+
*
|
|
415
|
+
* You can't register a hook after the App has started.
|
|
416
|
+
*
|
|
417
|
+
* It's used under the hood by the `configure`, `start`, and `stop` methods.
|
|
418
|
+
* Some modules also use hooks to run their own logic. (e.g. `alepha/server`).
|
|
419
|
+
*
|
|
420
|
+
* You can create your own hooks by using module augmentation:
|
|
421
|
+
*
|
|
422
|
+
* ```ts
|
|
423
|
+
* declare module "alepha" {
|
|
424
|
+
*
|
|
425
|
+
* interface Hooks {
|
|
426
|
+
* "my:custom:hook": {
|
|
427
|
+
* arg1: string;
|
|
428
|
+
* }
|
|
429
|
+
* }
|
|
430
|
+
* }
|
|
431
|
+
*
|
|
432
|
+
* await alepha.events.emit("my:custom:hook", { arg1: "value" });
|
|
433
|
+
* ```
|
|
434
|
+
*
|
|
435
|
+
*/
|
|
436
|
+
const $hook = (options) => createPrimitive(HookPrimitive, options);
|
|
437
|
+
var HookPrimitive = class extends Primitive {
|
|
438
|
+
called = 0;
|
|
439
|
+
onInit() {
|
|
440
|
+
const handler = this.options.handler;
|
|
441
|
+
this.alepha.events.on(this.options.on, {
|
|
442
|
+
caller: this.config.service,
|
|
443
|
+
priority: this.options.priority,
|
|
444
|
+
callback: (args) => {
|
|
445
|
+
this.called += 1;
|
|
446
|
+
return handler(args);
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
$hook[KIND] = HookPrimitive;
|
|
452
|
+
|
|
398
453
|
//#endregion
|
|
399
454
|
//#region ../../src/core/helpers/FileLike.ts
|
|
400
455
|
const isTypeFile = (value) => {
|
|
@@ -831,22 +886,49 @@ const t = new TypeProvider();
|
|
|
831
886
|
|
|
832
887
|
//#endregion
|
|
833
888
|
//#region ../../src/core/providers/KeylessJsonSchemaCodec.ts
|
|
889
|
+
const UNSAFE_KEYS = new Set([
|
|
890
|
+
"__proto__",
|
|
891
|
+
"constructor",
|
|
892
|
+
"prototype"
|
|
893
|
+
]);
|
|
834
894
|
/**
|
|
835
895
|
* KeylessJsonSchemaCodec provides schema-driven JSON encoding without keys.
|
|
836
896
|
*
|
|
837
897
|
* It uses the schema to determine field order, allowing the encoded output
|
|
838
898
|
* to be a simple JSON array instead of an object with keys.
|
|
839
|
-
*
|
|
840
|
-
* Performance characteristics:
|
|
841
|
-
* - Encode: 0.94-1.53x vs JSON.stringify (faster for complex objects)
|
|
842
|
-
* - Decode: 1.76-2.00x vs JSON.parse
|
|
843
|
-
* - Size: 50-56% smaller than JSON
|
|
844
899
|
*/
|
|
845
900
|
var KeylessJsonSchemaCodec = class extends SchemaCodec {
|
|
846
901
|
cache = /* @__PURE__ */ new Map();
|
|
847
|
-
|
|
848
|
-
|
|
902
|
+
textEncoder = new TextEncoder();
|
|
903
|
+
textDecoder = new TextDecoder();
|
|
849
904
|
varCounter = 0;
|
|
905
|
+
useFunctionCompilation = true;
|
|
906
|
+
maxArrayLength = 1e4;
|
|
907
|
+
maxStringLength = 1e6;
|
|
908
|
+
maxDepth = 50;
|
|
909
|
+
/**
|
|
910
|
+
* Configure codec options.
|
|
911
|
+
*/
|
|
912
|
+
configure(options) {
|
|
913
|
+
if (options.useFunctionCompilation !== void 0) {
|
|
914
|
+
this.useFunctionCompilation = options.useFunctionCompilation;
|
|
915
|
+
this.cache.clear();
|
|
916
|
+
}
|
|
917
|
+
if (options.maxArrayLength !== void 0) this.maxArrayLength = options.maxArrayLength;
|
|
918
|
+
if (options.maxStringLength !== void 0) this.maxStringLength = options.maxStringLength;
|
|
919
|
+
if (options.maxDepth !== void 0) this.maxDepth = options.maxDepth;
|
|
920
|
+
return this;
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Hook to auto-detect safe mode on configure.
|
|
924
|
+
* Disables function compilation in browser by default.
|
|
925
|
+
*/
|
|
926
|
+
onConfigure = $hook({
|
|
927
|
+
on: "configure",
|
|
928
|
+
handler: () => {
|
|
929
|
+
this.useFunctionCompilation = this.canUseFunction();
|
|
930
|
+
}
|
|
931
|
+
});
|
|
850
932
|
/**
|
|
851
933
|
* Encode value to a keyless JSON string.
|
|
852
934
|
*/
|
|
@@ -857,14 +939,14 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
|
|
|
857
939
|
* Encode value to binary (UTF-8 encoded keyless JSON).
|
|
858
940
|
*/
|
|
859
941
|
encodeToBinary(schema, value) {
|
|
860
|
-
return this.
|
|
942
|
+
return this.textEncoder.encode(this.encodeToString(schema, value));
|
|
861
943
|
}
|
|
862
944
|
/**
|
|
863
945
|
* Decode keyless JSON string or binary to value.
|
|
864
946
|
*/
|
|
865
947
|
decode(schema, value) {
|
|
866
948
|
if (value instanceof Uint8Array) {
|
|
867
|
-
const text = this.
|
|
949
|
+
const text = this.textDecoder.decode(value);
|
|
868
950
|
return this.getCodec(schema).decode(text);
|
|
869
951
|
}
|
|
870
952
|
if (typeof value === "string") return this.getCodec(schema).decode(value);
|
|
@@ -872,13 +954,54 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
|
|
|
872
954
|
return value;
|
|
873
955
|
}
|
|
874
956
|
/**
|
|
957
|
+
* Test if `new Function()` is available (not blocked by CSP).
|
|
958
|
+
*/
|
|
959
|
+
canUseFunction() {
|
|
960
|
+
try {
|
|
961
|
+
return new Function("return true")() === true;
|
|
962
|
+
} catch {
|
|
963
|
+
return false;
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* Validate schema keys for prototype pollution.
|
|
968
|
+
* Uses a visited set to avoid infinite recursion on recursive schemas.
|
|
969
|
+
*/
|
|
970
|
+
validateSchemaKeys(schema, depth = 0, visited = /* @__PURE__ */ new Set()) {
|
|
971
|
+
if (visited.has(schema)) return;
|
|
972
|
+
visited.add(schema);
|
|
973
|
+
if (depth > this.maxDepth) throw new AlephaError(`Schema depth exceeds maximum allowed (${this.maxDepth})`);
|
|
974
|
+
if (t.schema.isObject(schema)) {
|
|
975
|
+
const props = schema.properties;
|
|
976
|
+
for (const key of Object.keys(props)) {
|
|
977
|
+
if (UNSAFE_KEYS.has(key)) throw new AlephaError(`Unsafe schema key "${key}" detected. This key is blocked to prevent prototype pollution.`);
|
|
978
|
+
this.validateSchemaKeys(props[key], depth + 1, visited);
|
|
979
|
+
}
|
|
980
|
+
} else if (t.schema.isArray(schema)) {
|
|
981
|
+
const arrSchema = schema;
|
|
982
|
+
this.validateSchemaKeys(arrSchema.items, depth + 1, visited);
|
|
983
|
+
} else if (t.schema.isUnion(schema) || t.schema.isOptional(schema)) this.validateSchemaKeys(this.unwrap(schema), depth, visited);
|
|
984
|
+
}
|
|
985
|
+
/**
|
|
986
|
+
* Validate array length.
|
|
987
|
+
*/
|
|
988
|
+
validateArrayLength(arr) {
|
|
989
|
+
if (arr.length > this.maxArrayLength) throw new AlephaError(`Array length (${arr.length}) exceeds maximum allowed (${this.maxArrayLength})`);
|
|
990
|
+
}
|
|
991
|
+
/**
|
|
992
|
+
* Validate string length.
|
|
993
|
+
*/
|
|
994
|
+
validateStringLength(str) {
|
|
995
|
+
if (str.length > this.maxStringLength) throw new AlephaError(`String length (${str.length}) exceeds maximum allowed (${this.maxStringLength})`);
|
|
996
|
+
}
|
|
997
|
+
/**
|
|
875
998
|
* Get a compiled codec for the given schema.
|
|
876
999
|
* Codecs are cached for reuse.
|
|
877
1000
|
*/
|
|
878
1001
|
getCodec(schema) {
|
|
879
1002
|
let c = this.cache.get(schema);
|
|
880
1003
|
if (!c) {
|
|
881
|
-
c = this.
|
|
1004
|
+
c = this.useFunctionCompilation ? this.compileWithFunction(schema) : this.compileInterpreted(schema);
|
|
882
1005
|
this.cache.set(schema, c);
|
|
883
1006
|
}
|
|
884
1007
|
return c;
|
|
@@ -886,7 +1009,11 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
|
|
|
886
1009
|
nextVar() {
|
|
887
1010
|
return `_${this.varCounter++}`;
|
|
888
1011
|
}
|
|
889
|
-
|
|
1012
|
+
/**
|
|
1013
|
+
* Compile codec using `new Function()` for maximum performance.
|
|
1014
|
+
* Only used when CSP allows and useFunctionCompilation is true.
|
|
1015
|
+
*/
|
|
1016
|
+
compileWithFunction(schema) {
|
|
890
1017
|
this.varCounter = 0;
|
|
891
1018
|
const encBody = this.genEnc(schema, "v");
|
|
892
1019
|
this.varCounter = 0;
|
|
@@ -896,6 +1023,122 @@ var KeylessJsonSchemaCodec = class extends SchemaCodec {
|
|
|
896
1023
|
decode: new Function("s", `const a=JSON.parse(s);let i=0;${decBody.code}return ${decBody.result};`)
|
|
897
1024
|
};
|
|
898
1025
|
}
|
|
1026
|
+
/**
|
|
1027
|
+
* Compile codec using interpreter-based approach.
|
|
1028
|
+
* Safer (no eval/Function) but slower. Used in browser by default.
|
|
1029
|
+
*/
|
|
1030
|
+
compileInterpreted(schema) {
|
|
1031
|
+
const self = this;
|
|
1032
|
+
return {
|
|
1033
|
+
encode(value) {
|
|
1034
|
+
return JSON.stringify(self.interpretEncode(schema, value));
|
|
1035
|
+
},
|
|
1036
|
+
decode(str) {
|
|
1037
|
+
const ctx = {
|
|
1038
|
+
arr: JSON.parse(str),
|
|
1039
|
+
i: 0
|
|
1040
|
+
};
|
|
1041
|
+
return self.interpretDecode(schema, ctx);
|
|
1042
|
+
}
|
|
1043
|
+
};
|
|
1044
|
+
}
|
|
1045
|
+
interpretEncode(schema, value) {
|
|
1046
|
+
if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return value;
|
|
1047
|
+
if (t.schema.isBigInt(schema)) return `${value}n`;
|
|
1048
|
+
if (t.schema.isArray(schema)) {
|
|
1049
|
+
const arrSchema = schema;
|
|
1050
|
+
if (!Array.isArray(value)) return value;
|
|
1051
|
+
if (t.schema.isString(arrSchema.items) || t.schema.isNumber(arrSchema.items) || t.schema.isInteger(arrSchema.items) || t.schema.isBoolean(arrSchema.items)) return value;
|
|
1052
|
+
return value.map((e) => this.interpretEncode(arrSchema.items, e));
|
|
1053
|
+
}
|
|
1054
|
+
if (t.schema.isObject(schema)) {
|
|
1055
|
+
const objSchema = schema;
|
|
1056
|
+
const props = objSchema.properties;
|
|
1057
|
+
const keys = Object.keys(props);
|
|
1058
|
+
const req = new Set(objSchema.required || []);
|
|
1059
|
+
const result = [];
|
|
1060
|
+
for (const k of keys) {
|
|
1061
|
+
const ps = props[k];
|
|
1062
|
+
const isOpt = !req.has(k) || t.schema.isOptional(ps);
|
|
1063
|
+
const isNullable = this.isNullable(ps);
|
|
1064
|
+
const inner = this.unwrap(ps);
|
|
1065
|
+
const v = value[k];
|
|
1066
|
+
if (isOpt) result.push(v !== void 0 ? this.interpretEncode(inner, v) : null);
|
|
1067
|
+
else if (isNullable) result.push(v !== null ? this.interpretEncode(inner, v) : null);
|
|
1068
|
+
else result.push(this.interpretEncode(inner, v));
|
|
1069
|
+
}
|
|
1070
|
+
return result;
|
|
1071
|
+
}
|
|
1072
|
+
if (t.schema.isOptional(schema) || t.schema.isUnion(schema)) {
|
|
1073
|
+
const inner = this.unwrap(schema);
|
|
1074
|
+
if (this.isNullable(schema)) return value !== null ? this.interpretEncode(inner, value) : null;
|
|
1075
|
+
return value !== void 0 ? this.interpretEncode(inner, value) : null;
|
|
1076
|
+
}
|
|
1077
|
+
return value;
|
|
1078
|
+
}
|
|
1079
|
+
interpretDecode(schema, ctx) {
|
|
1080
|
+
if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return ctx.arr[ctx.i++];
|
|
1081
|
+
if (t.schema.isBigInt(schema)) return BigInt(ctx.arr[ctx.i++].slice(0, -1));
|
|
1082
|
+
if (t.schema.isArray(schema)) {
|
|
1083
|
+
const arrSchema = schema;
|
|
1084
|
+
const arr = ctx.arr[ctx.i++];
|
|
1085
|
+
if (!Array.isArray(arr)) return arr;
|
|
1086
|
+
if (t.schema.isObject(arrSchema.items)) return arr.map((e) => this.interpretDecodeFromValue(arrSchema.items, e));
|
|
1087
|
+
return arr;
|
|
1088
|
+
}
|
|
1089
|
+
if (t.schema.isObject(schema)) {
|
|
1090
|
+
const objSchema = schema;
|
|
1091
|
+
const props = objSchema.properties;
|
|
1092
|
+
const keys = Object.keys(props);
|
|
1093
|
+
const req = new Set(objSchema.required || []);
|
|
1094
|
+
const result = {};
|
|
1095
|
+
for (const k of keys) {
|
|
1096
|
+
const ps = props[k];
|
|
1097
|
+
const isOpt = !req.has(k) || t.schema.isOptional(ps);
|
|
1098
|
+
const isNullable = this.isNullable(ps);
|
|
1099
|
+
const inner = this.unwrap(ps);
|
|
1100
|
+
const val = ctx.arr[ctx.i++];
|
|
1101
|
+
if (isOpt) {
|
|
1102
|
+
if (val !== null) result[k] = this.interpretDecodeFromValue(inner, val);
|
|
1103
|
+
} else if (isNullable) result[k] = val === null ? null : this.interpretDecodeFromValue(inner, val);
|
|
1104
|
+
else result[k] = this.interpretDecodeFromValue(inner, val);
|
|
1105
|
+
}
|
|
1106
|
+
return result;
|
|
1107
|
+
}
|
|
1108
|
+
if (t.schema.isOptional(schema) || t.schema.isUnion(schema)) {
|
|
1109
|
+
const inner = this.unwrap(schema);
|
|
1110
|
+
const val = ctx.arr[ctx.i++];
|
|
1111
|
+
if (val === null) return this.isNullable(schema) ? null : void 0;
|
|
1112
|
+
if (t.schema.isObject(inner) || t.schema.isArray(inner)) return this.interpretDecodeFromValue(inner, val);
|
|
1113
|
+
return val;
|
|
1114
|
+
}
|
|
1115
|
+
return ctx.arr[ctx.i++];
|
|
1116
|
+
}
|
|
1117
|
+
interpretDecodeFromValue(schema, value) {
|
|
1118
|
+
if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return value;
|
|
1119
|
+
if (t.schema.isBigInt(schema)) return BigInt(value.slice(0, -1));
|
|
1120
|
+
if (t.schema.isArray(schema)) {
|
|
1121
|
+
if (!Array.isArray(value)) return value;
|
|
1122
|
+
const arrSchema = schema;
|
|
1123
|
+
if (t.schema.isObject(arrSchema.items)) return value.map((e) => this.interpretDecodeFromValue(arrSchema.items, e));
|
|
1124
|
+
return value;
|
|
1125
|
+
}
|
|
1126
|
+
if (t.schema.isObject(schema)) {
|
|
1127
|
+
const props = schema.properties;
|
|
1128
|
+
const keys = Object.keys(props);
|
|
1129
|
+
const result = {};
|
|
1130
|
+
for (let idx = 0; idx < keys.length; idx++) {
|
|
1131
|
+
const k = keys[idx];
|
|
1132
|
+
const inner = this.unwrap(props[k]);
|
|
1133
|
+
const v = value[idx];
|
|
1134
|
+
if (t.schema.isObject(inner)) result[k] = this.interpretDecodeFromValue(inner, v);
|
|
1135
|
+
else if (t.schema.isBigInt(inner)) result[k] = BigInt(v.slice(0, -1));
|
|
1136
|
+
else result[k] = v;
|
|
1137
|
+
}
|
|
1138
|
+
return result;
|
|
1139
|
+
}
|
|
1140
|
+
return value;
|
|
1141
|
+
}
|
|
899
1142
|
genEnc(schema, ve) {
|
|
900
1143
|
if (t.schema.isString(schema) || t.schema.isNumber(schema) || t.schema.isInteger(schema) || t.schema.isBoolean(schema) || this.isEnum(schema)) return ve;
|
|
901
1144
|
if (t.schema.isBigInt(schema)) return `${ve}+'n'`;
|
|
@@ -1087,64 +1330,6 @@ var TypeBoxError = class extends AlephaError {
|
|
|
1087
1330
|
}
|
|
1088
1331
|
};
|
|
1089
1332
|
|
|
1090
|
-
//#endregion
|
|
1091
|
-
//#region ../../src/core/primitives/$hook.ts
|
|
1092
|
-
/**
|
|
1093
|
-
* Registers a new hook.
|
|
1094
|
-
*
|
|
1095
|
-
* ```ts
|
|
1096
|
-
* import { $hook } from "alepha";
|
|
1097
|
-
*
|
|
1098
|
-
* class MyProvider {
|
|
1099
|
-
* onStart = $hook({
|
|
1100
|
-
* name: "start", // or "configure", "ready", "stop", ...
|
|
1101
|
-
* handler: async (app) => {
|
|
1102
|
-
* // await db.connect(); ...
|
|
1103
|
-
* }
|
|
1104
|
-
* });
|
|
1105
|
-
* }
|
|
1106
|
-
* ```
|
|
1107
|
-
*
|
|
1108
|
-
* Hooks are used to run async functions from all registered providers/services.
|
|
1109
|
-
*
|
|
1110
|
-
* You can't register a hook after the App has started.
|
|
1111
|
-
*
|
|
1112
|
-
* It's used under the hood by the `configure`, `start`, and `stop` methods.
|
|
1113
|
-
* Some modules also use hooks to run their own logic. (e.g. `alepha/server`).
|
|
1114
|
-
*
|
|
1115
|
-
* You can create your own hooks by using module augmentation:
|
|
1116
|
-
*
|
|
1117
|
-
* ```ts
|
|
1118
|
-
* declare module "alepha" {
|
|
1119
|
-
*
|
|
1120
|
-
* interface Hooks {
|
|
1121
|
-
* "my:custom:hook": {
|
|
1122
|
-
* arg1: string;
|
|
1123
|
-
* }
|
|
1124
|
-
* }
|
|
1125
|
-
* }
|
|
1126
|
-
*
|
|
1127
|
-
* await alepha.events.emit("my:custom:hook", { arg1: "value" });
|
|
1128
|
-
* ```
|
|
1129
|
-
*
|
|
1130
|
-
*/
|
|
1131
|
-
const $hook = (options) => createPrimitive(HookPrimitive, options);
|
|
1132
|
-
var HookPrimitive = class extends Primitive {
|
|
1133
|
-
called = 0;
|
|
1134
|
-
onInit() {
|
|
1135
|
-
const handler = this.options.handler;
|
|
1136
|
-
this.alepha.events.on(this.options.on, {
|
|
1137
|
-
caller: this.config.service,
|
|
1138
|
-
priority: this.options.priority,
|
|
1139
|
-
callback: (args) => {
|
|
1140
|
-
this.called += 1;
|
|
1141
|
-
return handler(args);
|
|
1142
|
-
}
|
|
1143
|
-
});
|
|
1144
|
-
}
|
|
1145
|
-
};
|
|
1146
|
-
$hook[KIND] = HookPrimitive;
|
|
1147
|
-
|
|
1148
1333
|
//#endregion
|
|
1149
1334
|
//#region ../../src/core/providers/SchemaValidator.ts
|
|
1150
1335
|
var SchemaValidator = class {
|
|
@@ -1400,7 +1585,7 @@ var EventManager = class {
|
|
|
1400
1585
|
async emit(func, payload, options = {}) {
|
|
1401
1586
|
const events = this.events[func];
|
|
1402
1587
|
if (!events || events.length === 0) return;
|
|
1403
|
-
if (events.length === 1 && !options.log
|
|
1588
|
+
if (events.length === 1 && !options.log) {
|
|
1404
1589
|
const hook = events[0];
|
|
1405
1590
|
try {
|
|
1406
1591
|
const result = hook.callback(payload);
|
|
@@ -1419,9 +1604,7 @@ var EventManager = class {
|
|
|
1419
1604
|
ctx.now = performance.now();
|
|
1420
1605
|
this.log?.trace(`${String(func)} ...`);
|
|
1421
1606
|
}
|
|
1422
|
-
|
|
1423
|
-
if (options.reverse) eventList = events.toReversed();
|
|
1424
|
-
for (const hook of eventList) {
|
|
1607
|
+
for (const hook of events) {
|
|
1425
1608
|
const name = hook.caller?.name ?? "unknown";
|
|
1426
1609
|
if (options.log) {
|
|
1427
1610
|
ctx.now2 = performance.now();
|
|
@@ -1724,13 +1907,10 @@ var Alepha = class Alepha {
|
|
|
1724
1907
|
* If you are not interested about these helpers, you can use the constructor directly.
|
|
1725
1908
|
*/
|
|
1726
1909
|
static create(state = {}) {
|
|
1727
|
-
if (typeof process === "object" && typeof process.env === "object") {
|
|
1728
|
-
state.env
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
};
|
|
1732
|
-
for (const key in state.env) if (state.env[key] === "") delete state.env[key];
|
|
1733
|
-
}
|
|
1910
|
+
if (typeof process === "object" && typeof process.env === "object") state.env = {
|
|
1911
|
+
...state.env,
|
|
1912
|
+
...process.env
|
|
1913
|
+
};
|
|
1734
1914
|
const alepha = new Alepha(state);
|
|
1735
1915
|
if (alepha.isTest()) {
|
|
1736
1916
|
const g = globalThis;
|
|
@@ -1985,10 +2165,7 @@ var Alepha = class Alepha {
|
|
|
1985
2165
|
async stop() {
|
|
1986
2166
|
if (!this.started) return;
|
|
1987
2167
|
this.log?.info("Stopping App...");
|
|
1988
|
-
await this.events.emit("stop", this, {
|
|
1989
|
-
reverse: true,
|
|
1990
|
-
log: true
|
|
1991
|
-
});
|
|
2168
|
+
await this.events.emit("stop", this, { log: true });
|
|
1992
2169
|
this.log?.info("App is now off");
|
|
1993
2170
|
this.started = false;
|
|
1994
2171
|
this.ready = false;
|
|
@@ -2088,7 +2265,10 @@ var Alepha = class Alepha {
|
|
|
2088
2265
|
if (!match.parents.includes(parent) && parent !== service) match.parents.push(parent);
|
|
2089
2266
|
return match.instance;
|
|
2090
2267
|
}
|
|
2091
|
-
if (this.started)
|
|
2268
|
+
if (this.started) {
|
|
2269
|
+
const mod = service[MODULE]?.name;
|
|
2270
|
+
throw new ContainerLockedError(`Container is locked. No more services can be added. Attempted to inject '${service.name}' from '${parent?.name}'. ${mod ? `Module '${mod}' is not registered ?` : ""}`);
|
|
2271
|
+
}
|
|
2092
2272
|
}
|
|
2093
2273
|
const module = service[MODULE];
|
|
2094
2274
|
if (module && typeof module === "function") this.with(module);
|
|
@@ -2104,10 +2284,10 @@ var Alepha = class Alepha {
|
|
|
2104
2284
|
if (!transient) registry.set(service, definition);
|
|
2105
2285
|
if (instance instanceof Module) {
|
|
2106
2286
|
this.modules.push(instance);
|
|
2107
|
-
const parent
|
|
2287
|
+
const parent = __alephaRef.parent;
|
|
2108
2288
|
__alephaRef.parent = instance.constructor;
|
|
2109
2289
|
instance.register(this);
|
|
2110
|
-
__alephaRef.parent = parent
|
|
2290
|
+
__alephaRef.parent = parent;
|
|
2111
2291
|
}
|
|
2112
2292
|
return instance;
|
|
2113
2293
|
}
|
|
@@ -2319,11 +2499,13 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
|
|
|
2319
2499
|
* - Nested objects with required/optional properties
|
|
2320
2500
|
* - Arrays with item schemas
|
|
2321
2501
|
* - Common validation options: minLength, maxLength, minimum, maximum, pattern
|
|
2502
|
+
* - anyOf/oneOf/allOf with nullable patterns (e.g., `anyOf: [type, null]` → `t.nullable(type)`)
|
|
2503
|
+
* - Alepha ~options (trim, lowercase) pass-through
|
|
2322
2504
|
*
|
|
2323
2505
|
* **Not supported:**
|
|
2324
|
-
* - oneOf, anyOf, allOf, not (composition schemas)
|
|
2325
2506
|
* - $ref (references)
|
|
2326
2507
|
* - additionalProperties, patternProperties
|
|
2508
|
+
* - Complex composition schemas (multiple non-null types in anyOf/oneOf/allOf)
|
|
2327
2509
|
*
|
|
2328
2510
|
* @param schema - JSON Schema object to convert
|
|
2329
2511
|
* @returns TypeBox TSchema
|
|
@@ -2350,7 +2532,6 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
|
|
|
2350
2532
|
* ```
|
|
2351
2533
|
*/
|
|
2352
2534
|
function jsonSchemaToTypeBox(schema) {
|
|
2353
|
-
if (schema["~kind"]) return schema;
|
|
2354
2535
|
if (schema.const !== void 0) return t.const(schema.const);
|
|
2355
2536
|
if (schema.enum && Array.isArray(schema.enum)) {
|
|
2356
2537
|
if (schema.enum.every((v) => typeof v === "string")) return t.enum(schema.enum, filterUndefined({
|
|
@@ -2360,6 +2541,33 @@ function jsonSchemaToTypeBox(schema) {
|
|
|
2360
2541
|
}));
|
|
2361
2542
|
return t.union(schema.enum.map((v) => t.const(v)));
|
|
2362
2543
|
}
|
|
2544
|
+
if (schema.anyOf && Array.isArray(schema.anyOf)) {
|
|
2545
|
+
const nullSchema = schema.anyOf.find((s) => s.type === "null");
|
|
2546
|
+
const nonNullSchemas = schema.anyOf.filter((s) => s.type !== "null");
|
|
2547
|
+
if (nullSchema && nonNullSchemas.length === 1) {
|
|
2548
|
+
const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
|
|
2549
|
+
return t.nullable(converted);
|
|
2550
|
+
}
|
|
2551
|
+
return t.union(schema.anyOf.map((s) => jsonSchemaToTypeBox(s)));
|
|
2552
|
+
}
|
|
2553
|
+
if (schema.allOf && Array.isArray(schema.allOf)) {
|
|
2554
|
+
const nullSchema = schema.allOf.find((s) => s.type === "null");
|
|
2555
|
+
const nonNullSchemas = schema.allOf.filter((s) => s.type !== "null");
|
|
2556
|
+
if (nullSchema && nonNullSchemas.length === 1) {
|
|
2557
|
+
const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
|
|
2558
|
+
return t.nullable(converted);
|
|
2559
|
+
}
|
|
2560
|
+
if (nonNullSchemas.length > 0) return jsonSchemaToTypeBox(nonNullSchemas[0]);
|
|
2561
|
+
}
|
|
2562
|
+
if (schema.oneOf && Array.isArray(schema.oneOf)) {
|
|
2563
|
+
const nullSchema = schema.oneOf.find((s) => s.type === "null");
|
|
2564
|
+
const nonNullSchemas = schema.oneOf.filter((s) => s.type !== "null");
|
|
2565
|
+
if (nullSchema && nonNullSchemas.length === 1) {
|
|
2566
|
+
const converted = jsonSchemaToTypeBox(nonNullSchemas[0]);
|
|
2567
|
+
return t.nullable(converted);
|
|
2568
|
+
}
|
|
2569
|
+
return t.union(schema.oneOf.map((s) => jsonSchemaToTypeBox(s)));
|
|
2570
|
+
}
|
|
2363
2571
|
switch (Array.isArray(schema.type) ? schema.type[0] : schema.type) {
|
|
2364
2572
|
case "string": return convertString(schema);
|
|
2365
2573
|
case "number": return convertNumber(schema);
|
|
@@ -2383,7 +2591,7 @@ function filterUndefined(obj) {
|
|
|
2383
2591
|
* Convert JSON Schema string type to TypeBox.
|
|
2384
2592
|
*/
|
|
2385
2593
|
function convertString(schema) {
|
|
2386
|
-
const
|
|
2594
|
+
const baseOptions = filterUndefined({
|
|
2387
2595
|
title: schema.title,
|
|
2388
2596
|
description: schema.description,
|
|
2389
2597
|
default: schema.default,
|
|
@@ -2391,6 +2599,10 @@ function convertString(schema) {
|
|
|
2391
2599
|
maxLength: schema.maxLength,
|
|
2392
2600
|
pattern: schema.pattern
|
|
2393
2601
|
});
|
|
2602
|
+
const options = schema["~options"] ? {
|
|
2603
|
+
...baseOptions,
|
|
2604
|
+
"~options": schema["~options"]
|
|
2605
|
+
} : baseOptions;
|
|
2394
2606
|
switch (schema.format) {
|
|
2395
2607
|
case "email": return t.email(options);
|
|
2396
2608
|
case "uuid": return t.uuid(options);
|
|
@@ -2648,5 +2860,5 @@ const run = (entry, opts) => {
|
|
|
2648
2860
|
};
|
|
2649
2861
|
|
|
2650
2862
|
//#endregion
|
|
2651
|
-
export { $atom, $context, $env, $hook, $inject, $module, $use, Alepha, AlephaError, AlsProvider, AppNotStartedError, Atom, CircularDependencyError, CodecManager, ContainerLockedError, EventManager, Format, HookPrimitive, InjectPrimitive, JsonSchemaCodec, KIND, KeylessJsonSchemaCodec, Module, OPTIONS, Primitive, SchemaCodec, StateManager, TooLateSubstitutionError, Type, TypeBoxError, TypeGuard, TypeProvider, Value, createPagination, createPrimitive, isClass, isFileLike, isTypeFile, isUUID, jsonSchemaToTypeBox, pageMetadataSchema, pageQuerySchema, pageSchema, run, t };
|
|
2863
|
+
export { $atom, $context, $env, $hook, $inject, $module, $use, Alepha, AlephaError, AlsProvider, AppNotStartedError, Atom, CircularDependencyError, CodecManager, ContainerLockedError, EventManager, Format, HookPrimitive, InjectPrimitive, Json, JsonSchemaCodec, KIND, KeylessJsonSchemaCodec, Module, OPTIONS, Primitive, SchemaCodec, StateManager, TooLateSubstitutionError, Type, TypeBoxError, TypeGuard, TypeProvider, Value, createPagination, createPrimitive, isClass, isFileLike, isTypeFile, isUUID, jsonSchemaToTypeBox, pageMetadataSchema, pageQuerySchema, pageSchema, run, t };
|
|
2652
2864
|
//# sourceMappingURL=index.browser.js.map
|