プレイグラウンド、サンドボックス、使い捨てスクリプト置き場
0

Configure Feed

Select the types of activity you want to include in your feed.

remove fastify-validation package.json and rename server.mjs to server.ts with updated routes

Kohei Watanabe (Jan 21, 2025, 11:25 AM +0900) 8f13edab 8b1036e9

+106 -419
-7
fastify-validation/package.json
··· 1 - { 2 - "devDependencies": { 3 - "fastify": "^5.1.0", 4 - "secure-json-parse": "^3.0.1" 5 - }, 6 - "packageManager": "pnpm@9.14.4+sha512.c8180b3fbe4e4bca02c94234717896b5529740a6cbadf19fa78254270403ea2f27d4e1d46a08a0f56c89b63dc8ebfd3ee53326da720273794e6200fcf0d184ab" 7 - }
-357
fastify-validation/pnpm-lock.yaml
··· 1 - lockfileVersion: '9.0' 2 - 3 - settings: 4 - autoInstallPeers: true 5 - excludeLinksFromLockfile: false 6 - 7 - importers: 8 - 9 - .: 10 - devDependencies: 11 - fastify: 12 - specifier: ^5.1.0 13 - version: 5.1.0 14 - secure-json-parse: 15 - specifier: ^3.0.1 16 - version: 3.0.1 17 - 18 - packages: 19 - 20 - '@fastify/ajv-compiler@4.0.1': 21 - resolution: {integrity: sha512-DxrBdgsjNLP0YM6W5Hd6/Fmj43S8zMKiFJYgi+Ri3htTGAowPVG/tG1wpnWLMjufEnehRivUCKZ1pLDIoZdTuw==} 22 - 23 - '@fastify/error@4.0.0': 24 - resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} 25 - 26 - '@fastify/fast-json-stringify-compiler@5.0.1': 27 - resolution: {integrity: sha512-f2d3JExJgFE3UbdFcpPwqNUEoHWmt8pAKf8f+9YuLESdefA0WgqxeT6DrGL4Yrf/9ihXNSKOqpjEmurV405meA==} 28 - 29 - '@fastify/merge-json-schemas@0.1.1': 30 - resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} 31 - 32 - abstract-logging@2.0.1: 33 - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} 34 - 35 - ajv-formats@3.0.1: 36 - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} 37 - peerDependencies: 38 - ajv: ^8.0.0 39 - peerDependenciesMeta: 40 - ajv: 41 - optional: true 42 - 43 - ajv@8.17.1: 44 - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 45 - 46 - atomic-sleep@1.0.0: 47 - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 48 - engines: {node: '>=8.0.0'} 49 - 50 - avvio@9.1.0: 51 - resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} 52 - 53 - cookie@1.0.2: 54 - resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} 55 - engines: {node: '>=18'} 56 - 57 - fast-decode-uri-component@1.0.1: 58 - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} 59 - 60 - fast-deep-equal@3.1.3: 61 - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 62 - 63 - fast-json-stringify@6.0.0: 64 - resolution: {integrity: sha512-FGMKZwniMTgZh7zQp9b6XnBVxUmKVahQLQeRQHqwYmPDqDhcEKZ3BaQsxelFFI5PY7nN71OEeiL47/zUWcYe1A==} 65 - 66 - fast-querystring@1.1.2: 67 - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} 68 - 69 - fast-redact@3.5.0: 70 - resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} 71 - engines: {node: '>=6'} 72 - 73 - fast-uri@2.4.0: 74 - resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} 75 - 76 - fast-uri@3.0.3: 77 - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} 78 - 79 - fastify@5.1.0: 80 - resolution: {integrity: sha512-0SdUC5AoiSgMSc2Vxwv3WyKzyGMDJRAW/PgNsK1kZrnkO6MeqUIW9ovVg9F2UGIqtIcclYMyeJa4rK6OZc7Jxg==} 81 - 82 - fastq@1.17.1: 83 - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 84 - 85 - find-my-way@9.1.0: 86 - resolution: {integrity: sha512-Y5jIsuYR4BwWDYYQ2A/RWWE6gD8a0FMgtU+HOq1WKku+Cwdz8M1v8wcAmRXXM1/iqtoqg06v+LjAxMYbCjViMw==} 87 - engines: {node: '>=14'} 88 - 89 - forwarded@0.2.0: 90 - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 91 - engines: {node: '>= 0.6'} 92 - 93 - ipaddr.js@1.9.1: 94 - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 95 - engines: {node: '>= 0.10'} 96 - 97 - json-schema-ref-resolver@1.0.1: 98 - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} 99 - 100 - json-schema-traverse@1.0.0: 101 - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 102 - 103 - light-my-request@6.3.0: 104 - resolution: {integrity: sha512-bWTAPJmeWQH5suJNYwG0f5cs0p6ho9e6f1Ppoxv5qMosY+s9Ir2+ZLvvHcgA7VTDop4zl/NCHhOVVqU+kd++Ow==} 105 - 106 - on-exit-leak-free@2.1.2: 107 - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} 108 - engines: {node: '>=14.0.0'} 109 - 110 - pino-abstract-transport@2.0.0: 111 - resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} 112 - 113 - pino-std-serializers@7.0.0: 114 - resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} 115 - 116 - pino@9.5.0: 117 - resolution: {integrity: sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==} 118 - hasBin: true 119 - 120 - process-warning@4.0.0: 121 - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} 122 - 123 - proxy-addr@2.0.7: 124 - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 125 - engines: {node: '>= 0.10'} 126 - 127 - quick-format-unescaped@4.0.4: 128 - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 129 - 130 - real-require@0.2.0: 131 - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 132 - engines: {node: '>= 12.13.0'} 133 - 134 - require-from-string@2.0.2: 135 - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 136 - engines: {node: '>=0.10.0'} 137 - 138 - ret@0.5.0: 139 - resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} 140 - engines: {node: '>=10'} 141 - 142 - reusify@1.0.4: 143 - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 144 - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 145 - 146 - rfdc@1.4.1: 147 - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 148 - 149 - safe-regex2@4.0.0: 150 - resolution: {integrity: sha512-Hvjfv25jPDVr3U+4LDzBuZPPOymELG3PYcSk5hcevooo1yxxamQL/bHs/GrEPGmMoMEwRrHVGiCA1pXi97B8Ew==} 151 - 152 - safe-stable-stringify@2.5.0: 153 - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} 154 - engines: {node: '>=10'} 155 - 156 - secure-json-parse@2.7.0: 157 - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} 158 - 159 - secure-json-parse@3.0.1: 160 - resolution: {integrity: sha512-9QR7G96th4QJ2+dJwvZB+JoXyt8PN+DbEjOr6kL2/JU4KH8Eb2sFdU+gt8EDdzWDWoWH0uocDdfCoFzdVSixUA==} 161 - 162 - semver@7.6.3: 163 - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 164 - engines: {node: '>=10'} 165 - hasBin: true 166 - 167 - set-cookie-parser@2.7.1: 168 - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} 169 - 170 - sonic-boom@4.2.0: 171 - resolution: {integrity: sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==} 172 - 173 - split2@4.2.0: 174 - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 175 - engines: {node: '>= 10.x'} 176 - 177 - thread-stream@3.1.0: 178 - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} 179 - 180 - toad-cache@3.7.0: 181 - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} 182 - engines: {node: '>=12'} 183 - 184 - snapshots: 185 - 186 - '@fastify/ajv-compiler@4.0.1': 187 - dependencies: 188 - ajv: 8.17.1 189 - ajv-formats: 3.0.1(ajv@8.17.1) 190 - fast-uri: 3.0.3 191 - 192 - '@fastify/error@4.0.0': {} 193 - 194 - '@fastify/fast-json-stringify-compiler@5.0.1': 195 - dependencies: 196 - fast-json-stringify: 6.0.0 197 - 198 - '@fastify/merge-json-schemas@0.1.1': 199 - dependencies: 200 - fast-deep-equal: 3.1.3 201 - 202 - abstract-logging@2.0.1: {} 203 - 204 - ajv-formats@3.0.1(ajv@8.17.1): 205 - optionalDependencies: 206 - ajv: 8.17.1 207 - 208 - ajv@8.17.1: 209 - dependencies: 210 - fast-deep-equal: 3.1.3 211 - fast-uri: 3.0.3 212 - json-schema-traverse: 1.0.0 213 - require-from-string: 2.0.2 214 - 215 - atomic-sleep@1.0.0: {} 216 - 217 - avvio@9.1.0: 218 - dependencies: 219 - '@fastify/error': 4.0.0 220 - fastq: 1.17.1 221 - 222 - cookie@1.0.2: {} 223 - 224 - fast-decode-uri-component@1.0.1: {} 225 - 226 - fast-deep-equal@3.1.3: {} 227 - 228 - fast-json-stringify@6.0.0: 229 - dependencies: 230 - '@fastify/merge-json-schemas': 0.1.1 231 - ajv: 8.17.1 232 - ajv-formats: 3.0.1(ajv@8.17.1) 233 - fast-deep-equal: 3.1.3 234 - fast-uri: 2.4.0 235 - json-schema-ref-resolver: 1.0.1 236 - rfdc: 1.4.1 237 - 238 - fast-querystring@1.1.2: 239 - dependencies: 240 - fast-decode-uri-component: 1.0.1 241 - 242 - fast-redact@3.5.0: {} 243 - 244 - fast-uri@2.4.0: {} 245 - 246 - fast-uri@3.0.3: {} 247 - 248 - fastify@5.1.0: 249 - dependencies: 250 - '@fastify/ajv-compiler': 4.0.1 251 - '@fastify/error': 4.0.0 252 - '@fastify/fast-json-stringify-compiler': 5.0.1 253 - abstract-logging: 2.0.1 254 - avvio: 9.1.0 255 - fast-json-stringify: 6.0.0 256 - find-my-way: 9.1.0 257 - light-my-request: 6.3.0 258 - pino: 9.5.0 259 - process-warning: 4.0.0 260 - proxy-addr: 2.0.7 261 - rfdc: 1.4.1 262 - secure-json-parse: 2.7.0 263 - semver: 7.6.3 264 - toad-cache: 3.7.0 265 - 266 - fastq@1.17.1: 267 - dependencies: 268 - reusify: 1.0.4 269 - 270 - find-my-way@9.1.0: 271 - dependencies: 272 - fast-deep-equal: 3.1.3 273 - fast-querystring: 1.1.2 274 - safe-regex2: 4.0.0 275 - 276 - forwarded@0.2.0: {} 277 - 278 - ipaddr.js@1.9.1: {} 279 - 280 - json-schema-ref-resolver@1.0.1: 281 - dependencies: 282 - fast-deep-equal: 3.1.3 283 - 284 - json-schema-traverse@1.0.0: {} 285 - 286 - light-my-request@6.3.0: 287 - dependencies: 288 - cookie: 1.0.2 289 - process-warning: 4.0.0 290 - set-cookie-parser: 2.7.1 291 - 292 - on-exit-leak-free@2.1.2: {} 293 - 294 - pino-abstract-transport@2.0.0: 295 - dependencies: 296 - split2: 4.2.0 297 - 298 - pino-std-serializers@7.0.0: {} 299 - 300 - pino@9.5.0: 301 - dependencies: 302 - atomic-sleep: 1.0.0 303 - fast-redact: 3.5.0 304 - on-exit-leak-free: 2.1.2 305 - pino-abstract-transport: 2.0.0 306 - pino-std-serializers: 7.0.0 307 - process-warning: 4.0.0 308 - quick-format-unescaped: 4.0.4 309 - real-require: 0.2.0 310 - safe-stable-stringify: 2.5.0 311 - sonic-boom: 4.2.0 312 - thread-stream: 3.1.0 313 - 314 - process-warning@4.0.0: {} 315 - 316 - proxy-addr@2.0.7: 317 - dependencies: 318 - forwarded: 0.2.0 319 - ipaddr.js: 1.9.1 320 - 321 - quick-format-unescaped@4.0.4: {} 322 - 323 - real-require@0.2.0: {} 324 - 325 - require-from-string@2.0.2: {} 326 - 327 - ret@0.5.0: {} 328 - 329 - reusify@1.0.4: {} 330 - 331 - rfdc@1.4.1: {} 332 - 333 - safe-regex2@4.0.0: 334 - dependencies: 335 - ret: 0.5.0 336 - 337 - safe-stable-stringify@2.5.0: {} 338 - 339 - secure-json-parse@2.7.0: {} 340 - 341 - secure-json-parse@3.0.1: {} 342 - 343 - semver@7.6.3: {} 344 - 345 - set-cookie-parser@2.7.1: {} 346 - 347 - sonic-boom@4.2.0: 348 - dependencies: 349 - atomic-sleep: 1.0.0 350 - 351 - split2@4.2.0: {} 352 - 353 - thread-stream@3.1.0: 354 - dependencies: 355 - real-require: 0.2.0 356 - 357 - toad-cache@3.7.0: {}
-55
fastify-validation/server.mjs
··· 1 - import fastify from "fastify"; 2 - import { parse as JsonParse } from "secure-json-parse"; 3 - 4 - const server = fastify({ logger: true }); 5 - 6 - server.get("/array", { 7 - schema: { 8 - querystring: { 9 - type: "object", 10 - properties: { array: { type: "array", items: { type: "string" } } }, 11 - required: ["array"], 12 - }, 13 - }, 14 - async preValidation(req) { 15 - req.query.array = [req.query.array].flat().flatMap((s) => { 16 - try { 17 - const parsed = JsonParse(s); 18 - return Array.isArray(parsed) ? parsed : [s]; 19 - } catch { 20 - return [s]; 21 - } 22 - }); 23 - }, 24 - handler({ query }) { 25 - console.log({ ...query }); 26 - return "ok"; 27 - }, 28 - }); 29 - 30 - // valid 31 - await server.inject(`/array?array=["123",4]`); 32 - 33 - /* 34 - server.get("/dateTime", { 35 - schema: { 36 - querystring: { 37 - type: "object", 38 - properties: { dateTime: { type: "string", format: "date-time" } }, 39 - required: ["dateTime"], 40 - }, 41 - }, 42 - handler() { 43 - return "ok"; 44 - }, 45 - }); 46 - 47 - // valid 48 - await server.inject("/dateTime?dateTime=2021-09-10T15:30:00Z"); 49 - 50 - // valid: fasitfy@4.22.2, invalid fastify@5.1.0: querystring/dateTime must match format "date-time" 51 - await server.inject("/dateTime?dateTime=2021-09-10T15:30:00"); 52 - 53 - // invalid: querystring/dateTime must match format "date-time" 54 - await server.inject("/dateTime?dateTime=2021-09-10"); 55 - */
+106
fastify-validation/server.ts
··· 1 + #!/usr/bin/env -S deno run -A 2 + import fastify from "npm:fastify"; 3 + // import { parse as jsonParse } from "npm:secure-json-parse"; 4 + 5 + const server = fastify({ logger: true }); 6 + 7 + server.get("/anyOf", { 8 + schema: { 9 + querystring: { 10 + type: "object", 11 + properties: { 12 + array: { 13 + anyOf: [ 14 + { type: "array", items: { type: "string" } }, 15 + { type: "string" }, 16 + ], 17 + }, 18 + }, 19 + required: ["array"], 20 + }, 21 + }, 22 + handler({ query }) { 23 + console.log({ ...query }); 24 + return "ok"; 25 + }, 26 + }); 27 + 28 + server.get("/oneOf", { 29 + schema: { 30 + querystring: { 31 + type: "object", 32 + properties: { 33 + array: { 34 + oneOf: [ 35 + { type: "array", items: { type: "string" } }, 36 + { type: "string" }, 37 + ], 38 + }, 39 + }, 40 + required: ["array"], 41 + }, 42 + }, 43 + handler({ query }) { 44 + console.log({ ...query }); 45 + return "ok"; 46 + }, 47 + }); 48 + 49 + // valid 50 + await server.inject(`/anyOf?array=a`); 51 + 52 + // invalid: querystring/array must match exactly one schema in oneOf 53 + await server.inject(`/oneOf?array=a`); 54 + 55 + /* 56 + server.get("/array", { 57 + schema: { 58 + querystring: { 59 + type: "object", 60 + properties: { array: { type: "array", items: { type: "string" } } }, 61 + required: ["array"], 62 + }, 63 + }, 64 + async preValidation(req) { 65 + req.query.array = [req.query.array].flat().flatMap((s) => { 66 + try { 67 + const parsed = jsonParse(s); 68 + return Array.isArray(parsed) ? parsed : [s]; 69 + } catch { 70 + return [s]; 71 + } 72 + }); 73 + }, 74 + handler({ query }) { 75 + console.log({ ...query }); 76 + return "ok"; 77 + }, 78 + }); 79 + 80 + // valid 81 + await server.inject(`/array?array=["123",4]`); 82 + */ 83 + 84 + /* 85 + server.get("/dateTime", { 86 + schema: { 87 + querystring: { 88 + type: "object", 89 + properties: { dateTime: { type: "string", format: "date-time" } }, 90 + required: ["dateTime"], 91 + }, 92 + }, 93 + handler() { 94 + return "ok"; 95 + }, 96 + }); 97 + 98 + // valid 99 + await server.inject("/dateTime?dateTime=2021-09-10T15:30:00Z"); 100 + 101 + // valid: fasitfy@4.22.2, invalid fastify@5.1.0: querystring/dateTime must match format "date-time" 102 + await server.inject("/dateTime?dateTime=2021-09-10T15:30:00"); 103 + 104 + // invalid: querystring/dateTime must match format "date-time" 105 + await server.inject("/dateTime?dateTime=2021-09-10"); 106 + */