jishushell 0.6.18 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/anythingllm-container.yaml +1 -0
- package/apps/browserless-chromium-container.yaml +1 -0
- package/apps/filebrowser-container.yaml +1 -0
- package/apps/hermes-container.yaml +1 -7
- package/apps/immich-container-lite.yaml +337 -0
- package/apps/immich-container.yaml +371 -0
- package/apps/jishu-kb-container.yaml +26 -21
- package/apps/ollama-binary.yaml +1 -0
- package/apps/ollama-cpu-container.yaml +1 -0
- package/apps/ollama-with-hollama-binary.yaml +2 -0
- package/apps/openclaw-binary.yaml +4 -8
- package/apps/openclaw-container.yaml +1 -7
- package/apps/openclaw-with-ollama-container.yaml +1 -0
- package/apps/openclaw-with-searxng-container.yaml +20 -0
- package/apps/searxng-container.yaml +20 -0
- package/apps/weknora-container.yaml +5 -0
- package/dependencies/jishushell-panel-0.7.3.tgz +0 -0
- package/dist/cli/core.js +1 -1
- package/dist/cli/core.js.map +1 -1
- package/dist/cli/doctor.js +96 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/config.d.ts +9 -1
- package/dist/config.js +72 -2
- package/dist/config.js.map +1 -1
- package/dist/install.js +60 -19
- package/dist/install.js.map +1 -1
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +72 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/docker.d.ts +2 -0
- package/dist/routes/docker.js +58 -0
- package/dist/routes/docker.js.map +1 -0
- package/dist/routes/file-mounts.js +5 -8
- package/dist/routes/file-mounts.js.map +1 -1
- package/dist/routes/instances.d.ts +0 -14
- package/dist/routes/instances.js +44 -1184
- package/dist/routes/instances.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.js +53 -20
- package/dist/server.js.map +1 -1
- package/dist/services/app-common/catalog-service.js +15 -5
- package/dist/services/app-common/catalog-service.js.map +1 -1
- package/dist/services/app-common/delete-service.js +5 -0
- package/dist/services/app-common/delete-service.js.map +1 -1
- package/dist/services/app-common/instance-store.js +3 -0
- package/dist/services/app-common/instance-store.js.map +1 -1
- package/dist/services/app-common/lifecycle-service.js +12 -4
- package/dist/services/app-common/lifecycle-service.js.map +1 -1
- package/dist/services/app-common/ownership.d.ts +3 -0
- package/dist/services/app-common/ownership.js +11 -0
- package/dist/services/app-common/ownership.js.map +1 -0
- package/dist/services/app-common/runtime-facts.js +2 -0
- package/dist/services/app-common/runtime-facts.js.map +1 -1
- package/dist/services/app-common/spec-materializer.d.ts +0 -1
- package/dist/services/app-common/spec-materializer.js +21 -87
- package/dist/services/app-common/spec-materializer.js.map +1 -1
- package/dist/services/app-common/status-refresh.js +25 -13
- package/dist/services/app-common/status-refresh.js.map +1 -1
- package/dist/services/app-modules/browserless/routes.js +5 -3
- package/dist/services/app-modules/browserless/routes.js.map +1 -1
- package/dist/services/capabilities/contract.d.ts +1 -2
- package/dist/services/capabilities/contract.js +0 -10
- package/dist/services/capabilities/contract.js.map +1 -1
- package/dist/services/capabilities/endpoint-validator.js +0 -1
- package/dist/services/capabilities/endpoint-validator.js.map +1 -1
- package/dist/services/capabilities/health.js +1 -1
- package/dist/services/capabilities/health.js.map +1 -1
- package/dist/services/capability-proxy/http.d.ts +7 -0
- package/dist/services/capability-proxy/http.js +555 -0
- package/dist/services/capability-proxy/http.js.map +1 -0
- package/dist/services/capability-proxy/terminal.d.ts +4 -0
- package/dist/services/capability-proxy/terminal.js +179 -0
- package/dist/services/capability-proxy/terminal.js.map +1 -0
- package/dist/services/connections/admin.js +19 -9
- package/dist/services/connections/admin.js.map +1 -1
- package/dist/services/connections/apply.d.ts +3 -9
- package/dist/services/connections/apply.js +0 -29
- package/dist/services/connections/apply.js.map +1 -1
- package/dist/services/connections/transactor.js +2 -2
- package/dist/services/connections/transactor.js.map +1 -1
- package/dist/services/files/bootstrap.d.ts +7 -0
- package/dist/services/files/bootstrap.js +16 -0
- package/dist/services/files/bootstrap.js.map +1 -0
- package/dist/services/files/photos/upload-page.d.ts +2 -0
- package/dist/services/files/photos/upload-page.js +248 -0
- package/dist/services/files/photos/upload-page.js.map +1 -0
- package/dist/services/files/photos/upload-store.d.ts +74 -0
- package/dist/services/files/photos/upload-store.js +432 -0
- package/dist/services/files/photos/upload-store.js.map +1 -0
- package/dist/services/http/proxy-utils.d.ts +7 -0
- package/dist/services/http/proxy-utils.js +29 -0
- package/dist/services/http/proxy-utils.js.map +1 -0
- package/dist/services/http/request-utils.d.ts +3 -0
- package/dist/services/http/request-utils.js +23 -0
- package/dist/services/http/request-utils.js.map +1 -0
- package/dist/services/instances/manager.d.ts +6 -5
- package/dist/services/instances/manager.js +45 -51
- package/dist/services/instances/manager.js.map +1 -1
- package/dist/services/instances/pairing.d.ts +17 -0
- package/dist/services/instances/pairing.js +53 -0
- package/dist/services/instances/pairing.js.map +1 -0
- package/dist/services/instances/status.d.ts +2 -0
- package/dist/services/instances/status.js +11 -0
- package/dist/services/instances/status.js.map +1 -0
- package/dist/services/integrations/hermes/integration.d.ts +1 -1
- package/dist/services/integrations/hermes/integration.js +7 -8
- package/dist/services/integrations/hermes/integration.js.map +1 -1
- package/dist/services/integrations/immich/client.d.ts +93 -0
- package/dist/services/integrations/immich/client.js +458 -0
- package/dist/services/integrations/immich/client.js.map +1 -0
- package/dist/services/integrations/immich/config.d.ts +15 -0
- package/dist/services/integrations/immich/config.js +178 -0
- package/dist/services/integrations/immich/config.js.map +1 -0
- package/dist/services/integrations/immich/discovery.d.ts +9 -0
- package/dist/services/integrations/immich/discovery.js +101 -0
- package/dist/services/integrations/immich/discovery.js.map +1 -0
- package/dist/services/integrations/immich/gallery-renderer.d.ts +5 -0
- package/dist/services/integrations/immich/gallery-renderer.js +150 -0
- package/dist/services/integrations/immich/gallery-renderer.js.map +1 -0
- package/dist/services/integrations/immich/immich-shim.d.ts +11 -0
- package/dist/services/integrations/immich/immich-shim.js +439 -0
- package/dist/services/integrations/immich/immich-shim.js.map +1 -0
- package/dist/services/integrations/immich/integration.d.ts +18 -0
- package/dist/services/integrations/immich/integration.js +64 -0
- package/dist/services/integrations/immich/integration.js.map +1 -0
- package/dist/services/integrations/immich/photo-library.d.ts +4 -0
- package/dist/services/integrations/immich/photo-library.js +63 -0
- package/dist/services/integrations/immich/photo-library.js.map +1 -0
- package/dist/services/integrations/immich/review-executor.d.ts +3 -0
- package/dist/services/integrations/immich/review-executor.js +41 -0
- package/dist/services/integrations/immich/review-executor.js.map +1 -0
- package/dist/services/integrations/immich/review-session-service.d.ts +27 -0
- package/dist/services/integrations/immich/review-session-service.js +206 -0
- package/dist/services/integrations/immich/review-session-service.js.map +1 -0
- package/dist/services/integrations/immich/review-store.d.ts +47 -0
- package/dist/services/integrations/immich/review-store.js +347 -0
- package/dist/services/integrations/immich/review-store.js.map +1 -0
- package/dist/services/integrations/immich/routes.d.ts +7 -0
- package/dist/services/integrations/immich/routes.js +363 -0
- package/dist/services/integrations/immich/routes.js.map +1 -0
- package/dist/services/integrations/immich/types.d.ts +186 -0
- package/dist/services/integrations/immich/types.js +2 -0
- package/dist/services/integrations/immich/types.js.map +1 -0
- package/dist/services/integrations/index.d.ts +1 -0
- package/dist/services/integrations/index.js +1 -0
- package/dist/services/integrations/index.js.map +1 -1
- package/dist/services/integrations/installable/installers/integration.js +113 -7
- package/dist/services/integrations/installable/installers/integration.js.map +1 -1
- package/dist/services/integrations/jishukb/integration.d.ts +3 -1
- package/dist/services/integrations/jishukb/integration.js +121 -10
- package/dist/services/integrations/jishukb/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/integration.d.ts +21 -7
- package/dist/services/integrations/openclaw/integration.js +385 -158
- package/dist/services/integrations/openclaw/integration.js.map +1 -1
- package/dist/services/integrations/openclaw/jishukb-native-mcp.d.ts +58 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js +373 -0
- package/dist/services/integrations/openclaw/jishukb-native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/jishukb-shim.d.ts +8 -4
- package/dist/services/integrations/openclaw/jishukb-shim.js +624 -17
- package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -1
- package/dist/services/integrations/openclaw/mcporter.d.ts +13 -0
- package/dist/services/integrations/openclaw/mcporter.js +31 -0
- package/dist/services/integrations/openclaw/mcporter.js.map +1 -1
- package/dist/services/integrations/openclaw/native-mcp.d.ts +48 -0
- package/dist/services/integrations/openclaw/native-mcp.js +125 -0
- package/dist/services/integrations/openclaw/native-mcp.js.map +1 -0
- package/dist/services/integrations/openclaw/routes.js +4 -1
- package/dist/services/integrations/openclaw/routes.js.map +1 -1
- package/dist/services/integrations/types.d.ts +5 -17
- package/dist/services/repair/runtime-repair.js +68 -1
- package/dist/services/repair/runtime-repair.js.map +1 -1
- package/dist/services/runtime/docker-network.d.ts +8 -0
- package/dist/services/runtime/docker-network.js +123 -0
- package/dist/services/runtime/docker-network.js.map +1 -0
- package/dist/services/runtime/driver-registry.d.ts +4 -0
- package/dist/services/runtime/driver-registry.js.map +1 -1
- package/dist/services/runtime/drivers/nomad.d.ts +1 -0
- package/dist/services/runtime/drivers/nomad.js +35 -5
- package/dist/services/runtime/drivers/nomad.js.map +1 -1
- package/dist/services/runtime/service-manager.d.ts +2 -0
- package/dist/services/runtime/service-manager.js +18 -0
- package/dist/services/runtime/service-manager.js.map +1 -0
- package/dist/services/runtime/types.d.ts +1 -0
- package/dist/services/runtime/workload-compiler.js +29 -4
- package/dist/services/runtime/workload-compiler.js.map +1 -1
- package/dist/services/setup/setup-manager.js +29 -73
- package/dist/services/setup/setup-manager.js.map +1 -1
- package/dist/services/system/runtime-ownership.d.ts +36 -0
- package/dist/services/system/runtime-ownership.js +250 -0
- package/dist/services/system/runtime-ownership.js.map +1 -0
- package/dist/services/system/system-reconciler.js +53 -0
- package/dist/services/system/system-reconciler.js.map +1 -1
- package/dist/types.d.ts +19 -3
- package/dist/utils/path-safety.js +1 -1
- package/dist/utils/service-user.d.ts +13 -0
- package/dist/utils/service-user.js +129 -0
- package/dist/utils/service-user.js.map +1 -0
- package/install/jishu-install.sh +0 -1
- package/node_modules/brace-expansion/dist/commonjs/index.js +24 -14
- package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
- package/node_modules/brace-expansion/dist/esm/index.js +24 -14
- package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
- package/node_modules/brace-expansion/package.json +2 -2
- package/node_modules/fast-uri/index.js +1 -1
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/security.test.js +28 -0
- package/node_modules/fastify/SECURITY.md +1 -1
- package/node_modules/fastify/SPONSORS.md +6 -4
- package/node_modules/fastify/docs/Guides/Database.md +0 -28
- package/node_modules/fastify/docs/Guides/Ecosystem.md +13 -2
- package/node_modules/fastify/docs/Guides/Serverless.md +2 -2
- package/node_modules/fastify/docs/Guides/Write-Plugin.md +1 -1
- package/node_modules/fastify/docs/Reference/Encapsulation.md +27 -26
- package/node_modules/fastify/docs/Reference/Errors.md +10 -4
- package/node_modules/fastify/docs/Reference/HTTP2.md +10 -10
- package/node_modules/fastify/docs/Reference/Hooks.md +4 -4
- package/node_modules/fastify/docs/Reference/Index.md +14 -16
- package/node_modules/fastify/docs/Reference/LTS.md +12 -13
- package/node_modules/fastify/docs/Reference/Lifecycle.md +9 -8
- package/node_modules/fastify/docs/Reference/Logging.md +44 -39
- package/node_modules/fastify/docs/Reference/Middleware.md +21 -25
- package/node_modules/fastify/docs/Reference/Principles.md +2 -2
- package/node_modules/fastify/docs/Reference/Reply.md +6 -1
- package/node_modules/fastify/docs/Reference/Request.md +27 -16
- package/node_modules/fastify/docs/Reference/Routes.md +5 -2
- package/node_modules/fastify/docs/Reference/Server.md +31 -3
- package/node_modules/fastify/docs/Reference/Type-Providers.md +29 -5
- package/node_modules/fastify/docs/Reference/Validation-and-Serialization.md +15 -2
- package/node_modules/fastify/docs/Reference/Warnings.md +7 -6
- package/node_modules/fastify/eslint.config.js +7 -2
- package/node_modules/fastify/fastify.d.ts +8 -3
- package/node_modules/fastify/fastify.js +43 -14
- package/node_modules/fastify/lib/content-type-parser.js +13 -1
- package/node_modules/fastify/lib/decorate.js +11 -3
- package/node_modules/fastify/lib/error-handler.js +4 -3
- package/node_modules/fastify/lib/error-serializer.js +59 -59
- package/node_modules/fastify/lib/errors.js +16 -1
- package/node_modules/fastify/lib/four-oh-four.js +14 -9
- package/node_modules/fastify/lib/handle-request.js +11 -5
- package/node_modules/fastify/lib/plugin-override.js +2 -1
- package/node_modules/fastify/lib/plugin-utils.js +5 -5
- package/node_modules/fastify/lib/reply.js +63 -8
- package/node_modules/fastify/lib/request.js +14 -4
- package/node_modules/fastify/lib/route.js +20 -6
- package/node_modules/fastify/lib/schema-controller.js +1 -1
- package/node_modules/fastify/lib/schemas.js +37 -30
- package/node_modules/fastify/lib/symbols.js +3 -1
- package/node_modules/fastify/lib/validation.js +1 -13
- package/node_modules/fastify/lib/warnings.js +3 -3
- package/node_modules/fastify/package.json +13 -15
- package/node_modules/fastify/scripts/validate-ecosystem-links.js +1 -0
- package/node_modules/fastify/test/bundler/esbuild/package.json +1 -1
- package/node_modules/fastify/test/close-pipelining.test.js +1 -2
- package/node_modules/fastify/test/custom-http-server.test.js +38 -0
- package/node_modules/fastify/test/decorator-instance-properties.test.js +63 -0
- package/node_modules/fastify/test/diagnostics-channel/async-error-handler.test.js +74 -0
- package/node_modules/fastify/test/hooks.test.js +23 -0
- package/node_modules/fastify/test/http-methods/get.test.js +1 -1
- package/node_modules/fastify/test/http2/plain.test.js +135 -0
- package/node_modules/fastify/test/http2/secure-with-fallback.test.js +1 -1
- package/node_modules/fastify/test/https/https.test.js +1 -2
- package/node_modules/fastify/test/internals/errors.test.js +31 -1
- package/node_modules/fastify/test/internals/plugin.test.js +3 -1
- package/node_modules/fastify/test/internals/request.test.js +27 -3
- package/node_modules/fastify/test/internals/schema-controller-perf.test.js +33 -0
- package/node_modules/fastify/test/logger/logging.test.js +18 -1
- package/node_modules/fastify/test/logger/options.test.js +38 -1
- package/node_modules/fastify/test/reply-error.test.js +1 -1
- package/node_modules/fastify/test/reply-trailers.test.js +70 -0
- package/node_modules/fastify/test/request-media-type.test.js +105 -0
- package/node_modules/fastify/test/route-prefix.test.js +34 -0
- package/node_modules/fastify/test/router-options.test.js +222 -11
- package/node_modules/fastify/test/schema-serialization.test.js +108 -0
- package/node_modules/fastify/test/schema-validation.test.js +24 -0
- package/node_modules/fastify/test/scripts/validate-ecosystem-links.test.js +40 -57
- package/node_modules/fastify/test/throw.test.js +14 -0
- package/node_modules/fastify/test/trust-proxy.test.js +21 -0
- package/node_modules/fastify/test/types/content-type-parser.tst.ts +70 -0
- package/node_modules/fastify/test/types/{decorate-request-reply.test-d.ts → decorate-request-reply.tst.ts} +4 -4
- package/node_modules/fastify/test/types/{dummy-plugin.ts → dummy-plugin.mts} +1 -1
- package/node_modules/fastify/test/types/errors.tst.ts +91 -0
- package/node_modules/fastify/test/types/fastify.tst.ts +351 -0
- package/node_modules/fastify/test/types/hooks.tst.ts +578 -0
- package/node_modules/fastify/test/types/instance.tst.ts +597 -0
- package/node_modules/fastify/test/types/{logger.test-d.ts → logger.tst.ts} +61 -62
- package/node_modules/fastify/test/types/plugin.tst.ts +96 -0
- package/node_modules/fastify/test/types/register.tst.ts +245 -0
- package/node_modules/fastify/test/types/reply.tst.ts +297 -0
- package/node_modules/fastify/test/types/request.tst.ts +199 -0
- package/node_modules/fastify/test/types/route.tst.ts +576 -0
- package/node_modules/fastify/test/types/{schema.test-d.ts → schema.tst.ts} +22 -22
- package/node_modules/fastify/test/types/{serverFactory.test-d.ts → serverFactory.tst.ts} +4 -4
- package/node_modules/fastify/test/types/tsconfig.json +9 -0
- package/node_modules/fastify/test/types/{type-provider.test-d.ts → type-provider.tst.ts} +256 -250
- package/node_modules/fastify/test/types/using.tst.ts +14 -0
- package/node_modules/fastify/types/errors.d.ts +3 -0
- package/node_modules/fastify/types/request.d.ts +23 -2
- package/node_modules/jishushell-panel/output/public/assets/{ApiKeyField-NKcbHjNz.js → ApiKeyField-Ce5d1xna.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{Dashboard-Da1fL38t.js → Dashboard-BXame3yg.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesChatPanel-DZvmYsoh.js → HermesChatPanel-BHZtPCJd.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{HermesConfigForm-BLUWlKwm.js → HermesConfigForm-CB3GbNX9.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{InitPassword-BAKsshzk.js → InitPassword-Boab9F6g.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-DrIWCqo-.js +14 -0
- package/node_modules/jishushell-panel/output/public/assets/{Login-DHeOmwI8.js → Login-CzpOkNau.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CANXyCcL.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{ProviderRecommendations-H0ByEYF0.js → ProviderRecommendations-BABo9VOC.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-CKp5XxFh.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/Setup-C7xVDPow.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{WeixinLoginPanel-D-T6BxkQ.js → WeixinLoginPanel-B765Xz4C.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/{index-ERt6_ngA.js → index-Bs6DSbiR.js} +6 -6
- package/node_modules/jishushell-panel/output/public/assets/{registry-DF93EzIb.js → registry-sWIZsIEF.js} +2 -2
- package/node_modules/jishushell-panel/output/public/assets/{usePolling-DeoThIQn.js → usePolling-D4IDOQd_.js} +1 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-Df8aUdv8.js +1 -0
- package/node_modules/jishushell-panel/output/public/assets/{vendor-react-Cc84NArf.js → vendor-react-0L0rjmYG.js} +3 -3
- package/node_modules/jishushell-panel/output/public/index.html +3 -3
- package/node_modules/jishushell-panel/package.json +1 -1
- package/node_modules/semver/classes/range.js +6 -2
- package/node_modules/semver/package.json +1 -1
- package/package.json +4 -4
- package/scripts/check-app-spec.mjs +4 -12
- package/scripts/check-architecture-boundaries.mjs +178 -0
- package/scripts/pack-gui-and-send-pi.sh +5 -3
- package/dependencies/jishushell-panel-0.6.18.tgz +0 -0
- package/dist/services/connections/suggestions.d.ts +0 -27
- package/dist/services/connections/suggestions.js +0 -124
- package/dist/services/connections/suggestions.js.map +0 -1
- package/node_modules/fastify/test/types/content-type-parser.test-d.ts +0 -72
- package/node_modules/fastify/test/types/errors.test-d.ts +0 -90
- package/node_modules/fastify/test/types/fastify.test-d.ts +0 -352
- package/node_modules/fastify/test/types/hooks.test-d.ts +0 -550
- package/node_modules/fastify/test/types/import.ts +0 -2
- package/node_modules/fastify/test/types/instance.test-d.ts +0 -588
- package/node_modules/fastify/test/types/plugin.test-d.ts +0 -97
- package/node_modules/fastify/test/types/register.test-d.ts +0 -237
- package/node_modules/fastify/test/types/reply.test-d.ts +0 -254
- package/node_modules/fastify/test/types/request.test-d.ts +0 -188
- package/node_modules/fastify/test/types/route.test-d.ts +0 -553
- package/node_modules/fastify/test/types/using.test-d.ts +0 -17
- package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-Dgyc_TX5.js +0 -14
- package/node_modules/jishushell-panel/output/public/assets/NewInstance-CIy0cYtp.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Settings-DAT-UMfP.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/Setup-g3uckFYR.js +0 -1
- package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-CS8DFbkQ.js +0 -1
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { IncomingHttpHeaders } from 'node:http'
|
|
2
|
+
import { FromSchema, JSONSchema } from 'json-schema-to-ts'
|
|
3
|
+
import { Type, TSchema, Static } from 'typebox'
|
|
4
|
+
import { expect } from 'tstyche'
|
|
1
5
|
import fastify, {
|
|
2
6
|
FastifyTypeProvider,
|
|
3
7
|
HookHandlerDoneFunction,
|
|
@@ -6,11 +10,7 @@ import fastify, {
|
|
|
6
10
|
FastifyInstance,
|
|
7
11
|
FastifyError,
|
|
8
12
|
SafePromiseLike
|
|
9
|
-
} from '../../fastify'
|
|
10
|
-
import { expectAssignable, expectError, expectType } from 'tsd'
|
|
11
|
-
import { IncomingHttpHeaders } from 'node:http'
|
|
12
|
-
import { Type, TSchema, Static } from 'typebox'
|
|
13
|
-
import { FromSchema, JSONSchema } from 'json-schema-to-ts'
|
|
13
|
+
} from '../../fastify.js'
|
|
14
14
|
|
|
15
15
|
const server = fastify()
|
|
16
16
|
|
|
@@ -18,7 +18,7 @@ const server = fastify()
|
|
|
18
18
|
// Default (unknown)
|
|
19
19
|
// -------------------------------------------------------------------
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
server.get('/', (req) => expect(req.body).type.toBe<unknown>())
|
|
22
22
|
|
|
23
23
|
// -------------------------------------------------------------------
|
|
24
24
|
// Remapping
|
|
@@ -29,7 +29,7 @@ interface NumberProvider extends FastifyTypeProvider {
|
|
|
29
29
|
serializer: number
|
|
30
30
|
} // remap all schemas to numbers
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
server.withTypeProvider<NumberProvider>().get(
|
|
33
33
|
'/',
|
|
34
34
|
{
|
|
35
35
|
schema: {
|
|
@@ -40,12 +40,12 @@ expectAssignable(server.withTypeProvider<NumberProvider>().get(
|
|
|
40
40
|
}
|
|
41
41
|
},
|
|
42
42
|
(req) => {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
expect(req.headers).type.toBe<number & IncomingHttpHeaders>()
|
|
44
|
+
expect(req.body).type.toBe<number>()
|
|
45
|
+
expect(req.query).type.toBe<number>()
|
|
46
|
+
expect(req.params).type.toBe<number>()
|
|
47
47
|
}
|
|
48
|
-
)
|
|
48
|
+
)
|
|
49
49
|
|
|
50
50
|
// -------------------------------------------------------------------
|
|
51
51
|
// Override
|
|
@@ -53,7 +53,7 @@ expectAssignable(server.withTypeProvider<NumberProvider>().get(
|
|
|
53
53
|
|
|
54
54
|
interface OverriddenProvider extends FastifyTypeProvider { validator: 'inferenced' }
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
server.withTypeProvider<OverriddenProvider>().get<{ Body: 'override' }>(
|
|
57
57
|
'/',
|
|
58
58
|
{
|
|
59
59
|
schema: {
|
|
@@ -65,9 +65,9 @@ expectAssignable(server.withTypeProvider<OverriddenProvider>().get<{ Body: 'over
|
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
67
|
(req) => {
|
|
68
|
-
|
|
68
|
+
expect(req.body).type.toBe<'override'>()
|
|
69
69
|
}
|
|
70
|
-
)
|
|
70
|
+
)
|
|
71
71
|
|
|
72
72
|
// -------------------------------------------------------------------
|
|
73
73
|
// TypeBox
|
|
@@ -78,7 +78,7 @@ interface TypeBoxProvider extends FastifyTypeProvider {
|
|
|
78
78
|
serializer: this['schema'] extends TSchema ? Static<this['schema']> : unknown
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
82
82
|
'/',
|
|
83
83
|
{
|
|
84
84
|
schema: {
|
|
@@ -89,22 +89,22 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
89
89
|
})
|
|
90
90
|
},
|
|
91
91
|
errorHandler: (error, request, reply) => {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
expect(error).type.toBe<FastifyError>()
|
|
93
|
+
expect(request).type.toBeAssignableTo<FastifyRequest>()
|
|
94
|
+
expect(request.body.x).type.toBe<number>()
|
|
95
|
+
expect(request.body.y).type.toBe<number>()
|
|
96
|
+
expect(request.body.z).type.toBe<number>()
|
|
97
|
+
expect(reply).type.toBeAssignableTo<FastifyReply>()
|
|
98
98
|
}
|
|
99
99
|
},
|
|
100
100
|
(req) => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
101
|
+
expect(req.body.x).type.toBe<number>()
|
|
102
|
+
expect(req.body.y).type.toBe<number>()
|
|
103
|
+
expect(req.body.z).type.toBe<number>()
|
|
104
104
|
}
|
|
105
|
-
)
|
|
105
|
+
)
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
expect(server.withTypeProvider<TypeBoxProvider>()).type.toBeAssignableTo<FastifyInstance>()
|
|
108
108
|
|
|
109
109
|
// -------------------------------------------------------------------
|
|
110
110
|
// JsonSchemaToTs
|
|
@@ -117,7 +117,7 @@ interface JsonSchemaToTsProvider extends FastifyTypeProvider {
|
|
|
117
117
|
|
|
118
118
|
// explicitly setting schema `as const`
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
121
121
|
'/',
|
|
122
122
|
{
|
|
123
123
|
schema: {
|
|
@@ -131,22 +131,22 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
131
131
|
} as const
|
|
132
132
|
},
|
|
133
133
|
errorHandler: (error, request, reply) => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
134
|
+
expect(error).type.toBe<FastifyError>()
|
|
135
|
+
expect(request).type.toBeAssignableTo<FastifyRequest>()
|
|
136
|
+
expect(request.body.x).type.toBe<number | undefined>()
|
|
137
|
+
expect(request.body.y).type.toBe<string | undefined>()
|
|
138
|
+
expect(request.body.z).type.toBe<boolean | undefined>()
|
|
139
|
+
expect(reply).type.toBeAssignableTo<FastifyReply>()
|
|
140
140
|
}
|
|
141
141
|
},
|
|
142
142
|
(req) => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
143
|
+
expect(req.body.x).type.toBe<number | undefined>()
|
|
144
|
+
expect(req.body.y).type.toBe<string | undefined>()
|
|
145
|
+
expect(req.body.z).type.toBe<boolean | undefined>()
|
|
146
146
|
}
|
|
147
|
-
)
|
|
147
|
+
)
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().route({
|
|
150
150
|
url: '/',
|
|
151
151
|
method: 'POST',
|
|
152
152
|
schema: {
|
|
@@ -160,23 +160,23 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().route({
|
|
|
160
160
|
}
|
|
161
161
|
} as const,
|
|
162
162
|
errorHandler: (error, request, reply) => {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
163
|
+
expect(error).type.toBe<FastifyError>()
|
|
164
|
+
expect(request).type.toBeAssignableTo<FastifyRequest>()
|
|
165
|
+
expect(request.body.x).type.toBe<number | undefined>()
|
|
166
|
+
expect(request.body.y).type.toBe<string | undefined>()
|
|
167
|
+
expect(request.body.z).type.toBe<boolean | undefined>()
|
|
168
|
+
expect(reply).type.toBeAssignableTo<FastifyReply>()
|
|
169
169
|
},
|
|
170
170
|
handler: (req) => {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
expect(req.body.x).type.toBe<number | undefined>()
|
|
172
|
+
expect(req.body.y).type.toBe<string | undefined>()
|
|
173
|
+
expect(req.body.z).type.toBe<boolean | undefined>()
|
|
174
174
|
}
|
|
175
|
-
})
|
|
175
|
+
})
|
|
176
176
|
|
|
177
177
|
// inferring schema `as const`
|
|
178
178
|
|
|
179
|
-
|
|
179
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
180
180
|
'/',
|
|
181
181
|
{
|
|
182
182
|
schema: {
|
|
@@ -190,22 +190,22 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
190
190
|
}
|
|
191
191
|
},
|
|
192
192
|
errorHandler: (error, request, reply) => {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
193
|
+
expect(error).type.toBe<FastifyError>()
|
|
194
|
+
expect(request).type.toBeAssignableTo<FastifyRequest>()
|
|
195
|
+
expect(request.body.x).type.toBe<number | undefined>()
|
|
196
|
+
expect(request.body.y).type.toBe<string | undefined>()
|
|
197
|
+
expect(request.body.z).type.toBe<boolean | undefined>()
|
|
198
|
+
expect(reply).type.toBeAssignableTo<FastifyReply>()
|
|
199
199
|
}
|
|
200
200
|
},
|
|
201
201
|
(req) => {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
202
|
+
expect(req.body.x).type.toBe<number | undefined>()
|
|
203
|
+
expect(req.body.y).type.toBe<string | undefined>()
|
|
204
|
+
expect(req.body.z).type.toBe<boolean | undefined>()
|
|
205
205
|
}
|
|
206
|
-
)
|
|
206
|
+
)
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().route({
|
|
209
209
|
url: '/',
|
|
210
210
|
method: 'POST',
|
|
211
211
|
schema: {
|
|
@@ -219,27 +219,27 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().route({
|
|
|
219
219
|
}
|
|
220
220
|
},
|
|
221
221
|
errorHandler: (error, request, reply) => {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
222
|
+
expect(error).type.toBe<FastifyError>()
|
|
223
|
+
expect(request).type.toBeAssignableTo<FastifyRequest>()
|
|
224
|
+
expect(request.body.x).type.toBe<number | undefined>()
|
|
225
|
+
expect(request.body.y).type.toBe<string | undefined>()
|
|
226
|
+
expect(request.body.z).type.toBe<boolean | undefined>()
|
|
227
|
+
expect(reply).type.toBeAssignableTo<FastifyReply>()
|
|
228
228
|
},
|
|
229
229
|
handler: (req) => {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
expect(req.body.x).type.toBe<number | undefined>()
|
|
231
|
+
expect(req.body.y).type.toBe<string | undefined>()
|
|
232
|
+
expect(req.body.z).type.toBe<boolean | undefined>()
|
|
233
233
|
}
|
|
234
|
-
})
|
|
234
|
+
})
|
|
235
235
|
|
|
236
|
-
|
|
236
|
+
expect(server.withTypeProvider<JsonSchemaToTsProvider>()).type.toBeAssignableTo<FastifyInstance>()
|
|
237
237
|
|
|
238
238
|
// -------------------------------------------------------------------
|
|
239
239
|
// Instance Type Remappable
|
|
240
240
|
// -------------------------------------------------------------------
|
|
241
241
|
|
|
242
|
-
|
|
242
|
+
server.withTypeProvider<TypeBoxProvider>().withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
243
243
|
'/',
|
|
244
244
|
{
|
|
245
245
|
schema: {
|
|
@@ -253,20 +253,20 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().withTypeProvider<Jso
|
|
|
253
253
|
} as const
|
|
254
254
|
},
|
|
255
255
|
errorHandler: (error, request, reply) => {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
256
|
+
expect(error).type.toBe<FastifyError>()
|
|
257
|
+
expect(request).type.toBeAssignableTo<FastifyRequest>()
|
|
258
|
+
expect(request.body.x).type.toBe<number | undefined>()
|
|
259
|
+
expect(request.body.y).type.toBe<string | undefined>()
|
|
260
|
+
expect(request.body.z).type.toBe<boolean | undefined>()
|
|
261
|
+
expect(reply).type.toBeAssignableTo<FastifyReply>()
|
|
262
262
|
}
|
|
263
263
|
},
|
|
264
264
|
(req) => {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
265
|
+
expect(req.body.x).type.toBe<number | undefined>()
|
|
266
|
+
expect(req.body.y).type.toBe<string | undefined>()
|
|
267
|
+
expect(req.body.z).type.toBe<boolean | undefined>()
|
|
268
268
|
}
|
|
269
|
-
)
|
|
269
|
+
)
|
|
270
270
|
|
|
271
271
|
// -------------------------------------------------------------------
|
|
272
272
|
// Request Hooks
|
|
@@ -274,7 +274,7 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().withTypeProvider<Jso
|
|
|
274
274
|
|
|
275
275
|
// Sync handlers
|
|
276
276
|
|
|
277
|
-
|
|
277
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
278
278
|
'/',
|
|
279
279
|
{
|
|
280
280
|
schema: {
|
|
@@ -285,61 +285,61 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
285
285
|
})
|
|
286
286
|
},
|
|
287
287
|
preHandler: (req, reply, done) => {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
expect(req.body.x).type.toBe<number>()
|
|
289
|
+
expect(req.body.y).type.toBe<string>()
|
|
290
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
291
291
|
},
|
|
292
292
|
preParsing: (req, reply, payload, done) => {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
293
|
+
expect(req.body.x).type.toBe<number>()
|
|
294
|
+
expect(req.body.y).type.toBe<string>()
|
|
295
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
296
296
|
},
|
|
297
297
|
preSerialization: (req, reply, payload, done) => {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
298
|
+
expect(req.body.x).type.toBe<number>()
|
|
299
|
+
expect(req.body.y).type.toBe<string>()
|
|
300
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
301
301
|
},
|
|
302
302
|
preValidation: (req, reply, done) => {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
303
|
+
expect(req.body.x).type.toBe<number>()
|
|
304
|
+
expect(req.body.y).type.toBe<string>()
|
|
305
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
306
306
|
},
|
|
307
307
|
onError: (req, reply, error, done) => {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
308
|
+
expect(req.body.x).type.toBe<number>()
|
|
309
|
+
expect(req.body.y).type.toBe<string>()
|
|
310
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
311
311
|
},
|
|
312
312
|
onRequest: (req, reply, done) => {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
313
|
+
expect(req.body.x).type.toBe<number>()
|
|
314
|
+
expect(req.body.y).type.toBe<string>()
|
|
315
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
316
316
|
},
|
|
317
317
|
onResponse: (req, reply, done) => {
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
318
|
+
expect(req.body.x).type.toBe<number>()
|
|
319
|
+
expect(req.body.y).type.toBe<string>()
|
|
320
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
321
321
|
},
|
|
322
322
|
onTimeout: (req, reply, done) => {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
323
|
+
expect(req.body.x).type.toBe<number>()
|
|
324
|
+
expect(req.body.y).type.toBe<string>()
|
|
325
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
326
326
|
},
|
|
327
327
|
onSend: (req, reply, payload, done) => {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
328
|
+
expect(req.body.x).type.toBe<number>()
|
|
329
|
+
expect(req.body.y).type.toBe<string>()
|
|
330
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
331
331
|
}
|
|
332
332
|
},
|
|
333
333
|
req => {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
334
|
+
expect(req.body.x).type.toBe<number>()
|
|
335
|
+
expect(req.body.y).type.toBe<string>()
|
|
336
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
337
337
|
}
|
|
338
|
-
)
|
|
338
|
+
)
|
|
339
339
|
|
|
340
340
|
// Async handlers
|
|
341
341
|
|
|
342
|
-
|
|
342
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
343
343
|
'/',
|
|
344
344
|
{
|
|
345
345
|
schema: {
|
|
@@ -350,64 +350,64 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
350
350
|
})
|
|
351
351
|
},
|
|
352
352
|
preHandler: async (req, reply, done) => {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
353
|
+
expect(req.body.x).type.toBe<number>()
|
|
354
|
+
expect(req.body.y).type.toBe<string>()
|
|
355
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
356
356
|
},
|
|
357
357
|
preParsing: async (req, reply, payload, done) => {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
358
|
+
expect(req.body.x).type.toBe<number>()
|
|
359
|
+
expect(req.body.y).type.toBe<string>()
|
|
360
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
361
361
|
},
|
|
362
362
|
preSerialization: async (req, reply, payload, done) => {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
363
|
+
expect(req.body.x).type.toBe<number>()
|
|
364
|
+
expect(req.body.y).type.toBe<string>()
|
|
365
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
366
366
|
},
|
|
367
367
|
preValidation: async (req, reply, done) => {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
368
|
+
expect(req.body.x).type.toBe<number>()
|
|
369
|
+
expect(req.body.y).type.toBe<string>()
|
|
370
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
371
371
|
},
|
|
372
372
|
onError: async (req, reply, error, done) => {
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
373
|
+
expect(req.body.x).type.toBe<number>()
|
|
374
|
+
expect(req.body.y).type.toBe<string>()
|
|
375
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
376
376
|
},
|
|
377
377
|
onRequest: async (req, reply, done) => {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
378
|
+
expect(req.body.x).type.toBe<number>()
|
|
379
|
+
expect(req.body.y).type.toBe<string>()
|
|
380
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
381
381
|
},
|
|
382
382
|
onResponse: async (req, reply, done) => {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
383
|
+
expect(req.body.x).type.toBe<number>()
|
|
384
|
+
expect(req.body.y).type.toBe<string>()
|
|
385
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
386
386
|
},
|
|
387
387
|
onTimeout: async (req, reply, done) => {
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
388
|
+
expect(req.body.x).type.toBe<number>()
|
|
389
|
+
expect(req.body.y).type.toBe<string>()
|
|
390
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
391
391
|
},
|
|
392
392
|
onSend: async (req, reply, payload, done) => {
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
393
|
+
expect(req.body.x).type.toBe<number>()
|
|
394
|
+
expect(req.body.y).type.toBe<string>()
|
|
395
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
396
396
|
}
|
|
397
397
|
},
|
|
398
398
|
req => {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
399
|
+
expect(req.body.x).type.toBe<number>()
|
|
400
|
+
expect(req.body.y).type.toBe<string>()
|
|
401
|
+
expect(req.body.z).type.toBe<boolean>()
|
|
402
402
|
}
|
|
403
|
-
)
|
|
403
|
+
)
|
|
404
404
|
|
|
405
405
|
// -------------------------------------------------------------------
|
|
406
406
|
// Request headers
|
|
407
407
|
// -------------------------------------------------------------------
|
|
408
408
|
|
|
409
409
|
// JsonSchemaToTsProvider
|
|
410
|
-
|
|
410
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
411
411
|
'/',
|
|
412
412
|
{
|
|
413
413
|
schema: {
|
|
@@ -425,17 +425,17 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
425
425
|
}
|
|
426
426
|
},
|
|
427
427
|
(req) => {
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
428
|
+
expect(req.headers.lowercase).type.toBe<string>()
|
|
429
|
+
expect(req.headers.UPPERCASE).type.toBe<string | string[] | undefined>()
|
|
430
|
+
expect(req.headers.uppercase).type.toBe<number>()
|
|
431
|
+
expect(req.headers.camelcase).type.toBe<boolean>()
|
|
432
|
+
expect(req.headers['kebab-case']).type.toBe<boolean>()
|
|
433
|
+
expect(req.headers.preserve_optional).type.toBe<number | undefined>()
|
|
434
434
|
}
|
|
435
|
-
)
|
|
435
|
+
)
|
|
436
436
|
|
|
437
437
|
// TypeBoxProvider
|
|
438
|
-
|
|
438
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
439
439
|
'/',
|
|
440
440
|
{
|
|
441
441
|
schema: {
|
|
@@ -449,20 +449,20 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
449
449
|
}
|
|
450
450
|
},
|
|
451
451
|
(req) => {
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
452
|
+
expect(req.headers.lowercase).type.toBe<string>()
|
|
453
|
+
expect(req.headers.UPPERCASE).type.toBe<string | string[] | undefined>()
|
|
454
|
+
expect(req.headers.uppercase).type.toBe<number>()
|
|
455
|
+
expect(req.headers.camelcase).type.toBe<boolean>()
|
|
456
|
+
expect(req.headers['kebab-case']).type.toBe<boolean>()
|
|
457
|
+
expect(req.headers.preserve_optional).type.toBe<number | undefined>()
|
|
458
458
|
}
|
|
459
|
-
)
|
|
459
|
+
)
|
|
460
460
|
|
|
461
461
|
// -------------------------------------------------------------------
|
|
462
462
|
// TypeBox Reply Type
|
|
463
463
|
// -------------------------------------------------------------------
|
|
464
464
|
|
|
465
|
-
|
|
465
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
466
466
|
'/',
|
|
467
467
|
{
|
|
468
468
|
schema: {
|
|
@@ -479,18 +479,17 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
479
479
|
res.send('hello')
|
|
480
480
|
res.send(42)
|
|
481
481
|
res.send({ error: 'error' })
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
expectError<(payload?: unknown) => typeof res>(res.code(200).send)
|
|
482
|
+
expect(res.code(200).send).type.toBe<((...args: [payload: string]) => typeof res)>()
|
|
483
|
+
expect(res.code(400).send).type.toBe<((...args: [payload: number]) => typeof res)>()
|
|
484
|
+
expect(res.code(500).send).type.toBe<((...args: [payload: { error: string }]) => typeof res)>()
|
|
486
485
|
}
|
|
487
|
-
)
|
|
486
|
+
)
|
|
488
487
|
|
|
489
488
|
// -------------------------------------------------------------------
|
|
490
489
|
// TypeBox Reply Type (Different Content-types)
|
|
491
490
|
// -------------------------------------------------------------------
|
|
492
491
|
|
|
493
|
-
|
|
492
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
494
493
|
'/',
|
|
495
494
|
{
|
|
496
495
|
schema: {
|
|
@@ -518,13 +517,13 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
518
517
|
res.send({ msg: 'hello' })
|
|
519
518
|
res.send({ error: 'error' })
|
|
520
519
|
}
|
|
521
|
-
)
|
|
520
|
+
)
|
|
522
521
|
|
|
523
522
|
// -------------------------------------------------------------------
|
|
524
523
|
// TypeBox Reply Type: Non Assignable
|
|
525
524
|
// -------------------------------------------------------------------
|
|
526
525
|
|
|
527
|
-
|
|
526
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
528
527
|
'/',
|
|
529
528
|
{
|
|
530
529
|
schema: {
|
|
@@ -538,15 +537,15 @@ expectError(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
538
537
|
}
|
|
539
538
|
},
|
|
540
539
|
async (_, res) => {
|
|
541
|
-
res.send(false)
|
|
540
|
+
expect(res.send).type.not.toBeCallableWith(false)
|
|
542
541
|
}
|
|
543
|
-
)
|
|
542
|
+
)
|
|
544
543
|
|
|
545
544
|
// -------------------------------------------------------------------
|
|
546
545
|
// TypeBox Reply Type: Non Assignable (Different Content-types)
|
|
547
546
|
// -------------------------------------------------------------------
|
|
548
547
|
|
|
549
|
-
|
|
548
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
550
549
|
'/',
|
|
551
550
|
{
|
|
552
551
|
schema: {
|
|
@@ -570,15 +569,15 @@ expectError(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
570
569
|
}
|
|
571
570
|
},
|
|
572
571
|
async (_, res) => {
|
|
573
|
-
res.send(false)
|
|
572
|
+
expect(res.send).type.not.toBeCallableWith(false)
|
|
574
573
|
}
|
|
575
|
-
)
|
|
574
|
+
)
|
|
576
575
|
|
|
577
576
|
// -------------------------------------------------------------------
|
|
578
577
|
// TypeBox Reply Return Type
|
|
579
578
|
// -------------------------------------------------------------------
|
|
580
579
|
|
|
581
|
-
|
|
580
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
582
581
|
'/',
|
|
583
582
|
{
|
|
584
583
|
schema: {
|
|
@@ -599,13 +598,13 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
599
598
|
case 3: return { error: 'error' }
|
|
600
599
|
}
|
|
601
600
|
}
|
|
602
|
-
)
|
|
601
|
+
)
|
|
603
602
|
|
|
604
603
|
// -------------------------------------------------------------------
|
|
605
604
|
// TypeBox Reply Return Type (Different Content-types)
|
|
606
605
|
// -------------------------------------------------------------------
|
|
607
606
|
|
|
608
|
-
|
|
607
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
609
608
|
'/',
|
|
610
609
|
{
|
|
611
610
|
schema: {
|
|
@@ -636,13 +635,13 @@ expectAssignable(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
636
635
|
case 3: return { error: 'error' }
|
|
637
636
|
}
|
|
638
637
|
}
|
|
639
|
-
)
|
|
638
|
+
)
|
|
640
639
|
|
|
641
640
|
// -------------------------------------------------------------------
|
|
642
641
|
// TypeBox Reply Return Type: Non Assignable
|
|
643
642
|
// -------------------------------------------------------------------
|
|
644
643
|
|
|
645
|
-
|
|
644
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
646
645
|
'/',
|
|
647
646
|
{
|
|
648
647
|
schema: {
|
|
@@ -655,16 +654,17 @@ expectError(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
655
654
|
}
|
|
656
655
|
}
|
|
657
656
|
},
|
|
657
|
+
// @ts-expect-error Type 'boolean' is not assignable to type 'string | number | void | { error: string; }'.
|
|
658
658
|
async (_, res) => {
|
|
659
659
|
return false
|
|
660
660
|
}
|
|
661
|
-
)
|
|
661
|
+
)
|
|
662
662
|
|
|
663
663
|
// -------------------------------------------------------------------
|
|
664
664
|
// TypeBox Reply Return Type: Non Assignable (Different Content-types)
|
|
665
665
|
// -------------------------------------------------------------------
|
|
666
666
|
|
|
667
|
-
|
|
667
|
+
server.withTypeProvider<TypeBoxProvider>().get(
|
|
668
668
|
'/',
|
|
669
669
|
{
|
|
670
670
|
schema: {
|
|
@@ -687,16 +687,17 @@ expectError(server.withTypeProvider<TypeBoxProvider>().get(
|
|
|
687
687
|
}
|
|
688
688
|
}
|
|
689
689
|
},
|
|
690
|
+
// @ts-expect-error Type 'boolean' is not assignable to type 'string | void | { msg: string; } | { error: string; }'.
|
|
690
691
|
async (_, res) => {
|
|
691
692
|
return false
|
|
692
693
|
}
|
|
693
|
-
)
|
|
694
|
+
)
|
|
694
695
|
|
|
695
696
|
// -------------------------------------------------------------------
|
|
696
697
|
// JsonSchemaToTs Reply Type
|
|
697
698
|
// -------------------------------------------------------------------
|
|
698
699
|
|
|
699
|
-
|
|
700
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
700
701
|
'/',
|
|
701
702
|
{
|
|
702
703
|
schema: {
|
|
@@ -711,18 +712,19 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
711
712
|
res.send('hello')
|
|
712
713
|
res.send(42)
|
|
713
714
|
res.send({ error: 'error' })
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
715
|
+
expect(res.code(200).send).type.toBe<((...args: [payload: string]) => typeof res)>()
|
|
716
|
+
expect(res.code(400).send).type.toBe<((...args: [payload: number]) => typeof res)>()
|
|
717
|
+
expect(res.code(500).send).type.toBe<
|
|
718
|
+
((...args: [payload: { [x: string]: unknown; error?: string }]) => typeof res)
|
|
719
|
+
>()
|
|
718
720
|
}
|
|
719
|
-
)
|
|
721
|
+
)
|
|
720
722
|
|
|
721
723
|
// -------------------------------------------------------------------
|
|
722
724
|
// JsonSchemaToTs Reply Type (Different Content-types)
|
|
723
725
|
// -------------------------------------------------------------------
|
|
724
726
|
|
|
725
|
-
|
|
727
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
726
728
|
'/',
|
|
727
729
|
{
|
|
728
730
|
schema: {
|
|
@@ -746,13 +748,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
746
748
|
res.send({ msg: 'hello' })
|
|
747
749
|
res.send({ error: 'error' })
|
|
748
750
|
}
|
|
749
|
-
)
|
|
751
|
+
)
|
|
750
752
|
|
|
751
753
|
// -------------------------------------------------------------------
|
|
752
754
|
// JsonSchemaToTs Reply Type: Non Assignable
|
|
753
755
|
// -------------------------------------------------------------------
|
|
754
756
|
|
|
755
|
-
|
|
757
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
756
758
|
'/',
|
|
757
759
|
{
|
|
758
760
|
schema: {
|
|
@@ -764,15 +766,15 @@ expectError(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
764
766
|
}
|
|
765
767
|
},
|
|
766
768
|
async (_, res) => {
|
|
767
|
-
res.send(false)
|
|
769
|
+
expect(res.send).type.not.toBeCallableWith(false)
|
|
768
770
|
}
|
|
769
|
-
)
|
|
771
|
+
)
|
|
770
772
|
|
|
771
773
|
// -------------------------------------------------------------------
|
|
772
774
|
// JsonSchemaToTs Reply Type: Non Assignable (Different Content-types)
|
|
773
775
|
// -------------------------------------------------------------------
|
|
774
776
|
|
|
775
|
-
|
|
777
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
776
778
|
'/',
|
|
777
779
|
{
|
|
778
780
|
schema: {
|
|
@@ -792,15 +794,15 @@ expectError(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
792
794
|
}
|
|
793
795
|
},
|
|
794
796
|
async (_, res) => {
|
|
795
|
-
res.send(false)
|
|
797
|
+
expect(res.send).type.not.toBeCallableWith(false)
|
|
796
798
|
}
|
|
797
|
-
)
|
|
799
|
+
)
|
|
798
800
|
|
|
799
801
|
// -------------------------------------------------------------------
|
|
800
802
|
// JsonSchemaToTs Reply Type Return
|
|
801
803
|
// -------------------------------------------------------------------
|
|
802
804
|
|
|
803
|
-
|
|
805
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
804
806
|
'/',
|
|
805
807
|
{
|
|
806
808
|
schema: {
|
|
@@ -819,13 +821,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
819
821
|
case 3: return { error: 'error' }
|
|
820
822
|
}
|
|
821
823
|
}
|
|
822
|
-
)
|
|
824
|
+
)
|
|
823
825
|
|
|
824
826
|
// -------------------------------------------------------------------
|
|
825
827
|
// JsonSchemaToTs Reply Type Return (Different Content-types)
|
|
826
828
|
// -------------------------------------------------------------------
|
|
827
829
|
|
|
828
|
-
|
|
830
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
829
831
|
'/',
|
|
830
832
|
{
|
|
831
833
|
schema: {
|
|
@@ -852,13 +854,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
852
854
|
case 3: return { error: 'error' }
|
|
853
855
|
}
|
|
854
856
|
}
|
|
855
|
-
)
|
|
857
|
+
)
|
|
856
858
|
|
|
857
859
|
// -------------------------------------------------------------------
|
|
858
860
|
// JsonSchemaToTs Reply Type Return: Non Assignable
|
|
859
861
|
// -------------------------------------------------------------------
|
|
860
862
|
|
|
861
|
-
|
|
863
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
862
864
|
'/',
|
|
863
865
|
{
|
|
864
866
|
schema: {
|
|
@@ -869,27 +871,29 @@ expectError(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
869
871
|
} as const
|
|
870
872
|
}
|
|
871
873
|
},
|
|
874
|
+
// @ts-expect-error Type 'boolean' is not assignable to type 'string | number | void | { [x: string]: unknown; error?: string | undefined; }'.
|
|
872
875
|
async (_, res) => {
|
|
873
876
|
return false
|
|
874
877
|
}
|
|
875
|
-
)
|
|
878
|
+
)
|
|
876
879
|
|
|
877
880
|
// https://github.com/fastify/fastify/issues/4088
|
|
878
|
-
|
|
881
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get('/', {
|
|
879
882
|
schema: {
|
|
880
883
|
response: {
|
|
881
884
|
200: { type: 'string' }
|
|
882
885
|
}
|
|
883
886
|
} as const
|
|
887
|
+
// @ts-expect-error Type '{ foo: number; }' is not assignable to type 'string | void | Promise<string | void>'.
|
|
884
888
|
}, (_, res) => {
|
|
885
889
|
return { foo: 555 }
|
|
886
|
-
})
|
|
890
|
+
})
|
|
887
891
|
|
|
888
892
|
// -------------------------------------------------------------------
|
|
889
893
|
// JsonSchemaToTs Reply Type Return: Non Assignable (Different Content-types)
|
|
890
894
|
// -------------------------------------------------------------------
|
|
891
895
|
|
|
892
|
-
|
|
896
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
893
897
|
'/',
|
|
894
898
|
{
|
|
895
899
|
schema: {
|
|
@@ -908,16 +912,17 @@ expectError(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
908
912
|
} as const
|
|
909
913
|
}
|
|
910
914
|
},
|
|
915
|
+
// @ts-expect-error Type 'Promise<boolean>' is not assignable to type 'string | void | { [x: string]: unknown; msg?: string | undefined; } | { [x: string]: unknown; error?: string | undefined; } | Promise<string | void | { [x: string]: unknown; msg?: string | undefined; } | { [x: string]: unknown; error?: string | undefined; }>'.
|
|
911
916
|
async (_, res) => {
|
|
912
917
|
return false
|
|
913
918
|
}
|
|
914
|
-
)
|
|
919
|
+
)
|
|
915
920
|
|
|
916
921
|
// -------------------------------------------------------------------
|
|
917
922
|
// Reply Type Override
|
|
918
923
|
// -------------------------------------------------------------------
|
|
919
924
|
|
|
920
|
-
|
|
925
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply: boolean }>(
|
|
921
926
|
'/',
|
|
922
927
|
{
|
|
923
928
|
schema: {
|
|
@@ -931,13 +936,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply:
|
|
|
931
936
|
async (_, res) => {
|
|
932
937
|
res.send(true)
|
|
933
938
|
}
|
|
934
|
-
)
|
|
939
|
+
)
|
|
935
940
|
|
|
936
941
|
// -------------------------------------------------------------------
|
|
937
942
|
// Reply Type Override (Different Content-types)
|
|
938
943
|
// -------------------------------------------------------------------
|
|
939
944
|
|
|
940
|
-
|
|
945
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply: boolean }>(
|
|
941
946
|
'/',
|
|
942
947
|
{
|
|
943
948
|
schema: {
|
|
@@ -959,13 +964,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply:
|
|
|
959
964
|
async (_, res) => {
|
|
960
965
|
res.send(true)
|
|
961
966
|
}
|
|
962
|
-
)
|
|
967
|
+
)
|
|
963
968
|
|
|
964
969
|
// -------------------------------------------------------------------
|
|
965
970
|
// Reply Type Return Override
|
|
966
971
|
// -------------------------------------------------------------------
|
|
967
972
|
|
|
968
|
-
|
|
973
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply: boolean }>(
|
|
969
974
|
'/',
|
|
970
975
|
{
|
|
971
976
|
schema: {
|
|
@@ -979,13 +984,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply:
|
|
|
979
984
|
async (_, res) => {
|
|
980
985
|
return true
|
|
981
986
|
}
|
|
982
|
-
)
|
|
987
|
+
)
|
|
983
988
|
|
|
984
989
|
// -------------------------------------------------------------------
|
|
985
990
|
// Reply Type Return Override (Different Content-types)
|
|
986
991
|
// -------------------------------------------------------------------
|
|
987
992
|
|
|
988
|
-
|
|
993
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply: boolean }>(
|
|
989
994
|
'/',
|
|
990
995
|
{
|
|
991
996
|
schema: {
|
|
@@ -1007,13 +1012,13 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get<{ Reply:
|
|
|
1007
1012
|
async (_, res) => {
|
|
1008
1013
|
return true
|
|
1009
1014
|
}
|
|
1010
|
-
)
|
|
1015
|
+
)
|
|
1011
1016
|
|
|
1012
1017
|
// -------------------------------------------------------------------
|
|
1013
1018
|
// Reply Status Code (Different Status Codes)
|
|
1014
1019
|
// -------------------------------------------------------------------
|
|
1015
1020
|
|
|
1016
|
-
|
|
1021
|
+
server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
1017
1022
|
'/',
|
|
1018
1023
|
{
|
|
1019
1024
|
schema: {
|
|
@@ -1035,16 +1040,16 @@ expectAssignable(server.withTypeProvider<JsonSchemaToTsProvider>().get(
|
|
|
1035
1040
|
async (_, res) => {
|
|
1036
1041
|
res.code(200)
|
|
1037
1042
|
res.code(500)
|
|
1038
|
-
|
|
1039
|
-
|
|
1043
|
+
expect(res.code).type.not.toBeCallableWith(201)
|
|
1044
|
+
expect(res.code).type.not.toBeCallableWith(400)
|
|
1040
1045
|
}
|
|
1041
|
-
)
|
|
1046
|
+
)
|
|
1042
1047
|
|
|
1043
1048
|
// -------------------------------------------------------------------
|
|
1044
1049
|
// RouteGeneric Reply Type Return (Different Status Codes)
|
|
1045
1050
|
// -------------------------------------------------------------------
|
|
1046
1051
|
|
|
1047
|
-
|
|
1052
|
+
server.get<{
|
|
1048
1053
|
Reply: {
|
|
1049
1054
|
200: string | { msg: string }
|
|
1050
1055
|
400: number
|
|
@@ -1061,13 +1066,13 @@ expectAssignable(server.get<{
|
|
|
1061
1066
|
case 4: return { error: 'error' }
|
|
1062
1067
|
}
|
|
1063
1068
|
}
|
|
1064
|
-
)
|
|
1069
|
+
)
|
|
1065
1070
|
|
|
1066
1071
|
// -------------------------------------------------------------------
|
|
1067
1072
|
// RouteGeneric Status Code (Different Status Codes)
|
|
1068
1073
|
// -------------------------------------------------------------------
|
|
1069
1074
|
|
|
1070
|
-
|
|
1075
|
+
server.get<{
|
|
1071
1076
|
Reply: {
|
|
1072
1077
|
200: string | { msg: string }
|
|
1073
1078
|
400: number
|
|
@@ -1080,18 +1085,18 @@ expectAssignable(server.get<{
|
|
|
1080
1085
|
res.code(400)
|
|
1081
1086
|
res.code(500)
|
|
1082
1087
|
res.code(502)
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1088
|
+
expect(res.code).type.not.toBeCallableWith(201)
|
|
1089
|
+
expect(res.code).type.not.toBeCallableWith(300)
|
|
1090
|
+
expect(res.code).type.not.toBeCallableWith(404)
|
|
1086
1091
|
return 'hello'
|
|
1087
1092
|
}
|
|
1088
|
-
)
|
|
1093
|
+
)
|
|
1089
1094
|
|
|
1090
1095
|
// -------------------------------------------------------------------
|
|
1091
1096
|
// RouteGeneric Reply Type Return: Non Assignable (Different Status Codes)
|
|
1092
1097
|
// -------------------------------------------------------------------
|
|
1093
1098
|
|
|
1094
|
-
|
|
1099
|
+
server.get<{
|
|
1095
1100
|
Reply: {
|
|
1096
1101
|
200: string | { msg: string }
|
|
1097
1102
|
400: number
|
|
@@ -1099,10 +1104,11 @@ expectError(server.get<{
|
|
|
1099
1104
|
}
|
|
1100
1105
|
}>(
|
|
1101
1106
|
'/',
|
|
1107
|
+
// @ts-expect-error Type 'boolean' is not assignable to type 'string | number | void | { msg: string; } | { error: string; } | { 200: string | { msg: string; }; 400: number; '5xx': { error: string; }; }'.
|
|
1102
1108
|
async (_, res) => {
|
|
1103
1109
|
return true
|
|
1104
1110
|
}
|
|
1105
|
-
)
|
|
1111
|
+
)
|
|
1106
1112
|
|
|
1107
1113
|
// -------------------------------------------------------------------
|
|
1108
1114
|
// FastifyPlugin: Auxiliary
|
|
@@ -1112,26 +1118,26 @@ interface AuxiliaryPluginProvider extends FastifyTypeProvider { validator: 'plug
|
|
|
1112
1118
|
|
|
1113
1119
|
// Auxiliary plugins may have varying server types per application. Recommendation would be to explicitly remap instance provider context within plugin if required.
|
|
1114
1120
|
function plugin<T extends FastifyInstance> (instance: T) {
|
|
1115
|
-
|
|
1121
|
+
instance.withTypeProvider<AuxiliaryPluginProvider>().get(
|
|
1116
1122
|
'/',
|
|
1117
1123
|
{
|
|
1118
1124
|
schema: { body: null }
|
|
1119
1125
|
},
|
|
1120
1126
|
(req) => {
|
|
1121
|
-
|
|
1127
|
+
expect(req.body).type.toBe<'plugin-auxiliary'>()
|
|
1122
1128
|
}
|
|
1123
|
-
)
|
|
1129
|
+
)
|
|
1124
1130
|
}
|
|
1125
1131
|
|
|
1126
|
-
|
|
1132
|
+
server.withTypeProvider<AuxiliaryPluginProvider>().register(plugin).get(
|
|
1127
1133
|
'/',
|
|
1128
1134
|
{
|
|
1129
1135
|
schema: { body: null }
|
|
1130
1136
|
},
|
|
1131
1137
|
(req) => {
|
|
1132
|
-
|
|
1138
|
+
expect(req.body).type.toBe<'plugin-auxiliary'>()
|
|
1133
1139
|
}
|
|
1134
|
-
)
|
|
1140
|
+
)
|
|
1135
1141
|
|
|
1136
1142
|
// -------------------------------------------------------------------
|
|
1137
1143
|
// Handlers: Inline
|
|
@@ -1140,18 +1146,18 @@ expectAssignable(server.withTypeProvider<AuxiliaryPluginProvider>().register(plu
|
|
|
1140
1146
|
interface InlineHandlerProvider extends FastifyTypeProvider { validator: 'handler-inline' }
|
|
1141
1147
|
|
|
1142
1148
|
// Inline handlers should infer for the request parameters (non-shared)
|
|
1143
|
-
|
|
1149
|
+
server.withTypeProvider<InlineHandlerProvider>().get(
|
|
1144
1150
|
'/',
|
|
1145
1151
|
{
|
|
1146
1152
|
onRequest: (req, res, done) => {
|
|
1147
|
-
|
|
1153
|
+
expect(req.body).type.toBe<'handler-inline'>()
|
|
1148
1154
|
},
|
|
1149
1155
|
schema: { body: null }
|
|
1150
1156
|
},
|
|
1151
1157
|
(req) => {
|
|
1152
|
-
|
|
1158
|
+
expect(req.body).type.toBe<'handler-inline'>()
|
|
1153
1159
|
}
|
|
1154
|
-
)
|
|
1160
|
+
)
|
|
1155
1161
|
|
|
1156
1162
|
// -------------------------------------------------------------------
|
|
1157
1163
|
// Handlers: Auxiliary
|
|
@@ -1161,19 +1167,19 @@ interface AuxiliaryHandlerProvider extends FastifyTypeProvider { validator: 'han
|
|
|
1161
1167
|
|
|
1162
1168
|
// Auxiliary handlers are likely shared for multiple routes and thus should infer as unknown due to potential varying parameters
|
|
1163
1169
|
function auxiliaryHandler (request: FastifyRequest, reply: FastifyReply, done: HookHandlerDoneFunction): void {
|
|
1164
|
-
|
|
1170
|
+
expect(request.body).type.toBe<unknown>()
|
|
1165
1171
|
}
|
|
1166
1172
|
|
|
1167
|
-
|
|
1173
|
+
server.withTypeProvider<AuxiliaryHandlerProvider>().get(
|
|
1168
1174
|
'/',
|
|
1169
1175
|
{
|
|
1170
1176
|
onRequest: auxiliaryHandler,
|
|
1171
1177
|
schema: { body: 'handler-auxiliary' }
|
|
1172
1178
|
},
|
|
1173
1179
|
(req) => {
|
|
1174
|
-
|
|
1180
|
+
expect(req.body).type.toBe<'handler-auxiliary'>()
|
|
1175
1181
|
}
|
|
1176
|
-
)
|
|
1182
|
+
)
|
|
1177
1183
|
|
|
1178
1184
|
// -------------------------------------------------------------------
|
|
1179
1185
|
// SafePromiseLike
|
|
@@ -1182,9 +1188,9 @@ const safePromiseLike = {
|
|
|
1182
1188
|
then: new Promise<string>(resolve => resolve('')).then,
|
|
1183
1189
|
__linterBrands: 'SafePromiseLike' as const
|
|
1184
1190
|
}
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1191
|
+
expect(safePromiseLike).type.toBeAssignableTo<SafePromiseLike<string>>()
|
|
1192
|
+
expect(safePromiseLike).type.toBeAssignableTo<PromiseLike<string>>()
|
|
1193
|
+
expect(safePromiseLike).type.not.toBeAssignableTo<Promise<string>>()
|
|
1188
1194
|
|
|
1189
1195
|
// -------------------------------------------------------------------
|
|
1190
1196
|
// Separate Providers
|
|
@@ -1195,7 +1201,7 @@ interface SeparateProvider extends FastifyTypeProvider {
|
|
|
1195
1201
|
serializer: Date
|
|
1196
1202
|
}
|
|
1197
1203
|
|
|
1198
|
-
|
|
1204
|
+
server.withTypeProvider<SeparateProvider>().get(
|
|
1199
1205
|
'/',
|
|
1200
1206
|
{
|
|
1201
1207
|
schema: {
|
|
@@ -1206,8 +1212,8 @@ expectAssignable(server.withTypeProvider<SeparateProvider>().get(
|
|
|
1206
1212
|
}
|
|
1207
1213
|
},
|
|
1208
1214
|
(req, res) => {
|
|
1209
|
-
|
|
1215
|
+
expect(req.body).type.toBe<string>()
|
|
1210
1216
|
|
|
1211
1217
|
res.send(new Date())
|
|
1212
1218
|
}
|
|
1213
|
-
)
|
|
1219
|
+
)
|