@zimic/http 1.2.1 → 1.2.2-canary.1
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/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/formData/HttpFormData.ts +7 -7
- package/src/headers/HttpHeaders.ts +2 -2
- package/src/searchParams/HttpSearchParams.ts +2 -2
- package/src/types/requests.ts +16 -11
package/dist/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ var color__default = /*#__PURE__*/_interopDefault(color);
|
|
|
12
12
|
var yargs__default = /*#__PURE__*/_interopDefault(yargs);
|
|
13
13
|
|
|
14
14
|
// package.json
|
|
15
|
-
var version = "1.2.1";
|
|
15
|
+
var version = "1.2.2-canary.1";
|
|
16
16
|
|
|
17
17
|
// src/utils/time.ts
|
|
18
18
|
async function usingElapsedTime(callback) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/utils/time.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["yargs","hideBin","generate_default","color","logger"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"@zimic/http\",\n \"description\": \"Next-gen TypeScript-first HTTP utilities\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"api\",\n \"static\"\n ],\n \"version\": \"1.2.1\",\n \"homepage\": \"https://zimic.dev/docs/http\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-http\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/zimicjs\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"typegen.d.ts\"\n ],\n \"sideEffects\": false,\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-http\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./typegen\": {\n \"types\": \"./typegen.d.ts\",\n \"import\": \"./dist/typegen.mjs\",\n \"require\": \"./dist/typegen.js\",\n \"default\": \"./dist/typegen.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node --enable-source-maps ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -v FORCE_COLOR=1 -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"typegen:fixtures\": \"tsx ./scripts/typegen/generateFixtureTypes.ts\",\n \"deps:setup-playwright\": \"playwright install chromium\",\n \"deps:setup\": \"pnpm deps:setup-playwright\"\n },\n \"dependencies\": {\n \"openapi-typescript\": \"7.9.1\",\n \"picocolors\": \"^1.1.1\",\n \"yargs\": \"18.0.0\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^24.7.2\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.2.4\",\n \"@vitest/coverage-istanbul\": \"^3.2.4\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/interceptor\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^10.0.0\",\n \"eslint\": \"^9.37.0\",\n \"execa\": \"9.6.0\",\n \"js-yaml\": \"^4.1.0\",\n \"playwright\": \"^1.56.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \">=5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","import { PossiblePromise } from '@zimic/utils/types';\n\nexport async function usingElapsedTime<ReturnType>(callback: () => PossiblePromise<ReturnType>) {\n const startTimeInMilliseconds = performance.now();\n\n const result = await callback();\n\n const endTimeInMilliseconds = performance.now();\n const elapsedTimeInMilliseconds = endTimeInMilliseconds - startTimeInMilliseconds;\n\n return {\n startTime: startTimeInMilliseconds,\n elapsedTime: elapsedTimeInMilliseconds,\n endTime: endTimeInMilliseconds,\n result,\n };\n}\n\nexport function formatElapsedTime(elapsedTimeInMilliseconds: number) {\n if (elapsedTimeInMilliseconds < 1000) {\n return `${elapsedTimeInMilliseconds.toFixed(0)}ms`;\n } else {\n return `${(elapsedTimeInMilliseconds / 1000).toFixed(2)}s`;\n }\n}\n","import color from 'picocolors';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport { generateTypesFromOpenAPI } from '@/typegen';\nimport { logger } from '@/utils/logging';\nimport { usingElapsedTime, formatElapsedTime } from '@/utils/time';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-http')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('typegen', 'Generate types from schema sources.', (yargs) =>\n yargs.demandCommand().command(\n 'openapi <input>',\n 'Generate types from an OpenAPI schema.',\n (yargs) =>\n yargs\n .positional('input', {\n type: 'string',\n description:\n 'The path to a local OpenAPI schema file or an URL to fetch it. ' +\n 'Version 3 is supported as YAML or JSON.',\n demandOption: true,\n })\n .option('output', {\n type: 'string',\n description:\n 'The path to write the generated types to. If not provided, the types will be written to stdout.',\n alias: 'o',\n })\n .option('service-name', {\n type: 'string',\n description: 'The name of the service to use in the generated types.',\n alias: 's',\n demandOption: true,\n })\n .option('comments', {\n type: 'boolean',\n description: 'Whether to include comments in the generated types.',\n alias: 'c',\n default: true,\n })\n .option('prune', {\n type: 'boolean',\n description:\n 'Whether to remove unused operations and components from the generated types. This is useful for ' +\n 'reducing the size of the output file.',\n alias: 'p',\n default: true,\n })\n .option('filter', {\n type: 'string',\n array: true,\n description: [\n 'One or more expressions filtering which endpoints to include. Filters must follow the format `<method> ' +\n '<path>`, where:',\n '- `<method>`: one HTTP method, a list of HTTP methods separated by commas, or `*` to match any HTTP ' +\n 'method;',\n '- `<path>`: a literal path or a glob. `*` matches zero or more characters in a segment (except `/`), ' +\n 'while `**` matches zero or more characters across segments (may include `/`). For example, ' +\n '`GET /users` matches a single method and path, while `* /users` matches any method to the `/users` ' +\n 'path; `GET /users*` matches any `GET` request whose path starts with `/users`, and `GET /users/**/*` ' +\n 'matches any `GET` request to any sub-path of `/users`.',\n\n 'Negative filters can be created by prefixing the expression with `!`. For example, `!GET /users` will ' +\n 'exclude paths matching `GET /users`.',\n ].join('\\n'),\n alias: 'f',\n })\n .option('filter-file', {\n type: 'string',\n description:\n 'A path to a file containing filter expressions. One expression is expected per line and the format ' +\n 'is the same as used in a `--filter` option. Comments are prefixed with `#`. A filter file can be ' +\n 'used alongside additional `--filter` expressions.',\n alias: 'F',\n }),\n async (cliArguments) => {\n const executionSummary = await usingElapsedTime(async () => {\n await generateTypesFromOpenAPI({\n input: cliArguments.input,\n output: cliArguments.output,\n serviceName: cliArguments.serviceName,\n includeComments: cliArguments.comments,\n prune: cliArguments.prune,\n filters: cliArguments.filter,\n filterFile: cliArguments.filterFile,\n });\n });\n\n const outputFilePath = cliArguments.output;\n\n const successMessage =\n `${color.green(color.bold('✔'))} Generated ` +\n `${outputFilePath ? color.green(outputFilePath) : `to ${color.yellow('stdout')}`} ${color.dim(\n `(${formatElapsedTime(executionSummary.elapsedTime)})`,\n )}`;\n\n const hasWrittenToStdout = outputFilePath === undefined;\n logger[hasWrittenToStdout ? 'warn' : 'info'](successMessage);\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/utils/time.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["yargs","hideBin","generate_default","color","logger"],"mappings":"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","file":"cli.js","sourcesContent":["{\n \"name\": \"@zimic/http\",\n \"description\": \"Next-gen TypeScript-first HTTP utilities\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"api\",\n \"static\"\n ],\n \"version\": \"1.2.2-canary.1\",\n \"homepage\": \"https://zimic.dev/docs/http\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-http\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/zimicjs\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"typegen.d.ts\"\n ],\n \"sideEffects\": false,\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-http\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./typegen\": {\n \"types\": \"./typegen.d.ts\",\n \"import\": \"./dist/typegen.mjs\",\n \"require\": \"./dist/typegen.js\",\n \"default\": \"./dist/typegen.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node --enable-source-maps ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -v FORCE_COLOR=1 -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"typegen:fixtures\": \"tsx ./scripts/typegen/generateFixtureTypes.ts\",\n \"deps:setup-playwright\": \"playwright install chromium\",\n \"deps:setup\": \"pnpm deps:setup-playwright\"\n },\n \"dependencies\": {\n \"openapi-typescript\": \"7.10.1\",\n \"picocolors\": \"^1.1.1\",\n \"yargs\": \"18.0.0\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^24.7.2\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.2.4\",\n \"@vitest/coverage-istanbul\": \"^3.2.4\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/interceptor\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^10.0.0\",\n \"eslint\": \"^9.37.0\",\n \"execa\": \"9.6.0\",\n \"js-yaml\": \"^4.1.0\",\n \"playwright\": \"^1.56.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \">=5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","import { PossiblePromise } from '@zimic/utils/types';\n\nexport async function usingElapsedTime<ReturnType>(callback: () => PossiblePromise<ReturnType>) {\n const startTimeInMilliseconds = performance.now();\n\n const result = await callback();\n\n const endTimeInMilliseconds = performance.now();\n const elapsedTimeInMilliseconds = endTimeInMilliseconds - startTimeInMilliseconds;\n\n return {\n startTime: startTimeInMilliseconds,\n elapsedTime: elapsedTimeInMilliseconds,\n endTime: endTimeInMilliseconds,\n result,\n };\n}\n\nexport function formatElapsedTime(elapsedTimeInMilliseconds: number) {\n if (elapsedTimeInMilliseconds < 1000) {\n return `${elapsedTimeInMilliseconds.toFixed(0)}ms`;\n } else {\n return `${(elapsedTimeInMilliseconds / 1000).toFixed(2)}s`;\n }\n}\n","import color from 'picocolors';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport { generateTypesFromOpenAPI } from '@/typegen';\nimport { logger } from '@/utils/logging';\nimport { usingElapsedTime, formatElapsedTime } from '@/utils/time';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-http')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('typegen', 'Generate types from schema sources.', (yargs) =>\n yargs.demandCommand().command(\n 'openapi <input>',\n 'Generate types from an OpenAPI schema.',\n (yargs) =>\n yargs\n .positional('input', {\n type: 'string',\n description:\n 'The path to a local OpenAPI schema file or an URL to fetch it. ' +\n 'Version 3 is supported as YAML or JSON.',\n demandOption: true,\n })\n .option('output', {\n type: 'string',\n description:\n 'The path to write the generated types to. If not provided, the types will be written to stdout.',\n alias: 'o',\n })\n .option('service-name', {\n type: 'string',\n description: 'The name of the service to use in the generated types.',\n alias: 's',\n demandOption: true,\n })\n .option('comments', {\n type: 'boolean',\n description: 'Whether to include comments in the generated types.',\n alias: 'c',\n default: true,\n })\n .option('prune', {\n type: 'boolean',\n description:\n 'Whether to remove unused operations and components from the generated types. This is useful for ' +\n 'reducing the size of the output file.',\n alias: 'p',\n default: true,\n })\n .option('filter', {\n type: 'string',\n array: true,\n description: [\n 'One or more expressions filtering which endpoints to include. Filters must follow the format `<method> ' +\n '<path>`, where:',\n '- `<method>`: one HTTP method, a list of HTTP methods separated by commas, or `*` to match any HTTP ' +\n 'method;',\n '- `<path>`: a literal path or a glob. `*` matches zero or more characters in a segment (except `/`), ' +\n 'while `**` matches zero or more characters across segments (may include `/`). For example, ' +\n '`GET /users` matches a single method and path, while `* /users` matches any method to the `/users` ' +\n 'path; `GET /users*` matches any `GET` request whose path starts with `/users`, and `GET /users/**/*` ' +\n 'matches any `GET` request to any sub-path of `/users`.',\n\n 'Negative filters can be created by prefixing the expression with `!`. For example, `!GET /users` will ' +\n 'exclude paths matching `GET /users`.',\n ].join('\\n'),\n alias: 'f',\n })\n .option('filter-file', {\n type: 'string',\n description:\n 'A path to a file containing filter expressions. One expression is expected per line and the format ' +\n 'is the same as used in a `--filter` option. Comments are prefixed with `#`. A filter file can be ' +\n 'used alongside additional `--filter` expressions.',\n alias: 'F',\n }),\n async (cliArguments) => {\n const executionSummary = await usingElapsedTime(async () => {\n await generateTypesFromOpenAPI({\n input: cliArguments.input,\n output: cliArguments.output,\n serviceName: cliArguments.serviceName,\n includeComments: cliArguments.comments,\n prune: cliArguments.prune,\n filters: cliArguments.filter,\n filterFile: cliArguments.filterFile,\n });\n });\n\n const outputFilePath = cliArguments.output;\n\n const successMessage =\n `${color.green(color.bold('✔'))} Generated ` +\n `${outputFilePath ? color.green(outputFilePath) : `to ${color.yellow('stdout')}`} ${color.dim(\n `(${formatElapsedTime(executionSummary.elapsedTime)})`,\n )}`;\n\n const hasWrittenToStdout = outputFilePath === undefined;\n logger[hasWrittenToStdout ? 'warn' : 'info'](successMessage);\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
package/dist/cli.mjs
CHANGED
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/utils/time.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["yargs"],"mappings":"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","file":"cli.mjs","sourcesContent":["{\n \"name\": \"@zimic/http\",\n \"description\": \"Next-gen TypeScript-first HTTP utilities\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"api\",\n \"static\"\n ],\n \"version\": \"1.2.1\",\n \"homepage\": \"https://zimic.dev/docs/http\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-http\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/zimicjs\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"typegen.d.ts\"\n ],\n \"sideEffects\": false,\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-http\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./typegen\": {\n \"types\": \"./typegen.d.ts\",\n \"import\": \"./dist/typegen.mjs\",\n \"require\": \"./dist/typegen.js\",\n \"default\": \"./dist/typegen.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node --enable-source-maps ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -v FORCE_COLOR=1 -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"typegen:fixtures\": \"tsx ./scripts/typegen/generateFixtureTypes.ts\",\n \"deps:setup-playwright\": \"playwright install chromium\",\n \"deps:setup\": \"pnpm deps:setup-playwright\"\n },\n \"dependencies\": {\n \"openapi-typescript\": \"7.9.1\",\n \"picocolors\": \"^1.1.1\",\n \"yargs\": \"18.0.0\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^24.7.2\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.2.4\",\n \"@vitest/coverage-istanbul\": \"^3.2.4\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/interceptor\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^10.0.0\",\n \"eslint\": \"^9.37.0\",\n \"execa\": \"9.6.0\",\n \"js-yaml\": \"^4.1.0\",\n \"playwright\": \"^1.56.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \">=5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","import { PossiblePromise } from '@zimic/utils/types';\n\nexport async function usingElapsedTime<ReturnType>(callback: () => PossiblePromise<ReturnType>) {\n const startTimeInMilliseconds = performance.now();\n\n const result = await callback();\n\n const endTimeInMilliseconds = performance.now();\n const elapsedTimeInMilliseconds = endTimeInMilliseconds - startTimeInMilliseconds;\n\n return {\n startTime: startTimeInMilliseconds,\n elapsedTime: elapsedTimeInMilliseconds,\n endTime: endTimeInMilliseconds,\n result,\n };\n}\n\nexport function formatElapsedTime(elapsedTimeInMilliseconds: number) {\n if (elapsedTimeInMilliseconds < 1000) {\n return `${elapsedTimeInMilliseconds.toFixed(0)}ms`;\n } else {\n return `${(elapsedTimeInMilliseconds / 1000).toFixed(2)}s`;\n }\n}\n","import color from 'picocolors';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport { generateTypesFromOpenAPI } from '@/typegen';\nimport { logger } from '@/utils/logging';\nimport { usingElapsedTime, formatElapsedTime } from '@/utils/time';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-http')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('typegen', 'Generate types from schema sources.', (yargs) =>\n yargs.demandCommand().command(\n 'openapi <input>',\n 'Generate types from an OpenAPI schema.',\n (yargs) =>\n yargs\n .positional('input', {\n type: 'string',\n description:\n 'The path to a local OpenAPI schema file or an URL to fetch it. ' +\n 'Version 3 is supported as YAML or JSON.',\n demandOption: true,\n })\n .option('output', {\n type: 'string',\n description:\n 'The path to write the generated types to. If not provided, the types will be written to stdout.',\n alias: 'o',\n })\n .option('service-name', {\n type: 'string',\n description: 'The name of the service to use in the generated types.',\n alias: 's',\n demandOption: true,\n })\n .option('comments', {\n type: 'boolean',\n description: 'Whether to include comments in the generated types.',\n alias: 'c',\n default: true,\n })\n .option('prune', {\n type: 'boolean',\n description:\n 'Whether to remove unused operations and components from the generated types. This is useful for ' +\n 'reducing the size of the output file.',\n alias: 'p',\n default: true,\n })\n .option('filter', {\n type: 'string',\n array: true,\n description: [\n 'One or more expressions filtering which endpoints to include. Filters must follow the format `<method> ' +\n '<path>`, where:',\n '- `<method>`: one HTTP method, a list of HTTP methods separated by commas, or `*` to match any HTTP ' +\n 'method;',\n '- `<path>`: a literal path or a glob. `*` matches zero or more characters in a segment (except `/`), ' +\n 'while `**` matches zero or more characters across segments (may include `/`). For example, ' +\n '`GET /users` matches a single method and path, while `* /users` matches any method to the `/users` ' +\n 'path; `GET /users*` matches any `GET` request whose path starts with `/users`, and `GET /users/**/*` ' +\n 'matches any `GET` request to any sub-path of `/users`.',\n\n 'Negative filters can be created by prefixing the expression with `!`. For example, `!GET /users` will ' +\n 'exclude paths matching `GET /users`.',\n ].join('\\n'),\n alias: 'f',\n })\n .option('filter-file', {\n type: 'string',\n description:\n 'A path to a file containing filter expressions. One expression is expected per line and the format ' +\n 'is the same as used in a `--filter` option. Comments are prefixed with `#`. A filter file can be ' +\n 'used alongside additional `--filter` expressions.',\n alias: 'F',\n }),\n async (cliArguments) => {\n const executionSummary = await usingElapsedTime(async () => {\n await generateTypesFromOpenAPI({\n input: cliArguments.input,\n output: cliArguments.output,\n serviceName: cliArguments.serviceName,\n includeComments: cliArguments.comments,\n prune: cliArguments.prune,\n filters: cliArguments.filter,\n filterFile: cliArguments.filterFile,\n });\n });\n\n const outputFilePath = cliArguments.output;\n\n const successMessage =\n `${color.green(color.bold('✔'))} Generated ` +\n `${outputFilePath ? color.green(outputFilePath) : `to ${color.yellow('stdout')}`} ${color.dim(\n `(${formatElapsedTime(executionSummary.elapsedTime)})`,\n )}`;\n\n const hasWrittenToStdout = outputFilePath === undefined;\n logger[hasWrittenToStdout ? 'warn' : 'info'](successMessage);\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/utils/time.ts","../src/cli/cli.ts","../src/cli/index.ts"],"names":["yargs"],"mappings":"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","file":"cli.mjs","sourcesContent":["{\n \"name\": \"@zimic/http\",\n \"description\": \"Next-gen TypeScript-first HTTP utilities\",\n \"keywords\": [\n \"zimic\",\n \"typescript\",\n \"types\",\n \"typegen\",\n \"validation\",\n \"inference\",\n \"http\",\n \"api\",\n \"static\"\n ],\n \"version\": \"1.2.2-canary.1\",\n \"homepage\": \"https://zimic.dev/docs/http\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zimicjs/zimic.git\",\n \"directory\": \"packages/zimic-http\"\n },\n \"author\": {\n \"name\": \"Diego Aquino\",\n \"url\": \"https://github.com/diego-aquino\"\n },\n \"funding\": {\n \"type\": \"github\",\n \"url\": \"https://github.com/sponsors/zimicjs\"\n },\n \"private\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"license\": \"MIT\",\n \"files\": [\n \"package.json\",\n \"README.md\",\n \"LICENSE.md\",\n \"src\",\n \"!src/**/tests\",\n \"!src/**/__tests__\",\n \"!src/**/*.test.ts\",\n \"dist\",\n \"index.d.ts\",\n \"typegen.d.ts\"\n ],\n \"sideEffects\": false,\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"index.d.ts\",\n \"bin\": {\n \"zimic-http\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./typegen\": {\n \"types\": \"./typegen.d.ts\",\n \"import\": \"./dist/typegen.mjs\",\n \"require\": \"./dist/typegen.js\",\n \"default\": \"./dist/typegen.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"cli\": \"node --enable-source-maps ./dist/cli.js\",\n \"build\": \"tsup\",\n \"lint\": \"eslint --cache --no-error-on-unmatched-pattern --no-warn-ignored --fix\",\n \"lint:turbo\": \"pnpm lint . --max-warnings 0\",\n \"style\": \"prettier --log-level warn --ignore-unknown --no-error-on-unmatched-pattern --cache\",\n \"style:check\": \"pnpm style --check\",\n \"style:format\": \"pnpm style --write\",\n \"test\": \"dotenv -v NODE_ENV=test -v FORCE_COLOR=1 -- vitest\",\n \"test:turbo\": \"dotenv -v CI=true -- pnpm run test run --coverage\",\n \"types:check\": \"tsc --noEmit\",\n \"typegen:fixtures\": \"tsx ./scripts/typegen/generateFixtureTypes.ts\",\n \"deps:setup-playwright\": \"playwright install chromium\",\n \"deps:setup\": \"pnpm deps:setup-playwright\"\n },\n \"dependencies\": {\n \"openapi-typescript\": \"7.10.1\",\n \"picocolors\": \"^1.1.1\",\n \"yargs\": \"18.0.0\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^24.7.2\",\n \"@types/yargs\": \"^17.0.33\",\n \"@vitest/browser\": \"^3.2.4\",\n \"@vitest/coverage-istanbul\": \"^3.2.4\",\n \"@zimic/eslint-config-node\": \"workspace:*\",\n \"@zimic/interceptor\": \"workspace:*\",\n \"@zimic/lint-staged-config\": \"workspace:*\",\n \"@zimic/tsconfig\": \"workspace:*\",\n \"@zimic/utils\": \"workspace:*\",\n \"dotenv-cli\": \"^10.0.0\",\n \"eslint\": \"^9.37.0\",\n \"execa\": \"9.6.0\",\n \"js-yaml\": \"^4.1.0\",\n \"playwright\": \"^1.56.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"typescript\": \">=5.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"typescript\": {\n \"optional\": true\n }\n }\n}\n","import { PossiblePromise } from '@zimic/utils/types';\n\nexport async function usingElapsedTime<ReturnType>(callback: () => PossiblePromise<ReturnType>) {\n const startTimeInMilliseconds = performance.now();\n\n const result = await callback();\n\n const endTimeInMilliseconds = performance.now();\n const elapsedTimeInMilliseconds = endTimeInMilliseconds - startTimeInMilliseconds;\n\n return {\n startTime: startTimeInMilliseconds,\n elapsedTime: elapsedTimeInMilliseconds,\n endTime: endTimeInMilliseconds,\n result,\n };\n}\n\nexport function formatElapsedTime(elapsedTimeInMilliseconds: number) {\n if (elapsedTimeInMilliseconds < 1000) {\n return `${elapsedTimeInMilliseconds.toFixed(0)}ms`;\n } else {\n return `${(elapsedTimeInMilliseconds / 1000).toFixed(2)}s`;\n }\n}\n","import color from 'picocolors';\nimport yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport { version } from '@@/package.json';\n\nimport { generateTypesFromOpenAPI } from '@/typegen';\nimport { logger } from '@/utils/logging';\nimport { usingElapsedTime, formatElapsedTime } from '@/utils/time';\n\nasync function runCLI() {\n await yargs(hideBin(process.argv))\n .scriptName('zimic-http')\n .version(version)\n .showHelpOnFail(false)\n .strict()\n\n .command('typegen', 'Generate types from schema sources.', (yargs) =>\n yargs.demandCommand().command(\n 'openapi <input>',\n 'Generate types from an OpenAPI schema.',\n (yargs) =>\n yargs\n .positional('input', {\n type: 'string',\n description:\n 'The path to a local OpenAPI schema file or an URL to fetch it. ' +\n 'Version 3 is supported as YAML or JSON.',\n demandOption: true,\n })\n .option('output', {\n type: 'string',\n description:\n 'The path to write the generated types to. If not provided, the types will be written to stdout.',\n alias: 'o',\n })\n .option('service-name', {\n type: 'string',\n description: 'The name of the service to use in the generated types.',\n alias: 's',\n demandOption: true,\n })\n .option('comments', {\n type: 'boolean',\n description: 'Whether to include comments in the generated types.',\n alias: 'c',\n default: true,\n })\n .option('prune', {\n type: 'boolean',\n description:\n 'Whether to remove unused operations and components from the generated types. This is useful for ' +\n 'reducing the size of the output file.',\n alias: 'p',\n default: true,\n })\n .option('filter', {\n type: 'string',\n array: true,\n description: [\n 'One or more expressions filtering which endpoints to include. Filters must follow the format `<method> ' +\n '<path>`, where:',\n '- `<method>`: one HTTP method, a list of HTTP methods separated by commas, or `*` to match any HTTP ' +\n 'method;',\n '- `<path>`: a literal path or a glob. `*` matches zero or more characters in a segment (except `/`), ' +\n 'while `**` matches zero or more characters across segments (may include `/`). For example, ' +\n '`GET /users` matches a single method and path, while `* /users` matches any method to the `/users` ' +\n 'path; `GET /users*` matches any `GET` request whose path starts with `/users`, and `GET /users/**/*` ' +\n 'matches any `GET` request to any sub-path of `/users`.',\n\n 'Negative filters can be created by prefixing the expression with `!`. For example, `!GET /users` will ' +\n 'exclude paths matching `GET /users`.',\n ].join('\\n'),\n alias: 'f',\n })\n .option('filter-file', {\n type: 'string',\n description:\n 'A path to a file containing filter expressions. One expression is expected per line and the format ' +\n 'is the same as used in a `--filter` option. Comments are prefixed with `#`. A filter file can be ' +\n 'used alongside additional `--filter` expressions.',\n alias: 'F',\n }),\n async (cliArguments) => {\n const executionSummary = await usingElapsedTime(async () => {\n await generateTypesFromOpenAPI({\n input: cliArguments.input,\n output: cliArguments.output,\n serviceName: cliArguments.serviceName,\n includeComments: cliArguments.comments,\n prune: cliArguments.prune,\n filters: cliArguments.filter,\n filterFile: cliArguments.filterFile,\n });\n });\n\n const outputFilePath = cliArguments.output;\n\n const successMessage =\n `${color.green(color.bold('✔'))} Generated ` +\n `${outputFilePath ? color.green(outputFilePath) : `to ${color.yellow('stdout')}`} ${color.dim(\n `(${formatElapsedTime(executionSummary.elapsedTime)})`,\n )}`;\n\n const hasWrittenToStdout = outputFilePath === undefined;\n logger[hasWrittenToStdout ? 'warn' : 'info'](successMessage);\n },\n ),\n )\n\n .parse();\n}\n\nexport default runCLI;\n","#!/usr/bin/env node\nimport runCLI from './cli';\n\nvoid runCLI();\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -81,7 +81,7 @@ type PickArrayProperties<Type> = {
|
|
|
81
81
|
type ArrayKey<Type> = keyof PickArrayProperties<Type>;
|
|
82
82
|
type NonArrayKey<Type> = string | number extends ArrayKey<Type> ? keyof Type : Exclude<keyof Type, ArrayKey<Type>>;
|
|
83
83
|
type NonEmptyArray<Type> = [Type, ...Type[]];
|
|
84
|
-
type
|
|
84
|
+
type Replace<Type, Source, Target> = Type extends Source ? Target : Type;
|
|
85
85
|
declare const brand: unique symbol;
|
|
86
86
|
/**
|
|
87
87
|
* A utility type to create a branded type. This is useful for creating types that are distinct from each other even if
|
|
@@ -172,27 +172,27 @@ declare class HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFo
|
|
|
172
172
|
append<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name, value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>): void;
|
|
173
173
|
append<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name, blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>, fileName?: string): void;
|
|
174
174
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataget `formData.get()` API reference} */
|
|
175
|
-
get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(name: Name):
|
|
175
|
+
get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(name: Name): Replace<Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File>;
|
|
176
176
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatagetall `formData.getAll()` API reference} */
|
|
177
|
-
getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(name: Name):
|
|
177
|
+
getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(name: Name): Replace<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[];
|
|
178
178
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatahas `formData.has()` API reference} */
|
|
179
179
|
has<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): boolean;
|
|
180
180
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatadelete `formData.delete()` API reference} */
|
|
181
181
|
delete<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): void;
|
|
182
182
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataforEach `formData.forEach()` API reference} */
|
|
183
|
-
forEach<This extends HttpFormData<this['_schema']>>(callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(value:
|
|
183
|
+
forEach<This extends HttpFormData<this['_schema']>>(callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(value: Replace<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>, key: Key, formData: HttpFormData<this['_schema']>) => void, thisArg?: This): void;
|
|
184
184
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatakeys `formData.keys()` API reference} */
|
|
185
185
|
keys(): FormDataIterator<HttpFormDataSchemaName<this['_schema']>>;
|
|
186
186
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatavalues `formData.values()` API reference} */
|
|
187
|
-
values(): FormDataIterator<
|
|
187
|
+
values(): FormDataIterator<Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>>;
|
|
188
188
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataentries `formData.entries()` API reference} */
|
|
189
189
|
entries(): FormDataIterator<[
|
|
190
190
|
HttpFormDataSchemaName<this['_schema']>,
|
|
191
|
-
|
|
191
|
+
Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
|
|
192
192
|
]>;
|
|
193
193
|
[Symbol.iterator](): FormDataIterator<[
|
|
194
194
|
HttpFormDataSchemaName<this['_schema']>,
|
|
195
|
-
|
|
195
|
+
Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
|
|
196
196
|
]>;
|
|
197
197
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataequals `formData.equals()` API reference} */
|
|
198
198
|
equals<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean>;
|
|
@@ -292,7 +292,7 @@ declare class HttpHeaders<LooseSchema extends HttpHeadersSchema.Loose = HttpHead
|
|
|
292
292
|
/** @see {@link https://zimic.dev/docs/http/api/http-headers#headersappend `headers.append()` API reference} */
|
|
293
293
|
append<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void;
|
|
294
294
|
/** @see {@link https://zimic.dev/docs/http/api/http-headers#headersget `headers.get()` API reference} */
|
|
295
|
-
get<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name):
|
|
295
|
+
get<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): Replace<this['_schema'][Name], undefined, null>;
|
|
296
296
|
/** @see {@link https://zimic.dev/docs/http/api/http-headers#headersgetSetCookie `headers.getSetCookie()` API reference} */
|
|
297
297
|
getSetCookie(): NonNullable<Default<this['_schema']['Set-Cookie'], string>>[];
|
|
298
298
|
/** @see {@link https://zimic.dev/docs/http/api/http-headers#headershas `headers.has()` API reference} */
|
|
@@ -410,7 +410,7 @@ declare class HttpSearchParams<LooseSchema extends HttpSearchParamsSchema.Loose
|
|
|
410
410
|
/** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsappend `searchParams.append()` API reference} */
|
|
411
411
|
append<Name extends HttpSearchParamsSchemaName<this['_schema']>>(name: Name, value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>): void;
|
|
412
412
|
/** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsget `searchParams.get()` API reference} */
|
|
413
|
-
get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(name: Name):
|
|
413
|
+
get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(name: Name): Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>;
|
|
414
414
|
/** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsgetall `searchParams.getAll()` API reference} */
|
|
415
415
|
getAll<Name extends HttpSearchParamsSchemaName.Array<this['_schema']>>(name: Name): ArrayItemIfArray<NonNullable<this['_schema'][Name]>>[];
|
|
416
416
|
/** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamshas `searchParams.has()` API reference} */
|
|
@@ -623,7 +623,7 @@ type MergeHttpResponsesByStatusCode<Schemas extends HttpResponseSchemaByStatusCo
|
|
|
623
623
|
type HttpBody = JSONValue | HttpFormData<any> | HttpSearchParams<any> | Blob | ArrayBuffer | ReadableStream;
|
|
624
624
|
declare namespace HttpBody {
|
|
625
625
|
/** A loose version of the HTTP body type. JSON values are not strictly typed. */
|
|
626
|
-
type Loose =
|
|
626
|
+
type Loose = Replace<HttpBody, JSONValue, JSONValue.Loose>;
|
|
627
627
|
}
|
|
628
628
|
/**
|
|
629
629
|
* An HTTP headers object with a strictly-typed schema. Fully compatible with the built-in
|
|
@@ -647,8 +647,8 @@ type StrictFormData<Schema extends HttpFormDataSchema.Loose = HttpFormDataSchema
|
|
|
647
647
|
interface HttpRequest<StrictBody extends HttpBody.Loose = HttpBody.Loose, StrictHeadersSchema extends HttpHeadersSchema.Loose = HttpHeadersSchema.Loose> extends Request {
|
|
648
648
|
headers: StrictHeaders<StrictHeadersSchema>;
|
|
649
649
|
text: () => Promise<StrictBody extends string ? StrictBody : string>;
|
|
650
|
-
json: () => Promise<StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : StrictBody
|
|
651
|
-
formData: () => Promise<StrictBody extends HttpFormData<infer HttpFormDataSchema> ? StrictFormData<HttpFormDataSchema> : StrictBody extends HttpSearchParams<infer HttpSearchParamsSchema> ? StrictFormData<HttpSearchParamsSchema> : FormData>;
|
|
650
|
+
json: () => Promise<StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : Replace<StrictBody, null | undefined, never>>;
|
|
651
|
+
formData: () => Promise<StrictBody extends HttpFormData<infer HttpFormDataSchema> ? StrictFormData<HttpFormDataSchema> : StrictBody extends HttpSearchParams<infer HttpSearchParamsSchema> ? StrictFormData<HttpSearchParamsSchema> : StrictBody extends null | undefined ? never : FormData>;
|
|
652
652
|
clone: () => this;
|
|
653
653
|
}
|
|
654
654
|
/**
|
|
@@ -660,8 +660,8 @@ interface HttpResponse<StrictBody extends HttpBody.Loose = HttpBody.Loose, Stric
|
|
|
660
660
|
status: StatusCode;
|
|
661
661
|
headers: StrictHeaders<StrictHeadersSchema>;
|
|
662
662
|
text: () => Promise<StrictBody extends string ? StrictBody : string>;
|
|
663
|
-
json: () => Promise<StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : StrictBody
|
|
664
|
-
formData: () => Promise<StrictBody extends HttpFormData<infer HttpFormDataSchema> ? StrictFormData<HttpFormDataSchema> : StrictBody extends HttpSearchParams<infer HttpSearchParamsSchema> ? StrictFormData<HttpSearchParamsSchema> : FormData>;
|
|
663
|
+
json: () => Promise<StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : Replace<StrictBody, null | undefined, never>>;
|
|
664
|
+
formData: () => Promise<StrictBody extends HttpFormData<infer HttpFormDataSchema> ? StrictFormData<HttpFormDataSchema> : StrictBody extends HttpSearchParams<infer HttpSearchParamsSchema> ? StrictFormData<HttpSearchParamsSchema> : StrictBody extends null | undefined ? never : FormData>;
|
|
665
665
|
clone: () => this;
|
|
666
666
|
}
|
|
667
667
|
type HttpRequestHeadersSchemaFromBody<RequestSchema extends HttpRequestSchema, DefaultHeadersSchema> = 'body' extends keyof RequestSchema ? [RequestSchema['body']] extends [never] ? DefaultHeadersSchema : [Extract<RequestSchema['body'], BodyInit | HttpFormData | HttpSearchParams>] extends [never] ? 'headers' extends keyof RequestSchema ? [RequestSchema['headers']] extends [never] ? DefaultHeadersSchema : 'content-type' extends keyof Default<RequestSchema['headers']> ? DefaultHeadersSchema : {
|
|
@@ -671,14 +671,14 @@ type HttpRequestHeadersSchemaFromBody<RequestSchema extends HttpRequestSchema, D
|
|
|
671
671
|
} : DefaultHeadersSchema : DefaultHeadersSchema;
|
|
672
672
|
type HttpRequestHeadersSchema<MethodSchema extends HttpMethodSchema> = 'headers' extends keyof MethodSchema['request'] ? [MethodSchema['request']['headers']] extends [never] ? HttpRequestHeadersSchemaFromBody<Default<MethodSchema['request']>, never> : (MethodSchema['request']['headers'] & HttpRequestHeadersSchemaFromBody<Default<MethodSchema['request']>, {}>) | Extract<MethodSchema['request']['headers'], undefined> : HttpRequestHeadersSchemaFromBody<Default<MethodSchema['request']>, never>;
|
|
673
673
|
type HttpRequestSearchParamsSchema<MethodSchema extends HttpMethodSchema> = 'searchParams' extends keyof MethodSchema['request'] ? Default<MethodSchema['request']>['searchParams'] : never;
|
|
674
|
-
type HttpRequestBodySchema<MethodSchema extends HttpMethodSchema> =
|
|
674
|
+
type HttpRequestBodySchema<MethodSchema extends HttpMethodSchema> = Replace<IfNever<DefaultNoExclude<Default<MethodSchema['request']>['body']>, null>, undefined, null>;
|
|
675
675
|
type HttpResponseHeadersSchemaFromBody<ResponseSchema extends HttpResponseSchema, DefaultHeadersSchema> = 'body' extends keyof ResponseSchema ? [ResponseSchema['body']] extends [never] ? DefaultHeadersSchema : [Extract<ResponseSchema['body'], BodyInit | HttpSearchParams | HttpFormData>] extends [never] ? 'headers' extends keyof ResponseSchema ? [ResponseSchema['headers']] extends [never] ? DefaultHeadersSchema : 'content-type' extends keyof Default<ResponseSchema['headers']> ? DefaultHeadersSchema : {
|
|
676
676
|
'content-type': 'application/json';
|
|
677
677
|
} : {
|
|
678
678
|
'content-type': 'application/json';
|
|
679
679
|
} : DefaultHeadersSchema : DefaultHeadersSchema;
|
|
680
680
|
type HttpResponseHeadersSchema<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode> = 'headers' extends keyof Default<MethodSchema['response']>[StatusCode] ? [Default<MethodSchema['response']>[StatusCode]] extends [never] ? HttpResponseHeadersSchemaFromBody<Default<Default<MethodSchema['response']>[StatusCode]>, never> : (Default<Default<MethodSchema['response']>[StatusCode]>['headers'] & HttpResponseHeadersSchemaFromBody<Default<Default<MethodSchema['response']>[StatusCode]>, {}>) | Extract<Default<Default<MethodSchema['response']>[StatusCode]>['headers'], undefined> : HttpResponseHeadersSchemaFromBody<Default<Default<MethodSchema['response']>[StatusCode]>, never>;
|
|
681
|
-
type HttpResponseBodySchema<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode> =
|
|
681
|
+
type HttpResponseBodySchema<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode> = Replace<IfNever<DefaultNoExclude<Default<Default<MethodSchema['response']>[StatusCode]>['body']>, null>, undefined, null>;
|
|
682
682
|
|
|
683
683
|
/**
|
|
684
684
|
* Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../zimic-utils/src/data/blobEquals.ts","../../zimic-utils/src/data/fileEquals.ts","../src/formData/HttpFormData.ts","../src/headers/HttpHeaders.ts","../src/searchParams/HttpSearchParams.ts","../src/types/schema.ts","../src/utils/bodies.ts"],"names":["pickPrimitiveProperties"],"mappings":"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","file":"index.js","sourcesContent":["async function blobEquals(blob: Blob, otherBlob: Blob) {\n if (blob.type !== otherBlob.type || blob.size !== otherBlob.size) {\n return false;\n }\n\n const reader = blob.stream().getReader();\n const otherReader = otherBlob.stream().getReader();\n\n let buffer: Uint8Array = new Uint8Array(0);\n let otherBuffer: Uint8Array = new Uint8Array(0);\n\n try {\n while (true) {\n const bufferReadPromises: Promise<void>[] = [];\n\n if (buffer.length === 0) {\n bufferReadPromises.push(\n reader.read().then((result) => {\n if (!result.done) {\n buffer = result.value;\n }\n }),\n );\n }\n\n if (otherBuffer.length === 0) {\n bufferReadPromises.push(\n otherReader.read().then((result) => {\n if (!result.done) {\n otherBuffer = result.value;\n }\n }),\n );\n }\n\n await Promise.all(bufferReadPromises);\n\n const haveStreamsEndedTogether = buffer.length === 0 && otherBuffer.length === 0;\n\n if (haveStreamsEndedTogether) {\n return true;\n }\n\n const hasOneStreamEndedBeforeTheOther =\n (buffer.length === 0 && otherBuffer.length > 0) || (buffer.length > 0 && otherBuffer.length === 0);\n\n if (hasOneStreamEndedBeforeTheOther) {\n return false;\n }\n\n const minimumByteLength = Math.min(buffer.length, otherBuffer.length);\n\n for (let byteIndex = 0; byteIndex < minimumByteLength; byteIndex++) {\n if (buffer[byteIndex] !== otherBuffer[byteIndex]) {\n return false;\n }\n }\n\n buffer = buffer.slice(minimumByteLength);\n otherBuffer = otherBuffer.slice(minimumByteLength);\n }\n } finally {\n reader.releaseLock();\n otherReader.releaseLock();\n }\n}\n\nexport default blobEquals;\n","import blobEquals from './blobEquals';\n\nasync function fileEquals(file: File, otherFile: File) {\n return file.name === otherFile.name && (await blobEquals(file, otherFile));\n}\n\nexport default fileEquals;\n","import fileEquals from '@zimic/utils/data/fileEquals';\nimport { ArrayItemIfArray, ReplaceBy } from '@zimic/utils/types';\n\nimport { HttpFormDataSchema, HttpFormDataSchemaName, HttpFormDataSerialized } from './types';\n\n/** @see {@link https://zimic.dev/docs/http/api/http-form-data `HttpFormData` API reference} */\nclass HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSchema.Loose> extends FormData {\n readonly _schema!: HttpFormDataSerialized<LooseSchema>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataset `formData.set()` API reference} */\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.set(name, blobOrValue as Blob);\n } else {\n super.set(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataappend `formData.append()` API reference} */\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.append(name, blobOrValue as Blob);\n } else {\n super.append(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataget `formData.get()` API reference} */\n get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): ReplaceBy<ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatagetall `formData.getAll()` API reference} */\n getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(\n name: Name,\n ): ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatahas `formData.has()` API reference} */\n has<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatadelete `formData.delete()` API reference} */\n delete<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataforEach `formData.forEach()` API reference} */\n forEach<This extends HttpFormData<this['_schema']>>(\n callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(\n value: ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>,\n key: Key,\n formData: HttpFormData<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatakeys `formData.keys()` API reference} */\n keys(): FormDataIterator<HttpFormDataSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatavalues `formData.values()` API reference} */\n values(): FormDataIterator<\n ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataentries `formData.entries()` API reference} */\n entries(): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataequals `formData.equals()` API reference} */\n async equals<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n if (!(await this.contains(otherData))) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherData, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatacontains `formData.contains()` API reference} */\n async contains<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n for (const [otherKey, otherValue] of otherData.entries()) {\n const values = super.getAll.call(this, otherKey);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherData, otherKey).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n let valueExists = false;\n\n for (const value of values) {\n if (\n value === otherValue ||\n (value instanceof Blob && (otherValue as Blob) instanceof Blob && (await fileEquals(value, otherValue)))\n ) {\n valueExists = true;\n break;\n }\n }\n\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatatoobject `formData.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpFormDataSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpFormData;\n","import { Default, ReplaceBy } from '@zimic/utils/types';\n\nimport { HttpHeadersSchema, HttpHeadersInit, HttpHeadersSchemaName, HttpHeadersSerialized } from './types';\n\nfunction pickPrimitiveProperties<LooseSchema extends HttpHeadersSchema.Loose>(schema: LooseSchema) {\n return Object.entries(schema).reduce<Record<string, string>>((accumulated, [key, value]) => {\n if (value !== undefined) {\n accumulated[key] = String(value);\n }\n return accumulated;\n }, {});\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-headers `HttpHeaders` API reference} */\nclass HttpHeaders<LooseSchema extends HttpHeadersSchema.Loose = HttpHeadersSchema.Loose> extends Headers {\n readonly _schema!: HttpHeadersSerialized<LooseSchema>;\n\n constructor(init?: HttpHeadersInit<LooseSchema>) {\n if (init instanceof Headers || Array.isArray(init) || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersset `headers.set()` API reference} */\n set<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersappend `headers.append()` API reference} */\n append<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersget `headers.get()` API reference} */\n get<Name extends HttpHeadersSchemaName<this['_schema']>>(\n name: Name,\n ): ReplaceBy<this['_schema'][Name], undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersgetSetCookie `headers.getSetCookie()` API reference} */\n getSetCookie(): NonNullable<Default<this['_schema']['Set-Cookie'], string>>[] {\n return super.getSetCookie() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headershas `headers.has()` API reference} */\n has<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersdelete `headers.delete()` API reference} */\n delete<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersforEach `headers.forEach()` API reference} */\n forEach<This extends HttpHeaders<this['_schema']>>(\n callback: <Key extends HttpHeadersSchemaName<this['_schema']>>(\n value: NonNullable<this['_schema'][Key]> & string,\n key: Key,\n headers: Headers,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: Headers) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerskeys `headers.keys()` API reference} */\n keys(): HeadersIterator<HttpHeadersSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersvalues `headers.values()` API reference} */\n values(): HeadersIterator<NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string> {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersentries `headers.entries()` API reference} */\n entries(): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersequals `headers.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n if (!this.contains(otherHeaders)) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherHeaders, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerscontains `headers.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n for (const [key, otherValue] of otherHeaders.entries()) {\n const value = super.get.call(this, key);\n\n if (value === null) {\n return false;\n }\n\n const valueItems = this.splitHeaderValues(value);\n const otherValueItems = this.splitHeaderValues(otherValue);\n\n const haveSameNumberOfValues = valueItems.length === otherValueItems.length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n for (const otherValueItem of otherValueItems) {\n if (!valueItems.includes(otherValueItem)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerstoobject `headers.toObject()` API reference} */\n toObject(): this['_schema'] {\n const object = {} as this['_schema'];\n\n for (const [key, value] of this.entries()) {\n object[key] = value;\n }\n\n return object;\n }\n\n private splitHeaderValues(value: string) {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n }\n}\n\nexport default HttpHeaders;\n","import { ReplaceBy, ArrayItemIfArray } from '@zimic/utils/types';\n\nimport {\n HttpSearchParamsSchema,\n HttpSearchParamsInit,\n HttpSearchParamsSchemaName,\n HttpSearchParamsSerialized,\n} from './types';\n\nfunction pickPrimitiveProperties<Schema extends HttpSearchParamsSchema.Loose>(schema: Schema) {\n const schemaWithPrimitiveProperties = Object.entries(schema).reduce<Record<string, string>>(\n (accumulated, [key, value]) => {\n if (value !== undefined && !Array.isArray(value)) {\n accumulated[key] = String(value);\n }\n return accumulated;\n },\n {},\n );\n return schemaWithPrimitiveProperties;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-search-params `HttpSearchParams` API reference} */\nclass HttpSearchParams<\n LooseSchema extends HttpSearchParamsSchema.Loose = HttpSearchParamsSchema.Loose,\n> extends URLSearchParams {\n readonly _schema!: HttpSearchParamsSerialized<LooseSchema>;\n\n constructor(init?: HttpSearchParamsInit<LooseSchema>) {\n if (init instanceof URLSearchParams || Array.isArray(init) || typeof init === 'string' || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n this.populateInitArrayProperties(init);\n }\n }\n\n private populateInitArrayProperties(init: LooseSchema) {\n for (const [key, value] of Object.entries(init)) {\n if (Array.isArray(value)) {\n for (const item of value as unknown[]) {\n super.append(key, String(item));\n }\n }\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsset `searchParams.set()` API reference} */\n set<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsappend `searchParams.append()` API reference} */\n append<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsget `searchParams.get()` API reference} */\n get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsgetall `searchParams.getAll()` API reference} */\n getAll<Name extends HttpSearchParamsSchemaName.Array<this['_schema']>>(\n name: Name,\n ): ArrayItemIfArray<NonNullable<this['_schema'][Name]>>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamshas `searchParams.has()` API reference} */\n has<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): boolean {\n return super.has(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsdelete `searchParams.delete()` API reference} */\n delete<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.delete(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsforEach `searchParams.forEach()` API reference} */\n forEach<This extends HttpSearchParams<this['_schema']>>(\n callback: <Key extends HttpSearchParamsSchemaName<this['_schema']>>(\n value: ArrayItemIfArray<NonNullable<this['_schema'][Key]>>,\n key: Key,\n searchParams: HttpSearchParams<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: URLSearchParams) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamskeys `searchParams.keys()` API reference} */\n keys(): URLSearchParamsIterator<HttpSearchParamsSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsvalues `searchParams.values()` API reference} */\n values(): URLSearchParamsIterator<\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsentries `searchParams.entries()` API reference} */\n entries(): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsequals `searchParams.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n return this.contains(otherParams) && this.size === otherParams.size;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamscontains `searchParams.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n for (const [key, otherValue] of otherParams.entries()) {\n const values = super.getAll.call(this, key);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherParams, key).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n const valueExists = values.includes(otherValue);\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamstoobject `searchParams.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpSearchParamsSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpSearchParams;\n","import {\n IfAny,\n UnionToIntersection,\n UnionHasMoreThanOneType,\n Prettify,\n NonEmptyArray,\n Branded,\n} from '@zimic/utils/types';\n\nimport { HttpFormDataSchema } from '../formData/types';\nimport { HttpHeadersSchema } from '../headers/types';\nimport { HttpPathParamsSchema } from '../pathParams/types';\nimport { HttpSearchParamsSchema } from '../searchParams/types';\nimport { HttpBody } from './requests';\n\nexport const HTTP_METHODS = Object.freeze(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'] as const);\n/**\n * A type representing the currently supported\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Methods `HTTP methods`}.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n\n/**\n * A schema representing the structure of an HTTP request.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpRequestSchema {\n headers?: HttpHeadersSchema.Loose;\n searchParams?: HttpSearchParamsSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * A schema representing the structure of an HTTP response.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpResponseSchema {\n headers?: HttpHeadersSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * The status codes used in HTTP responses, as defined by\n * {@link https://httpwg.org/specs/rfc9110.html#overview.of.status.codes RFC-9110}.\n *\n * - `HttpStatusCode.Information`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n * - `HttpStatusCode.Success`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n * - `HttpStatusCode.Redirection`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n * - `HttpStatusCode.ClientError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n * - `HttpStatusCode.ServerError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\nexport type HttpStatusCode =\n | HttpStatusCode.Information\n | HttpStatusCode.Success\n | HttpStatusCode.Redirection\n | HttpStatusCode.ClientError\n | HttpStatusCode.ServerError;\n\nexport namespace HttpStatusCode {\n /**\n * An HTTP status code in the `1XX` range, representing an informational response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n */\n export type Information =\n | 100 // Continue\n | 101 // Switching Protocols\n | 102 // Processing\n | 103; // Early Hints\n\n /**\n * An HTTP status code in the `2XX` range, representing a successful response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n */\n export type Success =\n | 200 // OK\n | 201 // Created\n | 202 // Accepted\n | 203 // Non-Authoritative Information\n | 204 // No Content\n | 205 // Reset Content\n | 206 // Partial Content\n | 207 // Multi-Status\n | 208 // Already Reported\n | 226; // IM Used\n\n /**\n * An HTTP status code in the `3XX` range, representing a redirection response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n */\n export type Redirection =\n | 300 // Multiple Choices\n | 301 // Moved Permanently\n | 302 // Found\n | 303 // See Other\n | 304 // Not Modified\n | 307 // Temporary Redirect\n | 308; // Permanent Redirect\n\n /**\n * An HTTP status code in the `4XX` range, representing a client error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n */\n export type ClientError =\n | 400 // Bad Request\n | 401 // Unauthorized\n | 402 // Payment Required\n | 403 // Forbidden\n | 404 // Not Found\n | 405 // Method Not Allowed\n | 406 // Not Acceptable\n | 407 // Proxy Authentication Required\n | 408 // Request Timeout\n | 409 // Conflict\n | 410 // Gone\n | 411 // Length Required\n | 412 // Precondition Failed\n | 413 // Content Too Large\n | 414 // URI Too Long\n | 415 // Unsupported Media Type\n | 416 // Range Not Satisfiable\n | 417 // Expectation Failed\n | 418 // I'm a teapot\n | 421 // Misdirected Request\n | 422 // Unprocessable Content\n | 423 // Locked\n | 424 // Failed Dependency\n | 425 // Too Early\n | 426 // Upgrade Required\n | 428 // Precondition Required\n | 429 // Too Many Requests\n | 431 // Request Header Fields Too Large\n | 451; // Unavailable For Legal Reasons\n\n /**\n * An HTTP status code in the `5XX` range, representing a server error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\n export type ServerError =\n | 500 // Internal Server Error\n | 501 // Not Implemented\n | 502 // Bad Gateway\n | 503 // Service Unavailable\n | 504 // Gateway Timeout\n | 505 // HTTP Version Not Supported\n | 506 // Variant Also Negotiates\n | 507 // Insufficient Storage\n | 508 // Loop Detected\n | 510 // Not Extended\n | 511; // Network Authentication Required\n}\n\n/**\n * A schema representing the structure of HTTP responses by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaByStatusCode = {\n [StatusCode in HttpStatusCode]?: HttpResponseSchema;\n};\n\n/**\n * Extracts the status codes used in a response schema by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaStatusCode<ResponseSchemaByStatusCode extends HttpResponseSchemaByStatusCode> =\n keyof ResponseSchemaByStatusCode & HttpStatusCode;\n\n/**\n * A schema representing the structure of an HTTP request and response for a given method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodSchema {\n request?: HttpRequestSchema;\n response?: HttpResponseSchemaByStatusCode;\n}\n\n/**\n * A schema representing the structure of HTTP request and response by method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodsSchema {\n GET?: HttpMethodSchema;\n POST?: HttpMethodSchema;\n PUT?: HttpMethodSchema;\n PATCH?: HttpMethodSchema;\n DELETE?: HttpMethodSchema;\n HEAD?: HttpMethodSchema;\n OPTIONS?: HttpMethodSchema;\n}\n\ninterface BaseHttpSchema {\n [path: string]: HttpMethodsSchema;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference} */\nexport type HttpSchema<Schema extends BaseHttpSchema = BaseHttpSchema> = Branded<Schema, 'HttpSchema'>;\n\nexport namespace HttpSchema {\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethods `HttpSchema.Methods` API reference} */\n export type Methods<Schema extends HttpMethodsSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethod `HttpSchema.Method` API reference} */\n export type Method<Schema extends HttpMethodSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemarequest `HttpSchema.Request` API reference} */\n export type Request<Schema extends HttpRequestSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponsebystatuscode `HttpSchema.ResponseByStatusCode` API reference} */\n export type ResponseByStatusCode<Schema extends HttpResponseSchemaByStatusCode> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponse `HttpSchema.Response` API reference} */\n export type Response<Schema extends HttpResponseSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemabody `HttpSchema.Body` API reference} */\n export type Body<Schema extends HttpBody.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaheaders `HttpSchema.Headers` API reference} */\n export type Headers<Schema extends HttpHeadersSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemasearchparams `HttpSchema.SearchParams` API reference} */\n export type SearchParams<Schema extends HttpSearchParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathparams `HttpSchema.PathParams` API reference} */\n export type PathParams<Schema extends HttpPathParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaformdata `HttpSchema.FormData` API reference} */\n export type FormData<Schema extends HttpFormDataSchema.Loose> = Schema;\n}\n\n/**\n * Extracts the methods from an HTTP service schema.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpSchemaMethod<Schema extends HttpSchema> = IfAny<\n Schema,\n any, // eslint-disable-line @typescript-eslint/no-explicit-any\n keyof UnionToIntersection<Schema[keyof Schema]> & HttpMethod\n>;\n\ntype RepeatingPathParamModifier = '+';\ntype OptionalPathParamModifier = '?' | '*';\n\ntype ConvertPathParamToRecord<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutModifier}${OptionalPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]?: string }\n : PathParam extends `${infer PathParamWithoutModifier}${RepeatingPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]: string }\n : { [Name in PathParam]: string };\n\ntype RecursiveInferPathParams<Path extends string> = Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<RemainingPath>\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`:${RemainingPath}`>\n : Prefix extends `${string}\\\\`\n ? {}\n : ConvertPathParamToRecord<PathParamWithRemainingPath>\n : {};\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#inferpathparams `InferPathParams` API reference} */\nexport type InferPathParams<\n PathOrSchema extends string | HttpSchema,\n OptionalPath extends PathOrSchema extends HttpSchema ? HttpSchemaPath.Literal<PathOrSchema> : never = never,\n> = Prettify<\n RecursiveInferPathParams<\n PathOrSchema extends HttpSchema ? OptionalPath : PathOrSchema extends string ? PathOrSchema : never\n >\n>;\n\ntype WithoutEscapedColons<Path extends string> = Path extends `${infer Prefix}\\\\:${infer Suffix}`\n ? WithoutEscapedColons<`${Prefix}:${Suffix}`>\n : Path;\n\ntype ConvertPathParamToString<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}/`\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}:`\n : string;\n\nexport type AllowAnyStringInPathParams<Path extends string> =\n Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}/${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}:${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}${AllowAnyStringInPathParams<`:${RemainingPath}`>}`\n : Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${PathParamWithRemainingPath}`\n : `${Prefix}${ConvertPathParamToString<PathParamWithRemainingPath>}`\n : Path;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapath `HttpSchemaPath` API reference} */\nexport namespace HttpSchemaPath {\n type LooseLiteral<Schema extends HttpSchema, Method extends HttpMethod = HttpMethod> = {\n [Path in keyof Schema & string]: Method extends keyof Schema[Path] ? Path : never;\n }[keyof Schema & string];\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathliteral `HttpSchemaPath.Literal` API reference} */\n export type Literal<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = LooseLiteral<Schema, Method>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathnonliteral `HttpSchemaPath.NonLiteral` API reference} */\n export type NonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = WithoutEscapedColons<AllowAnyStringInPathParams<LooseLiteral<Schema, Method>>>;\n}\n\nexport type HttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n> = HttpSchemaPath.Literal<Schema, Method> | HttpSchemaPath.NonLiteral<Schema, Method>;\n\ntype LargestPathPrefix<Path extends string> = Path extends `${infer Prefix}/${infer Suffix}`\n ? `${Prefix}/${Suffix extends `${string}/${string}` ? LargestPathPrefix<Suffix> : ''}`\n : Path;\n\ntype ExcludeNonLiteralPathsSupersededByLiteralPath<Path extends string> =\n Path extends `${LargestPathPrefix<Path>}:${string}` ? never : Path;\n\nexport type PreferMostStaticLiteralPath<Path extends string> =\n UnionHasMoreThanOneType<Path> extends true ? ExcludeNonLiteralPathsSupersededByLiteralPath<Path> : Path;\n\ntype RecursiveInferHttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method>,\n> =\n NonLiteralPath extends AllowAnyStringInPathParams<LiteralPath>\n ? NonLiteralPath extends `${AllowAnyStringInPathParams<LiteralPath>}/${string}`\n ? never\n : LiteralPath\n : never;\n\nexport type LiteralHttpSchemaPathFromNonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method> = HttpSchemaPath.Literal<Schema, Method>,\n> = PreferMostStaticLiteralPath<\n LiteralPath extends LiteralPath ? RecursiveInferHttpSchemaPath<Schema, Method, NonLiteralPath, LiteralPath> : never\n>;\n\ntype OmitPastHttpStatusCodes<\n Schema extends HttpResponseSchemaByStatusCode,\n PastSchemas extends HttpResponseSchemaByStatusCode[],\n> =\n PastSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? Omit<Schema, keyof UnionToIntersection<PastSchemas[number]>>\n : Schema;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#mergehttpresponsesbystatuscode `MergeHttpResponsesByStatusCode` API reference} */\nexport type MergeHttpResponsesByStatusCode<\n Schemas extends HttpResponseSchemaByStatusCode[],\n PastSchemas extends HttpResponseSchemaByStatusCode[] = [],\n> = Schemas extends [\n infer FirstSchema extends HttpResponseSchemaByStatusCode,\n ...infer RestSchemas extends HttpResponseSchemaByStatusCode[],\n]\n ? RestSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? OmitPastHttpStatusCodes<FirstSchema, PastSchemas> &\n MergeHttpResponsesByStatusCode<RestSchemas, [...PastSchemas, FirstSchema]>\n : OmitPastHttpStatusCodes<FirstSchema, PastSchemas>\n : never;\n","import HttpFormData from '@/formData/HttpFormData';\nimport HttpSearchParams from '@/searchParams/HttpSearchParams';\nimport { HttpBody } from '@/types/requests';\n\n/**\n * Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP\n * interceptors might throw this error when trying to parse the body of a request or response with the header\n * `'content-type': 'multipart/form-data'`, if the content cannot be parsed to form data.\n */\nexport class InvalidFormDataError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as form data: ${value}`);\n this.name = 'InvalidFormDataError';\n }\n}\n\n/**\n * Error thrown when a value is not valid JSON. HTTP interceptors might throw this error when trying to parse the body\n * of a request or response with the header `'content-type': 'application/json'`, if the content cannot be parsed to\n * JSON.\n */\nexport class InvalidJSONError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as JSON: ${value}`);\n this.name = 'InvalidJSONError';\n }\n}\n\nasync function parseHttpBodyAsText<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n return (bodyAsText || null) as Body;\n}\n\nasync function parseHttpBodyAsBlob<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsBlob = await resource.blob();\n return bodyAsBlob as Body;\n}\n\nasync function parseHttpBodyAsFormData<Body extends HttpBody>(resource: Request | Response) {\n const resourceClone = resource.clone();\n\n try {\n const bodyAsRawFormData = await resource.formData();\n const bodyAsFormData = new HttpFormData();\n\n for (const [key, value] of bodyAsRawFormData) {\n bodyAsFormData.append(key, value);\n }\n\n return bodyAsFormData as Body;\n } catch {\n const bodyAsText = await resourceClone.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n throw new InvalidFormDataError(bodyAsText);\n }\n}\n\nasync function parseHttpBodyAsSearchParams<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n const bodyAsSearchParams = new HttpSearchParams(bodyAsText);\n return bodyAsSearchParams as Body;\n}\n\nasync function parseHttpBodyAsJSON<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n try {\n const bodyAsJSON = JSON.parse(bodyAsText) as Body;\n return bodyAsJSON;\n } catch {\n throw new InvalidJSONError(bodyAsText);\n }\n}\n\n/**\n * Parses the body of a {@link https://developer.mozilla.org/docs/Web/API/Request request} or\n * {@link https://developer.mozilla.org/docs/Web/API/Response response} based on its `content-type` header.\n *\n * If the body is empty, `null` is returned. If the `content-type` header is not present or not recognized, an attempt\n * is made to parse the body as JSON, and if that fails, it is returned as a `Blob`.\n *\n * | `content-type` | Parsed as |\n * | ----------------------------------- | ------------------------------------------------------------------------ |\n * | `application/json` | `JSON` (object) |\n * | `application/xml` | `string` |\n * | `application/x-www-form-urlencoded` | [`HttpSearchParams`](https://zimic.dev/docs/http/api/http-search-params) |\n * | `application/*` (others) | `Blob` |\n * | `multipart/form-data` | [`HttpFormData`](https://zimic.dev/docs/http/api/http-form-data) |\n * | `multipart/*` (others) | `Blob` |\n * | `text/*` | `string` |\n * | `image/*` | `Blob` |\n * | `audio/*` | `Blob` |\n * | `font/*` | `Blob` |\n * | `video/*` | `Blob` |\n * | Others | `JSON` if possible, otherwise `Blob` |\n *\n * @throws {InvalidJSONError} If the `content-type` starts with `application/json` but the body cannot be parsed to\n * JSON.\n * @throws {InvalidFormDataError} If the `content-type` starts with `multipart/form-data` but the body cannot be parsed\n * to form data.\n */\nexport async function parseHttpBody<Body extends HttpBody = HttpBody>(resource: Request | Response) {\n const contentType = resource.headers.get('content-type');\n\n if (contentType?.startsWith('application/json')) {\n return parseHttpBodyAsJSON<Body>(resource);\n }\n\n if (contentType?.startsWith('multipart/form-data')) {\n return parseHttpBodyAsFormData<Body>(resource);\n }\n\n if (contentType?.startsWith('application/x-www-form-urlencoded')) {\n return parseHttpBodyAsSearchParams<Body>(resource);\n }\n\n if (contentType?.startsWith('text/') || contentType?.startsWith('application/xml')) {\n return parseHttpBodyAsText<Body>(resource);\n }\n\n if (\n contentType?.startsWith('application/') ||\n contentType?.startsWith('image/') ||\n contentType?.startsWith('audio/') ||\n contentType?.startsWith('font/') ||\n contentType?.startsWith('video/') ||\n contentType?.startsWith('multipart/')\n ) {\n return parseHttpBodyAsBlob<Body>(resource);\n }\n\n const resourceClone = resource.clone();\n\n try {\n return await parseHttpBodyAsJSON<Body>(resource);\n } catch {\n return parseHttpBodyAsBlob<Body>(resourceClone);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../zimic-utils/src/data/blobEquals.ts","../../zimic-utils/src/data/fileEquals.ts","../src/formData/HttpFormData.ts","../src/headers/HttpHeaders.ts","../src/searchParams/HttpSearchParams.ts","../src/types/schema.ts","../src/utils/bodies.ts"],"names":["pickPrimitiveProperties"],"mappings":";;;AAAA,eAAe,UAAA,CAAW,MAAY,SAAA,EAAiB;AACrD,EAAA,IAAI,KAAK,IAAA,KAAS,SAAA,CAAU,QAAQ,IAAA,CAAK,IAAA,KAAS,UAAU,IAAA,EAAM;AAChE,IAAA,OAAO,KAAA;AAAA;AAGT,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,EAAA,CAAS,SAAA,EAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,EAAA,CAAS,SAAA,EAAA;AAEvC,EAAA,IAAI,MAAA,GAAqB,IAAI,UAAA,CAAW,CAAC,CAAA;AACzC,EAAA,IAAI,WAAA,GAA0B,IAAI,UAAA,CAAW,CAAC,CAAA;AAE9C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,qBAAsC,EAAA;AAE5C,MAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,QAAA,kBAAA,CAAmB,IAAA;AACjB,UAAA,MAAA,CAAO,IAAA,EAAA,CAAO,IAAA,CAAK,CAAC,MAAA,KAAW;AAC7B,YAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,cAAA,MAAA,GAAS,MAAA,CAAO,KAAA;AAAA;WAEnB;AAAA,SAAA;AACH;AAGF,MAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,QAAA,kBAAA,CAAmB,IAAA;AACjB,UAAA,WAAA,CAAY,IAAA,EAAA,CAAO,IAAA,CAAK,CAAC,MAAA,KAAW;AAClC,YAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,cAAA,WAAA,GAAc,MAAA,CAAO,KAAA;AAAA;WAExB;AAAA,SAAA;AACH;AAGF,MAAA,MAAM,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAEpC,MAAA,MAAM,wBAAA,GAA2B,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,YAAY,MAAA,KAAW,CAAA;AAE/E,MAAA,IAAI,wBAAA,EAA0B;AAC5B,QAAA,OAAO,IAAA;AAAA;AAGT,MAAA,MAAM,+BAAA,GACH,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,WAAA,CAAY,MAAA,GAAS,CAAA,IAAO,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,MAAA,KAAW,CAAA;AAElG,MAAA,IAAI,+BAAA,EAAiC;AACnC,QAAA,OAAO,KAAA;AAAA;AAGT,MAAA,MAAM,oBAAoB,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,YAAY,MAAM,CAAA;AAEpE,MAAA,KAAA,IAAS,SAAA,GAAY,CAAA,EAAG,SAAA,GAAY,iBAAA,EAAmB,SAAA,EAAA,EAAa;AAClE,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,KAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AAChD,UAAA,OAAO,KAAA;AAAA;AACT;AAGF,MAAA,MAAA,GAAS,MAAA,CAAO,MAAM,iBAAiB,CAAA;AACvC,MAAA,WAAA,GAAc,WAAA,CAAY,MAAM,iBAAiB,CAAA;AAAA;GACnD,SACF;AACE,IAAA,MAAA,CAAO,WAAA,EAAA;AACP,IAAA,WAAA,CAAY,WAAA,EAAA;AAAY;AAE5B;AAEA,IAAO,kBAAA,GAAQ,UAAA;;;ACjEf,eAAe,UAAA,CAAW,MAAY,SAAA,EAAiB;AACrD,EAAA,OAAO,KAAK,IAAA,KAAS,SAAA,CAAU,QAAS,MAAM,kBAAA,CAAW,MAAM,SAAS,CAAA;AAC1E;AAEA,IAAO,kBAAA,GAAQ,UAAA;;;ACAf,IAAM,YAAA,GAAN,cAAoG,QAAA,CAAS;AAAA,EAClG,OAAA;AAAA,EAYT,GAAA,CACE,IAAA,EACA,WAAA,EACA,QAAA,EACM;AACN,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,GAAA,CAAI,MAAM,WAAmB,CAAA;AAAA,KACrC,MAAO;AACL,MAAA,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,WAAA,EAAqB,QAAQ,CAAA;AAAA;AAC/C;AACF,EAYA,MAAA,CACE,IAAA,EACA,WAAA,EACA,QAAA,EACM;AACN,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,KAAA,CAAM,MAAA,CAAO,MAAM,WAAmB,CAAA;AAAA,KACxC,MAAO;AACL,MAAA,KAAA,CAAM,MAAA,CAAO,IAAA,EAAM,WAAA,EAAqB,QAAQ,CAAA;AAAA;AAClD;AACF;AAAA,EAGA,IACE,IAAA,EACwF;AACxF,IAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA;AACvB;AAAA,EAGA,OACE,IAAA,EAC6E;AAC7E,IAAA,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA;AAC1B;AAAA,EAGA,IAA0D,IAAA,EAAqB;AAC7E,IAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA;AACvB;AAAA,EAGA,OAA6D,IAAA,EAAkB;AAC7E,IAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA;AACnB;AAAA,EAGA,OAAA,CACE,UAKA,OAAA,EACM;AACN,IAAA,KAAA,CAAM,OAAA,CAAQ,UAAgF,OAAO,CAAA;AAAA;AACvG;AAAA,EAGA,IAAA,GAAkE;AAChE,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA;AACpB;AAAA,EAGA,MAAA,GAEE;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA;AACtB;AAAA,EAGA,OAAA,GAKE;AACA,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA;AACvB,EAEA,CAAC,MAAA,CAAO,QAAQ,CAAA,GAKd;AACA,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA;AAChC;AAAA,EAGA,MAAM,OAAwC,SAAA,EAAwD;AACpG,IAAA,IAAI,CAAE,MAAM,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAI;AACrC,MAAA,OAAO,KAAA;AAAA;AAGT,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,EAAK,EAAG;AAC7B,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,WAAW,GAAG,CAAA;AACjD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,KAAA;AAAA;AACT;AAGF,IAAA,OAAO,IAAA;AAAA;AACT;AAAA,EAGA,MAAM,SAA0C,SAAA,EAAwD;AACtG,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,CAAA,IAAK,SAAA,CAAU,SAAQ,EAAG;AACxD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,MAAM,QAAQ,CAAA;AAE/C,MAAA,MAAM,sBAAA,GAAyB,OAAO,MAAA,KAAW,KAAA,CAAM,OAAO,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA,CAAE,MAAA;AACxF,MAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,QAAA,OAAO,KAAA;AAAA;AAGT,MAAA,IAAI,WAAA,GAAc,KAAA;AAElB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,IACE,KAAA,KAAU,UAAA,IACT,KAAA,YAAiB,IAAA,IAAS,UAAA,YAA+B,QAAS,MAAM,kBAAA,CAAW,KAAA,EAAO,UAAU,CAAA,EACrG;AACA,UAAA,WAAA,GAAc,IAAA;AACd,UAAA;AAAA;AACF;AAGF,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,KAAA;AAAA;AACT;AAGF,IAAA,OAAO,IAAA;AAAA;AACT;AAAA,EAGA,QAAA,GAAW;AACT,IAAA,MAAM,SAAS,EAAC;AAIhB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,CAAK,SAAQ,EAAG;AACzC,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,aAAA,GAAgB,OAAO,GAAG,CAAA;AAEhC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAqB,aAAa,CAAA,EAAG;AAC7C,UAAA,aAAA,CAAc,KAAK,KAAoB,CAAA;AAAA,SACzC,MAAO;AACL,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,aAAA,EAAe,KAAK,CAAA;AAAA;AACrC,OACF,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA;AAChB;AAGF,IAAA,OAAO,MAAA;AAAA;AAEX,CAAA;AAEA,IAAO,oBAAA,GAAQ;;;AC1Lf,SAAS,wBAAqE,MAAA,EAAqB;AACjG,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAA+B,CAAC,WAAA,EAAa,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC1F,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,WAAA,CAAY,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA;AAEjC,IAAA,OAAO,WAAA;AAAA,GACT,EAAG,EAAE,CAAA;AACP;AAGA,IAAM,WAAA,GAAN,cAAiG,OAAA,CAAQ;AAAA,EAC9F,OAAA;AAAA,EAET,YAAY,IAAA,EAAqC;AAC/C,IAAA,IAAI,gBAAgB,OAAA,IAAW,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,CAAC,IAAA,EAAM;AAC3D,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,KACZ,MAAO;AACL,MAAA,KAAA,CAAM,uBAAA,CAAwB,IAAI,CAAC,CAAA;AAAA;AACrC;AACF;AAAA,EAGA,GAAA,CAAyD,MAAY,KAAA,EAA6C;AAChH,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA;AACvB;AAAA,EAGA,MAAA,CAA4D,MAAY,KAAA,EAA6C;AACnH,IAAA,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA;AAC1B;AAAA,EAGA,IACE,IAAA,EACiD;AACjD,IAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA;AACvB;AAAA,EAGA,YAAA,GAA8E;AAC5E,IAAA,OAAO,MAAM,YAAA,EAAa;AAAA;AAC5B;AAAA,EAGA,IAAyD,IAAA,EAAqB;AAC5E,IAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA;AACvB;AAAA,EAGA,OAA4D,IAAA,EAAkB;AAC5E,IAAA,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA;AACnB;AAAA,EAGA,OAAA,CACE,UAKA,OAAA,EACM;AACN,IAAA,KAAA,CAAM,OAAA,CAAQ,UAAmE,OAAO,CAAA;AAAA;AAC1F;AAAA,EAGA,IAAA,GAAgE;AAC9D,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA;AACpB;AAAA,EAGA,MAAA,GAAyG;AACvG,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA;AACtB;AAAA,EAGA,OAAA,GAKE;AACA,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA;AACvB,EAEA,CAAC,MAAA,CAAO,QAAQ,CAAA,GAKd;AACA,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA;AAChC;AAAA,EAGA,OAAwC,YAAA,EAAiD;AACvF,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,EAAG;AAChC,MAAA,OAAO,KAAA;AAAA;AAGT,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,EAAK,EAAG;AAC7B,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,cAAc,GAAG,CAAA;AACpD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,KAAA;AAAA;AACT;AAGF,IAAA,OAAO,IAAA;AAAA;AACT;AAAA,EAGA,SAA0C,YAAA,EAAiD;AACzF,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,YAAA,CAAa,SAAQ,EAAG;AACtD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AAEtC,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAA,OAAO,KAAA;AAAA;AAGT,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AAC/C,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA;AAEzD,MAAA,MAAM,sBAAA,GAAyB,UAAA,CAAW,MAAA,KAAW,eAAA,CAAgB,MAAA;AACrE,MAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,QAAA,OAAO,KAAA;AAAA;AAGT,MAAA,KAAA,MAAW,kBAAkB,eAAA,EAAiB;AAC5C,QAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,cAAc,CAAA,EAAG;AACxC,UAAA,OAAO,KAAA;AAAA;AACT;AACF;AAGF,IAAA,OAAO,IAAA;AAAA;AACT;AAAA,EAGA,QAAA,GAA4B;AAC1B,IAAA,MAAM,SAAS,EAAC;AAEhB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,CAAK,SAAQ,EAAG;AACzC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA;AAGhB,IAAA,OAAO,MAAA;AAAA;AACT,EAEQ,kBAAkB,KAAA,EAAe;AACvC,IAAA,OAAO,MACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,EACzB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA;AAEvC,CAAA;AAEA,IAAO,mBAAA,GAAQ;;;ACvJf,SAASA,yBAAqE,MAAA,EAAgB;AAC5F,EAAA,MAAM,6BAAA,GAAgC,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA;AAAA,IAC3D,CAAC,WAAA,EAAa,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC7B,MAAA,IAAI,UAAU,MAAA,IAAa,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,WAAA,CAAY,GAAG,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA;AAEjC,MAAA,OAAO,WAAA;AAAA,KACT;AAAA,IACA;AAAC,GACH;AACA,EAAA,OAAO,6BAAA;AACT;AAGA,IAAM,gBAAA,GAAN,cAEU,eAAA,CAAgB;AAAA,EACf,OAAA;AAAA,EAET,YAAY,IAAA,EAA0C;AACpD,IAAA,IAAI,IAAA,YAAgB,eAAA,IAAmB,KAAA,CAAM,OAAA,CAAQ,IAAI,KAAK,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,EAAM;AAC/F,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,KACZ,MAAO;AACL,MAAA,KAAA,CAAMA,wBAAAA,CAAwB,IAAI,CAAC,CAAA;AACnC,MAAA,IAAA,CAAK,4BAA4B,IAAI,CAAA;AAAA;AACvC;AACF,EAEQ,4BAA4B,IAAA,EAAmB;AACrD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAoB;AACrC,UAAA,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA;AAChC;AACF;AACF;AACF;AAAA,EAGA,GAAA,CACE,MACA,KAAA,EACM;AACN,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AAAA;AACvB;AAAA,EAGA,MAAA,CACE,MACA,KAAA,EACM;AACN,IAAA,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA;AAC1B;AAAA,EAGA,IACE,IAAA,EACmE;AACnE,IAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AAAA;AACvB;AAAA,EAGA,OACE,IAAA,EACwD;AACxD,IAAA,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA;AAC1B;AAAA,EAGA,GAAA,CACE,MACA,KAAA,EACS;AACT,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA;AAC9B;AAAA,EAGA,MAAA,CACE,MACA,KAAA,EACM;AACN,IAAA,KAAA,CAAM,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA;AAC1B;AAAA,EAGA,OAAA,CACE,UAKA,OAAA,EACM;AACN,IAAA,KAAA,CAAM,OAAA,CAAQ,UAA2E,OAAO,CAAA;AAAA;AAClG;AAAA,EAGA,IAAA,GAA6E;AAC3E,IAAA,OAAO,MAAM,IAAA,EAAK;AAAA;AACpB;AAAA,EAGA,MAAA,GAEE;AACA,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA;AACtB;AAAA,EAGA,OAAA,GAKE;AACA,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA;AACvB,EAEA,CAAC,MAAA,CAAO,QAAQ,CAAA,GAKd;AACA,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA;AAChC;AAAA,EAGA,OAAwC,WAAA,EAAqD;AAC3F,IAAA,OAAO,KAAK,QAAA,CAAS,WAAW,CAAA,IAAK,IAAA,CAAK,SAAS,WAAA,CAAY,IAAA;AAAA;AACjE;AAAA,EAGA,SAA0C,WAAA,EAAqD;AAC7F,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,UAAU,CAAA,IAAK,WAAA,CAAY,SAAQ,EAAG;AACrD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAE1C,MAAA,MAAM,sBAAA,GAAyB,OAAO,MAAA,KAAW,KAAA,CAAM,OAAO,IAAA,CAAK,WAAA,EAAa,GAAG,CAAA,CAAE,MAAA;AACrF,MAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,QAAA,OAAO,KAAA;AAAA;AAGT,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,KAAA;AAAA;AACT;AAGF,IAAA,OAAO,IAAA;AAAA;AACT;AAAA,EAGA,QAAA,GAAW;AACT,IAAA,MAAM,SAAS,EAAC;AAIhB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,CAAK,SAAQ,EAAG;AACzC,MAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,QAAA,MAAM,aAAA,GAAgB,OAAO,GAAG,CAAA;AAEhC,QAAA,IAAI,KAAA,CAAM,OAAA,CAAqB,aAAa,CAAA,EAAG;AAC7C,UAAA,aAAA,CAAc,KAAK,KAAoB,CAAA;AAAA,SACzC,MAAO;AACL,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,aAAA,EAAe,KAAK,CAAA;AAAA;AACrC,OACF,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA;AAChB;AAGF,IAAA,OAAO,MAAA;AAAA;AAEX,CAAA;AAEA,IAAO,wBAAA,GAAQ;;;ACzKR,IAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAU;;;ACNxG,IAAM,oBAAA,GAAN,cAAmC,WAAA,CAAY;AAAA,EACpD,YAAY,KAAA,EAAe;AACzB,IAAA,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAE,CAAA;AACpD,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA;AAEhB;AAOO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EAChD,YAAY,KAAA,EAAe;AACzB,IAAA,KAAA,CAAM,CAAA,+BAAA,EAAkC,KAAK,CAAA,CAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA;AAEhB;AAEA,eAAe,oBAA2C,QAAA,EAA8B;AACtF,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,EAAK;AACvC,EAAA,OAAQ,UAAA,IAAc,IAAA;AACxB;AAEA,eAAe,oBAA2C,QAAA,EAA8B;AACtF,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,EAAK;AACvC,EAAA,OAAO,UAAA;AACT;AAEA,eAAe,wBAA+C,QAAA,EAA8B;AAC1F,EAAA,MAAM,aAAA,GAAgB,SAAS,KAAA,EAAM;AAErC,EAAA,IAAI;AACF,IAAA,MAAM,iBAAA,GAAoB,MAAM,QAAA,CAAS,QAAA,EAAS;AAClD,IAAA,MAAM,cAAA,GAAiB,IAAI,oBAAA,EAAa;AAExC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,iBAAA,EAAmB;AAC5C,MAAA,cAAA,CAAe,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA;AAGlC,IAAA,OAAO,cAAA;AAAA,GACT,CAAA,MAAQ;AACN,IAAA,MAAM,UAAA,GAAa,MAAM,aAAA,CAAc,IAAA,EAAK;AAE5C,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,EAAG;AACtB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,IAAI,qBAAqB,UAAU,CAAA;AAAA;AAE7C;AAEA,eAAe,4BAAmD,QAAA,EAA8B;AAC9F,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,EAAK;AAEvC,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA;AAGT,EAAA,MAAM,kBAAA,GAAqB,IAAI,wBAAA,CAAiB,UAAU,CAAA;AAC1D,EAAA,OAAO,kBAAA;AACT;AAEA,eAAe,oBAA2C,QAAA,EAA8B;AACtF,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,EAAK;AAEvC,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,EAAG;AACtB,IAAA,OAAO,IAAA;AAAA;AAGT,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACxC,IAAA,OAAO,UAAA;AAAA,GACT,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,iBAAiB,UAAU,CAAA;AAAA;AAEzC;AA6BA,eAAsB,cAAgD,QAAA,EAA8B;AAClG,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAEvD,EAAA,IAAI,WAAA,EAAa,UAAA,CAAW,kBAAkB,CAAA,EAAG;AAC/C,IAAA,OAAO,oBAA0B,QAAQ,CAAA;AAAA;AAG3C,EAAA,IAAI,WAAA,EAAa,UAAA,CAAW,qBAAqB,CAAA,EAAG;AAClD,IAAA,OAAO,wBAA8B,QAAQ,CAAA;AAAA;AAG/C,EAAA,IAAI,WAAA,EAAa,UAAA,CAAW,mCAAmC,CAAA,EAAG;AAChE,IAAA,OAAO,4BAAkC,QAAQ,CAAA;AAAA;AAGnD,EAAA,IAAI,aAAa,UAAA,CAAW,OAAO,KAAK,WAAA,EAAa,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAClF,IAAA,OAAO,oBAA0B,QAAQ,CAAA;AAAA;AAG3C,EAAA,IACE,WAAA,EAAa,WAAW,cAAc,CAAA,IACtC,aAAa,UAAA,CAAW,QAAQ,CAAA,IAChC,WAAA,EAAa,UAAA,CAAW,QAAQ,KAChC,WAAA,EAAa,UAAA,CAAW,OAAO,CAAA,IAC/B,WAAA,EAAa,UAAA,CAAW,QAAQ,CAAA,IAChC,WAAA,EAAa,UAAA,CAAW,YAAY,CAAA,EACpC;AACA,IAAA,OAAO,oBAA0B,QAAQ,CAAA;AAAA;AAG3C,EAAA,MAAM,aAAA,GAAgB,SAAS,KAAA,EAAM;AAErC,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,oBAA0B,QAAQ,CAAA;AAAA,GACjD,CAAA,MAAQ;AACN,IAAA,OAAO,oBAA0B,aAAa,CAAA;AAAA;AAElD","file":"index.js","sourcesContent":["async function blobEquals(blob: Blob, otherBlob: Blob) {\n if (blob.type !== otherBlob.type || blob.size !== otherBlob.size) {\n return false;\n }\n\n const reader = blob.stream().getReader();\n const otherReader = otherBlob.stream().getReader();\n\n let buffer: Uint8Array = new Uint8Array(0);\n let otherBuffer: Uint8Array = new Uint8Array(0);\n\n try {\n while (true) {\n const bufferReadPromises: Promise<void>[] = [];\n\n if (buffer.length === 0) {\n bufferReadPromises.push(\n reader.read().then((result) => {\n if (!result.done) {\n buffer = result.value;\n }\n }),\n );\n }\n\n if (otherBuffer.length === 0) {\n bufferReadPromises.push(\n otherReader.read().then((result) => {\n if (!result.done) {\n otherBuffer = result.value;\n }\n }),\n );\n }\n\n await Promise.all(bufferReadPromises);\n\n const haveStreamsEndedTogether = buffer.length === 0 && otherBuffer.length === 0;\n\n if (haveStreamsEndedTogether) {\n return true;\n }\n\n const hasOneStreamEndedBeforeTheOther =\n (buffer.length === 0 && otherBuffer.length > 0) || (buffer.length > 0 && otherBuffer.length === 0);\n\n if (hasOneStreamEndedBeforeTheOther) {\n return false;\n }\n\n const minimumByteLength = Math.min(buffer.length, otherBuffer.length);\n\n for (let byteIndex = 0; byteIndex < minimumByteLength; byteIndex++) {\n if (buffer[byteIndex] !== otherBuffer[byteIndex]) {\n return false;\n }\n }\n\n buffer = buffer.slice(minimumByteLength);\n otherBuffer = otherBuffer.slice(minimumByteLength);\n }\n } finally {\n reader.releaseLock();\n otherReader.releaseLock();\n }\n}\n\nexport default blobEquals;\n","import blobEquals from './blobEquals';\n\nasync function fileEquals(file: File, otherFile: File) {\n return file.name === otherFile.name && (await blobEquals(file, otherFile));\n}\n\nexport default fileEquals;\n","import fileEquals from '@zimic/utils/data/fileEquals';\nimport { ArrayItemIfArray, Replace } from '@zimic/utils/types';\n\nimport { HttpFormDataSchema, HttpFormDataSchemaName, HttpFormDataSerialized } from './types';\n\n/** @see {@link https://zimic.dev/docs/http/api/http-form-data `HttpFormData` API reference} */\nclass HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSchema.Loose> extends FormData {\n readonly _schema!: HttpFormDataSerialized<LooseSchema>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataset `formData.set()` API reference} */\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.set(name, blobOrValue as Blob);\n } else {\n super.set(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataappend `formData.append()` API reference} */\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.append(name, blobOrValue as Blob);\n } else {\n super.append(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataget `formData.get()` API reference} */\n get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): Replace<Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatagetall `formData.getAll()` API reference} */\n getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(\n name: Name,\n ): Replace<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatahas `formData.has()` API reference} */\n has<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatadelete `formData.delete()` API reference} */\n delete<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataforEach `formData.forEach()` API reference} */\n forEach<This extends HttpFormData<this['_schema']>>(\n callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(\n value: Replace<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>,\n key: Key,\n formData: HttpFormData<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatakeys `formData.keys()` API reference} */\n keys(): FormDataIterator<HttpFormDataSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatavalues `formData.values()` API reference} */\n values(): FormDataIterator<\n Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataentries `formData.entries()` API reference} */\n entries(): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataequals `formData.equals()` API reference} */\n async equals<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n if (!(await this.contains(otherData))) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherData, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatacontains `formData.contains()` API reference} */\n async contains<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n for (const [otherKey, otherValue] of otherData.entries()) {\n const values = super.getAll.call(this, otherKey);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherData, otherKey).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n let valueExists = false;\n\n for (const value of values) {\n if (\n value === otherValue ||\n (value instanceof Blob && (otherValue as Blob) instanceof Blob && (await fileEquals(value, otherValue)))\n ) {\n valueExists = true;\n break;\n }\n }\n\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatatoobject `formData.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpFormDataSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpFormData;\n","import { Default, Replace } from '@zimic/utils/types';\n\nimport { HttpHeadersSchema, HttpHeadersInit, HttpHeadersSchemaName, HttpHeadersSerialized } from './types';\n\nfunction pickPrimitiveProperties<LooseSchema extends HttpHeadersSchema.Loose>(schema: LooseSchema) {\n return Object.entries(schema).reduce<Record<string, string>>((accumulated, [key, value]) => {\n if (value !== undefined) {\n accumulated[key] = String(value);\n }\n return accumulated;\n }, {});\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-headers `HttpHeaders` API reference} */\nclass HttpHeaders<LooseSchema extends HttpHeadersSchema.Loose = HttpHeadersSchema.Loose> extends Headers {\n readonly _schema!: HttpHeadersSerialized<LooseSchema>;\n\n constructor(init?: HttpHeadersInit<LooseSchema>) {\n if (init instanceof Headers || Array.isArray(init) || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersset `headers.set()` API reference} */\n set<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersappend `headers.append()` API reference} */\n append<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersget `headers.get()` API reference} */\n get<Name extends HttpHeadersSchemaName<this['_schema']>>(\n name: Name,\n ): Replace<this['_schema'][Name], undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersgetSetCookie `headers.getSetCookie()` API reference} */\n getSetCookie(): NonNullable<Default<this['_schema']['Set-Cookie'], string>>[] {\n return super.getSetCookie() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headershas `headers.has()` API reference} */\n has<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersdelete `headers.delete()` API reference} */\n delete<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersforEach `headers.forEach()` API reference} */\n forEach<This extends HttpHeaders<this['_schema']>>(\n callback: <Key extends HttpHeadersSchemaName<this['_schema']>>(\n value: NonNullable<this['_schema'][Key]> & string,\n key: Key,\n headers: Headers,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: Headers) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerskeys `headers.keys()` API reference} */\n keys(): HeadersIterator<HttpHeadersSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersvalues `headers.values()` API reference} */\n values(): HeadersIterator<NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string> {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersentries `headers.entries()` API reference} */\n entries(): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersequals `headers.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n if (!this.contains(otherHeaders)) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherHeaders, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerscontains `headers.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n for (const [key, otherValue] of otherHeaders.entries()) {\n const value = super.get.call(this, key);\n\n if (value === null) {\n return false;\n }\n\n const valueItems = this.splitHeaderValues(value);\n const otherValueItems = this.splitHeaderValues(otherValue);\n\n const haveSameNumberOfValues = valueItems.length === otherValueItems.length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n for (const otherValueItem of otherValueItems) {\n if (!valueItems.includes(otherValueItem)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerstoobject `headers.toObject()` API reference} */\n toObject(): this['_schema'] {\n const object = {} as this['_schema'];\n\n for (const [key, value] of this.entries()) {\n object[key] = value;\n }\n\n return object;\n }\n\n private splitHeaderValues(value: string) {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n }\n}\n\nexport default HttpHeaders;\n","import { Replace, ArrayItemIfArray } from '@zimic/utils/types';\n\nimport {\n HttpSearchParamsSchema,\n HttpSearchParamsInit,\n HttpSearchParamsSchemaName,\n HttpSearchParamsSerialized,\n} from './types';\n\nfunction pickPrimitiveProperties<Schema extends HttpSearchParamsSchema.Loose>(schema: Schema) {\n const schemaWithPrimitiveProperties = Object.entries(schema).reduce<Record<string, string>>(\n (accumulated, [key, value]) => {\n if (value !== undefined && !Array.isArray(value)) {\n accumulated[key] = String(value);\n }\n return accumulated;\n },\n {},\n );\n return schemaWithPrimitiveProperties;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-search-params `HttpSearchParams` API reference} */\nclass HttpSearchParams<\n LooseSchema extends HttpSearchParamsSchema.Loose = HttpSearchParamsSchema.Loose,\n> extends URLSearchParams {\n readonly _schema!: HttpSearchParamsSerialized<LooseSchema>;\n\n constructor(init?: HttpSearchParamsInit<LooseSchema>) {\n if (init instanceof URLSearchParams || Array.isArray(init) || typeof init === 'string' || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n this.populateInitArrayProperties(init);\n }\n }\n\n private populateInitArrayProperties(init: LooseSchema) {\n for (const [key, value] of Object.entries(init)) {\n if (Array.isArray(value)) {\n for (const item of value as unknown[]) {\n super.append(key, String(item));\n }\n }\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsset `searchParams.set()` API reference} */\n set<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsappend `searchParams.append()` API reference} */\n append<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsget `searchParams.get()` API reference} */\n get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsgetall `searchParams.getAll()` API reference} */\n getAll<Name extends HttpSearchParamsSchemaName.Array<this['_schema']>>(\n name: Name,\n ): ArrayItemIfArray<NonNullable<this['_schema'][Name]>>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamshas `searchParams.has()` API reference} */\n has<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): boolean {\n return super.has(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsdelete `searchParams.delete()` API reference} */\n delete<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.delete(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsforEach `searchParams.forEach()` API reference} */\n forEach<This extends HttpSearchParams<this['_schema']>>(\n callback: <Key extends HttpSearchParamsSchemaName<this['_schema']>>(\n value: ArrayItemIfArray<NonNullable<this['_schema'][Key]>>,\n key: Key,\n searchParams: HttpSearchParams<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: URLSearchParams) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamskeys `searchParams.keys()` API reference} */\n keys(): URLSearchParamsIterator<HttpSearchParamsSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsvalues `searchParams.values()` API reference} */\n values(): URLSearchParamsIterator<\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsentries `searchParams.entries()` API reference} */\n entries(): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsequals `searchParams.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n return this.contains(otherParams) && this.size === otherParams.size;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamscontains `searchParams.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n for (const [key, otherValue] of otherParams.entries()) {\n const values = super.getAll.call(this, key);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherParams, key).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n const valueExists = values.includes(otherValue);\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamstoobject `searchParams.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpSearchParamsSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpSearchParams;\n","import {\n IfAny,\n UnionToIntersection,\n UnionHasMoreThanOneType,\n Prettify,\n NonEmptyArray,\n Branded,\n} from '@zimic/utils/types';\n\nimport { HttpFormDataSchema } from '../formData/types';\nimport { HttpHeadersSchema } from '../headers/types';\nimport { HttpPathParamsSchema } from '../pathParams/types';\nimport { HttpSearchParamsSchema } from '../searchParams/types';\nimport { HttpBody } from './requests';\n\nexport const HTTP_METHODS = Object.freeze(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'] as const);\n/**\n * A type representing the currently supported\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Methods `HTTP methods`}.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n\n/**\n * A schema representing the structure of an HTTP request.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpRequestSchema {\n headers?: HttpHeadersSchema.Loose;\n searchParams?: HttpSearchParamsSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * A schema representing the structure of an HTTP response.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpResponseSchema {\n headers?: HttpHeadersSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * The status codes used in HTTP responses, as defined by\n * {@link https://httpwg.org/specs/rfc9110.html#overview.of.status.codes RFC-9110}.\n *\n * - `HttpStatusCode.Information`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n * - `HttpStatusCode.Success`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n * - `HttpStatusCode.Redirection`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n * - `HttpStatusCode.ClientError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n * - `HttpStatusCode.ServerError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\nexport type HttpStatusCode =\n | HttpStatusCode.Information\n | HttpStatusCode.Success\n | HttpStatusCode.Redirection\n | HttpStatusCode.ClientError\n | HttpStatusCode.ServerError;\n\nexport namespace HttpStatusCode {\n /**\n * An HTTP status code in the `1XX` range, representing an informational response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n */\n export type Information =\n | 100 // Continue\n | 101 // Switching Protocols\n | 102 // Processing\n | 103; // Early Hints\n\n /**\n * An HTTP status code in the `2XX` range, representing a successful response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n */\n export type Success =\n | 200 // OK\n | 201 // Created\n | 202 // Accepted\n | 203 // Non-Authoritative Information\n | 204 // No Content\n | 205 // Reset Content\n | 206 // Partial Content\n | 207 // Multi-Status\n | 208 // Already Reported\n | 226; // IM Used\n\n /**\n * An HTTP status code in the `3XX` range, representing a redirection response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n */\n export type Redirection =\n | 300 // Multiple Choices\n | 301 // Moved Permanently\n | 302 // Found\n | 303 // See Other\n | 304 // Not Modified\n | 307 // Temporary Redirect\n | 308; // Permanent Redirect\n\n /**\n * An HTTP status code in the `4XX` range, representing a client error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n */\n export type ClientError =\n | 400 // Bad Request\n | 401 // Unauthorized\n | 402 // Payment Required\n | 403 // Forbidden\n | 404 // Not Found\n | 405 // Method Not Allowed\n | 406 // Not Acceptable\n | 407 // Proxy Authentication Required\n | 408 // Request Timeout\n | 409 // Conflict\n | 410 // Gone\n | 411 // Length Required\n | 412 // Precondition Failed\n | 413 // Content Too Large\n | 414 // URI Too Long\n | 415 // Unsupported Media Type\n | 416 // Range Not Satisfiable\n | 417 // Expectation Failed\n | 418 // I'm a teapot\n | 421 // Misdirected Request\n | 422 // Unprocessable Content\n | 423 // Locked\n | 424 // Failed Dependency\n | 425 // Too Early\n | 426 // Upgrade Required\n | 428 // Precondition Required\n | 429 // Too Many Requests\n | 431 // Request Header Fields Too Large\n | 451; // Unavailable For Legal Reasons\n\n /**\n * An HTTP status code in the `5XX` range, representing a server error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\n export type ServerError =\n | 500 // Internal Server Error\n | 501 // Not Implemented\n | 502 // Bad Gateway\n | 503 // Service Unavailable\n | 504 // Gateway Timeout\n | 505 // HTTP Version Not Supported\n | 506 // Variant Also Negotiates\n | 507 // Insufficient Storage\n | 508 // Loop Detected\n | 510 // Not Extended\n | 511; // Network Authentication Required\n}\n\n/**\n * A schema representing the structure of HTTP responses by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaByStatusCode = {\n [StatusCode in HttpStatusCode]?: HttpResponseSchema;\n};\n\n/**\n * Extracts the status codes used in a response schema by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaStatusCode<ResponseSchemaByStatusCode extends HttpResponseSchemaByStatusCode> =\n keyof ResponseSchemaByStatusCode & HttpStatusCode;\n\n/**\n * A schema representing the structure of an HTTP request and response for a given method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodSchema {\n request?: HttpRequestSchema;\n response?: HttpResponseSchemaByStatusCode;\n}\n\n/**\n * A schema representing the structure of HTTP request and response by method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodsSchema {\n GET?: HttpMethodSchema;\n POST?: HttpMethodSchema;\n PUT?: HttpMethodSchema;\n PATCH?: HttpMethodSchema;\n DELETE?: HttpMethodSchema;\n HEAD?: HttpMethodSchema;\n OPTIONS?: HttpMethodSchema;\n}\n\ninterface BaseHttpSchema {\n [path: string]: HttpMethodsSchema;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference} */\nexport type HttpSchema<Schema extends BaseHttpSchema = BaseHttpSchema> = Branded<Schema, 'HttpSchema'>;\n\nexport namespace HttpSchema {\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethods `HttpSchema.Methods` API reference} */\n export type Methods<Schema extends HttpMethodsSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethod `HttpSchema.Method` API reference} */\n export type Method<Schema extends HttpMethodSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemarequest `HttpSchema.Request` API reference} */\n export type Request<Schema extends HttpRequestSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponsebystatuscode `HttpSchema.ResponseByStatusCode` API reference} */\n export type ResponseByStatusCode<Schema extends HttpResponseSchemaByStatusCode> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponse `HttpSchema.Response` API reference} */\n export type Response<Schema extends HttpResponseSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemabody `HttpSchema.Body` API reference} */\n export type Body<Schema extends HttpBody.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaheaders `HttpSchema.Headers` API reference} */\n export type Headers<Schema extends HttpHeadersSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemasearchparams `HttpSchema.SearchParams` API reference} */\n export type SearchParams<Schema extends HttpSearchParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathparams `HttpSchema.PathParams` API reference} */\n export type PathParams<Schema extends HttpPathParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaformdata `HttpSchema.FormData` API reference} */\n export type FormData<Schema extends HttpFormDataSchema.Loose> = Schema;\n}\n\n/**\n * Extracts the methods from an HTTP service schema.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpSchemaMethod<Schema extends HttpSchema> = IfAny<\n Schema,\n any, // eslint-disable-line @typescript-eslint/no-explicit-any\n keyof UnionToIntersection<Schema[keyof Schema]> & HttpMethod\n>;\n\ntype RepeatingPathParamModifier = '+';\ntype OptionalPathParamModifier = '?' | '*';\n\ntype ConvertPathParamToRecord<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutModifier}${OptionalPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]?: string }\n : PathParam extends `${infer PathParamWithoutModifier}${RepeatingPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]: string }\n : { [Name in PathParam]: string };\n\ntype RecursiveInferPathParams<Path extends string> = Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<RemainingPath>\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`:${RemainingPath}`>\n : Prefix extends `${string}\\\\`\n ? {}\n : ConvertPathParamToRecord<PathParamWithRemainingPath>\n : {};\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#inferpathparams `InferPathParams` API reference} */\nexport type InferPathParams<\n PathOrSchema extends string | HttpSchema,\n OptionalPath extends PathOrSchema extends HttpSchema ? HttpSchemaPath.Literal<PathOrSchema> : never = never,\n> = Prettify<\n RecursiveInferPathParams<\n PathOrSchema extends HttpSchema ? OptionalPath : PathOrSchema extends string ? PathOrSchema : never\n >\n>;\n\ntype WithoutEscapedColons<Path extends string> = Path extends `${infer Prefix}\\\\:${infer Suffix}`\n ? WithoutEscapedColons<`${Prefix}:${Suffix}`>\n : Path;\n\ntype ConvertPathParamToString<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}/`\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}:`\n : string;\n\nexport type AllowAnyStringInPathParams<Path extends string> =\n Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}/${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}:${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}${AllowAnyStringInPathParams<`:${RemainingPath}`>}`\n : Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${PathParamWithRemainingPath}`\n : `${Prefix}${ConvertPathParamToString<PathParamWithRemainingPath>}`\n : Path;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapath `HttpSchemaPath` API reference} */\nexport namespace HttpSchemaPath {\n type LooseLiteral<Schema extends HttpSchema, Method extends HttpMethod = HttpMethod> = {\n [Path in keyof Schema & string]: Method extends keyof Schema[Path] ? Path : never;\n }[keyof Schema & string];\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathliteral `HttpSchemaPath.Literal` API reference} */\n export type Literal<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = LooseLiteral<Schema, Method>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathnonliteral `HttpSchemaPath.NonLiteral` API reference} */\n export type NonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = WithoutEscapedColons<AllowAnyStringInPathParams<LooseLiteral<Schema, Method>>>;\n}\n\nexport type HttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n> = HttpSchemaPath.Literal<Schema, Method> | HttpSchemaPath.NonLiteral<Schema, Method>;\n\ntype LargestPathPrefix<Path extends string> = Path extends `${infer Prefix}/${infer Suffix}`\n ? `${Prefix}/${Suffix extends `${string}/${string}` ? LargestPathPrefix<Suffix> : ''}`\n : Path;\n\ntype ExcludeNonLiteralPathsSupersededByLiteralPath<Path extends string> =\n Path extends `${LargestPathPrefix<Path>}:${string}` ? never : Path;\n\nexport type PreferMostStaticLiteralPath<Path extends string> =\n UnionHasMoreThanOneType<Path> extends true ? ExcludeNonLiteralPathsSupersededByLiteralPath<Path> : Path;\n\ntype RecursiveInferHttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method>,\n> =\n NonLiteralPath extends AllowAnyStringInPathParams<LiteralPath>\n ? NonLiteralPath extends `${AllowAnyStringInPathParams<LiteralPath>}/${string}`\n ? never\n : LiteralPath\n : never;\n\nexport type LiteralHttpSchemaPathFromNonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method> = HttpSchemaPath.Literal<Schema, Method>,\n> = PreferMostStaticLiteralPath<\n LiteralPath extends LiteralPath ? RecursiveInferHttpSchemaPath<Schema, Method, NonLiteralPath, LiteralPath> : never\n>;\n\ntype OmitPastHttpStatusCodes<\n Schema extends HttpResponseSchemaByStatusCode,\n PastSchemas extends HttpResponseSchemaByStatusCode[],\n> =\n PastSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? Omit<Schema, keyof UnionToIntersection<PastSchemas[number]>>\n : Schema;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#mergehttpresponsesbystatuscode `MergeHttpResponsesByStatusCode` API reference} */\nexport type MergeHttpResponsesByStatusCode<\n Schemas extends HttpResponseSchemaByStatusCode[],\n PastSchemas extends HttpResponseSchemaByStatusCode[] = [],\n> = Schemas extends [\n infer FirstSchema extends HttpResponseSchemaByStatusCode,\n ...infer RestSchemas extends HttpResponseSchemaByStatusCode[],\n]\n ? RestSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? OmitPastHttpStatusCodes<FirstSchema, PastSchemas> &\n MergeHttpResponsesByStatusCode<RestSchemas, [...PastSchemas, FirstSchema]>\n : OmitPastHttpStatusCodes<FirstSchema, PastSchemas>\n : never;\n","import HttpFormData from '@/formData/HttpFormData';\nimport HttpSearchParams from '@/searchParams/HttpSearchParams';\nimport { HttpBody } from '@/types/requests';\n\n/**\n * Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP\n * interceptors might throw this error when trying to parse the body of a request or response with the header\n * `'content-type': 'multipart/form-data'`, if the content cannot be parsed to form data.\n */\nexport class InvalidFormDataError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as form data: ${value}`);\n this.name = 'InvalidFormDataError';\n }\n}\n\n/**\n * Error thrown when a value is not valid JSON. HTTP interceptors might throw this error when trying to parse the body\n * of a request or response with the header `'content-type': 'application/json'`, if the content cannot be parsed to\n * JSON.\n */\nexport class InvalidJSONError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as JSON: ${value}`);\n this.name = 'InvalidJSONError';\n }\n}\n\nasync function parseHttpBodyAsText<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n return (bodyAsText || null) as Body;\n}\n\nasync function parseHttpBodyAsBlob<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsBlob = await resource.blob();\n return bodyAsBlob as Body;\n}\n\nasync function parseHttpBodyAsFormData<Body extends HttpBody>(resource: Request | Response) {\n const resourceClone = resource.clone();\n\n try {\n const bodyAsRawFormData = await resource.formData();\n const bodyAsFormData = new HttpFormData();\n\n for (const [key, value] of bodyAsRawFormData) {\n bodyAsFormData.append(key, value);\n }\n\n return bodyAsFormData as Body;\n } catch {\n const bodyAsText = await resourceClone.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n throw new InvalidFormDataError(bodyAsText);\n }\n}\n\nasync function parseHttpBodyAsSearchParams<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n const bodyAsSearchParams = new HttpSearchParams(bodyAsText);\n return bodyAsSearchParams as Body;\n}\n\nasync function parseHttpBodyAsJSON<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n try {\n const bodyAsJSON = JSON.parse(bodyAsText) as Body;\n return bodyAsJSON;\n } catch {\n throw new InvalidJSONError(bodyAsText);\n }\n}\n\n/**\n * Parses the body of a {@link https://developer.mozilla.org/docs/Web/API/Request request} or\n * {@link https://developer.mozilla.org/docs/Web/API/Response response} based on its `content-type` header.\n *\n * If the body is empty, `null` is returned. If the `content-type` header is not present or not recognized, an attempt\n * is made to parse the body as JSON, and if that fails, it is returned as a `Blob`.\n *\n * | `content-type` | Parsed as |\n * | ----------------------------------- | ------------------------------------------------------------------------ |\n * | `application/json` | `JSON` (object) |\n * | `application/xml` | `string` |\n * | `application/x-www-form-urlencoded` | [`HttpSearchParams`](https://zimic.dev/docs/http/api/http-search-params) |\n * | `application/*` (others) | `Blob` |\n * | `multipart/form-data` | [`HttpFormData`](https://zimic.dev/docs/http/api/http-form-data) |\n * | `multipart/*` (others) | `Blob` |\n * | `text/*` | `string` |\n * | `image/*` | `Blob` |\n * | `audio/*` | `Blob` |\n * | `font/*` | `Blob` |\n * | `video/*` | `Blob` |\n * | Others | `JSON` if possible, otherwise `Blob` |\n *\n * @throws {InvalidJSONError} If the `content-type` starts with `application/json` but the body cannot be parsed to\n * JSON.\n * @throws {InvalidFormDataError} If the `content-type` starts with `multipart/form-data` but the body cannot be parsed\n * to form data.\n */\nexport async function parseHttpBody<Body extends HttpBody = HttpBody>(resource: Request | Response) {\n const contentType = resource.headers.get('content-type');\n\n if (contentType?.startsWith('application/json')) {\n return parseHttpBodyAsJSON<Body>(resource);\n }\n\n if (contentType?.startsWith('multipart/form-data')) {\n return parseHttpBodyAsFormData<Body>(resource);\n }\n\n if (contentType?.startsWith('application/x-www-form-urlencoded')) {\n return parseHttpBodyAsSearchParams<Body>(resource);\n }\n\n if (contentType?.startsWith('text/') || contentType?.startsWith('application/xml')) {\n return parseHttpBodyAsText<Body>(resource);\n }\n\n if (\n contentType?.startsWith('application/') ||\n contentType?.startsWith('image/') ||\n contentType?.startsWith('audio/') ||\n contentType?.startsWith('font/') ||\n contentType?.startsWith('video/') ||\n contentType?.startsWith('multipart/')\n ) {\n return parseHttpBodyAsBlob<Body>(resource);\n }\n\n const resourceClone = resource.clone();\n\n try {\n return await parseHttpBodyAsJSON<Body>(resource);\n } catch {\n return parseHttpBodyAsBlob<Body>(resourceClone);\n }\n}\n"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../zimic-utils/src/data/blobEquals.ts","../../zimic-utils/src/data/fileEquals.ts","../src/formData/HttpFormData.ts","../src/headers/HttpHeaders.ts","../src/searchParams/HttpSearchParams.ts","../src/types/schema.ts","../src/utils/bodies.ts"],"names":["pickPrimitiveProperties"],"mappings":"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","file":"index.mjs","sourcesContent":["async function blobEquals(blob: Blob, otherBlob: Blob) {\n if (blob.type !== otherBlob.type || blob.size !== otherBlob.size) {\n return false;\n }\n\n const reader = blob.stream().getReader();\n const otherReader = otherBlob.stream().getReader();\n\n let buffer: Uint8Array = new Uint8Array(0);\n let otherBuffer: Uint8Array = new Uint8Array(0);\n\n try {\n while (true) {\n const bufferReadPromises: Promise<void>[] = [];\n\n if (buffer.length === 0) {\n bufferReadPromises.push(\n reader.read().then((result) => {\n if (!result.done) {\n buffer = result.value;\n }\n }),\n );\n }\n\n if (otherBuffer.length === 0) {\n bufferReadPromises.push(\n otherReader.read().then((result) => {\n if (!result.done) {\n otherBuffer = result.value;\n }\n }),\n );\n }\n\n await Promise.all(bufferReadPromises);\n\n const haveStreamsEndedTogether = buffer.length === 0 && otherBuffer.length === 0;\n\n if (haveStreamsEndedTogether) {\n return true;\n }\n\n const hasOneStreamEndedBeforeTheOther =\n (buffer.length === 0 && otherBuffer.length > 0) || (buffer.length > 0 && otherBuffer.length === 0);\n\n if (hasOneStreamEndedBeforeTheOther) {\n return false;\n }\n\n const minimumByteLength = Math.min(buffer.length, otherBuffer.length);\n\n for (let byteIndex = 0; byteIndex < minimumByteLength; byteIndex++) {\n if (buffer[byteIndex] !== otherBuffer[byteIndex]) {\n return false;\n }\n }\n\n buffer = buffer.slice(minimumByteLength);\n otherBuffer = otherBuffer.slice(minimumByteLength);\n }\n } finally {\n reader.releaseLock();\n otherReader.releaseLock();\n }\n}\n\nexport default blobEquals;\n","import blobEquals from './blobEquals';\n\nasync function fileEquals(file: File, otherFile: File) {\n return file.name === otherFile.name && (await blobEquals(file, otherFile));\n}\n\nexport default fileEquals;\n","import fileEquals from '@zimic/utils/data/fileEquals';\nimport { ArrayItemIfArray, ReplaceBy } from '@zimic/utils/types';\n\nimport { HttpFormDataSchema, HttpFormDataSchemaName, HttpFormDataSerialized } from './types';\n\n/** @see {@link https://zimic.dev/docs/http/api/http-form-data `HttpFormData` API reference} */\nclass HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSchema.Loose> extends FormData {\n readonly _schema!: HttpFormDataSerialized<LooseSchema>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataset `formData.set()` API reference} */\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.set(name, blobOrValue as Blob);\n } else {\n super.set(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataappend `formData.append()` API reference} */\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.append(name, blobOrValue as Blob);\n } else {\n super.append(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataget `formData.get()` API reference} */\n get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): ReplaceBy<ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatagetall `formData.getAll()` API reference} */\n getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(\n name: Name,\n ): ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatahas `formData.has()` API reference} */\n has<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatadelete `formData.delete()` API reference} */\n delete<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataforEach `formData.forEach()` API reference} */\n forEach<This extends HttpFormData<this['_schema']>>(\n callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(\n value: ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>,\n key: Key,\n formData: HttpFormData<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatakeys `formData.keys()` API reference} */\n keys(): FormDataIterator<HttpFormDataSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatavalues `formData.values()` API reference} */\n values(): FormDataIterator<\n ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataentries `formData.entries()` API reference} */\n entries(): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataequals `formData.equals()` API reference} */\n async equals<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n if (!(await this.contains(otherData))) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherData, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatacontains `formData.contains()` API reference} */\n async contains<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n for (const [otherKey, otherValue] of otherData.entries()) {\n const values = super.getAll.call(this, otherKey);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherData, otherKey).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n let valueExists = false;\n\n for (const value of values) {\n if (\n value === otherValue ||\n (value instanceof Blob && (otherValue as Blob) instanceof Blob && (await fileEquals(value, otherValue)))\n ) {\n valueExists = true;\n break;\n }\n }\n\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatatoobject `formData.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpFormDataSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpFormData;\n","import { Default, ReplaceBy } from '@zimic/utils/types';\n\nimport { HttpHeadersSchema, HttpHeadersInit, HttpHeadersSchemaName, HttpHeadersSerialized } from './types';\n\nfunction pickPrimitiveProperties<LooseSchema extends HttpHeadersSchema.Loose>(schema: LooseSchema) {\n return Object.entries(schema).reduce<Record<string, string>>((accumulated, [key, value]) => {\n if (value !== undefined) {\n accumulated[key] = String(value);\n }\n return accumulated;\n }, {});\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-headers `HttpHeaders` API reference} */\nclass HttpHeaders<LooseSchema extends HttpHeadersSchema.Loose = HttpHeadersSchema.Loose> extends Headers {\n readonly _schema!: HttpHeadersSerialized<LooseSchema>;\n\n constructor(init?: HttpHeadersInit<LooseSchema>) {\n if (init instanceof Headers || Array.isArray(init) || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersset `headers.set()` API reference} */\n set<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersappend `headers.append()` API reference} */\n append<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersget `headers.get()` API reference} */\n get<Name extends HttpHeadersSchemaName<this['_schema']>>(\n name: Name,\n ): ReplaceBy<this['_schema'][Name], undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersgetSetCookie `headers.getSetCookie()` API reference} */\n getSetCookie(): NonNullable<Default<this['_schema']['Set-Cookie'], string>>[] {\n return super.getSetCookie() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headershas `headers.has()` API reference} */\n has<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersdelete `headers.delete()` API reference} */\n delete<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersforEach `headers.forEach()` API reference} */\n forEach<This extends HttpHeaders<this['_schema']>>(\n callback: <Key extends HttpHeadersSchemaName<this['_schema']>>(\n value: NonNullable<this['_schema'][Key]> & string,\n key: Key,\n headers: Headers,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: Headers) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerskeys `headers.keys()` API reference} */\n keys(): HeadersIterator<HttpHeadersSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersvalues `headers.values()` API reference} */\n values(): HeadersIterator<NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string> {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersentries `headers.entries()` API reference} */\n entries(): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersequals `headers.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n if (!this.contains(otherHeaders)) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherHeaders, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerscontains `headers.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n for (const [key, otherValue] of otherHeaders.entries()) {\n const value = super.get.call(this, key);\n\n if (value === null) {\n return false;\n }\n\n const valueItems = this.splitHeaderValues(value);\n const otherValueItems = this.splitHeaderValues(otherValue);\n\n const haveSameNumberOfValues = valueItems.length === otherValueItems.length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n for (const otherValueItem of otherValueItems) {\n if (!valueItems.includes(otherValueItem)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerstoobject `headers.toObject()` API reference} */\n toObject(): this['_schema'] {\n const object = {} as this['_schema'];\n\n for (const [key, value] of this.entries()) {\n object[key] = value;\n }\n\n return object;\n }\n\n private splitHeaderValues(value: string) {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n }\n}\n\nexport default HttpHeaders;\n","import { ReplaceBy, ArrayItemIfArray } from '@zimic/utils/types';\n\nimport {\n HttpSearchParamsSchema,\n HttpSearchParamsInit,\n HttpSearchParamsSchemaName,\n HttpSearchParamsSerialized,\n} from './types';\n\nfunction pickPrimitiveProperties<Schema extends HttpSearchParamsSchema.Loose>(schema: Schema) {\n const schemaWithPrimitiveProperties = Object.entries(schema).reduce<Record<string, string>>(\n (accumulated, [key, value]) => {\n if (value !== undefined && !Array.isArray(value)) {\n accumulated[key] = String(value);\n }\n return accumulated;\n },\n {},\n );\n return schemaWithPrimitiveProperties;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-search-params `HttpSearchParams` API reference} */\nclass HttpSearchParams<\n LooseSchema extends HttpSearchParamsSchema.Loose = HttpSearchParamsSchema.Loose,\n> extends URLSearchParams {\n readonly _schema!: HttpSearchParamsSerialized<LooseSchema>;\n\n constructor(init?: HttpSearchParamsInit<LooseSchema>) {\n if (init instanceof URLSearchParams || Array.isArray(init) || typeof init === 'string' || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n this.populateInitArrayProperties(init);\n }\n }\n\n private populateInitArrayProperties(init: LooseSchema) {\n for (const [key, value] of Object.entries(init)) {\n if (Array.isArray(value)) {\n for (const item of value as unknown[]) {\n super.append(key, String(item));\n }\n }\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsset `searchParams.set()` API reference} */\n set<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsappend `searchParams.append()` API reference} */\n append<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsget `searchParams.get()` API reference} */\n get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsgetall `searchParams.getAll()` API reference} */\n getAll<Name extends HttpSearchParamsSchemaName.Array<this['_schema']>>(\n name: Name,\n ): ArrayItemIfArray<NonNullable<this['_schema'][Name]>>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamshas `searchParams.has()` API reference} */\n has<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): boolean {\n return super.has(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsdelete `searchParams.delete()` API reference} */\n delete<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.delete(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsforEach `searchParams.forEach()` API reference} */\n forEach<This extends HttpSearchParams<this['_schema']>>(\n callback: <Key extends HttpSearchParamsSchemaName<this['_schema']>>(\n value: ArrayItemIfArray<NonNullable<this['_schema'][Key]>>,\n key: Key,\n searchParams: HttpSearchParams<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: URLSearchParams) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamskeys `searchParams.keys()` API reference} */\n keys(): URLSearchParamsIterator<HttpSearchParamsSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsvalues `searchParams.values()` API reference} */\n values(): URLSearchParamsIterator<\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsentries `searchParams.entries()` API reference} */\n entries(): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsequals `searchParams.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n return this.contains(otherParams) && this.size === otherParams.size;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamscontains `searchParams.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n for (const [key, otherValue] of otherParams.entries()) {\n const values = super.getAll.call(this, key);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherParams, key).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n const valueExists = values.includes(otherValue);\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamstoobject `searchParams.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpSearchParamsSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpSearchParams;\n","import {\n IfAny,\n UnionToIntersection,\n UnionHasMoreThanOneType,\n Prettify,\n NonEmptyArray,\n Branded,\n} from '@zimic/utils/types';\n\nimport { HttpFormDataSchema } from '../formData/types';\nimport { HttpHeadersSchema } from '../headers/types';\nimport { HttpPathParamsSchema } from '../pathParams/types';\nimport { HttpSearchParamsSchema } from '../searchParams/types';\nimport { HttpBody } from './requests';\n\nexport const HTTP_METHODS = Object.freeze(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'] as const);\n/**\n * A type representing the currently supported\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Methods `HTTP methods`}.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n\n/**\n * A schema representing the structure of an HTTP request.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpRequestSchema {\n headers?: HttpHeadersSchema.Loose;\n searchParams?: HttpSearchParamsSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * A schema representing the structure of an HTTP response.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpResponseSchema {\n headers?: HttpHeadersSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * The status codes used in HTTP responses, as defined by\n * {@link https://httpwg.org/specs/rfc9110.html#overview.of.status.codes RFC-9110}.\n *\n * - `HttpStatusCode.Information`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n * - `HttpStatusCode.Success`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n * - `HttpStatusCode.Redirection`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n * - `HttpStatusCode.ClientError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n * - `HttpStatusCode.ServerError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\nexport type HttpStatusCode =\n | HttpStatusCode.Information\n | HttpStatusCode.Success\n | HttpStatusCode.Redirection\n | HttpStatusCode.ClientError\n | HttpStatusCode.ServerError;\n\nexport namespace HttpStatusCode {\n /**\n * An HTTP status code in the `1XX` range, representing an informational response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n */\n export type Information =\n | 100 // Continue\n | 101 // Switching Protocols\n | 102 // Processing\n | 103; // Early Hints\n\n /**\n * An HTTP status code in the `2XX` range, representing a successful response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n */\n export type Success =\n | 200 // OK\n | 201 // Created\n | 202 // Accepted\n | 203 // Non-Authoritative Information\n | 204 // No Content\n | 205 // Reset Content\n | 206 // Partial Content\n | 207 // Multi-Status\n | 208 // Already Reported\n | 226; // IM Used\n\n /**\n * An HTTP status code in the `3XX` range, representing a redirection response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n */\n export type Redirection =\n | 300 // Multiple Choices\n | 301 // Moved Permanently\n | 302 // Found\n | 303 // See Other\n | 304 // Not Modified\n | 307 // Temporary Redirect\n | 308; // Permanent Redirect\n\n /**\n * An HTTP status code in the `4XX` range, representing a client error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n */\n export type ClientError =\n | 400 // Bad Request\n | 401 // Unauthorized\n | 402 // Payment Required\n | 403 // Forbidden\n | 404 // Not Found\n | 405 // Method Not Allowed\n | 406 // Not Acceptable\n | 407 // Proxy Authentication Required\n | 408 // Request Timeout\n | 409 // Conflict\n | 410 // Gone\n | 411 // Length Required\n | 412 // Precondition Failed\n | 413 // Content Too Large\n | 414 // URI Too Long\n | 415 // Unsupported Media Type\n | 416 // Range Not Satisfiable\n | 417 // Expectation Failed\n | 418 // I'm a teapot\n | 421 // Misdirected Request\n | 422 // Unprocessable Content\n | 423 // Locked\n | 424 // Failed Dependency\n | 425 // Too Early\n | 426 // Upgrade Required\n | 428 // Precondition Required\n | 429 // Too Many Requests\n | 431 // Request Header Fields Too Large\n | 451; // Unavailable For Legal Reasons\n\n /**\n * An HTTP status code in the `5XX` range, representing a server error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\n export type ServerError =\n | 500 // Internal Server Error\n | 501 // Not Implemented\n | 502 // Bad Gateway\n | 503 // Service Unavailable\n | 504 // Gateway Timeout\n | 505 // HTTP Version Not Supported\n | 506 // Variant Also Negotiates\n | 507 // Insufficient Storage\n | 508 // Loop Detected\n | 510 // Not Extended\n | 511; // Network Authentication Required\n}\n\n/**\n * A schema representing the structure of HTTP responses by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaByStatusCode = {\n [StatusCode in HttpStatusCode]?: HttpResponseSchema;\n};\n\n/**\n * Extracts the status codes used in a response schema by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaStatusCode<ResponseSchemaByStatusCode extends HttpResponseSchemaByStatusCode> =\n keyof ResponseSchemaByStatusCode & HttpStatusCode;\n\n/**\n * A schema representing the structure of an HTTP request and response for a given method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodSchema {\n request?: HttpRequestSchema;\n response?: HttpResponseSchemaByStatusCode;\n}\n\n/**\n * A schema representing the structure of HTTP request and response by method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodsSchema {\n GET?: HttpMethodSchema;\n POST?: HttpMethodSchema;\n PUT?: HttpMethodSchema;\n PATCH?: HttpMethodSchema;\n DELETE?: HttpMethodSchema;\n HEAD?: HttpMethodSchema;\n OPTIONS?: HttpMethodSchema;\n}\n\ninterface BaseHttpSchema {\n [path: string]: HttpMethodsSchema;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference} */\nexport type HttpSchema<Schema extends BaseHttpSchema = BaseHttpSchema> = Branded<Schema, 'HttpSchema'>;\n\nexport namespace HttpSchema {\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethods `HttpSchema.Methods` API reference} */\n export type Methods<Schema extends HttpMethodsSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethod `HttpSchema.Method` API reference} */\n export type Method<Schema extends HttpMethodSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemarequest `HttpSchema.Request` API reference} */\n export type Request<Schema extends HttpRequestSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponsebystatuscode `HttpSchema.ResponseByStatusCode` API reference} */\n export type ResponseByStatusCode<Schema extends HttpResponseSchemaByStatusCode> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponse `HttpSchema.Response` API reference} */\n export type Response<Schema extends HttpResponseSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemabody `HttpSchema.Body` API reference} */\n export type Body<Schema extends HttpBody.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaheaders `HttpSchema.Headers` API reference} */\n export type Headers<Schema extends HttpHeadersSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemasearchparams `HttpSchema.SearchParams` API reference} */\n export type SearchParams<Schema extends HttpSearchParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathparams `HttpSchema.PathParams` API reference} */\n export type PathParams<Schema extends HttpPathParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaformdata `HttpSchema.FormData` API reference} */\n export type FormData<Schema extends HttpFormDataSchema.Loose> = Schema;\n}\n\n/**\n * Extracts the methods from an HTTP service schema.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpSchemaMethod<Schema extends HttpSchema> = IfAny<\n Schema,\n any, // eslint-disable-line @typescript-eslint/no-explicit-any\n keyof UnionToIntersection<Schema[keyof Schema]> & HttpMethod\n>;\n\ntype RepeatingPathParamModifier = '+';\ntype OptionalPathParamModifier = '?' | '*';\n\ntype ConvertPathParamToRecord<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutModifier}${OptionalPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]?: string }\n : PathParam extends `${infer PathParamWithoutModifier}${RepeatingPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]: string }\n : { [Name in PathParam]: string };\n\ntype RecursiveInferPathParams<Path extends string> = Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<RemainingPath>\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`:${RemainingPath}`>\n : Prefix extends `${string}\\\\`\n ? {}\n : ConvertPathParamToRecord<PathParamWithRemainingPath>\n : {};\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#inferpathparams `InferPathParams` API reference} */\nexport type InferPathParams<\n PathOrSchema extends string | HttpSchema,\n OptionalPath extends PathOrSchema extends HttpSchema ? HttpSchemaPath.Literal<PathOrSchema> : never = never,\n> = Prettify<\n RecursiveInferPathParams<\n PathOrSchema extends HttpSchema ? OptionalPath : PathOrSchema extends string ? PathOrSchema : never\n >\n>;\n\ntype WithoutEscapedColons<Path extends string> = Path extends `${infer Prefix}\\\\:${infer Suffix}`\n ? WithoutEscapedColons<`${Prefix}:${Suffix}`>\n : Path;\n\ntype ConvertPathParamToString<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}/`\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}:`\n : string;\n\nexport type AllowAnyStringInPathParams<Path extends string> =\n Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}/${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}:${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}${AllowAnyStringInPathParams<`:${RemainingPath}`>}`\n : Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${PathParamWithRemainingPath}`\n : `${Prefix}${ConvertPathParamToString<PathParamWithRemainingPath>}`\n : Path;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapath `HttpSchemaPath` API reference} */\nexport namespace HttpSchemaPath {\n type LooseLiteral<Schema extends HttpSchema, Method extends HttpMethod = HttpMethod> = {\n [Path in keyof Schema & string]: Method extends keyof Schema[Path] ? Path : never;\n }[keyof Schema & string];\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathliteral `HttpSchemaPath.Literal` API reference} */\n export type Literal<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = LooseLiteral<Schema, Method>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathnonliteral `HttpSchemaPath.NonLiteral` API reference} */\n export type NonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = WithoutEscapedColons<AllowAnyStringInPathParams<LooseLiteral<Schema, Method>>>;\n}\n\nexport type HttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n> = HttpSchemaPath.Literal<Schema, Method> | HttpSchemaPath.NonLiteral<Schema, Method>;\n\ntype LargestPathPrefix<Path extends string> = Path extends `${infer Prefix}/${infer Suffix}`\n ? `${Prefix}/${Suffix extends `${string}/${string}` ? LargestPathPrefix<Suffix> : ''}`\n : Path;\n\ntype ExcludeNonLiteralPathsSupersededByLiteralPath<Path extends string> =\n Path extends `${LargestPathPrefix<Path>}:${string}` ? never : Path;\n\nexport type PreferMostStaticLiteralPath<Path extends string> =\n UnionHasMoreThanOneType<Path> extends true ? ExcludeNonLiteralPathsSupersededByLiteralPath<Path> : Path;\n\ntype RecursiveInferHttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method>,\n> =\n NonLiteralPath extends AllowAnyStringInPathParams<LiteralPath>\n ? NonLiteralPath extends `${AllowAnyStringInPathParams<LiteralPath>}/${string}`\n ? never\n : LiteralPath\n : never;\n\nexport type LiteralHttpSchemaPathFromNonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method> = HttpSchemaPath.Literal<Schema, Method>,\n> = PreferMostStaticLiteralPath<\n LiteralPath extends LiteralPath ? RecursiveInferHttpSchemaPath<Schema, Method, NonLiteralPath, LiteralPath> : never\n>;\n\ntype OmitPastHttpStatusCodes<\n Schema extends HttpResponseSchemaByStatusCode,\n PastSchemas extends HttpResponseSchemaByStatusCode[],\n> =\n PastSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? Omit<Schema, keyof UnionToIntersection<PastSchemas[number]>>\n : Schema;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#mergehttpresponsesbystatuscode `MergeHttpResponsesByStatusCode` API reference} */\nexport type MergeHttpResponsesByStatusCode<\n Schemas extends HttpResponseSchemaByStatusCode[],\n PastSchemas extends HttpResponseSchemaByStatusCode[] = [],\n> = Schemas extends [\n infer FirstSchema extends HttpResponseSchemaByStatusCode,\n ...infer RestSchemas extends HttpResponseSchemaByStatusCode[],\n]\n ? RestSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? OmitPastHttpStatusCodes<FirstSchema, PastSchemas> &\n MergeHttpResponsesByStatusCode<RestSchemas, [...PastSchemas, FirstSchema]>\n : OmitPastHttpStatusCodes<FirstSchema, PastSchemas>\n : never;\n","import HttpFormData from '@/formData/HttpFormData';\nimport HttpSearchParams from '@/searchParams/HttpSearchParams';\nimport { HttpBody } from '@/types/requests';\n\n/**\n * Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP\n * interceptors might throw this error when trying to parse the body of a request or response with the header\n * `'content-type': 'multipart/form-data'`, if the content cannot be parsed to form data.\n */\nexport class InvalidFormDataError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as form data: ${value}`);\n this.name = 'InvalidFormDataError';\n }\n}\n\n/**\n * Error thrown when a value is not valid JSON. HTTP interceptors might throw this error when trying to parse the body\n * of a request or response with the header `'content-type': 'application/json'`, if the content cannot be parsed to\n * JSON.\n */\nexport class InvalidJSONError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as JSON: ${value}`);\n this.name = 'InvalidJSONError';\n }\n}\n\nasync function parseHttpBodyAsText<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n return (bodyAsText || null) as Body;\n}\n\nasync function parseHttpBodyAsBlob<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsBlob = await resource.blob();\n return bodyAsBlob as Body;\n}\n\nasync function parseHttpBodyAsFormData<Body extends HttpBody>(resource: Request | Response) {\n const resourceClone = resource.clone();\n\n try {\n const bodyAsRawFormData = await resource.formData();\n const bodyAsFormData = new HttpFormData();\n\n for (const [key, value] of bodyAsRawFormData) {\n bodyAsFormData.append(key, value);\n }\n\n return bodyAsFormData as Body;\n } catch {\n const bodyAsText = await resourceClone.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n throw new InvalidFormDataError(bodyAsText);\n }\n}\n\nasync function parseHttpBodyAsSearchParams<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n const bodyAsSearchParams = new HttpSearchParams(bodyAsText);\n return bodyAsSearchParams as Body;\n}\n\nasync function parseHttpBodyAsJSON<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n try {\n const bodyAsJSON = JSON.parse(bodyAsText) as Body;\n return bodyAsJSON;\n } catch {\n throw new InvalidJSONError(bodyAsText);\n }\n}\n\n/**\n * Parses the body of a {@link https://developer.mozilla.org/docs/Web/API/Request request} or\n * {@link https://developer.mozilla.org/docs/Web/API/Response response} based on its `content-type` header.\n *\n * If the body is empty, `null` is returned. If the `content-type` header is not present or not recognized, an attempt\n * is made to parse the body as JSON, and if that fails, it is returned as a `Blob`.\n *\n * | `content-type` | Parsed as |\n * | ----------------------------------- | ------------------------------------------------------------------------ |\n * | `application/json` | `JSON` (object) |\n * | `application/xml` | `string` |\n * | `application/x-www-form-urlencoded` | [`HttpSearchParams`](https://zimic.dev/docs/http/api/http-search-params) |\n * | `application/*` (others) | `Blob` |\n * | `multipart/form-data` | [`HttpFormData`](https://zimic.dev/docs/http/api/http-form-data) |\n * | `multipart/*` (others) | `Blob` |\n * | `text/*` | `string` |\n * | `image/*` | `Blob` |\n * | `audio/*` | `Blob` |\n * | `font/*` | `Blob` |\n * | `video/*` | `Blob` |\n * | Others | `JSON` if possible, otherwise `Blob` |\n *\n * @throws {InvalidJSONError} If the `content-type` starts with `application/json` but the body cannot be parsed to\n * JSON.\n * @throws {InvalidFormDataError} If the `content-type` starts with `multipart/form-data` but the body cannot be parsed\n * to form data.\n */\nexport async function parseHttpBody<Body extends HttpBody = HttpBody>(resource: Request | Response) {\n const contentType = resource.headers.get('content-type');\n\n if (contentType?.startsWith('application/json')) {\n return parseHttpBodyAsJSON<Body>(resource);\n }\n\n if (contentType?.startsWith('multipart/form-data')) {\n return parseHttpBodyAsFormData<Body>(resource);\n }\n\n if (contentType?.startsWith('application/x-www-form-urlencoded')) {\n return parseHttpBodyAsSearchParams<Body>(resource);\n }\n\n if (contentType?.startsWith('text/') || contentType?.startsWith('application/xml')) {\n return parseHttpBodyAsText<Body>(resource);\n }\n\n if (\n contentType?.startsWith('application/') ||\n contentType?.startsWith('image/') ||\n contentType?.startsWith('audio/') ||\n contentType?.startsWith('font/') ||\n contentType?.startsWith('video/') ||\n contentType?.startsWith('multipart/')\n ) {\n return parseHttpBodyAsBlob<Body>(resource);\n }\n\n const resourceClone = resource.clone();\n\n try {\n return await parseHttpBodyAsJSON<Body>(resource);\n } catch {\n return parseHttpBodyAsBlob<Body>(resourceClone);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../zimic-utils/src/data/blobEquals.ts","../../zimic-utils/src/data/fileEquals.ts","../src/formData/HttpFormData.ts","../src/headers/HttpHeaders.ts","../src/searchParams/HttpSearchParams.ts","../src/types/schema.ts","../src/utils/bodies.ts"],"names":["pickPrimitiveProperties"],"mappings":"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","file":"index.mjs","sourcesContent":["async function blobEquals(blob: Blob, otherBlob: Blob) {\n if (blob.type !== otherBlob.type || blob.size !== otherBlob.size) {\n return false;\n }\n\n const reader = blob.stream().getReader();\n const otherReader = otherBlob.stream().getReader();\n\n let buffer: Uint8Array = new Uint8Array(0);\n let otherBuffer: Uint8Array = new Uint8Array(0);\n\n try {\n while (true) {\n const bufferReadPromises: Promise<void>[] = [];\n\n if (buffer.length === 0) {\n bufferReadPromises.push(\n reader.read().then((result) => {\n if (!result.done) {\n buffer = result.value;\n }\n }),\n );\n }\n\n if (otherBuffer.length === 0) {\n bufferReadPromises.push(\n otherReader.read().then((result) => {\n if (!result.done) {\n otherBuffer = result.value;\n }\n }),\n );\n }\n\n await Promise.all(bufferReadPromises);\n\n const haveStreamsEndedTogether = buffer.length === 0 && otherBuffer.length === 0;\n\n if (haveStreamsEndedTogether) {\n return true;\n }\n\n const hasOneStreamEndedBeforeTheOther =\n (buffer.length === 0 && otherBuffer.length > 0) || (buffer.length > 0 && otherBuffer.length === 0);\n\n if (hasOneStreamEndedBeforeTheOther) {\n return false;\n }\n\n const minimumByteLength = Math.min(buffer.length, otherBuffer.length);\n\n for (let byteIndex = 0; byteIndex < minimumByteLength; byteIndex++) {\n if (buffer[byteIndex] !== otherBuffer[byteIndex]) {\n return false;\n }\n }\n\n buffer = buffer.slice(minimumByteLength);\n otherBuffer = otherBuffer.slice(minimumByteLength);\n }\n } finally {\n reader.releaseLock();\n otherReader.releaseLock();\n }\n}\n\nexport default blobEquals;\n","import blobEquals from './blobEquals';\n\nasync function fileEquals(file: File, otherFile: File) {\n return file.name === otherFile.name && (await blobEquals(file, otherFile));\n}\n\nexport default fileEquals;\n","import fileEquals from '@zimic/utils/data/fileEquals';\nimport { ArrayItemIfArray, Replace } from '@zimic/utils/types';\n\nimport { HttpFormDataSchema, HttpFormDataSchemaName, HttpFormDataSerialized } from './types';\n\n/** @see {@link https://zimic.dev/docs/http/api/http-form-data `HttpFormData` API reference} */\nclass HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSchema.Loose> extends FormData {\n readonly _schema!: HttpFormDataSerialized<LooseSchema>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataset `formData.set()` API reference} */\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n set<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.set(name, blobOrValue as Blob);\n } else {\n super.set(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataappend `formData.append()` API reference} */\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n value: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, Blob>,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blob: Exclude<ArrayItemIfArray<NonNullable<LooseSchema[Name]>>, string>,\n fileName?: string,\n ): void;\n append<Name extends HttpFormDataSchemaName<this['_schema']>>(\n name: Name,\n blobOrValue: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n fileName?: string,\n ): void {\n if (fileName === undefined) {\n super.append(name, blobOrValue as Blob);\n } else {\n super.append(name, blobOrValue as Blob, fileName);\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataget `formData.get()` API reference} */\n get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): Replace<Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatagetall `formData.getAll()` API reference} */\n getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(\n name: Name,\n ): Replace<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatahas `formData.has()` API reference} */\n has<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatadelete `formData.delete()` API reference} */\n delete<Name extends HttpFormDataSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataforEach `formData.forEach()` API reference} */\n forEach<This extends HttpFormData<this['_schema']>>(\n callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(\n value: Replace<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>,\n key: Key,\n formData: HttpFormData<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: FormDataEntryValue, key: string, parent: FormData) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatakeys `formData.keys()` API reference} */\n keys(): FormDataIterator<HttpFormDataSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatavalues `formData.values()` API reference} */\n values(): FormDataIterator<\n Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataentries `formData.entries()` API reference} */\n entries(): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): FormDataIterator<\n [\n HttpFormDataSchemaName<this['_schema']>,\n Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataequals `formData.equals()` API reference} */\n async equals<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n if (!(await this.contains(otherData))) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherData, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatacontains `formData.contains()` API reference} */\n async contains<OtherSchema extends LooseSchema>(otherData: HttpFormData<OtherSchema>): Promise<boolean> {\n for (const [otherKey, otherValue] of otherData.entries()) {\n const values = super.getAll.call(this, otherKey);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherData, otherKey).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n let valueExists = false;\n\n for (const value of values) {\n if (\n value === otherValue ||\n (value instanceof Blob && (otherValue as Blob) instanceof Blob && (await fileEquals(value, otherValue)))\n ) {\n valueExists = true;\n break;\n }\n }\n\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatatoobject `formData.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpFormDataSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpFormData;\n","import { Default, Replace } from '@zimic/utils/types';\n\nimport { HttpHeadersSchema, HttpHeadersInit, HttpHeadersSchemaName, HttpHeadersSerialized } from './types';\n\nfunction pickPrimitiveProperties<LooseSchema extends HttpHeadersSchema.Loose>(schema: LooseSchema) {\n return Object.entries(schema).reduce<Record<string, string>>((accumulated, [key, value]) => {\n if (value !== undefined) {\n accumulated[key] = String(value);\n }\n return accumulated;\n }, {});\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-headers `HttpHeaders` API reference} */\nclass HttpHeaders<LooseSchema extends HttpHeadersSchema.Loose = HttpHeadersSchema.Loose> extends Headers {\n readonly _schema!: HttpHeadersSerialized<LooseSchema>;\n\n constructor(init?: HttpHeadersInit<LooseSchema>) {\n if (init instanceof Headers || Array.isArray(init) || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersset `headers.set()` API reference} */\n set<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersappend `headers.append()` API reference} */\n append<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name, value: NonNullable<LooseSchema[Name]>): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersget `headers.get()` API reference} */\n get<Name extends HttpHeadersSchemaName<this['_schema']>>(\n name: Name,\n ): Replace<this['_schema'][Name], undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersgetSetCookie `headers.getSetCookie()` API reference} */\n getSetCookie(): NonNullable<Default<this['_schema']['Set-Cookie'], string>>[] {\n return super.getSetCookie() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headershas `headers.has()` API reference} */\n has<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): boolean {\n return super.has(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersdelete `headers.delete()` API reference} */\n delete<Name extends HttpHeadersSchemaName<this['_schema']>>(name: Name): void {\n super.delete(name);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersforEach `headers.forEach()` API reference} */\n forEach<This extends HttpHeaders<this['_schema']>>(\n callback: <Key extends HttpHeadersSchemaName<this['_schema']>>(\n value: NonNullable<this['_schema'][Key]> & string,\n key: Key,\n headers: Headers,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: Headers) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerskeys `headers.keys()` API reference} */\n keys(): HeadersIterator<HttpHeadersSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersvalues `headers.values()` API reference} */\n values(): HeadersIterator<NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string> {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersentries `headers.entries()` API reference} */\n entries(): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): HeadersIterator<\n [\n HttpHeadersSchemaName<this['_schema']>,\n NonNullable<this['_schema'][HttpHeadersSchemaName<this['_schema']>]> & string,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headersequals `headers.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n if (!this.contains(otherHeaders)) {\n return false;\n }\n\n for (const key of this.keys()) {\n const otherHasKey = super.has.call(otherHeaders, key);\n if (!otherHasKey) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerscontains `headers.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherHeaders: HttpHeaders<OtherSchema>): boolean {\n for (const [key, otherValue] of otherHeaders.entries()) {\n const value = super.get.call(this, key);\n\n if (value === null) {\n return false;\n }\n\n const valueItems = this.splitHeaderValues(value);\n const otherValueItems = this.splitHeaderValues(otherValue);\n\n const haveSameNumberOfValues = valueItems.length === otherValueItems.length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n for (const otherValueItem of otherValueItems) {\n if (!valueItems.includes(otherValueItem)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-headers#headerstoobject `headers.toObject()` API reference} */\n toObject(): this['_schema'] {\n const object = {} as this['_schema'];\n\n for (const [key, value] of this.entries()) {\n object[key] = value;\n }\n\n return object;\n }\n\n private splitHeaderValues(value: string) {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n }\n}\n\nexport default HttpHeaders;\n","import { Replace, ArrayItemIfArray } from '@zimic/utils/types';\n\nimport {\n HttpSearchParamsSchema,\n HttpSearchParamsInit,\n HttpSearchParamsSchemaName,\n HttpSearchParamsSerialized,\n} from './types';\n\nfunction pickPrimitiveProperties<Schema extends HttpSearchParamsSchema.Loose>(schema: Schema) {\n const schemaWithPrimitiveProperties = Object.entries(schema).reduce<Record<string, string>>(\n (accumulated, [key, value]) => {\n if (value !== undefined && !Array.isArray(value)) {\n accumulated[key] = String(value);\n }\n return accumulated;\n },\n {},\n );\n return schemaWithPrimitiveProperties;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-search-params `HttpSearchParams` API reference} */\nclass HttpSearchParams<\n LooseSchema extends HttpSearchParamsSchema.Loose = HttpSearchParamsSchema.Loose,\n> extends URLSearchParams {\n readonly _schema!: HttpSearchParamsSerialized<LooseSchema>;\n\n constructor(init?: HttpSearchParamsInit<LooseSchema>) {\n if (init instanceof URLSearchParams || Array.isArray(init) || typeof init === 'string' || !init) {\n super(init);\n } else {\n super(pickPrimitiveProperties(init));\n this.populateInitArrayProperties(init);\n }\n }\n\n private populateInitArrayProperties(init: LooseSchema) {\n for (const [key, value] of Object.entries(init)) {\n if (Array.isArray(value)) {\n for (const item of value as unknown[]) {\n super.append(key, String(item));\n }\n }\n }\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsset `searchParams.set()` API reference} */\n set<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.set(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsappend `searchParams.append()` API reference} */\n append<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.append(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsget `searchParams.get()` API reference} */\n get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(\n name: Name,\n ): Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {\n return super.get(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsgetall `searchParams.getAll()` API reference} */\n getAll<Name extends HttpSearchParamsSchemaName.Array<this['_schema']>>(\n name: Name,\n ): ArrayItemIfArray<NonNullable<this['_schema'][Name]>>[] {\n return super.getAll(name) as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamshas `searchParams.has()` API reference} */\n has<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): boolean {\n return super.has(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsdelete `searchParams.delete()` API reference} */\n delete<Name extends HttpSearchParamsSchemaName<this['_schema']>>(\n name: Name,\n value?: ArrayItemIfArray<NonNullable<LooseSchema[Name]>>,\n ): void {\n super.delete(name, value);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsforEach `searchParams.forEach()` API reference} */\n forEach<This extends HttpSearchParams<this['_schema']>>(\n callback: <Key extends HttpSearchParamsSchemaName<this['_schema']>>(\n value: ArrayItemIfArray<NonNullable<this['_schema'][Key]>>,\n key: Key,\n searchParams: HttpSearchParams<this['_schema']>,\n ) => void,\n thisArg?: This,\n ): void {\n super.forEach(callback as (value: string, key: string, parent: URLSearchParams) => void, thisArg);\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamskeys `searchParams.keys()` API reference} */\n keys(): URLSearchParamsIterator<HttpSearchParamsSchemaName<this['_schema']>> {\n return super.keys() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsvalues `searchParams.values()` API reference} */\n values(): URLSearchParamsIterator<\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>\n > {\n return super.values() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsentries `searchParams.entries()` API reference} */\n entries(): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super.entries() as never;\n }\n\n [Symbol.iterator](): URLSearchParamsIterator<\n [\n HttpSearchParamsSchemaName<this['_schema']>,\n ArrayItemIfArray<NonNullable<this['_schema'][HttpSearchParamsSchemaName<this['_schema']>]>>,\n ]\n > {\n return super[Symbol.iterator]() as never;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsequals `searchParams.equals()` API reference} */\n equals<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n return this.contains(otherParams) && this.size === otherParams.size;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamscontains `searchParams.contains()` API reference} */\n contains<OtherSchema extends LooseSchema>(otherParams: HttpSearchParams<OtherSchema>): boolean {\n for (const [key, otherValue] of otherParams.entries()) {\n const values = super.getAll.call(this, key);\n\n const haveSameNumberOfValues = values.length === super.getAll.call(otherParams, key).length;\n if (!haveSameNumberOfValues) {\n return false;\n }\n\n const valueExists = values.includes(otherValue);\n if (!valueExists) {\n return false;\n }\n }\n\n return true;\n }\n\n /** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamstoobject `searchParams.toObject()` API reference} */\n toObject() {\n const object = {} as this['_schema'];\n\n type SchemaValue = this['_schema'][HttpSearchParamsSchemaName<this['_schema']>];\n\n for (const [key, value] of this.entries()) {\n if (key in object) {\n const existingValue = object[key] as SchemaValue[];\n\n if (Array.isArray<SchemaValue>(existingValue)) {\n existingValue.push(value as SchemaValue);\n } else {\n object[key] = [existingValue, value] as SchemaValue;\n }\n } else {\n object[key] = value as SchemaValue;\n }\n }\n\n return object;\n }\n}\n\nexport default HttpSearchParams;\n","import {\n IfAny,\n UnionToIntersection,\n UnionHasMoreThanOneType,\n Prettify,\n NonEmptyArray,\n Branded,\n} from '@zimic/utils/types';\n\nimport { HttpFormDataSchema } from '../formData/types';\nimport { HttpHeadersSchema } from '../headers/types';\nimport { HttpPathParamsSchema } from '../pathParams/types';\nimport { HttpSearchParamsSchema } from '../searchParams/types';\nimport { HttpBody } from './requests';\n\nexport const HTTP_METHODS = Object.freeze(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'] as const);\n/**\n * A type representing the currently supported\n * {@link https://developer.mozilla.org/docs/Web/HTTP/Methods `HTTP methods`}.\n */\nexport type HttpMethod = (typeof HTTP_METHODS)[number];\n\n/**\n * A schema representing the structure of an HTTP request.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpRequestSchema {\n headers?: HttpHeadersSchema.Loose;\n searchParams?: HttpSearchParamsSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * A schema representing the structure of an HTTP response.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpResponseSchema {\n headers?: HttpHeadersSchema.Loose;\n body?: HttpBody.Loose;\n}\n\n/**\n * The status codes used in HTTP responses, as defined by\n * {@link https://httpwg.org/specs/rfc9110.html#overview.of.status.codes RFC-9110}.\n *\n * - `HttpStatusCode.Information`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n * - `HttpStatusCode.Success`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n * - `HttpStatusCode.Redirection`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n * - `HttpStatusCode.ClientError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n * - `HttpStatusCode.ServerError`: {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\nexport type HttpStatusCode =\n | HttpStatusCode.Information\n | HttpStatusCode.Success\n | HttpStatusCode.Redirection\n | HttpStatusCode.ClientError\n | HttpStatusCode.ServerError;\n\nexport namespace HttpStatusCode {\n /**\n * An HTTP status code in the `1XX` range, representing an informational response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#information_responses `1XX`}\n */\n export type Information =\n | 100 // Continue\n | 101 // Switching Protocols\n | 102 // Processing\n | 103; // Early Hints\n\n /**\n * An HTTP status code in the `2XX` range, representing a successful response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#successful_responses `2XX`}\n */\n export type Success =\n | 200 // OK\n | 201 // Created\n | 202 // Accepted\n | 203 // Non-Authoritative Information\n | 204 // No Content\n | 205 // Reset Content\n | 206 // Partial Content\n | 207 // Multi-Status\n | 208 // Already Reported\n | 226; // IM Used\n\n /**\n * An HTTP status code in the `3XX` range, representing a redirection response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#redirection_messages `3XX`}\n */\n export type Redirection =\n | 300 // Multiple Choices\n | 301 // Moved Permanently\n | 302 // Found\n | 303 // See Other\n | 304 // Not Modified\n | 307 // Temporary Redirect\n | 308; // Permanent Redirect\n\n /**\n * An HTTP status code in the `4XX` range, representing a client error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#client_error_responses `4XX`}\n */\n export type ClientError =\n | 400 // Bad Request\n | 401 // Unauthorized\n | 402 // Payment Required\n | 403 // Forbidden\n | 404 // Not Found\n | 405 // Method Not Allowed\n | 406 // Not Acceptable\n | 407 // Proxy Authentication Required\n | 408 // Request Timeout\n | 409 // Conflict\n | 410 // Gone\n | 411 // Length Required\n | 412 // Precondition Failed\n | 413 // Content Too Large\n | 414 // URI Too Long\n | 415 // Unsupported Media Type\n | 416 // Range Not Satisfiable\n | 417 // Expectation Failed\n | 418 // I'm a teapot\n | 421 // Misdirected Request\n | 422 // Unprocessable Content\n | 423 // Locked\n | 424 // Failed Dependency\n | 425 // Too Early\n | 426 // Upgrade Required\n | 428 // Precondition Required\n | 429 // Too Many Requests\n | 431 // Request Header Fields Too Large\n | 451; // Unavailable For Legal Reasons\n\n /**\n * An HTTP status code in the `5XX` range, representing a server error response.\n *\n * @see {@link https://developer.mozilla.org/docs/Web/HTTP/Status#server_error_responses `5XX`}\n */\n export type ServerError =\n | 500 // Internal Server Error\n | 501 // Not Implemented\n | 502 // Bad Gateway\n | 503 // Service Unavailable\n | 504 // Gateway Timeout\n | 505 // HTTP Version Not Supported\n | 506 // Variant Also Negotiates\n | 507 // Insufficient Storage\n | 508 // Loop Detected\n | 510 // Not Extended\n | 511; // Network Authentication Required\n}\n\n/**\n * A schema representing the structure of HTTP responses by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaByStatusCode = {\n [StatusCode in HttpStatusCode]?: HttpResponseSchema;\n};\n\n/**\n * Extracts the status codes used in a response schema by status code.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpResponseSchemaStatusCode<ResponseSchemaByStatusCode extends HttpResponseSchemaByStatusCode> =\n keyof ResponseSchemaByStatusCode & HttpStatusCode;\n\n/**\n * A schema representing the structure of an HTTP request and response for a given method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodSchema {\n request?: HttpRequestSchema;\n response?: HttpResponseSchemaByStatusCode;\n}\n\n/**\n * A schema representing the structure of HTTP request and response by method.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport interface HttpMethodsSchema {\n GET?: HttpMethodSchema;\n POST?: HttpMethodSchema;\n PUT?: HttpMethodSchema;\n PATCH?: HttpMethodSchema;\n DELETE?: HttpMethodSchema;\n HEAD?: HttpMethodSchema;\n OPTIONS?: HttpMethodSchema;\n}\n\ninterface BaseHttpSchema {\n [path: string]: HttpMethodsSchema;\n}\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference} */\nexport type HttpSchema<Schema extends BaseHttpSchema = BaseHttpSchema> = Branded<Schema, 'HttpSchema'>;\n\nexport namespace HttpSchema {\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethods `HttpSchema.Methods` API reference} */\n export type Methods<Schema extends HttpMethodsSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemamethod `HttpSchema.Method` API reference} */\n export type Method<Schema extends HttpMethodSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemarequest `HttpSchema.Request` API reference} */\n export type Request<Schema extends HttpRequestSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponsebystatuscode `HttpSchema.ResponseByStatusCode` API reference} */\n export type ResponseByStatusCode<Schema extends HttpResponseSchemaByStatusCode> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaresponse `HttpSchema.Response` API reference} */\n export type Response<Schema extends HttpResponseSchema> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemabody `HttpSchema.Body` API reference} */\n export type Body<Schema extends HttpBody.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaheaders `HttpSchema.Headers` API reference} */\n export type Headers<Schema extends HttpHeadersSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemasearchparams `HttpSchema.SearchParams` API reference} */\n export type SearchParams<Schema extends HttpSearchParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathparams `HttpSchema.PathParams` API reference} */\n export type PathParams<Schema extends HttpPathParamsSchema.Loose> = Schema;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemaformdata `HttpSchema.FormData` API reference} */\n export type FormData<Schema extends HttpFormDataSchema.Loose> = Schema;\n}\n\n/**\n * Extracts the methods from an HTTP service schema.\n *\n * @see {@link https://zimic.dev/docs/http/api/http-schema `HttpSchema` API reference}\n */\nexport type HttpSchemaMethod<Schema extends HttpSchema> = IfAny<\n Schema,\n any, // eslint-disable-line @typescript-eslint/no-explicit-any\n keyof UnionToIntersection<Schema[keyof Schema]> & HttpMethod\n>;\n\ntype RepeatingPathParamModifier = '+';\ntype OptionalPathParamModifier = '?' | '*';\n\ntype ConvertPathParamToRecord<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? ConvertPathParamToRecord<PathParamWithoutSlash>\n : PathParam extends `${infer PathParamWithoutModifier}${OptionalPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]?: string }\n : PathParam extends `${infer PathParamWithoutModifier}${RepeatingPathParamModifier}`\n ? { [Name in PathParamWithoutModifier]: string }\n : { [Name in PathParam]: string };\n\ntype RecursiveInferPathParams<Path extends string> = Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<RemainingPath>\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`\\\\:${RemainingPath}`>\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${string}\\\\`\n ? RecursiveInferPathParams<RemainingPath>\n : ConvertPathParamToRecord<PathParam> & RecursiveInferPathParams<`:${RemainingPath}`>\n : Prefix extends `${string}\\\\`\n ? {}\n : ConvertPathParamToRecord<PathParamWithRemainingPath>\n : {};\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#inferpathparams `InferPathParams` API reference} */\nexport type InferPathParams<\n PathOrSchema extends string | HttpSchema,\n OptionalPath extends PathOrSchema extends HttpSchema ? HttpSchemaPath.Literal<PathOrSchema> : never = never,\n> = Prettify<\n RecursiveInferPathParams<\n PathOrSchema extends HttpSchema ? OptionalPath : PathOrSchema extends string ? PathOrSchema : never\n >\n>;\n\ntype WithoutEscapedColons<Path extends string> = Path extends `${infer Prefix}\\\\:${infer Suffix}`\n ? WithoutEscapedColons<`${Prefix}:${Suffix}`>\n : Path;\n\ntype ConvertPathParamToString<PathParam extends string> = PathParam extends `${infer PathParamWithoutSlash}/`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}/`\n : PathParam extends `${infer PathParamWithoutSlash}\\\\:`\n ? `${ConvertPathParamToString<PathParamWithoutSlash>}:`\n : string;\n\nexport type AllowAnyStringInPathParams<Path extends string> =\n Path extends `${infer Prefix}:${infer PathParamWithRemainingPath}`\n ? PathParamWithRemainingPath extends `${infer PathParam}/${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}/${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}\\\\:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}:${AllowAnyStringInPathParams<RemainingPath>}`\n : PathParamWithRemainingPath extends `${infer PathParam}:${infer RemainingPath}`\n ? Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${AllowAnyStringInPathParams<PathParamWithRemainingPath>}`\n : `${Prefix}${ConvertPathParamToString<PathParam>}${AllowAnyStringInPathParams<`:${RemainingPath}`>}`\n : Prefix extends `${infer PrefixPrefix}\\\\`\n ? `${PrefixPrefix}:${PathParamWithRemainingPath}`\n : `${Prefix}${ConvertPathParamToString<PathParamWithRemainingPath>}`\n : Path;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapath `HttpSchemaPath` API reference} */\nexport namespace HttpSchemaPath {\n type LooseLiteral<Schema extends HttpSchema, Method extends HttpMethod = HttpMethod> = {\n [Path in keyof Schema & string]: Method extends keyof Schema[Path] ? Path : never;\n }[keyof Schema & string];\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathliteral `HttpSchemaPath.Literal` API reference} */\n export type Literal<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = LooseLiteral<Schema, Method>;\n\n /** @see {@link https://zimic.dev/docs/http/api/http-schema#httpschemapathnonliteral `HttpSchemaPath.NonLiteral` API reference} */\n export type NonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n > = WithoutEscapedColons<AllowAnyStringInPathParams<LooseLiteral<Schema, Method>>>;\n}\n\nexport type HttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema> = HttpSchemaMethod<Schema>,\n> = HttpSchemaPath.Literal<Schema, Method> | HttpSchemaPath.NonLiteral<Schema, Method>;\n\ntype LargestPathPrefix<Path extends string> = Path extends `${infer Prefix}/${infer Suffix}`\n ? `${Prefix}/${Suffix extends `${string}/${string}` ? LargestPathPrefix<Suffix> : ''}`\n : Path;\n\ntype ExcludeNonLiteralPathsSupersededByLiteralPath<Path extends string> =\n Path extends `${LargestPathPrefix<Path>}:${string}` ? never : Path;\n\nexport type PreferMostStaticLiteralPath<Path extends string> =\n UnionHasMoreThanOneType<Path> extends true ? ExcludeNonLiteralPathsSupersededByLiteralPath<Path> : Path;\n\ntype RecursiveInferHttpSchemaPath<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method>,\n> =\n NonLiteralPath extends AllowAnyStringInPathParams<LiteralPath>\n ? NonLiteralPath extends `${AllowAnyStringInPathParams<LiteralPath>}/${string}`\n ? never\n : LiteralPath\n : never;\n\nexport type LiteralHttpSchemaPathFromNonLiteral<\n Schema extends HttpSchema,\n Method extends HttpSchemaMethod<Schema>,\n NonLiteralPath extends string,\n LiteralPath extends HttpSchemaPath.Literal<Schema, Method> = HttpSchemaPath.Literal<Schema, Method>,\n> = PreferMostStaticLiteralPath<\n LiteralPath extends LiteralPath ? RecursiveInferHttpSchemaPath<Schema, Method, NonLiteralPath, LiteralPath> : never\n>;\n\ntype OmitPastHttpStatusCodes<\n Schema extends HttpResponseSchemaByStatusCode,\n PastSchemas extends HttpResponseSchemaByStatusCode[],\n> =\n PastSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? Omit<Schema, keyof UnionToIntersection<PastSchemas[number]>>\n : Schema;\n\n/** @see {@link https://zimic.dev/docs/http/api/http-schema#mergehttpresponsesbystatuscode `MergeHttpResponsesByStatusCode` API reference} */\nexport type MergeHttpResponsesByStatusCode<\n Schemas extends HttpResponseSchemaByStatusCode[],\n PastSchemas extends HttpResponseSchemaByStatusCode[] = [],\n> = Schemas extends [\n infer FirstSchema extends HttpResponseSchemaByStatusCode,\n ...infer RestSchemas extends HttpResponseSchemaByStatusCode[],\n]\n ? RestSchemas extends NonEmptyArray<HttpResponseSchemaByStatusCode>\n ? OmitPastHttpStatusCodes<FirstSchema, PastSchemas> &\n MergeHttpResponsesByStatusCode<RestSchemas, [...PastSchemas, FirstSchema]>\n : OmitPastHttpStatusCodes<FirstSchema, PastSchemas>\n : never;\n","import HttpFormData from '@/formData/HttpFormData';\nimport HttpSearchParams from '@/searchParams/HttpSearchParams';\nimport { HttpBody } from '@/types/requests';\n\n/**\n * Error thrown when a value is not valid {@link https://developer.mozilla.org/docs/Web/API/FormData FormData}. HTTP\n * interceptors might throw this error when trying to parse the body of a request or response with the header\n * `'content-type': 'multipart/form-data'`, if the content cannot be parsed to form data.\n */\nexport class InvalidFormDataError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as form data: ${value}`);\n this.name = 'InvalidFormDataError';\n }\n}\n\n/**\n * Error thrown when a value is not valid JSON. HTTP interceptors might throw this error when trying to parse the body\n * of a request or response with the header `'content-type': 'application/json'`, if the content cannot be parsed to\n * JSON.\n */\nexport class InvalidJSONError extends SyntaxError {\n constructor(value: string) {\n super(`Failed to parse value as JSON: ${value}`);\n this.name = 'InvalidJSONError';\n }\n}\n\nasync function parseHttpBodyAsText<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n return (bodyAsText || null) as Body;\n}\n\nasync function parseHttpBodyAsBlob<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsBlob = await resource.blob();\n return bodyAsBlob as Body;\n}\n\nasync function parseHttpBodyAsFormData<Body extends HttpBody>(resource: Request | Response) {\n const resourceClone = resource.clone();\n\n try {\n const bodyAsRawFormData = await resource.formData();\n const bodyAsFormData = new HttpFormData();\n\n for (const [key, value] of bodyAsRawFormData) {\n bodyAsFormData.append(key, value);\n }\n\n return bodyAsFormData as Body;\n } catch {\n const bodyAsText = await resourceClone.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n throw new InvalidFormDataError(bodyAsText);\n }\n}\n\nasync function parseHttpBodyAsSearchParams<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n const bodyAsSearchParams = new HttpSearchParams(bodyAsText);\n return bodyAsSearchParams as Body;\n}\n\nasync function parseHttpBodyAsJSON<Body extends HttpBody>(resource: Request | Response) {\n const bodyAsText = await resource.text();\n\n if (!bodyAsText.trim()) {\n return null;\n }\n\n try {\n const bodyAsJSON = JSON.parse(bodyAsText) as Body;\n return bodyAsJSON;\n } catch {\n throw new InvalidJSONError(bodyAsText);\n }\n}\n\n/**\n * Parses the body of a {@link https://developer.mozilla.org/docs/Web/API/Request request} or\n * {@link https://developer.mozilla.org/docs/Web/API/Response response} based on its `content-type` header.\n *\n * If the body is empty, `null` is returned. If the `content-type` header is not present or not recognized, an attempt\n * is made to parse the body as JSON, and if that fails, it is returned as a `Blob`.\n *\n * | `content-type` | Parsed as |\n * | ----------------------------------- | ------------------------------------------------------------------------ |\n * | `application/json` | `JSON` (object) |\n * | `application/xml` | `string` |\n * | `application/x-www-form-urlencoded` | [`HttpSearchParams`](https://zimic.dev/docs/http/api/http-search-params) |\n * | `application/*` (others) | `Blob` |\n * | `multipart/form-data` | [`HttpFormData`](https://zimic.dev/docs/http/api/http-form-data) |\n * | `multipart/*` (others) | `Blob` |\n * | `text/*` | `string` |\n * | `image/*` | `Blob` |\n * | `audio/*` | `Blob` |\n * | `font/*` | `Blob` |\n * | `video/*` | `Blob` |\n * | Others | `JSON` if possible, otherwise `Blob` |\n *\n * @throws {InvalidJSONError} If the `content-type` starts with `application/json` but the body cannot be parsed to\n * JSON.\n * @throws {InvalidFormDataError} If the `content-type` starts with `multipart/form-data` but the body cannot be parsed\n * to form data.\n */\nexport async function parseHttpBody<Body extends HttpBody = HttpBody>(resource: Request | Response) {\n const contentType = resource.headers.get('content-type');\n\n if (contentType?.startsWith('application/json')) {\n return parseHttpBodyAsJSON<Body>(resource);\n }\n\n if (contentType?.startsWith('multipart/form-data')) {\n return parseHttpBodyAsFormData<Body>(resource);\n }\n\n if (contentType?.startsWith('application/x-www-form-urlencoded')) {\n return parseHttpBodyAsSearchParams<Body>(resource);\n }\n\n if (contentType?.startsWith('text/') || contentType?.startsWith('application/xml')) {\n return parseHttpBodyAsText<Body>(resource);\n }\n\n if (\n contentType?.startsWith('application/') ||\n contentType?.startsWith('image/') ||\n contentType?.startsWith('audio/') ||\n contentType?.startsWith('font/') ||\n contentType?.startsWith('video/') ||\n contentType?.startsWith('multipart/')\n ) {\n return parseHttpBodyAsBlob<Body>(resource);\n }\n\n const resourceClone = resource.clone();\n\n try {\n return await parseHttpBodyAsJSON<Body>(resource);\n } catch {\n return parseHttpBodyAsBlob<Body>(resourceClone);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"api",
|
|
13
13
|
"static"
|
|
14
14
|
],
|
|
15
|
-
"version": "1.2.1",
|
|
15
|
+
"version": "1.2.2-canary.1",
|
|
16
16
|
"homepage": "https://zimic.dev/docs/http",
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"deps:setup": "pnpm deps:setup-playwright"
|
|
88
88
|
},
|
|
89
89
|
"dependencies": {
|
|
90
|
-
"openapi-typescript": "7.
|
|
90
|
+
"openapi-typescript": "7.10.1",
|
|
91
91
|
"picocolors": "^1.1.1",
|
|
92
92
|
"yargs": "18.0.0"
|
|
93
93
|
},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fileEquals from '@zimic/utils/data/fileEquals';
|
|
2
|
-
import { ArrayItemIfArray,
|
|
2
|
+
import { ArrayItemIfArray, Replace } from '@zimic/utils/types';
|
|
3
3
|
|
|
4
4
|
import { HttpFormDataSchema, HttpFormDataSchemaName, HttpFormDataSerialized } from './types';
|
|
5
5
|
|
|
@@ -54,14 +54,14 @@ class HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSc
|
|
|
54
54
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataget `formData.get()` API reference} */
|
|
55
55
|
get<Name extends HttpFormDataSchemaName.NonArray<this['_schema']>>(
|
|
56
56
|
name: Name,
|
|
57
|
-
):
|
|
57
|
+
): Replace<Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File> {
|
|
58
58
|
return super.get(name) as never;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatagetall `formData.getAll()` API reference} */
|
|
62
62
|
getAll<Name extends HttpFormDataSchemaName.Array<this['_schema']>>(
|
|
63
63
|
name: Name,
|
|
64
|
-
):
|
|
64
|
+
): Replace<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[] {
|
|
65
65
|
return super.getAll(name) as never;
|
|
66
66
|
}
|
|
67
67
|
|
|
@@ -78,7 +78,7 @@ class HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSc
|
|
|
78
78
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdataforEach `formData.forEach()` API reference} */
|
|
79
79
|
forEach<This extends HttpFormData<this['_schema']>>(
|
|
80
80
|
callback: <Key extends HttpFormDataSchemaName<this['_schema']>>(
|
|
81
|
-
value:
|
|
81
|
+
value: Replace<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>,
|
|
82
82
|
key: Key,
|
|
83
83
|
formData: HttpFormData<this['_schema']>,
|
|
84
84
|
) => void,
|
|
@@ -94,7 +94,7 @@ class HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSc
|
|
|
94
94
|
|
|
95
95
|
/** @see {@link https://zimic.dev/docs/http/api/http-form-data#formdatavalues `formData.values()` API reference} */
|
|
96
96
|
values(): FormDataIterator<
|
|
97
|
-
|
|
97
|
+
Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
|
|
98
98
|
> {
|
|
99
99
|
return super.values() as never;
|
|
100
100
|
}
|
|
@@ -103,7 +103,7 @@ class HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSc
|
|
|
103
103
|
entries(): FormDataIterator<
|
|
104
104
|
[
|
|
105
105
|
HttpFormDataSchemaName<this['_schema']>,
|
|
106
|
-
|
|
106
|
+
Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,
|
|
107
107
|
]
|
|
108
108
|
> {
|
|
109
109
|
return super.entries() as never;
|
|
@@ -112,7 +112,7 @@ class HttpFormData<LooseSchema extends HttpFormDataSchema.Loose = HttpFormDataSc
|
|
|
112
112
|
[Symbol.iterator](): FormDataIterator<
|
|
113
113
|
[
|
|
114
114
|
HttpFormDataSchemaName<this['_schema']>,
|
|
115
|
-
|
|
115
|
+
Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,
|
|
116
116
|
]
|
|
117
117
|
> {
|
|
118
118
|
return super[Symbol.iterator]() as never;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Default,
|
|
1
|
+
import { Default, Replace } from '@zimic/utils/types';
|
|
2
2
|
|
|
3
3
|
import { HttpHeadersSchema, HttpHeadersInit, HttpHeadersSchemaName, HttpHeadersSerialized } from './types';
|
|
4
4
|
|
|
@@ -36,7 +36,7 @@ class HttpHeaders<LooseSchema extends HttpHeadersSchema.Loose = HttpHeadersSchem
|
|
|
36
36
|
/** @see {@link https://zimic.dev/docs/http/api/http-headers#headersget `headers.get()` API reference} */
|
|
37
37
|
get<Name extends HttpHeadersSchemaName<this['_schema']>>(
|
|
38
38
|
name: Name,
|
|
39
|
-
):
|
|
39
|
+
): Replace<this['_schema'][Name], undefined, null> {
|
|
40
40
|
return super.get(name) as never;
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Replace, ArrayItemIfArray } from '@zimic/utils/types';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
HttpSearchParamsSchema,
|
|
@@ -64,7 +64,7 @@ class HttpSearchParams<
|
|
|
64
64
|
/** @see {@link https://zimic.dev/docs/http/api/http-search-params#searchparamsget `searchParams.get()` API reference} */
|
|
65
65
|
get<Name extends HttpSearchParamsSchemaName.NonArray<this['_schema']>>(
|
|
66
66
|
name: Name,
|
|
67
|
-
):
|
|
67
|
+
): Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {
|
|
68
68
|
return super.get(name) as never;
|
|
69
69
|
}
|
|
70
70
|
|
package/src/types/requests.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Default, DefaultNoExclude, IfNever,
|
|
1
|
+
import { Default, DefaultNoExclude, IfNever, Replace } from '@zimic/utils/types';
|
|
2
2
|
import { JSONValue } from '@zimic/utils/types/json';
|
|
3
3
|
|
|
4
4
|
import { HttpMethodSchema, HttpRequestSchema, HttpResponseSchema, HttpStatusCode } from '@/types/schema';
|
|
@@ -16,7 +16,7 @@ export type HttpBody = JSONValue | HttpFormData<any> | HttpSearchParams<any> | B
|
|
|
16
16
|
|
|
17
17
|
export namespace HttpBody {
|
|
18
18
|
/** A loose version of the HTTP body type. JSON values are not strictly typed. */
|
|
19
|
-
export type Loose =
|
|
19
|
+
export type Loose = Replace<HttpBody, JSONValue, JSONValue.Loose>;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -56,13 +56,17 @@ export interface HttpRequest<
|
|
|
56
56
|
> extends Request {
|
|
57
57
|
headers: StrictHeaders<StrictHeadersSchema>;
|
|
58
58
|
text: () => Promise<StrictBody extends string ? StrictBody : string>;
|
|
59
|
-
json: () => Promise<
|
|
59
|
+
json: () => Promise<
|
|
60
|
+
StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : Replace<StrictBody, null | undefined, never>
|
|
61
|
+
>;
|
|
60
62
|
formData: () => Promise<
|
|
61
63
|
StrictBody extends HttpFormData<infer HttpFormDataSchema>
|
|
62
64
|
? StrictFormData<HttpFormDataSchema>
|
|
63
65
|
: StrictBody extends HttpSearchParams<infer HttpSearchParamsSchema>
|
|
64
66
|
? StrictFormData<HttpSearchParamsSchema>
|
|
65
|
-
:
|
|
67
|
+
: StrictBody extends null | undefined
|
|
68
|
+
? never
|
|
69
|
+
: FormData
|
|
66
70
|
>;
|
|
67
71
|
clone: () => this;
|
|
68
72
|
}
|
|
@@ -82,13 +86,17 @@ export interface HttpResponse<
|
|
|
82
86
|
status: StatusCode;
|
|
83
87
|
headers: StrictHeaders<StrictHeadersSchema>;
|
|
84
88
|
text: () => Promise<StrictBody extends string ? StrictBody : string>;
|
|
85
|
-
json: () => Promise<
|
|
89
|
+
json: () => Promise<
|
|
90
|
+
StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : Replace<StrictBody, null | undefined, never>
|
|
91
|
+
>;
|
|
86
92
|
formData: () => Promise<
|
|
87
93
|
StrictBody extends HttpFormData<infer HttpFormDataSchema>
|
|
88
94
|
? StrictFormData<HttpFormDataSchema>
|
|
89
95
|
: StrictBody extends HttpSearchParams<infer HttpSearchParamsSchema>
|
|
90
96
|
? StrictFormData<HttpSearchParamsSchema>
|
|
91
|
-
:
|
|
97
|
+
: StrictBody extends null | undefined
|
|
98
|
+
? never
|
|
99
|
+
: FormData
|
|
92
100
|
>;
|
|
93
101
|
clone: () => this;
|
|
94
102
|
}
|
|
@@ -123,7 +131,7 @@ export type HttpRequestHeadersSchema<MethodSchema extends HttpMethodSchema> =
|
|
|
123
131
|
export type HttpRequestSearchParamsSchema<MethodSchema extends HttpMethodSchema> =
|
|
124
132
|
'searchParams' extends keyof MethodSchema['request'] ? Default<MethodSchema['request']>['searchParams'] : never;
|
|
125
133
|
|
|
126
|
-
export type HttpRequestBodySchema<MethodSchema extends HttpMethodSchema> =
|
|
134
|
+
export type HttpRequestBodySchema<MethodSchema extends HttpMethodSchema> = Replace<
|
|
127
135
|
IfNever<DefaultNoExclude<Default<MethodSchema['request']>['body']>, null>,
|
|
128
136
|
undefined,
|
|
129
137
|
null
|
|
@@ -158,10 +166,7 @@ export type HttpResponseHeadersSchema<
|
|
|
158
166
|
| Extract<Default<Default<MethodSchema['response']>[StatusCode]>['headers'], undefined>
|
|
159
167
|
: HttpResponseHeadersSchemaFromBody<Default<Default<MethodSchema['response']>[StatusCode]>, never>;
|
|
160
168
|
|
|
161
|
-
export type HttpResponseBodySchema<
|
|
162
|
-
MethodSchema extends HttpMethodSchema,
|
|
163
|
-
StatusCode extends HttpStatusCode,
|
|
164
|
-
> = ReplaceBy<
|
|
169
|
+
export type HttpResponseBodySchema<MethodSchema extends HttpMethodSchema, StatusCode extends HttpStatusCode> = Replace<
|
|
165
170
|
IfNever<DefaultNoExclude<Default<Default<MethodSchema['response']>[StatusCode]>['body']>, null>,
|
|
166
171
|
undefined,
|
|
167
172
|
null
|