From 7a923254ffc8016eeb2494f8bc547113dcca62d0 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 29 Aug 2024 16:03:12 +0100 Subject: [PATCH 01/48] feat: started work on a codemod script --- codemod/codemod.js | 41 +++++++++++++++++++++++++++++++++++++++++ codemod/global.test.cjs | 18 ++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 codemod/codemod.js create mode 100644 codemod/global.test.cjs diff --git a/codemod/codemod.js b/codemod/codemod.js new file mode 100644 index 00000000..71e51af9 --- /dev/null +++ b/codemod/codemod.js @@ -0,0 +1,41 @@ +export default function transformer(file, api) { + const j = api.jscodeshift; + const root = j(file.source); + const fetchMockVariableName = root + .find(j.CallExpression, { + callee: { + name: "require" + }, + arguments: [{ value: "fetch-mock" }] + }) + .closest(j.VariableDeclarator) + .get().value.id.name; + + const usesOfFetchmock = root + .find(j.CallExpression, { + callee: { + object: { + type: "Identifier", + name: fetchMockVariableName + } + } + }) + .map((path) => { + const paths = [path]; + while (path.parentPath.value.type !== "ExpressionStatement") { + path = path.parentPath; + if (path.value.type === "CallExpression") { + paths.push(path); + } + } + return paths; + }) + .forEach((path) => { + const method = path.value.callee.property.name; + if (method === "mock") { + path.value.callee.property.name = "route"; + } + }); + + return root.toSource(); +} diff --git a/codemod/global.test.cjs b/codemod/global.test.cjs new file mode 100644 index 00000000..f020e156 --- /dev/null +++ b/codemod/global.test.cjs @@ -0,0 +1,18 @@ +const fetchMock = require('fetch-mock'); + +describe('describe', () => { + it('single mock', () => { + fetchMock.mock('blah', 200); + }) + + it('double mock', () => { + fetchMock.mock('blah', 200).mock('bloop', 300); + }) + + it('single method', () => { + fetchMock.get('blah', 200) + }) + it('double method', () => { + fetchMock.get('blah', 200).post('blah', 200) + }) +}) From a76cee9887d4e2bd56cdb0564ca787190f028aff Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 17:10:25 +0100 Subject: [PATCH 02/48] feat:set up basic codemods package structure Includes first codemod, conberting .mock() to .route() --- codemod/global.test.cjs | 18 - package-lock.json | 338 +++++++++++++++++- packages/codemods/package.json | 35 ++ .../codemods/src/index.ts | 10 +- 4 files changed, 378 insertions(+), 23 deletions(-) delete mode 100644 codemod/global.test.cjs create mode 100644 packages/codemods/package.json rename codemod/codemod.js => packages/codemods/src/index.ts (90%) diff --git a/codemod/global.test.cjs b/codemod/global.test.cjs deleted file mode 100644 index f020e156..00000000 --- a/codemod/global.test.cjs +++ /dev/null @@ -1,18 +0,0 @@ -const fetchMock = require('fetch-mock'); - -describe('describe', () => { - it('single mock', () => { - fetchMock.mock('blah', 200); - }) - - it('double mock', () => { - fetchMock.mock('blah', 200).mock('bloop', 300); - }) - - it('single method', () => { - fetchMock.get('blah', 200) - }) - it('double method', () => { - fetchMock.get('blah', 200).post('blah', 200) - }) -}) diff --git a/package-lock.json b/package-lock.json index 61178b6e..d827ddc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -955,6 +955,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", + "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", @@ -1393,6 +1407,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", + "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-flow": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", @@ -2110,6 +2139,22 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/preset-flow": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", + "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-flow-strip-types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -2160,6 +2205,133 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/register": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", + "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/register/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/register/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/register/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/register/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", @@ -4093,6 +4265,10 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@fetch-mock/codemods": { + "resolved": "packages/codemods", + "link": true + }, "node_modules/@fetch-mock/core": { "resolved": "packages/core", "link": true @@ -9147,8 +9323,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compare-func": { "version": "2.0.0", @@ -12187,6 +12362,14 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "devOptional": true }, + "node_modules/flow-parser": { + "version": "0.245.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.245.0.tgz", + "integrity": "sha512-xUBkkpIDfDZHAebnDEX65FCVitJUctab82KFmtP5SY4cGly1vbuYNe6Muyp0NLXrgmBChVdoC2T+3/RUHi4Mww==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -15971,6 +16154,57 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "devOptional": true }, + "node_modules/jscodeshift": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-17.0.0.tgz", + "integrity": "sha512-Af+MFsNwLSVO+t4kKjJdJKh6iNbNHfDfFGdyltJ2wUFN3furgbvHguJmB85iou+fY7wbHgI8eiEKpp6doGgtKg==", + "dependencies": { + "@babel/core": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/preset-flow": "^7.24.7", + "@babel/preset-typescript": "^7.24.7", + "@babel/register": "^7.24.6", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.7", + "neo-async": "^2.5.0", + "picocolors": "^1.0.1", + "recast": "^0.23.9", + "temp": "^0.9.4", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + }, + "peerDependenciesMeta": { + "@babel/preset-env": { + "optional": true + } + } + }, + "node_modules/jscodeshift/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/jsdom": { "version": "23.2.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-23.2.0.tgz", @@ -19196,6 +19430,17 @@ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "devOptional": true }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -20119,6 +20364,14 @@ "node": ">=0.10" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -21866,6 +22119,32 @@ "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" }, + "node_modules/recast": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -23806,6 +24085,50 @@ "streamx": "^2.15.0" } }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/terser": { "version": "5.31.6", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", @@ -26190,6 +26513,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "packages/codemods": { + "name": "@fetch-mock/codemods", + "version": "0.0.0", + "license": "MIT", + "dependencies": { + "jscodeshift": "^17.0.0" + }, + "engines": { + "node": ">=18.11.0" + } + }, "packages/core": { "name": "@fetch-mock/core", "version": "0.7.0", diff --git a/packages/codemods/package.json b/packages/codemods/package.json new file mode 100644 index 00000000..fc6f76a1 --- /dev/null +++ b/packages/codemods/package.json @@ -0,0 +1,35 @@ +{ + "name": "@fetch-mock/codemods", + "description": "Codemods for upgrading fetch-mock", + "version": "0.0.0", + "exports": { + "browser": "./src/index.js", + "import": "./src/index.js", + "require": "./dist/commonjs.js", + "types": "./types/index.d.ts" + }, + "main": "./dist/commonjs.js", + "module": "./src/index.js", + "types": "./types/index.d.ts", + "type": "module", + "engines": { + "node": ">=18.11.0" + }, + "repository": { + "directory": "packages/codemods", + "type": "git", + "url": "git+https://github.com/wheresrhys/fetch-mock.git" + }, + "scripts": { + "build": "rm -rf dist && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && node ../../scripts/declare-dist-type.js" + }, + "license": "MIT", + "author": "Rhys Evans", + "bugs": { + "url": "https://github.com/wheresrhys/fetch-mock/issues" + }, + "homepage": "http://www.wheresrhys.co.uk/fetch-mock", + "dependencies": { + "jscodeshift": "^17.0.0" + } +} diff --git a/codemod/codemod.js b/packages/codemods/src/index.ts similarity index 90% rename from codemod/codemod.js rename to packages/codemods/src/index.ts index 71e51af9..5b7a1633 100644 --- a/codemod/codemod.js +++ b/packages/codemods/src/index.ts @@ -1,6 +1,5 @@ -export default function transformer(file, api) { - const j = api.jscodeshift; - const root = j(file.source); +export function codemod(source, j) { + const root = j(source); const fetchMockVariableName = root .find(j.CallExpression, { callee: { @@ -39,3 +38,8 @@ export default function transformer(file, api) { return root.toSource(); } + + +export default function transformer(file, api) { + return codemod(file.source, j); +} From 472525197a6d2ae1d79da21f44915648a50e5a84 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 17:10:52 +0100 Subject: [PATCH 03/48] test: added tests for first codemod --- .../codemods/src/__test__/codemod.test.js | 49 +++++++++++++++++++ packages/codemods/src/index.ts | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/codemods/src/__test__/codemod.test.js diff --git a/packages/codemods/src/__test__/codemod.test.js b/packages/codemods/src/__test__/codemod.test.js new file mode 100644 index 00000000..ef054f65 --- /dev/null +++ b/packages/codemods/src/__test__/codemod.test.js @@ -0,0 +1,49 @@ +import {describe, it, expect} from 'vitest'; +import {codemod} from '../index'; +import jscodeshift from 'jscodeshift'; + +const prependFetchMock = src => `const fetchMock = require('fetch-mock');\n${src}`; + +function expectCodemodResult (src, expected) { + expect(codemod(prependFetchMock(src), jscodeshift)).toEqual(prependFetchMock(expected)) +} + +describe('codemod', () => { + describe('converting mock() to route()', () => { + it('single .mock()', () => { + expectCodemodResult('fetchMock.mock("blah", 200)','fetchMock.route("blah", 200)'); + }); + it('multiple single .mock()', () => { + expectCodemodResult(` + fetchMock.mock("blah", 200); + fetchMock.mock("bloop", 300); + `,` + fetchMock.route("blah", 200); + fetchMock.route("bloop", 300); + `); + }); + it('chained .mock()', () => { + expectCodemodResult(` + fetchMock + .mock("blah", 200) + .mock("bloop", 300) + `,` + fetchMock + .route("blah", 200) + .route("bloop", 300) + `); + }); + it('chained .mock() after other method', () => { + expectCodemodResult(` + fetchMock + .get("blah", 200) + .mock("bloop", 300) + `,` + fetchMock + .get("blah", 200) + .route("bloop", 300) + `); + }); + + }) +}) diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index 5b7a1633..9feb93c7 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -41,5 +41,5 @@ export function codemod(source, j) { export default function transformer(file, api) { - return codemod(file.source, j); + return codemod(file.source, api.j); } From 0c3debf039d052a92de590cce3ca9d772a76a880 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 17:29:29 +0100 Subject: [PATCH 04/48] fix: defined types for codemod --- package-lock.json | 35 ++++++++++++++++++++++++++++++++++ packages/codemods/package.json | 1 + packages/codemods/src/index.ts | 13 +++++++++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index d827ddc6..c26ea48f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6491,6 +6491,40 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jscodeshift": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@types/jscodeshift/-/jscodeshift-0.11.11.tgz", + "integrity": "sha512-d7CAfFGOupj5qCDqMODXxNz2/NwCv/Lha78ZFbnr6qpk3K98iSB8I+ig9ERE2+EeYML352VMRsjPyOpeA+04eQ==", + "dependencies": { + "ast-types": "^0.14.1", + "recast": "^0.20.3" + } + }, + "node_modules/@types/jscodeshift/node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@types/jscodeshift/node_modules/recast": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", + "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", + "dependencies": { + "ast-types": "0.14.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -26518,6 +26552,7 @@ "version": "0.0.0", "license": "MIT", "dependencies": { + "@types/jscodeshift": "^0.11.11", "jscodeshift": "^17.0.0" }, "engines": { diff --git a/packages/codemods/package.json b/packages/codemods/package.json index fc6f76a1..5f0829a8 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -30,6 +30,7 @@ }, "homepage": "http://www.wheresrhys.co.uk/fetch-mock", "dependencies": { + "@types/jscodeshift": "^0.11.11", "jscodeshift": "^17.0.0" } } diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index 9feb93c7..a8141bd5 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -1,4 +1,7 @@ -export function codemod(source, j) { +import type { + JSCodeshift, MemberExpression, Identifier, Transform, FileInfo, API +} from 'jscodeshift'; +export function codemod(source: string, j: JSCodeshift) { const root = j(source); const fetchMockVariableName = root .find(j.CallExpression, { @@ -30,9 +33,11 @@ export function codemod(source, j) { return paths; }) .forEach((path) => { - const method = path.value.callee.property.name; + const callee = path.value.callee as MemberExpression; + const property = callee.property as Identifier; + const method = property.name; if (method === "mock") { - path.value.callee.property.name = "route"; + property.name = "route"; } }); @@ -40,6 +45,6 @@ export function codemod(source, j) { } -export default function transformer(file, api) { +export default function transformer(file: FileInfo, api: API): string { return codemod(file.source, api.j); } From 5577416234798e0c205258c55b1a431f6b6666a8 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 17:34:57 +0100 Subject: [PATCH 05/48] test: test suite for identifying fetch-mock instances --- .../identifying-fetchmock-instances.test.js | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 packages/codemods/src/__test__/identifying-fetchmock-instances.test.js diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js new file mode 100644 index 00000000..28e57151 --- /dev/null +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -0,0 +1,58 @@ +import { describe, it, expect } from 'vitest'; +import { codemod } from '../index'; +import jscodeshift from 'jscodeshift'; + +function expectCodemodResult(src, expected) { + expect(codemod(src, jscodeshift)).toEqual(expected); +} + +describe('identifying fetch-mock instances', () => { + it('cjs require() named fetchMock', () => { + expectCodemodResult( + ` + const fetchMock = require('fetch-mock'); + fetchMock.mock("blah", 200) + `, + ` + const fetchMock = require('fetch-mock'); + fetchMock.route("blah", 200) + `, + ); + }); + it('cjs require() named something else', () => { + expectCodemodResult( + ` + const fetchNot = require('fetch-mock'); + fetchNot.mock("blah", 200) + `, + ` + const fetchNot = require('fetch-mock'); + fetchNot.route("blah", 200) + `, + ); + }); + it('esm import named fetchMock', () => { + expectCodemodResult( + ` + import fetchMock from 'fetch-mock'; + fetchMock.mock("blah", 200) + `, + ` + import fetchMock from 'fetch-mock'; + fetchMock.route("blah", 200) + `, + ); + }); + it('esm import named something else', () => { + expectCodemodResult( + ` + import fetchMock as fetchNot from 'fetch-mock'; + fetchNot.mock("blah", 200) + `, + ` + import fetchMock as fetchNot from 'fetch-mock'; + fetchNot.route("blah", 200) + `, + ); + }); +}); From f981e4d8cc2f323a9679be910145c09e783bfc0f Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 17:52:35 +0100 Subject: [PATCH 06/48] test: sketched out some more test requirements --- .../codemods/src/__test__/codemod.test.js | 49 ----------- .../identifying-fetchmock-instances.test.js | 3 + .../codemods/src/__test__/integration.test.js | 0 .../src/__test__/method-codemods.test.js | 72 ++++++++++++++++ .../src/__test__/option-codemods.test.js | 61 +++++++++++++ packages/codemods/src/index.ts | 86 ++++++++++--------- 6 files changed, 181 insertions(+), 90 deletions(-) delete mode 100644 packages/codemods/src/__test__/codemod.test.js create mode 100644 packages/codemods/src/__test__/integration.test.js create mode 100644 packages/codemods/src/__test__/method-codemods.test.js create mode 100644 packages/codemods/src/__test__/option-codemods.test.js diff --git a/packages/codemods/src/__test__/codemod.test.js b/packages/codemods/src/__test__/codemod.test.js deleted file mode 100644 index ef054f65..00000000 --- a/packages/codemods/src/__test__/codemod.test.js +++ /dev/null @@ -1,49 +0,0 @@ -import {describe, it, expect} from 'vitest'; -import {codemod} from '../index'; -import jscodeshift from 'jscodeshift'; - -const prependFetchMock = src => `const fetchMock = require('fetch-mock');\n${src}`; - -function expectCodemodResult (src, expected) { - expect(codemod(prependFetchMock(src), jscodeshift)).toEqual(prependFetchMock(expected)) -} - -describe('codemod', () => { - describe('converting mock() to route()', () => { - it('single .mock()', () => { - expectCodemodResult('fetchMock.mock("blah", 200)','fetchMock.route("blah", 200)'); - }); - it('multiple single .mock()', () => { - expectCodemodResult(` - fetchMock.mock("blah", 200); - fetchMock.mock("bloop", 300); - `,` - fetchMock.route("blah", 200); - fetchMock.route("bloop", 300); - `); - }); - it('chained .mock()', () => { - expectCodemodResult(` - fetchMock - .mock("blah", 200) - .mock("bloop", 300) - `,` - fetchMock - .route("blah", 200) - .route("bloop", 300) - `); - }); - it('chained .mock() after other method', () => { - expectCodemodResult(` - fetchMock - .get("blah", 200) - .mock("bloop", 300) - `,` - fetchMock - .get("blah", 200) - .route("bloop", 300) - `); - }); - - }) -}) diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js index 28e57151..0bdadd41 100644 --- a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -55,4 +55,7 @@ describe('identifying fetch-mock instances', () => { `, ); }); + // Identify fetch - mock references when mocking node - fetch in jest + // sandbox() instances + // sandbox() instances used by jest / vitest.mock }); diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js new file mode 100644 index 00000000..e69de29b diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js new file mode 100644 index 00000000..63da6be6 --- /dev/null +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -0,0 +1,72 @@ +import { describe, it, expect } from 'vitest'; +import { codemod } from '../index'; +import jscodeshift from 'jscodeshift'; + +const prependFetchMock = (src) => + `const fetchMock = require('fetch-mock');\n${src}`; + +function expectCodemodResult(src, expected) { + expect(codemod(prependFetchMock(src), jscodeshift)).toEqual( + prependFetchMock(expected), + ); +} + +describe('codemods operating on methods', () => { + describe('converting mock() to route()', () => { + //Next to the first one in a file leave a comment explaining that they need to use mockGlobal() too + it('single .mock()', () => { + expectCodemodResult( + 'fetchMock.mock("blah", 200)', + 'fetchMock.route("blah", 200)', + ); + }); + it('multiple single .mock()', () => { + expectCodemodResult( + ` + fetchMock.mock("blah", 200); + fetchMock.mock("bloop", 300); + `, + ` + fetchMock.route("blah", 200); + fetchMock.route("bloop", 300); + `, + ); + }); + it('chained .mock()', () => { + expectCodemodResult( + ` + fetchMock + .mock("blah", 200) + .mock("bloop", 300) + `, + ` + fetchMock + .route("blah", 200) + .route("bloop", 300) + `, + ); + }); + it('chained .mock() after other method', () => { + expectCodemodResult( + ` + fetchMock + .get("blah", 200) + .mock("bloop", 300) + `, + ` + fetchMock + .get("blah", 200) + .route("bloop", 300) + `, + ); + }); + }); + + // .lastUrl() => .callHistory.lastCall()?.url + // .lastOptions() => .callHistory.lastCall()?.options + // .lastResponse() => .callHistory.lastCall()?.response + // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) + // .getAny(), .postAny(), .putAny(), .deleteAny(), .headAny(), .patchAny(), .getAnyOnce(), .postAnyOnce(), .putAnyOnce(), .deleteAnyOnce(), .headAnyOnce(), .patchAnyOnce() => calls to the underlying method + options + // restore() / reset()... once I've decided how to implement these + // lastCall() => try to change uses of this to expect a callLog, but probably just insert a commemnt / error +}); diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js new file mode 100644 index 00000000..f03c71c5 --- /dev/null +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -0,0 +1,61 @@ +import { describe, it, expect } from 'vitest'; +import { codemod } from '../index'; +import jscodeshift from 'jscodeshift'; + +const prependFetchMock = (src) => + `const fetchMock = require('fetch-mock');\n${src}`; + +function expectCodemodResult(src, expected) { + expect(codemod(prependFetchMock(src), jscodeshift)).toEqual( + prependFetchMock(expected), + ); +} + +describe('codemods operating on options', () => { + ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((optionName) => { + describe(optionName, () => { + it('Removes as global option', () => {})[ + ('mock', + 'sticky', + 'once', + 'any', + 'anyOnce', + 'get', + 'getAny', + 'getOnce', + 'getAnyOnce', + 'post', + 'postAny', + 'postOnce', + 'postAnyOnce', + 'put', + 'putAny', + 'putOnce', + 'putAnyOnce', + 'delete', + 'deleteAny', + 'deleteOnce', + 'deleteAnyOnce', + 'head', + 'headAny', + 'headOnce', + 'headAnyOnce', + 'patch', + 'patchAny', + 'patchOnce', + 'patchAnyOnce') + ].forEach((methodName) => { + describe(`when using ${methodName}`, () => { + it(`Removes as option on first parameter of ${methodName}()`, () => {}); + + it(`Removes as option on third parameter of ${methodName}()`, () => {}); + + it(`Removes third parameter of ${methodName}() if no other options remain`, () => {}); + }); + }); + }); + }); + describe('fallbackToNetwork', () => { + // try to replace fallbackToNetwork: always with spyGlobal()... but probably just insert an error / comment that points at the docs + }); +}); diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index a8141bd5..1379256b 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -1,50 +1,54 @@ import type { - JSCodeshift, MemberExpression, Identifier, Transform, FileInfo, API + JSCodeshift, + MemberExpression, + Identifier, + FileInfo, + API, } from 'jscodeshift'; export function codemod(source: string, j: JSCodeshift) { - const root = j(source); - const fetchMockVariableName = root - .find(j.CallExpression, { - callee: { - name: "require" - }, - arguments: [{ value: "fetch-mock" }] - }) - .closest(j.VariableDeclarator) - .get().value.id.name; + const root = j(source); + const fetchMockVariableName = root + .find(j.CallExpression, { + callee: { + name: 'require', + }, + arguments: [{ value: 'fetch-mock' }], + }) + .closest(j.VariableDeclarator) + .get().value.id.name; - const usesOfFetchmock = root - .find(j.CallExpression, { - callee: { - object: { - type: "Identifier", - name: fetchMockVariableName - } - } - }) - .map((path) => { - const paths = [path]; - while (path.parentPath.value.type !== "ExpressionStatement") { - path = path.parentPath; - if (path.value.type === "CallExpression") { - paths.push(path); - } - } - return paths; - }) - .forEach((path) => { - const callee = path.value.callee as MemberExpression; - const property = callee.property as Identifier; - const method = property.name; - if (method === "mock") { - property.name = "route"; - } - }); + const usesOfFetchmock = root.find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + }, + }); - return root.toSource(); -} + usesOfFetchmock + .map((path) => { + const paths = [path]; + while (path.parentPath.value.type !== 'ExpressionStatement') { + path = path.parentPath; + if (path.value.type === 'CallExpression') { + paths.push(path); + } + } + return paths; + }) + .forEach((path) => { + const callee = path.value.callee as MemberExpression; + const property = callee.property as Identifier; + const method = property.name; + if (method === 'mock') { + property.name = 'route'; + } + }); + return root.toSource(); +} export default function transformer(file: FileInfo, api: API): string { - return codemod(file.source, api.j); + return codemod(file.source, api.j); } From 6ec55750ce0eeb1a79ce3559c7d25dbaf9919650 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 18:14:57 +0100 Subject: [PATCH 07/48] feat: first codemod for editing an option implemented --- .../src/__test__/option-codemods.test.js | 87 ++++++++++++------- packages/codemods/src/index.ts | 22 ++++- 2 files changed, 74 insertions(+), 35 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index f03c71c5..95167c61 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -3,7 +3,7 @@ import { codemod } from '../index'; import jscodeshift from 'jscodeshift'; const prependFetchMock = (src) => - `const fetchMock = require('fetch-mock');\n${src}`; + `const fetchMock = require('fetch-mock');${src ? '\n' : ''}${src}`; function expectCodemodResult(src, expected) { expect(codemod(prependFetchMock(src), jscodeshift)).toEqual( @@ -12,38 +12,61 @@ function expectCodemodResult(src, expected) { } describe('codemods operating on options', () => { - ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((optionName) => { + [ + 'overwriteRoutes', + // , + // 'warnOnFallback', 'sendAsJson' + ].forEach((optionName) => { describe(optionName, () => { - it('Removes as global option', () => {})[ - ('mock', - 'sticky', - 'once', - 'any', - 'anyOnce', - 'get', - 'getAny', - 'getOnce', - 'getAnyOnce', - 'post', - 'postAny', - 'postOnce', - 'postAnyOnce', - 'put', - 'putAny', - 'putOnce', - 'putAnyOnce', - 'delete', - 'deleteAny', - 'deleteOnce', - 'deleteAnyOnce', - 'head', - 'headAny', - 'headOnce', - 'headAnyOnce', - 'patch', - 'patchAny', - 'patchOnce', - 'patchAnyOnce') + it('Removes as global option when setting directly as property', () => { + expectCodemodResult(`fetchMock.config.${optionName} = true`, ''); + }); + it('Removes as global option when using Object.assign', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {${optionName}: true})`, + `Object.assign(fetchMock.config, {})`, + ); + }); + it('Removes as global option when using Object.assign alongside other options', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {${optionName}: true, other: 'value'})`, + `Object.assign(fetchMock.config, {other: 'value'})`, + ); + }); + it.skip('Removes as global option when using spread', () => { + // implement if there is demand + }); + + [ + 'mock', + // 'sticky', + // 'once', + // 'any', + // 'anyOnce', + // 'get', + // 'getAny', + // 'getOnce', + // 'getAnyOnce', + // 'post', + // 'postAny', + // 'postOnce', + // 'postAnyOnce', + // 'put', + // 'putAny', + // 'putOnce', + // 'putAnyOnce', + // 'delete', + // 'deleteAny', + // 'deleteOnce', + // 'deleteAnyOnce', + // 'head', + // 'headAny', + // 'headOnce', + // 'headAnyOnce', + // 'patch', + // 'patchAny', + // 'patchOnce', + // 'patchAnyOnce' ].forEach((methodName) => { describe(`when using ${methodName}`, () => { it(`Removes as option on first parameter of ${methodName}()`, () => {}); diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index 1379256b..4bd68560 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -17,7 +17,24 @@ export function codemod(source: string, j: JSCodeshift) { .closest(j.VariableDeclarator) .get().value.id.name; - const usesOfFetchmock = root.find(j.CallExpression, { + const directConfigSets = root.find(j.AssignmentExpression, { + left: { + type: 'MemberExpression', + property: {name: 'overwriteRoutes'}, + object: { + type: 'MemberExpression', + property: {name: 'config'}, + object: { + type: 'Identifier', + name: fetchMockVariableName, + } + } + }, + }).remove(); + + + + const fetchMockMethodCalls = root.find(j.CallExpression, { callee: { object: { type: 'Identifier', @@ -25,8 +42,7 @@ export function codemod(source: string, j: JSCodeshift) { }, }, }); - - usesOfFetchmock + fetchMockMethodCalls .map((path) => { const paths = [path]; while (path.parentPath.value.type !== 'ExpressionStatement') { From f7902051c992c869f34481959fef8e59468a7f6d Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 18:51:02 +0100 Subject: [PATCH 08/48] feat: progress on codemod to alter global options --- .../src/__test__/option-codemods.test.js | 6 ++-- packages/codemods/src/index.ts | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index 95167c61..42a47431 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -24,13 +24,15 @@ describe('codemods operating on options', () => { it('Removes as global option when using Object.assign', () => { expectCodemodResult( `Object.assign(fetchMock.config, {${optionName}: true})`, - `Object.assign(fetchMock.config, {})`, + '', ); }); it('Removes as global option when using Object.assign alongside other options', () => { expectCodemodResult( `Object.assign(fetchMock.config, {${optionName}: true, other: 'value'})`, - `Object.assign(fetchMock.config, {other: 'value'})`, + `Object.assign(fetchMock.config, { + other: 'value' +})`, ); }); it.skip('Removes as global option when using spread', () => { diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index 4bd68560..ec7371df 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -32,6 +32,39 @@ export function codemod(source: string, j: JSCodeshift) { }, }).remove(); + const configSets = root + .find(j.CallExpression, { + callee: { + object: { + type: "Identifier", + name: "Object" + }, + property: { name: "assign" } + } + }) + .filter((path) => { + const firstArg = path.value.arguments[0]; + const secondArg = path.value.arguments[1]; + return ( + firstArg.type === "MemberExpression" && + firstArg.property.name === "config" && + firstArg.object.type === "Identifier" && + firstArg.object.name === fetchMockVariableName + ) && (secondArg.type === 'ObjectExpression' + && secondArg.properties.some(property => property.key.name === 'overwriteRoutes') ); + }) + + configSets.filter((path) => { + const secondArg = path.value.arguments[1]; + return (secondArg.properties.length === 1) + }).remove(); + + configSets.filter((path) => { + const secondArg = path.value.arguments[1]; + return (secondArg.properties.length > 1) + }) + .find(j.Property, { key: { name: "overwriteRoutes" } }).remove() + const fetchMockMethodCalls = root.find(j.CallExpression, { From 23201b0f3ff34f04ae80152847d35d228550ca31 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 20:09:37 +0100 Subject: [PATCH 09/48] feat: more option codemods --- .../src/__test__/option-codemods.test.js | 6 +- packages/codemods/src/index.ts | 102 +++++++++--------- packages/codemods/try.ts | 11 ++ jsconfig.json => tsconfig.json | 3 +- 4 files changed, 64 insertions(+), 58 deletions(-) create mode 100644 packages/codemods/try.ts rename jsconfig.json => tsconfig.json (69%) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index 42a47431..fb6382bf 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -12,11 +12,7 @@ function expectCodemodResult(src, expected) { } describe('codemods operating on options', () => { - [ - 'overwriteRoutes', - // , - // 'warnOnFallback', 'sendAsJson' - ].forEach((optionName) => { + ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((optionName) => { describe(optionName, () => { it('Removes as global option when setting directly as property', () => { expectCodemodResult(`fetchMock.config.${optionName} = true`, ''); diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index ec7371df..7abb22b6 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -17,55 +17,53 @@ export function codemod(source: string, j: JSCodeshift) { .closest(j.VariableDeclarator) .get().value.id.name; - const directConfigSets = root.find(j.AssignmentExpression, { - left: { - type: 'MemberExpression', - property: {name: 'overwriteRoutes'}, - object: { - type: 'MemberExpression', - property: {name: 'config'}, - object: { - type: 'Identifier', - name: fetchMockVariableName, - } - } - }, - }).remove(); - - const configSets = root - .find(j.CallExpression, { - callee: { - object: { - type: "Identifier", - name: "Object" - }, - property: { name: "assign" } - } - }) - .filter((path) => { - const firstArg = path.value.arguments[0]; - const secondArg = path.value.arguments[1]; - return ( - firstArg.type === "MemberExpression" && - firstArg.property.name === "config" && - firstArg.object.type === "Identifier" && - firstArg.object.name === fetchMockVariableName - ) && (secondArg.type === 'ObjectExpression' - && secondArg.properties.some(property => property.key.name === 'overwriteRoutes') ); - }) - - configSets.filter((path) => { - const secondArg = path.value.arguments[1]; - return (secondArg.properties.length === 1) - }).remove(); - - configSets.filter((path) => { - const secondArg = path.value.arguments[1]; - return (secondArg.properties.length > 1) - }) - .find(j.Property, { key: { name: "overwriteRoutes" } }).remove() - + const configSets = root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: 'Object', + }, + property: { name: 'assign' }, + }, + }) + .filter((path) => { + const firstArg = path.value.arguments[0]; + const secondArg = path.value.arguments[1]; + return ( + firstArg.type === 'MemberExpression' && + firstArg.property.name === 'config' && + firstArg.object.type === 'Identifier' && + firstArg.object.name === fetchMockVariableName && + secondArg.type === 'ObjectExpression' + ); + }); + ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((name) => { + root + .find(j.AssignmentExpression, { + left: { + type: 'MemberExpression', + property: { name }, + object: { + type: 'MemberExpression', + property: { name: 'config' }, + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + }, + }, + }) + .remove(); + configSets.find(j.Property, { key: { name } }).remove(); + }); + configSets + .filter((path) => { + const secondArg = path.value.arguments[1]; + return secondArg.properties.length === 0; + }) + .remove(); const fetchMockMethodCalls = root.find(j.CallExpression, { callee: { @@ -74,9 +72,7 @@ export function codemod(source: string, j: JSCodeshift) { name: fetchMockVariableName, }, }, - }); - fetchMockMethodCalls - .map((path) => { + }).map((path) => { const paths = [path]; while (path.parentPath.value.type !== 'ExpressionStatement') { path = path.parentPath; @@ -85,7 +81,9 @@ export function codemod(source: string, j: JSCodeshift) { } } return paths; - }) + }); + + fetchMockMethodCalls .forEach((path) => { const callee = path.value.callee as MemberExpression; const property = callee.property as Identifier; diff --git a/packages/codemods/try.ts b/packages/codemods/try.ts new file mode 100644 index 00000000..9e114a2f --- /dev/null +++ b/packages/codemods/try.ts @@ -0,0 +1,11 @@ +import { codemod } from './src/index'; +import jscodeshift from 'jscodeshift'; + +codemod( + ` +import fetchMock from 'fetch-mock'; +Object.assign(fetchMock.config, {overwriteRoutes: true, other: 'value'}) +Object.assign(fetchMock.config, {overwriteRoutes: true}) +`, + jscodeshift, +); diff --git a/jsconfig.json b/tsconfig.json similarity index 69% rename from jsconfig.json rename to tsconfig.json index fe332093..811ceaec 100644 --- a/jsconfig.json +++ b/tsconfig.json @@ -7,5 +7,6 @@ "target": "es2021" }, "include": ["./packages/**/src/*.ts"], - "exclude": ["node_modules", "packages/**/__tests__"] + "exclude": ["node_modules", "packages/**/__tests__"], + "ts-node": {"esm": true} } From e523711b5c05e2adeea96a4478c681c603b329b4 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 20:35:56 +0100 Subject: [PATCH 10/48] feat: can identify fetch mock in esm --- .../identifying-fetchmock-instances.test.js | 4 +- packages/codemods/src/index.ts | 68 ++++++++++++------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js index 0bdadd41..e9b544c5 100644 --- a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -46,11 +46,11 @@ describe('identifying fetch-mock instances', () => { it('esm import named something else', () => { expectCodemodResult( ` - import fetchMock as fetchNot from 'fetch-mock'; + import fetchNot from 'fetch-mock'; fetchNot.mock("blah", 200) `, ` - import fetchMock as fetchNot from 'fetch-mock'; + import fetchNot from 'fetch-mock'; fetchNot.route("blah", 200) `, ); diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.ts index 7abb22b6..0e81beb3 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.ts @@ -7,15 +7,30 @@ import type { } from 'jscodeshift'; export function codemod(source: string, j: JSCodeshift) { const root = j(source); - const fetchMockVariableName = root - .find(j.CallExpression, { - callee: { - name: 'require', - }, - arguments: [{ value: 'fetch-mock' }], - }) - .closest(j.VariableDeclarator) - .get().value.id.name; + let fetchMockVariableName; + try { + fetchMockVariableName = root + .find(j.CallExpression, { + callee: { + name: 'require', + }, + arguments: [{ value: 'fetch-mock' }], + }) + .closest(j.VariableDeclarator) + .get().value.id.name; + } catch { + try { + fetchMockVariableName = root + .find(j.ImportDeclaration, { + source: { value: 'fetch-mock' }, + }) + .find(j.ImportDefaultSpecifier) + .get().value.local.name; + console.log(fetchMockVariableName); + } catch (err) { + console.log(err); + } + } const configSets = root .find(j.CallExpression, { @@ -65,14 +80,16 @@ export function codemod(source: string, j: JSCodeshift) { }) .remove(); - const fetchMockMethodCalls = root.find(j.CallExpression, { - callee: { - object: { - type: 'Identifier', - name: fetchMockVariableName, + const fetchMockMethodCalls = root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, }, - }, - }).map((path) => { + }) + .map((path) => { const paths = [path]; while (path.parentPath.value.type !== 'ExpressionStatement') { path = path.parentPath; @@ -82,16 +99,15 @@ export function codemod(source: string, j: JSCodeshift) { } return paths; }); - - fetchMockMethodCalls - .forEach((path) => { - const callee = path.value.callee as MemberExpression; - const property = callee.property as Identifier; - const method = property.name; - if (method === 'mock') { - property.name = 'route'; - } - }); + + fetchMockMethodCalls.forEach((path) => { + const callee = path.value.callee as MemberExpression; + const property = callee.property as Identifier; + const method = property.name; + if (method === 'mock') { + property.name = 'route'; + } + }); return root.toSource(); } From eeda85b5f4c0787a0244e70b7af2a00f5d044390 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 20:39:24 +0100 Subject: [PATCH 11/48] build: stop using ts for the codemods types for jscodeshift are buggy it only ever needs to be run by npx, so can just export esm src --- package-lock.json | 35 -------------------- packages/codemods/package.json | 11 ++---- packages/codemods/src/{index.ts => index.js} | 17 +++------- 3 files changed, 7 insertions(+), 56 deletions(-) rename packages/codemods/src/{index.ts => index.js} (85%) diff --git a/package-lock.json b/package-lock.json index c26ea48f..d827ddc6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6491,40 +6491,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jscodeshift": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@types/jscodeshift/-/jscodeshift-0.11.11.tgz", - "integrity": "sha512-d7CAfFGOupj5qCDqMODXxNz2/NwCv/Lha78ZFbnr6qpk3K98iSB8I+ig9ERE2+EeYML352VMRsjPyOpeA+04eQ==", - "dependencies": { - "ast-types": "^0.14.1", - "recast": "^0.20.3" - } - }, - "node_modules/@types/jscodeshift/node_modules/ast-types": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", - "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@types/jscodeshift/node_modules/recast": { - "version": "0.20.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.20.5.tgz", - "integrity": "sha512-E5qICoPoNL4yU0H0NoBDntNB0Q5oMSNh9usFctYniLBluTthi3RsQVBXIJNbApOlvSwW/RGxIuokPcAc59J5fQ==", - "dependencies": { - "ast-types": "0.14.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -26552,7 +26518,6 @@ "version": "0.0.0", "license": "MIT", "dependencies": { - "@types/jscodeshift": "^0.11.11", "jscodeshift": "^17.0.0" }, "engines": { diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 5f0829a8..5d85e7b1 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -3,14 +3,10 @@ "description": "Codemods for upgrading fetch-mock", "version": "0.0.0", "exports": { - "browser": "./src/index.js", - "import": "./src/index.js", - "require": "./dist/commonjs.js", - "types": "./types/index.d.ts" + "import": "./src/index.js" }, - "main": "./dist/commonjs.js", + "main": "./src/index.js", "module": "./src/index.js", - "types": "./types/index.d.ts", "type": "module", "engines": { "node": ">=18.11.0" @@ -21,7 +17,7 @@ "url": "git+https://github.com/wheresrhys/fetch-mock.git" }, "scripts": { - "build": "rm -rf dist && tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json && node ../../scripts/declare-dist-type.js" + "build": "echo 'no build'" }, "license": "MIT", "author": "Rhys Evans", @@ -30,7 +26,6 @@ }, "homepage": "http://www.wheresrhys.co.uk/fetch-mock", "dependencies": { - "@types/jscodeshift": "^0.11.11", "jscodeshift": "^17.0.0" } } diff --git a/packages/codemods/src/index.ts b/packages/codemods/src/index.js similarity index 85% rename from packages/codemods/src/index.ts rename to packages/codemods/src/index.js index 0e81beb3..9a699770 100644 --- a/packages/codemods/src/index.ts +++ b/packages/codemods/src/index.js @@ -1,11 +1,4 @@ -import type { - JSCodeshift, - MemberExpression, - Identifier, - FileInfo, - API, -} from 'jscodeshift'; -export function codemod(source: string, j: JSCodeshift) { +export function codemod(source, j) { const root = j(source); let fetchMockVariableName; try { @@ -101,17 +94,15 @@ export function codemod(source: string, j: JSCodeshift) { }); fetchMockMethodCalls.forEach((path) => { - const callee = path.value.callee as MemberExpression; - const property = callee.property as Identifier; - const method = property.name; + const method = path.value.callee.property.name; if (method === 'mock') { - property.name = 'route'; + path.value.callee.property.name = 'route'; } }); return root.toSource(); } -export default function transformer(file: FileInfo, api: API): string { +export default function transformer(file, api) { return codemod(file.source, api.j); } From 298a9e2ddf6ffb2e395d9766bffd24a801d3c926 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 31 Aug 2024 20:51:13 +0100 Subject: [PATCH 12/48] refactor: `modularise codemods a little --- .../identifying-fetchmock-instances.test.js | 1 + packages/codemods/src/codemods/methods.js | 28 ++++++ packages/codemods/src/codemods/options.js | 50 +++++++++++ packages/codemods/src/index.js | 90 +++---------------- 4 files changed, 92 insertions(+), 77 deletions(-) create mode 100644 packages/codemods/src/codemods/methods.js create mode 100644 packages/codemods/src/codemods/options.js diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js index e9b544c5..0ec271d2 100644 --- a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -58,4 +58,5 @@ describe('identifying fetch-mock instances', () => { // Identify fetch - mock references when mocking node - fetch in jest // sandbox() instances // sandbox() instances used by jest / vitest.mock + // identify multiple instances on a page e.g. fetchMock and fm=fetchMock.sandbox() }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js new file mode 100644 index 00000000..5fbb2a61 --- /dev/null +++ b/packages/codemods/src/codemods/methods.js @@ -0,0 +1,28 @@ +export function simpleMethods (fetchMockVariableName, root, j) { + const fetchMockMethodCalls = root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + }, + }) + .map((path) => { + const paths = [path]; + while (path.parentPath.value.type !== 'ExpressionStatement') { + path = path.parentPath; + if (path.value.type === 'CallExpression') { + paths.push(path); + } + } + return paths; + }); + + fetchMockMethodCalls.forEach((path) => { + const method = path.value.callee.property.name; + if (method === 'mock') { + path.value.callee.property.name = 'route'; + } + }); +} diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js new file mode 100644 index 00000000..ec9aa3be --- /dev/null +++ b/packages/codemods/src/codemods/options.js @@ -0,0 +1,50 @@ +export function simpleOptions (fetchMockVariableName, root, j) { + + const configSets = root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: 'Object', + }, + property: { name: 'assign' }, + }, + }) + .filter((path) => { + const firstArg = path.value.arguments[0]; + const secondArg = path.value.arguments[1]; + return ( + firstArg.type === 'MemberExpression' && + firstArg.property.name === 'config' && + firstArg.object.type === 'Identifier' && + firstArg.object.name === fetchMockVariableName && + secondArg.type === 'ObjectExpression' + ); + }); + ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((name) => { + root + .find(j.AssignmentExpression, { + left: { + type: 'MemberExpression', + property: { name }, + object: { + type: 'MemberExpression', + property: { name: 'config' }, + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + }, + }, + }) + .remove(); + configSets.find(j.Property, { key: { name } }).remove(); + }); + + configSets + .filter((path) => { + const secondArg = path.value.arguments[1]; + return secondArg.properties.length === 0; + }) + .remove(); +} diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 9a699770..30004f7f 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -1,5 +1,8 @@ -export function codemod(source, j) { - const root = j(source); +import {simpleOptions} from './codemods/options' +import {simpleMethods} from './codemods/methods' + + +function findFetchMockVariableName (root, j) { let fetchMockVariableName; try { fetchMockVariableName = root @@ -19,86 +22,19 @@ export function codemod(source, j) { }) .find(j.ImportDefaultSpecifier) .get().value.local.name; - console.log(fetchMockVariableName); } catch (err) { - console.log(err); + throw new Error("No fetch-mock references found") } } + return fetchMockVariableName; +} - const configSets = root - .find(j.CallExpression, { - callee: { - object: { - type: 'Identifier', - name: 'Object', - }, - property: { name: 'assign' }, - }, - }) - .filter((path) => { - const firstArg = path.value.arguments[0]; - const secondArg = path.value.arguments[1]; - return ( - firstArg.type === 'MemberExpression' && - firstArg.property.name === 'config' && - firstArg.object.type === 'Identifier' && - firstArg.object.name === fetchMockVariableName && - secondArg.type === 'ObjectExpression' - ); - }); - ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((name) => { - root - .find(j.AssignmentExpression, { - left: { - type: 'MemberExpression', - property: { name }, - object: { - type: 'MemberExpression', - property: { name: 'config' }, - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, - }, - }, - }) - .remove(); - configSets.find(j.Property, { key: { name } }).remove(); - }); - - configSets - .filter((path) => { - const secondArg = path.value.arguments[1]; - return secondArg.properties.length === 0; - }) - .remove(); - - const fetchMockMethodCalls = root - .find(j.CallExpression, { - callee: { - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, - }, - }) - .map((path) => { - const paths = [path]; - while (path.parentPath.value.type !== 'ExpressionStatement') { - path = path.parentPath; - if (path.value.type === 'CallExpression') { - paths.push(path); - } - } - return paths; - }); +export function codemod(source, j) { + const root = j(source); + const fetchMockVariableName = findFetchMockVariableName(root, j) - fetchMockMethodCalls.forEach((path) => { - const method = path.value.callee.property.name; - if (method === 'mock') { - path.value.callee.property.name = 'route'; - } - }); + simpleOptions(fetchMockVariableName, root, j) + simpleMethods(fetchMockVariableName, root, j) return root.toSource(); } From a115a2733defc8dbca0554abfaa25750daa9f8fe Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 1 Sep 2024 08:51:39 +0100 Subject: [PATCH 13/48] feat: lastUrl() codemod implemented --- .../src/__test__/method-codemods.test.js | 43 +++++++++++++++---- packages/codemods/src/codemods/methods.js | 23 +++++++++- packages/codemods/src/codemods/options.js | 3 +- packages/codemods/src/index.js | 17 +++----- packages/codemods/try.js | 12 ++++++ packages/codemods/try.ts | 11 ----- 6 files changed, 77 insertions(+), 32 deletions(-) create mode 100644 packages/codemods/try.js delete mode 100644 packages/codemods/try.ts diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 63da6be6..b16ad0f0 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -2,18 +2,22 @@ import { describe, it, expect } from 'vitest'; import { codemod } from '../index'; import jscodeshift from 'jscodeshift'; -const prependFetchMock = (src) => - `const fetchMock = require('fetch-mock');\n${src}`; +const prependFetchMock = (src, fetchMockVariableName) => + `const ${fetchMockVariableName} = require('fetch-mock');\n${src}`; -function expectCodemodResult(src, expected) { - expect(codemod(prependFetchMock(src), jscodeshift)).toEqual( - prependFetchMock(expected), - ); +function expectCodemodResult( + src, + expected, + fetchMockVariableName = 'fetchMock', +) { + expect( + codemod(prependFetchMock(src, fetchMockVariableName), jscodeshift), + ).toEqual(prependFetchMock(expected, fetchMockVariableName)); } describe('codemods operating on methods', () => { describe('converting mock() to route()', () => { - //Next to the first one in a file leave a comment explaining that they need to use mockGlobal() too + //TODO Next to the first one in a file leave a comment explaining that they need to use mockGlobal() too it('single .mock()', () => { expectCodemodResult( 'fetchMock.mock("blah", 200)', @@ -62,7 +66,30 @@ describe('codemods operating on methods', () => { }); }); - // .lastUrl() => .callHistory.lastCall()?.url + describe('converting lastUrl()', () => { + it('single .lastUrl()', () => { + expectCodemodResult( + 'fetchMock.lastUrl()', + 'fetchMock.callHistory.lastCall()?.url', + ); + }); + it('lastUrl() with arguments', () => { + expectCodemodResult( + `fetchMock.lastUrl('name', {method: 'get'})`, + `fetchMock.callHistory.lastCall('name', {method: 'get'})?.url`, + ); + }); + + it('works with other names for fetch-mock', () => { + expectCodemodResult( + `fm.lastUrl('name', {method: 'get'})`, + `fm.callHistory.lastCall('name', {method: 'get'})?.url`, + 'fm', + ); + }); + }); + + // // .lastOptions() => .callHistory.lastCall()?.options // .lastResponse() => .callHistory.lastCall()?.response // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 5fbb2a61..4075b793 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -1,4 +1,4 @@ -export function simpleMethods (fetchMockVariableName, root, j) { +export function simpleMethods(fetchMockVariableName, root, j) { const fetchMockMethodCalls = root .find(j.CallExpression, { callee: { @@ -25,4 +25,25 @@ export function simpleMethods (fetchMockVariableName, root, j) { path.value.callee.property.name = 'route'; } }); + const lastUrl = root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: 'lastUrl', + }, + }, + }) + .closest(j.ExpressionStatement); + + lastUrl.replaceWith((path) => { + const oldCall = j(path).find(j.CallExpression).get(); + const builder = j(`${fetchMockVariableName}.callHistory.lastCall()?.url`); + const newCall = builder.find(j.CallExpression).get(); + newCall.value.arguments = oldCall.value.arguments; + return builder.find(j.ExpressionStatement).get().value; + }); } diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index ec9aa3be..5b36de4b 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,5 +1,4 @@ -export function simpleOptions (fetchMockVariableName, root, j) { - +export function simpleOptions(fetchMockVariableName, root, j) { const configSets = root .find(j.CallExpression, { callee: { diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 30004f7f..3c6089af 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -1,8 +1,7 @@ -import {simpleOptions} from './codemods/options' -import {simpleMethods} from './codemods/methods' +import { simpleOptions } from './codemods/options.js'; +import { simpleMethods } from './codemods/methods.js'; - -function findFetchMockVariableName (root, j) { +function findFetchMockVariableName(root, j) { let fetchMockVariableName; try { fetchMockVariableName = root @@ -23,7 +22,7 @@ function findFetchMockVariableName (root, j) { .find(j.ImportDefaultSpecifier) .get().value.local.name; } catch (err) { - throw new Error("No fetch-mock references found") + throw new Error('No fetch-mock references found', err); } } return fetchMockVariableName; @@ -31,11 +30,9 @@ function findFetchMockVariableName (root, j) { export function codemod(source, j) { const root = j(source); - const fetchMockVariableName = findFetchMockVariableName(root, j) - - simpleOptions(fetchMockVariableName, root, j) - simpleMethods(fetchMockVariableName, root, j) - + const fetchMockVariableName = findFetchMockVariableName(root, j); + simpleOptions(fetchMockVariableName, root, j); + simpleMethods(fetchMockVariableName, root, j); return root.toSource(); } diff --git a/packages/codemods/try.js b/packages/codemods/try.js new file mode 100644 index 00000000..0bb45caa --- /dev/null +++ b/packages/codemods/try.js @@ -0,0 +1,12 @@ +import { codemod } from './src/index.js'; +import jscodeshift from 'jscodeshift'; + +console.log( + codemod( + ` +import fetchMock from 'fetch-mock'; +fetchMock.lastUrl(1, 2) +`, + jscodeshift, + ), +); diff --git a/packages/codemods/try.ts b/packages/codemods/try.ts deleted file mode 100644 index 9e114a2f..00000000 --- a/packages/codemods/try.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { codemod } from './src/index'; -import jscodeshift from 'jscodeshift'; - -codemod( - ` -import fetchMock from 'fetch-mock'; -Object.assign(fetchMock.config, {overwriteRoutes: true, other: 'value'}) -Object.assign(fetchMock.config, {overwriteRoutes: true}) -`, - jscodeshift, -); From 300e0b83e0bd5be40c975ace46af86166b7c75e1 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 1 Sep 2024 09:20:29 +0100 Subject: [PATCH 14/48] feat: lastOptions() and lastResponse() --- .../src/__test__/method-codemods.test.js | 46 +++++++++++++++++++ packages/codemods/src/codemods/methods.js | 46 +++++++++++-------- 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index b16ad0f0..0155076e 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -89,6 +89,52 @@ describe('codemods operating on methods', () => { }); }); + describe('converting lastOptions()', () => { + it('single .lastOptions()', () => { + expectCodemodResult( + 'fetchMock.lastOptions()', + 'fetchMock.callHistory.lastCall()?.options', + ); + }); + it('lastOptions() with arguments', () => { + expectCodemodResult( + `fetchMock.lastOptions('name', {method: 'get'})`, + `fetchMock.callHistory.lastCall('name', {method: 'get'})?.options`, + ); + }); + + it('works with other names for fetch-mock', () => { + expectCodemodResult( + `fm.lastOptions('name', {method: 'get'})`, + `fm.callHistory.lastCall('name', {method: 'get'})?.options`, + 'fm', + ); + }); + }); + + describe('converting lastResponse()', () => { + it('single .lastResponse()', () => { + expectCodemodResult( + 'fetchMock.lastResponse()', + 'fetchMock.callHistory.lastCall()?.response', + ); + }); + it('lastResponse() with arguments', () => { + expectCodemodResult( + `fetchMock.lastResponse('name', {method: 'get'})`, + `fetchMock.callHistory.lastCall('name', {method: 'get'})?.response`, + ); + }); + + it('works with other names for fetch-mock', () => { + expectCodemodResult( + `fm.lastResponse('name', {method: 'get'})`, + `fm.callHistory.lastCall('name', {method: 'get'})?.response`, + 'fm', + ); + }); + }); + // // .lastOptions() => .callHistory.lastCall()?.options // .lastResponse() => .callHistory.lastCall()?.response diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 4075b793..affa512c 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -25,25 +25,33 @@ export function simpleMethods(fetchMockVariableName, root, j) { path.value.callee.property.name = 'route'; } }); - const lastUrl = root - .find(j.CallExpression, { - callee: { - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, - property: { - name: 'lastUrl', - }, - }, - }) - .closest(j.ExpressionStatement); - lastUrl.replaceWith((path) => { - const oldCall = j(path).find(j.CallExpression).get(); - const builder = j(`${fetchMockVariableName}.callHistory.lastCall()?.url`); - const newCall = builder.find(j.CallExpression).get(); - newCall.value.arguments = oldCall.value.arguments; - return builder.find(j.ExpressionStatement).get().value; + [ + ['lastUrl', 'url'], + ['lastOptions', 'options'], + ['lastResponse', 'response'], + ].forEach(([oldMethod, newProperty]) => { + root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: oldMethod, + }, + }, + }) + .closest(j.ExpressionStatement) + .replaceWith((path) => { + const oldCall = j(path).find(j.CallExpression).get(); + const builder = j( + `${fetchMockVariableName}.callHistory.lastCall()?.${newProperty}`, + ); + const newCall = builder.find(j.CallExpression).get(); + newCall.value.arguments = oldCall.value.arguments; + return builder.find(j.ExpressionStatement).get().value; + }); }); } From 1ef70ec9bfc7364712f900655bd6f194e2c45b0a Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 1 Sep 2024 15:42:06 +0100 Subject: [PATCH 15/48] feat: support converting getAny() etc --- .../src/__test__/method-codemods.test.js | 53 +++++++++++++++++-- packages/codemods/src/codemods/methods.js | 32 +++++++++++ packages/codemods/try.js | 2 +- 3 files changed, 82 insertions(+), 5 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 0155076e..c44d0014 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -135,11 +135,56 @@ describe('codemods operating on methods', () => { }); }); - // - // .lastOptions() => .callHistory.lastCall()?.options - // .lastResponse() => .callHistory.lastCall()?.response + ['get', 'post', 'put', 'delete', 'head', 'patch'].forEach((method) => { + describe(`${method}Any() -> any()`, () => { + it('when only has response', () => { + expectCodemodResult( + `fetchMock.${method}Any(200)`, + `fetchMock.any(200, {method: '${method}'})`, + ); + }); + it('when has additional options', () => { + expectCodemodResult( + `fetchMock.${method}Any(200, {name: "my-route"})`, + `fetchMock.any(200, { + name: "my-route", + method: '${method}' +})`, + ); + }); + it('when has name', () => { + expectCodemodResult( + `fetchMock.${method}Any(200, "my-route")`, + `fetchMock.any(200, {name: "my-route", method: '${method}'})`, + ); + }); + }); + describe(`${method}AnyOnce() -> anyOnce()`, () => { + it('when only has response', () => { + expectCodemodResult( + `fetchMock.${method}AnyOnce(200)`, + `fetchMock.anyOnce(200, {method: '${method}'})`, + ); + }); + it('when has additional options', () => { + expectCodemodResult( + `fetchMock.${method}AnyOnce(200, {name: "my-route"})`, + `fetchMock.anyOnce(200, { + name: "my-route", + method: '${method}' +})`, + ); + }); + it('when has name', () => { + expectCodemodResult( + `fetchMock.${method}AnyOnce(200, "my-route")`, + `fetchMock.anyOnce(200, {name: "my-route", method: '${method}'})`, + ); + }); + }); + }); + // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) - // .getAny(), .postAny(), .putAny(), .deleteAny(), .headAny(), .patchAny(), .getAnyOnce(), .postAnyOnce(), .putAnyOnce(), .deleteAnyOnce(), .headAnyOnce(), .patchAnyOnce() => calls to the underlying method + options // restore() / reset()... once I've decided how to implement these // lastCall() => try to change uses of this to expect a callLog, but probably just insert a commemnt / error }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index affa512c..4e1517e7 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -24,6 +24,38 @@ export function simpleMethods(fetchMockVariableName, root, j) { if (method === 'mock') { path.value.callee.property.name = 'route'; } + ['get', 'post', 'put', 'delete', 'head', 'patch'].some((httpMethod) => { + let applyMethod = false; + if (method === `${httpMethod}Any`) { + applyMethod = true; + path.value.callee.property.name = 'any'; + } else if (method === `${httpMethod}AnyOnce`) { + applyMethod = true; + path.value.callee.property.name = 'anyOnce'; + } + if (applyMethod) { + const options = path.value.arguments[1]; + if (!options) { + path.value.arguments.push( + j(`const options = {method: '${httpMethod}'}`) + .find(j.ObjectExpression) + .get().value, + ); + } else if (options.type === 'Literal') { + path.value.arguments[1] = j( + `const options = {name: ${options.raw}, method: '${httpMethod}'}`, + ) + .find(j.ObjectExpression) + .get().value; + } else if (options.type === 'ObjectExpression') { + options.properties.push( + j(`const options = {method: '${httpMethod}'}`) + .find(j.Property) + .get().value, + ); + } + } + }); }); [ diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 0bb45caa..8e8ef89e 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.lastUrl(1, 2) +fetchMock.getAny(200, {name: 'who'}) `, jscodeshift, ), From 3b7daf71663662265c63169ba036b13e0856b053 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 1 Sep 2024 15:49:30 +0100 Subject: [PATCH 16/48] feat: use get("*") as a better replacement for getAny() --- .../src/__test__/method-codemods.test.js | 22 +++----- packages/codemods/src/codemods/methods.js | 54 ++++++++++--------- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index c44d0014..3814dd5e 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -136,49 +136,43 @@ describe('codemods operating on methods', () => { }); ['get', 'post', 'put', 'delete', 'head', 'patch'].forEach((method) => { - describe(`${method}Any() -> any()`, () => { + describe(`${method}Any() -> ${method}("*")`, () => { it('when only has response', () => { expectCodemodResult( `fetchMock.${method}Any(200)`, - `fetchMock.any(200, {method: '${method}'})`, + `fetchMock.${method}("*", 200)`, ); }); it('when has additional options', () => { expectCodemodResult( `fetchMock.${method}Any(200, {name: "my-route"})`, - `fetchMock.any(200, { - name: "my-route", - method: '${method}' -})`, + `fetchMock.${method}("*", 200, {name: "my-route"})`, ); }); it('when has name', () => { expectCodemodResult( `fetchMock.${method}Any(200, "my-route")`, - `fetchMock.any(200, {name: "my-route", method: '${method}'})`, + `fetchMock.${method}("*", 200, "my-route")`, ); }); }); - describe(`${method}AnyOnce() -> anyOnce()`, () => { + describe(`${method}AnyOnce() -> ${method}Once("*")`, () => { it('when only has response', () => { expectCodemodResult( `fetchMock.${method}AnyOnce(200)`, - `fetchMock.anyOnce(200, {method: '${method}'})`, + `fetchMock.${method}Once("*", 200)`, ); }); it('when has additional options', () => { expectCodemodResult( `fetchMock.${method}AnyOnce(200, {name: "my-route"})`, - `fetchMock.anyOnce(200, { - name: "my-route", - method: '${method}' -})`, + `fetchMock.${method}Once("*", 200, {name: "my-route"})`, ); }); it('when has name', () => { expectCodemodResult( `fetchMock.${method}AnyOnce(200, "my-route")`, - `fetchMock.anyOnce(200, {name: "my-route", method: '${method}'})`, + `fetchMock.${method}Once("*", 200, "my-route")`, ); }); }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 4e1517e7..21edd1dc 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -25,35 +25,37 @@ export function simpleMethods(fetchMockVariableName, root, j) { path.value.callee.property.name = 'route'; } ['get', 'post', 'put', 'delete', 'head', 'patch'].some((httpMethod) => { - let applyMethod = false; + let prependStar = false; if (method === `${httpMethod}Any`) { - applyMethod = true; - path.value.callee.property.name = 'any'; + prependStar = true; + path.value.callee.property.name = httpMethod; } else if (method === `${httpMethod}AnyOnce`) { - applyMethod = true; - path.value.callee.property.name = 'anyOnce'; + prependStar = true; + path.value.callee.property.name = `${httpMethod}Once`; } - if (applyMethod) { - const options = path.value.arguments[1]; - if (!options) { - path.value.arguments.push( - j(`const options = {method: '${httpMethod}'}`) - .find(j.ObjectExpression) - .get().value, - ); - } else if (options.type === 'Literal') { - path.value.arguments[1] = j( - `const options = {name: ${options.raw}, method: '${httpMethod}'}`, - ) - .find(j.ObjectExpression) - .get().value; - } else if (options.type === 'ObjectExpression') { - options.properties.push( - j(`const options = {method: '${httpMethod}'}`) - .find(j.Property) - .get().value, - ); - } + if (prependStar) { + // const options = + path.value.arguments.unshift(j.stringLiteral('*')); + // [1]; + // if (!options) { + // path.value.arguments.push( + // j(`const options = {method: '${httpMethod}'}`) + // .find(j.ObjectExpression) + // .get().value, + // ); + // } else if (options.type === 'Literal') { + // path.value.arguments[1] = j( + // `const options = {name: ${options.raw}, method: '${httpMethod}'}`, + // ) + // .find(j.ObjectExpression) + // .get().value; + // } else if (options.type === 'ObjectExpression') { + // options.properties.push( + // j(`const options = {method: '${httpMethod}'}`) + // .find(j.Property) + // .get().value, + // ); + // } } }); }); From e976e7edc87927d66570ca41c1a10187d22566e5 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 2 Sep 2024 12:34:39 +0100 Subject: [PATCH 17/48] feat: remiving options from methods more or less works --- .../src/__test__/option-codemods.test.js | 92 ++++++++++++------- packages/codemods/src/codemods/methods.js | 33 ++----- packages/codemods/src/codemods/options.js | 59 +++++++++++- packages/codemods/src/index.js | 5 +- packages/codemods/try.js | 2 +- 5 files changed, 134 insertions(+), 57 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index fb6382bf..6d42bd06 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -36,45 +36,75 @@ describe('codemods operating on options', () => { }); [ + 'sticky', + 'once', + 'get', + 'getOnce', + 'post', + 'postOnce', + 'put', + 'putOnce', + 'delete', + 'deleteOnce', + 'head', + 'headOnce', + 'patch', + 'patchOnce', + 'any', + 'anyOnce', + // all though the src doesn't actually handle these explicitly, + // these tests ensure that the renaming of these methods to ones that + // do get handled happens first + 'getAnyOnce', 'mock', - // 'sticky', - // 'once', - // 'any', - // 'anyOnce', - // 'get', - // 'getAny', - // 'getOnce', - // 'getAnyOnce', - // 'post', - // 'postAny', - // 'postOnce', - // 'postAnyOnce', - // 'put', - // 'putAny', - // 'putOnce', - // 'putAnyOnce', - // 'delete', - // 'deleteAny', - // 'deleteOnce', - // 'deleteAnyOnce', - // 'head', - // 'headAny', - // 'headOnce', - // 'headAnyOnce', - // 'patch', - // 'patchAny', - // 'patchOnce', - // 'patchAnyOnce' ].forEach((methodName) => { describe(`when using ${methodName}`, () => { - it(`Removes as option on first parameter of ${methodName}()`, () => {}); + if (/any/i.test(methodName)) { + it(`Removes as option on third parameter of ${methodName}()`, () => { + expectCodemodResult( + `fetchMock.${methodName}(200, {name: 'rio', ${optionName}: true})`, + `fetchMock.${methodName}(200, { + name: 'rio' + })`, + ); + }); - it(`Removes as option on third parameter of ${methodName}()`, () => {}); + it(`Removes third parameter of ${methodName}() if no other options remain`, () => { + expectCodemodResult( + `fetchMock.${methodName}('*', 200, {${optionName}: true})`, + `fetchMock.${methodName}('*', 200)`, + ); + }); + } else { + it(`Removes as option on first parameter of ${methodName}()`, () => { + expectCodemodResult( + `fetchMock.${methodName}({url: '*', response: 200, ${optionName}: true})`, + `fetchMock.${methodName}({ + url: '*', + response: 200 +})`, + ); + }); + it(`Removes as option on third parameter of ${methodName}()`, () => { + expectCodemodResult( + `fetchMock.${methodName}('*', 200, {name: 'rio', ${optionName}: true})`, + `fetchMock.${methodName}('*', 200, { + name: 'rio' + })`, + ); + }); - it(`Removes third parameter of ${methodName}() if no other options remain`, () => {}); + it(`Removes third parameter of ${methodName}() if no other options remain`, () => { + expectCodemodResult( + `fetchMock.${methodName}('*', 200, {${optionName}: true})`, + `fetchMock.${methodName}('*', 200)`, + ); + }); + } }); }); }); + describe('acting on combinations of the 3 options together', () => {}); }); describe('fallbackToNetwork', () => { // try to replace fallbackToNetwork: always with spyGlobal()... but probably just insert an error / comment that points at the docs diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 21edd1dc..5d565ff6 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -1,5 +1,5 @@ -export function simpleMethods(fetchMockVariableName, root, j) { - const fetchMockMethodCalls = root +export function getAllChainedMethodCalls(fetchMockVariableName, root, j) { + return root .find(j.CallExpression, { callee: { object: { @@ -18,6 +18,14 @@ export function simpleMethods(fetchMockVariableName, root, j) { } return paths; }); +} + +export function simpleMethods(fetchMockVariableName, root, j) { + const fetchMockMethodCalls = getAllChainedMethodCalls( + fetchMockVariableName, + root, + j, + ); fetchMockMethodCalls.forEach((path) => { const method = path.value.callee.property.name; @@ -34,28 +42,7 @@ export function simpleMethods(fetchMockVariableName, root, j) { path.value.callee.property.name = `${httpMethod}Once`; } if (prependStar) { - // const options = path.value.arguments.unshift(j.stringLiteral('*')); - // [1]; - // if (!options) { - // path.value.arguments.push( - // j(`const options = {method: '${httpMethod}'}`) - // .find(j.ObjectExpression) - // .get().value, - // ); - // } else if (options.type === 'Literal') { - // path.value.arguments[1] = j( - // `const options = {name: ${options.raw}, method: '${httpMethod}'}`, - // ) - // .find(j.ObjectExpression) - // .get().value; - // } else if (options.type === 'ObjectExpression') { - // options.properties.push( - // j(`const options = {method: '${httpMethod}'}`) - // .find(j.Property) - // .get().value, - // ); - // } } }); }); diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index 5b36de4b..daf63672 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,3 +1,5 @@ +import { getAllChainedMethodCalls } from './methods.js'; +const simpleOptionNames = ['overwriteRoutes', 'warnOnFallback', 'sendAsJson']; export function simpleOptions(fetchMockVariableName, root, j) { const configSets = root .find(j.CallExpression, { @@ -20,7 +22,7 @@ export function simpleOptions(fetchMockVariableName, root, j) { secondArg.type === 'ObjectExpression' ); }); - ['overwriteRoutes', 'warnOnFallback', 'sendAsJson'].forEach((name) => { + simpleOptionNames.forEach((name) => { root .find(j.AssignmentExpression, { left: { @@ -46,4 +48,59 @@ export function simpleOptions(fetchMockVariableName, root, j) { return secondArg.properties.length === 0; }) .remove(); + + const fetchMockMethodCalls = getAllChainedMethodCalls( + fetchMockVariableName, + root, + j, + ); + + [ + 'once', + 'route', + 'sticky', + 'any', + 'anyOnce', + 'get', + 'getOnce', + 'post', + 'postOnce', + 'put', + 'putOnce', + 'delete', + 'deleteOnce', + 'head', + 'headOnce', + 'patch', + 'patchOnce', + ].some((methodName) => { + const optionsObjects = fetchMockMethodCalls + .filter((path) => path.value.callee.property.name === methodName) + .map((path) => { + return j(path) + .find(j.ObjectExpression) + .filter((path) => { + return path.value.properties.some(({ key }) => + simpleOptionNames.includes(key.name), + ); + }) + .paths(); + }); + + if (!optionsObjects.length) { + return; + } + simpleOptionNames.forEach((optionName) => { + optionsObjects + .find(j.Property, { + key: { name: optionName }, + }) + .remove(); + }); + optionsObjects + .filter((path) => { + return path.value.properties.length === 0; + }) + .remove(); + }); } diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 3c6089af..5b279864 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -31,8 +31,11 @@ function findFetchMockVariableName(root, j) { export function codemod(source, j) { const root = j(source); const fetchMockVariableName = findFetchMockVariableName(root, j); - simpleOptions(fetchMockVariableName, root, j); simpleMethods(fetchMockVariableName, root, j); + // run after simpleMethods because means the options rewriters have to iterate + // over smaller list of methods + simpleOptions(fetchMockVariableName, root, j); + return root.toSource(); } diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 8e8ef89e..078a5be2 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.getAny(200, {name: 'who'}) +fetchMock.once({url: '*', response: 200, sendAsJson: true}) `, jscodeshift, ), From 3c29acf17995189f89df625bc8023eeda64fbe61 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 2 Sep 2024 12:42:21 +0100 Subject: [PATCH 18/48] test: tests for getAnyOnce ->getAny with deprecated optiosn pass --- .../src/__test__/option-codemods.test.js | 45 +++++++++++++------ packages/codemods/try.js | 2 +- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index 6d42bd06..d0a03087 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -55,31 +55,48 @@ describe('codemods operating on options', () => { // all though the src doesn't actually handle these explicitly, // these tests ensure that the renaming of these methods to ones that // do get handled happens first - 'getAnyOnce', - 'mock', - ].forEach((methodName) => { + 'getAnyOnce:getOnce', + 'mock:route', + ].forEach((methods) => { + const [methodName, newMethodName = methodName] = methods.split(':'); describe(`when using ${methodName}`, () => { - if (/any/i.test(methodName)) { + if (methodName === 'getAnyOnce') { + it(`Removes as option on third parameter of ${methodName}()`, () => { + expectCodemodResult( + `fetchMock.getAnyOnce(200, {name: 'rio', ${optionName}: true})`, + `fetchMock.getOnce("*", 200, { + name: 'rio' +})`, + ); + }); + + it(`Removes third parameter of ${methodName}() if no other options remain`, () => { + expectCodemodResult( + `fetchMock.getAnyOnce(200, {${optionName}: true})`, + `fetchMock.getOnce("*", 200)`, + ); + }); + } else if (/any/.test(methodName)) { it(`Removes as option on third parameter of ${methodName}()`, () => { expectCodemodResult( `fetchMock.${methodName}(200, {name: 'rio', ${optionName}: true})`, - `fetchMock.${methodName}(200, { - name: 'rio' - })`, + `fetchMock.${newMethodName}(200, { + name: 'rio' +})`, ); }); it(`Removes third parameter of ${methodName}() if no other options remain`, () => { expectCodemodResult( - `fetchMock.${methodName}('*', 200, {${optionName}: true})`, - `fetchMock.${methodName}('*', 200)`, + `fetchMock.${methodName}(200, {${optionName}: true})`, + `fetchMock.${newMethodName}(200)`, ); }); } else { it(`Removes as option on first parameter of ${methodName}()`, () => { expectCodemodResult( `fetchMock.${methodName}({url: '*', response: 200, ${optionName}: true})`, - `fetchMock.${methodName}({ + `fetchMock.${newMethodName}({ url: '*', response: 200 })`, @@ -88,16 +105,16 @@ describe('codemods operating on options', () => { it(`Removes as option on third parameter of ${methodName}()`, () => { expectCodemodResult( `fetchMock.${methodName}('*', 200, {name: 'rio', ${optionName}: true})`, - `fetchMock.${methodName}('*', 200, { - name: 'rio' - })`, + `fetchMock.${newMethodName}('*', 200, { + name: 'rio' +})`, ); }); it(`Removes third parameter of ${methodName}() if no other options remain`, () => { expectCodemodResult( `fetchMock.${methodName}('*', 200, {${optionName}: true})`, - `fetchMock.${methodName}('*', 200)`, + `fetchMock.${newMethodName}('*', 200)`, ); }); } diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 078a5be2..3ac6622d 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.once({url: '*', response: 200, sendAsJson: true}) +fetchMock.getAnyOnce(200, {sendAsJson: true}) `, jscodeshift, ), From 3b0786f334643da29aaf3238a97bdff7c11c5601 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 14 Sep 2024 18:12:39 +0100 Subject: [PATCH 19/48] test: add tests for removing multiple options at once --- .../src/__test__/option-codemods.test.js | 74 ++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index d0a03087..bab1658f 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -52,7 +52,7 @@ describe('codemods operating on options', () => { 'patchOnce', 'any', 'anyOnce', - // all though the src doesn't actually handle these explicitly, + // although the src doesn't actually handle these explicitly, // these tests ensure that the renaming of these methods to ones that // do get handled happens first 'getAnyOnce:getOnce', @@ -121,7 +121,77 @@ describe('codemods operating on options', () => { }); }); }); - describe('acting on combinations of the 3 options together', () => {}); + describe('acting on combinations of the 3 options together', () => { + it('Removes as global option when using Object.assign', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {sendAsJson: true, overwriteRoutes: true})`, + '', + ); + }); + it('Removes as global option when using Object.assign alongside other options', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {sendAsJson: true, overwriteRoutes: true, other: 'value'})`, + `Object.assign(fetchMock.config, { + other: 'value' +})`, + ); + }); + + it(`Removes as option on third parameter of getAnyOnce()`, () => { + expectCodemodResult( + `fetchMock.getAnyOnce(200, {name: 'rio', sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.getOnce("*", 200, { + name: 'rio' +})`, + ); + }); + + it(`Removes third parameter of getAnyOnce() if no other options remain`, () => { + expectCodemodResult( + `fetchMock.getAnyOnce(200, {sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.getOnce("*", 200)`, + ); + }); + it(`Removes as option on third parameter of any()`, () => { + expectCodemodResult( + `fetchMock.any(200, {name: 'rio', sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.any(200, { + name: 'rio' +})`, + ); + }); + + it(`Removes third parameter of any() if no other options remain`, () => { + expectCodemodResult( + `fetchMock.any(200, {sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.any(200)`, + ); + }); + it(`Removes as option on first parameter of get()`, () => { + expectCodemodResult( + `fetchMock.get({url: '*', response: 200, sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.get({ + url: '*', + response: 200 +})`, + ); + }); + it(`Removes as option on third parameter of get()`, () => { + expectCodemodResult( + `fetchMock.get('*', 200, {name: 'rio', sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.get('*', 200, { + name: 'rio' +})`, + ); + }); + + it(`Removes third parameter of get() if no other options remain`, () => { + expectCodemodResult( + `fetchMock.get('*', 200, {sendAsJson: true, overwriteRoutes: true})`, + `fetchMock.get('*', 200)`, + ); + }); + }); }); describe('fallbackToNetwork', () => { // try to replace fallbackToNetwork: always with spyGlobal()... but probably just insert an error / comment that points at the docs From c272f65e903e6e835edbf3a087def0aded796b30 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 14 Sep 2024 19:07:19 +0100 Subject: [PATCH 20/48] feat: codemod fro fallbackToNetwork option --- .../src/__test__/option-codemods.test.js | 23 +++++++++- packages/codemods/src/codemods/options.js | 43 +++++++++++++------ packages/codemods/try.js | 2 +- 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index bab1658f..a9dbb29f 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -194,6 +194,27 @@ describe('codemods operating on options', () => { }); }); describe('fallbackToNetwork', () => { - // try to replace fallbackToNetwork: always with spyGlobal()... but probably just insert an error / comment that points at the docs + const errorString = + 'throw new Error("fallbackToNetwork option is deprecated. Use the `spyGlobal()` method instead")'; + it('Removes fallbackToNetwork as global option when setting directly as property', () => { + expectCodemodResult( + `fetchMock.config.fallbackToNetwork = true`, + errorString, + ); + }); + it('Removes fallbackToNetwork as global option when using Object.assign', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {fallbackToNetwork: true})`, + errorString, + ); + }); + it('Removes fallbackToNetwork as global option when using Object.assign alongside other options', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {fallbackToNetwork: true, other: 'value'})`, + `Object.assign(fetchMock.config, { + other: 'value' +})${errorString}`, + ); + }); }); }); diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index daf63672..a95e6606 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,5 +1,13 @@ import { getAllChainedMethodCalls } from './methods.js'; const simpleOptionNames = ['overwriteRoutes', 'warnOnFallback', 'sendAsJson']; + +function appendError(message, path, j) { + path + .closest(j.ExpressionStatement) + .insertAfter( + j(`throw new Error("${message}")`).find(j.ThrowStatement).get().value, + ); +} export function simpleOptions(fetchMockVariableName, root, j) { const configSets = root .find(j.CallExpression, { @@ -22,24 +30,31 @@ export function simpleOptions(fetchMockVariableName, root, j) { secondArg.type === 'ObjectExpression' ); }); - simpleOptionNames.forEach((name) => { - root - .find(j.AssignmentExpression, { - left: { + [...simpleOptionNames, 'fallbackToNetwork'].forEach((name) => { + const propertyAssignments = root.find(j.AssignmentExpression, { + left: { + type: 'MemberExpression', + property: { name }, + object: { type: 'MemberExpression', - property: { name }, + property: { name: 'config' }, object: { - type: 'MemberExpression', - property: { name: 'config' }, - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, + type: 'Identifier', + name: fetchMockVariableName, }, }, - }) - .remove(); - configSets.find(j.Property, { key: { name } }).remove(); + }, + }); + const objectAssignments = configSets.find(j.Property, { key: { name } }); + + if (name === 'fallbackToNetwork') { + const errorMessage = + 'fallbackToNetwork option is deprecated. Use the `spyGlobal()` method instead'; + appendError(errorMessage, propertyAssignments, j); + appendError(errorMessage, objectAssignments, j); + } + propertyAssignments.remove(); + objectAssignments.remove(); }); configSets diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 3ac6622d..0b97c1d9 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.getAnyOnce(200, {sendAsJson: true}) +Object.assign(fetchMock.config, {fallbackToNetwork: true}) `, jscodeshift, ), From fd4ff4184f86579e320875b1a587045b245201ae Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 17:44:27 +0100 Subject: [PATCH 21/48] test: added tests for resetting method codemods --- .../src/__test__/method-codemods.test.js | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 3814dd5e..18df3735 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -17,7 +17,6 @@ function expectCodemodResult( describe('codemods operating on methods', () => { describe('converting mock() to route()', () => { - //TODO Next to the first one in a file leave a comment explaining that they need to use mockGlobal() too it('single .mock()', () => { expectCodemodResult( 'fetchMock.mock("blah", 200)', @@ -66,6 +65,89 @@ describe('codemods operating on methods', () => { }); }); + describe('converting resetting methods', () => { + it('rewrites restore()', () => { + expectCodemodResult( + 'fetchMock.restore()', + ` + fetchMock.clearHistory(); + fetchMock.removeRoutes({ + includeFallback: true, + }); + fetchMock.unmockGlobal(); + `, + ); + }); + it('rewrites restore() with {sticky: true}', () => { + expectCodemodResult( + 'fetchMock.restore({sticky: true})', + ` + fetchMock.clearHistory(); + fetchMock.removeRoutes({ + includeSticky: true, + includeFallback: true, + }); + fetchMock.unmockGlobal(); + `, + ); + }); + it('rewrites reset()', () => { + expectCodemodResult( + 'fetchMock.reset()', + ` + fetchMock.clearHistory(); + fetchMock.removeRoutes({ + includeFallback: true, + }); + fetchMock.unmockGlobal(); + `, + ); + }); + it('rewrites reset() with {sticky: true}', () => { + expectCodemodResult( + 'fetchMock.reset({sticky: true})', + ` + fetchMock.clearHistory(); + fetchMock.removeRoutes({ + includeSticky: true, + includeFallback: true, + }); + fetchMock.unmockGlobal(); + `, + ); + }); + + it('rewrites resetBehavior()', () => { + expectCodemodResult( + 'fetchMock.resetBehavior()', + ` + fetchMock.removeRoutes({ + includeFallback: true, + }); + fetchMock.unmockGlobal(); + `, + ); + }); + it('rewrites resetBehavior() with {sticky: true}', () => { + expectCodemodResult( + 'fetchMock.resetBehavior({sticky: true})', + ` + fetchMock.removeRoutes({ + includeSticky: true, + includeFallback: true, + }); + fetchMock.unmockGlobal(); + `, + ); + }); + it('rewrites resetHistory()', () => { + expectCodemodResult( + 'fetchMock.resetHistory()', + 'fetchMock.clearHistory()', + ); + }); + }); + describe('converting lastUrl()', () => { it('single .lastUrl()', () => { expectCodemodResult( @@ -179,6 +261,7 @@ describe('codemods operating on methods', () => { }); // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) - // restore() / reset()... once I've decided how to implement these + // lastCall() => try to change uses of this to expect a callLog, but probably just insert a commemnt / error + // calls() => add error }); From 5f1203ebfcc173e3293c61e24c7348c5810f1a2e Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 17:54:28 +0100 Subject: [PATCH 22/48] feat: codemod resetHistory to clearHistory --- .../src/__test__/identifying-fetchmock-instances.test.js | 1 + packages/codemods/src/codemods/methods.js | 8 ++++++++ packages/codemods/try.js | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js index 0ec271d2..557282e3 100644 --- a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -59,4 +59,5 @@ describe('identifying fetch-mock instances', () => { // sandbox() instances // sandbox() instances used by jest / vitest.mock // identify multiple instances on a page e.g. fetchMock and fm=fetchMock.sandbox() + // identify when a fm instance with lots of chained methods is assigned to a new variable }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 5d565ff6..540559a7 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -32,6 +32,14 @@ export function simpleMethods(fetchMockVariableName, root, j) { if (method === 'mock') { path.value.callee.property.name = 'route'; } + + if (method === 'mock') { + path.value.callee.property.name = 'route'; + } + + if (method === 'resetHistory') { + path.value.callee.property.name = 'clearHistory'; + } ['get', 'post', 'put', 'delete', 'head', 'patch'].some((httpMethod) => { let prependStar = false; if (method === `${httpMethod}Any`) { diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 0b97c1d9..3cdfdcb0 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -Object.assign(fetchMock.config, {fallbackToNetwork: true}) +fetchMock.resetHistory() `, jscodeshift, ), From a96f62b60e95e691dd0f783de419db01a1b92302 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:06:57 +0100 Subject: [PATCH 23/48] feat: codemod reset() --- packages/codemods/src/codemods/methods.js | 30 +++++++++++++++++++++++ packages/codemods/try.js | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 540559a7..7bb4a89c 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -55,6 +55,36 @@ export function simpleMethods(fetchMockVariableName, root, j) { }); }); + root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: 'reset', + }, + }, + }) + .forEach((path) => { + const newExpressions = j(` +fetchMock.clearHistory(); +fetchMock.removeRoutes({ + includeFallback: true, +}); +fetchMock.unmockGlobal(); +`) + .find(j.ExpressionStatement) + .paths(); + const insertLocation = j(path) + .closest(j.ExpressionStatement) + .replaceWith(newExpressions.shift().value); + while (newExpressions.length) { + insertLocation.insertAfter(newExpressions.pop().value); + } + }); + [ ['lastUrl', 'url'], ['lastOptions', 'options'], diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 3cdfdcb0..940207c9 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.resetHistory() +fetchMock.reset(); `, jscodeshift, ), From 21e54afbd6eeb47aff1cff4f9ac367b89da4198f Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:08:16 +0100 Subject: [PATCH 24/48] feat: codemod restore() --- packages/codemods/src/codemods/methods.js | 47 ++++++++++++----------- packages/codemods/try.js | 2 +- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 7bb4a89c..8581894b 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -54,36 +54,37 @@ export function simpleMethods(fetchMockVariableName, root, j) { } }); }); - - root - .find(j.CallExpression, { - callee: { - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, - property: { - name: 'reset', + ['reset', 'restore'].forEach((methodName) => { + root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: methodName, + }, }, - }, - }) - .forEach((path) => { - const newExpressions = j(` + }) + .forEach((path) => { + const newExpressions = j(` fetchMock.clearHistory(); fetchMock.removeRoutes({ includeFallback: true, }); fetchMock.unmockGlobal(); `) - .find(j.ExpressionStatement) - .paths(); - const insertLocation = j(path) - .closest(j.ExpressionStatement) - .replaceWith(newExpressions.shift().value); - while (newExpressions.length) { - insertLocation.insertAfter(newExpressions.pop().value); - } - }); + .find(j.ExpressionStatement) + .paths(); + const insertLocation = j(path) + .closest(j.ExpressionStatement) + .replaceWith(newExpressions.shift().value); + while (newExpressions.length) { + insertLocation.insertAfter(newExpressions.pop().value); + } + }); + }); [ ['lastUrl', 'url'], diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 940207c9..20b56079 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.reset(); +fetchMock.restore(); `, jscodeshift, ), From e9d59dff405625289eb1378a7943d1cde1950125 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:23:32 +0100 Subject: [PATCH 25/48] feat: finished implementing reset method codemods --- .../src/__test__/method-codemods.test.js | 59 +++++-------------- packages/codemods/src/codemods/methods.js | 11 ++-- packages/codemods/try.js | 2 +- 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 18df3735..6705dbb5 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -69,75 +69,48 @@ describe('codemods operating on methods', () => { it('rewrites restore()', () => { expectCodemodResult( 'fetchMock.restore()', - ` - fetchMock.clearHistory(); - fetchMock.removeRoutes({ - includeFallback: true, - }); - fetchMock.unmockGlobal(); - `, + `fetchMock.clearHistory(); +fetchMock.removeRoutes(); +fetchMock.unmockGlobal();`, ); }); it('rewrites restore() with {sticky: true}', () => { expectCodemodResult( 'fetchMock.restore({sticky: true})', - ` - fetchMock.clearHistory(); - fetchMock.removeRoutes({ - includeSticky: true, - includeFallback: true, - }); - fetchMock.unmockGlobal(); - `, + `fetchMock.clearHistory(); +fetchMock.removeRoutes({includeSticky: true}); +fetchMock.unmockGlobal();`, ); }); it('rewrites reset()', () => { expectCodemodResult( 'fetchMock.reset()', - ` - fetchMock.clearHistory(); - fetchMock.removeRoutes({ - includeFallback: true, - }); - fetchMock.unmockGlobal(); - `, + `fetchMock.clearHistory(); +fetchMock.removeRoutes(); +fetchMock.unmockGlobal();`, ); }); it('rewrites reset() with {sticky: true}', () => { expectCodemodResult( 'fetchMock.reset({sticky: true})', - ` - fetchMock.clearHistory(); - fetchMock.removeRoutes({ - includeSticky: true, - includeFallback: true, - }); - fetchMock.unmockGlobal(); - `, + `fetchMock.clearHistory(); +fetchMock.removeRoutes({includeSticky: true}); +fetchMock.unmockGlobal();`, ); }); it('rewrites resetBehavior()', () => { expectCodemodResult( 'fetchMock.resetBehavior()', - ` - fetchMock.removeRoutes({ - includeFallback: true, - }); - fetchMock.unmockGlobal(); - `, + `fetchMock.removeRoutes(); +fetchMock.unmockGlobal();`, ); }); it('rewrites resetBehavior() with {sticky: true}', () => { expectCodemodResult( 'fetchMock.resetBehavior({sticky: true})', - ` - fetchMock.removeRoutes({ - includeSticky: true, - includeFallback: true, - }); - fetchMock.unmockGlobal(); - `, + `fetchMock.removeRoutes({includeSticky: true}); +fetchMock.unmockGlobal();`, ); }); it('rewrites resetHistory()', () => { diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 8581894b..7de52f56 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -54,7 +54,7 @@ export function simpleMethods(fetchMockVariableName, root, j) { } }); }); - ['reset', 'restore'].forEach((methodName) => { + ['reset', 'restore', 'resetBehavior'].forEach((methodName) => { root .find(j.CallExpression, { callee: { @@ -68,11 +68,12 @@ export function simpleMethods(fetchMockVariableName, root, j) { }, }) .forEach((path) => { + const sticky = path?.value?.arguments[0]?.properties?.find( + (prop) => prop.key.name === 'sticky', + )?.value?.value; const newExpressions = j(` -fetchMock.clearHistory(); -fetchMock.removeRoutes({ - includeFallback: true, -}); +${methodName !== 'resetBehavior' ? 'fetchMock.clearHistory()' : ''}; +fetchMock.removeRoutes(${sticky ? '{includeSticky: true}' : ''}); fetchMock.unmockGlobal(); `) .find(j.ExpressionStatement) diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 20b56079..08e1e84a 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.restore(); +fetchMock.resetBehavior(); `, jscodeshift, ), From 62fc48c8cce70267fe044088ca6cafab4139766c Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:28:32 +0100 Subject: [PATCH 26/48] feat: add an error to warn of lastCall() signature change --- .../src/__test__/method-codemods.test.js | 11 +++++++++- packages/codemods/src/codemods/methods.js | 21 +++++++++++++++++++ packages/codemods/try.js | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 6705dbb5..fba45ae0 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -144,6 +144,16 @@ fetchMock.unmockGlobal();`, }); }); + describe('converting lastCall()', () => { + it('single .lastUrl()', () => { + expectCodemodResult( + 'fetchMock.lastCall()', + `throw new Error("lastCall() now returns a CallLog object instead of an array. Refer to the documentation") +fetchMock.lastCall()`, + ); + }); + }); + describe('converting lastOptions()', () => { it('single .lastOptions()', () => { expectCodemodResult( @@ -234,7 +244,6 @@ fetchMock.unmockGlobal();`, }); // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) - // lastCall() => try to change uses of this to expect a callLog, but probably just insert a commemnt / error // calls() => add error }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 7de52f56..14926ee2 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -115,4 +115,25 @@ fetchMock.unmockGlobal(); return builder.find(j.ExpressionStatement).get().value; }); }); + + root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: 'lastCall', + }, + }, + }) + .closest(j.ExpressionStatement) + .insertBefore( + j( + 'throw new Error("lastCall() now returns a CallLog object instead of an array. Refer to the documentation")', + ) + .find(j.ThrowStatement) + .get().value, + ); } diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 08e1e84a..0dd5e6b4 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.resetBehavior(); +fetchMock.lastCall(); `, jscodeshift, ), From 5bf6f6765fe54a2eb0e1cc9424df02b721b9610c Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:30:35 +0100 Subject: [PATCH 27/48] feat: add an error to warn of calls() signature change --- .../src/__test__/method-codemods.test.js | 13 ++++++++---- packages/codemods/src/codemods/methods.js | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index fba45ae0..7d0175d3 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -144,14 +144,21 @@ fetchMock.unmockGlobal();`, }); }); - describe('converting lastCall()', () => { - it('single .lastUrl()', () => { + describe('warning about CallLog', () => { + it('lastCall()', () => { expectCodemodResult( 'fetchMock.lastCall()', `throw new Error("lastCall() now returns a CallLog object instead of an array. Refer to the documentation") fetchMock.lastCall()`, ); }); + it('calls()', () => { + expectCodemodResult( + 'fetchMock.calls()', + `throw new Error("calls() now returns an array of CallLog objects instead of an array of arrays. Refer to the documentation") +fetchMock.calls()`, + ); + }); }); describe('converting lastOptions()', () => { @@ -244,6 +251,4 @@ fetchMock.lastCall()`, }); // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) - // lastCall() => try to change uses of this to expect a callLog, but probably just insert a commemnt / error - // calls() => add error }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 14926ee2..b52695f6 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -136,4 +136,25 @@ fetchMock.unmockGlobal(); .find(j.ThrowStatement) .get().value, ); + + root + .find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: 'calls', + }, + }, + }) + .closest(j.ExpressionStatement) + .insertBefore( + j( + 'throw new Error("calls() now returns an array of CallLog objects instead of an array of arrays. Refer to the documentation")', + ) + .find(j.ThrowStatement) + .get().value, + ); } From c4b387129375252900f12264ffc786c931fd52ac Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:34:44 +0100 Subject: [PATCH 28/48] test: add tests for replacing sandbox() with fetchHandler --- .../src/__test__/method-codemods.test.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 7d0175d3..a963903c 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -250,5 +250,21 @@ fetchMock.calls()`, }); }); + describe('sandbox()', () => { + it('replace simple case with fetchHandler', () => { + expectCodemodResult( + `fetchMock.sandbox()`, + `throw new Error('In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs if this does not work for you') +fetchMock.fetchHandler`, + ); + }); + it('replace complex case with fetchHandler', () => { + expectCodemodResult( + `jest.mock('node-fetch', () => fetchMock.sandbox())`, + `throw new Error('In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs if this does not work for you') +jest.mock('node-fetch', () => fetchMock.fetchHandler)`, + ); + }); + }); // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) }); From dbb0b431b8d1894d032236199ae206f7790dbb2a Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sun, 15 Sep 2024 18:53:35 +0100 Subject: [PATCH 29/48] feat: midway through implementing codemods for sandbox --- .../src/__test__/method-codemods.test.js | 13 ++++++-- packages/codemods/src/codemods/methods.js | 30 ++++++++++++++++--- packages/codemods/try.js | 4 +-- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index a963903c..ced0ab98 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -254,17 +254,24 @@ fetchMock.calls()`, it('replace simple case with fetchHandler', () => { expectCodemodResult( `fetchMock.sandbox()`, - `throw new Error('In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs if this does not work for you') + `throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you") fetchMock.fetchHandler`, ); }); it('replace complex case with fetchHandler', () => { expectCodemodResult( `jest.mock('node-fetch', () => fetchMock.sandbox())`, - `throw new Error('In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs if this does not work for you') + `throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you") jest.mock('node-fetch', () => fetchMock.fetchHandler)`, ); }); + + it('replace complex case with fetchHandler', () => { + expectCodemodResult( + `jest.mock('node-fetch', () => require('fetch-mock').sandbox())`, + `throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you") +jest.mock('node-fetch', () => require('fetch-mock').fetchHandler)`, + ); + }); }); - // .sandbox() => .fetchHandler(and maybe a comment about.createInstance()) }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index b52695f6..632562a5 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -33,10 +33,6 @@ export function simpleMethods(fetchMockVariableName, root, j) { path.value.callee.property.name = 'route'; } - if (method === 'mock') { - path.value.callee.property.name = 'route'; - } - if (method === 'resetHistory') { path.value.callee.property.name = 'clearHistory'; } @@ -157,4 +153,30 @@ fetchMock.unmockGlobal(); .find(j.ThrowStatement) .get().value, ); + + const sandboxes = root.find(j.CallExpression, { + callee: { + object: { + type: 'Identifier', + name: fetchMockVariableName, + }, + property: { + name: 'sandbox', + }, + }, + }); + + sandboxes + .closest(j.ExpressionStatement) + .insertBefore( + j( + 'throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you")', + ) + .find(j.ThrowStatement) + .get().value, + ); + + sandboxes.replaceWith( + j('fetchMock.fetchHandler').find(j.MemberExpression).get().value, + ); } diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 0dd5e6b4..a2e89bc9 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -4,8 +4,8 @@ import jscodeshift from 'jscodeshift'; console.log( codemod( ` -import fetchMock from 'fetch-mock'; -fetchMock.lastCall(); +const fetchMock = require('fetch-mock'); +jest.mock('node-fetch', () => fetchMock.fetchHandler) `, jscodeshift, ), From a42817b392cc035653f0be149a6d51b0dcc53de4 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 16 Sep 2024 13:35:31 +0100 Subject: [PATCH 30/48] fix: avoided converting jest.mock() to jest.route() --- packages/codemods/src/__test__/integration.test.js | 1 + packages/codemods/src/codemods/methods.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index e69de29b..0f6b6aa4 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -0,0 +1 @@ +// won't rewrite similarly named methods such as jest.mock diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 632562a5..c118a65c 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -10,7 +10,11 @@ export function getAllChainedMethodCalls(fetchMockVariableName, root, j) { }) .map((path) => { const paths = [path]; - while (path.parentPath.value.type !== 'ExpressionStatement') { + while ( + !['ArrowFunctionExpression', 'ExpressionStatement'].includes( + path.parentPath.value.type, + ) + ) { path = path.parentPath; if (path.value.type === 'CallExpression') { paths.push(path); From c0adc0c1da843f436f0ef7da3f40af106bcc94a9 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 16 Sep 2024 15:50:01 +0100 Subject: [PATCH 31/48] test: scaffolded out some more tests for identifying references to fetch-mock --- .../identifying-fetchmock-instances.test.js | 89 +++++++++++++------ 1 file changed, 60 insertions(+), 29 deletions(-) diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js index 557282e3..c48c074a 100644 --- a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -10,54 +10,85 @@ describe('identifying fetch-mock instances', () => { it('cjs require() named fetchMock', () => { expectCodemodResult( ` - const fetchMock = require('fetch-mock'); - fetchMock.mock("blah", 200) - `, +const fetchMock = require('fetch-mock'); +fetchMock.mock("blah", 200) +`, ` - const fetchMock = require('fetch-mock'); - fetchMock.route("blah", 200) - `, +const fetchMock = require('fetch-mock'); +fetchMock.route("blah", 200) +`, ); }); it('cjs require() named something else', () => { expectCodemodResult( ` - const fetchNot = require('fetch-mock'); - fetchNot.mock("blah", 200) - `, +const fetchNot = require('fetch-mock'); +fetchNot.mock("blah", 200) +`, ` - const fetchNot = require('fetch-mock'); - fetchNot.route("blah", 200) - `, +const fetchNot = require('fetch-mock'); +fetchNot.route("blah", 200) +`, ); }); it('esm import named fetchMock', () => { expectCodemodResult( ` - import fetchMock from 'fetch-mock'; - fetchMock.mock("blah", 200) - `, +import fetchMock from 'fetch-mock'; +fetchMock.mock("blah", 200) +`, ` - import fetchMock from 'fetch-mock'; - fetchMock.route("blah", 200) - `, +import fetchMock from 'fetch-mock'; +fetchMock.route("blah", 200) +`, ); }); it('esm import named something else', () => { expectCodemodResult( ` - import fetchNot from 'fetch-mock'; - fetchNot.mock("blah", 200) - `, +import fetchNot from 'fetch-mock'; +fetchNot.mock("blah", 200) +`, ` - import fetchNot from 'fetch-mock'; - fetchNot.route("blah", 200) - `, +import fetchNot from 'fetch-mock'; +fetchNot.route("blah", 200) +`, + ); + }); + it('unassigned instances of require("fetch-mock")', () => { + expectCodemodResult( + `require('fetch-mock').mock("blah", 200)`, + `require('fetch-mock').route("blah", 200)`, + ); + }); + it.skip('sandbox() instances', () => { + expectCodemodResult( + ` +const fetchMock = require('fetch-mock'); +const fm = fetchMock.sandbox(); +fm.mock("blah", 200) +`, + ` +const fetchMock = require('fetch-mock'); +const fm = fetchMock.sandbox(); +fm.route("blah", 200) +`, + ); + }); + it.skip('sandbox() instances used by jest / vitest.mock', () => {}); + it.skip('identify multiple instances on a page e.g. fetchMock and fm=fetchMock.sandbox()', () => {}); + it.skip('identify when a fm instance with lots of chained methods is assigned to a new variable', () => { + expectCodemodResult( + ` +const fetchMock = require('fetch-mock'); +const fm = fetchMock.get('a', 'b'); +fm.mock("blah", 200) +`, + ` +const fetchMock = require('fetch-mock'); +const fm = fetchMock.sandbox(); +fm.route("blah", 200) +`, ); }); - // Identify fetch - mock references when mocking node - fetch in jest - // sandbox() instances - // sandbox() instances used by jest / vitest.mock - // identify multiple instances on a page e.g. fetchMock and fm=fetchMock.sandbox() - // identify when a fm instance with lots of chained methods is assigned to a new variable }); From 9a06c1e4386b8d4c33f6b7fea50be49634308fb4 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 16 Sep 2024 18:02:16 +0100 Subject: [PATCH 32/48] feat: remove codemods for sandbox() method Too many weird use cases to consider - best handled with documentation --- .../codemods/src/__test__/integration.test.js | 1 + .../src/__test__/method-codemods.test.js | 25 --------------- packages/codemods/src/codemods/methods.js | 31 ++----------------- packages/codemods/src/codemods/options.js | 9 +++--- packages/codemods/src/index.js | 15 ++++----- 5 files changed, 17 insertions(+), 64 deletions(-) diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index 0f6b6aa4..bc4414af 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -1 +1,2 @@ // won't rewrite similarly named methods such as jest.mock +// allow passing in a name of a fm variable to treat as an extra fetch-mock diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index ced0ab98..c38c5b77 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -249,29 +249,4 @@ fetchMock.calls()`, }); }); }); - - describe('sandbox()', () => { - it('replace simple case with fetchHandler', () => { - expectCodemodResult( - `fetchMock.sandbox()`, - `throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you") -fetchMock.fetchHandler`, - ); - }); - it('replace complex case with fetchHandler', () => { - expectCodemodResult( - `jest.mock('node-fetch', () => fetchMock.sandbox())`, - `throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you") -jest.mock('node-fetch', () => fetchMock.fetchHandler)`, - ); - }); - - it('replace complex case with fetchHandler', () => { - expectCodemodResult( - `jest.mock('node-fetch', () => require('fetch-mock').sandbox())`, - `throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you") -jest.mock('node-fetch', () => require('fetch-mock').fetchHandler)`, - ); - }); - }); }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index c118a65c..7e9b5d15 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -1,4 +1,5 @@ -export function getAllChainedMethodCalls(fetchMockVariableName, root, j) { +import j from 'jscodeshift'; +export function getAllChainedMethodCalls(fetchMockVariableName, root) { return root .find(j.CallExpression, { callee: { @@ -24,7 +25,7 @@ export function getAllChainedMethodCalls(fetchMockVariableName, root, j) { }); } -export function simpleMethods(fetchMockVariableName, root, j) { +export function simpleMethods(fetchMockVariableName, root) { const fetchMockMethodCalls = getAllChainedMethodCalls( fetchMockVariableName, root, @@ -157,30 +158,4 @@ fetchMock.unmockGlobal(); .find(j.ThrowStatement) .get().value, ); - - const sandboxes = root.find(j.CallExpression, { - callee: { - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, - property: { - name: 'sandbox', - }, - }, - }); - - sandboxes - .closest(j.ExpressionStatement) - .insertBefore( - j( - 'throw new Error("In most cases .sandbox() can now be replaced by .fetchHandler. Refer to the docs on .createInstance() if this does not work for you")', - ) - .find(j.ThrowStatement) - .get().value, - ); - - sandboxes.replaceWith( - j('fetchMock.fetchHandler').find(j.MemberExpression).get().value, - ); } diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index a95e6606..947799ed 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,14 +1,15 @@ +import j from 'jscodeshift'; import { getAllChainedMethodCalls } from './methods.js'; const simpleOptionNames = ['overwriteRoutes', 'warnOnFallback', 'sendAsJson']; -function appendError(message, path, j) { +function appendError(message, path) { path .closest(j.ExpressionStatement) .insertAfter( j(`throw new Error("${message}")`).find(j.ThrowStatement).get().value, ); } -export function simpleOptions(fetchMockVariableName, root, j) { +export function simpleOptions(fetchMockVariableName, root) { const configSets = root .find(j.CallExpression, { callee: { @@ -50,8 +51,8 @@ export function simpleOptions(fetchMockVariableName, root, j) { if (name === 'fallbackToNetwork') { const errorMessage = 'fallbackToNetwork option is deprecated. Use the `spyGlobal()` method instead'; - appendError(errorMessage, propertyAssignments, j); - appendError(errorMessage, objectAssignments, j); + appendError(errorMessage, propertyAssignments); + appendError(errorMessage, objectAssignments); } propertyAssignments.remove(); objectAssignments.remove(); diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 5b279864..f5c5027c 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -1,7 +1,8 @@ +import j from 'jscodeshift'; import { simpleOptions } from './codemods/options.js'; import { simpleMethods } from './codemods/methods.js'; -function findFetchMockVariableName(root, j) { +function findFetchMockVariableName(root) { let fetchMockVariableName; try { fetchMockVariableName = root @@ -28,17 +29,17 @@ function findFetchMockVariableName(root, j) { return fetchMockVariableName; } -export function codemod(source, j) { +export function codemod(source) { const root = j(source); - const fetchMockVariableName = findFetchMockVariableName(root, j); - simpleMethods(fetchMockVariableName, root, j); + const fetchMockVariableName = findFetchMockVariableName(root); + simpleMethods(fetchMockVariableName, root); // run after simpleMethods because means the options rewriters have to iterate // over smaller list of methods - simpleOptions(fetchMockVariableName, root, j); + simpleOptions(fetchMockVariableName, root); return root.toSource(); } -export default function transformer(file, api) { - return codemod(file.source, api.j); +export default function transformer(file) { + return codemod(file.source); } From 4d64a5325fb085821d66cf0ef062eab5bb599333 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 16 Sep 2024 18:04:06 +0100 Subject: [PATCH 33/48] test: skip tests for multiple instances of fetch-mock --- .../src/__test__/identifying-fetchmock-instances.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js index c48c074a..770dc55a 100644 --- a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js +++ b/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js @@ -55,7 +55,7 @@ fetchNot.route("blah", 200) `, ); }); - it('unassigned instances of require("fetch-mock")', () => { + it.skip('unassigned instances of require("fetch-mock")', () => { expectCodemodResult( `require('fetch-mock').mock("blah", 200)`, `require('fetch-mock').route("blah", 200)`, @@ -81,12 +81,12 @@ fm.route("blah", 200) expectCodemodResult( ` const fetchMock = require('fetch-mock'); -const fm = fetchMock.get('a', 'b'); +const fm = fetchMock.get('a', 'b').get('a', 'b'); fm.mock("blah", 200) `, ` const fetchMock = require('fetch-mock'); -const fm = fetchMock.sandbox(); +const fm = fetchMock.get('a', 'b').get('a', 'b'); fm.route("blah", 200) `, ); From f4a3c39de4540c7338d65ca59636b413bef11964 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Mon, 16 Sep 2024 18:30:48 +0100 Subject: [PATCH 34/48] docs: start documenting usage of codemods --- packages/codemods/README.md | 61 +++++++++++++++++++ .../codemods/src/__test__/integration.test.js | 1 + .../src/__test__/method-codemods.test.js | 34 +++++------ 3 files changed, 78 insertions(+), 18 deletions(-) create mode 100644 packages/codemods/README.md diff --git a/packages/codemods/README.md b/packages/codemods/README.md new file mode 100644 index 00000000..eccd31e3 --- /dev/null +++ b/packages/codemods/README.md @@ -0,0 +1,61 @@ +# @fetch-mock/codemods + +A tool for helping upgrade to fetch-mock@12. + +## Features + +- Identifies instances of fetch-mock imported using `require` or `import` +- Rewrites `.mock()` to `.route()` +- Rewrites `.reset()`, `.restore()`, `.resetBehavior()` and `.resetHistory()` to their equivalents in fetch-mock@12 +- Rewrites `.lastUrl()`, `.lastOptions()` and `lastResponse()` to their equivalents in fetch-mock@12 +- Adds an informative error whenever `.lastCall()` or `.calls()` are used with advice on how to manually correct these +- Converts `.getOnce()`, `.getAnyOnce()`, `.postOnce()` etc... - which have been removed - to calls to the underlying `.get()` method with additional options passed in. +- Removes uses of the deprecated options `overwriteRoutes`, `warnOnFallback`, `sendAsJson` +- Removes uses of the deprecated `fallbackToNetwork` option, and adds an informative error with details of how to replace with the `spyGlobal()` method + +## Limitations/Out of scope + +- Javascript is a language with multiple ways to do the same thing. While these codemods attempt to cover a few different patterns, it's likely that they don't cover all the ways fetch-mock is being used. Please raise an issue if you think they can be improved. +- fetch-mock@12 no longer has the `.mock()` method which combines defining a route _and_ setting up global mocking. All calls to `.mock()` are replaced by `.route()`. + If using global `fetch` you will also need to call `.mockGlobal()` at least once per test suite. +- The `.sandbox()` method previously created a `fetch` function that also had all the fetch-mock methods attached. This is no longer the case, but pulling it apart is complex and deliberately left out of scope for thsi codemod. +- Any uses of fetch-mock prior to assignig to a variable will not be modified e.g. `require('fetch-mock').mock('a', 'b')` will not be converted to `require('fetch-mock').route('a', 'b')` +- When using a pattern such as `jest.mock('node-fetch', () => require('fetch-mock').sandbox())`, the codemod is unable to identify that `require('node-fetch')` will be an instance of fetch-mock. + +Taking the last 3 points together, this example illustrates the kind of manual modifications required: + +### Before + +```js +jest.mock('node-fetch', () => require('fetch-mock').sandbox()); + +const nodeFetch = require('node-fetch'); + +it('runs a test', () => { + nodeFetch.get('http://a.com', 200); + myAPI.call(); + expect(nodeFetch.called()).toBe(true); +}); +``` + +### After + +```js +const fetchMock = require('fetch-mock'); + +jest.mock('node-fetch', () => fetchMock.fetchHandler); +const nodeFetch = require('node-fetch'); + +it('runs a test', () => { + fetchMock.get('http://a.com', 200); + myAPI.call(); + expect(fetchMock.called()).toBe(true); +}); +``` + +## Usage + +1. Do all your manual mods +2. run +3. correct all errors + If you use `.sandbox()` or other mocing libraries to assign fetch-mock to diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index bc4414af..c9e7ba3d 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -1,2 +1,3 @@ // won't rewrite similarly named methods such as jest.mock // allow passing in a name of a fm variable to treat as an extra fetch-mock +// The error for calls() should actually spell out the CallLog interface diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index c38c5b77..44c4e282 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -120,7 +120,22 @@ fetchMock.unmockGlobal();`, ); }); }); - + describe('warning about CallLog', () => { + it('lastCall()', () => { + expectCodemodResult( + 'fetchMock.lastCall()', + `throw new Error("lastCall() now returns a CallLog object instead of an array. Refer to the documentation") +fetchMock.lastCall()`, + ); + }); + it('calls()', () => { + expectCodemodResult( + 'fetchMock.calls()', + `throw new Error("calls() now returns an array of CallLog objects instead of an array of arrays. Refer to the documentation") +fetchMock.calls()`, + ); + }); + }); describe('converting lastUrl()', () => { it('single .lastUrl()', () => { expectCodemodResult( @@ -144,23 +159,6 @@ fetchMock.unmockGlobal();`, }); }); - describe('warning about CallLog', () => { - it('lastCall()', () => { - expectCodemodResult( - 'fetchMock.lastCall()', - `throw new Error("lastCall() now returns a CallLog object instead of an array. Refer to the documentation") -fetchMock.lastCall()`, - ); - }); - it('calls()', () => { - expectCodemodResult( - 'fetchMock.calls()', - `throw new Error("calls() now returns an array of CallLog objects instead of an array of arrays. Refer to the documentation") -fetchMock.calls()`, - ); - }); - }); - describe('converting lastOptions()', () => { it('single .lastOptions()', () => { expectCodemodResult( From 70dd5b2335dcf522f77afcda791419bfebe89652 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Wed, 18 Sep 2024 21:57:51 +0100 Subject: [PATCH 35/48] test: started scaffollding integration tests --- packages/codemods/src/__test__/integration.test.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index c9e7ba3d..e7b87151 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -1,3 +1,9 @@ -// won't rewrite similarly named methods such as jest.mock -// allow passing in a name of a fm variable to treat as an extra fetch-mock -// The error for calls() should actually spell out the CallLog interface +import { it, describe } from 'vitest'; + +describe('integration', () => { + it('allow passing in one or more variable names for fetch-mock', () => {}); + it('can operate on a js file', () => {}); + it('can operate on a ts file', () => {}); + it('can operate on a jsx file', () => {}); + it('can operate on a tsx file', () => {}); +}); From 517a6ac297e1d5c5bad194a771fa4e1419bd10ad Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Wed, 18 Sep 2024 21:58:38 +0100 Subject: [PATCH 36/48] docs: document how to use transform with jodeshift --- package-lock.json | 3 +++ packages/codemods/README.md | 36 +++++++++++++++++++++++----------- packages/codemods/package.json | 4 ---- tsconfig.json | 3 +-- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index d827ddc6..05e3fe34 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26520,6 +26520,9 @@ "dependencies": { "jscodeshift": "^17.0.0" }, + "bin": { + "codemods": "bin/run.sh" + }, "engines": { "node": ">=18.11.0" } diff --git a/packages/codemods/README.md b/packages/codemods/README.md index eccd31e3..27ff0559 100644 --- a/packages/codemods/README.md +++ b/packages/codemods/README.md @@ -2,6 +2,15 @@ A tool for helping upgrade to fetch-mock@12. +## Usage + +1. Install `npm i -D @fetch-mock/codemods jscodeshift`; +2. Manually modify any code using `.sandbox()` according to the example above. +3. Run `jscodeshift -t node_modules/@fetch-mock/codemods/wrc/index.jscodeshift .` to run over your entire project, or replace `.` with the directory/file paths you wish to modify. [The jscodeshift CLI has many options](https://jscodeshift.com/run/cli/) - adjust them to suit your project. +4. For scenarios where the codemod is unable to detect which variable contains a fetch-mock instance (e.g. when it is required in a global set up file, or when using `jest.mock()`) you may pass in one or more variable names using the `FM_VARIABLES` environment variable e.g. `FM_VARIABLES=fm,fetch` +5. After the codemods have executed, run your tests, correcting all the errors thrown. The notes on what is in/out of scope will help guide you. +6. Once all your tests are fixed you should be able to uninstall the codemods: `npm uninstall @fetch-mock/codemods jscodeshift` + ## Features - Identifies instances of fetch-mock imported using `require` or `import` @@ -18,11 +27,12 @@ A tool for helping upgrade to fetch-mock@12. - Javascript is a language with multiple ways to do the same thing. While these codemods attempt to cover a few different patterns, it's likely that they don't cover all the ways fetch-mock is being used. Please raise an issue if you think they can be improved. - fetch-mock@12 no longer has the `.mock()` method which combines defining a route _and_ setting up global mocking. All calls to `.mock()` are replaced by `.route()`. If using global `fetch` you will also need to call `.mockGlobal()` at least once per test suite. -- The `.sandbox()` method previously created a `fetch` function that also had all the fetch-mock methods attached. This is no longer the case, but pulling it apart is complex and deliberately left out of scope for thsi codemod. -- Any uses of fetch-mock prior to assignig to a variable will not be modified e.g. `require('fetch-mock').mock('a', 'b')` will not be converted to `require('fetch-mock').route('a', 'b')` +- The `.sandbox()` method previously created a `fetch` function that also had all the fetch-mock methods attached. This is no longer the case, but pulling it apart is complex and deliberately left out of scope for this codemod. +- Any uses of fetch-mock prior to assigning to a variable will not be modified e.g. `require('fetch-mock').mock('a', 'b')` will not be converted to `require('fetch-mock').route('a', 'b')` - When using a pattern such as `jest.mock('node-fetch', () => require('fetch-mock').sandbox())`, the codemod is unable to identify that `require('node-fetch')` will be an instance of fetch-mock. +- On the server side fetch-mock was previously built around node-fetch's classes, but now uses native `fetch`. In most cases, even if your application code still uses node-fetch, your mocks will still work. However, if you explicitly create instances of `Request` or `Headers` using node-fetch's classes, you may need to provide these to fetch-mock. -Taking the last 3 points together, this example illustrates the kind of manual modifications required: +Taking the last 4 points together, this example illustrates the kind of manual modifications required: ### Before @@ -43,7 +53,18 @@ it('runs a test', () => { ```js const fetchMock = require('fetch-mock'); -jest.mock('node-fetch', () => fetchMock.fetchHandler); +jest.mock('node-fetch', () => { + const nodeFetch = jest.requireActual('node-fetch'); + // only needed if your application makes use of Response, Request + // or Headers classes directly + Object.assign(fetchMock.config, { + fetch: nodeFetch, + Response: nodeFetch.Response, + Request: nodeFetch.Request, + Headers: nodeFetch.Headers, + }); + return fetchMock.fetchHandler; +}); const nodeFetch = require('node-fetch'); it('runs a test', () => { @@ -52,10 +73,3 @@ it('runs a test', () => { expect(fetchMock.called()).toBe(true); }); ``` - -## Usage - -1. Do all your manual mods -2. run -3. correct all errors - If you use `.sandbox()` or other mocing libraries to assign fetch-mock to diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 5d85e7b1..35ea2810 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -2,11 +2,7 @@ "name": "@fetch-mock/codemods", "description": "Codemods for upgrading fetch-mock", "version": "0.0.0", - "exports": { - "import": "./src/index.js" - }, "main": "./src/index.js", - "module": "./src/index.js", "type": "module", "engines": { "node": ">=18.11.0" diff --git a/tsconfig.json b/tsconfig.json index 811ceaec..fe332093 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,5 @@ "target": "es2021" }, "include": ["./packages/**/src/*.ts"], - "exclude": ["node_modules", "packages/**/__tests__"], - "ts-node": {"esm": true} + "exclude": ["node_modules", "packages/**/__tests__"] } From 317ede7ea305fd9df9c498444df2b7a0e1350449 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Wed, 18 Sep 2024 22:10:38 +0100 Subject: [PATCH 37/48] feat: allow manually specifying extra variables that hold fetch-mock instances --- .../codemods/src/__test__/integration.test.js | 21 +++++++++++++++++-- .../src/__test__/method-codemods.test.js | 7 +++---- .../src/__test__/option-codemods.test.js | 5 +---- packages/codemods/src/index.js | 13 +++++++++--- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index e7b87151..436a5774 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -1,7 +1,24 @@ -import { it, describe } from 'vitest'; +import { it, describe, expect } from 'vitest'; +import transformer from '../index'; + +function expectCodemodResult(src, expected) { + expect(transformer({ source: src })).toEqual(expected); +} describe('integration', () => { - it('allow passing in one or more variable names for fetch-mock', () => {}); + it('allow passing in one or more variable names for fetch-mock', () => { + process.env.FM_VARIABLES = 'fm1,fm2'; + expectCodemodResult( + `const fetchMock = require('fetch-mock'); +fetchMock.mock("blah", 200); +fm1.mock("blah", 200); +fm2.mock("blah", 200);`, + `const fetchMock = require('fetch-mock'); +fetchMock.route("blah", 200); +fm1.route("blah", 200); +fm2.route("blah", 200);`, + ); + }); it('can operate on a js file', () => {}); it('can operate on a ts file', () => {}); it('can operate on a jsx file', () => {}); diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__test__/method-codemods.test.js index 44c4e282..9d099c76 100644 --- a/packages/codemods/src/__test__/method-codemods.test.js +++ b/packages/codemods/src/__test__/method-codemods.test.js @@ -1,6 +1,5 @@ import { describe, it, expect } from 'vitest'; import { codemod } from '../index'; -import jscodeshift from 'jscodeshift'; const prependFetchMock = (src, fetchMockVariableName) => `const ${fetchMockVariableName} = require('fetch-mock');\n${src}`; @@ -10,9 +9,9 @@ function expectCodemodResult( expected, fetchMockVariableName = 'fetchMock', ) { - expect( - codemod(prependFetchMock(src, fetchMockVariableName), jscodeshift), - ).toEqual(prependFetchMock(expected, fetchMockVariableName)); + expect(codemod(prependFetchMock(src, fetchMockVariableName))).toEqual( + prependFetchMock(expected, fetchMockVariableName), + ); } describe('codemods operating on methods', () => { diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index a9dbb29f..eeba1305 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -1,14 +1,11 @@ import { describe, it, expect } from 'vitest'; import { codemod } from '../index'; -import jscodeshift from 'jscodeshift'; const prependFetchMock = (src) => `const fetchMock = require('fetch-mock');${src ? '\n' : ''}${src}`; function expectCodemodResult(src, expected) { - expect(codemod(prependFetchMock(src), jscodeshift)).toEqual( - prependFetchMock(expected), - ); + expect(codemod(prependFetchMock(src))).toEqual(prependFetchMock(expected)); } describe('codemods operating on options', () => { diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index f5c5027c..6797f6c7 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -29,9 +29,9 @@ function findFetchMockVariableName(root) { return fetchMockVariableName; } -export function codemod(source) { +export function codemod(source, variableName) { const root = j(source); - const fetchMockVariableName = findFetchMockVariableName(root); + const fetchMockVariableName = variableName || findFetchMockVariableName(root); simpleMethods(fetchMockVariableName, root); // run after simpleMethods because means the options rewriters have to iterate // over smaller list of methods @@ -41,5 +41,12 @@ export function codemod(source) { } export default function transformer(file) { - return codemod(file.source); + let modifiedSource = codemod(file.source); + if (process.env.FM_VARIABLES) { + const extraVariables = process.env.FM_VARIABLES.split(','); + extraVariables.forEach((variableName) => { + modifiedSource = codemod(modifiedSource, variableName); + }); + } + return modifiedSource; } From 90445a169351f1ee13fc25644d82033a79c02b62 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Wed, 18 Sep 2024 22:28:49 +0100 Subject: [PATCH 38/48] test: more work on integration tests --- package.json | 2 +- .../src/__test__/fixtures/extra-vars.js | 4 +++ .../codemods/src/__test__/fixtures/jsx.jsx | 2 ++ .../src/__test__/fixtures/typescript.ts | 4 +++ .../codemods/src/__test__/integration.test.js | 31 +++++++++++++++---- packages/codemods/src/index.js | 2 +- 6 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 packages/codemods/src/__test__/fixtures/extra-vars.js create mode 100644 packages/codemods/src/__test__/fixtures/jsx.jsx create mode 100644 packages/codemods/src/__test__/fixtures/typescript.ts diff --git a/package.json b/package.json index bdb17b7f..7a3224fc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint:ci": "eslint .", "prettier": "prettier --cache --write *.md \"./**/*.md\" *.json \"./**/*.json\"", "prettier:ci": "prettier *.md \"./**/*.md\" *.json \"./**/*.json\"", - "types:check": "tsc --project ./jsconfig.json && echo 'types check done'", + "types:check": "tsc --project ./tsconfig.json && echo 'types check done'", "prepare": "husky || echo \"husky not available\"", "build": "npm run build -w=packages", "docs": "npm run start -w docs", diff --git a/packages/codemods/src/__test__/fixtures/extra-vars.js b/packages/codemods/src/__test__/fixtures/extra-vars.js new file mode 100644 index 00000000..97a9c3d8 --- /dev/null +++ b/packages/codemods/src/__test__/fixtures/extra-vars.js @@ -0,0 +1,4 @@ +const fetchMock = require('fetch-mock'); +fetchMock.mock("blah", 200); +fm1.mock("blah", 200); +fm2.mock("blah", 200); diff --git a/packages/codemods/src/__test__/fixtures/jsx.jsx b/packages/codemods/src/__test__/fixtures/jsx.jsx new file mode 100644 index 00000000..a11116cc --- /dev/null +++ b/packages/codemods/src/__test__/fixtures/jsx.jsx @@ -0,0 +1,2 @@ +import fetchMock from 'fetch-mock'; +fetchMock.mock("blah",
Content
); diff --git a/packages/codemods/src/__test__/fixtures/typescript.ts b/packages/codemods/src/__test__/fixtures/typescript.ts new file mode 100644 index 00000000..d6dc94ae --- /dev/null +++ b/packages/codemods/src/__test__/fixtures/typescript.ts @@ -0,0 +1,4 @@ +import fetchMock from 'fetch-mock'; +function helper (res: number): { + fetchMock.mock("blah", res) +}; diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index 436a5774..f87131f2 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -1,12 +1,34 @@ import { it, describe, expect } from 'vitest'; -import transformer from '../index'; +const util = require('node:util'); +const exec = util.promisify(require('node:child_process').exec); function expectCodemodResult(src, expected) { expect(transformer({ source: src })).toEqual(expected); } describe('integration', () => { - it('allow passing in one or more variable names for fetch-mock', () => { + + it('can operate on typescript', async () => { + const { stdout, stderr } = await exec('jscodeshift -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/typescript.ts') + console.log({ stdout, stderr }) +// expectCodemodResult( +// `import fetchMock from 'fetch-mock'; +// function helper (res: number): { +// fetchMock.mock("blah", res) +// };` +// `import fetchMock from 'fetch-mock'; +// function helper (res: number): { +// fetchMock.route("blah", res); +// }`, +// ); + }); + it('can operate on jsx', () => { + `import fetchMock from 'fetch-mock'; + fetchMock.mock("blah",
Content
);` + `import fetchMock from 'fetch-mock'; + fetchMock.route("blah",
Content
);` + }); + it('allow passing in one or more additional variable names for fetch-mock', () => { process.env.FM_VARIABLES = 'fm1,fm2'; expectCodemodResult( `const fetchMock = require('fetch-mock'); @@ -18,9 +40,6 @@ fetchMock.route("blah", 200); fm1.route("blah", 200); fm2.route("blah", 200);`, ); + delete process.env.FM_VARIABLES }); - it('can operate on a js file', () => {}); - it('can operate on a ts file', () => {}); - it('can operate on a jsx file', () => {}); - it('can operate on a tsx file', () => {}); }); diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 6797f6c7..e382d758 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -40,7 +40,7 @@ export function codemod(source, variableName) { return root.toSource(); } -export default function transformer(file) { +export default function transformer(file, api) { let modifiedSource = codemod(file.source); if (process.env.FM_VARIABLES) { const extraVariables = process.env.FM_VARIABLES.split(','); From aad042bcf52939e7bb60d5cef5fe5cbb88488192 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Wed, 18 Sep 2024 22:34:59 +0100 Subject: [PATCH 39/48] refactor(codemod): Convert codemods to commonjs (for compatibility with jscodeshift CLI) --- packages/codemods/package.json | 2 +- packages/codemods/src/__test__/package.json | 1 + packages/codemods/src/codemods/methods.js | 8 +++++--- packages/codemods/src/codemods/options.js | 6 +++--- packages/codemods/src/index.js | 13 ++++++++----- 5 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 packages/codemods/src/__test__/package.json diff --git a/packages/codemods/package.json b/packages/codemods/package.json index 35ea2810..34da6ba6 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -3,7 +3,7 @@ "description": "Codemods for upgrading fetch-mock", "version": "0.0.0", "main": "./src/index.js", - "type": "module", + "type": "commonjs", "engines": { "node": ">=18.11.0" }, diff --git a/packages/codemods/src/__test__/package.json b/packages/codemods/src/__test__/package.json new file mode 100644 index 00000000..6990891f --- /dev/null +++ b/packages/codemods/src/__test__/package.json @@ -0,0 +1 @@ +{"type": "module"} diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 7e9b5d15..141eb8e4 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -1,5 +1,6 @@ -import j from 'jscodeshift'; -export function getAllChainedMethodCalls(fetchMockVariableName, root) { +const j = require('jscodeshift'); + +function getAllChainedMethodCalls(fetchMockVariableName, root) { return root .find(j.CallExpression, { callee: { @@ -25,7 +26,8 @@ export function getAllChainedMethodCalls(fetchMockVariableName, root) { }); } -export function simpleMethods(fetchMockVariableName, root) { +module.exports.getAllChainedMethodCalls = getAllChainedMethodCalls; +module.exports.simpleMethods = function(fetchMockVariableName, root) { const fetchMockMethodCalls = getAllChainedMethodCalls( fetchMockVariableName, root, diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index 947799ed..1ba0d9c9 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,5 +1,5 @@ -import j from 'jscodeshift'; -import { getAllChainedMethodCalls } from './methods.js'; +const j = require('jscodeshift'); +const { getAllChainedMethodCalls } = require('./methods.js'); const simpleOptionNames = ['overwriteRoutes', 'warnOnFallback', 'sendAsJson']; function appendError(message, path) { @@ -9,7 +9,7 @@ function appendError(message, path) { j(`throw new Error("${message}")`).find(j.ThrowStatement).get().value, ); } -export function simpleOptions(fetchMockVariableName, root) { +module.exports.simpleOptions = function(fetchMockVariableName, root) { const configSets = root .find(j.CallExpression, { callee: { diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index e382d758..28c7abed 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -1,6 +1,6 @@ -import j from 'jscodeshift'; -import { simpleOptions } from './codemods/options.js'; -import { simpleMethods } from './codemods/methods.js'; +const j = require( 'jscodeshift'); +const { simpleOptions } = require( './codemods/options.js'); +const { simpleMethods } = require( './codemods/methods.js'); function findFetchMockVariableName(root) { let fetchMockVariableName; @@ -29,7 +29,7 @@ function findFetchMockVariableName(root) { return fetchMockVariableName; } -export function codemod(source, variableName) { +function codemod(source, variableName) { const root = j(source); const fetchMockVariableName = variableName || findFetchMockVariableName(root); simpleMethods(fetchMockVariableName, root); @@ -40,7 +40,7 @@ export function codemod(source, variableName) { return root.toSource(); } -export default function transformer(file, api) { +function transformer(file, api) { let modifiedSource = codemod(file.source); if (process.env.FM_VARIABLES) { const extraVariables = process.env.FM_VARIABLES.split(','); @@ -50,3 +50,6 @@ export default function transformer(file, api) { } return modifiedSource; } + +module.exports = transformer; +module.exports.codemod = codemod; From 376d5c3de38a74f38b320f8b3dacffec44993861 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 08:45:31 +0100 Subject: [PATCH 40/48] feat: converted codemods to use tsx parser for greater reuse --- packages/codemods/src/__test__/fixtures/typescript.ts | 2 +- packages/codemods/src/__test__/integration.test.js | 2 +- packages/codemods/src/index.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/codemods/src/__test__/fixtures/typescript.ts b/packages/codemods/src/__test__/fixtures/typescript.ts index d6dc94ae..25d967ea 100644 --- a/packages/codemods/src/__test__/fixtures/typescript.ts +++ b/packages/codemods/src/__test__/fixtures/typescript.ts @@ -1,4 +1,4 @@ import fetchMock from 'fetch-mock'; -function helper (res: number): { +function helper (res: number):void { fetchMock.mock("blah", res) }; diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index f87131f2..3aaea60d 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -9,7 +9,7 @@ function expectCodemodResult(src, expected) { describe('integration', () => { it('can operate on typescript', async () => { - const { stdout, stderr } = await exec('jscodeshift -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/typescript.ts') + const { stdout, stderr } = await exec('jscodeshift --parser ts -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/typescript.ts') console.log({ stdout, stderr }) // expectCodemodResult( // `import fetchMock from 'fetch-mock'; diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 28c7abed..151409ec 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -1,4 +1,4 @@ -const j = require( 'jscodeshift'); +const j = require( 'jscodeshift').withParser('tsx'); const { simpleOptions } = require( './codemods/options.js'); const { simpleMethods } = require( './codemods/methods.js'); @@ -40,7 +40,7 @@ function codemod(source, variableName) { return root.toSource(); } -function transformer(file, api) { +function transformer(file) { let modifiedSource = codemod(file.source); if (process.env.FM_VARIABLES) { const extraVariables = process.env.FM_VARIABLES.split(','); From 78c2e3541e0be25d267ea47c28ee53641634ce4a Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 09:02:19 +0100 Subject: [PATCH 41/48] fix: changed to use j.ObjectProperty instead of j.Property --- .../src/__test__/option-codemods.test.js | 3 +- packages/codemods/src/codemods/methods.js | 4 +- packages/codemods/src/codemods/options.js | 39 +++++++++---------- packages/codemods/try.js | 12 ++---- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index eeba1305..30a2da76 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -210,7 +210,8 @@ describe('codemods operating on options', () => { `Object.assign(fetchMock.config, {fallbackToNetwork: true, other: 'value'})`, `Object.assign(fetchMock.config, { other: 'value' -})${errorString}`, +}); +${errorString}`, ); }); }); diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 141eb8e4..79cc6d64 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -1,4 +1,4 @@ -const j = require('jscodeshift'); +const j = require('jscodeshift').withParser('tsx'); function getAllChainedMethodCalls(fetchMockVariableName, root) { return root @@ -31,7 +31,6 @@ module.exports.simpleMethods = function(fetchMockVariableName, root) { const fetchMockMethodCalls = getAllChainedMethodCalls( fetchMockVariableName, root, - j, ); fetchMockMethodCalls.forEach((path) => { @@ -43,6 +42,7 @@ module.exports.simpleMethods = function(fetchMockVariableName, root) { if (method === 'resetHistory') { path.value.callee.property.name = 'clearHistory'; } + ['get', 'post', 'put', 'delete', 'head', 'patch'].some((httpMethod) => { let prependStar = false; if (method === `${httpMethod}Any`) { diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index 1ba0d9c9..4f129412 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,4 +1,4 @@ -const j = require('jscodeshift'); +const j = require('jscodeshift').withParser('tsx'); const { getAllChainedMethodCalls } = require('./methods.js'); const simpleOptionNames = ['overwriteRoutes', 'warnOnFallback', 'sendAsJson']; @@ -46,7 +46,7 @@ module.exports.simpleOptions = function(fetchMockVariableName, root) { }, }, }); - const objectAssignments = configSets.find(j.Property, { key: { name } }); + const objectAssignments = configSets.find(j.ObjectProperty, { key: { name } }); if (name === 'fallbackToNetwork') { const errorMessage = @@ -72,23 +72,23 @@ module.exports.simpleOptions = function(fetchMockVariableName, root) { ); [ - 'once', - 'route', - 'sticky', - 'any', - 'anyOnce', + // 'once', + // 'route', + // 'sticky', + // 'any', + // 'anyOnce', 'get', - 'getOnce', - 'post', - 'postOnce', - 'put', - 'putOnce', - 'delete', - 'deleteOnce', - 'head', - 'headOnce', - 'patch', - 'patchOnce', + // 'getOnce', + // 'post', + // 'postOnce', + // 'put', + // 'putOnce', + // 'delete', + // 'deleteOnce', + // 'head', + // 'headOnce', + // 'patch', + // 'patchOnce', ].some((methodName) => { const optionsObjects = fetchMockMethodCalls .filter((path) => path.value.callee.property.name === methodName) @@ -102,13 +102,12 @@ module.exports.simpleOptions = function(fetchMockVariableName, root) { }) .paths(); }); - if (!optionsObjects.length) { return; } simpleOptionNames.forEach((optionName) => { optionsObjects - .find(j.Property, { + .find(j.ObjectProperty, { key: { name: optionName }, }) .remove(); diff --git a/packages/codemods/try.js b/packages/codemods/try.js index a2e89bc9..204bce3f 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -1,12 +1,8 @@ -import { codemod } from './src/index.js'; -import jscodeshift from 'jscodeshift'; +const { codemod } = require( './src/index.js'); console.log( codemod( - ` -const fetchMock = require('fetch-mock'); -jest.mock('node-fetch', () => fetchMock.fetchHandler) -`, - jscodeshift, - ), + `const fetchMock = require('fetch-mock'); +fetchMock.get('*', 200, {name: 'rio', sendAsJson: true}); +`), ); From 3a610b7fce666cb2954715d28c2732ccbabcb960 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 09:10:00 +0100 Subject: [PATCH 42/48] fix: reinstated codemods for options on all methods --- .../src/__test__/option-codemods.test.js | 3 +- packages/codemods/src/codemods/options.js | 32 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index 30a2da76..eeba1305 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -210,8 +210,7 @@ describe('codemods operating on options', () => { `Object.assign(fetchMock.config, {fallbackToNetwork: true, other: 'value'})`, `Object.assign(fetchMock.config, { other: 'value' -}); -${errorString}`, +})${errorString}`, ); }); }); diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index 4f129412..ee2f6af7 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -72,23 +72,23 @@ module.exports.simpleOptions = function(fetchMockVariableName, root) { ); [ - // 'once', - // 'route', - // 'sticky', - // 'any', - // 'anyOnce', + 'once', + 'route', + 'sticky', + 'any', + 'anyOnce', 'get', - // 'getOnce', - // 'post', - // 'postOnce', - // 'put', - // 'putOnce', - // 'delete', - // 'deleteOnce', - // 'head', - // 'headOnce', - // 'patch', - // 'patchOnce', + 'getOnce', + 'post', + 'postOnce', + 'put', + 'putOnce', + 'delete', + 'deleteOnce', + 'head', + 'headOnce', + 'patch', + 'patchOnce', ].some((methodName) => { const optionsObjects = fetchMockMethodCalls .filter((path) => path.value.callee.property.name === methodName) From 5914d5fc5fe6bd291329e310e8d08b69de874c6b Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 09:27:26 +0100 Subject: [PATCH 43/48] test: finished integration tests --- eslint.config.js | 5 +- packages/codemods/README.md | 2 +- .../src/__test__/fixtures/extra-vars.js | 6 +- .../codemods/src/__test__/fixtures/tsx.tsx | 4 ++ .../src/__test__/fixtures/typescript.ts | 4 +- .../codemods/src/__test__/integration.test.js | 64 +++++++++---------- packages/codemods/src/__test__/package.json | 4 +- packages/codemods/src/codemods/methods.js | 4 +- packages/codemods/src/codemods/options.js | 8 ++- packages/codemods/src/index.js | 6 +- packages/codemods/try.js | 5 +- 11 files changed, 60 insertions(+), 52 deletions(-) create mode 100644 packages/codemods/src/__test__/fixtures/tsx.tsx diff --git a/eslint.config.js b/eslint.config.js index 0960b9ee..6808289d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -11,12 +11,15 @@ export default [ ignores: [ 'docs/**/*.js', 'packages/*/test/fixtures/*', + 'packages/**/__test__/fixtures/*', '**/dist/**/*', 'packages/fetch-mock/types/index.test-d.ts', ], }, eslint.configs.recommended, - ...tseslint.configs.recommended, + ...tseslint.configs.recommended.map((config) => { + return { ...config, ignores: ['packages/codemods/**'] }; + }), eslintConfigPrettier, { rules: { diff --git a/packages/codemods/README.md b/packages/codemods/README.md index 27ff0559..4cf42a7a 100644 --- a/packages/codemods/README.md +++ b/packages/codemods/README.md @@ -6,7 +6,7 @@ A tool for helping upgrade to fetch-mock@12. 1. Install `npm i -D @fetch-mock/codemods jscodeshift`; 2. Manually modify any code using `.sandbox()` according to the example above. -3. Run `jscodeshift -t node_modules/@fetch-mock/codemods/wrc/index.jscodeshift .` to run over your entire project, or replace `.` with the directory/file paths you wish to modify. [The jscodeshift CLI has many options](https://jscodeshift.com/run/cli/) - adjust them to suit your project. +3. Run `jscodeshift -t node_modules/@fetch-mock/codemods/wrc/index.jscodeshift .` to run over your entire project, or replace `.` with the directory/file paths you wish to modify. [The jscodeshift CLI has many options](https://jscodeshift.com/run/cli/) - adjust them to suit your project. **Note that the parser option should not be used as @fetch-mock/codemods forces use of the TSX parser in order to ensure compatibility with teh greatest range of projects**. 4. For scenarios where the codemod is unable to detect which variable contains a fetch-mock instance (e.g. when it is required in a global set up file, or when using `jest.mock()`) you may pass in one or more variable names using the `FM_VARIABLES` environment variable e.g. `FM_VARIABLES=fm,fetch` 5. After the codemods have executed, run your tests, correcting all the errors thrown. The notes on what is in/out of scope will help guide you. 6. Once all your tests are fixed you should be able to uninstall the codemods: `npm uninstall @fetch-mock/codemods jscodeshift` diff --git a/packages/codemods/src/__test__/fixtures/extra-vars.js b/packages/codemods/src/__test__/fixtures/extra-vars.js index 97a9c3d8..7e578278 100644 --- a/packages/codemods/src/__test__/fixtures/extra-vars.js +++ b/packages/codemods/src/__test__/fixtures/extra-vars.js @@ -1,4 +1,4 @@ const fetchMock = require('fetch-mock'); -fetchMock.mock("blah", 200); -fm1.mock("blah", 200); -fm2.mock("blah", 200); +fetchMock.mock('blah', 200); +fm1.mock('blah', 200); +fm2.mock('blah', 200); diff --git a/packages/codemods/src/__test__/fixtures/tsx.tsx b/packages/codemods/src/__test__/fixtures/tsx.tsx new file mode 100644 index 00000000..633f823a --- /dev/null +++ b/packages/codemods/src/__test__/fixtures/tsx.tsx @@ -0,0 +1,4 @@ +import fetchMock from 'fetch-mock'; +function helper (res: number): void { + fetchMock.mock("blah",
Content
); +}; diff --git a/packages/codemods/src/__test__/fixtures/typescript.ts b/packages/codemods/src/__test__/fixtures/typescript.ts index 25d967ea..6f7acbac 100644 --- a/packages/codemods/src/__test__/fixtures/typescript.ts +++ b/packages/codemods/src/__test__/fixtures/typescript.ts @@ -1,4 +1,4 @@ import fetchMock from 'fetch-mock'; -function helper (res: number):void { - fetchMock.mock("blah", res) +function helper (res: number): void { + fetchMock.mock("blah", res); }; diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index 3aaea60d..22ed253b 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -2,44 +2,40 @@ import { it, describe, expect } from 'vitest'; const util = require('node:util'); const exec = util.promisify(require('node:child_process').exec); -function expectCodemodResult(src, expected) { - expect(transformer({ source: src })).toEqual(expected); -} - describe('integration', () => { - it('can operate on typescript', async () => { - const { stdout, stderr } = await exec('jscodeshift --parser ts -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/typescript.ts') - console.log({ stdout, stderr }) -// expectCodemodResult( -// `import fetchMock from 'fetch-mock'; -// function helper (res: number): { -// fetchMock.mock("blah", res) -// };` -// `import fetchMock from 'fetch-mock'; -// function helper (res: number): { -// fetchMock.route("blah", res); -// }`, -// ); + const { stdout } = await exec( + 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/typescript.ts', + ); + expect(stdout).toContain(`import fetchMock from 'fetch-mock'; +function helper (res: number): void { + fetchMock.route("blah", res); +}`); }); - it('can operate on jsx', () => { - `import fetchMock from 'fetch-mock'; - fetchMock.mock("blah",
Content
);` - `import fetchMock from 'fetch-mock'; - fetchMock.route("blah",
Content
);` + it('can operate on jsx', async () => { + const { stdout } = await exec( + 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/jsx.jsx', + ); + expect(stdout).toContain(`import fetchMock from 'fetch-mock'; +fetchMock.route("blah",
Content
);`); + }); + + it('can operate on tsx', async () => { + const { stdout } = await exec( + 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/tsx.tsx', + ); + expect(stdout).toContain(`import fetchMock from 'fetch-mock'; +function helper (res: number): void { + fetchMock.route("blah",
Content
); +}`); }); - it('allow passing in one or more additional variable names for fetch-mock', () => { - process.env.FM_VARIABLES = 'fm1,fm2'; - expectCodemodResult( - `const fetchMock = require('fetch-mock'); -fetchMock.mock("blah", 200); -fm1.mock("blah", 200); -fm2.mock("blah", 200);`, - `const fetchMock = require('fetch-mock'); -fetchMock.route("blah", 200); -fm1.route("blah", 200); -fm2.route("blah", 200);`, + it('allow passing in one or more additional variable names for fetch-mock', async () => { + const { stdout } = await exec( + 'FM_VARIABLES=fm1,fm2 jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/extra-vars.js', ); - delete process.env.FM_VARIABLES + expect(stdout).toContain(`const fetchMock = require('fetch-mock'); +fetchMock.route('blah', 200); +fm1.route('blah', 200); +fm2.route('blah', 200);`); }); }); diff --git a/packages/codemods/src/__test__/package.json b/packages/codemods/src/__test__/package.json index 6990891f..bedb411a 100644 --- a/packages/codemods/src/__test__/package.json +++ b/packages/codemods/src/__test__/package.json @@ -1 +1,3 @@ -{"type": "module"} +{ + "type": "module" +} diff --git a/packages/codemods/src/codemods/methods.js b/packages/codemods/src/codemods/methods.js index 79cc6d64..5ed3cf2d 100644 --- a/packages/codemods/src/codemods/methods.js +++ b/packages/codemods/src/codemods/methods.js @@ -27,7 +27,7 @@ function getAllChainedMethodCalls(fetchMockVariableName, root) { } module.exports.getAllChainedMethodCalls = getAllChainedMethodCalls; -module.exports.simpleMethods = function(fetchMockVariableName, root) { +module.exports.simpleMethods = function (fetchMockVariableName, root) { const fetchMockMethodCalls = getAllChainedMethodCalls( fetchMockVariableName, root, @@ -160,4 +160,4 @@ fetchMock.unmockGlobal(); .find(j.ThrowStatement) .get().value, ); -} +}; diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index ee2f6af7..42db8a85 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -9,7 +9,7 @@ function appendError(message, path) { j(`throw new Error("${message}")`).find(j.ThrowStatement).get().value, ); } -module.exports.simpleOptions = function(fetchMockVariableName, root) { +module.exports.simpleOptions = function (fetchMockVariableName, root) { const configSets = root .find(j.CallExpression, { callee: { @@ -46,7 +46,9 @@ module.exports.simpleOptions = function(fetchMockVariableName, root) { }, }, }); - const objectAssignments = configSets.find(j.ObjectProperty, { key: { name } }); + const objectAssignments = configSets.find(j.ObjectProperty, { + key: { name }, + }); if (name === 'fallbackToNetwork') { const errorMessage = @@ -118,4 +120,4 @@ module.exports.simpleOptions = function(fetchMockVariableName, root) { }) .remove(); }); -} +}; diff --git a/packages/codemods/src/index.js b/packages/codemods/src/index.js index 151409ec..d081892d 100644 --- a/packages/codemods/src/index.js +++ b/packages/codemods/src/index.js @@ -1,6 +1,6 @@ -const j = require( 'jscodeshift').withParser('tsx'); -const { simpleOptions } = require( './codemods/options.js'); -const { simpleMethods } = require( './codemods/methods.js'); +const j = require('jscodeshift').withParser('tsx'); +const { simpleOptions } = require('./codemods/options.js'); +const { simpleMethods } = require('./codemods/methods.js'); function findFetchMockVariableName(root) { let fetchMockVariableName; diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 204bce3f..09b48b8c 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -1,8 +1,9 @@ -const { codemod } = require( './src/index.js'); +const { codemod } = require('./src/index.js'); console.log( codemod( `const fetchMock = require('fetch-mock'); fetchMock.get('*', 200, {name: 'rio', sendAsJson: true}); -`), +`, + ), ); From 4e35b532ee9d0fbd5038abeb268fc0b73771a861 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 09:32:12 +0100 Subject: [PATCH 44/48] chore: fix type-check error --- package-lock.json | 2400 +++++++++++----------- packages/vitest/src/vitest-extensions.ts | 1 - 2 files changed, 1220 insertions(+), 1181 deletions(-) diff --git a/package-lock.json b/package-lock.json index 05e3fe34..cfdd6d18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -199,9 +199,9 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.0.0.tgz", - "integrity": "sha512-6N5Qygv/Z/B+rPufnPDLNWgsMf1uubMU7iS52xLcQSLiGlTS4f9eLUrmNXSzHccP33uoFi6xN9craN1sZi5MPQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.5.1.tgz", + "integrity": "sha512-LWW7RiOELxa6mlTJKNryTas+YxbkPQWa1K0PfzUU/NCFdYJTPtrMrwLIPO2VPGjZFKE1Mbffhn5TUHVQNAaBzQ==", "peer": true, "engines": { "node": ">= 14.0.0" @@ -227,14 +227,15 @@ } }, "node_modules/@algolia/client-search": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.0.0.tgz", - "integrity": "sha512-QdDYMzoxYZ3axzBy6CHe+M+NlOGvHEFTa2actchGnp25Uu0N6lyVNivT7nph+P1XoxgAD08cWbeJD3wWQXnpng==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.5.1.tgz", + "integrity": "sha512-Awz1ps6dSVF1YQTsIspRvdEnlk6GoBBbPuIAV+6K7YaqdUnPLaSsr96+OGC4N1bpu3OtTcN6+nQr+GrGY6zmxw==", "peer": true, "dependencies": { - "@algolia/client-common": "5.0.0", - "@algolia/requester-browser-xhr": "5.0.0", - "@algolia/requester-node-http": "5.0.0" + "@algolia/client-common": "5.5.1", + "@algolia/requester-browser-xhr": "5.5.1", + "@algolia/requester-fetch": "5.5.1", + "@algolia/requester-node-http": "5.5.1" }, "engines": { "node": ">= 14.0.0" @@ -312,12 +313,12 @@ } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.0.0.tgz", - "integrity": "sha512-oOoQhSpg/RGiGHjn/cqtYpHBkkd+5M/DCi1jmfW+ZOvLVx21QVt6PbWIJoKJF85moNFo4UG9pMBU35R1MaxUKQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.5.1.tgz", + "integrity": "sha512-75w2frEp1Q3Kdb5yhMr8VksOrd+esW+DyzBaV13hXiPmPMukx2GDXu9771sZj4zeAVCHEi/fem5the65c1M+9Q==", "peer": true, "dependencies": { - "@algolia/client-common": "5.0.0" + "@algolia/client-common": "5.5.1" }, "engines": { "node": ">= 14.0.0" @@ -328,13 +329,25 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" }, + "node_modules/@algolia/requester-fetch": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.5.1.tgz", + "integrity": "sha512-QFIfWqEkPpJHq9UicKTmzOKP5YZWixyUrEFMMfofI+aNxKug9ALVD0ldHzOcQGsbnhmMIFSEYckqDNSilaSzYQ==", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.5.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/requester-node-http": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.0.0.tgz", - "integrity": "sha512-FwCdugzpnW0wxbgWPauAz5vhmWGQnjZa5DCl9PBbIoDNEy/NIV8DmiL9CEA+LljQdDidG0l0ijojcTNaRRtPvQ==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.5.1.tgz", + "integrity": "sha512-X1VRcMYDAIRqACYi0gd85PE9oEBU2+Y3AuIDpokxXNgAiGf0f/HO3/M8lfT2AXIzPFxMJk4mQV0So8wgR94s9Q==", "peer": true, "dependencies": { - "@algolia/client-common": "5.0.0" + "@algolia/client-common": "5.5.1" }, "engines": { "node": ">= 14.0.0" @@ -386,9 +399,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "engines": { "node": ">=6.9.0" } @@ -431,11 +444,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -491,16 +504,16 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.0", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -711,12 +724,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dependencies": { "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -788,11 +801,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -970,11 +983,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -984,11 +997,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1128,11 +1141,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1171,14 +1184,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-remap-async-to-generator": "^7.25.0", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.4" }, "engines": { "node": ">=6.9.0" @@ -1232,12 +1245,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1263,15 +1276,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" }, "engines": { @@ -1711,12 +1724,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1861,14 +1874,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", - "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", + "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", "dependencies": { "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -2021,12 +2034,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2036,11 +2049,11 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", "dependencies": { - "@babel/compat-data": "^7.25.2", + "@babel/compat-data": "^7.25.4", "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", @@ -2069,13 +2082,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", + "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", @@ -2103,7 +2116,7 @@ "@babel/plugin-transform-optional-catch-binding": "^7.24.7", "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-property-literals": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", @@ -2116,10 +2129,10 @@ "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.37.1", "semver": "^6.3.1" @@ -2338,9 +2351,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", - "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2349,9 +2362,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz", - "integrity": "sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", + "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2374,15 +2387,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2399,9 +2412,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -2454,17 +2467,17 @@ } }, "node_modules/@commitlint/cli": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.4.0.tgz", - "integrity": "sha512-sJX4J9UioVwZHq7JWM9tjT5bgWYaIN3rC4FP7YwfEwBYiIO+wMyRttRvQLNkow0vCdM0D67r9NEWU0Ui03I4Eg==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.5.0.tgz", + "integrity": "sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==", "dev": true, "dependencies": { - "@commitlint/format": "^19.3.0", - "@commitlint/lint": "^19.2.2", - "@commitlint/load": "^19.4.0", - "@commitlint/read": "^19.4.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1", + "@commitlint/format": "^19.5.0", + "@commitlint/lint": "^19.5.0", + "@commitlint/load": "^19.5.0", + "@commitlint/read": "^19.5.0", + "@commitlint/types": "^19.5.0", + "tinyexec": "^0.3.0", "yargs": "^17.0.0" }, "bin": { @@ -2475,12 +2488,12 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", - "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz", + "integrity": "sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==", "dev": true, "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { @@ -2488,12 +2501,12 @@ } }, "node_modules/@commitlint/config-validator": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", - "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz", + "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==", "dev": true, "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "ajv": "^8.11.0" }, "engines": { @@ -2501,12 +2514,12 @@ } }, "node_modules/@commitlint/ensure": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", - "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz", + "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==", "dev": true, "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", @@ -2518,21 +2531,21 @@ } }, "node_modules/@commitlint/execute-rule": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", - "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz", + "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==", "dev": true, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/format": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", - "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz", + "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==", "dev": true, "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "chalk": "^5.3.0" }, "engines": { @@ -2540,12 +2553,12 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", - "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.5.0.tgz", + "integrity": "sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==", "dev": true, "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "semver": "^7.6.0" }, "engines": { @@ -2553,30 +2566,30 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", - "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.5.0.tgz", + "integrity": "sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^19.2.2", - "@commitlint/parse": "^19.0.3", - "@commitlint/rules": "^19.0.3", - "@commitlint/types": "^19.0.3" + "@commitlint/is-ignored": "^19.5.0", + "@commitlint/parse": "^19.5.0", + "@commitlint/rules": "^19.5.0", + "@commitlint/types": "^19.5.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/load": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.4.0.tgz", - "integrity": "sha512-I4lCWaEZYQJ1y+Y+gdvbGAx9pYPavqZAZ3/7/8BpWh+QjscAn8AjsUpLV2PycBsEx7gupq5gM4BViV9xwTIJuw==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.5.0.tgz", + "integrity": "sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^19.0.3", - "@commitlint/execute-rule": "^19.0.0", - "@commitlint/resolve-extends": "^19.1.0", - "@commitlint/types": "^19.0.3", + "@commitlint/config-validator": "^19.5.0", + "@commitlint/execute-rule": "^19.5.0", + "@commitlint/resolve-extends": "^19.5.0", + "@commitlint/types": "^19.5.0", "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^5.0.0", @@ -2589,21 +2602,21 @@ } }, "node_modules/@commitlint/message": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", - "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz", + "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==", "dev": true, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/parse": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", - "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz", + "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==", "dev": true, "dependencies": { - "@commitlint/types": "^19.0.3", + "@commitlint/types": "^19.5.0", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" }, @@ -2612,29 +2625,29 @@ } }, "node_modules/@commitlint/read": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.4.0.tgz", - "integrity": "sha512-r95jLOEZzKDakXtnQub+zR3xjdnrl2XzerPwm7ch1/cc5JGq04tyaNpa6ty0CRCWdVrk4CZHhqHozb8yZwy2+g==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz", + "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==", "dev": true, "dependencies": { - "@commitlint/top-level": "^19.0.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1", + "@commitlint/top-level": "^19.5.0", + "@commitlint/types": "^19.5.0", "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8" + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/resolve-extends": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", - "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz", + "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==", "dev": true, "dependencies": { - "@commitlint/config-validator": "^19.0.3", - "@commitlint/types": "^19.0.3", + "@commitlint/config-validator": "^19.5.0", + "@commitlint/types": "^19.5.0", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", @@ -2645,34 +2658,33 @@ } }, "node_modules/@commitlint/rules": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", - "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.5.0.tgz", + "integrity": "sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==", "dev": true, "dependencies": { - "@commitlint/ensure": "^19.0.3", - "@commitlint/message": "^19.0.0", - "@commitlint/to-lines": "^19.0.0", - "@commitlint/types": "^19.0.3", - "execa": "^8.0.1" + "@commitlint/ensure": "^19.5.0", + "@commitlint/message": "^19.5.0", + "@commitlint/to-lines": "^19.5.0", + "@commitlint/types": "^19.5.0" }, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/to-lines": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", - "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz", + "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==", "dev": true, "engines": { "node": ">=v18" } }, "node_modules/@commitlint/top-level": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", - "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz", + "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==", "dev": true, "dependencies": { "find-up": "^7.0.0" @@ -2682,9 +2694,9 @@ } }, "node_modules/@commitlint/types": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", - "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz", + "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==", "dev": true, "dependencies": { "@types/conventional-commits-parser": "^5.0.0", @@ -4168,18 +4180,18 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "devOptional": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", "devOptional": true, "dependencies": { "@eslint/object-schema": "^2.1.4", @@ -4248,9 +4260,9 @@ "devOptional": true }, "node_modules/@eslint/js": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.0.tgz", - "integrity": "sha512-hhetes6ZHP3BlXLxmd8K2SNgkhNSi+UcecbnwWKwpP7kyi/uC75DJ1lOOBO3xrC4jyojtGE3YxKZPHfk4yrgug==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.10.0.tgz", + "integrity": "sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==", "devOptional": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4265,6 +4277,18 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.1.0.tgz", + "integrity": "sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==", + "devOptional": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@fetch-mock/codemods": { "resolved": "packages/codemods", "link": true @@ -4321,31 +4345,30 @@ } }, "node_modules/@inquirer/confirm": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", - "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", "devOptional": true, "dependencies": { - "@inquirer/core": "^9.0.10", - "@inquirer/type": "^1.5.2" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" }, "engines": { "node": ">=18" } }, "node_modules/@inquirer/core": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.10.tgz", - "integrity": "sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", "devOptional": true, "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.2", + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", "@types/mute-stream": "^0.0.4", - "@types/node": "^22.1.0", + "@types/node": "^22.5.5", "@types/wrap-ansi": "^3.0.0", "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", "mute-stream": "^1.0.0", "signal-exit": "^4.1.0", @@ -4357,13 +4380,25 @@ "node": ">=18" } }, + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "devOptional": true, + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@inquirer/core/node_modules/@types/node": { - "version": "22.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz", - "integrity": "sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "devOptional": true, "dependencies": { - "undici-types": "~6.18.2" + "undici-types": "~6.19.2" } }, "node_modules/@inquirer/core/node_modules/ansi-styles": { @@ -4428,12 +4463,6 @@ "node": ">=8" } }, - "node_modules/@inquirer/core/node_modules/undici-types": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", - "integrity": "sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==", - "devOptional": true - }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -4449,18 +4478,18 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", "devOptional": true, "engines": { "node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.2.tgz", - "integrity": "sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "devOptional": true, "dependencies": { "mute-stream": "^1.0.0" @@ -4487,9 +4516,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "devOptional": true, "engines": { "node": ">=12" @@ -5281,16 +5310,16 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "version": "0.35.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.35.6.tgz", + "integrity": "sha512-PpD687w7qLxVMK176bpQjbzU9O0VC75QnBK5U1lKd29s4hIuxfTItUD6raNKyQ6BN8b64/8HE34RuYTkwH9uPQ==", "devOptional": true, "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", + "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" }, "engines": { @@ -5411,14 +5440,14 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.25", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", - "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" + "version": "1.0.0-next.27", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.27.tgz", + "integrity": "sha512-MU0SYgcrBdSVLu7Tfow3VY4z1odzlaTYRjt3WQ0z8XbjDWReuy+EALt2HdjhrwD2HPiW2GY+KTSw4HLv4C/EOA==" }, "node_modules/@promptbook/utils": { - "version": "0.63.4", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.63.4.tgz", - "integrity": "sha512-ME3I9Twxu/d7hpnGTkNYMUyIY8IAwY5Mg86i4xpD1WSZKfYMTNQomvkyk2Fi33vZDu8NDwb6Quyd0zJ0T3xo9w==", + "version": "0.70.0-1", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.70.0-1.tgz", + "integrity": "sha512-qd2lLRRN+sE6UuNMi2tEeUUeb4zmXnxY5EMdfHVXNE+bqBDpUC7/aEfXgA3jnUXEr+xFjQ8PTFQgWvBMaKvw0g==", "devOptional": true, "funding": [ { @@ -5472,6 +5501,12 @@ } } }, + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, "node_modules/@rollup/plugin-commonjs": { "version": "26.0.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", @@ -5545,9 +5580,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", - "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.0.tgz", + "integrity": "sha512-/IZQvg6ZR0tAkEi4tdXOraQoWeJy9gbQ/cx4I7k9dJaCk9qrXEcdouxRVz5kZXt5C2bQ9pILoAA+KB4C/d3pfw==", "cpu": [ "arm" ], @@ -5557,9 +5592,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", - "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.0.tgz", + "integrity": "sha512-ETHi4bxrYnvOtXeM7d4V4kZWixib2jddFacJjsOjwbgYSRsyXYtZHC4ht134OsslPIcnkqT+TKV4eU8rNBKyyQ==", "cpu": [ "arm64" ], @@ -5569,9 +5604,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", - "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.0.tgz", + "integrity": "sha512-ZWgARzhSKE+gVUX7QWaECoRQsPwaD8ZR0Oxb3aUpzdErTvlEadfQpORPXkKSdKbFci9v8MJfkTtoEHnnW9Ulng==", "cpu": [ "arm64" ], @@ -5581,9 +5616,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", - "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.0.tgz", + "integrity": "sha512-h0ZAtOfHyio8Az6cwIGS+nHUfRMWBDO5jXB8PQCARVF6Na/G6XS2SFxDl8Oem+S5ZsHQgtsI7RT4JQnI1qrlaw==", "cpu": [ "x64" ], @@ -5593,9 +5628,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", - "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.0.tgz", + "integrity": "sha512-9pxQJSPwFsVi0ttOmqLY4JJ9pg9t1gKhK0JDbV1yUEETSx55fdyCjt39eBQ54OQCzAF0nVGO6LfEH1KnCPvelA==", "cpu": [ "arm" ], @@ -5605,9 +5640,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", - "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.0.tgz", + "integrity": "sha512-YJ5Ku5BmNJZb58A4qSEo3JlIG4d3G2lWyBi13ABlXzO41SsdnUKi3HQHe83VpwBVG4jHFTW65jOQb8qyoR+qzg==", "cpu": [ "arm" ], @@ -5617,9 +5652,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", - "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.0.tgz", + "integrity": "sha512-U4G4u7f+QCqHlVg1Nlx+qapZy+QoG+NV6ux+upo/T7arNGwKvKP2kmGM4W5QTbdewWFgudQxi3kDNST9GT1/mg==", "cpu": [ "arm64" ], @@ -5629,9 +5664,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", - "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.0.tgz", + "integrity": "sha512-aQpNlKmx3amwkA3a5J6nlXSahE1ijl0L9KuIjVOUhfOh7uw2S4piR3mtpxpRtbnK809SBtyPsM9q15CPTsY7HQ==", "cpu": [ "arm64" ], @@ -5641,9 +5676,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", - "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.0.tgz", + "integrity": "sha512-9fx6Zj/7vve/Fp4iexUFRKb5+RjLCff6YTRQl4CoDhdMfDoobWmhAxQWV3NfShMzQk1Q/iCnageFyGfqnsmeqQ==", "cpu": [ "ppc64" ], @@ -5653,9 +5688,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", - "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.0.tgz", + "integrity": "sha512-VWQiCcN7zBgZYLjndIEh5tamtnKg5TGxyZPWcN9zBtXBwfcGSZ5cHSdQZfQH/GB4uRxk0D3VYbOEe/chJhPGLQ==", "cpu": [ "riscv64" ], @@ -5665,9 +5700,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", - "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.0.tgz", + "integrity": "sha512-EHmPnPWvyYqncObwqrosb/CpH3GOjE76vWVs0g4hWsDRUVhg61hBmlVg5TPXqF+g+PvIbqkC7i3h8wbn4Gp2Fg==", "cpu": [ "s390x" ], @@ -5677,9 +5712,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", - "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.0.tgz", + "integrity": "sha512-tsSWy3YQzmpjDKnQ1Vcpy3p9Z+kMFbSIesCdMNgLizDWFhrLZIoN21JSq01g+MZMDFF+Y1+4zxgrlqPjid5ohg==", "cpu": [ "x64" ], @@ -5689,9 +5724,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", - "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.0.tgz", + "integrity": "sha512-anr1Y11uPOQrpuU8XOikY5lH4Qu94oS6j0xrulHk3NkLDq19MlX8Ng/pVipjxBJ9a2l3+F39REZYyWQFkZ4/fw==", "cpu": [ "x64" ], @@ -5701,9 +5736,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", - "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.0.tgz", + "integrity": "sha512-7LB+Bh+Ut7cfmO0m244/asvtIGQr5pG5Rvjz/l1Rnz1kDzM02pSX9jPaS0p+90H5I1x4d1FkCew+B7MOnoatNw==", "cpu": [ "arm64" ], @@ -5713,9 +5748,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", - "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.0.tgz", + "integrity": "sha512-+3qZ4rer7t/QsC5JwMpcvCVPRcJt1cJrYS/TMJZzXIJbxWFQEVhrIc26IhB+5Z9fT9umfVc+Es2mOZgl+7jdJQ==", "cpu": [ "ia32" ], @@ -5725,9 +5760,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", - "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.0.tgz", + "integrity": "sha512-YdicNOSJONVx/vuPkgPTyRoAPx3GbknBZRCOUkK84FJ/YTfs/F0vl/YsMscrB6Y177d+yDRcj+JWMPMCgshwrA==", "cpu": [ "x64" ], @@ -6284,9 +6319,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.17", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.17.tgz", - "integrity": "sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==", + "version": "4.3.19", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.19.tgz", + "integrity": "sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw==", "dev": true }, "node_modules/@types/connect": { @@ -6330,9 +6365,10 @@ } }, "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -6347,19 +6383,10 @@ "@types/eslint": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -6541,11 +6568,11 @@ } }, "node_modules/@types/node": { - "version": "20.14.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.15.tgz", - "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-forge": { @@ -6573,14 +6600,14 @@ "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==" + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -6588,9 +6615,9 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.3.3", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", - "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz", + "integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -6745,16 +6772,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.1.0.tgz", - "integrity": "sha512-LlNBaHFCEBPHyD4pZXb35mzjGkuGKXU5eeCA1SxvHfiRES0E82dOounfVpL4DCqYvJEKab0bZIA0gCRpdLKkCw==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", + "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.1.0", - "@typescript-eslint/type-utils": "8.1.0", - "@typescript-eslint/utils": "8.1.0", - "@typescript-eslint/visitor-keys": "8.1.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/type-utils": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -6778,15 +6805,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.1.0.tgz", - "integrity": "sha512-U7iTAtGgJk6DPX9wIWPPOlt1gO57097G06gIcl0N0EEnNw8RGD62c+2/DiP/zL7KrkqnnqF7gtFGR7YgzPllTA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", + "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.1.0", - "@typescript-eslint/types": "8.1.0", - "@typescript-eslint/typescript-estree": "8.1.0", - "@typescript-eslint/visitor-keys": "8.1.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4" }, "engines": { @@ -6806,13 +6833,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.1.0.tgz", - "integrity": "sha512-DsuOZQji687sQUjm4N6c9xABJa7fjvfIdjqpSIIVOgaENf2jFXiM9hIBZOL3hb6DHK9Nvd2d7zZnoMLf9e0OtQ==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", + "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.1.0", - "@typescript-eslint/visitor-keys": "8.1.0" + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6823,13 +6850,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.1.0.tgz", - "integrity": "sha512-oLYvTxljVvsMnldfl6jIKxTaU7ok7km0KDrwOt1RHYu6nxlhN3TIx8k5Q52L6wR33nOwDgM7VwW1fT1qMNfFIA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", + "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.1.0", - "@typescript-eslint/utils": "8.1.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/utils": "8.6.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -6847,9 +6874,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.1.0.tgz", - "integrity": "sha512-q2/Bxa0gMOu/2/AKALI0tCKbG2zppccnRIRCW6BaaTlRVaPKft4oVYPp7WOPpcnsgbr0qROAVCVKCvIQ0tbWog==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", + "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6860,15 +6887,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.1.0.tgz", - "integrity": "sha512-NTHhmufocEkMiAord/g++gWKb0Fr34e9AExBRdqgWdVBaKoei2dIyYKD9Q0jBnvfbEA5zaf8plUFMUH6kQ0vGg==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", + "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.1.0", - "@typescript-eslint/visitor-keys": "8.1.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -6896,26 +6923,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -6932,15 +6939,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.1.0.tgz", - "integrity": "sha512-ypRueFNKTIFwqPeJBfeIpxZ895PQhNyH4YID6js0UoBImWYoSjBsahUn9KMiJXh94uOjVBgHD9AmkyPsPnFwJA==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", + "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.1.0", - "@typescript-eslint/types": "8.1.0", - "@typescript-eslint/typescript-estree": "8.1.0" + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6954,12 +6961,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.1.0.tgz", - "integrity": "sha512-ba0lNI19awqZ5ZNKh6wCModMwoZs457StTebQ0q1NP58zSi2F6MOZRXwfKZy+jB78JNJ/WH8GSh2IQNzXX8Nag==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", + "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.1.0", + "@typescript-eslint/types": "8.6.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -6988,17 +6995,19 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitest/browser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.0.5.tgz", - "integrity": "sha512-VbOYtu/6R3d7ASZREcrJmRY/sQuRFO9wMVsEDqfYbWiJRh2fDNi8CL1Csn7Ux31pOcPmmM5QvzFCMpiojvVh8g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.1.tgz", + "integrity": "sha512-wLKqohwlZI24xMIEZAPwv9SVliv1avaIBeE0ou471D++BRPhiw2mubKBczFFIDHXuSL7UXb8/JQK9Ui6ttW9bQ==", "devOptional": true, "dependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.5.2", - "@vitest/utils": "2.0.5", - "magic-string": "^0.30.10", - "msw": "^2.3.2", + "@vitest/mocker": "2.1.1", + "@vitest/utils": "2.1.1", + "magic-string": "^0.30.11", + "msw": "^2.3.5", "sirv": "^2.0.4", + "tinyrainbow": "^1.2.0", "ws": "^8.18.0" }, "funding": { @@ -7006,7 +7015,7 @@ }, "peerDependencies": { "playwright": "*", - "vitest": "2.0.5", + "vitest": "2.1.1", "webdriverio": "*" }, "peerDependenciesMeta": { @@ -7022,13 +7031,13 @@ } }, "node_modules/@vitest/coverage-istanbul": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.0.5.tgz", - "integrity": "sha512-BvjWKtp7fiMAeYUD0mO5cuADzn1gmjTm54jm5qUEnh/O08riczun8rI4EtQlg3bWoRo2lT3FO8DmjPDX9ZthPw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.1.tgz", + "integrity": "sha512-ZQM8uLinwmhmLp49fxLxIM46nC7NisCbaiydcQoV1hLvQfFL92Gg3tInRvowZyV78G0IknjN10JzH7oqPlPjZw==", "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.3", - "debug": "^4.3.5", + "debug": "^4.3.6", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-instrument": "^6.0.3", "istanbul-lib-report": "^3.0.1", @@ -7042,23 +7051,23 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.0.5" + "vitest": "2.1.1" } }, "node_modules/@vitest/coverage-v8": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.5.tgz", - "integrity": "sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.1.tgz", + "integrity": "sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.5", + "debug": "^4.3.6", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.10", + "magic-string": "^0.30.11", "magicast": "^0.3.4", "std-env": "^3.7.0", "test-exclude": "^7.0.1", @@ -7068,16 +7077,22 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.0.5" + "@vitest/browser": "2.1.1", + "vitest": "2.1.1" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", + "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -7085,10 +7100,44 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", + "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", + "dependencies": { + "@vitest/spy": "^2.1.0-beta.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/spy": "2.1.1", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dependencies": { "tinyrainbow": "^1.2.0" }, @@ -7097,11 +7146,11 @@ } }, "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", + "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", "dependencies": { - "@vitest/utils": "2.0.5", + "@vitest/utils": "2.1.1", "pathe": "^1.1.2" }, "funding": { @@ -7109,12 +7158,12 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", + "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", + "@vitest/pretty-format": "2.1.1", + "magic-string": "^0.30.11", "pathe": "^1.1.2" }, "funding": { @@ -7122,9 +7171,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", + "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", "dependencies": { "tinyspy": "^3.0.0" }, @@ -7133,33 +7182,32 @@ } }, "node_modules/@vitest/ui": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.5.tgz", - "integrity": "sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.1.tgz", + "integrity": "sha512-IIxo2LkQDA+1TZdPLYPclzsXukBWd5dX2CKpGqH8CCt8Wh0ZuDn4+vuQ9qlppEju6/igDGzjWF/zyorfsf+nHg==", "devOptional": true, "dependencies": { - "@vitest/utils": "2.0.5", - "fast-glob": "^3.3.2", + "@vitest/utils": "2.1.1", "fflate": "^0.8.2", "flatted": "^3.3.1", "pathe": "^1.1.2", "sirv": "^2.0.4", + "tinyglobby": "^0.2.6", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.0.5" + "vitest": "2.1.1" } }, "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", + "@vitest/pretty-format": "2.1.1", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" }, @@ -7167,23 +7215,15 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@wdio/config": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.40.2.tgz", - "integrity": "sha512-RED2vcdX5Zdd6r+K+aWcjK4douxjJY4LP/8YvvavgqM0TURd5PDI0Y7IEz7+BIJOT4Uh+3atZawIN9/3yWFeag==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.40.3.tgz", + "integrity": "sha512-HIi+JnHEDAExhzGRQuZOXw1HWIpe/bsVFHwNISJhY6wS4Nijaigmegs2p14Rv16ydOF19hGrxdKsl8k5STIP2A==", "devOptional": true, "dependencies": { "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.40.2", + "@wdio/types": "8.40.3", + "@wdio/utils": "8.40.3", "decamelize": "^6.0.0", "deepmerge-ts": "^5.0.0", "glob": "^10.2.2", @@ -7209,9 +7249,9 @@ } }, "node_modules/@wdio/logger/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "devOptional": true, "engines": { "node": ">=12" @@ -7236,44 +7276,62 @@ } }, "node_modules/@wdio/protocols": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.38.0.tgz", - "integrity": "sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.40.3.tgz", + "integrity": "sha512-wK7+eyrB3TAei8RwbdkcyoNk2dPu+mduMBOdPJjp8jf/mavd15nIUXLID1zA+w5m1Qt1DsT1NbvaeO9+aJQ33A==", "devOptional": true }, "node_modules/@wdio/repl": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", - "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.40.3.tgz", + "integrity": "sha512-mWEiBbaC7CgxvSd2/ozpbZWebnRIc8KRu/J81Hlw/txUWio27S7IpXBlZGVvhEsNzq0+cuxB/8gDkkXvMPbesw==", "devOptional": true, "dependencies": { - "@types/node": "^20.1.0" + "@types/node": "^22.2.0" }, "engines": { "node": "^16.13 || >=18" } }, + "node_modules/@wdio/repl/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "devOptional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/@wdio/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.39.0.tgz", - "integrity": "sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.40.3.tgz", + "integrity": "sha512-zK17uyON3Ise3m+XwiF5VrrdZcXXmvqB8AWXoKe88DiksFUPMVoCOuVL2SSX1KnA2YLlZBA55qcFZT99GORVKQ==", "devOptional": true, "dependencies": { - "@types/node": "^20.1.0" + "@types/node": "^22.2.0" }, "engines": { "node": "^16.13 || >=18" } }, + "node_modules/@wdio/types/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "devOptional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/@wdio/utils": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.40.2.tgz", - "integrity": "sha512-leYcCUSaAdLUCVKqRKNgMCASPOUo/VvOTKETiZ/qpdY2azCBt/KnLugtiycCzakeYg6Kp+VIjx5fkm0M7y4qhA==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.40.3.tgz", + "integrity": "sha512-pv/848KGfPN3YXU4QRfTYGkAu4/lejIfoGzGpvGNDcACiVxgZhyRZkJ2xVaSnGaXzF0R7pMozrkU5/DnEhcxMg==", "devOptional": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", + "@wdio/types": "8.40.3", "decamelize": "^6.0.0", "deepmerge-ts": "^5.1.0", "edgedriver": "^5.5.0", @@ -7431,9 +7489,9 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/@zip.js/zip.js": { - "version": "2.7.48", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.48.tgz", - "integrity": "sha512-J7cliimZ2snAbr0IhLx2U8BwfA1pKucahKzTpFtYq4hEgKxwvFJcIjCIVNPwQpfVab7iVP+AKmoH1gidBlyhiQ==", + "version": "2.7.52", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.52.tgz", + "integrity": "sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==", "devOptional": true, "engines": { "bun": ">=0.7.0", @@ -7493,9 +7551,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dependencies": { "acorn": "^8.11.0" }, @@ -7600,9 +7658,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.3.tgz", - "integrity": "sha512-2eoEz8mG4KHE+DzfrBTrCmDPxVXv7aZZWPojAJFtARpxxMO6lkos1dJ+XDCXdPvq7q3tpYWRi6xXmVQikejtpA==", + "version": "3.22.5", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.5.tgz", + "integrity": "sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -7771,18 +7829,6 @@ "node": ">= 14" } }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -7851,17 +7897,17 @@ } }, "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "bin": { "astring": "bin/astring" } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "devOptional": true }, "node_modules/asynckit": { @@ -7998,9 +8044,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -8212,9 +8258,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, "optional": true, "dependencies": { @@ -8224,9 +8270,9 @@ } }, "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, "optional": true }, @@ -8241,13 +8287,14 @@ } }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", + "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", "dev": true, "optional": true, "dependencies": { - "streamx": "^2.18.0" + "b4a": "^1.6.6", + "streamx": "^2.20.0" } }, "node_modules/base64-js": { @@ -8313,9 +8360,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -8325,7 +8372,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -8631,17 +8678,6 @@ "node": ">=14.16" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -8723,9 +8759,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", "funding": [ { "type": "opencollective", @@ -8938,9 +8974,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==" }, "node_modules/clean-css": { "version": "5.3.3", @@ -8987,18 +9023,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "devOptional": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-table3": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", @@ -9056,9 +9080,9 @@ } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -9068,9 +9092,9 @@ } }, "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { @@ -9351,18 +9375,6 @@ "node": ">= 14" } }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -9630,9 +9642,9 @@ } }, "node_modules/core-js": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.0.tgz", - "integrity": "sha512-XPpwqEodRljce9KswjZShh95qJ1URisBeKCjUdq27YdenkslVe7OO0ZJhlYXAChW7OhXaRLl8AAba7IBfoIHug==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -9640,9 +9652,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dependencies": { "browserslist": "^4.23.3" }, @@ -9652,9 +9664,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.0.tgz", - "integrity": "sha512-8balb/HAXo06aHP58mZMtXgD8vcnXz9tUDePgqBgJgKdmTlMt+jw3ujqniuBDQXMvTzxnMpxHFeuSM3g1jWQuQ==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -10161,17 +10173,23 @@ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, "node_modules/cssstyle": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", - "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", "devOptional": true, "dependencies": { - "rrweb-cssom": "^0.6.0" + "rrweb-cssom": "^0.7.1" }, "engines": { "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "devOptional": true + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -10217,11 +10235,11 @@ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -10393,104 +10411,6 @@ "node": ">= 10" } }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/default-gateway/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -10698,9 +10618,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1335233", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1335233.tgz", - "integrity": "sha512-bNTJw/m+v0JvQEsaI0l+i6mETHHf7VwZbQzT5GNSveGuYjip8uyjeF/qg84bsIPU+lFypnZr10a+cbcee6I8pg==", + "version": "0.0.1342118", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1342118.tgz", + "integrity": "sha512-75fMas7PkYNDTmDyb6PRJCH7ILmHLp+BhrZGeMsa4bCh40DTxgCz2NRy5UDzII4C5KuD0oBMZ9vXKhEl6UD/3w==", "devOptional": true }, "node_modules/diff-sequences": { @@ -10909,9 +10829,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.8.tgz", - "integrity": "sha512-4Nx0gP2tPNBLTrFxBMHpkQbtn2hidPVr/+/FTtcCiBYTucqc70zRyVZiOLj17Ui3wTO7SQ1/N+hkHYzJjBzt6A==" + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==" }, "node_modules/emittery": { "version": "0.13.1", @@ -10952,9 +10872,9 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "engines": { "node": ">= 0.8" } @@ -11094,9 +11014,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -11150,16 +11070,17 @@ } }, "node_modules/eslint": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.0.tgz", - "integrity": "sha512-JfiKJrbx0506OEerjK2Y1QlldtBxkAlLxT5OEcRF8uaQ86noDe2k31Vw9rnSWv+MXZHj7OOUV/dA0AhdLFcyvA==", + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.10.0.tgz", + "integrity": "sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==", "devOptional": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.1", + "@eslint/config-array": "^0.18.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.9.0", + "@eslint/js": "9.10.0", + "@eslint/plugin-kit": "^0.1.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", @@ -11182,7 +11103,6 @@ "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", @@ -11739,27 +11659,32 @@ } }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=16.17" + "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -11784,36 +11709,36 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -11857,9 +11782,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" }, "node_modules/express/node_modules/range-parser": { "version": "1.2.1", @@ -11993,9 +11918,9 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", "devOptional": true, "funding": [ { @@ -12096,15 +12021,6 @@ "node": "^12.20 || >= 14.13" } }, - "node_modules/fetch-blob/node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "devOptional": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/fetch-mock": { "resolved": "packages/fetch-mock", "link": true @@ -12245,12 +12161,12 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -12363,17 +12279,17 @@ "devOptional": true }, "node_modules/flow-parser": { - "version": "0.245.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.245.0.tgz", - "integrity": "sha512-xUBkkpIDfDZHAebnDEX65FCVitJUctab82KFmtP5SY4cGly1vbuYNe6Muyp0NLXrgmBChVdoC2T+3/RUHi4Mww==", + "version": "0.246.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.246.0.tgz", + "integrity": "sha512-WHRizzSrWFTcKo7cVcbP3wzZVhzsoYxoWqbnH4z+JXGqrjVmnsld6kBZWVlB200PwD5ur8r+HV3KUDxv3cHhOQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -12733,17 +12649,17 @@ } }, "node_modules/geckodriver": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.2.tgz", - "integrity": "sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.4.tgz", + "integrity": "sha512-0zaw19tcmWeluqx7+Y559JGBtidu1D0Lb8ElYKiNEQu8r3sCfrLUf5V10xypl8u29ZLbgRV7WflxCJVTCkCMFA==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@wdio/logger": "^8.28.0", - "@zip.js/zip.js": "^2.7.44", + "@wdio/logger": "^9.0.0", + "@zip.js/zip.js": "^2.7.48", "decamelize": "^6.0.0", "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", + "https-proxy-agent": "^7.0.5", "node-fetch": "^3.3.2", "tar-fs": "^3.0.6", "which": "^4.0.0" @@ -12755,6 +12671,33 @@ "node": "^16.13 || >=18 || >=20" } }, + "node_modules/geckodriver/node_modules/@wdio/logger": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.0.8.tgz", + "integrity": "sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==", + "devOptional": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18.20.0" + } + }, + "node_modules/geckodriver/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/geckodriver/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", @@ -12764,6 +12707,21 @@ "node": ">=16" } }, + "node_modules/geckodriver/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "devOptional": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/geckodriver/node_modules/tar-fs": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", @@ -12873,11 +12831,11 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13188,17 +13146,6 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -13464,16 +13411,16 @@ } }, "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dependencies": { - "inline-style-parser": "0.2.3" + "inline-style-parser": "0.2.4" } }, "node_modules/hast-util-to-parse5": { @@ -13884,17 +13831,17 @@ } }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { - "node": ">=16.17.0" + "node": ">=10.17.0" } }, "node_modules/husky": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.4.tgz", - "integrity": "sha512-bho94YyReb4JV7LYWRWxZ/xr6TtOTt8cMfmQ39MQYJ7f/YE268s3GdghGwi+y4zAeqewE5zYLvuhV0M0ijsDEA==", + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", "dev": true, "bin": { "husky": "bin.js" @@ -14208,9 +14155,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { "hasown": "^2.0.2" }, @@ -14422,11 +14369,11 @@ } }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14693,104 +14640,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/jest-changed-files/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, "node_modules/jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", @@ -16415,9 +16264,9 @@ } }, "node_modules/launch-editor": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", - "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" @@ -16512,9 +16361,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/lint-staged": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.9.tgz", - "integrity": "sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==", + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", "dev": true, "dependencies": { "chalk": "~5.3.0", @@ -16523,19 +16372,141 @@ "execa": "~8.0.1", "lilconfig": "~3.1.2", "listr2": "~8.2.4", - "micromatch": "~4.0.7", + "micromatch": "~4.0.8", "pidtree": "~0.6.0", "string-argv": "~0.3.2", "yaml": "~2.5.0" }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, "engines": { - "node": ">=18.12.0" + "node": ">=12" }, "funding": { - "url": "https://opencollective.com/lint-staged" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/listr2": { @@ -16556,9 +16527,9 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -16580,9 +16551,9 @@ } }, "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/listr2/node_modules/string-width": { @@ -16656,9 +16627,9 @@ } }, "node_modules/locate-app": { - "version": "2.4.27", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.27.tgz", - "integrity": "sha512-QCNcJic0ZEZwMNrOXEi1FkxAjnZ0FSf1vjsgJAdOtnRkmYQJWQoZRiO/xff2rT7PuG2f8BJpY4D5dZJIkP55hA==", + "version": "2.4.43", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.43.tgz", + "integrity": "sha512-BX6NEdECUGcDQw8aqqg02qLyF9rF8V+dAfyAnBzL2AofIlIvf4Q6EGXnzVWpWot9uBE+x/o8CjXHo7Zlegu91Q==", "devOptional": true, "funding": [ { @@ -16671,7 +16642,7 @@ } ], "dependencies": { - "@promptbook/utils": "0.63.4", + "@promptbook/utils": "0.70.0-1", "type-fest": "2.13.0", "userhome": "1.0.0" } @@ -16882,9 +16853,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -16906,9 +16877,9 @@ } }, "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { @@ -16992,9 +16963,9 @@ } }, "node_modules/loglevel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "devOptional": true, "engines": { "node": ">= 0.6.0" @@ -17083,13 +17054,13 @@ } }, "node_modules/magicast": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, @@ -17283,9 +17254,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -17410,9 +17381,9 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -17427,9 +17398,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -17441,7 +17412,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -17568,9 +17538,12 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -18234,9 +18207,9 @@ ] }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -18245,6 +18218,7 @@ "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" @@ -18502,9 +18476,9 @@ ] }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", "funding": [ { "type": "GitHub Sponsors", @@ -18518,6 +18492,7 @@ "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -18526,6 +18501,25 @@ "vfile-message": "^4.0.0" } }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", @@ -19265,9 +19259,9 @@ ] }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -19307,14 +19301,11 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/mimic-function": { @@ -19350,9 +19341,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -19456,14 +19447,14 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/msw": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.5.tgz", - "integrity": "sha512-+GUI4gX5YC5Bv33epBrD+BGdmDvBg2XGruiWnI3GbIbRmMMBeZ5gs3mJ51OWSGHgJKztZ8AtZeYMMNMVrje2/Q==", + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.4.8.tgz", + "integrity": "sha512-a+FUW1m5yT8cV9GBy0L/cbNg0EA4//SKEzgu3qFrpITrWYeZmqfo7dqtM74T2lAl69jjUjjCaEhZKaxG2Ns8DA==", "devOptional": true, "hasInstallScript": true, "dependencies": { @@ -19471,7 +19462,7 @@ "@bundled-es-modules/statuses": "^1.0.1", "@bundled-es-modules/tough-cookie": "^0.1.6", "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", + "@mswjs/interceptors": "^0.35.6", "@open-draft/until": "^2.1.0", "@types/cookie": "^0.6.0", "@types/statuses": "^2.0.4", @@ -19480,7 +19471,7 @@ "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", + "path-to-regexp": "^6.3.0", "strict-event-emitter": "^0.5.1", "type-fest": "^4.9.0", "yargs": "^17.7.2" @@ -19495,7 +19486,7 @@ "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "typescript": ">= 4.7.x" + "typescript": ">= 4.8.x" }, "peerDependenciesMeta": { "typescript": { @@ -19553,9 +19544,9 @@ "devOptional": true }, "node_modules/msw/node_modules/type-fest": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.24.0.tgz", - "integrity": "sha512-spAaHzc6qre0TlZQQ2aA/nGMe+2Z/wyGk5Z+Ru2VUfdNwT6kWO6TjevOlpebsATEG1EIQ2sOiDszud3lO5mt/Q==", + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.1.tgz", + "integrity": "sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==", "devOptional": true, "engines": { "node": ">=16" @@ -19771,28 +19762,14 @@ } }, "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/nprogress": { @@ -19888,14 +19865,14 @@ } }, "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -20278,9 +20255,9 @@ "devOptional": true }, "node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "devOptional": true }, "node_modules/path-type": { @@ -20337,9 +20314,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -20515,12 +20492,12 @@ } }, "node_modules/playwright": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.46.0.tgz", - "integrity": "sha512-XYJ5WvfefWONh1uPAUAi0H2xXV5S3vrtcnXe6uAOgdGi3aSpqOSXX08IAjXW34xitfuOJsvXU5anXZxPSEQiJw==", + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.1.tgz", + "integrity": "sha512-SUEKi6947IqYbKxRiqnbUobVZY4bF1uu+ZnZNJX9DfU1tlf2UhWfvVjLf01pQx9URsOr18bFVUKXmanYWhbfkw==", "devOptional": true, "dependencies": { - "playwright-core": "1.46.0" + "playwright-core": "1.47.1" }, "bin": { "playwright": "cli.js" @@ -20533,9 +20510,9 @@ } }, "node_modules/playwright-core": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.46.0.tgz", - "integrity": "sha512-9Y/d5UIwuJk8t3+lhmMSAJyNP1BUC/DqP3cQJDQQL/oWqAiuPTLgy7Q5dzglmTLwcBRdetzgNM/gni7ckfTr6A==", + "version": "1.47.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.1.tgz", + "integrity": "sha512-i1iyJdLftqtt51mEk6AhYFaAJCDx0xQ/O5NU8EKaWFgMjItPVma542Nh/Aq8aLCjIJSzjaiEQGW/nyqLkGF1OQ==", "devOptional": true, "bin": { "playwright-core": "cli.js" @@ -20573,9 +20550,9 @@ } }, "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -20592,8 +20569,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -21233,9 +21210,9 @@ } }, "node_modules/prism-react-renderer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", - "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz", + "integrity": "sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==", "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" @@ -21377,9 +21354,9 @@ "devOptional": true }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "devOptional": true, "dependencies": { "end-of-stream": "^1.1.0", @@ -21448,6 +21425,12 @@ "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", "devOptional": true }, + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "devOptional": true + }, "node_modules/puppeteer-core/node_modules/ws": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", @@ -21485,11 +21468,11 @@ ] }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -21843,9 +21826,9 @@ "devOptional": true }, "node_modules/react-json-view-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz", - "integrity": "sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", + "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", "engines": { "node": ">=14" }, @@ -21934,9 +21917,9 @@ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dependencies": { "isarray": "0.0.1" } @@ -22186,9 +22169,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dependencies": { "regenerate": "^1.4.2" }, @@ -22719,9 +22702,9 @@ } }, "node_modules/rollup": { - "version": "4.20.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", - "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.0.tgz", + "integrity": "sha512-W21MUIFPZ4+O2Je/EU+GP3iz7PH4pVPUXSbEZdatQnxo29+3rsUjgrJmzuAZU24z7yRAnFN6ukxeAhZh/c7hzg==", "dependencies": { "@types/estree": "1.0.5" }, @@ -22733,22 +22716,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.20.0", - "@rollup/rollup-android-arm64": "4.20.0", - "@rollup/rollup-darwin-arm64": "4.20.0", - "@rollup/rollup-darwin-x64": "4.20.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", - "@rollup/rollup-linux-arm-musleabihf": "4.20.0", - "@rollup/rollup-linux-arm64-gnu": "4.20.0", - "@rollup/rollup-linux-arm64-musl": "4.20.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", - "@rollup/rollup-linux-riscv64-gnu": "4.20.0", - "@rollup/rollup-linux-s390x-gnu": "4.20.0", - "@rollup/rollup-linux-x64-gnu": "4.20.0", - "@rollup/rollup-linux-x64-musl": "4.20.0", - "@rollup/rollup-win32-arm64-msvc": "4.20.0", - "@rollup/rollup-win32-ia32-msvc": "4.20.0", - "@rollup/rollup-win32-x64-msvc": "4.20.0", + "@rollup/rollup-android-arm-eabi": "4.22.0", + "@rollup/rollup-android-arm64": "4.22.0", + "@rollup/rollup-darwin-arm64": "4.22.0", + "@rollup/rollup-darwin-x64": "4.22.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.0", + "@rollup/rollup-linux-arm-musleabihf": "4.22.0", + "@rollup/rollup-linux-arm64-gnu": "4.22.0", + "@rollup/rollup-linux-arm64-musl": "4.22.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.0", + "@rollup/rollup-linux-riscv64-gnu": "4.22.0", + "@rollup/rollup-linux-s390x-gnu": "4.22.0", + "@rollup/rollup-linux-x64-gnu": "4.22.0", + "@rollup/rollup-linux-x64-musl": "4.22.0", + "@rollup/rollup-win32-arm64-msvc": "4.22.0", + "@rollup/rollup-win32-ia32-msvc": "4.22.0", + "@rollup/rollup-win32-x64-msvc": "4.22.0", "fsevents": "~2.3.2" } }, @@ -22825,6 +22808,11 @@ "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, "node_modules/rrweb-cssom": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", @@ -22837,9 +22825,9 @@ "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==" }, "node_modules/rtlcss": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.2.0.tgz", - "integrity": "sha512-AV+V3oOVvCrqyH5Q/6RuT1IDH1Xy5kJTkEWTWZPN5rdQ3HCFOd8SrbC7c6N5Y8bPpCfZSR6yYbUATXslvfvu5g==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -22949,9 +22937,9 @@ } }, "node_modules/search-insights": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.16.3.tgz", - "integrity": "sha512-hSHy/s4Zk2xibhj9XTCACB+1PqS+CaJxepGNBhKc/OsHRpqvHAUAm5+uZ6kJJbGXn0pb3XqekHjg6JAqPExzqg==", + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.2.tgz", + "integrity": "sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==", "peer": true }, "node_modules/section-matter": { @@ -23009,9 +22997,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -23044,10 +23032,13 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", @@ -23202,14 +23193,14 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -23516,9 +23507,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -23595,9 +23586,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true }, "node_modules/spdy": { @@ -23705,9 +23696,9 @@ "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", "devOptional": true, "dependencies": { "fast-fifo": "^1.3.2", @@ -23800,9 +23791,9 @@ } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, @@ -23899,14 +23890,11 @@ } }, "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/strip-indent": { @@ -24130,9 +24118,9 @@ } }, "node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -24304,9 +24292,9 @@ } }, "node_modules/text-decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", - "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", + "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", "devOptional": true, "dependencies": { "b4a": "^1.6.4" @@ -24355,10 +24343,54 @@ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==" }, + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==" + }, + "node_modules/tinyglobby": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.6.tgz", + "integrity": "sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==", + "devOptional": true, + "dependencies": { + "fdir": "^6.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", + "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "devOptional": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "devOptional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", "engines": { "node": "^18.0.0 || >=20.0.0" } @@ -24372,9 +24404,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "engines": { "node": ">=14.0.0" } @@ -24543,9 +24575,9 @@ } }, "node_modules/tsd": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.1.tgz", - "integrity": "sha512-sSL84A0SFwx2xGMWrxlGaarKFSQszWjJS2vgNDDLwatytzg2aq6ShlwHsBYxRNmjzXISODwMva5ZOdAg/4AoOA==", + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/tsd/-/tsd-0.31.2.tgz", + "integrity": "sha512-VplBAQwvYrHzVihtzXiUVXu5bGcr7uH1juQZ1lmKgkuGNGT+FechUCqmx9/zk7wibcqR2xaNEwCkDyKh+VVZnQ==", "dev": true, "dependencies": { "@tsd/typescript": "~5.4.3", @@ -24694,9 +24726,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -24755,9 +24787,9 @@ "integrity": "sha512-hyVbaCUd18UiXk656g/imaBLMogpdijIEpnhWYrSda9rhvO4gOU16n2nh7xG5lv/rjumnZzGOdz0CEGTmFe0fQ==" }, "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24767,14 +24799,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.1.0.tgz", - "integrity": "sha512-prB2U3jXPJLpo1iVLN338Lvolh6OrcCZO+9Yv6AR+tvegPPptYCDBIHiEEUdqRi8gAv2bXNKfMUrgAd2ejn/ow==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.6.0.tgz", + "integrity": "sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.1.0", - "@typescript-eslint/parser": "8.1.0", - "@typescript-eslint/utils": "8.1.0" + "@typescript-eslint/eslint-plugin": "8.6.0", + "@typescript-eslint/parser": "8.6.0", + "@typescript-eslint/utils": "8.6.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -24824,22 +24856,22 @@ } }, "node_modules/undici": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.7.tgz", - "integrity": "sha512-HR3W/bMGPSr90i8AAp2C4DM3wChFdJPLrWYpIS++LxS8K+W535qftjt+4MyjNYHeWabMj1nvtmLIi7l++iq91A==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", "engines": { "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "engines": { "node": ">=4" } @@ -24865,9 +24897,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "engines": { "node": ">=4" } @@ -24960,19 +24992,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -25312,12 +25331,11 @@ } }, "node_modules/vfile": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.2.tgz", - "integrity": "sha512-zND7NlS8rJYb/sPqkb13ZvbbUoExdbi4w3SfRrMq6R3FvnLQmmfpajJNITuuYm6AZ5uao9vy4BAos3EXBPf2rg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -25352,13 +25370,13 @@ } }, "node_modules/vite": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", - "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.41", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -25410,14 +25428,13 @@ } }, "node_modules/vite-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", + "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.5", + "debug": "^4.3.6", "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -25431,28 +25448,28 @@ } }, "node_modules/vitest": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", + "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", + "dependencies": { + "@vitest/expect": "2.1.1", + "@vitest/mocker": "2.1.1", + "@vitest/pretty-format": "^2.1.1", + "@vitest/runner": "2.1.1", + "@vitest/snapshot": "2.1.1", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", + "debug": "^4.3.6", + "magic-string": "^0.30.11", "pathe": "^1.1.2", "std-env": "^3.7.0", - "tinybench": "^2.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.0.5", + "vite-node": "2.1.1", "why-is-node-running": "^2.3.0" }, "bin": { @@ -25467,8 +25484,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", + "@vitest/browser": "2.1.1", + "@vitest/ui": "2.1.1", "happy-dom": "*", "jsdom": "*" }, @@ -25617,19 +25634,28 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "devOptional": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webdriver": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.40.2.tgz", - "integrity": "sha512-GoRR94m3yL8tWC9Myf+xIBSdVK8fi1ilZgEZZaYT8+XIWewR02dvrC6rml+/2ZjXUQzeee0RFGDwk9IC7cyYrg==", + "version": "8.40.3", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.40.3.tgz", + "integrity": "sha512-mc/pxLpgAQphnIaWvix/QXzp9CJpEvIA3YeF9t5plPaTbvbEaCAYYWkTP6e3vYPYWvx57krjGaYkNUnDCBNolA==", "devOptional": true, "dependencies": { - "@types/node": "^20.1.0", + "@types/node": "^22.2.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.40.2", + "@wdio/config": "8.40.3", "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.40.2", + "@wdio/protocols": "8.40.3", + "@wdio/types": "8.40.3", + "@wdio/utils": "8.40.3", "deepmerge-ts": "^5.1.0", "got": "^12.6.1", "ky": "^0.33.0", @@ -25639,24 +25665,33 @@ "node": "^16.13 || >=18" } }, + "node_modules/webdriver/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "devOptional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/webdriverio": { - "version": "8.40.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.40.2.tgz", - "integrity": "sha512-6yuzUlE064qNuMy98Du1+8QHbXk0st8qTWF7MDZRgYK19FGoy+KhQbaUv1wlFJuFHM0PiAYuduTURL4ub6HvzQ==", + "version": "8.40.5", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.40.5.tgz", + "integrity": "sha512-fKzaAF8lbgVFWIP8i0eGk22MpjactVVTWP8qtUXDob5Kdo8ffrg1lCKP8mcyrz6fiZM1OY1m6dvkbFelf23Nxw==", "devOptional": true, "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.40.2", + "@types/node": "^22.2.0", + "@wdio/config": "8.40.3", "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.40.2", + "@wdio/protocols": "8.40.3", + "@wdio/repl": "8.40.3", + "@wdio/types": "8.40.3", + "@wdio/utils": "8.40.3", "archiver": "^7.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1335233", + "devtools-protocol": "^0.0.1342118", "grapheme-splitter": "^1.0.2", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", @@ -25669,7 +25704,7 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^11.0.1", - "webdriver": "8.40.2" + "webdriver": "8.40.3" }, "engines": { "node": "^16.13 || >=18" @@ -25683,6 +25718,15 @@ } } }, + "node_modules/webdriverio/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "devOptional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/webdriverio/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -25717,11 +25761,10 @@ } }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -25730,7 +25773,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -26258,9 +26301,9 @@ } }, "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { "node": ">=12" }, @@ -26386,9 +26429,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", - "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true, "bin": { "yaml": "bin.mjs" @@ -26520,9 +26563,6 @@ "dependencies": { "jscodeshift": "^17.0.0" }, - "bin": { - "codemods": "bin/run.sh" - }, "engines": { "node": ">=18.11.0" } diff --git a/packages/vitest/src/vitest-extensions.ts b/packages/vitest/src/vitest-extensions.ts index 68afae2a..b10b92b2 100644 --- a/packages/vitest/src/vitest-extensions.ts +++ b/packages/vitest/src/vitest-extensions.ts @@ -89,7 +89,6 @@ const methodlessExtensions = { }, }; -//@ts-expect-error awaiting this fix https://github.com/vitest-dev/vitest/pull/6351 expect.extend(methodlessExtensions); expect.extend({ From 8d06df25a2d054c65f388587bc10dcc58241ea7b Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 09:53:37 +0100 Subject: [PATCH 45/48] test: fix type checking for fetch-mock package --- tsconfig.json => jsconfig.json | 0 package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename tsconfig.json => jsconfig.json (100%) diff --git a/tsconfig.json b/jsconfig.json similarity index 100% rename from tsconfig.json rename to jsconfig.json diff --git a/package.json b/package.json index 7a3224fc..bdb17b7f 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "lint:ci": "eslint .", "prettier": "prettier --cache --write *.md \"./**/*.md\" *.json \"./**/*.json\"", "prettier:ci": "prettier *.md \"./**/*.md\" *.json \"./**/*.json\"", - "types:check": "tsc --project ./tsconfig.json && echo 'types check done'", + "types:check": "tsc --project ./jsconfig.json && echo 'types check done'", "prepare": "husky || echo \"husky not available\"", "build": "npm run build -w=packages", "docs": "npm run start -w docs", From 9661ceb33fda4f2cad17bf25cef1200e59ec1ad7 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 10:00:11 +0100 Subject: [PATCH 46/48] chore: get ready to release to npm --- packages/codemods/.npmignore | 1 + release-please-config.json | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 packages/codemods/.npmignore diff --git a/packages/codemods/.npmignore b/packages/codemods/.npmignore new file mode 100644 index 00000000..d9380aaf --- /dev/null +++ b/packages/codemods/.npmignore @@ -0,0 +1 @@ +try.js diff --git a/release-please-config.json b/release-please-config.json index ae425809..84ca0105 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -28,11 +28,12 @@ "plugins": ["node-workspace"], "packages": { - "packages/core": {}, - "packages/vitest": {}, - "packages/jest": { + "packages/codemods": { "release-as": "0.1.0" }, + "packages/core": {}, + "packages/vitest": {}, + "packages/jest": {}, "packages/fetch-mock": {} }, "bootstrap-sha": "812f462efde5ade292394b94c9f2cbe0aedf8e3f", From dca98de7d79e19bfb0af946849932d7d252dbe69 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 10:03:23 +0100 Subject: [PATCH 47/48] chore: fix inconsistent use of require/import in tests --- packages/codemods/src/__test__/integration.test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__test__/integration.test.js index 22ed253b..2883fa9c 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__test__/integration.test.js @@ -1,6 +1,7 @@ import { it, describe, expect } from 'vitest'; -const util = require('node:util'); -const exec = util.promisify(require('node:child_process').exec); +import { promisify } from 'node:util'; +import { exec as callbackExec } from 'node:child_process'; +const exec = promisify(callbackExec); describe('integration', () => { it('can operate on typescript', async () => { From cacb67c914d431095482659693a0fe8094dd2846 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Thu, 19 Sep 2024 10:04:32 +0100 Subject: [PATCH 48/48] test: avoid running codemod tests in browser --- eslint.config.js | 2 +- package.json | 2 +- .../src/{__test__ => __tests__}/fixtures/extra-vars.js | 0 .../codemods/src/{__test__ => __tests__}/fixtures/jsx.jsx | 0 .../codemods/src/{__test__ => __tests__}/fixtures/tsx.tsx | 0 .../src/{__test__ => __tests__}/fixtures/typescript.ts | 0 .../identifying-fetchmock-instances.test.js | 0 .../src/{__test__ => __tests__}/integration.test.js | 8 ++++---- .../src/{__test__ => __tests__}/method-codemods.test.js | 0 .../src/{__test__ => __tests__}/option-codemods.test.js | 0 .../codemods/src/{__test__ => __tests__}/package.json | 0 11 files changed, 6 insertions(+), 6 deletions(-) rename packages/codemods/src/{__test__ => __tests__}/fixtures/extra-vars.js (100%) rename packages/codemods/src/{__test__ => __tests__}/fixtures/jsx.jsx (100%) rename packages/codemods/src/{__test__ => __tests__}/fixtures/tsx.tsx (100%) rename packages/codemods/src/{__test__ => __tests__}/fixtures/typescript.ts (100%) rename packages/codemods/src/{__test__ => __tests__}/identifying-fetchmock-instances.test.js (100%) rename packages/codemods/src/{__test__ => __tests__}/integration.test.js (84%) rename packages/codemods/src/{__test__ => __tests__}/method-codemods.test.js (100%) rename packages/codemods/src/{__test__ => __tests__}/option-codemods.test.js (100%) rename packages/codemods/src/{__test__ => __tests__}/package.json (100%) diff --git a/eslint.config.js b/eslint.config.js index 6808289d..49b199e8 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -11,7 +11,7 @@ export default [ ignores: [ 'docs/**/*.js', 'packages/*/test/fixtures/*', - 'packages/**/__test__/fixtures/*', + 'packages/**/__tests__/fixtures/*', '**/dist/**/*', 'packages/fetch-mock/types/index.test-d.ts', ], diff --git a/package.json b/package.json index bdb17b7f..993be09a 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "test": "vitest . --ui --exclude=packages/jest/src/__tests__/*", "test:ci": "vitest . --reporter=junit --outputFile=test-results/junit.xml --coverage.provider=istanbul --exclude=packages/jest/src/__tests__/*", "test:jest": "node --experimental-vm-modules node_modules/jest/bin/jest.js packages/jest", - "test:browser": "vitest . --browser.enabled --browser.name chromium --browser.provider playwright --exclude=packages/jest/src/__tests__/*", + "test:browser": "vitest . --browser.enabled --browser.name chromium --browser.provider playwright --exclude=packages/{jest,codemods}/src/__tests__/*", "coverage:send": "cat ./coverage/lcov.info | coveralls", "compat:module": "npm run compat:module -w import-compat" }, diff --git a/packages/codemods/src/__test__/fixtures/extra-vars.js b/packages/codemods/src/__tests__/fixtures/extra-vars.js similarity index 100% rename from packages/codemods/src/__test__/fixtures/extra-vars.js rename to packages/codemods/src/__tests__/fixtures/extra-vars.js diff --git a/packages/codemods/src/__test__/fixtures/jsx.jsx b/packages/codemods/src/__tests__/fixtures/jsx.jsx similarity index 100% rename from packages/codemods/src/__test__/fixtures/jsx.jsx rename to packages/codemods/src/__tests__/fixtures/jsx.jsx diff --git a/packages/codemods/src/__test__/fixtures/tsx.tsx b/packages/codemods/src/__tests__/fixtures/tsx.tsx similarity index 100% rename from packages/codemods/src/__test__/fixtures/tsx.tsx rename to packages/codemods/src/__tests__/fixtures/tsx.tsx diff --git a/packages/codemods/src/__test__/fixtures/typescript.ts b/packages/codemods/src/__tests__/fixtures/typescript.ts similarity index 100% rename from packages/codemods/src/__test__/fixtures/typescript.ts rename to packages/codemods/src/__tests__/fixtures/typescript.ts diff --git a/packages/codemods/src/__test__/identifying-fetchmock-instances.test.js b/packages/codemods/src/__tests__/identifying-fetchmock-instances.test.js similarity index 100% rename from packages/codemods/src/__test__/identifying-fetchmock-instances.test.js rename to packages/codemods/src/__tests__/identifying-fetchmock-instances.test.js diff --git a/packages/codemods/src/__test__/integration.test.js b/packages/codemods/src/__tests__/integration.test.js similarity index 84% rename from packages/codemods/src/__test__/integration.test.js rename to packages/codemods/src/__tests__/integration.test.js index 2883fa9c..e79e58cd 100644 --- a/packages/codemods/src/__test__/integration.test.js +++ b/packages/codemods/src/__tests__/integration.test.js @@ -6,7 +6,7 @@ const exec = promisify(callbackExec); describe('integration', () => { it('can operate on typescript', async () => { const { stdout } = await exec( - 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/typescript.ts', + 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__tests__/fixtures/typescript.ts', ); expect(stdout).toContain(`import fetchMock from 'fetch-mock'; function helper (res: number): void { @@ -15,7 +15,7 @@ function helper (res: number): void { }); it('can operate on jsx', async () => { const { stdout } = await exec( - 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/jsx.jsx', + 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__tests__/fixtures/jsx.jsx', ); expect(stdout).toContain(`import fetchMock from 'fetch-mock'; fetchMock.route("blah",
Content
);`); @@ -23,7 +23,7 @@ fetchMock.route("blah",
Content
);`); it('can operate on tsx', async () => { const { stdout } = await exec( - 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/tsx.tsx', + 'jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__tests__/fixtures/tsx.tsx', ); expect(stdout).toContain(`import fetchMock from 'fetch-mock'; function helper (res: number): void { @@ -32,7 +32,7 @@ function helper (res: number): void { }); it('allow passing in one or more additional variable names for fetch-mock', async () => { const { stdout } = await exec( - 'FM_VARIABLES=fm1,fm2 jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__test__/fixtures/extra-vars.js', + 'FM_VARIABLES=fm1,fm2 jscodeshift --parser ts -p -d -t ./packages/codemods/src/index.js ./packages/codemods/src/__tests__/fixtures/extra-vars.js', ); expect(stdout).toContain(`const fetchMock = require('fetch-mock'); fetchMock.route('blah', 200); diff --git a/packages/codemods/src/__test__/method-codemods.test.js b/packages/codemods/src/__tests__/method-codemods.test.js similarity index 100% rename from packages/codemods/src/__test__/method-codemods.test.js rename to packages/codemods/src/__tests__/method-codemods.test.js diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__tests__/option-codemods.test.js similarity index 100% rename from packages/codemods/src/__test__/option-codemods.test.js rename to packages/codemods/src/__tests__/option-codemods.test.js diff --git a/packages/codemods/src/__test__/package.json b/packages/codemods/src/__tests__/package.json similarity index 100% rename from packages/codemods/src/__test__/package.json rename to packages/codemods/src/__tests__/package.json