From f27660eae1c8bde65cad64670f15a891c804c3ea Mon Sep 17 00:00:00 2001 From: Pooya Parsa Date: Tue, 15 Nov 2022 13:14:11 +0100 Subject: [PATCH] refactor: update repo --- .eslintrc | 9 +- LICENSE | 2 +- build.config.ts | 14 +- node.d.ts | 2 +- package.json | 16 +- playground/index.ts | 16 +- playground/undici.ts | 16 +- pnpm-lock.yaml | 530 ++++++++++++++++++++++--------------------- renovate.json | 2 +- src/base.ts | 4 +- src/error.ts | 42 ++-- src/fetch.ts | 172 +++++++------- src/index.ts | 22 +- src/node.ts | 34 +-- src/undici.ts | 14 +- src/utils.ts | 58 ++--- test/index.test.ts | 210 ++++++++--------- undici.d.ts | 2 +- vitest.config.ts | 6 +- 19 files changed, 591 insertions(+), 580 deletions(-) diff --git a/.eslintrc b/.eslintrc index e14cbd6e..0a7a3014 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,5 +1,10 @@ { "extends": [ - "@nuxtjs/eslint-config-typescript" - ] + "eslint-config-unjs" + ], + "rules": { + "no-undef": 0, + "unicorn/consistent-destructuring": 0, + "unicorn/no-await-expression-member": 0, + } } diff --git a/LICENSE b/LICENSE index 706fc0c3..e739abce 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 - UnJS +Copyright (c) Pooya Parsa Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/build.config.ts b/build.config.ts index 5c12ef77..c52855d7 100644 --- a/build.config.ts +++ b/build.config.ts @@ -1,11 +1,13 @@ -import { defineBuildConfig } from 'unbuild' +import { defineBuildConfig } from "unbuild"; export default defineBuildConfig({ declaration: true, - emitCJS: false, + rollup: { + emitCJS: true + }, entries: [ - 'src/index', - 'src/node', - 'src/undici' + "src/index", + "src/node", + "src/undici" ] -}) +}); diff --git a/node.d.ts b/node.d.ts index cba67d2e..60bf9b5a 100644 --- a/node.d.ts +++ b/node.d.ts @@ -1 +1 @@ -export * from './dist/node' +export * from "./dist/node"; diff --git a/package.json b/package.json index 3c397ce2..575d08bd 100644 --- a/package.json +++ b/package.json @@ -49,25 +49,25 @@ "test": "pnpm lint && vitest run --coverage" }, "dependencies": { - "destr": "^1.2.0", - "node-fetch-native": "^0.1.8", - "ufo": "^0.8.6", + "destr": "^1.2.1", + "node-fetch-native": "^1.0.1", + "ufo": "^1.0.0", "undici": "^5.12.0" }, "devDependencies": { - "@nuxtjs/eslint-config-typescript": "^11.0.0", "@types/node": "^18.11.9", - "@vitest/coverage-c8": "^0.25.1", + "@vitest/coverage-c8": "^0.25.2", "eslint": "^8.27.0", + "eslint-config-unjs": "^0.0.2", "fetch-blob": "^3.2.0", "formdata-polyfill": "^4.0.10", - "h3": "^0.8.6", + "h3": "^1.0.1", "jiti": "^1.16.0", - "listhen": "^0.3.5", + "listhen": "^1.0.0", "standard-version": "^9.5.0", "typescript": "^4.8.4", "unbuild": "^0.9.4", - "vitest": "^0.25.1" + "vitest": "^0.25.2" }, "packageManager": "pnpm@7.15.0" } diff --git a/playground/index.ts b/playground/index.ts index b3ad7447..16409979 100644 --- a/playground/index.ts +++ b/playground/index.ts @@ -1,15 +1,17 @@ -import { $fetch } from '../src/node' +import { $fetch } from "../src/node"; async function main () { // const r = await $fetch('http://google.com/404') - const r = await $fetch('http://httpstat.us/500') + const r = await $fetch("http://httpstat.us/500"); // const r = await $fetch('http://httpstat/500') // eslint-disable-next-line no-console - console.log(r) + console.log(r); } -main().catch((err) => { +// eslint-disable-next-line unicorn/prefer-top-level-await +main().catch((error) => { // eslint-disable-next-line no-console - console.error(err) - process.exit(1) -}) + console.error(error); + // eslint-disable-next-line unicorn/no-process-exit + process.exit(1); +}); diff --git a/playground/undici.ts b/playground/undici.ts index b574a74b..801e23e4 100644 --- a/playground/undici.ts +++ b/playground/undici.ts @@ -1,13 +1,15 @@ -import { $fetch } from '../src/undici' +import { $fetch } from "../src/undici"; async function main () { - const r = await $fetch('http://google.com/404') + const r = await $fetch("http://google.com/404"); // eslint-disable-next-line no-console - console.log(r) + console.log(r); } -main().catch((err) => { +// eslint-disable-next-line unicorn/prefer-top-level-await +main().catch((error) => { // eslint-disable-next-line no-console - console.error(err) - process.exit(1) -}) + console.error(error); + // eslint-disable-next-line unicorn/no-process-exit + process.exit(1); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d4fc5d6..c1d2a5e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,44 +1,44 @@ lockfileVersion: 5.4 specifiers: - '@nuxtjs/eslint-config-typescript': ^11.0.0 '@types/node': ^18.11.9 - '@vitest/coverage-c8': ^0.25.1 - destr: ^1.2.0 + '@vitest/coverage-c8': ^0.25.2 + destr: ^1.2.1 eslint: ^8.27.0 + eslint-config-unjs: ^0.0.2 fetch-blob: ^3.2.0 formdata-polyfill: ^4.0.10 - h3: ^0.8.6 + h3: ^1.0.1 jiti: ^1.16.0 - listhen: ^0.3.5 - node-fetch-native: ^0.1.8 + listhen: ^1.0.0 + node-fetch-native: ^1.0.1 standard-version: ^9.5.0 typescript: ^4.8.4 - ufo: ^0.8.6 + ufo: ^1.0.0 unbuild: ^0.9.4 undici: ^5.12.0 - vitest: ^0.25.1 + vitest: ^0.25.2 dependencies: - destr: 1.2.0 - node-fetch-native: 0.1.8 - ufo: 0.8.6 + destr: 1.2.1 + node-fetch-native: 1.0.1 + ufo: 1.0.0 undici: 5.12.0 devDependencies: - '@nuxtjs/eslint-config-typescript': 11.0.0_rmayb2veg2btbq6mbmnyivgasy '@types/node': 18.11.9 - '@vitest/coverage-c8': 0.25.1 + '@vitest/coverage-c8': 0.25.2 eslint: 8.27.0 + eslint-config-unjs: 0.0.2_rmayb2veg2btbq6mbmnyivgasy fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - h3: 0.8.6 + h3: 1.0.1 jiti: 1.16.0 - listhen: 0.3.5 + listhen: 1.0.0 standard-version: 9.5.0 typescript: 4.8.4 unbuild: 0.9.4 - vitest: 0.25.1 + vitest: 0.25.2 packages: @@ -376,43 +376,6 @@ packages: fastq: 1.13.0 dev: true - /@nuxtjs/eslint-config-typescript/11.0.0_rmayb2veg2btbq6mbmnyivgasy: - resolution: {integrity: sha512-hmFjGtXT524ql8eTbK8BaRkamcXB6Z8YOW8nSQhosTP6oBw9WtOFUeWr7holyE278UhOmx+wDFG90BnyM9D+UA==} - peerDependencies: - eslint: ^8.23.0 - dependencies: - '@nuxtjs/eslint-config': 11.0.0_ajbad3l2v57vuowpeagyjni6bq - '@typescript-eslint/eslint-plugin': 5.37.0_ymkbr3nuo4vvn3qsoxelgqgmve - '@typescript-eslint/parser': 5.37.0_rmayb2veg2btbq6mbmnyivgasy - eslint: 8.27.0 - eslint-import-resolver-typescript: 3.5.1_dcpv4nbdr5ks2h5677xdltrk6e - eslint-plugin-import: 2.26.0_ajbad3l2v57vuowpeagyjni6bq - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - - typescript - dev: true - - /@nuxtjs/eslint-config/11.0.0_ajbad3l2v57vuowpeagyjni6bq: - resolution: {integrity: sha512-o4zFOpU8gJgwrC/gLE7c2E0XEjkv2fEixCGG1y+dZYzBPyzTorkQmfxskSF3WRXcZkpkS9uUYlRkeOSdYB7z0w==} - peerDependencies: - eslint: ^8.23.0 - dependencies: - eslint: 8.27.0 - eslint-config-standard: 17.0.0_yqvjeq2xzul43p26zlvfoiu3rm - eslint-plugin-import: 2.26.0_ajbad3l2v57vuowpeagyjni6bq - eslint-plugin-n: 15.2.5_eslint@8.27.0 - eslint-plugin-node: 11.1.0_eslint@8.27.0 - eslint-plugin-promise: 6.0.1_eslint@8.27.0 - eslint-plugin-unicorn: 43.0.2_eslint@8.27.0 - eslint-plugin-vue: 9.5.1_eslint@8.27.0 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /@pkgr/utils/2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -422,7 +385,7 @@ packages: open: 8.4.0 picocolors: 1.0.0 tiny-glob: 0.2.9 - tslib: 2.4.0 + tslib: 2.4.1 dev: true /@rollup/plugin-alias/4.0.0_rollup@3.2.0: @@ -566,8 +529,12 @@ packages: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} dev: true - /@typescript-eslint/eslint-plugin/5.37.0_ymkbr3nuo4vvn3qsoxelgqgmve: - resolution: {integrity: sha512-Fde6W0IafXktz1UlnhGkrrmnnGpAo1kyX7dnyHHVrmwJOn72Oqm3eYtddrpOwwel2W8PAK9F3pIL5S+lfoM0og==} + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@typescript-eslint/eslint-plugin/5.43.0_yy4vf4gcvxiubmg7fqa55dqe2i: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -577,14 +544,14 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.37.0_rmayb2veg2btbq6mbmnyivgasy - '@typescript-eslint/scope-manager': 5.37.0 - '@typescript-eslint/type-utils': 5.37.0_rmayb2veg2btbq6mbmnyivgasy - '@typescript-eslint/utils': 5.37.0_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/parser': 5.43.0_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/utils': 5.43.0_rmayb2veg2btbq6mbmnyivgasy debug: 4.3.4 eslint: 8.27.0 - functional-red-black-tree: 1.0.1 ignore: 5.2.0 + natural-compare-lite: 1.4.0 regexpp: 3.2.0 semver: 7.3.7 tsutils: 3.21.0_typescript@4.8.4 @@ -593,8 +560,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.37.0_rmayb2veg2btbq6mbmnyivgasy: - resolution: {integrity: sha512-01VzI/ipYKuaG5PkE5+qyJ6m02fVALmMPY3Qq5BHflDx3y4VobbLdHQkSMg9VPRS4KdNt4oYTMaomFoHonBGAw==} + /@typescript-eslint/parser/5.43.0_rmayb2veg2btbq6mbmnyivgasy: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -603,9 +570,9 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.37.0 - '@typescript-eslint/types': 5.37.0 - '@typescript-eslint/typescript-estree': 5.37.0_typescript@4.8.4 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 debug: 4.3.4 eslint: 8.27.0 typescript: 4.8.4 @@ -613,16 +580,16 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.37.0: - resolution: {integrity: sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==} + /@typescript-eslint/scope-manager/5.43.0: + resolution: {integrity: sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.37.0 - '@typescript-eslint/visitor-keys': 5.37.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/visitor-keys': 5.43.0 dev: true - /@typescript-eslint/type-utils/5.37.0_rmayb2veg2btbq6mbmnyivgasy: - resolution: {integrity: sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==} + /@typescript-eslint/type-utils/5.43.0_rmayb2veg2btbq6mbmnyivgasy: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -631,8 +598,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.37.0_typescript@4.8.4 - '@typescript-eslint/utils': 5.37.0_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.43.0_rmayb2veg2btbq6mbmnyivgasy debug: 4.3.4 eslint: 8.27.0 tsutils: 3.21.0_typescript@4.8.4 @@ -641,13 +608,13 @@ packages: - supports-color dev: true - /@typescript-eslint/types/5.37.0: - resolution: {integrity: sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==} + /@typescript-eslint/types/5.43.0: + resolution: {integrity: sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.37.0_typescript@4.8.4: - resolution: {integrity: sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==} + /@typescript-eslint/typescript-estree/5.43.0_typescript@4.8.4: + resolution: {integrity: sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -655,8 +622,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.37.0 - '@typescript-eslint/visitor-keys': 5.37.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/visitor-keys': 5.43.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -667,37 +634,39 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.37.0_rmayb2veg2btbq6mbmnyivgasy: - resolution: {integrity: sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==} + /@typescript-eslint/utils/5.43.0_rmayb2veg2btbq6mbmnyivgasy: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.37.0 - '@typescript-eslint/types': 5.37.0 - '@typescript-eslint/typescript-estree': 5.37.0_typescript@4.8.4 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 eslint: 8.27.0 eslint-scope: 5.1.1 eslint-utils: 3.0.0_eslint@8.27.0 + semver: 7.3.7 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.37.0: - resolution: {integrity: sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==} + /@typescript-eslint/visitor-keys/5.43.0: + resolution: {integrity: sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.37.0 + '@typescript-eslint/types': 5.43.0 eslint-visitor-keys: 3.3.0 dev: true - /@vitest/coverage-c8/0.25.1: - resolution: {integrity: sha512-gpl5QNaNeIN0mfRiosCqBFoZcizb5GA458TDnOQXkGDc4kklazxn70u9evGfV62wiiAUfGGebgRhxlBkAa6m6g==} + /@vitest/coverage-c8/0.25.2: + resolution: {integrity: sha512-qKsiUJh3bjbB5Q229CbxEWCqiDBwvIrcZ9OOuQdMEC0pce3/LlTUK3+K3hd7WqAYEbbiqXfC5MVMKHZkV82PgA==} dependencies: c8: 7.12.0 - vitest: 0.25.1 + vitest: 0.25.2 transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -782,14 +751,14 @@ packages: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-includes/3.1.4: - resolution: {integrity: sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==} + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 - es-abstract: 1.19.4 - get-intrinsic: 1.1.1 + define-properties: 1.1.4 + es-abstract: 1.20.4 + get-intrinsic: 1.1.3 is-string: 1.0.7 dev: true @@ -798,13 +767,13 @@ packages: engines: {node: '>=8'} dev: true - /array.prototype.flat/1.3.0: - resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 - es-abstract: 1.19.4 + define-properties: 1.1.4 + es-abstract: 1.20.4 es-shim-unscopables: 1.0.0 dev: true @@ -821,10 +790,6 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /boolbase/1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -868,7 +833,7 @@ packages: /builtins/5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.3.7 + semver: 7.3.8 dev: true /busboy/1.6.0: @@ -901,7 +866,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.1 + get-intrinsic: 1.1.3 dev: true /callsites/3.1.0: @@ -966,8 +931,9 @@ packages: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true - /ci-info/3.4.0: - resolution: {integrity: sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==} + /ci-info/3.6.1: + resolution: {integrity: sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==} + engines: {node: '>=8'} dev: true /clean-regexp/1.0.0: @@ -1236,12 +1202,6 @@ packages: which: 2.0.2 dev: true - /cssesc/3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -1270,7 +1230,7 @@ packages: supports-color: optional: true dependencies: - ms: 2.1.3 + ms: 2.1.2 dev: true /debug/4.3.4: @@ -1319,10 +1279,11 @@ packages: engines: {node: '>=8'} dev: true - /define-properties/1.1.3: - resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} engines: {node: '>= 0.4'} dependencies: + has-property-descriptors: 1.0.0 object-keys: 1.1.1 dev: true @@ -1330,8 +1291,12 @@ packages: resolution: {integrity: sha512-pOFYRTIhoKujrmbTRhcW5lYQLBXw/dlTwfI8IguF1QCDJOcJzNH1w+YFjxqy6BAuJrClTy6MUE8q+oKJ2FLsIw==} dev: true - /destr/1.2.0: - resolution: {integrity: sha512-JG+cG4ZPB1L27sl2C2URg8MIOmIUtTbE5wEx02BpmrTCqg/hXxFKXsYsnODl5PdpqNRaS1KQGUQ56V8jk8XpYQ==} + /defu/6.1.1: + resolution: {integrity: sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==} + dev: true + + /destr/1.2.1: + resolution: {integrity: sha512-ud8w0qMLlci6iFG7CNgeRr8OcbUWMsbfjtWft1eJ5Luqrz/M8Ebqk/KCzne8rKUlIQWWfLv0wD6QHrqOf4GshA==} /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} @@ -1401,30 +1366,34 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract/1.19.4: - resolution: {integrity: sha512-flV8e5g9/xulChMG48Fygk1ptpo4lQRJ0eJYtxJFgi7pklLx7EFcOJ34jnvr8pbWlaFN/AT1cZpe0hiFel9Hqg==} + /es-abstract/1.20.4: + resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 es-to-primitive: 1.2.1 function-bind: 1.1.1 - get-intrinsic: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.3 get-symbol-description: 1.0.0 has: 1.0.3 + has-property-descriptors: 1.0.0 has-symbols: 1.0.3 internal-slot: 1.0.3 - is-callable: 1.2.4 + is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 is-weakref: 1.0.2 - object-inspect: 1.12.0 + object-inspect: 1.12.2 object-keys: 1.1.1 - object.assign: 4.1.2 - string.prototype.trimend: 1.0.4 - string.prototype.trimstart: 1.0.4 - unbox-primitive: 1.0.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + unbox-primitive: 1.0.2 dev: true /es-shim-unscopables/1.0.0: @@ -1437,7 +1406,7 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: - is-callable: 1.2.4 + is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 dev: true @@ -1876,7 +1845,16 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-standard/17.0.0_yqvjeq2xzul43p26zlvfoiu3rm: + /eslint-config-prettier/8.5.0_eslint@8.27.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.27.0 + dev: true + + /eslint-config-standard/17.0.0_qmmcbu32ybj7ict4ieqqyvwr3m: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -1885,9 +1863,32 @@ packages: eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.27.0 - eslint-plugin-import: 2.26.0_ajbad3l2v57vuowpeagyjni6bq - eslint-plugin-n: 15.2.5_eslint@8.27.0 - eslint-plugin-promise: 6.0.1_eslint@8.27.0 + eslint-plugin-import: 2.26.0_bbzxof3vtngyannf3l4jlcflvy + eslint-plugin-n: 15.5.1_eslint@8.27.0 + eslint-plugin-promise: 6.1.1_eslint@8.27.0 + dev: true + + /eslint-config-unjs/0.0.2_rmayb2veg2btbq6mbmnyivgasy: + resolution: {integrity: sha512-6zhni5Fdlpu/DJ+hfcbNEqmUixhGujBQXXB7N9SdZcvh135RlFTNoqor7sowP1ttd0lDY4lTewUzUjXSOVB7Ww==} + peerDependencies: + eslint: '*' + typescript: '*' + dependencies: + '@typescript-eslint/eslint-plugin': 5.43.0_yy4vf4gcvxiubmg7fqa55dqe2i + '@typescript-eslint/parser': 5.43.0_rmayb2veg2btbq6mbmnyivgasy + eslint: 8.27.0 + eslint-config-prettier: 8.5.0_eslint@8.27.0 + eslint-config-standard: 17.0.0_qmmcbu32ybj7ict4ieqqyvwr3m + eslint-import-resolver-typescript: 3.5.2_dcpv4nbdr5ks2h5677xdltrk6e + eslint-plugin-import: 2.26.0_bbzxof3vtngyannf3l4jlcflvy + eslint-plugin-n: 15.5.1_eslint@8.27.0 + eslint-plugin-node: 11.1.0_eslint@8.27.0 + eslint-plugin-promise: 6.1.1_eslint@8.27.0 + eslint-plugin-unicorn: 43.0.2_eslint@8.27.0 + typescript: 4.8.4 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color dev: true /eslint-import-resolver-node/0.3.6: @@ -1899,9 +1900,9 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript/3.5.1_dcpv4nbdr5ks2h5677xdltrk6e: - resolution: {integrity: sha512-U7LUjNJPYjNsHvAUAkt/RU3fcTSpbllA0//35B4eLYTX74frmOepbt7F7J3D1IGtj9k21buOpaqtDd4ZlS/BYQ==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + /eslint-import-resolver-typescript/3.5.2_dcpv4nbdr5ks2h5677xdltrk6e: + resolution: {integrity: sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -1909,7 +1910,7 @@ packages: debug: 4.3.4 enhanced-resolve: 5.10.0 eslint: 8.27.0 - eslint-plugin-import: 2.26.0_ajbad3l2v57vuowpeagyjni6bq + eslint-plugin-import: 2.26.0_bbzxof3vtngyannf3l4jlcflvy get-tsconfig: 4.2.0 globby: 13.1.2 is-core-module: 2.10.0 @@ -1919,17 +1920,20 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.3_yotz5rgxbsebaglktiy7k3y6ua: - resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + /eslint-module-utils/2.7.4_algk2ee5wzunqscd2r3nujqfhi: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' + eslint: '*' eslint-import-resolver-node: '*' eslint-import-resolver-typescript: '*' eslint-import-resolver-webpack: '*' peerDependenciesMeta: '@typescript-eslint/parser': optional: true + eslint: + optional: true eslint-import-resolver-node: optional: true eslint-import-resolver-typescript: @@ -1937,11 +1941,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.37.0_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/parser': 5.43.0_rmayb2veg2btbq6mbmnyivgasy debug: 3.2.7 + eslint: 8.27.0 eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 3.5.1_dcpv4nbdr5ks2h5677xdltrk6e - find-up: 2.1.0 + eslint-import-resolver-typescript: 3.5.2_dcpv4nbdr5ks2h5677xdltrk6e transitivePeerDependencies: - supports-color dev: true @@ -1968,7 +1972,7 @@ packages: regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.26.0_ajbad3l2v57vuowpeagyjni6bq: + /eslint-plugin-import/2.26.0_bbzxof3vtngyannf3l4jlcflvy: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -1978,19 +1982,19 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.37.0_rmayb2veg2btbq6mbmnyivgasy - array-includes: 3.1.4 - array.prototype.flat: 1.3.0 + '@typescript-eslint/parser': 5.43.0_rmayb2veg2btbq6mbmnyivgasy + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.27.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_yotz5rgxbsebaglktiy7k3y6ua + eslint-module-utils: 2.7.4_algk2ee5wzunqscd2r3nujqfhi has: 1.0.3 is-core-module: 2.10.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.5 + object.values: 1.1.6 resolve: 1.22.1 tsconfig-paths: 3.14.1 transitivePeerDependencies: @@ -1999,8 +2003,8 @@ packages: - supports-color dev: true - /eslint-plugin-n/15.2.5_eslint@8.27.0: - resolution: {integrity: sha512-8+BYsqiyZfpu6NXmdLOXVUfk8IocpCjpd8nMRRH0A9ulrcemhb2VI9RSJMEy5udx++A/YcVPD11zT8hpFq368g==} + /eslint-plugin-n/15.5.1_eslint@8.27.0: + resolution: {integrity: sha512-kAd+xhZm7brHoFLzKLB7/FGRFJNg/srmv67mqb7tto22rpr4wv/LV6RuXzAfv3jbab7+k1wi42PsIhGviywaaw==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' @@ -2010,10 +2014,10 @@ packages: eslint-plugin-es: 4.1.0_eslint@8.27.0 eslint-utils: 3.0.0_eslint@8.27.0 ignore: 5.2.0 - is-core-module: 2.10.0 + is-core-module: 2.11.0 minimatch: 3.1.2 resolve: 1.22.1 - semver: 7.3.7 + semver: 7.3.8 dev: true /eslint-plugin-node/11.1.0_eslint@8.27.0: @@ -2031,8 +2035,8 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-promise/6.0.1_eslint@8.27.0: - resolution: {integrity: sha512-uM4Tgo5u3UWQiroOyDEsYcVMOo7re3zmno0IZmB5auxoaQNIceAbXEkSt8RNrKtaYehARHG06pYK6K1JhtP0Zw==} + /eslint-plugin-promise/6.1.1_eslint@8.27.0: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2047,7 +2051,7 @@ packages: eslint: '>=8.18.0' dependencies: '@babel/helper-validator-identifier': 7.19.1 - ci-info: 3.4.0 + ci-info: 3.6.1 clean-regexp: 1.0.0 eslint: 8.27.0 eslint-utils: 3.0.0_eslint@8.27.0 @@ -2063,24 +2067,6 @@ packages: strip-indent: 3.0.0 dev: true - /eslint-plugin-vue/9.5.1_eslint@8.27.0: - resolution: {integrity: sha512-Y0sL2RY7Xc9S8kNih9lbwHIDmewUg9bfas6WSzsOWRgDXhIHKxRBZYNAnVcXBFfE+bMWHUA5GLChl7TcTYUI8w==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 - dependencies: - eslint: 8.27.0 - eslint-utils: 3.0.0_eslint@8.27.0 - natural-compare: 1.4.0 - nth-check: 2.0.1 - postcss-selector-parser: 6.0.10 - semver: 7.3.7 - vue-eslint-parser: 9.1.0_eslint@8.27.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-scope/5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -2378,8 +2364,18 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true /gensync/1.0.0-beta.2: @@ -2396,8 +2392,8 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic/1.1.1: - resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} + /get-intrinsic/1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -2431,7 +2427,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.1 + get-intrinsic: 1.1.3 dev: true /get-tsconfig/4.2.0: @@ -2560,13 +2556,13 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /h3/0.8.6: - resolution: {integrity: sha512-CSWNOKa3QGo67rFU2PhbFTp0uPJtilNji2Z0pMiSRQt3+OkIW0u3E1WMJqIycLqaTgb9JyFqH/S4mcTyyGtvyQ==} + /h3/1.0.1: + resolution: {integrity: sha512-gDCGpRvjchZW2JBlTqbJ9IOs+mdkXXuwSQkSye+jubHAv/UhdamKqoQvd4RFgyBNjHSId8Y+b10UdTcPlP/V+w==} dependencies: cookie-es: 0.5.0 - destr: 1.2.0 - radix3: 0.2.1 - ufo: 0.8.6 + destr: 1.2.1 + radix3: 1.0.0 + ufo: 1.0.0 dev: true /handlebars/4.7.7: @@ -2587,8 +2583,8 @@ packages: engines: {node: '>=6'} dev: true - /has-bigints/1.0.1: - resolution: {integrity: sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==} + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true /has-flag/3.0.0: @@ -2601,6 +2597,12 @@ packages: engines: {node: '>=8'} dev: true + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.1.3 + dev: true + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -2691,7 +2693,7 @@ packages: resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.1 + get-intrinsic: 1.1.3 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -2708,7 +2710,7 @@ packages: /is-bigint/1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: - has-bigints: 1.0.1 + has-bigints: 1.0.2 dev: true /is-boolean-object/1.1.2: @@ -2726,8 +2728,8 @@ packages: builtin-modules: 3.3.0 dev: true - /is-callable/1.2.4: - resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true @@ -2737,6 +2739,12 @@ packages: has: 1.0.3 dev: true + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -2985,17 +2993,17 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true - /listhen/0.3.5: - resolution: {integrity: sha512-suyt79hNmCFeBIyftcLqLPfYiXeB795gSUWOJT7nspl2IvREY0Q9xvchLhekxvQ0KiOPvWoyALnc9Mxoelm0Pw==} + /listhen/1.0.0: + resolution: {integrity: sha512-frdf7TVqT/JSHzRjEuo/vWIgbBYzEuY3oeTq8Yv1XkQVTKDPs2M4yotXICqYZYj2QxbkqKssSo8Wa6QCtBnFhg==} dependencies: clipboardy: 3.0.0 colorette: 2.0.19 - defu: 6.1.0 + defu: 6.1.1 get-port-please: 2.6.1 http-shutdown: 1.2.2 ip-regex: 5.0.0 node-forge: 1.3.1 - ufo: 0.8.6 + ufo: 1.0.0 dev: true /load-json-file/4.0.0: @@ -3214,16 +3222,16 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /ms/2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -3237,8 +3245,8 @@ packages: engines: {node: '>=10.5.0'} dev: true - /node-fetch-native/0.1.8: - resolution: {integrity: sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==} + /node-fetch-native/1.0.1: + resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} dev: false /node-forge/1.3.1: @@ -3276,14 +3284,8 @@ packages: path-key: 3.1.1 dev: true - /nth-check/2.0.1: - resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /object-inspect/1.12.0: - resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==} + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: true /object-keys/1.1.1: @@ -3291,23 +3293,23 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign/4.1.2: - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 + define-properties: 1.1.4 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true - /object.values/1.1.5: - resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 - es-abstract: 1.19.4 + define-properties: 1.1.4 + es-abstract: 1.20.4 dev: true /once/1.4.0: @@ -3508,14 +3510,6 @@ packages: engines: {node: '>=4'} dev: true - /postcss-selector-parser/6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - /postcss/8.4.17: resolution: {integrity: sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==} engines: {node: ^10 || ^12 || >=14} @@ -3558,8 +3552,8 @@ packages: engines: {node: '>=8'} dev: true - /radix3/0.2.1: - resolution: {integrity: sha512-FnhArTl5Tq7dodiLeSPKrDUyCQuJqEncP8cKdyy399g8F/cz7GH6FmzA3Rkosu2IZMkpswFFwXfb2ERSiL06pg==} + /radix3/1.0.0: + resolution: {integrity: sha512-6n3AEXth91ASapMVKiEh2wrbFJmI+NBilrWE0AbiGgfm0xet0QXC8+a3K19r1UVYjUjctUgB053c3V/J6V0kCQ==} dev: true /read-pkg-up/3.0.0: @@ -3632,6 +3626,15 @@ packages: hasBin: true dev: true + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + functions-have-names: 1.2.3 + dev: true + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -3712,6 +3715,14 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + is-regex: 1.1.4 + dev: true + /safe-regex/2.1.1: resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} dependencies: @@ -3740,6 +3751,14 @@ packages: lru-cache: 6.0.0 dev: true + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /shebang-command/2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3756,8 +3775,8 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.1 - object-inspect: 1.12.0 + get-intrinsic: 1.1.3 + object-inspect: 1.12.2 dev: true /signal-exit/3.0.7: @@ -3857,18 +3876,20 @@ packages: strip-ansi: 6.0.1 dev: true - /string.prototype.trimend/1.0.4: - resolution: {integrity: sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==} + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 + define-properties: 1.1.4 + es-abstract: 1.20.4 dev: true - /string.prototype.trimstart/1.0.4: - resolution: {integrity: sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==} + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.3 + define-properties: 1.1.4 + es-abstract: 1.20.4 dev: true /string_decoder/1.1.1: @@ -3946,7 +3967,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/utils': 2.3.1 - tslib: 2.4.0 + tslib: 2.4.1 dev: true /tapable/2.2.1: @@ -4040,8 +4061,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + /tslib/2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} dev: true /tsutils/3.21.0_typescript@4.8.4: @@ -4098,6 +4119,10 @@ packages: /ufo/0.8.6: resolution: {integrity: sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==} + dev: true + + /ufo/1.0.0: + resolution: {integrity: sha512-DRty0ZBNlJ2R59y4mEupJRKLbkLQsc4qtxjpQv78AwEDuBkaUogMc2LkeqW3HddFlw6NwnXYfdThEZOiNgkmmQ==} /uglify-js/3.15.4: resolution: {integrity: sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA==} @@ -4107,11 +4132,11 @@ packages: dev: true optional: true - /unbox-primitive/1.0.1: - resolution: {integrity: sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==} + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - function-bind: 1.1.1 - has-bigints: 1.0.1 + call-bind: 1.0.2 + has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 dev: true @@ -4238,8 +4263,8 @@ packages: fsevents: 2.3.2 dev: true - /vitest/0.25.1: - resolution: {integrity: sha512-eH74h6MkuEgsqR4mAQZeMK9O0PROiKY+i+1GMz/fBi5A3L2ml5U7JQs7LfPU7+uWUziZyLHagl+rkyfR8SLhlA==} + /vitest/0.25.2: + resolution: {integrity: sha512-qqkzfzglEFbQY7IGkgSJkdOhoqHjwAao/OrphnHboeYHC5JzsVFoLCaB2lnAy8krhj7sbrFTVRApzpkTOeuDWQ==} engines: {node: '>=v14.16.0'} hasBin: true peerDependencies: @@ -4282,24 +4307,6 @@ packages: - terser dev: true - /vue-eslint-parser/9.1.0_eslint@8.27.0: - resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - dependencies: - debug: 4.3.4 - eslint: 8.27.0 - eslint-scope: 7.1.1 - eslint-visitor-keys: 3.3.0 - espree: 9.4.0 - esquery: 1.4.0 - lodash: 4.17.21 - semver: 7.3.7 - transitivePeerDependencies: - - supports-color - dev: true - /web-streams-polyfill/3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} @@ -4345,11 +4352,6 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /xml-name-validator/4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - dev: true - /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} diff --git a/renovate.json b/renovate.json index 217d8217..a9971c80 100644 --- a/renovate.json +++ b/renovate.json @@ -1,5 +1,5 @@ { "extends": [ - "@nuxtjs" + "github>unjs/renovate-config" ] } diff --git a/src/base.ts b/src/base.ts index 82ee1866..0d7ec622 100644 --- a/src/base.ts +++ b/src/base.ts @@ -1,2 +1,2 @@ -export * from './fetch' -export * from './error' +export * from "./fetch"; +export * from "./error"; diff --git a/src/error.ts b/src/error.ts index 81db8811..24151904 100644 --- a/src/error.ts +++ b/src/error.ts @@ -1,34 +1,34 @@ -import type { FetchRequest, FetchResponse } from './fetch' +import type { FetchRequest, FetchResponse } from "./fetch"; export class FetchError extends Error { - name: 'FetchError' = 'FetchError' - request?: FetchRequest - response?: FetchResponse - data?: T - status?: number - statusText?: string - statusCode?: number - statusMessage?: string + name: "FetchError" = "FetchError"; + request?: FetchRequest; + response?: FetchResponse; + data?: T; + status?: number; + statusText?: string; + statusCode?: number; + statusMessage?: string; } export function createFetchError (request: FetchRequest, error?: Error, response?: FetchResponse): FetchError { - let message = '' + let message = ""; if (request && response) { - message = `${response.status} ${response.statusText} (${request.toString()})` + message = `${response.status} ${response.statusText} (${request.toString()})`; } if (error) { - message = `${error.message} (${message})` + message = `${error.message} (${message})`; } - const fetchError: FetchError = new FetchError(message) + const fetchError: FetchError = new FetchError(message); - Object.defineProperty(fetchError, 'request', { get () { return request } }) - Object.defineProperty(fetchError, 'response', { get () { return response } }) - Object.defineProperty(fetchError, 'data', { get () { return response && response._data } }) - Object.defineProperty(fetchError, 'status', { get () { return response && response.status } }) - Object.defineProperty(fetchError, 'statusText', { get () { return response && response.statusText } }) - Object.defineProperty(fetchError, 'statusCode', { get () { return response && response.status } }) - Object.defineProperty(fetchError, 'statusMessage', { get () { return response && response.statusText } }) + Object.defineProperty(fetchError, "request", { get () { return request; } }); + Object.defineProperty(fetchError, "response", { get () { return response; } }); + Object.defineProperty(fetchError, "data", { get () { return response && response._data; } }); + Object.defineProperty(fetchError, "status", { get () { return response && response.status; } }); + Object.defineProperty(fetchError, "statusText", { get () { return response && response.statusText; } }); + Object.defineProperty(fetchError, "statusCode", { get () { return response && response.status; } }); + Object.defineProperty(fetchError, "statusMessage", { get () { return response && response.statusText; } }); - return fetchError + return fetchError; } diff --git a/src/fetch.ts b/src/fetch.ts index 321afc4a..e408b8ec 100644 --- a/src/fetch.ts +++ b/src/fetch.ts @@ -1,8 +1,8 @@ -import destr from 'destr' -import { withBase, withQuery } from 'ufo' -import type { Fetch, RequestInfo, RequestInit, Response } from './types' -import { createFetchError } from './error' -import { isPayloadMethod, isJSONSerializable, detectResponseType, ResponseType, MappedType } from './utils' +import destr from "destr"; +import { withBase, withQuery } from "ufo"; +import type { Fetch, RequestInfo, RequestInit, Response } from "./types"; +import { createFetchError } from "./error"; +import { isPayloadMethod, isJSONSerializable, detectResponseType, ResponseType, MappedType } from "./utils"; export interface CreateFetchOptions { // eslint-disable-next-line no-use-before-define @@ -13,7 +13,7 @@ export interface CreateFetchOptions { export type FetchRequest = RequestInfo export interface FetchResponse extends Response { _data?: T } -export interface SearchParams { [key: string]: any } +export interface SearchParameters { [key: string]: any } export interface FetchContext { request: FetchRequest @@ -23,25 +23,25 @@ export interface FetchContext { error?: Error } -export interface FetchOptions extends Omit { +export interface FetchOptions extends Omit { baseURL?: string - body?: RequestInit['body'] | Record - params?: SearchParams - query?: SearchParams + body?: RequestInit["body"] | Record + params?: SearchParameters + query?: SearchParameters parseResponse?: (responseText: string) => any responseType?: R response?: boolean retry?: number | false - onRequest?(ctx: FetchContext): Promise | void - onRequestError?(ctx: FetchContext & { error: Error }): Promise | void - onResponse?(ctx: FetchContext & { response: FetchResponse }): Promise | void - onResponseError?(ctx: FetchContext & { response: FetchResponse }): Promise | void + onRequest?(context: FetchContext): Promise | void + onRequestError?(context: FetchContext & { error: Error }): Promise | void + onResponse?(context: FetchContext & { response: FetchResponse }): Promise | void + onResponseError?(context: FetchContext & { response: FetchResponse }): Promise | void } export interface $Fetch { - (request: FetchRequest, opts?: FetchOptions): Promise> - raw (request: FetchRequest, opts?: FetchOptions): Promise>> + (request: FetchRequest, options?: FetchOptions): Promise> + raw (request: FetchRequest, options?: FetchOptions): Promise>> create (defaults: FetchOptions): $Fetch } @@ -55,123 +55,121 @@ const retryStatusCodes = new Set([ 502, // Bad Gateway 503, // Service Unavailable 504 // Gateway Timeout -]) +]); export function createFetch (globalOptions: CreateFetchOptions): $Fetch { - const { fetch, Headers } = globalOptions + const { fetch, Headers } = globalOptions; - function onError (ctx: FetchContext): Promise> { + function onError (context: FetchContext): Promise> { // Is Abort // If it is an active abort, it will not retry automatically. // https://developer.mozilla.org/en-US/docs/Web/API/DOMException#error_names - const isAbort = (ctx.error && ctx.error.name === 'AbortError') || false + const isAbort = (context.error && context.error.name === "AbortError") || false; // Retry - if (ctx.options.retry !== false && !isAbort) { - const retries = typeof ctx.options.retry === 'number' - ? ctx.options.retry - : (isPayloadMethod(ctx.options.method) ? 0 : 1) + if (context.options.retry !== false && !isAbort) { + const retries = typeof context.options.retry === "number" + ? context.options.retry + : (isPayloadMethod(context.options.method) ? 0 : 1); - const responseCode = (ctx.response && ctx.response.status) || 500 + const responseCode = (context.response && context.response.status) || 500; if (retries > 0 && retryStatusCodes.has(responseCode)) { - return $fetchRaw(ctx.request, { - ...ctx.options, + return $fetchRaw(context.request, { + ...context.options, retry: retries - 1 - }) + }); } } // Throw normalized error - const err = createFetchError(ctx.request, ctx.error, ctx.response) + const error = createFetchError(context.request, context.error, context.response); // Only available on V8 based runtimes (https://v8.dev/docs/stack-trace-api) if (Error.captureStackTrace) { - Error.captureStackTrace(err, $fetchRaw) + Error.captureStackTrace(error, $fetchRaw); } - throw err + throw error; } - const $fetchRaw: $Fetch['raw'] = async function $fetchRaw (_request, _opts = {}) { - const ctx: FetchContext = { + const $fetchRaw: $Fetch["raw"] = async function $fetchRaw (_request, _options = {}) { + const context: FetchContext = { request: _request, - options: { ...globalOptions.defaults, ..._opts }, + options: { ...globalOptions.defaults, ..._options }, response: undefined, error: undefined - } + }; - if (ctx.options.onRequest) { - await ctx.options.onRequest(ctx) + if (context.options.onRequest) { + await context.options.onRequest(context); } - if (typeof ctx.request === 'string') { - if (ctx.options.baseURL) { - ctx.request = withBase(ctx.request, ctx.options.baseURL) + if (typeof context.request === "string") { + if (context.options.baseURL) { + context.request = withBase(context.request, context.options.baseURL); } - if (ctx.options.query || ctx.options.params) { - ctx.request = withQuery(ctx.request, { ...ctx.options.params, ...ctx.options.query }) + if (context.options.query || context.options.params) { + context.request = withQuery(context.request, { ...context.options.params, ...context.options.query }); } - if (ctx.options.body && isPayloadMethod(ctx.options.method)) { - if (isJSONSerializable(ctx.options.body)) { - // Automatically JSON stringify request bodies, when not already a string. - ctx.options.body = typeof ctx.options.body === 'string' - ? ctx.options.body - : JSON.stringify(ctx.options.body) - - // Set Content-Type and Accept headers to application/json by default - // for JSON serializable request bodies. - ctx.options.headers = new Headers(ctx.options.headers) - if (!ctx.options.headers.has('content-type')) { - ctx.options.headers.set('content-type', 'application/json') - } - if (!ctx.options.headers.has('accept')) { - ctx.options.headers.set('accept', 'application/json') - } + if (context.options.body && isPayloadMethod(context.options.method) && isJSONSerializable(context.options.body)) { + // Automatically JSON stringify request bodies, when not already a string. + context.options.body = typeof context.options.body === "string" + ? context.options.body + : JSON.stringify(context.options.body); + + // Set Content-Type and Accept headers to application/json by default + // for JSON serializable request bodies. + context.options.headers = new Headers(context.options.headers); + if (!context.options.headers.has("content-type")) { + context.options.headers.set("content-type", "application/json"); + } + if (!context.options.headers.has("accept")) { + context.options.headers.set("accept", "application/json"); } } } - ctx.response = await fetch(ctx.request, ctx.options as RequestInit).catch(async (error) => { - ctx.error = error - if (ctx.options.onRequestError) { - await ctx.options.onRequestError(ctx as any) + context.response = await fetch(context.request, context.options as RequestInit).catch(async (error) => { + context.error = error; + if (context.options.onRequestError) { + await context.options.onRequestError(context as any); } - return onError(ctx) - }) + return onError(context); + }); const responseType = - (ctx.options.parseResponse ? 'json' : ctx.options.responseType) || - detectResponseType(ctx.response.headers.get('content-type') || '') + (context.options.parseResponse ? "json" : context.options.responseType) || + detectResponseType(context.response.headers.get("content-type") || ""); // We override the `.json()` method to parse the body more securely with `destr` - if (responseType === 'json') { - const data = await ctx.response.text() - const parseFn = ctx.options.parseResponse || destr - ctx.response._data = parseFn(data) - } else if (responseType === 'stream') { - ctx.response._data = ctx.response.body + if (responseType === "json") { + const data = await context.response.text(); + const parseFunction = context.options.parseResponse || destr; + context.response._data = parseFunction(data); + } else if (responseType === "stream") { + context.response._data = context.response.body; } else { - ctx.response._data = await ctx.response[responseType]() + context.response._data = await context.response[responseType](); } - if (ctx.options.onResponse) { - await ctx.options.onResponse(ctx as any) + if (context.options.onResponse) { + await context.options.onResponse(context as any); } - if (ctx.response.status >= 400 && ctx.response.status < 600) { - if (ctx.options.onResponseError) { - await ctx.options.onResponseError(ctx as any) + if (context.response.status >= 400 && context.response.status < 600) { + if (context.options.onResponseError) { + await context.options.onResponseError(context as any); } - return onError(ctx) + return onError(context); } - return ctx.response - } + return context.response; + }; - const $fetch = function $fetch (request, opts) { - return $fetchRaw(request, opts).then(r => r._data) - } as $Fetch + const $fetch = function $fetch (request, options) { + return $fetchRaw(request, options).then(r => r._data); + } as $Fetch; - $fetch.raw = $fetchRaw + $fetch.raw = $fetchRaw; $fetch.create = (defaultOptions = {}) => createFetch({ ...globalOptions, @@ -179,7 +177,7 @@ export function createFetch (globalOptions: CreateFetchOptions): $Fetch { ...globalOptions.defaults, ...defaultOptions } - }) + }); - return $fetch + return $fetch; } diff --git a/src/index.ts b/src/index.ts index 7648bb44..45ae7b07 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,19 +1,19 @@ -import { createFetch } from './base' +import { createFetch } from "./base"; -export * from './base' +export * from "./base"; // ref: https://github.com/tc39/proposal-global const _globalThis = (function () { - if (typeof globalThis !== 'undefined') { return globalThis } - if (typeof self !== 'undefined') { return self } - if (typeof window !== 'undefined') { return window } - if (typeof global !== 'undefined') { return global } - throw new Error('unable to locate global object') -})() + if (typeof globalThis !== "undefined") { return globalThis; } + if (typeof self !== "undefined") { return self; } + if (typeof window !== "undefined") { return window; } + if (typeof global !== "undefined") { return global; } + throw new Error("unable to locate global object"); +})(); export const fetch = _globalThis.fetch || - (() => Promise.reject(new Error('[ohmyfetch] global.fetch is not supported!'))) + (() => Promise.reject(new Error("[ohmyfetch] global.fetch is not supported!"))); -export const Headers = _globalThis.Headers +export const Headers = _globalThis.Headers; -export const $fetch = createFetch({ fetch, Headers }) +export const $fetch = createFetch({ fetch, Headers }); diff --git a/src/node.ts b/src/node.ts index 1c697133..92b9391d 100644 --- a/src/node.ts +++ b/src/node.ts @@ -1,34 +1,34 @@ -import http from 'http' -import https, { AgentOptions } from 'https' -import nodeFetch, { Headers as _Headers } from 'node-fetch-native' +import http from "node:http"; +import https, { AgentOptions } from "node:https"; +import nodeFetch, { Headers as _Headers } from "node-fetch-native"; -import { createFetch } from './base' +import { createFetch } from "./base"; -export * from './base' +export * from "./base"; export function createNodeFetch () { - const useKeepAlive = JSON.parse(process.env.FETCH_KEEP_ALIVE || 'false') + const useKeepAlive = JSON.parse(process.env.FETCH_KEEP_ALIVE || "false"); if (!useKeepAlive) { - return nodeFetch + return nodeFetch; } // https://github.com/node-fetch/node-fetch#custom-agent - const agentOpts: AgentOptions = { keepAlive: true } - const httpAgent = new http.Agent(agentOpts) - const httpsAgent = new https.Agent(agentOpts) + const agentOptions: AgentOptions = { keepAlive: true }; + const httpAgent = new http.Agent(agentOptions); + const httpsAgent = new https.Agent(agentOptions); const nodeFetchOptions = { agent (parsedURL: any) { - return parsedURL.protocol === 'http:' ? httpAgent : httpsAgent + return parsedURL.protocol === "http:" ? httpAgent : httpsAgent; } - } + }; return function nodeFetchWithKeepAlive (input: RequestInfo, init?: RequestInit) { - return (nodeFetch as any)(input, { ...nodeFetchOptions, ...init }) - } + return (nodeFetch as any)(input, { ...nodeFetchOptions, ...init }); + }; } -export const fetch = globalThis.fetch || createNodeFetch() +export const fetch = globalThis.fetch || createNodeFetch(); -export const Headers = globalThis.Headers || _Headers +export const Headers = globalThis.Headers || _Headers; -export const $fetch = createFetch({ fetch, Headers }) +export const $fetch = createFetch({ fetch, Headers }); diff --git a/src/undici.ts b/src/undici.ts index bfef2da6..7f16b4ad 100644 --- a/src/undici.ts +++ b/src/undici.ts @@ -1,11 +1,11 @@ -import { fetch as undiciFetch } from 'undici' -import { createNodeFetch, Headers } from './node' -import { createFetch } from './base' +import { fetch as undiciFetch } from "undici"; +import { createNodeFetch, Headers } from "./node"; +import { createFetch } from "./base"; -export * from './base' +export * from "./base"; -export const fetch = globalThis.fetch || undiciFetch || createNodeFetch() +export const fetch = globalThis.fetch || undiciFetch || createNodeFetch(); -export { Headers } from './node' +export { Headers } from "./node"; -export const $fetch = createFetch({ fetch, Headers }) +export const $fetch = createFetch({ fetch, Headers }); diff --git a/src/utils.ts b/src/utils.ts index 4867d894..2658cf9d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,34 +1,34 @@ -const payloadMethods = new Set(Object.freeze(['PATCH', 'POST', 'PUT', 'DELETE'])) -export function isPayloadMethod (method: string = 'GET') { - return payloadMethods.has(method.toUpperCase()) +const payloadMethods = new Set(Object.freeze(["PATCH", "POST", "PUT", "DELETE"])); +export function isPayloadMethod (method: string = "GET") { + return payloadMethods.has(method.toUpperCase()); } -export function isJSONSerializable (val: any) { - if (val === undefined) { - return false +export function isJSONSerializable (value: any) { + if (value === undefined) { + return false; } - const t = typeof val - if (t === 'string' || t === 'number' || t === 'boolean' || t === null) { - return true + const t = typeof value; + if (t === "string" || t === "number" || t === "boolean" || t === null) { + return true; } - if (t !== 'object') { - return false // bigint, function, symbol, undefined + if (t !== "object") { + return false; // bigint, function, symbol, undefined } - if (Array.isArray(val)) { - return true + if (Array.isArray(value)) { + return true; } - return (val.constructor && val.constructor.name === 'Object') || - typeof val.toJSON === 'function' + return (value.constructor && value.constructor.name === "Object") || + typeof value.toJSON === "function"; } const textTypes = new Set([ - 'image/svg', - 'application/xml', - 'application/xhtml', - 'application/html' -]) + "image/svg", + "application/xml", + "application/xhtml", + "application/html" +]); -const JSON_RE = /^application\/(?:[\w!#$%&*`\-.^~]*\+)?json(;.+)?$/i +const JSON_RE = /^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i; interface ResponseMap { blob: Blob @@ -37,20 +37,20 @@ interface ResponseMap { stream: ReadableStream } -export type ResponseType = keyof ResponseMap | 'json' +export type ResponseType = keyof ResponseMap | "json" export type MappedType = R extends keyof ResponseMap ? ResponseMap[R] : JsonType // This provides reasonable defaults for the correct parser based on Content-Type header. -export function detectResponseType (_contentType = ''): ResponseType { +export function detectResponseType (_contentType = ""): ResponseType { if (!_contentType) { - return 'json' + return "json"; } // Value might look like: `application/json; charset=utf-8` - const contentType = _contentType.split(';').shift()! + const contentType = _contentType.split(";").shift()!; if (JSON_RE.test(contentType)) { - return 'json' + return "json"; } // TODO @@ -58,9 +58,9 @@ export function detectResponseType (_contentType = ''): ResponseType { // return 'stream' // } - if (textTypes.has(contentType) || contentType.startsWith('text/')) { - return 'text' + if (textTypes.has(contentType) || contentType.startsWith("text/")) { + return "text"; } - return 'blob' + return "blob"; } diff --git a/test/index.test.ts b/test/index.test.ts index 304f213a..1f30b5ac 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1,118 +1,118 @@ -import { listen } from 'listhen' -import { getQuery, joinURL } from 'ufo' -import { createApp, eventHandler, readBody, readRawBody, toNodeListener } from 'h3' -import { Blob } from 'fetch-blob' -import { FormData } from 'formdata-polyfill/esm.min.js' -import { describe, beforeEach, afterEach, it, expect } from 'vitest' -import { Headers, $fetch } from '../src/node' - -describe('ohmyfetch', () => { - let listener - const getURL = url => joinURL(listener.url, url) +import { listen } from "listhen"; +import { getQuery, joinURL } from "ufo"; +import { createApp, eventHandler, readBody, readRawBody, toNodeListener } from "h3"; +import { Blob } from "fetch-blob"; +import { FormData } from "formdata-polyfill/esm.min.js"; +import { describe, beforeEach, afterEach, it, expect } from "vitest"; +import { Headers, $fetch } from "../src/node"; + +describe("ohmyfetch", () => { + let listener; + const getURL = url => joinURL(listener.url, url); beforeEach(async () => { const app = createApp() - .use('/ok', eventHandler(() => 'ok')) - .use('/params', eventHandler(event => (getQuery(event.req.url || '')))) - .use('/url', eventHandler(event => event.req.url)) - .use('/post', eventHandler(async event => ({ body: await readBody(event), headers: event.req.headers }))) - .use('/binary', eventHandler((event) => { - event.res.setHeader('Content-Type', 'application/octet-stream') - return new Blob(['binary']) + .use("/ok", eventHandler(() => "ok")) + .use("/params", eventHandler(event => (getQuery(event.req.url || "")))) + .use("/url", eventHandler(event => event.req.url)) + .use("/post", eventHandler(async event => ({ body: await readBody(event), headers: event.req.headers }))) + .use("/binary", eventHandler((event) => { + event.res.setHeader("Content-Type", "application/octet-stream"); + return new Blob(["binary"]); })) - .use('/echo', async event => ({ body: await readRawBody(event) })) - listener = await listen(toNodeListener(app)) - }) + .use("/echo", eventHandler(async event => ({ body: await readRawBody(event) }))); + listener = await listen(toNodeListener(app)); + }); afterEach(async () => { - await listener.close() - }) - - it('ok', async () => { - expect(await $fetch(getURL('ok'))).to.equal('ok') - }) - - it('custom parseResponse', async () => { - let called = 0 - const parser = (r) => { called++; return 'C' + r } - expect(await $fetch(getURL('ok'), { parseResponse: parser })).to.equal('Cok') - expect(called).to.equal(1) - }) - - it('allows specifying FetchResponse method', async () => { - expect(await $fetch(getURL('params?test=true'), { responseType: 'json' })).to.deep.equal({ test: 'true' }) - expect(await $fetch(getURL('params?test=true'), { responseType: 'blob' })).to.be.instanceOf(Blob) - expect(await $fetch(getURL('params?test=true'), { responseType: 'text' })).to.equal('{"test":"true"}') - expect(await $fetch(getURL('params?test=true'), { responseType: 'arrayBuffer' })).to.be.instanceOf(ArrayBuffer) - }) - - it('returns a blob for binary content-type', async () => { - expect(await $fetch(getURL('binary'))).to.be.instanceOf(Blob) - }) - - it('baseURL', async () => { - expect(await $fetch('/x?foo=123', { baseURL: getURL('url') })).to.equal('/x?foo=123') - }) - - it('stringifies posts body automatically', async () => { - const { body } = await $fetch(getURL('post'), { method: 'POST', body: { num: 42 } }) - expect(body).to.deep.eq({ num: 42 }) - - const body2 = (await $fetch(getURL('post'), { method: 'POST', body: [{ num: 42 }, { num: 43 }] })).body - expect(body2).to.deep.eq([{ num: 42 }, { num: 43 }]) + await listener.close(); + }); + + it("ok", async () => { + expect(await $fetch(getURL("ok"))).to.equal("ok"); + }); + + it("custom parseResponse", async () => { + let called = 0; + const parser = (r) => { called++; return "C" + r; }; + expect(await $fetch(getURL("ok"), { parseResponse: parser })).to.equal("Cok"); + expect(called).to.equal(1); + }); + + it("allows specifying FetchResponse method", async () => { + expect(await $fetch(getURL("params?test=true"), { responseType: "json" })).to.deep.equal({ test: "true" }); + expect(await $fetch(getURL("params?test=true"), { responseType: "blob" })).to.be.instanceOf(Blob); + expect(await $fetch(getURL("params?test=true"), { responseType: "text" })).to.equal("{\"test\":\"true\"}"); + expect(await $fetch(getURL("params?test=true"), { responseType: "arrayBuffer" })).to.be.instanceOf(ArrayBuffer); + }); + + it("returns a blob for binary content-type", async () => { + expect(await $fetch(getURL("binary"))).to.be.instanceOf(Blob); + }); + + it("baseURL", async () => { + expect(await $fetch("/x?foo=123", { baseURL: getURL("url") })).to.equal("/x?foo=123"); + }); + + it("stringifies posts body automatically", async () => { + const { body } = await $fetch(getURL("post"), { method: "POST", body: { num: 42 } }); + expect(body).to.deep.eq({ num: 42 }); + + const body2 = (await $fetch(getURL("post"), { method: "POST", body: [{ num: 42 }, { num: 43 }] })).body; + expect(body2).to.deep.eq([{ num: 42 }, { num: 43 }]); const headerFetches = [ - [['X-header', '1']], - { 'x-header': '1' }, - new Headers({ 'x-header': '1' }) - ] + [["X-header", "1"]], + { "x-header": "1" }, + new Headers({ "x-header": "1" }) + ]; for (const sentHeaders of headerFetches) { - const { headers } = await $fetch(getURL('post'), { method: 'POST', body: { num: 42 }, headers: sentHeaders }) - expect(headers).to.include({ 'x-header': '1' }) - expect(headers).to.include({ accept: 'application/json' }) + const { headers } = await $fetch(getURL("post"), { method: "POST", body: { num: 42 }, headers: sentHeaders }); + expect(headers).to.include({ "x-header": "1" }); + expect(headers).to.include({ accept: "application/json" }); } - }) - - it('does not stringify body when content type != application/json', async () => { - const msg = '"Hallo von Pascal"' - const { body } = await $fetch(getURL('echo'), { method: 'POST', body: msg, headers: { 'Content-Type': 'text/plain' } }) - expect(body).to.deep.eq(msg) - }) - - it('Bypass FormData body', async () => { - const data = new FormData() - data.append('foo', 'bar') - const { body } = await $fetch(getURL('post'), { method: 'POST', body: data }) - expect(body).to.include('form-data; name="foo"') - }) - - it('Bypass URLSearchParams body', async () => { - const data = new URLSearchParams({ foo: 'bar' }) - const { body } = await $fetch(getURL('post'), { method: 'POST', body: data }) - expect(body).to.eq('foo=bar') - }) - - it('404', async () => { - const err = await $fetch(getURL('404')).catch(err => err) - expect(err.toString()).to.contain('Cannot find any route matching /404.') - expect(err.data).to.deep.eq({ stack: [], statusCode: 404, statusMessage: 'Cannot find any route matching /404.' }) - expect(err.response?._data).to.deep.eq(err.data) - expect(err.request).to.equal(getURL('404')) - }) - - it('baseURL with retry', async () => { - const err = await $fetch('', { baseURL: getURL('404'), retry: 3 }).catch(err => err) - expect(err.request).to.equal(getURL('404')) - }) - - it('abort with retry', () => { - const controller = new AbortController() + }); + + it("does not stringify body when content type != application/json", async () => { + const message = "\"Hallo von Pascal\""; + const { body } = await $fetch(getURL("echo"), { method: "POST", body: message, headers: { "Content-Type": "text/plain" } }); + expect(body).to.deep.eq(message); + }); + + it("Bypass FormData body", async () => { + const data = new FormData(); + data.append("foo", "bar"); + const { body } = await $fetch(getURL("post"), { method: "POST", body: data }); + expect(body).to.include("form-data; name=\"foo\""); + }); + + it("Bypass URLSearchParams body", async () => { + const data = new URLSearchParams({ foo: "bar" }); + const { body } = await $fetch(getURL("post"), { method: "POST", body: data }); + expect(body).to.eq("foo=bar"); + }); + + it("404", async () => { + const error = await $fetch(getURL("404")).catch(error_ => error_); + expect(error.toString()).to.contain("Cannot find any route matching /404."); + expect(error.data).to.deep.eq({ stack: [], statusCode: 404, statusMessage: "Cannot find any route matching /404." }); + expect(error.response?._data).to.deep.eq(error.data); + expect(error.request).to.equal(getURL("404")); + }); + + it("baseURL with retry", async () => { + const error = await $fetch("", { baseURL: getURL("404"), retry: 3 }).catch(error_ => error_); + expect(error.request).to.equal(getURL("404")); + }); + + it("abort with retry", () => { + const controller = new AbortController(); async function abortHandle () { - controller.abort() - const res = await $fetch('', { baseURL: getURL('ok'), retry: 3, signal: controller.signal }) - console.log('res', res) + controller.abort(); + const response = await $fetch("", { baseURL: getURL("ok"), retry: 3, signal: controller.signal }); + console.log("response", response); } - expect(abortHandle()).rejects.toThrow(/aborted/) - }) -}) + expect(abortHandle()).rejects.toThrow(/aborted/); + }); +}); diff --git a/undici.d.ts b/undici.d.ts index d624b8e2..dc463151 100644 --- a/undici.d.ts +++ b/undici.d.ts @@ -1 +1 @@ -export * from './dist/undici' +export * from "./dist/undici"; diff --git a/vitest.config.ts b/vitest.config.ts index 9614e4b3..7fa63ebb 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,9 +1,9 @@ -import { defineConfig } from 'vitest/config' +import { defineConfig } from "vitest/config"; export default defineConfig({ test: { coverage: { - reporter: ['text', 'clover', 'json'] + reporter: ["text", "clover", "json"] } } -}) +});