@zimic/http 1.2.1 → 1.2.2-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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.0";
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":";;;;;;;;;;;;;;AAcE,IAAA,OAAA,GAAW,OAAA;;;ACZb,eAAsB,iBAA6B,QAAA,EAA6C;AAC9F,EAAA,MAAM,uBAAA,GAA0B,YAAY,GAAA,EAAI;AAEhD,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAS;AAE9B,EAAA,MAAM,qBAAA,GAAwB,YAAY,GAAA,EAAI;AAC9C,EAAA,MAAM,4BAA4B,qBAAA,GAAwB,uBAAA;AAE1D,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,uBAAA;AAAA,IACX,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,qBAAA;AAAA,IACT;AAAA,GACF;AACF;AAEO,SAAS,kBAAkB,yBAAA,EAAmC;AACnE,EAAA,IAAI,4BAA4B,GAAA,EAAM;AACpC,IAAA,OAAO,CAAA,EAAG,yBAAA,CAA0B,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,GAChD,MAAO;AACL,IAAA,OAAO,CAAA,EAAA,CAAI,yBAAA,GAA4B,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA;AAE3D;;;ACdA,eAAe,MAAA,GAAS;AACtB,EAAA,MAAMA,uBAAMC,eAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,EAC9B,UAAA,CAAW,YAAY,CAAA,CACvB,OAAA,CAAQ,OAAO,CAAA,CACf,cAAA,CAAe,KAAK,CAAA,CACpB,QAAO,CAEP,OAAA;AAAA,IAAQ,SAAA;AAAA,IAAW,qCAAA;AAAA,IAAuC,CAACD,MAAAA,KAC1DA,MAAAA,CAAM,aAAA,EAAc,CAAE,OAAA;AAAA,MACpB,iBAAA;AAAA,MACA,wCAAA;AAAA,MACA,CAACA,MAAAA,KACCA,MAAAA,CACG,UAAA,CAAW,OAAA,EAAS;AAAA,QACnB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,wGAAA;AAAA,QAEF,YAAA,EAAc;AAAA,OACf,CAAA,CACA,MAAA,CAAO,QAAA,EAAU;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,iGAAA;AAAA,QACF,KAAA,EAAO;AAAA,OACR,CAAA,CACA,MAAA,CAAO,cAAA,EAAgB;AAAA,QACtB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wDAAA;AAAA,QACb,KAAA,EAAO,GAAA;AAAA,QACP,YAAA,EAAc;AAAA,OACf,CAAA,CACA,MAAA,CAAO,UAAA,EAAY;AAAA,QAClB,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EAAa,qDAAA;AAAA,QACb,KAAA,EAAO,GAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA,CACA,MAAA,CAAO,OAAA,EAAS;AAAA,QACf,IAAA,EAAM,SAAA;AAAA,QACN,WAAA,EACE,uIAAA;AAAA,QAEF,KAAA,EAAO,GAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA,CACA,MAAA,CAAO,QAAA,EAAU;AAAA,QAChB,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,IAAA;AAAA,QACP,WAAA,EAAa;AAAA,UACX,wHAAA;AAAA,UAEA,6GAAA;AAAA,UAEA,gcAAA;AAAA,UAMA;AAAA,SAEF,CAAE,KAAK,IAAI,CAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,CAAA,CACA,MAAA,CAAO,aAAA,EAAe;AAAA,QACrB,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,uPAAA;AAAA,QAGF,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,MACL,OAAO,YAAA,KAAiB;AACtB,QAAA,MAAM,gBAAA,GAAmB,MAAM,gBAAA,CAAiB,YAAY;AAC1D,UAAA,MAAME,iCAAA,CAAyB;AAAA,YAC7B,OAAO,YAAA,CAAa,KAAA;AAAA,YACpB,QAAQ,YAAA,CAAa,MAAA;AAAA,YACrB,aAAa,YAAA,CAAa,WAAA;AAAA,YAC1B,iBAAiB,YAAA,CAAa,QAAA;AAAA,YAC9B,OAAO,YAAA,CAAa,KAAA;AAAA,YACpB,SAAS,YAAA,CAAa,MAAA;AAAA,YACtB,YAAY,YAAA,CAAa;AAAA,WAC1B,CAAA;AAAA,SACF,CAAA;AAED,QAAA,MAAM,iBAAiB,YAAA,CAAa,MAAA;AAEpC,QAAA,MAAM,cAAA,GACJ,GAAGC,sBAAA,CAAM,KAAA,CAAMA,uBAAM,IAAA,CAAK,QAAG,CAAC,CAAC,CAAA,WAAA,EAC5B,cAAA,GAAiBA,uBAAM,KAAA,CAAM,cAAc,IAAI,CAAA,GAAA,EAAMA,sBAAA,CAAM,OAAO,QAAQ,CAAC,CAAA,CAAE,CAAA,CAAA,EAAIA,sBAAA,CAAM,GAAA;AAAA,UACxF,CAAA,CAAA,EAAI,iBAAA,CAAkB,gBAAA,CAAiB,WAAW,CAAC,CAAA,CAAA;AAAA,SACpD,CAAA,CAAA;AAEH,QAAA,MAAM,qBAAqB,cAAA,KAAmB,MAAA;AAC9C,QAAAC,uBAAA,CAAO,kBAAA,GAAqB,MAAA,GAAS,MAAM,CAAA,CAAE,cAAc,CAAA;AAAA;AAC7D;AACF,IAGD,KAAA,EAAM;AACX;AAEA,IAAO,WAAA,GAAQ,MAAA;;;AC9Gf,KAAK,WAAA,EAAO","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.0\",\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"]}
package/dist/cli.mjs CHANGED
@@ -5,7 +5,7 @@ import yargs from 'yargs';
5
5
  import { hideBin } from 'yargs/helpers';
6
6
 
7
7
  // package.json
8
- var version = "1.2.1";
8
+ var version = "1.2.2-canary.0";
9
9
 
10
10
  // src/utils/time.ts
11
11
  async function usingElapsedTime(callback) {
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.0\",\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"]}
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 ReplaceBy<Type, Source, Target> = Type extends Source ? Target : 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): ReplaceBy<ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File>;
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): ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[];
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: ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>, key: Key, formData: HttpFormData<this['_schema']>) => void, thisArg?: This): void;
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<ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>>;
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
- ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
191
+ Replace<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
192
192
  ]>;
193
193
  [Symbol.iterator](): FormDataIterator<[
194
194
  HttpFormDataSchemaName<this['_schema']>,
195
- ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
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): ReplaceBy<this['_schema'][Name], undefined, null>;
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): ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>;
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 = ReplaceBy<HttpBody, JSONValue, JSONValue.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> = ReplaceBy<IfNever<DefaultNoExclude<Default<MethodSchema['request']>['body']>, null>, undefined, null>;
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> = ReplaceBy<IfNever<DefaultNoExclude<Default<Default<MethodSchema['response']>[StatusCode]>['body']>, null>, undefined, null>;
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":"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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, 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"]}
@@ -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.0",
16
16
  "homepage": "https://zimic.dev/docs/http",
17
17
  "repository": {
18
18
  "type": "git",
@@ -1,5 +1,5 @@
1
1
  import fileEquals from '@zimic/utils/data/fileEquals';
2
- import { ArrayItemIfArray, ReplaceBy } from '@zimic/utils/types';
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
- ): ReplaceBy<ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null>, Blob, File> {
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
- ): ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Name]>>, Blob, File>[] {
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: ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][Key]>>, Blob, File>,
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
- ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>
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
- ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,
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
- ReplaceBy<ArrayItemIfArray<NonNullable<this['_schema'][HttpFormDataSchemaName<this['_schema']>]>>, Blob, File>,
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, ReplaceBy } from '@zimic/utils/types';
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
- ): ReplaceBy<this['_schema'][Name], undefined, null> {
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 { ReplaceBy, ArrayItemIfArray } from '@zimic/utils/types';
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
- ): ReplaceBy<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {
67
+ ): Replace<ArrayItemIfArray<this['_schema'][Name]>, undefined, null> {
68
68
  return super.get(name) as never;
69
69
  }
70
70
 
@@ -1,4 +1,4 @@
1
- import { Default, DefaultNoExclude, IfNever, ReplaceBy } from '@zimic/utils/types';
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 = ReplaceBy<HttpBody, JSONValue, JSONValue.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<StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : StrictBody>;
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
- : FormData
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<StrictBody extends string | Exclude<HttpBody, JSONValue> ? never : StrictBody>;
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
- : FormData
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> = ReplaceBy<
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