fastify 5.0.0-alpha.2 → 5.0.0-alpha.4
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 +2 -2
- package/SPONSORS.md +2 -0
- package/build/build-validation.js +3 -15
- package/docs/Guides/Ecosystem.md +4 -0
- package/docs/Guides/Getting-Started.md +0 -2
- package/docs/Guides/Migration-Guide-V4.md +48 -0
- package/docs/Guides/Recommendations.md +8 -6
- package/docs/Reference/Errors.md +0 -2
- package/docs/Reference/Hooks.md +5 -9
- package/docs/Reference/Logging.md +1 -1
- package/docs/Reference/Reply.md +9 -11
- package/docs/Reference/Request.md +0 -11
- package/docs/Reference/Routes.md +4 -23
- package/docs/Reference/Server.md +30 -40
- package/docs/Reference/Type-Providers.md +2 -2
- package/docs/Reference/TypeScript.md +16 -18
- package/docs/Reference/Validation-and-Serialization.md +62 -27
- package/docs/Reference/Warnings.md +0 -26
- package/eslint.config.js +9 -25
- package/fastify.d.ts +10 -23
- package/fastify.js +60 -61
- package/lib/configValidator.js +130 -182
- package/lib/context.js +1 -22
- package/lib/decorate.js +2 -2
- package/lib/errors.js +0 -6
- package/lib/handleRequest.js +5 -5
- package/lib/reply.js +34 -74
- package/lib/request.js +0 -45
- package/lib/route.js +12 -27
- package/lib/schemas.js +27 -22
- package/lib/server.js +6 -11
- package/lib/symbols.js +1 -1
- package/lib/validation.js +27 -6
- package/lib/warnings.js +1 -92
- package/lib/wrapThenable.js +1 -1
- package/package.json +14 -15
- package/test/decorator.test.js +1 -1
- package/test/diagnostics-channel/404.test.js +1 -1
- package/test/diagnostics-channel/async-delay-request.test.js +1 -1
- package/test/diagnostics-channel/async-request.test.js +1 -1
- package/test/diagnostics-channel/error-before-handler.test.js +1 -1
- package/test/diagnostics-channel/error-request.test.js +1 -1
- package/test/diagnostics-channel/error-status.test.js +1 -1
- package/test/diagnostics-channel/init.test.js +2 -2
- package/test/diagnostics-channel/sync-delay-request.test.js +1 -1
- package/test/diagnostics-channel/sync-request-reply.test.js +1 -1
- package/test/diagnostics-channel/sync-request.test.js +1 -1
- package/test/{copy.test.js → http-methods/copy.test.js} +2 -1
- package/test/http-methods/custom-http-methods.test.js +111 -0
- package/test/{get.test.js → http-methods/get.test.js} +1 -1
- package/test/{head.test.js → http-methods/head.test.js} +7 -87
- package/test/{lock.test.js → http-methods/lock.test.js} +2 -1
- package/test/{mkcalendar.test.js → http-methods/mkcalendar.test.js} +2 -1
- package/test/{mkcol.test.js → http-methods/mkcol.test.js} +2 -1
- package/test/{move.test.js → http-methods/move.test.js} +2 -1
- package/test/{propfind.test.js → http-methods/propfind.test.js} +2 -1
- package/test/{proppatch.test.js → http-methods/proppatch.test.js} +2 -1
- package/test/{report.test.js → http-methods/report.test.js} +2 -1
- package/test/{search.test.js → http-methods/search.test.js} +2 -1
- package/test/{trace.test.js → http-methods/trace.test.js} +2 -1
- package/test/{unlock.test.js → http-methods/unlock.test.js} +2 -1
- package/test/internals/all.test.js +3 -3
- package/test/internals/decorator.test.js +2 -2
- package/test/internals/errors.test.js +7 -17
- package/test/internals/initialConfig.test.js +0 -31
- package/test/internals/reply-serialize.test.js +25 -10
- package/test/internals/reply.test.js +31 -153
- package/test/internals/request-validate.test.js +21 -12
- package/test/internals/request.test.js +1 -18
- package/test/internals/validation.test.js +49 -56
- package/test/listen.1.test.js +66 -14
- package/test/listen.5.test.js +11 -0
- package/test/reply-trailers.test.js +1 -32
- package/test/route-shorthand.test.js +3 -1
- package/test/route.3.test.js +4 -1
- package/test/route.7.test.js +2 -12
- package/test/route.8.test.js +34 -5
- package/test/router-options.test.js +6 -3
- package/test/schema-examples.test.js +15 -6
- package/test/schema-feature.test.js +178 -35
- package/test/schema-serialization.test.js +125 -21
- package/test/schema-validation.test.js +154 -3
- package/test/skip-reply-send.test.js +6 -6
- package/test/stream-serializers.test.js +37 -0
- package/test/throw.test.js +2 -14
- package/test/types/errors.test-d.ts +1 -2
- package/test/types/fastify.test-d.ts +23 -34
- package/test/types/hooks.test-d.ts +56 -56
- package/test/types/instance.test-d.ts +3 -3
- package/test/types/reply.test-d.ts +7 -8
- package/test/types/request.test-d.ts +2 -12
- package/test/types/route.test-d.ts +158 -158
- package/test/types/schema.test-d.ts +22 -5
- package/test/versioned-routes.test.js +0 -90
- package/test/web-api.test.js +75 -0
- package/types/errors.d.ts +78 -79
- package/types/hooks.d.ts +18 -18
- package/types/instance.d.ts +1 -1
- package/types/logger.d.ts +7 -7
- package/types/reply.d.ts +18 -22
- package/types/request.d.ts +8 -14
- package/types/route.d.ts +5 -6
- package/types/type-provider.d.ts +1 -1
- package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +0 -241
- package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +0 -268
- package/.tap/test-results/test/404s.test.js.tap +0 -623
- package/.tap/test-results/test/500s.test.js.tap +0 -64
- package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +0 -36
- package/.tap/test-results/test/als.test.js.tap +0 -15
- package/.tap/test-results/test/async-await.test.js.tap +0 -184
- package/.tap/test-results/test/async-dispose.test.js.tap +0 -8
- package/.tap/test-results/test/async_hooks.test.js.tap +0 -10
- package/.tap/test-results/test/bodyLimit.test.js.tap +0 -48
- package/.tap/test-results/test/buffer.test.js.tap +0 -20
- package/.tap/test-results/test/build/error-serializer.test.js.tap +0 -12
- package/.tap/test-results/test/build/version.test.js.tap +0 -7
- package/.tap/test-results/test/case-insensitive.test.js.tap +0 -36
- package/.tap/test-results/test/chainable.test.js.tap +0 -17
- package/.tap/test-results/test/check.test.js.tap +0 -10
- package/.tap/test-results/test/childLoggerFactory.test.js.tap +0 -23
- package/.tap/test-results/test/client-timeout.test.js.tap +0 -7
- package/.tap/test-results/test/close-pipelining.test.js.tap +0 -15
- package/.tap/test-results/test/close.test.js.tap +0 -172
- package/.tap/test-results/test/connectionTimeout.test.js.tap +0 -12
- package/.tap/test-results/test/constrained-routes.test.js.tap +0 -173
- package/.tap/test-results/test/content-length.test.js.tap +0 -46
- package/.tap/test-results/test/content-parser.test.js.tap +0 -266
- package/.tap/test-results/test/content-type.test.js.tap +0 -14
- package/.tap/test-results/test/context-config.test.js.tap +0 -41
- package/.tap/test-results/test/copy.test.js.tap +0 -14
- package/.tap/test-results/test/custom-http-server.test.js.tap +0 -30
- package/.tap/test-results/test/custom-parser-async.test.js.tap +0 -21
- package/.tap/test-results/test/custom-parser.0.test.js.tap +0 -199
- package/.tap/test-results/test/custom-parser.1.test.js.tap +0 -90
- package/.tap/test-results/test/custom-parser.2.test.js.tap +0 -22
- package/.tap/test-results/test/custom-parser.3.test.js.tap +0 -53
- package/.tap/test-results/test/custom-parser.4.test.js.tap +0 -45
- package/.tap/test-results/test/custom-parser.5.test.js.tap +0 -41
- package/.tap/test-results/test/custom-querystring-parser.test.js.tap +0 -46
- package/.tap/test-results/test/decorator.test.js.tap +0 -465
- package/.tap/test-results/test/delete.test.js.tap +0 -110
- package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +0 -15
- package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +0 -25
- package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +0 -24
- package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +0 -9
- package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +0 -20
- package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +0 -10
- package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +0 -14
- package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +0 -16
- package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +0 -16
- package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +0 -19
- package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +0 -18
- package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +0 -243
- package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +0 -9
- package/.tap/test-results/test/esm/esm.test.mjs.tap +0 -8
- package/.tap/test-results/test/esm/index.test.js.tap +0 -8
- package/.tap/test-results/test/fastify-instance.test.js.tap +0 -114
- package/.tap/test-results/test/findRoute.test.js.tap +0 -37
- package/.tap/test-results/test/fluent-schema.test.js.tap +0 -36
- package/.tap/test-results/test/genReqId.test.js.tap +0 -106
- package/.tap/test-results/test/get.test.js.tap +0 -151
- package/.tap/test-results/test/handler-context.test.js.tap +0 -19
- package/.tap/test-results/test/has-route.test.js.tap +0 -30
- package/.tap/test-results/test/head.test.js.tap +0 -130
- package/.tap/test-results/test/header-overflow.test.js.tap +0 -16
- package/.tap/test-results/test/hooks-async.test.js.tap +0 -286
- package/.tap/test-results/test/hooks.on-listen.test.js.tap +0 -311
- package/.tap/test-results/test/hooks.on-ready.test.js.tap +0 -151
- package/.tap/test-results/test/hooks.test.js.tap +0 -966
- package/.tap/test-results/test/http2/closing.test.js.tap +0 -35
- package/.tap/test-results/test/http2/constraint.test.js.tap +0 -32
- package/.tap/test-results/test/http2/head.test.js.tap +0 -9
- package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +0 -8
- package/.tap/test-results/test/http2/plain.test.js.tap +0 -22
- package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +0 -40
- package/.tap/test-results/test/http2/secure.test.js.tap +0 -27
- package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +0 -9
- package/.tap/test-results/test/https/custom-https-server.test.js.tap +0 -10
- package/.tap/test-results/test/https/https.test.js.tap +0 -45
- package/.tap/test-results/test/imports.test.js.tap +0 -14
- package/.tap/test-results/test/inject.test.js.tap +0 -165
- package/.tap/test-results/test/internals/all.test.js.tap +0 -42
- package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +0 -14
- package/.tap/test-results/test/internals/context.test.js.tap +0 -14
- package/.tap/test-results/test/internals/decorator.test.js.tap +0 -51
- package/.tap/test-results/test/internals/errors.test.js.tap +0 -1212
- package/.tap/test-results/test/internals/handleRequest.test.js.tap +0 -69
- package/.tap/test-results/test/internals/hookRunner.test.js.tap +0 -143
- package/.tap/test-results/test/internals/hooks.test.js.tap +0 -45
- package/.tap/test-results/test/internals/initialConfig.test.js.tap +0 -125
- package/.tap/test-results/test/internals/logger.test.js.tap +0 -71
- package/.tap/test-results/test/internals/plugin.test.js.tap +0 -48
- package/.tap/test-results/test/internals/reply-serialize.test.js.tap +0 -166
- package/.tap/test-results/test/internals/reply.test.js.tap +0 -688
- package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +0 -74
- package/.tap/test-results/test/internals/request-validate.test.js.tap +0 -384
- package/.tap/test-results/test/internals/request.test.js.tap +0 -163
- package/.tap/test-results/test/internals/server.test.js.tap +0 -30
- package/.tap/test-results/test/internals/validation.test.js.tap +0 -121
- package/.tap/test-results/test/keepAliveTimeout.test.js.tap +0 -12
- package/.tap/test-results/test/listen.1.test.js.tap +0 -31
- package/.tap/test-results/test/listen.2.test.js.tap +0 -46
- package/.tap/test-results/test/listen.3.test.js.tap +0 -25
- package/.tap/test-results/test/listen.4.test.js.tap +0 -51
- package/.tap/test-results/test/lock.test.js.tap +0 -29
- package/.tap/test-results/test/logger/instantiation.test.js.tap +0 -92
- package/.tap/test-results/test/logger/logging.test.js.tap +0 -117
- package/.tap/test-results/test/logger/options.test.js.tap +0 -165
- package/.tap/test-results/test/logger/request.test.js.tap +0 -82
- package/.tap/test-results/test/logger/response.test.js.tap +0 -38
- package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +0 -44
- package/.tap/test-results/test/method-missing.test.js.tap +0 -8
- package/.tap/test-results/test/middleware.test.js.tap +0 -17
- package/.tap/test-results/test/mkcalendar.test.js.tap +0 -43
- package/.tap/test-results/test/mkcol.test.js.tap +0 -14
- package/.tap/test-results/test/move.test.js.tap +0 -15
- package/.tap/test-results/test/noop-set.test.js.tap +0 -8
- package/.tap/test-results/test/nullable-validation.test.js.tap +0 -36
- package/.tap/test-results/test/options.error-handler.test.js.tap +0 -186
- package/.tap/test-results/test/options.test.js.tap +0 -174
- package/.tap/test-results/test/output-validation.test.js.tap +0 -66
- package/.tap/test-results/test/patch.error-handler.test.js.tap +0 -206
- package/.tap/test-results/test/patch.test.js.tap +0 -182
- package/.tap/test-results/test/plugin.1.test.js.tap +0 -78
- package/.tap/test-results/test/plugin.2.test.js.tap +0 -102
- package/.tap/test-results/test/plugin.3.test.js.tap +0 -58
- package/.tap/test-results/test/plugin.4.test.js.tap +0 -164
- package/.tap/test-results/test/post-empty-body.test.js.tap +0 -8
- package/.tap/test-results/test/pretty-print.test.js.tap +0 -82
- package/.tap/test-results/test/promises.test.js.tap +0 -46
- package/.tap/test-results/test/propfind.test.js.tap +0 -43
- package/.tap/test-results/test/proppatch.test.js.tap +0 -29
- package/.tap/test-results/test/proto-poisoning.test.js.tap +0 -47
- package/.tap/test-results/test/put.error-handler.test.js.tap +0 -206
- package/.tap/test-results/test/put.test.js.tap +0 -182
- package/.tap/test-results/test/register.test.js.tap +0 -61
- package/.tap/test-results/test/reply-code.test.js.tap +0 -40
- package/.tap/test-results/test/reply-earlyHints.test.js.tap +0 -22
- package/.tap/test-results/test/reply-error.test.js.tap +0 -643
- package/.tap/test-results/test/reply-trailers.test.js.tap +0 -176
- package/.tap/test-results/test/report.test.js.tap +0 -43
- package/.tap/test-results/test/request-error.test.js.tap +0 -98
- package/.tap/test-results/test/request-id.test.js.tap +0 -38
- package/.tap/test-results/test/request.deprecated.test.js.tap +0 -13
- package/.tap/test-results/test/requestTimeout.test.js.tap +0 -21
- package/.tap/test-results/test/route-hooks.test.js.tap +0 -498
- package/.tap/test-results/test/route-prefix.test.js.tap +0 -195
- package/.tap/test-results/test/route-shorthand.test.js.tap +0 -190
- package/.tap/test-results/test/route.1.test.js.tap +0 -93
- package/.tap/test-results/test/route.2.test.js.tap +0 -28
- package/.tap/test-results/test/route.3.test.js.tap +0 -39
- package/.tap/test-results/test/route.4.test.js.tap +0 -32
- package/.tap/test-results/test/route.5.test.js.tap +0 -54
- package/.tap/test-results/test/route.6.test.js.tap +0 -81
- package/.tap/test-results/test/route.7.test.js.tap +0 -93
- package/.tap/test-results/test/route.8.test.js.tap +0 -38
- package/.tap/test-results/test/router-options.test.js.tap +0 -104
- package/.tap/test-results/test/same-shape.test.js.tap +0 -22
- package/.tap/test-results/test/schema-examples.test.js.tap +0 -85
- package/.tap/test-results/test/schema-feature.test.js.tap +0 -445
- package/.tap/test-results/test/schema-serialization.test.js.tap +0 -194
- package/.tap/test-results/test/schema-special-usage.test.js.tap +0 -186
- package/.tap/test-results/test/schema-validation.test.js.tap +0 -199
- package/.tap/test-results/test/search.test.js.tap +0 -77
- package/.tap/test-results/test/serialize-response.test.js.tap +0 -26
- package/.tap/test-results/test/server.test.js.tap +0 -65
- package/.tap/test-results/test/set-error-handler.test.js.tap +0 -7
- package/.tap/test-results/test/skip-reply-send.test.js.tap +0 -272
- package/.tap/test-results/test/stream.1.test.js.tap +0 -36
- package/.tap/test-results/test/stream.2.test.js.tap +0 -20
- package/.tap/test-results/test/stream.3.test.js.tap +0 -34
- package/.tap/test-results/test/stream.4.test.js.tap +0 -40
- package/.tap/test-results/test/stream.5.test.js.tap +0 -37
- package/.tap/test-results/test/sync-routes.test.js.tap +0 -19
- package/.tap/test-results/test/throw.test.js.tap +0 -116
- package/.tap/test-results/test/trace.test.js.tap +0 -7
- package/.tap/test-results/test/trust-proxy.test.js.tap +0 -109
- package/.tap/test-results/test/type-provider.test.js.tap +0 -12
- package/.tap/test-results/test/unlock.test.js.tap +0 -14
- package/.tap/test-results/test/upgrade.test.js.tap +0 -8
- package/.tap/test-results/test/url-rewriting.test.js.tap +0 -39
- package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +0 -33
- package/.tap/test-results/test/validation-error-handling.test.js.tap +0 -180
- package/.tap/test-results/test/versioned-routes.test.js.tap +0 -151
- package/.tap/test-results/test/web-api.test.js.tap +0 -51
- package/.tap/test-results/test/wrapThenable.test.js.tap +0 -11
- package/EXPENSE_POLICY.md +0 -105
- package/lib/httpMethods.js +0 -40
- package/test/method-missing.test.js +0 -24
- package/test/request.deprecated.test.js +0 -38
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const test = t.test
|
|
5
5
|
const Fastify = require('../..')
|
|
6
|
-
const { supportedMethods } = require('../../lib/httpMethods')
|
|
7
6
|
|
|
8
7
|
test('fastify.all should add all the methods to the same url', t => {
|
|
8
|
+
const fastify = Fastify()
|
|
9
|
+
|
|
9
10
|
const requirePayload = [
|
|
10
11
|
'POST',
|
|
11
12
|
'PUT',
|
|
12
13
|
'PATCH'
|
|
13
14
|
]
|
|
14
15
|
|
|
16
|
+
const supportedMethods = fastify.supportedMethods
|
|
15
17
|
t.plan(supportedMethods.length * 2)
|
|
16
18
|
|
|
17
|
-
const fastify = Fastify()
|
|
18
|
-
|
|
19
19
|
fastify.all('/', (req, reply) => {
|
|
20
20
|
reply.send({ method: req.raw.method })
|
|
21
21
|
})
|
|
@@ -136,7 +136,7 @@ test('decorate should recognize getter/setter objects', t => {
|
|
|
136
136
|
this._a = val
|
|
137
137
|
}
|
|
138
138
|
})
|
|
139
|
-
t.equal(Object.
|
|
139
|
+
t.equal(Object.hasOwn(one, 'foo'), true)
|
|
140
140
|
t.equal(one.foo, undefined)
|
|
141
141
|
one.foo = 'a'
|
|
142
142
|
t.equal(one.foo, 'a')
|
|
@@ -152,6 +152,6 @@ test('decorate should recognize getter/setter objects', t => {
|
|
|
152
152
|
decorator.add.call(two, 'foo', {
|
|
153
153
|
getter: () => 'a getter'
|
|
154
154
|
})
|
|
155
|
-
t.equal(Object.
|
|
155
|
+
t.equal(Object.hasOwn(two, 'foo'), true)
|
|
156
156
|
t.equal(two.foo, 'a getter')
|
|
157
157
|
})
|
|
@@ -5,7 +5,7 @@ const errors = require('../../lib/errors')
|
|
|
5
5
|
const { readFileSync } = require('node:fs')
|
|
6
6
|
const { resolve } = require('node:path')
|
|
7
7
|
|
|
8
|
-
test('should expose
|
|
8
|
+
test('should expose 83 errors', t => {
|
|
9
9
|
t.plan(1)
|
|
10
10
|
const exportedKeys = Object.keys(errors)
|
|
11
11
|
let counter = 0
|
|
@@ -14,11 +14,11 @@ test('should expose 84 errors', t => {
|
|
|
14
14
|
counter++
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
t.equal(counter,
|
|
17
|
+
t.equal(counter, 83)
|
|
18
18
|
})
|
|
19
19
|
|
|
20
20
|
test('ensure name and codes of Errors are identical', t => {
|
|
21
|
-
t.plan(
|
|
21
|
+
t.plan(83)
|
|
22
22
|
const exportedKeys = Object.keys(errors)
|
|
23
23
|
for (const key of exportedKeys) {
|
|
24
24
|
if (errors[key].name === 'FastifyError') {
|
|
@@ -97,16 +97,6 @@ test('FST_ERR_AJV_CUSTOM_OPTIONS_OPT_NOT_ARR', t => {
|
|
|
97
97
|
t.ok(error instanceof TypeError)
|
|
98
98
|
})
|
|
99
99
|
|
|
100
|
-
test('FST_ERR_VERSION_CONSTRAINT_NOT_STR', t => {
|
|
101
|
-
t.plan(5)
|
|
102
|
-
const error = new errors.FST_ERR_VERSION_CONSTRAINT_NOT_STR()
|
|
103
|
-
t.equal(error.name, 'FastifyError')
|
|
104
|
-
t.equal(error.code, 'FST_ERR_VERSION_CONSTRAINT_NOT_STR')
|
|
105
|
-
t.equal(error.message, 'Version constraint should be a string.')
|
|
106
|
-
t.equal(error.statusCode, 500)
|
|
107
|
-
t.ok(error instanceof TypeError)
|
|
108
|
-
})
|
|
109
|
-
|
|
110
100
|
test('FST_ERR_CTP_ALREADY_PRESENT', t => {
|
|
111
101
|
t.plan(5)
|
|
112
102
|
const error = new errors.FST_ERR_CTP_ALREADY_PRESENT()
|
|
@@ -878,7 +868,7 @@ test('FST_ERR_ERROR_HANDLER_NOT_FN', t => {
|
|
|
878
868
|
})
|
|
879
869
|
|
|
880
870
|
test('Ensure that all errors are in Errors.md TOC', t => {
|
|
881
|
-
t.plan(
|
|
871
|
+
t.plan(83)
|
|
882
872
|
const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
|
|
883
873
|
|
|
884
874
|
const exportedKeys = Object.keys(errors)
|
|
@@ -890,7 +880,7 @@ test('Ensure that all errors are in Errors.md TOC', t => {
|
|
|
890
880
|
})
|
|
891
881
|
|
|
892
882
|
test('Ensure that non-existing errors are not in Errors.md TOC', t => {
|
|
893
|
-
t.plan(
|
|
883
|
+
t.plan(83)
|
|
894
884
|
const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
|
|
895
885
|
|
|
896
886
|
const matchRE = / {4}- \[([A-Z0-9_]+)\]\(#[a-z0-9_]+\)/g
|
|
@@ -903,7 +893,7 @@ test('Ensure that non-existing errors are not in Errors.md TOC', t => {
|
|
|
903
893
|
})
|
|
904
894
|
|
|
905
895
|
test('Ensure that all errors are in Errors.md documented', t => {
|
|
906
|
-
t.plan(
|
|
896
|
+
t.plan(83)
|
|
907
897
|
const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
|
|
908
898
|
|
|
909
899
|
const exportedKeys = Object.keys(errors)
|
|
@@ -915,7 +905,7 @@ test('Ensure that all errors are in Errors.md documented', t => {
|
|
|
915
905
|
})
|
|
916
906
|
|
|
917
907
|
test('Ensure that non-existing errors are not in Errors.md documented', t => {
|
|
918
|
-
t.plan(
|
|
908
|
+
t.plan(83)
|
|
919
909
|
const errorsMd = readFileSync(resolve(__dirname, '../../docs/Reference/Errors.md'), 'utf8')
|
|
920
910
|
|
|
921
911
|
const matchRE = /<a id="[0-9a-zA-Z_]+">([0-9a-zA-Z_]+)<\/a>/g
|
|
@@ -38,7 +38,6 @@ test('without options passed to Fastify, initialConfig should expose default val
|
|
|
38
38
|
caseSensitive: true,
|
|
39
39
|
allowUnsafeRegex: false,
|
|
40
40
|
disableRequestLogging: false,
|
|
41
|
-
jsonShorthand: true,
|
|
42
41
|
ignoreTrailingSlash: false,
|
|
43
42
|
ignoreDuplicateSlashes: false,
|
|
44
43
|
maxParamLength: 100,
|
|
@@ -278,7 +277,6 @@ test('Should not have issues when passing stream options to Pino.js', t => {
|
|
|
278
277
|
caseSensitive: true,
|
|
279
278
|
allowUnsafeRegex: false,
|
|
280
279
|
disableRequestLogging: false,
|
|
281
|
-
jsonShorthand: true,
|
|
282
280
|
ignoreTrailingSlash: true,
|
|
283
281
|
ignoreDuplicateSlashes: false,
|
|
284
282
|
maxParamLength: 100,
|
|
@@ -362,35 +360,6 @@ test('deepFreezeObject() should not throw on TypedArray', t => {
|
|
|
362
360
|
}
|
|
363
361
|
})
|
|
364
362
|
|
|
365
|
-
test('Fastify.initialConfig should accept the deprecated versioning option', t => {
|
|
366
|
-
t.plan(1)
|
|
367
|
-
|
|
368
|
-
function onWarning (warning) {
|
|
369
|
-
t.equal(warning.code, 'FSTDEP009')
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
process.on('warning', onWarning)
|
|
373
|
-
|
|
374
|
-
const versioning = {
|
|
375
|
-
storage: function () {
|
|
376
|
-
const versions = {}
|
|
377
|
-
return {
|
|
378
|
-
get: (version) => { return versions[version] || null },
|
|
379
|
-
set: (version, store) => { versions[version] = store }
|
|
380
|
-
}
|
|
381
|
-
},
|
|
382
|
-
deriveVersion: (req, ctx) => {
|
|
383
|
-
return req.headers.accept
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
Fastify({ versioning })
|
|
388
|
-
setImmediate(function () {
|
|
389
|
-
process.removeListener('warning', onWarning)
|
|
390
|
-
t.end()
|
|
391
|
-
})
|
|
392
|
-
})
|
|
393
|
-
|
|
394
363
|
test('pluginTimeout should be parsed correctly', t => {
|
|
395
364
|
const withDisabledTimeout = Fastify({ pluginTimeout: '0' })
|
|
396
365
|
t.equal(withDisabledTimeout.initialConfig.pluginTimeout, 0)
|
|
@@ -50,8 +50,11 @@ function getResponseSchema () {
|
|
|
50
50
|
content: {
|
|
51
51
|
'application/json': {
|
|
52
52
|
schema: {
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {
|
|
55
|
+
fullName: { type: 'string' },
|
|
56
|
+
phone: { type: 'number' }
|
|
57
|
+
}
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
}
|
|
@@ -264,8 +267,11 @@ test('Reply#getSerializationFunction', t => {
|
|
|
264
267
|
'/:id',
|
|
265
268
|
{
|
|
266
269
|
params: {
|
|
267
|
-
|
|
268
|
-
|
|
270
|
+
type: 'object',
|
|
271
|
+
properites: {
|
|
272
|
+
id: {
|
|
273
|
+
type: 'integer'
|
|
274
|
+
}
|
|
269
275
|
}
|
|
270
276
|
},
|
|
271
277
|
schema: {
|
|
@@ -356,8 +362,11 @@ test('Reply#getSerializationFunction', t => {
|
|
|
356
362
|
'/:id',
|
|
357
363
|
{
|
|
358
364
|
params: {
|
|
359
|
-
|
|
360
|
-
|
|
365
|
+
type: 'object',
|
|
366
|
+
properites: {
|
|
367
|
+
id: {
|
|
368
|
+
type: 'integer'
|
|
369
|
+
}
|
|
361
370
|
}
|
|
362
371
|
}
|
|
363
372
|
},
|
|
@@ -465,8 +474,11 @@ test('Reply#serializeInput', t => {
|
|
|
465
474
|
content: {
|
|
466
475
|
'application/json': {
|
|
467
476
|
schema: {
|
|
468
|
-
|
|
469
|
-
|
|
477
|
+
type: 'object',
|
|
478
|
+
properites: {
|
|
479
|
+
fullName: { type: 'string' },
|
|
480
|
+
phone: { type: 'number' }
|
|
481
|
+
}
|
|
470
482
|
}
|
|
471
483
|
}
|
|
472
484
|
}
|
|
@@ -525,8 +537,11 @@ test('Reply#serializeInput', t => {
|
|
|
525
537
|
'/',
|
|
526
538
|
{
|
|
527
539
|
params: {
|
|
528
|
-
|
|
529
|
-
|
|
540
|
+
type: 'object',
|
|
541
|
+
properites: {
|
|
542
|
+
id: {
|
|
543
|
+
type: 'integer'
|
|
544
|
+
}
|
|
530
545
|
}
|
|
531
546
|
},
|
|
532
547
|
schema: {
|
|
@@ -5,6 +5,7 @@ const test = t.test
|
|
|
5
5
|
const sget = require('simple-get').concat
|
|
6
6
|
const http = require('node:http')
|
|
7
7
|
const NotFound = require('http-errors').NotFound
|
|
8
|
+
const Request = require('../../lib/request')
|
|
8
9
|
const Reply = require('../../lib/reply')
|
|
9
10
|
const Fastify = require('../..')
|
|
10
11
|
const { Readable, Writable } = require('node:stream')
|
|
@@ -14,12 +15,10 @@ const {
|
|
|
14
15
|
kReplySerializer,
|
|
15
16
|
kReplyIsError,
|
|
16
17
|
kReplySerializerDefault,
|
|
17
|
-
kRouteContext
|
|
18
|
-
kPublicRouteContext
|
|
18
|
+
kRouteContext
|
|
19
19
|
} = require('../../lib/symbols')
|
|
20
20
|
const fs = require('node:fs')
|
|
21
21
|
const path = require('node:path')
|
|
22
|
-
const { FSTDEP010, FSTDEP019, FSTDEP021 } = require('../../lib/warnings')
|
|
23
22
|
|
|
24
23
|
const agent = new http.Agent({ keepAlive: false })
|
|
25
24
|
|
|
@@ -38,8 +37,8 @@ const doGet = function (url) {
|
|
|
38
37
|
test('Once called, Reply should return an object with methods', t => {
|
|
39
38
|
t.plan(15)
|
|
40
39
|
const response = { res: 'res' }
|
|
41
|
-
const context = { config: { onSend: [] }, schema: {} }
|
|
42
|
-
const request =
|
|
40
|
+
const context = { config: { onSend: [] }, schema: {}, _parserOptions: {}, server: { hasConstraintStrategy: () => false, initialConfig: {} } }
|
|
41
|
+
const request = new Request(null, null, null, null, null, context)
|
|
43
42
|
const reply = new Reply(response, request)
|
|
44
43
|
t.equal(typeof reply, 'object')
|
|
45
44
|
t.equal(typeof reply[kReplyIsError], 'boolean')
|
|
@@ -52,8 +51,8 @@ test('Once called, Reply should return an object with methods', t => {
|
|
|
52
51
|
t.equal(typeof reply[kReplyHeaders], 'object')
|
|
53
52
|
t.same(reply.raw, response)
|
|
54
53
|
t.equal(reply[kRouteContext], context)
|
|
55
|
-
t.equal(reply
|
|
56
|
-
t.equal(reply
|
|
54
|
+
t.equal(reply.routeOptions.config, context.config)
|
|
55
|
+
t.equal(reply.routeOptions.schema, context.schema)
|
|
57
56
|
t.equal(reply.request, request)
|
|
58
57
|
// Aim to not bad property keys (including Symbols)
|
|
59
58
|
t.notOk('undefined' in reply)
|
|
@@ -63,7 +62,7 @@ test('reply.send will logStream error and destroy the stream', t => {
|
|
|
63
62
|
t.plan(1)
|
|
64
63
|
let destroyCalled
|
|
65
64
|
const payload = new Readable({
|
|
66
|
-
read () {},
|
|
65
|
+
read () { },
|
|
67
66
|
destroy (err, cb) {
|
|
68
67
|
destroyCalled = true
|
|
69
68
|
cb(err)
|
|
@@ -72,16 +71,16 @@ test('reply.send will logStream error and destroy the stream', t => {
|
|
|
72
71
|
|
|
73
72
|
const response = new Writable()
|
|
74
73
|
Object.assign(response, {
|
|
75
|
-
setHeader: () => {},
|
|
74
|
+
setHeader: () => { },
|
|
76
75
|
hasHeader: () => false,
|
|
77
76
|
getHeader: () => undefined,
|
|
78
|
-
writeHead: () => {},
|
|
79
|
-
write: () => {},
|
|
77
|
+
writeHead: () => { },
|
|
78
|
+
write: () => { },
|
|
80
79
|
headersSent: true
|
|
81
80
|
})
|
|
82
81
|
|
|
83
82
|
const log = {
|
|
84
|
-
warn: () => {}
|
|
83
|
+
warn: () => { }
|
|
85
84
|
}
|
|
86
85
|
|
|
87
86
|
const reply = new Reply(response, { [kRouteContext]: { onSend: null } }, log)
|
|
@@ -94,12 +93,12 @@ test('reply.send will logStream error and destroy the stream', t => {
|
|
|
94
93
|
test('reply.send throw with circular JSON', t => {
|
|
95
94
|
t.plan(1)
|
|
96
95
|
const response = {
|
|
97
|
-
setHeader: () => {},
|
|
96
|
+
setHeader: () => { },
|
|
98
97
|
hasHeader: () => false,
|
|
99
98
|
getHeader: () => undefined,
|
|
100
|
-
writeHead: () => {},
|
|
101
|
-
write: () => {},
|
|
102
|
-
end: () => {}
|
|
99
|
+
writeHead: () => { },
|
|
100
|
+
write: () => { },
|
|
101
|
+
end: () => { }
|
|
103
102
|
}
|
|
104
103
|
const reply = new Reply(response, { [kRouteContext]: { onSend: [] } })
|
|
105
104
|
t.throws(() => {
|
|
@@ -112,12 +111,12 @@ test('reply.send throw with circular JSON', t => {
|
|
|
112
111
|
test('reply.send returns itself', t => {
|
|
113
112
|
t.plan(1)
|
|
114
113
|
const response = {
|
|
115
|
-
setHeader: () => {},
|
|
114
|
+
setHeader: () => { },
|
|
116
115
|
hasHeader: () => false,
|
|
117
116
|
getHeader: () => undefined,
|
|
118
|
-
writeHead: () => {},
|
|
119
|
-
write: () => {},
|
|
120
|
-
end: () => {}
|
|
117
|
+
writeHead: () => { },
|
|
118
|
+
write: () => { },
|
|
119
|
+
end: () => { }
|
|
121
120
|
}
|
|
122
121
|
const reply = new Reply(response, { [kRouteContext]: { onSend: [] } })
|
|
123
122
|
t.equal(reply.send('hello'), reply)
|
|
@@ -1119,7 +1118,7 @@ test('reply.hasHeader returns correct values', t => {
|
|
|
1119
1118
|
sget({
|
|
1120
1119
|
method: 'GET',
|
|
1121
1120
|
url: 'http://127.0.0.1:' + fastify.server.address().port + '/headers'
|
|
1122
|
-
}, () => {})
|
|
1121
|
+
}, () => { })
|
|
1123
1122
|
})
|
|
1124
1123
|
})
|
|
1125
1124
|
|
|
@@ -1151,18 +1150,18 @@ test('reply.getHeader returns correct values', t => {
|
|
|
1151
1150
|
sget({
|
|
1152
1151
|
method: 'GET',
|
|
1153
1152
|
url: 'http://127.0.0.1:' + fastify.server.address().port + '/headers'
|
|
1154
|
-
}, () => {})
|
|
1153
|
+
}, () => { })
|
|
1155
1154
|
})
|
|
1156
1155
|
})
|
|
1157
1156
|
|
|
1158
1157
|
test('reply.getHeader returns raw header if there is not in the reply headers', t => {
|
|
1159
1158
|
t.plan(1)
|
|
1160
1159
|
const response = {
|
|
1161
|
-
setHeader: () => {},
|
|
1160
|
+
setHeader: () => { },
|
|
1162
1161
|
hasHeader: () => true,
|
|
1163
1162
|
getHeader: () => 'bar',
|
|
1164
|
-
writeHead: () => {},
|
|
1165
|
-
end: () => {}
|
|
1163
|
+
writeHead: () => { },
|
|
1164
|
+
end: () => { }
|
|
1166
1165
|
}
|
|
1167
1166
|
const reply = new Reply(response, { onSend: [] }, null)
|
|
1168
1167
|
t.equal(reply.getHeader('foo'), 'bar')
|
|
@@ -1461,108 +1460,17 @@ test('reply.header setting multiple cookies as multiple Set-Cookie headers', t =
|
|
|
1461
1460
|
})
|
|
1462
1461
|
})
|
|
1463
1462
|
|
|
1464
|
-
test('should
|
|
1465
|
-
t.plan(4)
|
|
1466
|
-
const fastify = Fastify()
|
|
1467
|
-
|
|
1468
|
-
FSTDEP010.emitted = false
|
|
1469
|
-
|
|
1470
|
-
process.removeAllListeners('warning')
|
|
1471
|
-
process.on('warning', onWarning)
|
|
1472
|
-
function onWarning (warning) {
|
|
1473
|
-
t.equal(warning.name, 'DeprecationWarning')
|
|
1474
|
-
t.equal(warning.code, FSTDEP010.code)
|
|
1475
|
-
}
|
|
1476
|
-
|
|
1477
|
-
fastify.get('/', (req, reply) => {
|
|
1478
|
-
reply.sent = true
|
|
1479
|
-
|
|
1480
|
-
reply.raw.end()
|
|
1481
|
-
})
|
|
1482
|
-
|
|
1483
|
-
fastify.inject('/', (err, res) => {
|
|
1484
|
-
t.error(err)
|
|
1485
|
-
t.pass()
|
|
1486
|
-
|
|
1487
|
-
process.removeListener('warning', onWarning)
|
|
1488
|
-
})
|
|
1489
|
-
})
|
|
1490
|
-
|
|
1491
|
-
test('should emit deprecation warning when trying to use the reply.context.config property', t => {
|
|
1492
|
-
t.plan(4)
|
|
1493
|
-
const fastify = Fastify()
|
|
1494
|
-
|
|
1495
|
-
FSTDEP019.emitted = false
|
|
1496
|
-
|
|
1497
|
-
process.removeAllListeners('warning')
|
|
1498
|
-
process.on('warning', onWarning)
|
|
1499
|
-
function onWarning (warning) {
|
|
1500
|
-
t.equal(warning.name, 'DeprecationWarning')
|
|
1501
|
-
t.equal(warning.code, FSTDEP019.code)
|
|
1502
|
-
}
|
|
1503
|
-
|
|
1504
|
-
fastify.get('/', (req, reply) => {
|
|
1505
|
-
req.log(reply.context.config)
|
|
1506
|
-
})
|
|
1507
|
-
|
|
1508
|
-
fastify.inject('/', (err, res) => {
|
|
1509
|
-
t.error(err)
|
|
1510
|
-
t.pass()
|
|
1511
|
-
|
|
1512
|
-
process.removeListener('warning', onWarning)
|
|
1513
|
-
})
|
|
1514
|
-
})
|
|
1515
|
-
|
|
1516
|
-
test('should throw error when passing falsy value to reply.sent', t => {
|
|
1517
|
-
t.plan(4)
|
|
1518
|
-
const fastify = Fastify()
|
|
1519
|
-
|
|
1520
|
-
fastify.get('/', function (req, reply) {
|
|
1521
|
-
try {
|
|
1522
|
-
reply.sent = false
|
|
1523
|
-
} catch (err) {
|
|
1524
|
-
t.equal(err.code, 'FST_ERR_REP_SENT_VALUE')
|
|
1525
|
-
t.equal(err.message, 'The only possible value for reply.sent is true.')
|
|
1526
|
-
reply.send()
|
|
1527
|
-
}
|
|
1528
|
-
})
|
|
1529
|
-
|
|
1530
|
-
fastify.inject('/', (err, res) => {
|
|
1531
|
-
t.error(err)
|
|
1532
|
-
t.pass()
|
|
1533
|
-
})
|
|
1534
|
-
})
|
|
1535
|
-
|
|
1536
|
-
test('should throw error when attempting to set reply.sent more than once', t => {
|
|
1463
|
+
test('should throw when trying to modify the reply.sent property', t => {
|
|
1537
1464
|
t.plan(3)
|
|
1538
1465
|
const fastify = Fastify()
|
|
1539
1466
|
|
|
1540
1467
|
fastify.get('/', function (req, reply) {
|
|
1541
|
-
reply.sent = true
|
|
1542
1468
|
try {
|
|
1543
1469
|
reply.sent = true
|
|
1544
|
-
t.fail('must throw')
|
|
1545
1470
|
} catch (err) {
|
|
1546
|
-
t.
|
|
1471
|
+
t.ok(err)
|
|
1472
|
+
reply.send()
|
|
1547
1473
|
}
|
|
1548
|
-
reply.raw.end()
|
|
1549
|
-
})
|
|
1550
|
-
|
|
1551
|
-
fastify.inject('/', (err, res) => {
|
|
1552
|
-
t.error(err)
|
|
1553
|
-
t.pass()
|
|
1554
|
-
})
|
|
1555
|
-
})
|
|
1556
|
-
|
|
1557
|
-
test('should not throw error when attempting to set reply.sent if the underlining request was sent', t => {
|
|
1558
|
-
t.plan(3)
|
|
1559
|
-
const fastify = Fastify()
|
|
1560
|
-
|
|
1561
|
-
fastify.get('/', function (req, reply) {
|
|
1562
|
-
reply.raw.end()
|
|
1563
|
-
t.doesNotThrow(() => {
|
|
1564
|
-
reply.sent = true
|
|
1565
|
-
})
|
|
1566
1474
|
})
|
|
1567
1475
|
|
|
1568
1476
|
fastify.inject('/', (err, res) => {
|
|
@@ -1843,7 +1751,7 @@ test('cannot set the replySerializer when the server is running', t => {
|
|
|
1843
1751
|
fastify.listen({ port: 0 }, err => {
|
|
1844
1752
|
t.error(err)
|
|
1845
1753
|
try {
|
|
1846
|
-
fastify.setReplySerializer(() => {})
|
|
1754
|
+
fastify.setReplySerializer(() => { })
|
|
1847
1755
|
t.fail('this serializer should not be setup')
|
|
1848
1756
|
} catch (e) {
|
|
1849
1757
|
t.equal(e.code, 'FST_ERR_INSTANCE_ALREADY_LISTENING')
|
|
@@ -1893,7 +1801,7 @@ test('reply should not call the custom serializer for errors and not found', t =
|
|
|
1893
1801
|
test('reply.then', t => {
|
|
1894
1802
|
t.plan(4)
|
|
1895
1803
|
|
|
1896
|
-
function request () {}
|
|
1804
|
+
function request () { }
|
|
1897
1805
|
|
|
1898
1806
|
t.test('without an error', t => {
|
|
1899
1807
|
t.plan(1)
|
|
@@ -2022,36 +1930,6 @@ test('redirect to an invalid URL should not crash the server', async t => {
|
|
|
2022
1930
|
await fastify.close()
|
|
2023
1931
|
})
|
|
2024
1932
|
|
|
2025
|
-
test('redirect with deprecated signature should warn', t => {
|
|
2026
|
-
t.plan(4)
|
|
2027
|
-
|
|
2028
|
-
process.removeAllListeners('warning')
|
|
2029
|
-
process.on('warning', onWarning)
|
|
2030
|
-
function onWarning (warning) {
|
|
2031
|
-
t.equal(warning.name, 'DeprecationWarning')
|
|
2032
|
-
t.equal(warning.code, FSTDEP021.code)
|
|
2033
|
-
}
|
|
2034
|
-
|
|
2035
|
-
const fastify = Fastify()
|
|
2036
|
-
|
|
2037
|
-
fastify.get('/', (req, reply) => {
|
|
2038
|
-
reply.redirect(302, '/new')
|
|
2039
|
-
})
|
|
2040
|
-
|
|
2041
|
-
fastify.get('/new', (req, reply) => {
|
|
2042
|
-
reply.send('new')
|
|
2043
|
-
})
|
|
2044
|
-
|
|
2045
|
-
fastify.inject({ method: 'GET', url: '/' }, (err, res) => {
|
|
2046
|
-
t.error(err)
|
|
2047
|
-
t.pass()
|
|
2048
|
-
|
|
2049
|
-
process.removeListener('warning', onWarning)
|
|
2050
|
-
})
|
|
2051
|
-
|
|
2052
|
-
FSTDEP021.emitted = false
|
|
2053
|
-
})
|
|
2054
|
-
|
|
2055
1933
|
test('invalid response headers should not crash the server', async t => {
|
|
2056
1934
|
const fastify = Fastify()
|
|
2057
1935
|
fastify.route({
|
|
@@ -2153,7 +2031,7 @@ test('reply.send will intercept ERR_HTTP_HEADERS_SENT and log an error message',
|
|
|
2153
2031
|
|
|
2154
2032
|
const response = new Writable()
|
|
2155
2033
|
Object.assign(response, {
|
|
2156
|
-
setHeader: () => {},
|
|
2034
|
+
setHeader: () => { },
|
|
2157
2035
|
hasHeader: () => false,
|
|
2158
2036
|
getHeader: () => undefined,
|
|
2159
2037
|
writeHead: () => {
|
|
@@ -2161,7 +2039,7 @@ test('reply.send will intercept ERR_HTTP_HEADERS_SENT and log an error message',
|
|
|
2161
2039
|
err.code = 'ERR_HTTP_HEADERS_SENT'
|
|
2162
2040
|
throw err
|
|
2163
2041
|
},
|
|
2164
|
-
write: () => {},
|
|
2042
|
+
write: () => { },
|
|
2165
2043
|
headersSent: true
|
|
2166
2044
|
})
|
|
2167
2045
|
|
|
@@ -16,21 +16,30 @@ const defaultSchema = {
|
|
|
16
16
|
|
|
17
17
|
const requestSchema = {
|
|
18
18
|
params: {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {
|
|
21
|
+
id: {
|
|
22
|
+
type: 'integer',
|
|
23
|
+
minimum: 1
|
|
24
|
+
}
|
|
22
25
|
}
|
|
23
26
|
},
|
|
24
27
|
querystring: {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
foo: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
enum: ['bar']
|
|
33
|
+
}
|
|
28
34
|
}
|
|
29
35
|
},
|
|
30
36
|
body: defaultSchema,
|
|
31
37
|
headers: {
|
|
32
|
-
'
|
|
33
|
-
|
|
38
|
+
type: 'object',
|
|
39
|
+
properties: {
|
|
40
|
+
'x-foo': {
|
|
41
|
+
type: 'string'
|
|
42
|
+
}
|
|
34
43
|
}
|
|
35
44
|
}
|
|
36
45
|
}
|
|
@@ -68,7 +77,7 @@ test('#compileValidationSchema', subtest => {
|
|
|
68
77
|
const validate = req.compileValidationSchema(defaultSchema)
|
|
69
78
|
|
|
70
79
|
t.ok(validate({ hello: 'world' }))
|
|
71
|
-
t.ok(Object.
|
|
80
|
+
t.ok(Object.hasOwn(validate, 'errors'))
|
|
72
81
|
t.equal(validate.errors, null)
|
|
73
82
|
|
|
74
83
|
reply.send({ hello: 'world' })
|
|
@@ -89,7 +98,7 @@ test('#compileValidationSchema', subtest => {
|
|
|
89
98
|
const validate = req.compileValidationSchema(defaultSchema)
|
|
90
99
|
|
|
91
100
|
t.notOk(validate({ world: 'foo' }))
|
|
92
|
-
t.ok(Object.
|
|
101
|
+
t.ok(Object.hasOwn(validate, 'errors'))
|
|
93
102
|
t.ok(Array.isArray(validate.errors))
|
|
94
103
|
t.ok(validate.errors.length > 0)
|
|
95
104
|
|
|
@@ -281,7 +290,7 @@ test('#getValidationFunction', subtest => {
|
|
|
281
290
|
const validate = req.getValidationFunction(defaultSchema)
|
|
282
291
|
|
|
283
292
|
t.ok(validate({ hello: 'world' }))
|
|
284
|
-
t.ok(Object.
|
|
293
|
+
t.ok(Object.hasOwn(validate, 'errors'))
|
|
285
294
|
t.equal(validate.errors, null)
|
|
286
295
|
|
|
287
296
|
reply.send({ hello: 'world' })
|
|
@@ -303,7 +312,7 @@ test('#getValidationFunction', subtest => {
|
|
|
303
312
|
const validate = req.getValidationFunction(defaultSchema)
|
|
304
313
|
|
|
305
314
|
t.notOk(validate({ world: 'foo' }))
|
|
306
|
-
t.ok(Object.
|
|
315
|
+
t.ok(Object.hasOwn(validate, 'errors'))
|
|
307
316
|
t.ok(Array.isArray(validate.errors))
|
|
308
317
|
t.ok(validate.errors.length > 0)
|
|
309
318
|
|