silgi 0.43.29 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -1
- package/dist/_virtual/_rolldown/runtime.mjs +5 -0
- package/dist/adapters/_fetch-adapter.d.mts +18 -0
- package/dist/adapters/_fetch-adapter.mjs +53 -0
- package/dist/adapters/astro.d.mts +15 -0
- package/dist/adapters/astro.mjs +31 -0
- package/dist/adapters/aws-lambda.d.mts +42 -0
- package/dist/adapters/aws-lambda.mjs +92 -0
- package/dist/adapters/express.d.mts +16 -0
- package/dist/adapters/express.mjs +110 -0
- package/dist/adapters/message-port.d.mts +42 -0
- package/dist/adapters/message-port.mjs +132 -0
- package/dist/adapters/nestjs.d.mts +25 -0
- package/dist/adapters/nestjs.mjs +83 -0
- package/dist/adapters/nextjs.d.mts +14 -0
- package/dist/adapters/nextjs.mjs +29 -0
- package/dist/adapters/peer.d.mts +27 -0
- package/dist/adapters/peer.mjs +36 -0
- package/dist/adapters/remix.d.mts +15 -0
- package/dist/adapters/remix.mjs +30 -0
- package/dist/adapters/solidstart.d.mts +12 -0
- package/dist/adapters/solidstart.mjs +29 -0
- package/dist/adapters/sveltekit.d.mts +14 -0
- package/dist/adapters/sveltekit.mjs +30 -0
- package/dist/broker/index.d.mts +62 -0
- package/dist/broker/index.mjs +153 -0
- package/dist/broker/nats.d.mts +33 -0
- package/dist/broker/nats.mjs +31 -0
- package/dist/broker/redis.d.mts +51 -0
- package/dist/broker/redis.mjs +92 -0
- package/dist/builder.d.mts +55 -0
- package/dist/builder.mjs +70 -0
- package/dist/callable.d.mts +19 -0
- package/dist/callable.mjs +42 -0
- package/dist/caller.mjs +90 -0
- package/dist/client/adapters/fetch/index.d.mts +15 -0
- package/dist/client/adapters/fetch/index.mjs +57 -0
- package/dist/client/adapters/ofetch/index.d.mts +55 -0
- package/dist/client/adapters/ofetch/index.mjs +91 -0
- package/dist/client/adapters/websocket/index.d.mts +20 -0
- package/dist/client/adapters/websocket/index.mjs +101 -0
- package/dist/client/client.d.mts +37 -0
- package/dist/client/client.mjs +80 -0
- package/dist/client/consume.d.mts +50 -0
- package/dist/client/consume.mjs +66 -0
- package/dist/client/dynamic-link.d.mts +16 -0
- package/dist/client/dynamic-link.mjs +19 -0
- package/dist/client/index.d.mts +6 -0
- package/dist/client/index.mjs +5 -0
- package/dist/client/interceptor.d.mts +31 -0
- package/dist/client/interceptor.mjs +34 -0
- package/dist/client/openapi.d.mts +29 -0
- package/dist/client/openapi.mjs +89 -0
- package/dist/client/plugins/batch.d.mts +26 -0
- package/dist/client/plugins/batch.mjs +64 -0
- package/dist/client/plugins/circuit-breaker.d.mts +24 -0
- package/dist/client/plugins/circuit-breaker.mjs +60 -0
- package/dist/client/plugins/csrf.d.mts +13 -0
- package/dist/client/plugins/csrf.mjs +20 -0
- package/dist/client/plugins/dedupe.d.mts +10 -0
- package/dist/client/plugins/dedupe.mjs +28 -0
- package/dist/client/plugins/index.d.mts +8 -0
- package/dist/client/plugins/index.mjs +8 -0
- package/dist/client/plugins/otel.d.mts +12 -0
- package/dist/client/plugins/otel.mjs +27 -0
- package/dist/client/plugins/retry.d.mts +34 -0
- package/dist/client/plugins/retry.mjs +79 -0
- package/dist/client/plugins/timeout.d.mts +10 -0
- package/dist/client/plugins/timeout.mjs +14 -0
- package/dist/client/server.d.mts +16 -0
- package/dist/client/server.mjs +59 -0
- package/dist/client/types.d.mts +29 -0
- package/dist/codec/devalue.d.mts +21 -0
- package/dist/codec/devalue.mjs +33 -0
- package/dist/codec/msgpack.d.mts +18 -0
- package/dist/codec/msgpack.mjs +45 -0
- package/dist/codec/sanitize.mjs +38 -0
- package/dist/codegen/emitters.d.mts +51 -0
- package/dist/codegen/emitters.mjs +143 -0
- package/dist/codegen/generate.d.mts +25 -0
- package/dist/codegen/generate.mjs +224 -0
- package/dist/codegen/index.d.mts +44 -0
- package/dist/codegen/index.mjs +103 -0
- package/dist/codegen/parse.d.mts +124 -0
- package/dist/codegen/parse.mjs +135 -0
- package/dist/codegen/preserve.d.mts +21 -0
- package/dist/codegen/preserve.mjs +62 -0
- package/dist/codegen/schema-to-code.d.mts +57 -0
- package/dist/codegen/schema-to-code.mjs +167 -0
- package/dist/compile.d.mts +46 -0
- package/dist/compile.mjs +332 -0
- package/dist/core/codec.mjs +67 -0
- package/dist/core/context-bridge.mjs +11 -0
- package/dist/core/dispatch.mjs +62 -0
- package/dist/core/error.d.mts +99 -60
- package/dist/core/error.mjs +125 -92
- package/dist/core/handler.d.mts +6 -0
- package/dist/core/handler.mjs +153 -0
- package/dist/core/input.mjs +49 -0
- package/dist/core/iterator.d.mts +17 -0
- package/dist/core/iterator.mjs +79 -0
- package/dist/core/router-utils.mjs +22 -0
- package/dist/core/schema.d.mts +20 -0
- package/dist/core/schema.mjs +33 -0
- package/dist/core/serve.d.mts +51 -0
- package/dist/core/serve.mjs +76 -0
- package/dist/core/sse.d.mts +18 -0
- package/dist/core/sse.mjs +110 -0
- package/dist/core/storage.d.mts +17 -4
- package/dist/core/storage.mjs +60 -13
- package/dist/core/task.d.mts +62 -0
- package/dist/core/task.mjs +165 -0
- package/dist/core/trace-map.d.mts +13 -0
- package/dist/core/trace-map.mjs +13 -0
- package/dist/core/url.mjs +28 -0
- package/dist/core/utils.mjs +24 -0
- package/dist/index.d.mts +17 -21
- package/dist/index.mjs +14 -22
- package/dist/integrations/ai/index.d.mts +25 -0
- package/dist/integrations/ai/index.mjs +117 -0
- package/dist/integrations/better-auth/index.d.mts +41 -0
- package/dist/integrations/better-auth/index.mjs +331 -0
- package/dist/integrations/drizzle/index.d.mts +27 -0
- package/dist/integrations/drizzle/index.mjs +285 -0
- package/dist/integrations/hey-api/index.d.mts +2 -0
- package/dist/integrations/hey-api/index.mjs +2 -0
- package/dist/integrations/hey-api/to-client.d.mts +20 -0
- package/dist/integrations/hey-api/to-client.mjs +39 -0
- package/dist/integrations/pinia-colada/general-utils.d.mts +13 -0
- package/dist/integrations/pinia-colada/general-utils.mjs +9 -0
- package/dist/integrations/pinia-colada/index.d.mts +6 -0
- package/dist/integrations/pinia-colada/index.mjs +5 -0
- package/dist/integrations/pinia-colada/key.d.mts +11 -0
- package/dist/integrations/pinia-colada/key.mjs +11 -0
- package/dist/integrations/pinia-colada/procedure-utils.d.mts +25 -0
- package/dist/integrations/pinia-colada/procedure-utils.mjs +33 -0
- package/dist/integrations/pinia-colada/router-utils.d.mts +17 -0
- package/dist/integrations/pinia-colada/router-utils.mjs +30 -0
- package/dist/integrations/pinia-colada/types.d.mts +25 -0
- package/dist/integrations/react/index.d.mts +83 -0
- package/dist/integrations/react/index.mjs +196 -0
- package/dist/integrations/tanstack-query/index.d.mts +120 -0
- package/dist/integrations/tanstack-query/index.mjs +100 -0
- package/dist/integrations/tanstack-query/ssr.d.mts +60 -0
- package/dist/integrations/tanstack-query/ssr.mjs +102 -0
- package/dist/integrations/zod/converter.d.mts +75 -0
- package/dist/integrations/zod/converter.mjs +345 -0
- package/dist/integrations/zod/index.d.mts +2 -0
- package/dist/integrations/zod/index.mjs +2 -0
- package/dist/lazy.d.mts +22 -0
- package/dist/lazy.mjs +34 -0
- package/dist/lifecycle.d.mts +36 -0
- package/dist/lifecycle.mjs +46 -0
- package/dist/map-input.d.mts +17 -0
- package/dist/map-input.mjs +47 -0
- package/dist/plugins/analytics/accumulator.d.mts +24 -0
- package/dist/plugins/analytics/accumulator.mjs +91 -0
- package/dist/plugins/analytics/alerts.d.mts +59 -0
- package/dist/plugins/analytics/alerts.mjs +140 -0
- package/dist/plugins/analytics/collector.d.mts +38 -0
- package/dist/plugins/analytics/collector.mjs +275 -0
- package/dist/plugins/analytics/cost.d.mts +61 -0
- package/dist/plugins/analytics/cost.mjs +97 -0
- package/dist/plugins/analytics/export.d.mts +7 -0
- package/dist/plugins/analytics/export.mjs +86 -0
- package/dist/plugins/analytics/normalize.mjs +144 -0
- package/dist/plugins/analytics/query.mjs +164 -0
- package/dist/plugins/analytics/request-id.mjs +34 -0
- package/dist/plugins/analytics/routes.d.mts +11 -0
- package/dist/plugins/analytics/routes.mjs +211 -0
- package/dist/plugins/analytics/sse.d.mts +31 -0
- package/dist/plugins/analytics/sse.mjs +74 -0
- package/dist/plugins/analytics/store.mjs +103 -0
- package/dist/plugins/analytics/timeseries.d.mts +50 -0
- package/dist/plugins/analytics/timeseries.mjs +169 -0
- package/dist/plugins/analytics/trace.d.mts +48 -0
- package/dist/plugins/analytics/trace.mjs +83 -0
- package/dist/plugins/analytics/types.d.mts +145 -0
- package/dist/plugins/analytics/types.mjs +40 -0
- package/dist/plugins/analytics/utils.d.mts +4 -0
- package/dist/plugins/analytics/utils.mjs +56 -0
- package/dist/plugins/analytics.d.mts +18 -0
- package/dist/plugins/analytics.mjs +188 -0
- package/dist/plugins/batch-server.d.mts +20 -0
- package/dist/plugins/batch-server.mjs +91 -0
- package/dist/plugins/body-limit.d.mts +19 -0
- package/dist/plugins/body-limit.mjs +49 -0
- package/dist/plugins/cache.d.mts +170 -0
- package/dist/plugins/cache.mjs +212 -0
- package/dist/plugins/coerce.d.mts +24 -0
- package/dist/plugins/coerce.mjs +70 -0
- package/dist/plugins/cookies.d.mts +14 -0
- package/dist/plugins/cookies.mjs +48 -0
- package/dist/plugins/cors.d.mts +43 -0
- package/dist/plugins/cors.mjs +62 -0
- package/dist/plugins/file-upload.d.mts +38 -0
- package/dist/plugins/file-upload.mjs +102 -0
- package/dist/plugins/index.d.mts +18 -0
- package/dist/plugins/index.mjs +17 -0
- package/dist/plugins/otel.d.mts +35 -0
- package/dist/plugins/otel.mjs +40 -0
- package/dist/plugins/pino.d.mts +60 -0
- package/dist/plugins/pino.mjs +42 -0
- package/dist/plugins/pubsub.d.mts +50 -0
- package/dist/plugins/pubsub.mjs +53 -0
- package/dist/plugins/ratelimit.d.mts +53 -0
- package/dist/plugins/ratelimit.mjs +92 -0
- package/dist/plugins/signing.d.mts +41 -0
- package/dist/plugins/signing.mjs +118 -0
- package/dist/plugins/strict-get.d.mts +10 -0
- package/dist/plugins/strict-get.mjs +33 -0
- package/dist/scalar.d.mts +49 -0
- package/dist/scalar.mjs +311 -0
- package/dist/silgi.d.mts +144 -0
- package/dist/silgi.mjs +164 -0
- package/dist/trpc-interop.d.mts +22 -0
- package/dist/trpc-interop.mjs +68 -0
- package/dist/types.d.mts +108 -0
- package/dist/ws.d.mts +88 -0
- package/dist/ws.mjs +205 -0
- package/lib/dashboard/index.html +120 -0
- package/lib/ocache.d.mts +1 -0
- package/lib/ocache.mjs +1 -0
- package/lib/ofetch.d.mts +1 -0
- package/lib/ofetch.mjs +1 -0
- package/lib/srvx.d.mts +1 -0
- package/lib/srvx.mjs +1 -0
- package/lib/unstorage.d.mts +1 -0
- package/lib/unstorage.mjs +1 -0
- package/package.json +314 -150
- package/dist/build.d.mts +0 -3
- package/dist/build.mjs +0 -4
- package/dist/cli/build/build.mjs +0 -15
- package/dist/cli/build/dev.d.mts +0 -10
- package/dist/cli/build/dev.mjs +0 -92
- package/dist/cli/build/prepare.d.mts +0 -6
- package/dist/cli/build/prepare.mjs +0 -15
- package/dist/cli/commands/commands.mjs +0 -90
- package/dist/cli/commands/env.mjs +0 -53
- package/dist/cli/commands/init.mjs +0 -84
- package/dist/cli/commands/install.mjs +0 -52
- package/dist/cli/commands/prepare.mjs +0 -65
- package/dist/cli/commands/reset.mjs +0 -46
- package/dist/cli/commands/run.mjs +0 -31
- package/dist/cli/commands/watch.mjs +0 -153
- package/dist/cli/config/defaults.mjs +0 -117
- package/dist/cli/config/index.d.mts +0 -3
- package/dist/cli/config/index.mjs +0 -4
- package/dist/cli/config/loader.d.mts +0 -6
- package/dist/cli/config/loader.mjs +0 -71
- package/dist/cli/config/resolvers/compatibility.mjs +0 -71
- package/dist/cli/config/resolvers/imports.mjs +0 -35
- package/dist/cli/config/resolvers/paths.mjs +0 -98
- package/dist/cli/config/resolvers/storage.mjs +0 -23
- package/dist/cli/config/resolvers/url.mjs +0 -9
- package/dist/cli/config/types.d.mts +0 -14
- package/dist/cli/config/types.mjs +0 -147
- package/dist/cli/core/apiful.mjs +0 -36
- package/dist/cli/core/devServer.mjs +0 -10
- package/dist/cli/core/env.mjs +0 -68
- package/dist/cli/core/installPackage.mjs +0 -60
- package/dist/cli/core/runtimeConfig.mjs +0 -70
- package/dist/cli/core/scan.mjs +0 -35
- package/dist/cli/core/silgi.mjs +0 -111
- package/dist/cli/framework/emptyFramework.mjs +0 -7
- package/dist/cli/framework/h3.mjs +0 -55
- package/dist/cli/framework/index.mjs +0 -15
- package/dist/cli/framework/nitro.mjs +0 -24
- package/dist/cli/framework/nuxt.mjs +0 -10
- package/dist/cli/index.d.mts +0 -1
- package/dist/cli/index.mjs +0 -29
- package/dist/cli/module/exportScan.mjs +0 -180
- package/dist/cli/module/install.mjs +0 -49
- package/dist/cli/module/scan.mjs +0 -193
- package/dist/cli/scan/prepareCommands.mjs +0 -40
- package/dist/cli/scan/prepareConfigs.mjs +0 -33
- package/dist/cli/scan/prepareCoreFile.mjs +0 -118
- package/dist/cli/scan/prepareScanFile.mjs +0 -59
- package/dist/cli/scan/prepareSchema.mjs +0 -128
- package/dist/cli/scan/scanExportFile.mjs +0 -288
- package/dist/cli/scan/writeCoreFile.mjs +0 -22
- package/dist/cli/scan/writeTypesAndFiles.mjs +0 -72
- package/dist/cli/utils/cancel.mjs +0 -14
- package/dist/cli/utils/common.mjs +0 -15
- package/dist/cli/utils/compatibility.mjs +0 -33
- package/dist/cli/utils/debug.mjs +0 -11
- package/dist/cli/utils/ignore.mjs +0 -56
- package/dist/cli/utils/processManager.mjs +0 -170
- package/dist/cli/utils/readScanFile.mjs +0 -58
- package/dist/cli/utils/storage.mjs +0 -23
- package/dist/core/context.d.mts +0 -30
- package/dist/core/context.mjs +0 -32
- package/dist/core/createSilgi.d.mts +0 -6
- package/dist/core/createSilgi.mjs +0 -153
- package/dist/core/event.d.mts +0 -26
- package/dist/core/event.mjs +0 -44
- package/dist/core/index.d.mts +0 -25
- package/dist/core/index.mjs +0 -30
- package/dist/core/orchestrate.mjs +0 -115
- package/dist/core/response.d.mts +0 -20
- package/dist/core/response.mjs +0 -105
- package/dist/core/silgi.d.mts +0 -19
- package/dist/core/silgi.mjs +0 -141
- package/dist/core/silgiApp.d.mts +0 -9
- package/dist/core/silgiApp.mjs +0 -23
- package/dist/core/unctx.d.mts +0 -21
- package/dist/core/unctx.mjs +0 -35
- package/dist/core/utils/event-stream.d.mts +0 -53
- package/dist/core/utils/event-stream.mjs +0 -38
- package/dist/core/utils/event.d.mts +0 -8
- package/dist/core/utils/event.mjs +0 -12
- package/dist/core/utils/internal/event-stream.d.mts +0 -45
- package/dist/core/utils/internal/event-stream.mjs +0 -137
- package/dist/core/utils/internal/obj.mjs +0 -9
- package/dist/core/utils/internal/object.mjs +0 -29
- package/dist/core/utils/internal/query.mjs +0 -73
- package/dist/core/utils/internal/req.mjs +0 -35
- package/dist/core/utils/merge.d.mts +0 -14
- package/dist/core/utils/merge.mjs +0 -27
- package/dist/core/utils/middleware.d.mts +0 -14
- package/dist/core/utils/middleware.mjs +0 -12
- package/dist/core/utils/request.mjs +0 -35
- package/dist/core/utils/resolver.d.mts +0 -7
- package/dist/core/utils/resolver.mjs +0 -29
- package/dist/core/utils/runtime.d.mts +0 -7
- package/dist/core/utils/runtime.mjs +0 -20
- package/dist/core/utils/sanitize.mjs +0 -22
- package/dist/core/utils/schema.d.mts +0 -34
- package/dist/core/utils/schema.mjs +0 -33
- package/dist/core/utils/service.d.mts +0 -13
- package/dist/core/utils/service.mjs +0 -19
- package/dist/core/utils/shared.d.mts +0 -6
- package/dist/core/utils/shared.mjs +0 -7
- package/dist/core/utils/storage.d.mts +0 -24
- package/dist/core/utils/storage.mjs +0 -54
- package/dist/kit/add/add-commands.d.mts +0 -6
- package/dist/kit/add/add-commands.mjs +0 -12
- package/dist/kit/add/add-core-file.d.mts +0 -9
- package/dist/kit/add/add-core-file.mjs +0 -11
- package/dist/kit/add/add-imports.d.mts +0 -14
- package/dist/kit/add/add-imports.mjs +0 -56
- package/dist/kit/add/add-npm.d.mts +0 -14
- package/dist/kit/add/add-npm.mjs +0 -23
- package/dist/kit/define.d.mts +0 -28
- package/dist/kit/define.mjs +0 -25
- package/dist/kit/errors.d.mts +0 -6
- package/dist/kit/errors.mjs +0 -11
- package/dist/kit/esm.d.mts +0 -11
- package/dist/kit/esm.mjs +0 -21
- package/dist/kit/fs.d.mts +0 -4
- package/dist/kit/fs.mjs +0 -13
- package/dist/kit/function-utils.d.mts +0 -27
- package/dist/kit/function-utils.mjs +0 -75
- package/dist/kit/gen.d.mts +0 -5
- package/dist/kit/gen.mjs +0 -26
- package/dist/kit/hash.d.mts +0 -4
- package/dist/kit/hash.mjs +0 -10
- package/dist/kit/index.d.mts +0 -22
- package/dist/kit/index.mjs +0 -23
- package/dist/kit/isFramework.d.mts +0 -6
- package/dist/kit/isFramework.mjs +0 -21
- package/dist/kit/logger.d.mts +0 -6
- package/dist/kit/logger.mjs +0 -10
- package/dist/kit/migration.d.mts +0 -113
- package/dist/kit/migration.mjs +0 -301
- package/dist/kit/module.d.mts +0 -14
- package/dist/kit/module.mjs +0 -53
- package/dist/kit/path.d.mts +0 -7
- package/dist/kit/path.mjs +0 -26
- package/dist/kit/preset.d.mts +0 -8
- package/dist/kit/preset.mjs +0 -11
- package/dist/kit/resolve.d.mts +0 -37
- package/dist/kit/resolve.mjs +0 -82
- package/dist/kit/template.d.mts +0 -19
- package/dist/kit/template.mjs +0 -91
- package/dist/kit/useRequest.d.mts +0 -19
- package/dist/kit/useRequest.mjs +0 -63
- package/dist/kit/utils.d.mts +0 -34
- package/dist/kit/utils.mjs +0 -91
- package/dist/package.mjs +0 -176
- package/dist/presets/_all.gen.d.mts +0 -6
- package/dist/presets/_all.gen.mjs +0 -18
- package/dist/presets/_resolve.d.mts +0 -12
- package/dist/presets/_resolve.mjs +0 -57
- package/dist/presets/_types.gen.d.mts +0 -8
- package/dist/presets/_types.gen.mjs +0 -5
- package/dist/presets/h3/preset.d.mts +0 -6
- package/dist/presets/h3/preset.mjs +0 -35
- package/dist/presets/hono/preset.d.mts +0 -6
- package/dist/presets/hono/preset.mjs +0 -30
- package/dist/presets/index.d.mts +0 -3
- package/dist/presets/index.mjs +0 -3
- package/dist/presets/nitro/preset.d.mts +0 -6
- package/dist/presets/nitro/preset.mjs +0 -37
- package/dist/presets/npmpackage/preset.d.mts +0 -6
- package/dist/presets/npmpackage/preset.mjs +0 -29
- package/dist/presets/nuxt/preset.d.mts +0 -6
- package/dist/presets/nuxt/preset.mjs +0 -41
- package/dist/runtime/index.d.mts +0 -4
- package/dist/runtime/index.mjs +0 -5
- package/dist/runtime/internal/config.d.mts +0 -11
- package/dist/runtime/internal/config.mjs +0 -97
- package/dist/runtime/internal/debug.d.mts +0 -6
- package/dist/runtime/internal/debug.mjs +0 -11
- package/dist/runtime/internal/defu.d.mts +0 -4
- package/dist/runtime/internal/defu.mjs +0 -9
- package/dist/runtime/internal/index.d.mts +0 -7
- package/dist/runtime/internal/index.mjs +0 -8
- package/dist/runtime/internal/nitro.d.mts +0 -6
- package/dist/runtime/internal/nitro.mjs +0 -36
- package/dist/runtime/internal/nuxt.d.mts +0 -12
- package/dist/runtime/internal/nuxt.mjs +0 -16
- package/dist/runtime/internal/ofetch.d.mts +0 -8
- package/dist/runtime/internal/ofetch.mjs +0 -39
- package/dist/runtime/internal/plugin.d.mts +0 -7
- package/dist/runtime/internal/plugin.mjs +0 -8
- package/dist/types/cliConfig.d.mts +0 -288
- package/dist/types/cliConfig.mjs +0 -0
- package/dist/types/cliHooks.d.mts +0 -142
- package/dist/types/cliHooks.mjs +0 -0
- package/dist/types/compatibility.d.mts +0 -13
- package/dist/types/compatibility.mjs +0 -0
- package/dist/types/config.d.mts +0 -46
- package/dist/types/config.mjs +0 -0
- package/dist/types/dotenv.d.mts +0 -29
- package/dist/types/dotenv.mjs +0 -0
- package/dist/types/event.d.mts +0 -63
- package/dist/types/event.mjs +0 -0
- package/dist/types/global.d.mts +0 -24
- package/dist/types/global.mjs +0 -0
- package/dist/types/helper.d.mts +0 -25
- package/dist/types/helper.mjs +0 -0
- package/dist/types/hooks.d.mts +0 -37
- package/dist/types/hooks.mjs +0 -0
- package/dist/types/index.d.mts +0 -26
- package/dist/types/index.mjs +0 -0
- package/dist/types/kits.d.mts +0 -32
- package/dist/types/kits.mjs +0 -0
- package/dist/types/middleware.d.mts +0 -31
- package/dist/types/middleware.mjs +0 -0
- package/dist/types/module.d.mts +0 -102
- package/dist/types/module.mjs +0 -0
- package/dist/types/preset.d.mts +0 -20
- package/dist/types/preset.mjs +0 -0
- package/dist/types/route.d.mts +0 -59
- package/dist/types/route.mjs +0 -0
- package/dist/types/runtime/index.d.mts +0 -5
- package/dist/types/runtime/index.mjs +0 -0
- package/dist/types/runtime/nuxt.d.mts +0 -13
- package/dist/types/runtime/nuxt.mjs +0 -0
- package/dist/types/runtime/ofetch.d.mts +0 -14
- package/dist/types/runtime/ofetch.mjs +0 -0
- package/dist/types/runtime/plugin.d.mts +0 -8
- package/dist/types/runtime/plugin.mjs +0 -0
- package/dist/types/runtime/silgi.d.mts +0 -11
- package/dist/types/runtime/silgi.mjs +0 -0
- package/dist/types/schema.d.mts +0 -86
- package/dist/types/schema.mjs +0 -0
- package/dist/types/service.d.mts +0 -102
- package/dist/types/service.mjs +0 -0
- package/dist/types/shared.d.mts +0 -19
- package/dist/types/shared.mjs +0 -0
- package/dist/types/silgi.d.mts +0 -71
- package/dist/types/silgi.mjs +0 -0
- package/dist/types/silgiCLI.d.mts +0 -118
- package/dist/types/silgiCLI.mjs +0 -0
- package/dist/types/standard-schema.d.mts +0 -61
- package/dist/types/standard-schema.mjs +0 -0
- package/dist/types/storage.d.mts +0 -30
- package/dist/types/storage.mjs +0 -0
- package/dist/types/tree-kill.d.mts +0 -18
- package/dist/types/tree-kill.mjs +0 -0
- package/lib/config.d.mts +0 -7
- package/lib/config.mjs +0 -5
- package/lib/meta.d.mts +0 -4
- package/lib/meta.mjs +0 -6
- package/lib/runtime-meta.d.mts +0 -4
- package/lib/runtime-meta.mjs +0 -32
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//#region src/codegen/parse.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* OpenAPI 3.x spec parser.
|
|
4
|
+
*
|
|
5
|
+
* Walks an OpenAPI document and extracts operations with their
|
|
6
|
+
* parameters, request body, responses, and error definitions.
|
|
7
|
+
*/
|
|
8
|
+
interface OpenAPISpec {
|
|
9
|
+
openapi: string;
|
|
10
|
+
info: {
|
|
11
|
+
title: string;
|
|
12
|
+
version: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
};
|
|
15
|
+
paths?: Record<string, PathItem>;
|
|
16
|
+
components?: {
|
|
17
|
+
schemas?: Record<string, JsonSchema>;
|
|
18
|
+
securitySchemes?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
tags?: {
|
|
21
|
+
name: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
}[];
|
|
24
|
+
servers?: {
|
|
25
|
+
url: string;
|
|
26
|
+
description?: string;
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
interface PathItem {
|
|
30
|
+
get?: OperationObject;
|
|
31
|
+
post?: OperationObject;
|
|
32
|
+
put?: OperationObject;
|
|
33
|
+
patch?: OperationObject;
|
|
34
|
+
delete?: OperationObject;
|
|
35
|
+
head?: OperationObject;
|
|
36
|
+
options?: OperationObject;
|
|
37
|
+
trace?: OperationObject;
|
|
38
|
+
parameters?: ParameterObject[];
|
|
39
|
+
}
|
|
40
|
+
interface OperationObject {
|
|
41
|
+
operationId?: string;
|
|
42
|
+
summary?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
tags?: string[];
|
|
45
|
+
deprecated?: boolean;
|
|
46
|
+
parameters?: ParameterObject[];
|
|
47
|
+
requestBody?: RequestBodyObject;
|
|
48
|
+
responses?: Record<string, ResponseObject>;
|
|
49
|
+
security?: Record<string, string[]>[];
|
|
50
|
+
}
|
|
51
|
+
interface ParameterObject {
|
|
52
|
+
name: string;
|
|
53
|
+
in: 'path' | 'query' | 'header' | 'cookie';
|
|
54
|
+
required?: boolean;
|
|
55
|
+
schema?: JsonSchema;
|
|
56
|
+
description?: string;
|
|
57
|
+
deprecated?: boolean;
|
|
58
|
+
$ref?: string;
|
|
59
|
+
}
|
|
60
|
+
interface RequestBodyObject {
|
|
61
|
+
required?: boolean;
|
|
62
|
+
content?: Record<string, {
|
|
63
|
+
schema?: JsonSchema;
|
|
64
|
+
}>;
|
|
65
|
+
description?: string;
|
|
66
|
+
$ref?: string;
|
|
67
|
+
}
|
|
68
|
+
interface ResponseObject {
|
|
69
|
+
description?: string;
|
|
70
|
+
content?: Record<string, {
|
|
71
|
+
schema?: JsonSchema;
|
|
72
|
+
}>;
|
|
73
|
+
$ref?: string;
|
|
74
|
+
}
|
|
75
|
+
interface JsonSchema {
|
|
76
|
+
[key: string]: unknown;
|
|
77
|
+
}
|
|
78
|
+
interface ParsedOperation {
|
|
79
|
+
/** e.g. "getUser" */
|
|
80
|
+
operationId: string;
|
|
81
|
+
/** HTTP method uppercase */
|
|
82
|
+
method: string;
|
|
83
|
+
/** OpenAPI path, e.g. "/users/{id}" */
|
|
84
|
+
path: string;
|
|
85
|
+
/** Silgi path, e.g. "/users/:id" */
|
|
86
|
+
silgiPath: string;
|
|
87
|
+
summary?: string;
|
|
88
|
+
description?: string;
|
|
89
|
+
tags: string[];
|
|
90
|
+
deprecated: boolean;
|
|
91
|
+
/** Path parameters */
|
|
92
|
+
pathParams: ParsedParam[];
|
|
93
|
+
/** Query parameters */
|
|
94
|
+
queryParams: ParsedParam[];
|
|
95
|
+
/** Request body JSON Schema (if any) */
|
|
96
|
+
body: JsonSchema | null;
|
|
97
|
+
bodyRequired: boolean;
|
|
98
|
+
/** Success response schema */
|
|
99
|
+
successSchema: JsonSchema | null;
|
|
100
|
+
successStatus: number;
|
|
101
|
+
/** Error responses: status code → schema */
|
|
102
|
+
errors: Map<number, {
|
|
103
|
+
description: string;
|
|
104
|
+
schema: JsonSchema | null;
|
|
105
|
+
}>;
|
|
106
|
+
/** Security requirement (false = public) */
|
|
107
|
+
security: string[] | false | null;
|
|
108
|
+
}
|
|
109
|
+
interface ParsedParam {
|
|
110
|
+
name: string;
|
|
111
|
+
required: boolean;
|
|
112
|
+
schema: JsonSchema;
|
|
113
|
+
description?: string;
|
|
114
|
+
}
|
|
115
|
+
declare function parseOpenAPI(spec: OpenAPISpec): {
|
|
116
|
+
operations: ParsedOperation[];
|
|
117
|
+
components: Record<string, JsonSchema>;
|
|
118
|
+
tags: {
|
|
119
|
+
name: string;
|
|
120
|
+
description?: string;
|
|
121
|
+
}[];
|
|
122
|
+
};
|
|
123
|
+
//#endregion
|
|
124
|
+
export { OpenAPISpec, ParsedOperation, parseOpenAPI };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
//#region src/codegen/parse.ts
|
|
2
|
+
const HTTP_METHODS = [
|
|
3
|
+
"get",
|
|
4
|
+
"post",
|
|
5
|
+
"put",
|
|
6
|
+
"patch",
|
|
7
|
+
"delete",
|
|
8
|
+
"head",
|
|
9
|
+
"options",
|
|
10
|
+
"trace"
|
|
11
|
+
];
|
|
12
|
+
function parseOpenAPI(spec) {
|
|
13
|
+
const operations = [];
|
|
14
|
+
const components = spec.components?.schemas ?? {};
|
|
15
|
+
const tags = spec.tags ?? [];
|
|
16
|
+
if (!spec.paths) return {
|
|
17
|
+
operations,
|
|
18
|
+
components,
|
|
19
|
+
tags
|
|
20
|
+
};
|
|
21
|
+
for (const [path, pathItem] of Object.entries(spec.paths)) {
|
|
22
|
+
const sharedParams = resolveParams(pathItem.parameters ?? [], spec);
|
|
23
|
+
for (const method of HTTP_METHODS) {
|
|
24
|
+
const op = pathItem[method];
|
|
25
|
+
if (!op) continue;
|
|
26
|
+
const allParams = mergeParams(sharedParams, resolveParams(op.parameters ?? [], spec));
|
|
27
|
+
const pathParams = allParams.filter((p) => p.in === "path");
|
|
28
|
+
const queryParams = allParams.filter((p) => p.in === "query");
|
|
29
|
+
const bodyObj = op.requestBody ? resolveRef(op.requestBody, spec) : null;
|
|
30
|
+
const bodySchema = bodyObj ? extractBodySchema(bodyObj) : null;
|
|
31
|
+
const { successSchema, successStatus, errors } = parseResponses(op.responses ?? {}, spec);
|
|
32
|
+
let security = null;
|
|
33
|
+
if (op.security) if (op.security.length === 0) security = false;
|
|
34
|
+
else security = op.security.flatMap((s) => Object.keys(s));
|
|
35
|
+
operations.push({
|
|
36
|
+
operationId: op.operationId ?? generateOperationId(method, path),
|
|
37
|
+
method: method.toUpperCase(),
|
|
38
|
+
path,
|
|
39
|
+
silgiPath: toSilgiPath(path),
|
|
40
|
+
summary: op.summary,
|
|
41
|
+
description: op.description,
|
|
42
|
+
tags: op.tags ?? [],
|
|
43
|
+
deprecated: op.deprecated ?? false,
|
|
44
|
+
pathParams: pathParams.map((p) => ({
|
|
45
|
+
name: p.name,
|
|
46
|
+
required: p.required ?? true,
|
|
47
|
+
schema: p.schema ?? { type: "string" },
|
|
48
|
+
description: p.description
|
|
49
|
+
})),
|
|
50
|
+
queryParams: queryParams.map((p) => ({
|
|
51
|
+
name: p.name,
|
|
52
|
+
required: p.required ?? false,
|
|
53
|
+
schema: p.schema ?? { type: "string" },
|
|
54
|
+
description: p.description
|
|
55
|
+
})),
|
|
56
|
+
body: bodySchema,
|
|
57
|
+
bodyRequired: bodyObj?.required ?? false,
|
|
58
|
+
successSchema,
|
|
59
|
+
successStatus,
|
|
60
|
+
errors,
|
|
61
|
+
security
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
operations,
|
|
67
|
+
components,
|
|
68
|
+
tags
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convert OpenAPI path to Silgi path.
|
|
73
|
+
* `/users/{id}/posts/{postId}` → `/users/:id/posts/:postId`
|
|
74
|
+
*/
|
|
75
|
+
function toSilgiPath(path) {
|
|
76
|
+
return path.replace(/\{([^}]+)\}/g, ":$1");
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generate a fallback operationId from method + path.
|
|
80
|
+
* `GET /users/{id}` → `getUsers_id`
|
|
81
|
+
*/
|
|
82
|
+
function generateOperationId(method, path) {
|
|
83
|
+
const camel = path.replace(/\{([^}]+)\}/g, "$1").split("/").filter(Boolean).map((s, i) => i === 0 ? s : s[0].toUpperCase() + s.slice(1)).join("");
|
|
84
|
+
return method + camel[0].toUpperCase() + camel.slice(1);
|
|
85
|
+
}
|
|
86
|
+
function resolveRef(obj, spec) {
|
|
87
|
+
if (!obj || typeof obj !== "object" || !("$ref" in obj) || !obj.$ref) return obj;
|
|
88
|
+
const parts = obj.$ref.replace("#/", "").split("/");
|
|
89
|
+
let current = spec;
|
|
90
|
+
for (const part of parts) current = current?.[part];
|
|
91
|
+
return current ?? obj;
|
|
92
|
+
}
|
|
93
|
+
function resolveParams(params, spec) {
|
|
94
|
+
return params.map((p) => resolveRef(p, spec));
|
|
95
|
+
}
|
|
96
|
+
function mergeParams(shared, op) {
|
|
97
|
+
const map = /* @__PURE__ */ new Map();
|
|
98
|
+
for (const p of shared) map.set(`${p.in}:${p.name}`, p);
|
|
99
|
+
for (const p of op) map.set(`${p.in}:${p.name}`, p);
|
|
100
|
+
return [...map.values()];
|
|
101
|
+
}
|
|
102
|
+
function extractBodySchema(body) {
|
|
103
|
+
if (!body.content) return null;
|
|
104
|
+
return (body.content["application/json"] ?? body.content["*/*"])?.schema ?? null;
|
|
105
|
+
}
|
|
106
|
+
function parseResponses(responses, spec) {
|
|
107
|
+
let successSchema = null;
|
|
108
|
+
let successStatus = 200;
|
|
109
|
+
const errors = /* @__PURE__ */ new Map();
|
|
110
|
+
for (const [statusCode, rawResp] of Object.entries(responses)) {
|
|
111
|
+
const resp = resolveRef(rawResp, spec);
|
|
112
|
+
const status = statusCode === "default" ? 500 : Number.parseInt(statusCode, 10);
|
|
113
|
+
const schema = extractResponseSchema(resp);
|
|
114
|
+
if (status >= 200 && status < 300) {
|
|
115
|
+
if (!successSchema) {
|
|
116
|
+
successSchema = schema;
|
|
117
|
+
successStatus = status;
|
|
118
|
+
}
|
|
119
|
+
} else if (status >= 400) errors.set(status, {
|
|
120
|
+
description: resp.description ?? "",
|
|
121
|
+
schema
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
successSchema,
|
|
126
|
+
successStatus,
|
|
127
|
+
errors
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function extractResponseSchema(resp) {
|
|
131
|
+
if (!resp.content) return null;
|
|
132
|
+
return (resp.content["application/json"] ?? resp.content["*/*"])?.schema ?? null;
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
export { parseOpenAPI };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/codegen/preserve.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Smart route preservation — uses oxc-parser to extract the $resolve() body
|
|
4
|
+
* from an existing route file so it survives regeneration.
|
|
5
|
+
*
|
|
6
|
+
* The strategy: parse the existing file's AST, find the .$resolve(fn) call,
|
|
7
|
+
* extract the fn source code by span, then splice it into the newly generated file.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Extract the $resolve() argument source code from a route file.
|
|
11
|
+
* Returns the raw source string of the resolve function, or null if not found
|
|
12
|
+
* or if the resolve body is a stub (contains "Not implemented").
|
|
13
|
+
*/
|
|
14
|
+
declare function extractResolveBody(source: string): string | null;
|
|
15
|
+
/**
|
|
16
|
+
* Splice a preserved resolve body into a newly generated route file.
|
|
17
|
+
* Replaces the generated stub $resolve(...) argument with the preserved one.
|
|
18
|
+
*/
|
|
19
|
+
declare function spliceResolveBody(generatedSource: string, preservedBody: string): string;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { extractResolveBody, spliceResolveBody };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { parseSync } from "oxc-parser";
|
|
2
|
+
//#region src/codegen/preserve.ts
|
|
3
|
+
/**
|
|
4
|
+
* Smart route preservation — uses oxc-parser to extract the $resolve() body
|
|
5
|
+
* from an existing route file so it survives regeneration.
|
|
6
|
+
*
|
|
7
|
+
* The strategy: parse the existing file's AST, find the .$resolve(fn) call,
|
|
8
|
+
* extract the fn source code by span, then splice it into the newly generated file.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Extract the $resolve() argument source code from a route file.
|
|
12
|
+
* Returns the raw source string of the resolve function, or null if not found
|
|
13
|
+
* or if the resolve body is a stub (contains "Not implemented").
|
|
14
|
+
*/
|
|
15
|
+
function extractResolveBody(source) {
|
|
16
|
+
try {
|
|
17
|
+
const { program } = parseSync("route.ts", source);
|
|
18
|
+
const exportDecl = program.body.find((n) => n.type === "ExportNamedDeclaration" && n.declaration?.type === "VariableDeclaration");
|
|
19
|
+
if (!exportDecl) return null;
|
|
20
|
+
const init = exportDecl.declaration.declarations[0]?.init;
|
|
21
|
+
if (!init) return null;
|
|
22
|
+
const resolveCall = findResolveCall(init);
|
|
23
|
+
if (!resolveCall || !resolveCall.arguments[0]) return null;
|
|
24
|
+
const arg = resolveCall.arguments[0];
|
|
25
|
+
const body = source.slice(arg.start, arg.end);
|
|
26
|
+
if (body.includes("Not implemented")) return null;
|
|
27
|
+
return body;
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Splice a preserved resolve body into a newly generated route file.
|
|
34
|
+
* Replaces the generated stub $resolve(...) argument with the preserved one.
|
|
35
|
+
*/
|
|
36
|
+
function spliceResolveBody(generatedSource, preservedBody) {
|
|
37
|
+
try {
|
|
38
|
+
const { program } = parseSync("route.ts", generatedSource);
|
|
39
|
+
const exportDecl = program.body.find((n) => n.type === "ExportNamedDeclaration" && n.declaration?.type === "VariableDeclaration");
|
|
40
|
+
if (!exportDecl) return generatedSource;
|
|
41
|
+
const init = exportDecl.declaration.declarations[0]?.init;
|
|
42
|
+
if (!init) return generatedSource;
|
|
43
|
+
const resolveCall = findResolveCall(init);
|
|
44
|
+
if (!resolveCall || !resolveCall.arguments[0]) return generatedSource;
|
|
45
|
+
const arg = resolveCall.arguments[0];
|
|
46
|
+
return generatedSource.slice(0, arg.start) + preservedBody + generatedSource.slice(arg.end);
|
|
47
|
+
} catch {
|
|
48
|
+
return generatedSource;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Walk a chained CallExpression to find .$resolve(...) */
|
|
52
|
+
function findResolveCall(node) {
|
|
53
|
+
if (!node) return null;
|
|
54
|
+
if (node.type === "CallExpression") {
|
|
55
|
+
if (node.callee?.type === "MemberExpression" && node.callee.property?.name === "$resolve") return node;
|
|
56
|
+
return findResolveCall(node.callee?.object);
|
|
57
|
+
}
|
|
58
|
+
if (node.type === "MemberExpression") return findResolveCall(node.object);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { extractResolveBody, spliceResolveBody };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { SchemaEmitter, SchemaTarget } from "./emitters.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/codegen/schema-to-code.d.ts
|
|
4
|
+
interface JsonSchema {
|
|
5
|
+
type?: string | string[];
|
|
6
|
+
properties?: Record<string, JsonSchema>;
|
|
7
|
+
required?: string[];
|
|
8
|
+
items?: JsonSchema;
|
|
9
|
+
additionalProperties?: boolean | JsonSchema;
|
|
10
|
+
allOf?: JsonSchema[];
|
|
11
|
+
anyOf?: JsonSchema[];
|
|
12
|
+
oneOf?: JsonSchema[];
|
|
13
|
+
not?: JsonSchema;
|
|
14
|
+
enum?: unknown[];
|
|
15
|
+
const?: unknown;
|
|
16
|
+
$ref?: string;
|
|
17
|
+
format?: string;
|
|
18
|
+
pattern?: string;
|
|
19
|
+
minimum?: number;
|
|
20
|
+
maximum?: number;
|
|
21
|
+
exclusiveMinimum?: number | boolean;
|
|
22
|
+
exclusiveMaximum?: number | boolean;
|
|
23
|
+
minLength?: number;
|
|
24
|
+
maxLength?: number;
|
|
25
|
+
minItems?: number;
|
|
26
|
+
maxItems?: number;
|
|
27
|
+
uniqueItems?: boolean;
|
|
28
|
+
default?: unknown;
|
|
29
|
+
nullable?: boolean;
|
|
30
|
+
description?: string;
|
|
31
|
+
deprecated?: boolean;
|
|
32
|
+
title?: string;
|
|
33
|
+
readOnly?: boolean;
|
|
34
|
+
writeOnly?: boolean;
|
|
35
|
+
discriminator?: {
|
|
36
|
+
propertyName: string;
|
|
37
|
+
mapping?: Record<string, string>;
|
|
38
|
+
};
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
}
|
|
41
|
+
interface SchemaContext {
|
|
42
|
+
/** Collected component schema names that need to be emitted */
|
|
43
|
+
refs: Set<string>;
|
|
44
|
+
/** All component schemas from the spec */
|
|
45
|
+
components: Record<string, JsonSchema>;
|
|
46
|
+
/** Already-emitted schema names (prevents infinite recursion) */
|
|
47
|
+
emitted: Set<string>;
|
|
48
|
+
/** Active emitter for the target library */
|
|
49
|
+
emitter: SchemaEmitter;
|
|
50
|
+
}
|
|
51
|
+
declare function createSchemaContext(target: SchemaTarget, components?: Record<string, JsonSchema>): SchemaContext;
|
|
52
|
+
/**
|
|
53
|
+
* Convert a JSON Schema to a validation library code string.
|
|
54
|
+
*/
|
|
55
|
+
declare function jsonSchemaToCode(schema: JsonSchema, ctx: SchemaContext): string;
|
|
56
|
+
//#endregion
|
|
57
|
+
export { SchemaContext, createSchemaContext, jsonSchemaToCode };
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { getEmitter } from "./emitters.mjs";
|
|
2
|
+
//#region src/codegen/schema-to-code.ts
|
|
3
|
+
/**
|
|
4
|
+
* JSON Schema → validation library code converter.
|
|
5
|
+
*
|
|
6
|
+
* Generic converter that delegates to a SchemaEmitter for library-specific output.
|
|
7
|
+
* Supports Zod, Valibot, and ArkType via the emitter pattern.
|
|
8
|
+
*/
|
|
9
|
+
function createSchemaContext(target, components = {}) {
|
|
10
|
+
return {
|
|
11
|
+
refs: /* @__PURE__ */ new Set(),
|
|
12
|
+
components,
|
|
13
|
+
emitted: /* @__PURE__ */ new Set(),
|
|
14
|
+
emitter: getEmitter(target)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Convert a JSON Schema to a validation library code string.
|
|
19
|
+
*/
|
|
20
|
+
function jsonSchemaToCode(schema, ctx) {
|
|
21
|
+
const e = ctx.emitter;
|
|
22
|
+
if (!schema || typeof schema !== "object") return e.unknown();
|
|
23
|
+
if (schema.$ref) {
|
|
24
|
+
const refName = resolveRefName(schema.$ref);
|
|
25
|
+
ctx.refs.add(refName);
|
|
26
|
+
return refName + "Schema";
|
|
27
|
+
}
|
|
28
|
+
if (schema.const !== void 0) return e.literal(schema.const);
|
|
29
|
+
if (schema.enum) {
|
|
30
|
+
if (schema.enum.length === 1) return e.literal(schema.enum[0]);
|
|
31
|
+
return e.enum(schema.enum);
|
|
32
|
+
}
|
|
33
|
+
if (schema.allOf?.length) {
|
|
34
|
+
if (schema.allOf.length === 1) return jsonSchemaToCode(schema.allOf[0], ctx);
|
|
35
|
+
const parts = schema.allOf.map((s) => jsonSchemaToCode(s, ctx));
|
|
36
|
+
return e.intersection(parts);
|
|
37
|
+
}
|
|
38
|
+
if (schema.oneOf?.length || schema.anyOf?.length) {
|
|
39
|
+
const variants = schema.oneOf ?? schema.anyOf;
|
|
40
|
+
if (variants.length === 1) return jsonSchemaToCode(variants[0], ctx);
|
|
41
|
+
const members = variants.map((v) => jsonSchemaToCode(v, ctx));
|
|
42
|
+
if (schema.discriminator?.propertyName) return e.discriminatedUnion(schema.discriminator.propertyName, members);
|
|
43
|
+
return e.union(members);
|
|
44
|
+
}
|
|
45
|
+
const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];
|
|
46
|
+
const isNullable = schema.nullable || types.includes("null");
|
|
47
|
+
const nonNullTypes = types.filter((t) => t !== "null");
|
|
48
|
+
if (nonNullTypes.length > 1) {
|
|
49
|
+
const members = nonNullTypes.map((t) => jsonSchemaToCode({
|
|
50
|
+
...schema,
|
|
51
|
+
type: t
|
|
52
|
+
}, ctx));
|
|
53
|
+
let result = e.union(members);
|
|
54
|
+
if (isNullable) result = e.nullable(result);
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
const type = nonNullTypes[0] ?? (types.length === 0 ? void 0 : nonNullTypes[0]);
|
|
58
|
+
let result;
|
|
59
|
+
switch (type) {
|
|
60
|
+
case "string":
|
|
61
|
+
result = buildString(schema, e);
|
|
62
|
+
break;
|
|
63
|
+
case "number":
|
|
64
|
+
case "integer":
|
|
65
|
+
result = buildNumber(schema, type, e);
|
|
66
|
+
break;
|
|
67
|
+
case "boolean":
|
|
68
|
+
result = e.boolean();
|
|
69
|
+
break;
|
|
70
|
+
case "null": return e.null();
|
|
71
|
+
case "object":
|
|
72
|
+
result = buildObject(schema, ctx);
|
|
73
|
+
break;
|
|
74
|
+
case "array":
|
|
75
|
+
result = buildArray(schema, ctx);
|
|
76
|
+
break;
|
|
77
|
+
default: if (schema.properties) result = buildObject(schema, ctx);
|
|
78
|
+
else result = e.unknown();
|
|
79
|
+
}
|
|
80
|
+
if (isNullable && type !== "null") result = e.nullable(result);
|
|
81
|
+
if (schema.default !== void 0) result = e.default(result, schema.default);
|
|
82
|
+
if (schema.description) result = e.describe(result, schema.description);
|
|
83
|
+
return result;
|
|
84
|
+
}
|
|
85
|
+
function buildString(schema, e) {
|
|
86
|
+
if (schema.format === "email") return applyStringConstraints(e.email(), schema, e);
|
|
87
|
+
if (schema.format === "uri" || schema.format === "url") return applyStringConstraints(e.url(), schema, e);
|
|
88
|
+
if (schema.format === "uuid") return applyStringConstraints(e.uuid(), schema, e);
|
|
89
|
+
if (schema.format === "date-time") return applyStringConstraints(e.datetime(), schema, e);
|
|
90
|
+
if (schema.format === "date") return applyStringConstraints(e.date(), schema, e);
|
|
91
|
+
if (schema.format === "ipv4") return applyStringConstraints(e.ipv4(), schema, e);
|
|
92
|
+
if (schema.format === "ipv6") return applyStringConstraints(e.ipv6(), schema, e);
|
|
93
|
+
return applyStringConstraints(e.string(), schema, e);
|
|
94
|
+
}
|
|
95
|
+
function applyStringConstraints(base, schema, e) {
|
|
96
|
+
let s = base;
|
|
97
|
+
if (schema.minLength != null) s = e.min(s, schema.minLength);
|
|
98
|
+
if (schema.maxLength != null) s = e.max(s, schema.maxLength);
|
|
99
|
+
if (schema.pattern) s = e.regex(s, schema.pattern);
|
|
100
|
+
return s;
|
|
101
|
+
}
|
|
102
|
+
function buildNumber(schema, type, e) {
|
|
103
|
+
let s = type === "integer" ? e.int() : e.number();
|
|
104
|
+
if (schema.minimum != null) s = e.min(s, schema.minimum);
|
|
105
|
+
if (schema.maximum != null) s = e.max(s, schema.maximum);
|
|
106
|
+
if (typeof schema.exclusiveMinimum === "number") s = e.gt(s, schema.exclusiveMinimum);
|
|
107
|
+
if (typeof schema.exclusiveMaximum === "number") s = e.lt(s, schema.exclusiveMaximum);
|
|
108
|
+
return s;
|
|
109
|
+
}
|
|
110
|
+
function buildObject(schema, ctx) {
|
|
111
|
+
const e = ctx.emitter;
|
|
112
|
+
if (!schema.properties && schema.additionalProperties) {
|
|
113
|
+
const valueSchema = typeof schema.additionalProperties === "object" ? jsonSchemaToCode(schema.additionalProperties, ctx) : e.unknown();
|
|
114
|
+
return e.record(e.string(), valueSchema);
|
|
115
|
+
}
|
|
116
|
+
if (!schema.properties) {
|
|
117
|
+
if (schema.additionalProperties === false) return e.object([]);
|
|
118
|
+
return e.record(e.string(), e.unknown());
|
|
119
|
+
}
|
|
120
|
+
const required = new Set(schema.required ?? []);
|
|
121
|
+
const entries = Object.entries(schema.properties).map(([key, prop]) => ({
|
|
122
|
+
key,
|
|
123
|
+
value: jsonSchemaToCode(prop, ctx),
|
|
124
|
+
required: required.has(key)
|
|
125
|
+
}));
|
|
126
|
+
return e.object(entries);
|
|
127
|
+
}
|
|
128
|
+
function buildArray(schema, ctx) {
|
|
129
|
+
const e = ctx.emitter;
|
|
130
|
+
const items = schema.items ? jsonSchemaToCode(schema.items, ctx) : e.unknown();
|
|
131
|
+
let s = e.array(items);
|
|
132
|
+
if (schema.minItems != null) s = e.min(s, schema.minItems);
|
|
133
|
+
if (schema.maxItems != null) s = e.max(s, schema.maxItems);
|
|
134
|
+
return s;
|
|
135
|
+
}
|
|
136
|
+
function resolveRefName(ref) {
|
|
137
|
+
const parts = ref.split("/");
|
|
138
|
+
return parts[parts.length - 1];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Generate all referenced component schemas as declarations.
|
|
142
|
+
* Recursively resolves nested refs.
|
|
143
|
+
*/
|
|
144
|
+
function emitComponentSchemas(ctx) {
|
|
145
|
+
const lines = [];
|
|
146
|
+
let toProcess = [...ctx.refs];
|
|
147
|
+
while (toProcess.length > 0) {
|
|
148
|
+
const next = [];
|
|
149
|
+
for (const name of toProcess) {
|
|
150
|
+
if (ctx.emitted.has(name)) continue;
|
|
151
|
+
ctx.emitted.add(name);
|
|
152
|
+
const schema = ctx.components[name];
|
|
153
|
+
if (!schema) {
|
|
154
|
+
lines.push(`// WARNING: Missing component schema "${name}"`);
|
|
155
|
+
lines.push(`export const ${name}Schema = ${ctx.emitter.unknown()}`);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const code = jsonSchemaToCode(schema, ctx);
|
|
159
|
+
lines.push(`export const ${name}Schema = ${code}`);
|
|
160
|
+
for (const ref of ctx.refs) if (!ctx.emitted.has(ref)) next.push(ref);
|
|
161
|
+
}
|
|
162
|
+
toProcess = next;
|
|
163
|
+
}
|
|
164
|
+
return lines.join("\n\n");
|
|
165
|
+
}
|
|
166
|
+
//#endregion
|
|
167
|
+
export { createSchemaContext, emitComponentSchemas, jsonSchemaToCode };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ProcedureDef } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/compile.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Compiled pipeline — called per request.
|
|
6
|
+
* May return sync value OR Promise — caller uses instanceof check.
|
|
7
|
+
*/
|
|
8
|
+
type CompiledHandler = (ctx: Record<string, unknown>, rawInput: unknown, signal: AbortSignal) => unknown | Promise<unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Compile a procedure into the fastest possible handler.
|
|
11
|
+
*
|
|
12
|
+
* Optimizations applied:
|
|
13
|
+
* - Guard count specialization (unrolled for 0-4)
|
|
14
|
+
* - Separate fast path for no-wrap case (zero closures per request)
|
|
15
|
+
* - Pre-computed fail function (singleton per procedure)
|
|
16
|
+
* - Sync fast path when all guards are sync
|
|
17
|
+
*/
|
|
18
|
+
declare function compileProcedure(procedure: ProcedureDef): CompiledHandler;
|
|
19
|
+
interface CompiledRoute {
|
|
20
|
+
handler: CompiledHandler;
|
|
21
|
+
/** Pre-computed Cache-Control header value, or undefined if no caching */
|
|
22
|
+
cacheControl?: string;
|
|
23
|
+
/** Procedure is accessible over WebSocket */
|
|
24
|
+
ws?: boolean;
|
|
25
|
+
/** Skip body parsing — procedure receives raw request (e.g. catch-all proxy) */
|
|
26
|
+
passthrough?: boolean;
|
|
27
|
+
/** HTTP method this route is registered for (uppercase) */
|
|
28
|
+
method: string;
|
|
29
|
+
}
|
|
30
|
+
/** Match result from the router */
|
|
31
|
+
interface MatchedRoute<T = unknown> {
|
|
32
|
+
data: T;
|
|
33
|
+
params?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
/** Compiled router function — returns matched route + params */
|
|
36
|
+
type CompiledRouterFn = (method: string, path: string) => MatchedRoute<CompiledRoute> | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Compile a router tree into a rou3 radix router.
|
|
39
|
+
*
|
|
40
|
+
* Powered by rou3 (unjs) — battle-tested, fast, minimal.
|
|
41
|
+
*/
|
|
42
|
+
declare function compileRouter(def: Record<string, unknown>): CompiledRouterFn;
|
|
43
|
+
/** Acquire a context object from the pool (or create one). */
|
|
44
|
+
declare function createContext(): Record<string, unknown>;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { compileProcedure, compileRouter, createContext };
|