From f67c2c9fe7b3b4e461b2ea38823f439e4cba5e8e Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Tue, 1 Oct 2024 16:09:30 +0200 Subject: [PATCH 01/63] fix(package): set `sideEffects: false` in package.json --- .changeset/khaki-fans-sit.md | 5 +++++ package.json | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/khaki-fans-sit.md diff --git a/.changeset/khaki-fans-sit.md b/.changeset/khaki-fans-sit.md new file mode 100644 index 0000000..67a0834 --- /dev/null +++ b/.changeset/khaki-fans-sit.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Set `"sideEffects": false` in package.json. diff --git a/package.json b/package.json index b41f586..89585f7 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "bugs": { "url": "https://github.com/duniul/clean-modules/issues" }, + "sideEffects": false, "keywords": [ "node", "node-modules", From 00c3cd60a0dd4072d40aedf0ad52e46b50f1ebdf Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Tue, 1 Oct 2024 16:15:21 +0200 Subject: [PATCH 02/63] feat(deps): update picomatch to v4 --- .changeset/thirty-cups-decide.md | 5 +++++ package.json | 4 ++-- pnpm-lock.yaml | 14 +++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 .changeset/thirty-cups-decide.md diff --git a/.changeset/thirty-cups-decide.md b/.changeset/thirty-cups-decide.md new file mode 100644 index 0000000..e982617 --- /dev/null +++ b/.changeset/thirty-cups-decide.md @@ -0,0 +1,5 @@ +--- +'clean-modules': major +--- + +Update `picomatch` dependency to v4. diff --git a/package.json b/package.json index 89585f7..68dff42 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ }, "dependencies": { "clipanion": "^3.2.1", - "picomatch": "^2.3.0", + "picomatch": "^4.0.2", "pretty-bytes": "^6.1.0", "pretty-ms": "^8.0.0", "supports-color": "^9.4.0" @@ -69,7 +69,7 @@ "@tsconfig/node14": "^14.1.2", "@types/mock-fs": "4.13.4", "@types/node": "16", - "@types/picomatch": "2.3.4", + "@types/picomatch": "3.0.1", "@types/supports-color": "8.1.3", "changesets-changelog-clean": "^1.3.0", "memfs": "^4.12.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee7b84e..1c3fcda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^3.2.1 version: 3.2.1(typanion@3.14.0) picomatch: - specifier: ^2.3.0 - version: 2.3.1 + specifier: ^4.0.2 + version: 4.0.2 pretty-bytes: specifier: ^6.1.0 version: 6.1.1 @@ -40,8 +40,8 @@ importers: specifier: '16' version: 16.18.82 '@types/picomatch': - specifier: 2.3.4 - version: 2.3.4 + specifier: 3.0.1 + version: 3.0.1 '@types/supports-color': specifier: 8.1.3 version: 8.1.3 @@ -632,8 +632,8 @@ packages: '@types/node@16.18.82': resolution: {integrity: sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==} - '@types/picomatch@2.3.4': - resolution: {integrity: sha512-0so8lU8O5zatZS/2Fi4zrwks+vZv7e0dygrgEZXljODXBig97l4cPQD+9LabXfGJOWwoRkTVz6Q4edZvD12UOA==} + '@types/picomatch@3.0.1': + resolution: {integrity: sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==} '@types/semver@7.5.7': resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} @@ -2020,7 +2020,7 @@ snapshots: '@types/node@16.18.82': {} - '@types/picomatch@2.3.4': {} + '@types/picomatch@3.0.1': {} '@types/semver@7.5.7': {} From 749163777904a4e09f88bf4eb09adae05dbd8234 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Tue, 1 Oct 2024 16:18:23 +0200 Subject: [PATCH 03/63] feat(deps): update `pretty-ms` to v9 and update minor versions of deps --- .changeset/many-houses-unite.md | 5 ++ .changeset/ninety-shoes-invent.md | 5 ++ package.json | 6 +- pnpm-lock.yaml | 98 +++++++++++++++---------------- 4 files changed, 62 insertions(+), 52 deletions(-) create mode 100644 .changeset/many-houses-unite.md create mode 100644 .changeset/ninety-shoes-invent.md diff --git a/.changeset/many-houses-unite.md b/.changeset/many-houses-unite.md new file mode 100644 index 0000000..b231a55 --- /dev/null +++ b/.changeset/many-houses-unite.md @@ -0,0 +1,5 @@ +--- +'clean-modules': major +--- + +Update `pretty-ms` dependency to v9. diff --git a/.changeset/ninety-shoes-invent.md b/.changeset/ninety-shoes-invent.md new file mode 100644 index 0000000..e200dad --- /dev/null +++ b/.changeset/ninety-shoes-invent.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Update minor dependency versions. diff --git a/package.json b/package.json index 68dff42..fdd4f4a 100644 --- a/package.json +++ b/package.json @@ -59,12 +59,12 @@ "dependencies": { "clipanion": "^3.2.1", "picomatch": "^4.0.2", - "pretty-bytes": "^6.1.0", - "pretty-ms": "^8.0.0", + "pretty-bytes": "^6.1.1", + "pretty-ms": "^9.1.0", "supports-color": "^9.4.0" }, "devDependencies": { - "@biomejs/biome": "^1.9.2", + "@biomejs/biome": "^1.9.3", "@changesets/cli": "^2.27.8", "@tsconfig/node14": "^14.1.2", "@types/mock-fs": "4.13.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c3fcda..85ce2cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,18 +15,18 @@ importers: specifier: ^4.0.2 version: 4.0.2 pretty-bytes: - specifier: ^6.1.0 + specifier: ^6.1.1 version: 6.1.1 pretty-ms: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^9.1.0 + version: 9.1.0 supports-color: specifier: ^9.4.0 version: 9.4.0 devDependencies: '@biomejs/biome': - specifier: ^1.9.2 - version: 1.9.2 + specifier: ^1.9.3 + version: 1.9.3 '@changesets/cli': specifier: ^2.27.8 version: 2.27.8 @@ -79,55 +79,55 @@ packages: resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.2': - resolution: {integrity: sha512-4j2Gfwft8Jqp1X0qLYvK4TEy4xhTo4o6rlvJPsjPeEame8gsmbGQfOPBkw7ur+7/Z/f0HZmCZKqbMvR7vTXQYQ==} + '@biomejs/biome@1.9.3': + resolution: {integrity: sha512-POjAPz0APAmX33WOQFGQrwLvlu7WLV4CFJMlB12b6ZSg+2q6fYu9kZwLCOA+x83zXfcPd1RpuWOKJW0GbBwLIQ==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.2': - resolution: {integrity: sha512-rbs9uJHFmhqB3Td0Ro+1wmeZOHhAPTL3WHr8NtaVczUmDhXkRDWScaxicG9+vhSLj1iLrW47itiK6xiIJy6vaA==} + '@biomejs/cli-darwin-arm64@1.9.3': + resolution: {integrity: sha512-QZzD2XrjJDUyIZK+aR2i5DDxCJfdwiYbUKu9GzkCUJpL78uSelAHAPy7m0GuPMVtF/Uo+OKv97W3P9nuWZangQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.2': - resolution: {integrity: sha512-BlfULKijNaMigQ9GH9fqJVt+3JTDOSiZeWOQtG/1S1sa8Lp046JHG3wRJVOvekTPL9q/CNFW1NVG8J0JN+L1OA==} + '@biomejs/cli-darwin-x64@1.9.3': + resolution: {integrity: sha512-vSCoIBJE0BN3SWDFuAY/tRavpUtNoqiceJ5PrU3xDfsLcm/U6N93JSM0M9OAiC/X7mPPfejtr6Yc9vSgWlEgVw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.2': - resolution: {integrity: sha512-ZATvbUWhNxegSALUnCKWqetTZqrK72r2RsFD19OK5jXDj/7o1hzI1KzDNG78LloZxftrwr3uI9SqCLh06shSZw==} + '@biomejs/cli-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-VBzyhaqqqwP3bAkkBrhVq50i3Uj9+RWuj+pYmXrMDgjS5+SKYGE56BwNw4l8hR3SmYbLSbEo15GcV043CDSk+Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.2': - resolution: {integrity: sha512-T8TJuSxuBDeQCQzxZu2o3OU4eyLumTofhCxxFd3+aH2AEWVMnH7Z/c3QP1lHI5RRMBP9xIJeMORqDQ5j+gVZzw==} + '@biomejs/cli-linux-arm64@1.9.3': + resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.2': - resolution: {integrity: sha512-CjPM6jT1miV5pry9C7qv8YJk0FIZvZd86QRD3atvDgfgeh9WQU0k2Aoo0xUcPdTnoz0WNwRtDicHxwik63MmSg==} + '@biomejs/cli-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.2': - resolution: {integrity: sha512-T0cPk3C3Jr2pVlsuQVTBqk2qPjTm8cYcTD9p/wmR9MeVqui1C/xTVfOIwd3miRODFMrJaVQ8MYSXnVIhV9jTjg==} + '@biomejs/cli-linux-x64@1.9.3': + resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.2': - resolution: {integrity: sha512-2x7gSty75bNIeD23ZRPXyox6Z/V0M71ObeJtvQBhi1fgrvPdtkEuw7/0wEHg6buNCubzOFuN9WYJm6FKoUHfhg==} + '@biomejs/cli-win32-arm64@1.9.3': + resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.2': - resolution: {integrity: sha512-JC3XvdYcjmu1FmAehVwVV0SebLpeNTnO2ZaMdGCSOdS7f8O9Fq14T2P1gTG1Q29Q8Dt1S03hh0IdVpIZykOL8g==} + '@biomejs/cli-win32-x64@1.9.3': + resolution: {integrity: sha512-cQMy2zanBkVLpmmxXdK6YePzmZx0s5Z7KEnwmrW54rcXK3myCNbQa09SwGZ8i/8sLw0H9F3X7K4rxVNGU8/D4Q==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -1122,9 +1122,9 @@ packages: package-manager-detector@0.2.0: resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} - parse-ms@3.0.0: - resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} - engines: {node: '>=12'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -1214,9 +1214,9 @@ packages: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} - pretty-ms@8.0.0: - resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} - engines: {node: '>=14.16'} + pretty-ms@9.1.0: + resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + engines: {node: '>=18'} pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -1558,39 +1558,39 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@biomejs/biome@1.9.2': + '@biomejs/biome@1.9.3': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.2 - '@biomejs/cli-darwin-x64': 1.9.2 - '@biomejs/cli-linux-arm64': 1.9.2 - '@biomejs/cli-linux-arm64-musl': 1.9.2 - '@biomejs/cli-linux-x64': 1.9.2 - '@biomejs/cli-linux-x64-musl': 1.9.2 - '@biomejs/cli-win32-arm64': 1.9.2 - '@biomejs/cli-win32-x64': 1.9.2 + '@biomejs/cli-darwin-arm64': 1.9.3 + '@biomejs/cli-darwin-x64': 1.9.3 + '@biomejs/cli-linux-arm64': 1.9.3 + '@biomejs/cli-linux-arm64-musl': 1.9.3 + '@biomejs/cli-linux-x64': 1.9.3 + '@biomejs/cli-linux-x64-musl': 1.9.3 + '@biomejs/cli-win32-arm64': 1.9.3 + '@biomejs/cli-win32-x64': 1.9.3 - '@biomejs/cli-darwin-arm64@1.9.2': + '@biomejs/cli-darwin-arm64@1.9.3': optional: true - '@biomejs/cli-darwin-x64@1.9.2': + '@biomejs/cli-darwin-x64@1.9.3': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.2': + '@biomejs/cli-linux-arm64-musl@1.9.3': optional: true - '@biomejs/cli-linux-arm64@1.9.2': + '@biomejs/cli-linux-arm64@1.9.3': optional: true - '@biomejs/cli-linux-x64-musl@1.9.2': + '@biomejs/cli-linux-x64-musl@1.9.3': optional: true - '@biomejs/cli-linux-x64@1.9.2': + '@biomejs/cli-linux-x64@1.9.3': optional: true - '@biomejs/cli-win32-arm64@1.9.2': + '@biomejs/cli-win32-arm64@1.9.3': optional: true - '@biomejs/cli-win32-x64@1.9.2': + '@biomejs/cli-win32-x64@1.9.3': optional: true '@changesets/apply-release-plan@7.0.5': @@ -2517,7 +2517,7 @@ snapshots: package-manager-detector@0.2.0: {} - parse-ms@3.0.0: {} + parse-ms@4.0.0: {} path-exists@4.0.0: {} @@ -2568,9 +2568,9 @@ snapshots: pretty-bytes@6.1.1: {} - pretty-ms@8.0.0: + pretty-ms@9.1.0: dependencies: - parse-ms: 3.0.0 + parse-ms: 4.0.0 pseudomap@1.0.2: {} From 47b01ae18030e89ea4d6af90bb9020c0556dbf69 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Tue, 1 Oct 2024 16:25:08 +0200 Subject: [PATCH 04/63] fix(package): fix `repository` definition in package.json --- .changeset/old-hounds-matter.md | 5 +++++ package.json | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/old-hounds-matter.md diff --git a/.changeset/old-hounds-matter.md b/.changeset/old-hounds-matter.md new file mode 100644 index 0000000..93d7648 --- /dev/null +++ b/.changeset/old-hounds-matter.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Fix `repository` definition in package.json. diff --git a/package.json b/package.json index fdd4f4a..1dcb7b5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,10 @@ "author": "Daniel Grefberg ", "version": "3.1.1", "description": "Clean up/prune unnecessary files and reduce the size of your `node_modules` directory. Useful for CI caches or for reducing the size of serverless functions.", - "repository": "https://github.com/duniul/clean-modules.git", + "repository": { + "type": "git", + "url": "git+https://github.com/duniul/clean-modules.git" + }, "homepage": "https://github.com/duniul/clean-modules#readme", "bugs": { "url": "https://github.com/duniul/clean-modules/issues" From a340f6f444552362b0ab2b8298b48236a85a8970 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 13:54:24 +0200 Subject: [PATCH 05/63] chore(deps): switch from prettier to oxfmt --- .oxfmtrc.json | 18 ++++++++++++++++++ .prettierrc | 6 ------ package.json | 7 +++---- 3 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 .oxfmtrc.json delete mode 100644 .prettierrc diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..44fee27 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,18 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "ignorePatterns": ["**/node_modules", "**/dist", "**/.history", "**/tsconfig.tsbuildinfo"], + "printWidth": 110, + "trailingComma": "es5", + "jsxSingleQuote": true, + "singleQuote": true, + "arrowParens": "avoid", + "quoteProps": "consistent", + "sortPackageJson": { + "enabled": true, + "sortScripts": false + }, + "sortImports": { + "enabled": true, + "newlinesBetween": false + } +} diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 9a759a8..0000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "trailingComma": "es5", - "singleQuote": true, - "printWidth": 100, - "arrowParens": "avoid" -} diff --git a/package.json b/package.json index 1dcb7b5..dc7e193 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,8 @@ "dev": "tsc --watch", "test": "vitest", "prepublishOnly": "pnpm build", - "lint": "biome check src && prettier --check src", - "lint:fix": "biome check --apply src && prettier --write src", + "lint": "biome check src && oxfmt --check src", + "lint:fix": "biome check --apply src && oxfmt src", "version": "changeset version", "release": "changeset publish" }, @@ -76,8 +76,7 @@ "@types/supports-color": "8.1.3", "changesets-changelog-clean": "^1.3.0", "memfs": "^4.12.0", - "prettier": "3.3.3", - "prettier-plugin-organize-imports": "4.1.0", + "oxfmt": "^0.48.0", "tslib": "^2.7.0", "tsup": "^8.3.0", "tsx": "^4.19.1", From 61fc3e0e472df1a632c5e4729ae081470a95190d Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 13:57:11 +0200 Subject: [PATCH 06/63] chore(oxfmt): format project --- .vscode/settings.json | 4 +-- README.md | 4 +-- __mocks__/fs/promises.ts | 2 +- package.json | 42 +++++++++++++------------- src/__test__/getMockedFileStructure.ts | 2 +- src/analyze.ts | 5 +-- src/cli/cli.ts | 2 +- src/shared.ts | 6 +--- src/utils/filesystem.test.ts | 6 ++-- src/utils/filesystem.ts | 5 +-- src/utils/glob.test.ts | 4 +-- src/utils/glob.ts | 33 +++++--------------- 12 files changed, 42 insertions(+), 73 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b7f65a6..ba1189c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,7 +25,7 @@ // Treat .cleanmodules files as ignore files "files.associations": { - ".cleanmodules*": "ignore", + ".cleanmodules*": "ignore" }, // Ensure we use the same formatter for files @@ -47,5 +47,5 @@ }, // Use same TypeScript version as repo rather than local user version - "typescript.tsdk": "node_modules/typescript/lib", + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/README.md b/README.md index 1687804..94432ec 100644 --- a/README.md +++ b/README.md @@ -303,7 +303,7 @@ Clean modules can be used programmatically too! Simply import the corresponding function from the package: -````ts +```ts import { clean, analyze } from 'clean-modules'; // analyze, all options are optional @@ -323,7 +323,7 @@ const cleanResult = await clean({ keepEmpty: false, dryRun: false, }); -```` +``` ## Alternatives diff --git a/__mocks__/fs/promises.ts b/__mocks__/fs/promises.ts index c99c64b..3ec2d35 100644 --- a/__mocks__/fs/promises.ts +++ b/__mocks__/fs/promises.ts @@ -1,3 +1,3 @@ import { fs } from 'memfs'; -module.exports = fs +module.exports = fs; diff --git a/package.json b/package.json index dc7e193..0ea961c 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,37 @@ { "name": "clean-modules", - "author": "Daniel Grefberg ", "version": "3.1.1", "description": "Clean up/prune unnecessary files and reduce the size of your `node_modules` directory. Useful for CI caches or for reducing the size of serverless functions.", - "repository": { - "type": "git", - "url": "git+https://github.com/duniul/clean-modules.git" - }, - "homepage": "https://github.com/duniul/clean-modules#readme", - "bugs": { - "url": "https://github.com/duniul/clean-modules/issues" - }, - "sideEffects": false, "keywords": [ + "ci", + "cli-tool", "node", "node-modules", "npm", - "yarn", "pnpm", - "cli-tool", - "ci" + "yarn" ], + "homepage": "https://github.com/duniul/clean-modules#readme", + "bugs": { + "url": "https://github.com/duniul/clean-modules/issues" + }, "license": "ISC", - "engines": { - "node": ">=14" + "author": "Daniel Grefberg ", + "repository": { + "type": "git", + "url": "git+https://github.com/duniul/clean-modules.git" }, + "bin": "bin/cli.js", "files": [ "dist", ".cleanmodules-default", "!.tsbuildinfo" ], - "packageManager": "pnpm@9.11.0", "type": "module", + "sideEffects": false, + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.ts", "exports": { ".": { "import": { @@ -44,10 +44,6 @@ } } }, - "main": "dist/index.cjs", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "bin": "bin/cli.js", "scripts": { "cli": "tsx src/cli/cli.ts", "build": "tsup", @@ -82,5 +78,9 @@ "tsx": "^4.19.1", "typescript": "5.6.2", "vitest": "^2.1.1" - } + }, + "engines": { + "node": ">=14" + }, + "packageManager": "pnpm@9.11.0" } diff --git a/src/__test__/getMockedFileStructure.ts b/src/__test__/getMockedFileStructure.ts index f3b6cf3..7325514 100644 --- a/src/__test__/getMockedFileStructure.ts +++ b/src/__test__/getMockedFileStructure.ts @@ -10,7 +10,7 @@ export async function getMockedFileStructure(): Promise> { [DEFAULT_GLOBS_FILE_PATH]: defaultGlobs, node_modules: { dep1: { - __tests__: { + '__tests__': { 'test1.js': '.', 'test2.js': '.', }, diff --git a/src/analyze.ts b/src/analyze.ts index 972dec6..f20ecef 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -40,10 +40,7 @@ export async function analyze(options: AnalyzeOptions = {}): Promise { }); it('returns list of files in directory', async () => { - expect(await readDirectory('parent/empty')).toEqual( - expect.arrayContaining(['foo.txt', 'bar.txt']) - ); + expect(await readDirectory('parent/empty')).toEqual(expect.arrayContaining(['foo.txt', 'bar.txt'])); }); it('returns empty array if directory does not exist', async () => { diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index ef4ce27..a51af21 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -159,10 +159,7 @@ export type RemoveFilesOptions = { * @param options dryRun: if true, don't actually remove the files * @returns the total size of the removed files */ -export async function removeFiles( - filePaths: string[], - options: RemoveFilesOptions = {} -): Promise { +export async function removeFiles(filePaths: string[], options: RemoveFilesOptions = {}): Promise { let reducedSize = 0; await Promise.all( diff --git a/src/utils/glob.test.ts b/src/utils/glob.test.ts index 2dac0e8..2ebb70c 100644 --- a/src/utils/glob.test.ts +++ b/src/utils/glob.test.ts @@ -1,7 +1,8 @@ -import { vol } from 'memfs'; import path from 'path'; +import { vol } from 'memfs'; import pm from 'picomatch'; import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import { getMockedFileStructure } from '../__test__/getMockedFileStructure.js'; import { DEFAULT_PICO_OPTIONS, findFilesByGlobLists, @@ -18,7 +19,6 @@ import { updateGlobLists, wrapGlobs, } from './glob.js'; -import { getMockedFileStructure } from '../__test__/getMockedFileStructure.js'; describe('makeGlobMatcher', () => { it('creates a picomatch globber with default options', () => { diff --git a/src/utils/glob.ts b/src/utils/glob.ts index 6559819..ed427cb 100644 --- a/src/utils/glob.ts +++ b/src/utils/glob.ts @@ -27,10 +27,7 @@ export type GlobFunc = (filePath: string, test?: boolean) => boolean; /** * Creates a picomatch matcher from a set of globs. */ -export function makeGlobMatcher( - globs: string | string[], - picoOptions?: GlobberPicoOptions -): GlobFunc { +export function makeGlobMatcher(globs: string | string[], picoOptions?: GlobberPicoOptions): GlobFunc { return pm(globs, { ...DEFAULT_PICO_OPTIONS, ...picoOptions }); } @@ -76,15 +73,10 @@ export function toPosixPath(pathStr: string): string { /** * Prepends an absolute path to all editable lists in a GlobLists object. */ -export function toAbsoluteGlobLists( - globLists: GlobLists, - absoluteNodeModulesPath: string -): GlobLists { +export function toAbsoluteGlobLists(globLists: GlobLists, absoluteNodeModulesPath: string): GlobLists { const absolutePathWithPosixSeparator = toPosixPath(absoluteNodeModulesPath); - return updateGlobLists(globLists, globs => - globs.map(glob => absolutePathWithPosixSeparator + '/' + glob) - ); + return updateGlobLists(globLists, globs => globs.map(glob => absolutePathWithPosixSeparator + '/' + glob)); } /** @@ -196,8 +188,7 @@ export async function parseGlobsFile(filePath: string): Promise { throw error; } - const fileGlobs = - fileContents.split(/\r?\n/).filter(line => !line.match(COMMENT_OR_EMPTY_REGEX)) || []; + const fileGlobs = fileContents.split(/\r?\n/).filter(line => !line.match(COMMENT_OR_EMPTY_REGEX)) || []; return processGlobs(fileGlobs); } @@ -218,11 +209,7 @@ export interface GetGlobListsOptions { /** * Parses and combines globs from all possible sources. */ -export async function getGlobLists({ - noDefaults, - globFile, - globs, -}: GetGlobListsOptions): Promise { +export async function getGlobLists({ noDefaults, globFile, globs }: GetGlobListsOptions): Promise { const globListsToMerge: GlobLists[] = []; if (!noDefaults) { @@ -252,14 +239,8 @@ export async function getGlobLists({ * @param globLists the glob lists to match against * @returns a promise that resolves to an array of matching file paths */ -export async function findFilesByGlobLists( - directory: string, - globLists: GlobLists -): Promise { - const { included, includedDirs, excluded } = toAbsoluteGlobLists( - optimizeGlobLists(globLists), - directory - ); +export async function findFilesByGlobLists(directory: string, globLists: GlobLists): Promise { + const { included, includedDirs, excluded } = toAbsoluteGlobLists(optimizeGlobLists(globLists), directory); const picoOptions = { ignore: excluded }; const checkDir = includedDirs?.length ? makeGlobMatcher(includedDirs, picoOptions) : () => false; From 89160d7ba7a3e67832b9962b54e45cd3a1aeb190 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 15:45:53 +0200 Subject: [PATCH 07/63] chore(deps): switch from biome to oxlint --- .oxlintrc.json | 112 ++++++++++++++ biome.json | 24 --- package.json | 9 +- src/__snapshots__/analyze.test.ts.snap | 187 ++++++++++++++++++++++ src/__test__/getMockedFileStructure.ts | 7 +- src/__test__/path.serializer.ts | 10 +- src/analyze.test.ts | 206 +++---------------------- src/analyze.ts | 11 +- src/clean.test.ts | 22 ++- src/clean.ts | 16 +- src/cli/commands/analyze.command.ts | 5 +- src/cli/commands/clean.command.ts | 10 +- src/cli/utils/terminal.ts | 23 +-- src/shared.ts | 6 +- src/utils/filesystem.test.ts | 118 +++++++++----- src/utils/filesystem.ts | 22 +-- src/utils/glob.test.ts | 110 +++++++------ src/utils/glob.ts | 48 +++--- 18 files changed, 576 insertions(+), 370 deletions(-) create mode 100644 .oxlintrc.json delete mode 100644 biome.json create mode 100644 src/__snapshots__/analyze.test.ts.snap diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..4d63a16 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,112 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "ignorePatterns": ["**/node_modules", "**/dist", "**/.history", "**/tsconfig.tsbuildinfo"], + "plugins": ["eslint", "import", "jsdoc", "node", "oxc", "promise", "typescript", "unicorn"], + "env": { + "builtin": true, + "node": true + }, + "categories": { + "correctness": "error", + "nursery": "error", + "pedantic": "error", + "perf": "error", + "restriction": "error", + "style": "error", + "suspicious": "error" + }, + "rules": { + "capitalized-comments": "off", + "consistent-type-definitions": ["error", "type"], + "explicit-length-check": "off", + "exports-last": "off", + "filename-case": ["error", { "case": "camelCase" }], + "func-style": "off", + "import/consistent-type-specifier-style": "off", + "import/group-exports": "off", + "import/no-named-export": "off", + "import/no-nodejs-modules": "off", + "import/no-relative-parent-imports": "off", + "import/prefer-default-export": "off", + "init-declarations": "off", + "jsdoc/require-param-type": "off", + "jsdoc/require-param": "off", + "jsdoc/require-returns-type": "off", + "jsdoc/require-returns": "off", + "max-lines-per-function": "off", + "max-lines": "off", + "max-params": "off", + "max-statements": "off", + "no-array-callback-reference": "off", + "no-async-await": "off", + "no-continue": "off", + "no-duplicate-imports": ["error", { "allowSeparateTypeImports": true }], + "no-implicit-coercion": "off", + "no-inline-comments": "off", + "no-magic-numbers": ["error", { "ignore": [0] }], + "no-null": "off", + "no-optional-chaining": "off", + "no-plusplus": "off", + "no-rest-spread-properties": "off", + "no-ternary": "off", + "no-undefined": "off", + "prefer-template": "off", + "prefer-ternary": "off", + "promise/avoid-new": "off", + "sort-imports": "off", + "sort-keys": "off", + "typescript/explicit-member-accessibility": ["error", { "accessibility": "no-public" }], + + "prefer-string-replace-all": "warn", + "require-unicode-regexp": "warn" + }, + "overrides": [ + { + "files": ["*.config.ts", "*.config.*.ts"], + "rules": { + "import/no-default-export": "off" + } + }, + { + "files": ["src/cli/**/*.ts"], + "rules": { + "new-cap": "off" + } + }, + { + "files": ["__mocks__/fs/**/*"], + "rules": { + "unicorn/prefer-module": "off", + "import/no-commonjs": "off" + } + }, + { + "files": ["bin/**/*"], + "rules": { + "import/no-unassigned-import": "off" + } + }, + { + "files": ["*.test.ts", "__test__/**"], + "plugins": ["vitest"], + "rules": { + "vitest/no-hooks": "off", + "vitest/no-importing-vitest-globals": "off", + "vitest/prefer-to-be-truthy": "off", + "vitest/prefer-to-be-falsy": "off", + "vitest/max-expects": "off", + "vitest/prefer-expect-assertions": [ + "error", + { + "onlyFunctionsWithAsyncKeyword": true, + "onlyFunctionsWithExpectInCallback": true, + "onlyFunctionsWithExpectInLoop": true + } + ], + "vitest/valid-title": "off", + "vitest/prefer-called-once": "off", + "no-magic-numbers": "off" + } + } + ] +} diff --git a/biome.json b/biome.json deleted file mode 100644 index 14fc595..0000000 --- a/biome.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", - "formatter": { - "enabled": false - }, - "organizeImports": { - "enabled": false - }, - "linter": { - "enabled": true, - "rules": { - "suspicious": { - "noExplicitAny": "off" - }, - "style": { - "useTemplate": "off", - "noUnusedTemplateLiteral": "off" - } - } - }, - "files": { - "ignore": ["**/*.json"] - } -} diff --git a/package.json b/package.json index 0ea961c..dc91970 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,10 @@ "dev": "tsc --watch", "test": "vitest", "prepublishOnly": "pnpm build", - "lint": "biome check src && oxfmt --check src", - "lint:fix": "biome check --apply src && oxfmt src", + "stylecheck": "oxfmt --check src && oxlint src", + "format": "oxfmt --write .", + "lint": "oxlint .", + "lint:fix": "oxlint --fix .", "version": "changeset version", "release": "changeset publish" }, @@ -63,7 +65,6 @@ "supports-color": "^9.4.0" }, "devDependencies": { - "@biomejs/biome": "^1.9.3", "@changesets/cli": "^2.27.8", "@tsconfig/node14": "^14.1.2", "@types/mock-fs": "4.13.4", @@ -73,6 +74,8 @@ "changesets-changelog-clean": "^1.3.0", "memfs": "^4.12.0", "oxfmt": "^0.48.0", + "oxlint": "^1.63.0", + "oxlint-tsgolint": "^0.22.1", "tslib": "^2.7.0", "tsup": "^8.3.0", "tsx": "^4.19.1", diff --git a/src/__snapshots__/analyze.test.ts.snap b/src/__snapshots__/analyze.test.ts.snap new file mode 100644 index 0000000..9b950ce --- /dev/null +++ b/src/__snapshots__/analyze.test.ts.snap @@ -0,0 +1,187 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`analyze > accepts custom globs 1`] = ` +[ + { + "filePath": "/node_modules/dep1/.npmrc", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/.npmrc", + "original": ".npmrc", + }, + { + "derived": "/node_modules/**/.npmrc", + "original": ".npmrc", + }, + ], + }, + { + "filePath": "/node_modules/dep2/CHANGELOG.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + { + "derived": "/node_modules/**/changelog*(.*)", + "original": "changelog*(.*)", + }, + ], + }, + { + "filePath": "/node_modules/dep4/nonDefaultFile.ext", + "includedByDefault": false, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**/nonDefaultFile.ext", + "original": "**/nonDefaultFile.ext", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test1.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test2.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/a-dir/doc.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + ], + }, +] +`; + +exports[`analyze > allows skipping default globs 1`] = ` +[ + { + "filePath": "/node_modules/dep4/nonDefaultFile.ext", + "includedByDefault": false, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**/nonDefaultFile.ext", + "original": "**/nonDefaultFile.ext", + }, + ], + }, +] +`; + +exports[`analyze > returns information about the files that would be removed 1`] = ` +[ + { + "filePath": "/node_modules/dep1/.npmrc", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/.npmrc", + "original": ".npmrc", + }, + { + "derived": "/node_modules/**/.npmrc", + "original": ".npmrc", + }, + ], + }, + { + "filePath": "/node_modules/dep2/CHANGELOG.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + { + "derived": "/node_modules/**/changelog*(.*)", + "original": "changelog*(.*)", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test1.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test2.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/a-dir/doc.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + ], + }, +] +`; + +exports[`analyze > uses custom glob file if provided 1`] = ` +[ + { + "filePath": "/node_modules/dep2/CHANGELOG.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**.md", + "original": "**.md", + }, + ], + }, + { + "filePath": "/node_modules/dep4/nonDefaultFile.ext", + "includedByDefault": false, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**/nonDefaultFile.ext", + "original": "**/nonDefaultFile.ext", + }, + ], + }, + { + "filePath": "/node_modules/dep1/a-dir/doc.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**.md", + "original": "**.md", + }, + ], + }, +] +`; diff --git a/src/__test__/getMockedFileStructure.ts b/src/__test__/getMockedFileStructure.ts index 7325514..fdcb6ee 100644 --- a/src/__test__/getMockedFileStructure.ts +++ b/src/__test__/getMockedFileStructure.ts @@ -1,10 +1,11 @@ -import fs from 'fs'; +import type fs from 'node:fs'; +import type { NestedDirectoryJSON } from 'memfs'; import { vi } from 'vitest'; import { DEFAULT_GLOBS_FILE_PATH } from '../shared.js'; -export async function getMockedFileStructure(): Promise> { +export async function getMockedFileStructure(): Promise { const actualFs = await vi.importActual('fs/promises'); - const defaultGlobs = (await actualFs.readFile(DEFAULT_GLOBS_FILE_PATH)).toString(); + const defaultGlobs = await actualFs.readFile(DEFAULT_GLOBS_FILE_PATH, { encoding: 'utf8' }); return { [DEFAULT_GLOBS_FILE_PATH]: defaultGlobs, diff --git a/src/__test__/path.serializer.ts b/src/__test__/path.serializer.ts index 546a55c..6dc87c1 100644 --- a/src/__test__/path.serializer.ts +++ b/src/__test__/path.serializer.ts @@ -1,16 +1,16 @@ -import { expect } from 'vitest'; +import type { expect } from 'vitest'; -function normalizePathPart(str: string) { - return str.replace(/\\/g, '/'); // replace windows backslashes +function normalizePathPart(str: string): string { + return str.replaceAll('\\', '/'); // replace windows backslashes } -function normalizePath(str: string) { +function normalizePath(str: string): string { const normalizedCwd = normalizePathPart(process.cwd()); const normalizedStr = normalizePathPart(str); return normalizedStr.replace(normalizedCwd, ''); } -function shouldNormalizePath(val: any) { +function shouldNormalizePath(val: unknown): val is string { if (typeof val === 'string') { return normalizePath(val) !== val; } diff --git a/src/analyze.test.ts b/src/analyze.test.ts index 18ad454..0765e66 100644 --- a/src/analyze.test.ts +++ b/src/analyze.test.ts @@ -1,213 +1,45 @@ import { vol } from 'memfs'; -import { beforeEach, describe, expect, it } from 'vitest'; +import { vi, beforeEach, describe, expect, it } from 'vitest'; import { getMockedFileStructure } from './__test__/getMockedFileStructure.js'; import { analyze } from './analyze.js'; +vi.setConfig({ testTimeout: 5000 }); + const fileStructure = await getMockedFileStructure(); -beforeEach(async () => { - vol.fromNestedJSON(fileStructure); -}); +describe(analyze, () => { + beforeEach(() => { + vol.fromNestedJSON(fileStructure); + }); -describe(analyze.name, () => { it('returns information about the files that would be removed', async () => { + expect.hasAssertions(); + const result = await analyze(); - expect(result).toMatchInlineSnapshot(` - [ - { - "filePath": "/node_modules/dep1/.npmrc", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - ], - }, - { - "filePath": "/node_modules/dep2/CHANGELOG.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - { - "derived": "/node_modules/**/changelog*(.*)", - "original": "changelog*(.*)", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test1.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test2.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/a-dir/doc.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - ], - }, - ] - `); + expect(result).toMatchSnapshot(); }); it('accepts custom globs', async () => { + expect.hasAssertions(); + const result = await analyze({ globs: ['**/nonDefaultFile.ext'] }); - expect(result).toMatchInlineSnapshot(` - [ - { - "filePath": "/node_modules/dep1/.npmrc", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - ], - }, - { - "filePath": "/node_modules/dep2/CHANGELOG.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - { - "derived": "/node_modules/**/changelog*(.*)", - "original": "changelog*(.*)", - }, - ], - }, - { - "filePath": "/node_modules/dep4/nonDefaultFile.ext", - "includedByDefault": false, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**/nonDefaultFile.ext", - "original": "**/nonDefaultFile.ext", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test1.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test2.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/a-dir/doc.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - ], - }, - ] - `); + expect(result).toMatchSnapshot(); }); it('allows skipping default globs', async () => { + expect.hasAssertions(); + const result = await analyze({ noDefaults: true, globs: ['**/nonDefaultFile.ext'] }); - expect(result).toMatchInlineSnapshot(` - [ - { - "filePath": "/node_modules/dep4/nonDefaultFile.ext", - "includedByDefault": false, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**/nonDefaultFile.ext", - "original": "**/nonDefaultFile.ext", - }, - ], - }, - ] - `); + expect(result).toMatchSnapshot(); }); it('uses custom glob file if provided', async () => { + expect.hasAssertions(); + const customGlobFile = '.custom-glob-file'; vol.fromNestedJSON({ ...fileStructure, [customGlobFile]: '**.md\n**/nonDefaultFile.ext' }); const result = await analyze({ noDefaults: true, globFile: customGlobFile }); - expect(result).toMatchInlineSnapshot(` - [ - { - "filePath": "/node_modules/dep2/CHANGELOG.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**.md", - "original": "**.md", - }, - ], - }, - { - "filePath": "/node_modules/dep4/nonDefaultFile.ext", - "includedByDefault": false, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**/nonDefaultFile.ext", - "original": "**/nonDefaultFile.ext", - }, - ], - }, - { - "filePath": "/node_modules/dep1/a-dir/doc.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**.md", - "original": "**.md", - }, - ], - }, - ] - `); + expect(result).toMatchSnapshot(); }); }); diff --git a/src/analyze.ts b/src/analyze.ts index f20ecef..aae2902 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -1,4 +1,5 @@ -import { SharedOptions, sharedDefaultOptions } from './shared.js'; +import type { SharedOptions } from './shared.js'; +import { sharedDefaultOptions } from './shared.js'; import { findFilesByGlobLists, getGlobLists, @@ -9,21 +10,21 @@ import { toPosixPath, } from './utils/glob.js'; -export interface GlobVersions { +export type GlobVersions = { /** The original glob, as provided by the glob file or user. */ original: string; /** The glob as it was derived by clean-modules and passed to picomatch. */ derived: string; -} +}; -export interface AnalyzeResult { +export type AnalyzeResult = { /** The absolute path to the file. */ filePath: string; /** Whether the file was included by clean-modules' default globs. */ includedByDefault: boolean; /** List of globs that included the file. */ includedByGlobs: GlobVersions[]; -} +}; export type AnalyzeOptions = SharedOptions; diff --git a/src/clean.test.ts b/src/clean.test.ts index f51c31e..6029c7a 100644 --- a/src/clean.test.ts +++ b/src/clean.test.ts @@ -1,16 +1,20 @@ import { vol } from 'memfs'; -import { beforeEach, describe, expect, it } from 'vitest'; +import { vi, beforeEach, describe, expect, it } from 'vitest'; import { getMockedFileStructure } from './__test__/getMockedFileStructure.js'; import { clean } from './clean.js'; +vi.setConfig({ testTimeout: 5000 }); + const fileStructure = await getMockedFileStructure(); -beforeEach(async () => { - vol.fromNestedJSON(fileStructure); -}); +describe(clean, () => { + beforeEach(() => { + vol.fromNestedJSON(fileStructure); + }); -describe(clean.name, () => { it('cleans up expected files by default', async () => { + expect.hasAssertions(); + const result = await clean(); expect(result).toMatchInlineSnapshot(` { @@ -28,6 +32,8 @@ describe(clean.name, () => { }); it('accepts custom globs', async () => { + expect.hasAssertions(); + const result = await clean({ globs: ['**/nonDefaultFile.ext'] }); expect(result).toMatchInlineSnapshot(` { @@ -46,6 +52,8 @@ describe(clean.name, () => { }); it('allows skipping default globs', async () => { + expect.hasAssertions(); + const result = await clean({ noDefaults: true, globs: ['**/nonDefaultFile.ext'] }); expect(result).toMatchInlineSnapshot(` { @@ -59,6 +67,8 @@ describe(clean.name, () => { }); it('uses custom glob file if provided', async () => { + expect.hasAssertions(); + const customGlobFile = '.custom-glob-file'; vol.fromNestedJSON({ ...fileStructure, [customGlobFile]: '**.md\n**/nonDefaultFile.ext' }); @@ -77,6 +87,8 @@ describe(clean.name, () => { }); it('keeps empty directories if specified', async () => { + expect.hasAssertions(); + const result = await clean({ keepEmpty: true }); expect(result.removedEmptyDirs).toBe(0); }); diff --git a/src/clean.ts b/src/clean.ts index 2be4c7c..dacca9d 100644 --- a/src/clean.ts +++ b/src/clean.ts @@ -1,28 +1,31 @@ -import { SharedOptions, sharedDefaultOptions } from './shared.js'; +import { sharedDefaultOptions } from './shared.js'; +import type { SharedOptions } from './shared.js'; import { removeEmptyDirs, removeFiles } from './utils/filesystem.js'; import { findFilesByGlobLists, getGlobLists } from './utils/glob.js'; +const ZERO_DIRS = 0; + export const defaultCleanOptions: Required = { ...sharedDefaultOptions, dryRun: false, keepEmpty: false, }; -export interface CleanResult { +export type CleanResult = { /** List of all files that were cleaned up. */ files: string[]; /** How many bytes of data that was removed when cleaning. */ reducedSize: number; /** The number of empty directories that were cleaned up after the operation. */ removedEmptyDirs: number; -} +}; -export interface CleanOptions extends SharedOptions { +export type CleanOptions = SharedOptions & { /** Whether to skip actually deleting any files and just perform a dry run of the cleaning operation. */ dryRun?: boolean; /** Whether to keep empty directories around after cleaning. */ keepEmpty?: boolean; -} +}; /** * Removes unnecessary files to reduce the size of a node_modules directory. @@ -36,7 +39,8 @@ export async function clean(options: CleanOptions = {}): Promise { const globLists = await getGlobLists({ globs, noDefaults, globFile }); const files = await findFilesByGlobLists(directory, globLists); const reducedSize = await removeFiles(files, { dryRun }); - const removedEmptyDirs = dryRun || keepEmpty ? 0 : await removeEmptyDirs(files); + // oxlint-disable-next-line no-magic-numbers + const removedEmptyDirs = dryRun || keepEmpty ? ZERO_DIRS : await removeEmptyDirs(files); return { files, reducedSize, removedEmptyDirs }; } diff --git a/src/cli/commands/analyze.command.ts b/src/cli/commands/analyze.command.ts index e795a1e..c014f9b 100644 --- a/src/cli/commands/analyze.command.ts +++ b/src/cli/commands/analyze.command.ts @@ -1,6 +1,8 @@ import { analyze } from '../../analyze.js'; import { BaseCommand } from '../helpers/base.command.js'; +const JSON_INDENT = 2; + export class AnalyzeCommand extends BaseCommand { static override paths = [['analyze']]; static override usage = { @@ -16,6 +18,7 @@ export class AnalyzeCommand extends BaseCommand { globFile: this.globFile, }); - console.log(JSON.stringify(analyzeResults, null, 2)); + // oxlint-disable-next-line no-console + console.log(JSON.stringify(analyzeResults, null, JSON_INDENT)); } } diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index c6d53b1..5b6edfe 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -5,6 +5,8 @@ import { clean } from '../../clean.js'; import { BaseCommand } from '../helpers/base.command.js'; import { bold, green, makeLogger, yellow, yesOrNo } from '../utils/terminal.js'; +const JSON_INDENT = 2; + export class CleanCommand extends BaseCommand { static override paths = [['clean'], Command.Default]; static override usage = { @@ -42,13 +44,14 @@ export class CleanCommand extends BaseCommand { const confirmed = await yesOrNo(yellow(warning)); if (!confirmed) { + // oxlint-disable-next-line unicorn/no-process-exit process.exit(0); } } logger.log('\nCleaning up node_modules...'); - const cleanupStart = new Date().getTime(); + const cleanupStart = Date.now(); const { files, reducedSize, removedEmptyDirs } = await clean({ globs: this.globs, @@ -58,7 +61,7 @@ export class CleanCommand extends BaseCommand { dryRun: this.dryRun, }); - const cleanupDuration = new Date().getTime() - cleanupStart; + const cleanupDuration = Date.now() - cleanupStart; logger.log(green(`Done in ${prettyMs(cleanupDuration)}!`)); if (this.json) { @@ -70,7 +73,8 @@ export class CleanCommand extends BaseCommand { dryRun: this.dryRun, }; - console.log(JSON.stringify(output, null, 2)); + // oxlint-disable-next-line no-console + console.log(JSON.stringify(output, null, JSON_INDENT)); } else { logger.log(bold('\nResults:')); logger.log( diff --git a/src/cli/utils/terminal.ts b/src/cli/utils/terminal.ts index adcc2c7..f386273 100644 --- a/src/cli/utils/terminal.ts +++ b/src/cli/utils/terminal.ts @@ -1,15 +1,19 @@ -import readline from 'readline'; +import readline from 'node:readline'; import supportsColor from 'supports-color'; type DisabledConsole = Console; +// oxlint-disable-next-line no-empty-function +const noop = (): void => {}; + /** * Creates a conditional console logger. */ export function makeLogger({ disabled }: { disabled: boolean }): Console | DisabledConsole { if (disabled) { - const noop = () => undefined; + // oxlint-disable-next-line unicorn/no-array-reduce return Object.keys(console).reduce((disabledConsole, key) => { + // oxlint-disable-next-line typescript/no-explicit-any disabledConsole[key as keyof Console] = noop as any; return disabledConsole; }, {} as DisabledConsole); @@ -21,29 +25,30 @@ export function makeLogger({ disabled }: { disabled: boolean }): Console | Disab /** * Prompts the user with a yes/no question and waits for the answer. */ -export async function yesOrNo(query: string): Promise { +export function yesOrNo(query: string): Promise { const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); - return new Promise(resolve => + return new Promise(resolve => { rl.question(query, (answer: string) => { rl.close(); resolve(/ye?s?/i.test(answer)); - }) - ); + }); + }); } /** * Simple string colorizer factory. */ -function colorizer(colorCode: string) { +function colorizer(colorCode: string): (text: string | number) => string { if (!supportsColor.stdout) { - return (text: string | number) => String(text); + // oxlint-disable-next-line unicorn/prefer-native-coercion-functions + return text => String(text); } - return (text: string | number) => `\x1b[${colorCode}m${text}\x1b[0m`; + return text => `\u001B[${colorCode}m${text}\u001B[0m`; } export const bold = colorizer('1'); diff --git a/src/shared.ts b/src/shared.ts index 3f5181a..68d5829 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -1,9 +1,9 @@ -import path from 'path'; +import path from 'node:path'; import { fileDir } from './utils/filesystem.js'; export const DEFAULT_GLOBS_FILE_PATH = path.resolve(fileDir(import.meta.url), '..', '.cleanmodules-default'); -export interface SharedOptions { +export type SharedOptions = { /** The directory to clean, usually node_modules. */ directory?: string; /** Path to a custom glob file. Uses `.cleanmodules` by default. */ @@ -12,7 +12,7 @@ export interface SharedOptions { noDefaults?: boolean; /** List of custom globs to include or exclude. */ globs?: string[] | undefined; -} +}; export const sharedDefaultOptions: Required = { directory: path.resolve(process.cwd(), 'node_modules'), diff --git a/src/utils/filesystem.test.ts b/src/utils/filesystem.test.ts index a1e07fe..1e36d8b 100644 --- a/src/utils/filesystem.test.ts +++ b/src/utils/filesystem.test.ts @@ -1,7 +1,7 @@ -import fs from 'fs'; -import path from 'path'; +import fs from 'node:fs'; +import path from 'node:path'; import { vol } from 'memfs'; -import { afterEach, beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { getMockedFileStructure } from '../__test__/getMockedFileStructure.js'; import { crawlDirFast, @@ -12,8 +12,12 @@ import { removeEmptyDirs, removeEmptyDirsUp, removeFiles, + type CheckPathFunc, + type DirentAction, } from './filesystem.js'; +vi.setConfig({ testTimeout: 5000 }); + describe('file exists', () => { beforeEach(() => { vol.fromNestedJSON({ @@ -25,16 +29,22 @@ describe('file exists', () => { }); it('returns true if the file exists', async () => { + expect.hasAssertions(); + const result = await fileExists('testdir/foo'); expect(result).toBe(true); }); it('returns false if the file does not exists', async () => { + expect.hasAssertions(); + const result = await fileExists('testdir/foo'); expect(result).toBe(true); }); it("throws any error that isn't ENOENT", async () => { + expect.hasAssertions(); + const statSpy = vi.spyOn(fs.promises, 'stat').mockImplementation(() => { throw new Error('not an ENOENT!'); }); @@ -45,7 +55,7 @@ describe('file exists', () => { }); }); -describe('forEachDirentAsync', () => { +describe(forEachDirentAsync, () => { beforeEach(() => { vol.fromNestedJSON({ testdir: { @@ -57,7 +67,9 @@ describe('forEachDirentAsync', () => { }); it('runs action with dirents for each item in a directory', async () => { - const action = vi.fn(); + expect.hasAssertions(); + + const action = vi.fn(); await forEachDirentAsync('testdir', action); expect(action).toHaveBeenCalledTimes(3); @@ -81,21 +93,27 @@ describe('forEachDirentAsync', () => { }); }); -describe('readDirectory', () => { +describe(readDirectory, () => { beforeEach(() => { vol.fromNestedJSON({ 'parent/empty': { 'foo.txt': '', 'bar.txt': '' } }); }); it('returns list of files in directory', async () => { - expect(await readDirectory('parent/empty')).toEqual(expect.arrayContaining(['foo.txt', 'bar.txt'])); + expect.hasAssertions(); + + await expect(readDirectory('parent/empty')).resolves.toStrictEqual( + expect.arrayContaining(['foo.txt', 'bar.txt']) + ); }); it('returns empty array if directory does not exist', async () => { - expect(await readDirectory('parent/invalid')).toEqual([]); + expect.hasAssertions(); + + await expect(readDirectory('parent/invalid')).resolves.toStrictEqual([]); }); }); -describe('removeEmptyDirsUp', () => { +describe(removeEmptyDirsUp, () => { beforeEach(() => { vol.fromNestedJSON({ a0: { @@ -112,32 +130,38 @@ describe('removeEmptyDirsUp', () => { }); it('recursively removes empty directories up in the file tree', async () => { + expect.hasAssertions(); + const checkedDirs = new Set(); await removeEmptyDirsUp(checkedDirs, 'a0/b0/c0/d0/e0'); - expect(Array.from(checkedDirs)).toEqual(['a0/b0/c0/d0/e0', 'a0/b0/c0/d0', 'a0/b0/c0', 'a0/b0']); + expect([...checkedDirs]).toStrictEqual(['a0/b0/c0/d0/e0', 'a0/b0/c0/d0', 'a0/b0/c0', 'a0/b0']); // dirs no longer exist - expect(fs.existsSync('a0/b0/c0/d0/e0')).toEqual(false); - expect(fs.existsSync('a0/b0/c0/d0')).toEqual(false); - expect(fs.existsSync('a0/b0/c0')).toEqual(false); - expect(fs.existsSync('a0/b0')).toEqual(true); - expect(fs.existsSync('a0')).toEqual(true); + expect(fs.existsSync('a0/b0/c0/d0/e0')).toBe(false); + expect(fs.existsSync('a0/b0/c0/d0')).toBe(false); + expect(fs.existsSync('a0/b0/c0')).toBe(false); + expect(fs.existsSync('a0/b0')).toBe(true); + expect(fs.existsSync('a0')).toBe(true); }); it('does not throw if path is invalid', async () => { + expect.hasAssertions(); + const checkedDirs = new Set(); - expect(async () => await removeEmptyDirsUp(checkedDirs, 'invalid/path')).not.toThrow(); + await expect(() => removeEmptyDirsUp(checkedDirs, 'invalid/path')).not.toThrow(); }); }); -describe('removeEmptyDirs', () => { +describe(removeEmptyDirs, () => { beforeEach(async () => { const fileStructure = await getMockedFileStructure(); vol.fromNestedJSON(fileStructure); }); it('cleans up empty parent dirs for provided files', async () => { + expect.hasAssertions(); + const filePaths = [ 'node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md', @@ -158,12 +182,14 @@ describe('removeEmptyDirs', () => { }); it('does not throw if path is invalid', async () => { + expect.hasAssertions(); + const filePaths = ['invalid/path/2', 'invalid/path/2']; - expect(async () => await removeEmptyDirs(filePaths)).not.toThrow(); + await expect(() => removeEmptyDirs(filePaths)).not.toThrow(); }); }); -describe('crawlDirFast', () => { +describe(crawlDirFast, () => { beforeEach(() => { vol.fromNestedJSON({ a0: { @@ -189,9 +215,11 @@ describe('crawlDirFast', () => { }); it('appends all nested file paths to the provided array', async () => { + expect.hasAssertions(); + const filePaths: string[] = []; await crawlDirFast(filePaths, 'a0'); - expect(filePaths).toEqual([ + expect(filePaths).toStrictEqual([ path.join('a0', 'b0', 'c1'), path.join('a0', 'b0', 'c2'), path.join('a0', 'b0', 'c0', 'd2'), @@ -200,12 +228,14 @@ describe('crawlDirFast', () => { }); it('does not throw if path is invalid', async () => { + expect.hasAssertions(); + const filePaths: string[] = []; - expect(async () => await crawlDirFast(filePaths, 'invalid/path')).not.toThrow(); + await expect(() => crawlDirFast(filePaths, 'invalid/path')).not.toThrow(); }); }); -describe('crawlDirWithChecks', () => { +describe(crawlDirWithChecks, () => { beforeEach(() => { vol.fromNestedJSON({ a0: { @@ -231,9 +261,11 @@ describe('crawlDirWithChecks', () => { }); it('runs check functions on each nested item', async () => { + expect.hasAssertions(); + const filePaths: string[] = []; - const checkDir = vi.fn(() => false); - const checkFile = vi.fn(() => true); + const checkDir = vi.fn(() => false); + const checkFile = vi.fn(() => true); await crawlDirWithChecks(filePaths, 'a0', checkDir, checkFile); expect(checkDir).toHaveBeenCalledTimes(6); @@ -241,51 +273,57 @@ describe('crawlDirWithChecks', () => { }); it('includes full dir without checking remaining items if checkDir returns true', async () => { + expect.hasAssertions(); + const filePaths: string[] = []; - const checkDir = vi.fn(() => true); - const checkFile = vi.fn(() => true); + const checkDir = vi.fn(() => true); + const checkFile = vi.fn(() => true); await crawlDirWithChecks(filePaths, 'a0', checkDir, checkFile); - expect(filePaths).toEqual([ + expect(filePaths).toStrictEqual([ path.join('a0', 'b0', 'c1'), path.join('a0', 'b0', 'c2'), path.join('a0', 'b0', 'c0', 'd2'), path.join('a0', 'b0', 'c0', 'd1', 'e0', 'f0'), ]); expect(checkDir).toHaveBeenCalledTimes(1); - expect(checkFile).toHaveBeenCalledTimes(0); + expect(checkFile).not.toHaveBeenCalled(); }); it('skips file if checkFile function returns false', async () => { + expect.hasAssertions(); + const filePaths: string[] = []; - const checkDir = vi.fn(() => false); - const checkFile = vi.fn(() => false); + const checkDir = vi.fn(() => false); + const checkFile = vi.fn(() => false); await crawlDirWithChecks(filePaths, 'a0', checkDir, checkFile); - expect(filePaths).toEqual([]); + expect(filePaths).toStrictEqual([]); expect(checkFile).toHaveBeenCalledTimes(4); }); it('does not throw if path is invalid', async () => { + expect.hasAssertions(); + const filePaths: string[] = []; - const checkDir = vi.fn(() => false); - const checkFile = vi.fn(() => false); + const checkDir = vi.fn(() => false); + const checkFile = vi.fn(() => false); - expect( - async () => await crawlDirWithChecks(filePaths, 'invalid/path', checkDir, checkFile) - ).not.toThrow(); + await expect(() => crawlDirWithChecks(filePaths, 'invalid/path', checkDir, checkFile)).not.toThrow(); }); }); -describe('removeFiles', () => { +describe(removeFiles, () => { beforeEach(async () => { const fileStructure = await getMockedFileStructure(); vol.fromNestedJSON(fileStructure); }); it('removes files at provided file paths', async () => { + expect.hasAssertions(); + const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md']; // files are initially there @@ -300,6 +338,8 @@ describe('removeFiles', () => { }); it('does not remove files during dry runs', async () => { + expect.hasAssertions(); + const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md']; await removeFiles(filePaths, { dryRun: true }); @@ -309,7 +349,9 @@ describe('removeFiles', () => { }); it('does not throw if path is invalid', async () => { + expect.hasAssertions(); + const filePaths = ['/invalid/path/2', '/invalid/path/2']; - expect(async () => await removeFiles(filePaths)).not.toThrow(); + await expect(() => removeFiles(filePaths)).not.toThrow(); }); }); diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index a51af21..b66a147 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -1,12 +1,12 @@ -import fs, { Dirent } from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'url'; +import fs, { type Dirent } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; export type DirentAction = (dirent: Dirent) => void; export type CheckPathFunc = (nextPath: string) => boolean; -function hasErrorCode(error: any, code: string): boolean { - return error?.code === code; +function hasErrorCode(error: unknown, code: string): boolean { + return (error as { code?: string })?.code === code; } /** @@ -34,7 +34,7 @@ export async function forEachDirentAsync(dirPath: string, action: DirentAction): try { dirFiles = await fs.promises.readdir(dirPath, { withFileTypes: true }); - } catch (error) { + } catch { // do nothing } @@ -73,14 +73,14 @@ export async function removeEmptyDirsUp( if (emptyDir) { try { await fs.promises.rmdir(dirPath); - // biome-ignore lint/style/noParameterAssign: recursive function + // oxlint-disable-next-line no-param-reassign count++; - } catch (error) { + } catch { // do nothing } const parentDir = path.dirname(dirPath); - // biome-ignore lint/style/noParameterAssign: recursive function + // oxlint-disable-next-line no-param-reassign count = await removeEmptyDirsUp(checkedDirs, parentDir, count); } } @@ -172,7 +172,7 @@ export async function removeFiles(filePaths: string[], options: RemoveFilesOptio } reducedSize += fileStats.size; - } catch (error) { + } catch { // do nothing } }) @@ -185,6 +185,6 @@ export async function removeFiles(filePaths: string[], options: RemoveFilesOptio * Get directory of the file directory, like CommonJS `__dirname`. * @example const thisFilesDir = fileDir(import.meta.url); */ -export function fileDir(importMetaUrl: string) { +export function fileDir(importMetaUrl: string): string { return path.dirname(fileURLToPath(importMetaUrl)); } diff --git a/src/utils/glob.test.ts b/src/utils/glob.test.ts index 2ebb70c..cdb22d8 100644 --- a/src/utils/glob.test.ts +++ b/src/utils/glob.test.ts @@ -1,13 +1,10 @@ -import path from 'path'; -import { vol } from 'memfs'; -import pm from 'picomatch'; -import { beforeEach, describe, expect, it, Mock, vi } from 'vitest'; +import path from 'node:path'; +import { vol, type NestedDirectoryJSON } from 'memfs'; +import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { getMockedFileStructure } from '../__test__/getMockedFileStructure.js'; import { - DEFAULT_PICO_OPTIONS, findFilesByGlobLists, formatGlob, - GlobLists, initGlobLists, makeGlobMatcher, mergeGlobLists, @@ -18,9 +15,12 @@ import { toAbsoluteGlobLists, updateGlobLists, wrapGlobs, + type GlobLists, } from './glob.js'; -describe('makeGlobMatcher', () => { +vi.setConfig({ testTimeout: 5000 }); + +describe(makeGlobMatcher, () => { it('creates a picomatch globber with default options', () => { const pattern = '**/**'; @@ -31,7 +31,7 @@ describe('makeGlobMatcher', () => { }); }); -describe('updateGlobLists', () => { +describe(updateGlobLists, () => { const mockGlobLists: GlobLists = { ...initGlobLists(), included: ['foo'], @@ -40,7 +40,7 @@ describe('updateGlobLists', () => { }; it('runs passed function for correct files', () => { - const mockFn = vi.fn(); + const mockFn = vi.fn<(globs: string[], key: keyof GlobLists) => string[]>(); updateGlobLists(mockGlobLists, mockFn); @@ -54,15 +54,15 @@ describe('updateGlobLists', () => { const expectedResult: GlobLists = { ...mockGlobLists, included: [...mockGlobLists.included, 'included'], - includedDirs: [...(mockGlobLists.includedDirs || []), 'includedDirs'], + includedDirs: [...mockGlobLists.includedDirs, 'includedDirs'], excluded: [...mockGlobLists.excluded, 'excluded'], }; - expect(result).toEqual(expectedResult); + expect(result).toStrictEqual(expectedResult); }); }); -describe('mergeGlobLists', () => { +describe(mergeGlobLists, () => { it('merges glob lists', () => { const result = mergeGlobLists( { @@ -79,7 +79,7 @@ describe('mergeGlobLists', () => { } ); - expect(result).toEqual({ + expect(result).toStrictEqual({ ...initGlobLists(), included: ['foo', 'bar'], includedDirs: ['foo', 'bar'], @@ -88,7 +88,7 @@ describe('mergeGlobLists', () => { }); }); -describe('toAbsoluteGlobLists', () => { +describe(toAbsoluteGlobLists, () => { it('prepends globs with absolute paths on all platforms', () => { const result = toAbsoluteGlobLists( { @@ -100,7 +100,7 @@ describe('toAbsoluteGlobLists', () => { '/foo' ); - expect(result).toEqual({ + expect(result).toStrictEqual({ ...initGlobLists(), included: ['/foo/bar'], includedDirs: ['/foo/bar'], @@ -109,31 +109,31 @@ describe('toAbsoluteGlobLists', () => { }); }); -describe('wrapGlobs', () => { +describe(wrapGlobs, () => { it('wraps globs into a single glob', () => { const result = wrapGlobs(['**/foo', '**/bar', '*/baz']); - expect(result).toEqual('@((**/foo)|(**/bar)|(*/baz))'); + expect(result).toBe('@((**/foo)|(**/bar)|(*/baz))'); }); it('prepends an optional prefix to the result', () => { const result = wrapGlobs(['**/foo', '**/bar', '*/baz'], 'hello'); - expect(result).toEqual('hello@((**/foo)|(**/bar)|(*/baz))'); + expect(result).toBe('hello@((**/foo)|(**/bar)|(*/baz))'); }); }); -describe('optimizeGlobs', () => { +describe(optimizeGlobs, () => { it('splits globs by leading characters and merges into two globs', () => { const result = optimizeGlobs(['**/some', '*/where', 'over', '**/the', '/rainbow']); - expect(result).toEqual(['**/@((some)|(the))', '@((*/where)|(over)|(/rainbow))']); + expect(result).toStrictEqual(['**/@((some)|(the))', '@((*/where)|(over)|(/rainbow))']); }); it('normalizes leading globstars', () => { const result = optimizeGlobs(['**/**/**/one', '**/**/two', '**/three', '/**/four']); - expect(result).toEqual(['**/@((one)|(two)|(three)|(four))']); + expect(result).toStrictEqual(['**/@((one)|(two)|(three)|(four))']); }); }); -describe('optimizeGlobLists', () => { +describe(optimizeGlobLists, () => { it('splits globs by leading characters and merges into two globs', () => { const result = optimizeGlobLists({ ...initGlobLists(), @@ -162,34 +162,34 @@ describe('optimizeGlobLists', () => { }); }); -describe('formatGlob', () => { +describe(formatGlob, () => { it('trims globs', () => { const result = formatGlob(' foo/** '); - expect(result).toEqual('**/foo/**'); + expect(result).toBe('**/foo/**'); }); it('adds globstars to globs not starting with a slash', () => { const result = formatGlob('test.ts'); - expect(result).toEqual('**/test.ts'); + expect(result).toBe('**/test.ts'); }); it('replaces escaped leading exclamation marks', () => { - const result = formatGlob('\\!(*.d).ts'); - expect(result).toEqual('**/!(*.d).ts'); + const result = formatGlob(String.raw`\!(*.d).ts`); + expect(result).toBe('**/!(*.d).ts'); }); it('removes leading slashes', () => { const result = formatGlob('/path/to/file'); - expect(result).toEqual('path/to/file'); + expect(result).toBe('path/to/file'); }); it('appends globstars to directory globs', () => { const result = formatGlob('/path/to/directory/'); - expect(result).toEqual('path/to/directory/**'); + expect(result).toBe('path/to/directory/**'); }); }); -describe('processGlobs', () => { +describe(processGlobs, () => { it('formats globs and splits them into include/exclude glob lists', () => { const result = processGlobs(['**/test', '!test.js', '**/path/to/directory/', '*.ext']); expect(result).toMatchInlineSnapshot(` @@ -216,25 +216,27 @@ describe('processGlobs', () => { it('removes trailing globstars from dir globs', () => { const result = processGlobs(['**/foo/**', '/bar/**']); - expect(result.includedDirs).toEqual(['**/**/foo', 'bar']); + expect(result.includedDirs).toStrictEqual(['**/**/foo', 'bar']); }); it('filters empty strings', () => { const result = processGlobs(['foo', '', '', '', 'bar']); - expect(result.included).toEqual(['**/foo', '**/bar']); + expect(result.included).toStrictEqual(['**/foo', '**/bar']); }); it('keeps original inclusion globs', () => { const original = ['**/test', '**/path/to/directory/', '*.ext']; const result = processGlobs(original); - expect(result.originalIncluded).toEqual(original); + expect(result.originalIncluded).toStrictEqual(original); }); }); -describe('parseGlobsFile', () => { +describe(parseGlobsFile, () => { const globFilePath = process.cwd() + '/.cleanmodules'; it('loads globs from a glob file', async () => { + expect.hasAssertions(); + const globFile = ` # this is a comment __test__/ @@ -276,6 +278,8 @@ describe('parseGlobsFile', () => { }); it('removes comments', async () => { + expect.hasAssertions(); + const globFile = ` # this is a comment # this too @@ -285,11 +289,13 @@ describe('parseGlobsFile', () => { vol.fromNestedJSON({ [globFilePath]: globFile }); const result = await parseGlobsFile(globFilePath); - expect(result.included).toEqual(['**/path/to/something']); - expect(result.excluded).toEqual([]); + expect(result.included).toStrictEqual(['**/path/to/something']); + expect(result.excluded).toStrictEqual([]); }); it('removes empty lines', async () => { + expect.hasAssertions(); + const globFile = ` path/to/something @@ -298,37 +304,45 @@ describe('parseGlobsFile', () => { vol.fromNestedJSON({ [globFilePath]: globFile }); const result = await parseGlobsFile(globFilePath); - expect(result.included).toEqual(['**/path/to/something']); - expect(result.excluded).toEqual([]); + expect(result.included).toStrictEqual(['**/path/to/something']); + expect(result.excluded).toStrictEqual([]); }); it('adds lines starting with an exclamation point to excluded globs', async () => { + expect.hasAssertions(); + const globFile = ` !excludeMe `; vol.fromNestedJSON({ [globFilePath]: globFile }); const result = await parseGlobsFile(globFilePath); - expect(result.included).toEqual([]); - expect(result.excluded).toEqual(['**/excludeMe']); + expect(result.included).toStrictEqual([]); + expect(result.excluded).toStrictEqual(['**/excludeMe']); }); }); -describe('findFilesByGlobLists', async () => { - const fileStructure = await getMockedFileStructure(); +describe(findFilesByGlobLists, () => { + let fileStructure: NestedDirectoryJSON; const nodeModulesPath = 'node_modules'; - beforeEach(async () => { + beforeAll(async () => { + fileStructure = await getMockedFileStructure(); + }); + + beforeEach(() => { vol.fromNestedJSON(fileStructure); }); it('includes dirs', async () => { + expect.hasAssertions(); + const result = await findFilesByGlobLists(nodeModulesPath, { ...initGlobLists(), includedDirs: ['**/__tests__', '**/dep3'], }); - expect(result).toEqual([ + expect(result).toStrictEqual([ path.join('node_modules', 'dep1', '__tests__', 'test1.js'), path.join('node_modules', 'dep1', '__tests__', 'test2.js'), path.join('node_modules', 'dep3', 'deeply', 'nested', 'file.ext'), @@ -336,24 +350,28 @@ describe('findFilesByGlobLists', async () => { }); it('includes files', async () => { + expect.hasAssertions(); + const result = await findFilesByGlobLists(nodeModulesPath, { ...initGlobLists(), included: ['**/deeply/nested/file.ext', '**/dep4/**'], }); - expect(result).toEqual([ + expect(result).toStrictEqual([ path.join('node_modules', 'dep4', 'nonDefaultFile.ext'), path.join('node_modules', 'dep3', 'deeply', 'nested', 'file.ext'), ]); }); it('can exclude files and dirs by glob patterns', async () => { + expect.hasAssertions(); + const result = await findFilesByGlobLists(nodeModulesPath, { ...initGlobLists(), included: ['**/*.js'], excluded: ['**/test*.js'], }); - expect(result).toEqual([path.join('node_modules', 'dep2', 'file.js')]); + expect(result).toStrictEqual([path.join('node_modules', 'dep2', 'file.js')]); }); }); diff --git a/src/utils/glob.ts b/src/utils/glob.ts index ed427cb..e41eaa0 100644 --- a/src/utils/glob.ts +++ b/src/utils/glob.ts @@ -1,6 +1,6 @@ -import { promises as fsAsync } from 'fs'; -import path from 'path'; -import pm, { PicomatchOptions } from 'picomatch'; +import { promises as fsAsync } from 'node:fs'; +import path from 'node:path'; +import pm, { type PicomatchOptions } from 'picomatch'; import { DEFAULT_GLOBS_FILE_PATH } from '../shared.js'; import { crawlDirWithChecks, fileExists } from './filesystem.js'; @@ -14,13 +14,13 @@ export const DEFAULT_PICO_OPTIONS: Partial = { strictSlashes: true, }; -export interface GlobberPicoOptions { +export type GlobberPicoOptions = { dot?: boolean; regex?: boolean; nocase?: boolean; ignore?: string | string[]; cwd?: string; -} +}; export type GlobFunc = (filePath: string, test?: boolean) => boolean; @@ -31,12 +31,12 @@ export function makeGlobMatcher(globs: string | string[], picoOptions?: GlobberP return pm(globs, { ...DEFAULT_PICO_OPTIONS, ...picoOptions }); } -export interface GlobLists { +export type GlobLists = { excluded: string[]; included: string[]; includedDirs: string[]; originalIncluded: string[]; -} +}; /** * Runs an action on all editable lists in a GlobLists object, and returns the updated object. @@ -65,9 +65,11 @@ export function mergeGlobLists(globListsA: GlobLists, globListsB: GlobLists): Gl }; } -/** Replaces path with forward slashes as separators if necessary. Globs should always have POSIX separators, even on Windows. */ +/** + * Replaces path with forward slashes as separators if necessary. Globs should always have POSIX separators, even on Windows. + */ export function toPosixPath(pathStr: string): string { - return path.sep === '/' ? pathStr : pathStr.replace(/\\/g, '/'); + return path.sep === '/' ? pathStr : pathStr.replaceAll('\\', '/'); } /** @@ -96,7 +98,7 @@ export function optimizeGlobs(globs: string[]): string[] { const fixedPathGlobs: string[] = []; for (const glob of globs) { - if (glob.match(GLOBSTAR_START_REGEX)) { + if (GLOBSTAR_START_REGEX.test(glob)) { globstarStartGlobs.push(glob); } else { fixedPathGlobs.push(glob); @@ -151,7 +153,7 @@ export function processGlobs(globs: string[]): GlobLists { const globLists = initGlobLists(); for (const glob of globs) { - const isExcluded = !!glob.match(EXCLAMATION_START); + const isExcluded = !!EXCLAMATION_START.test(glob); const formattedGlob = formatGlob(glob); if (!formattedGlob) { @@ -182,13 +184,14 @@ export async function parseGlobsFile(filePath: string): Promise { let fileContents: string; try { - fileContents = (await fsAsync.readFile(filePath, { encoding: 'utf-8' })).toString() || ''; + fileContents = await fsAsync.readFile(filePath, { encoding: 'utf8' }); } catch (error) { + // oxlint-disable-next-line no-console console.error(`Failed to read glob file (${filePath})`); throw error; } - const fileGlobs = fileContents.split(/\r?\n/).filter(line => !line.match(COMMENT_OR_EMPTY_REGEX)) || []; + const fileGlobs = fileContents.split(/\r?\n/).filter(line => !COMMENT_OR_EMPTY_REGEX.test(line)) || []; return processGlobs(fileGlobs); } @@ -196,15 +199,15 @@ export async function parseGlobsFile(filePath: string): Promise { /** * Parses clean-modules' default glob file. */ -export async function parseDefaultGlobsFile(): Promise { +export function parseDefaultGlobsFile(): Promise { return parseGlobsFile(DEFAULT_GLOBS_FILE_PATH); } -export interface GetGlobListsOptions { +export type GetGlobListsOptions = { noDefaults?: boolean | undefined; globFile?: string | undefined; globs?: string[] | undefined; -} +}; /** * Parses and combines globs from all possible sources. @@ -227,10 +230,13 @@ export async function getGlobLists({ noDefaults, globFile, globs }: GetGlobLists globListsToMerge.push(argGlobsLists); } - return globListsToMerge.reduce( - (mergedGlobLists, globLists) => mergeGlobLists(mergedGlobLists, globLists), - initGlobLists() - ); + let mergedGlobLists = initGlobLists(); + + for (const globLists of globListsToMerge) { + mergedGlobLists = mergeGlobLists(mergedGlobLists, globLists); + } + + return mergedGlobLists; } /** @@ -243,7 +249,7 @@ export async function findFilesByGlobLists(directory: string, globLists: GlobLis const { included, includedDirs, excluded } = toAbsoluteGlobLists(optimizeGlobLists(globLists), directory); const picoOptions = { ignore: excluded }; - const checkDir = includedDirs?.length ? makeGlobMatcher(includedDirs, picoOptions) : () => false; + const checkDir = includedDirs?.length ? makeGlobMatcher(includedDirs, picoOptions) : (): boolean => false; const checkFile = makeGlobMatcher(included, picoOptions); let filesToRemove = await crawlDirWithChecks([], directory, checkDir, checkFile); From bfeed3cb531288176bc6b5b814e4289f961043a3 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 16:03:13 +0200 Subject: [PATCH 08/63] chore(node): use node 24 and pnpm 11 --- .nvmrc | 1 + package.json | 4 +- pnpm-lock.yaml | 2855 ++++++++++++++++++++++++------------------- pnpm-workspace.yaml | 8 + 4 files changed, 1623 insertions(+), 1245 deletions(-) create mode 100644 .nvmrc create mode 100644 pnpm-workspace.yaml diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..3fe3b15 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24.13.0 diff --git a/package.json b/package.json index dc91970..12a5c50 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "vitest": "^2.1.1" }, "engines": { - "node": ">=14" + "node": ">=22" }, - "packageManager": "pnpm@9.11.0" + "packageManager": "pnpm@11.0.9" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85ce2cf..1aae377 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,32 +13,29 @@ importers: version: 3.2.1(typanion@3.14.0) picomatch: specifier: ^4.0.2 - version: 4.0.2 + version: 4.0.4 pretty-bytes: specifier: ^6.1.1 version: 6.1.1 pretty-ms: specifier: ^9.1.0 - version: 9.1.0 + version: 9.3.0 supports-color: specifier: ^9.4.0 version: 9.4.0 devDependencies: - '@biomejs/biome': - specifier: ^1.9.3 - version: 1.9.3 '@changesets/cli': specifier: ^2.27.8 - version: 2.27.8 + version: 2.31.0(@types/node@16.18.126) '@tsconfig/node14': specifier: ^14.1.2 - version: 14.1.2 + version: 14.1.8 '@types/mock-fs': specifier: 4.13.4 version: 4.13.4 '@types/node': specifier: '16' - version: 16.18.82 + version: 16.18.126 '@types/picomatch': specifier: 3.0.1 version: 3.0.1 @@ -50,452 +47,411 @@ importers: version: 1.3.0 memfs: specifier: ^4.12.0 - version: 4.12.0 - prettier: - specifier: 3.3.3 - version: 3.3.3 - prettier-plugin-organize-imports: - specifier: 4.1.0 - version: 4.1.0(prettier@3.3.3)(typescript@5.6.2) + version: 4.57.2(tslib@2.8.1) + oxfmt: + specifier: ^0.48.0 + version: 0.48.0 + oxlint: + specifier: ^1.63.0 + version: 1.63.0(oxlint-tsgolint@0.22.1) + oxlint-tsgolint: + specifier: ^0.22.1 + version: 0.22.1 tslib: specifier: ^2.7.0 - version: 2.7.0 + version: 2.8.1 tsup: specifier: ^8.3.0 - version: 8.3.0(postcss@8.4.35)(supports-color@9.4.0)(tsx@4.19.1)(typescript@5.6.2) + version: 8.5.1(postcss@8.5.14)(supports-color@9.4.0)(tsx@4.21.0)(typescript@5.6.2) tsx: specifier: ^4.19.1 - version: 4.19.1 + version: 4.21.0 typescript: specifier: 5.6.2 version: 5.6.2 vitest: specifier: ^2.1.1 - version: 2.1.1(@types/node@16.18.82)(supports-color@9.4.0) + version: 2.1.9(@types/node@16.18.126)(supports-color@9.4.0) packages: - '@babel/runtime@7.23.9': - resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + '@babel/runtime@7.29.2': + resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.9.3': - resolution: {integrity: sha512-POjAPz0APAmX33WOQFGQrwLvlu7WLV4CFJMlB12b6ZSg+2q6fYu9kZwLCOA+x83zXfcPd1RpuWOKJW0GbBwLIQ==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@1.9.3': - resolution: {integrity: sha512-QZzD2XrjJDUyIZK+aR2i5DDxCJfdwiYbUKu9GzkCUJpL78uSelAHAPy7m0GuPMVtF/Uo+OKv97W3P9nuWZangQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@1.9.3': - resolution: {integrity: sha512-vSCoIBJE0BN3SWDFuAY/tRavpUtNoqiceJ5PrU3xDfsLcm/U6N93JSM0M9OAiC/X7mPPfejtr6Yc9vSgWlEgVw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} - '@biomejs/cli-linux-arm64-musl@1.9.3': - resolution: {integrity: sha512-VBzyhaqqqwP3bAkkBrhVq50i3Uj9+RWuj+pYmXrMDgjS5+SKYGE56BwNw4l8hR3SmYbLSbEo15GcV043CDSk+Q==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} - '@biomejs/cli-linux-arm64@1.9.3': - resolution: {integrity: sha512-vJkAimD2+sVviNTbaWOGqEBy31cW0ZB52KtpVIbkuma7PlfII3tsLhFa+cwbRAcRBkobBBhqZ06hXoZAN8NODQ==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@1.9.3': - resolution: {integrity: sha512-TJmnOG2+NOGM72mlczEsNki9UT+XAsMFAOo8J0me/N47EJ/vkLXxf481evfHLlxMejTY6IN8SdRSiPVLv6AHlA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@biomejs/cli-linux-x64@1.9.3': - resolution: {integrity: sha512-x220V4c+romd26Mu1ptU+EudMXVS4xmzKxPVb9mgnfYlN4Yx9vD5NZraSx/onJnd3Gh/y8iPUdU5CDZJKg9COA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@1.9.3': - resolution: {integrity: sha512-lg/yZis2HdQGsycUvHWSzo9kOvnGgvtrYRgoCEwPBwwAL8/6crOp3+f47tPwI/LI1dZrhSji7PNsGKGHbwyAhw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@1.9.3': - resolution: {integrity: sha512-cQMy2zanBkVLpmmxXdK6YePzmZx0s5Z7KEnwmrW54rcXK3myCNbQa09SwGZ8i/8sLw0H9F3X7K4rxVNGU8/D4Q==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - - '@changesets/apply-release-plan@7.0.5': - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} - - '@changesets/assemble-release-plan@6.0.4': - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} - - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - - '@changesets/cli@2.27.8': - resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + '@changesets/cli@2.31.0': + resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} hasBin: true - '@changesets/config@3.0.3': - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} '@changesets/get-github-info@0.6.0': resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - '@changesets/get-release-plan@4.0.4': - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.1': - resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} - '@changesets/pre@2.0.1': - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.1': - resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} - '@changesets/should-skip-package@0.1.1': - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.22': - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} @@ -503,14 +459,116 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.1.0': - resolution: {integrity: sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==} + '@jsonjoy.com/base64@17.67.0': + resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.3.0': - resolution: {integrity: sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==} + '@jsonjoy.com/buffers@17.67.0': + resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@17.67.0': + resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.57.2': + resolution: {integrity: sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.57.2': + resolution: {integrity: sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.57.2': + resolution: {integrity: sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.57.2': + resolution: {integrity: sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.57.2': + resolution: {integrity: sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.57.2': + resolution: {integrity: sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.57.2': + resolution: {integrity: sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.57.2': + resolution: {integrity: sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@17.67.0': + resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@17.67.0': + resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@17.67.0': + resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -533,95 +591,426 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + '@oxfmt/binding-android-arm-eabi@0.48.0': + resolution: {integrity: sha512-uwqk+/KhQvBIpULD8SMM/zAafMRC/+DV/xsEQjkkIsJ/kLmEI/2bxonVowcYTiXqqZ/a0FEW8DPkZY3VvwELDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.48.0': + resolution: {integrity: sha512-VUCiKuXK5+McVssgHEJdrcGK7hRJzrRb36zm9/jwzMholyYt4BgXhw5Nm1V1DX6Ce717Zi/1jk432b/tgmQgtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.48.0': + resolution: {integrity: sha512-IkKp8rnIyQLW6Jt+6jragCbUVYSayk55lapiprLjIVvt4NczLyO/nwX2GgefLQ5iaBdfS8UEAFgCs/pLO6Cl0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.48.0': + resolution: {integrity: sha512-+aFuhsGIuvnoOjXyKVHMhPKJZR1kQkAl8QyrKoMlA7yJsSTC3N0Asl53La8TChSHhW8epToQ/Q0nvLmEmfNmLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.48.0': + resolution: {integrity: sha512-fbqzQL8FjI9gGnktI7RIo0dksDziTAYBy7xlI7jU7eID5fxLF/25fS4Xj6GydD8Y5oWHL83U4NK160QaOAxtyg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + resolution: {integrity: sha512-hn4i0zhAyTiB3ZHjQfYUZkDvrbVkohw1S7pySWxWUoZ87HnkDoTFThj7QTxk40hNPOTUP0vHbPRNamFIv1HBJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + resolution: {integrity: sha512-R4WBD9qF3QM9hqgdAa+fBGXmquTvDUujrPQ36t2Sjk8RPOSKGHDeN7l/khr10hqbQaOq9KCgPHG9ubNET/X/RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.48.0': + resolution: {integrity: sha512-5bVdwSwlm1M8wbYCorLOxWxUBw/8tBvHYyQNIfwWVPwOJaj5vg1APSGJQVpwJfV5VNE9PSrR91UKEpoNwHhqUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.48.0': + resolution: {integrity: sha512-vCS3Fk7gFslTqE1lUE2IlroyVV7u/9SmMA/uBqDoshuck2psGWcjW0ePyPZI3rM3+qtf2pDaMVIKMHozraifuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + resolution: {integrity: sha512-gKtfFfueUClXDumyoHUbymqRf7prHejOOyzJK0eIJn93GF9JBdFHdo60TM1ZBHxkEwZvjuOgHmKtneKbEOc/Eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + resolution: {integrity: sha512-SYt0UhOvZD/UwZz9sXq6J2uAw8o24f5VZpLB2DH01f6MevshmlgakQlZe2lwek2sZJkd07eLu7mZa0g7yeiw7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.48.0': + resolution: {integrity: sha512-JLbrwck2AopG4ud/XklZO5N+qxGC7cS7ROvXZVNfx0MCLDDL2kGOLvzuWORkVjnjAM0CMAfIMU2zNBtQbM+4dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.48.0': + resolution: {integrity: sha512-mdxt5L8OQLxkQH+JVpdC/lknZNe0lX4hlO3d8+xvw2wToo+iDrid9tiGOd5bmHfUVd5wVhrUry0qlu5vq66NkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.48.0': + resolution: {integrity: sha512-oEz1BQwMrV7OMEFx/3VPDU3n9TM0AnxpktDYXjEg5i6nTX87wo18wSfBvkl4tzAICdKtoAQAdBIl7Y7hsPlx5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.48.0': + resolution: {integrity: sha512-g2SKTTurP5mWjd8Ecait0erYqmltL4IqW1EwttM25BxM6NiTt4ubobJYMR1uox1V2QgG4UfHH10CGRvWlUixjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.48.0': + resolution: {integrity: sha512-CIg24VgheEpvolHL2gQuax5qcQ602bRMHrJ9g8XsQr3iVj9aSPgopigBKuMqrXsupwkrU+RQCn5cG8PgFntR6w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.48.0': + resolution: {integrity: sha512-zeaWkcxcEULwkGF3I/HgEvcDPN8buYDrxibBUa/IFh5Vmwyge+KpLO+hEwSovW349H0O/C0Z2kaFmEzEDm00/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.48.0': + resolution: {integrity: sha512-yiEKnIAGvx5CyZQOlMaNlZkAbwT7/Quk0j3WLt+PR5hK+qYjPTRRJYDfD77wCBPLvEYAG41v4KG3iL0H+uxoxg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.48.0': + resolution: {integrity: sha512-GSD2+7t2UoVMV2NgxXypa4bKewflPMAjYnF0Xw9/ht82ZfafAHhb8STwrEd7wlH2PFogt5zw3WVCxYJaHUdbeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint-tsgolint/darwin-arm64@0.22.1': + resolution: {integrity: sha512-4150Lpgc1YM09GcjA6GSrra1JoPjC7aOpfywLjWEY4vW0Sd1qKzqHF1WRaiw0/qUZ40OATYdv3aRd7ipPkWQbw==} + cpu: [arm64] + os: [darwin] + + '@oxlint-tsgolint/darwin-x64@0.22.1': + resolution: {integrity: sha512-vFWcPWYOgZs4HWcgS1EjUZg33NLcNfEYU49KGImmCfZWkflENrmBYV4HN/C0YeAPum6ZZ/goPSvQrB/cOD+NfA==} + cpu: [x64] + os: [darwin] + + '@oxlint-tsgolint/linux-arm64@0.22.1': + resolution: {integrity: sha512-6LiUpP0Zir3+29FvBm7Y28q/dBjSHqTZ5MhG1Ckw4fGhI4cAvbcwXaKvbjx1TP7rRmBNOoq/M5xdpHjTb+GAew==} + cpu: [arm64] + os: [linux] + + '@oxlint-tsgolint/linux-x64@0.22.1': + resolution: {integrity: sha512-fuX1hEQfpHauUbXADsfqVhRzrUrGabzGXbj5wsp2vKhV5uk/Rze8Mba9GdjFGECzvXudMGqHqxB4r6jGRdhxVA==} + cpu: [x64] + os: [linux] + + '@oxlint-tsgolint/win32-arm64@0.22.1': + resolution: {integrity: sha512-8SZidAj+jrbZf9ZjBEYW0tiNZ+KasqB2zgW26qdiPpQSF/DzURnPmXz651IeA9YsmbVdHGIooEHUmev6QJdquA==} + cpu: [arm64] + os: [win32] + + '@oxlint-tsgolint/win32-x64@0.22.1': + resolution: {integrity: sha512-QweSk9H5lFh5Y+WUf2Kq/OAN88V6+62ZwGhP38gqdRotI90luXSMkruFTj7Q2rYrzH4ZVNaSqx7NY8JpSfIzqg==} + cpu: [x64] + os: [win32] - '@rollup/rollup-android-arm-eabi@4.23.0': - resolution: {integrity: sha512-8OR+Ok3SGEMsAZispLx8jruuXw0HVF16k+ub2eNXKHDmdxL4cf9NlNpAzhlOhNyXzKDEJuFeq0nZm+XlNb1IFw==} + '@oxlint/binding-android-arm-eabi@1.63.0': + resolution: {integrity: sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.23.0': - resolution: {integrity: sha512-rEFtX1nP8gqmLmPZsXRMoLVNB5JBwOzIAk/XAcEPuKrPa2nPJ+DuGGpfQUR0XjRm8KjHfTZLpWbKXkA5BoFL3w==} + '@oxlint/binding-android-arm64@1.63.0': + resolution: {integrity: sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.23.0': - resolution: {integrity: sha512-ZbqlMkJRMMPeapfaU4drYHns7Q5MIxjM/QeOO62qQZGPh9XWziap+NF9fsqPHT0KzEL6HaPspC7sOwpgyA3J9g==} + '@oxlint/binding-darwin-arm64@1.63.0': + resolution: {integrity: sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.23.0': - resolution: {integrity: sha512-PfmgQp78xx5rBCgn2oYPQ1rQTtOaQCna0kRaBlc5w7RlA3TDGGo7m3XaptgitUZ54US9915i7KeVPHoy3/W8tA==} + '@oxlint/binding-darwin-x64@1.63.0': + resolution: {integrity: sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.23.0': - resolution: {integrity: sha512-WAeZfAAPus56eQgBioezXRRzArAjWJGjNo/M+BHZygUcs9EePIuGI1Wfc6U/Ki+tMW17FFGvhCfYnfcKPh18SA==} + '@oxlint/binding-freebsd-x64@1.63.0': + resolution: {integrity: sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + resolution: {integrity: sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.23.0': - resolution: {integrity: sha512-v7PGcp1O5XKZxKX8phTXtmJDVpE20Ub1eF6w9iMmI3qrrPak6yR9/5eeq7ziLMrMTjppkkskXyxnmm00HdtXjA==} + '@oxlint/binding-linux-arm-musleabihf@1.63.0': + resolution: {integrity: sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.23.0': - resolution: {integrity: sha512-nAbWsDZ9UkU6xQiXEyXBNHAKbzSAi95H3gTStJq9UGiS1v+YVXwRHcQOQEF/3CHuhX5BVhShKoeOf6Q/1M+Zhg==} + '@oxlint/binding-linux-arm64-gnu@1.63.0': + resolution: {integrity: sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.23.0': - resolution: {integrity: sha512-5QT/Di5FbGNPaVw8hHO1wETunwkPuZBIu6W+5GNArlKHD9fkMHy7vS8zGHJk38oObXfWdsuLMogD4sBySLJ54g==} + '@oxlint/binding-linux-arm64-musl@1.63.0': + resolution: {integrity: sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-powerpc64le-gnu@4.23.0': - resolution: {integrity: sha512-Sefl6vPyn5axzCsO13r1sHLcmPuiSOrKIImnq34CBurntcJ+lkQgAaTt/9JkgGmaZJ+OkaHmAJl4Bfd0DmdtOQ==} + '@oxlint/binding-linux-ppc64-gnu@1.63.0': + resolution: {integrity: sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.23.0': - resolution: {integrity: sha512-o4QI2KU/QbP7ZExMse6ULotdV3oJUYMrdx3rBZCgUF3ur3gJPfe8Fuasn6tia16c5kZBBw0aTmaUygad6VB/hQ==} + '@oxlint/binding-linux-riscv64-gnu@1.63.0': + resolution: {integrity: sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.23.0': - resolution: {integrity: sha512-+bxqx+V/D4FGrpXzPGKp/SEZIZ8cIW3K7wOtcJAoCrmXvzRtmdUhYNbgd+RztLzfDEfA2WtKj5F4tcbNPuqgeg==} + '@oxlint/binding-linux-riscv64-musl@1.63.0': + resolution: {integrity: sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.63.0': + resolution: {integrity: sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.23.0': - resolution: {integrity: sha512-I/eXsdVoCKtSgK9OwyQKPAfricWKUMNCwJKtatRYMmDo5N859tbO3UsBw5kT3dU1n6ZcM1JDzPRSGhAUkxfLxw==} + '@oxlint/binding-linux-x64-gnu@1.63.0': + resolution: {integrity: sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.23.0': - resolution: {integrity: sha512-4ZoDZy5ShLbbe1KPSafbFh1vbl0asTVfkABC7eWqIs01+66ncM82YJxV2VtV3YVJTqq2P8HMx3DCoRSWB/N3rw==} + '@oxlint/binding-linux-x64-musl@1.63.0': + resolution: {integrity: sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.63.0': + resolution: {integrity: sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.23.0': - resolution: {integrity: sha512-+5Ky8dhft4STaOEbZu3/NU4QIyYssKO+r1cD3FzuusA0vO5gso15on7qGzKdNXnc1gOrsgCqZjRw1w+zL4y4hQ==} + '@oxlint/binding-win32-arm64-msvc@1.63.0': + resolution: {integrity: sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.23.0': - resolution: {integrity: sha512-0SPJk4cPZQhq9qA1UhIRumSE3+JJIBBjtlGl5PNC///BoaByckNZd53rOYD0glpTkYFBQSt7AkMeLVPfx65+BQ==} + '@oxlint/binding-win32-ia32-msvc@1.63.0': + resolution: {integrity: sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.23.0': - resolution: {integrity: sha512-lqCK5GQC8fNo0+JvTSxcG7YB1UKYp8yrNLhsArlvPWN+16ovSZgoehlVHg6X0sSWPUkpjRBR5TuR12ZugowZ4g==} + '@oxlint/binding-win32-x64-msvc@1.63.0': + resolution: {integrity: sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@tsconfig/node14@14.1.2': - resolution: {integrity: sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q==} + '@rollup/rollup-android-arm-eabi@4.60.3': + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.3': + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + cpu: [arm64] + os: [android] - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@rollup/rollup-darwin-arm64@4.60.3': + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.3': + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.3': + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.3': + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.3': + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.3': + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.3': + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.3': + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.3': + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.3': + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.3': + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.3': + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} + cpu: [x64] + os: [win32] + + '@tsconfig/node14@14.1.8': + resolution: {integrity: sha512-SjGT+qPvh8Uhc849yNMD0ZIPr69AyB7Z46nMqhrI3gCVocd6mhI0jP4YE4onO/ufpmengRfTxNMpdpKEp2xRIg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/mock-fs@4.13.4': resolution: {integrity: sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg==} @@ -629,26 +1018,22 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@16.18.82': - resolution: {integrity: sha512-pcDZtkx9z8XYV+ius2P3Ot2VVrcYOfXffBQUBuiszrlUzKSmoDYqo+mV+IoL8iIiIjjtOMvNSmH1hwJ+Q+f96Q==} + '@types/node@16.18.126': + resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} '@types/picomatch@3.0.1': resolution: {integrity: sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==} - '@types/semver@7.5.7': - resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} - '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - '@vitest/expect@2.1.1': - resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + '@vitest/expect@2.1.9': + resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} - '@vitest/mocker@2.1.1': - resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + '@vitest/mocker@2.1.9': + resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} peerDependencies: - '@vitest/spy': 2.1.1 - msw: ^2.3.5 + msw: ^2.4.9 vite: ^5.0.0 peerDependenciesMeta: msw: @@ -656,20 +1041,25 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.1': - resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + '@vitest/pretty-format@2.1.9': + resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + + '@vitest/runner@2.1.9': + resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} - '@vitest/runner@2.1.1': - resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + '@vitest/snapshot@2.1.9': + resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} - '@vitest/snapshot@2.1.1': - resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@vitest/spy@2.1.9': + resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} - '@vitest/spy@2.1.1': - resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@vitest/utils@2.1.9': + resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - '@vitest/utils@2.1.1': - resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -679,28 +1069,15 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -709,26 +1086,16 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - bundle-require@5.0.0: - resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: esbuild: '>=0.18' @@ -737,60 +1104,49 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} - engines: {node: '>=12'} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} changesets-changelog-clean@1.3.0: resolution: {integrity: sha512-3bGEYg+SuzS4TizAVwGxkiV+c/IMQI7+JPnrEApbvGeb5//c2cfcLG9pteNqpySVY6BNkpCFMM4dpZucnCPxtQ==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} clipanion@3.2.1: resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} peerDependencies: typanion: '*' - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - consola@3.2.3: - resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} - engines: {node: ^14.18.0 || >=16.10.0} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -810,26 +1166,20 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} engines: {node: '>=18'} hasBin: true @@ -841,43 +1191,39 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fdir@6.4.0: - resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} @@ -892,24 +1238,18 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -918,37 +1258,26 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -957,10 +1286,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -972,23 +1297,23 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -1002,55 +1327,30 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} - - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - memfs@4.12.0: - resolution: {integrity: sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==} - engines: {node: '>= 4.0.0'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + memfs@4.57.2: + resolution: {integrity: sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==} + peerDependencies: + tslib: '2' merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -1062,8 +1362,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1076,29 +1376,32 @@ packages: encoding: optional: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + oxfmt@0.48.0: + resolution: {integrity: sha512-AVaLh+7XeGx+R1zfFV+f6VV61nT2MWVJXVUDhbTm5LBWGyNt64xAyh3NYYyjeY2WykNt9AvqSQLPHcbWquYF9g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint-tsgolint@0.22.1: + resolution: {integrity: sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg==} + hasBin: true + + oxlint@1.63.0: + resolution: {integrity: sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -1119,8 +1422,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-manager-detector@0.2.0: - resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} @@ -1134,10 +1437,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1145,29 +1444,35 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -1186,44 +1491,25 @@ packages: yaml: optional: true - postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} - prettier-plugin-organize-imports@4.1.0: - resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==} - peerDependencies: - prettier: '>=2.0' - typescript: '>=2.9' - vue-tsc: ^2.1.0 - peerDependenciesMeta: - vue-tsc: - optional: true - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} - pretty-ms@9.1.0: - resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1232,12 +1518,9 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} @@ -1246,12 +1529,12 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.23.0: - resolution: {integrity: sha512-vXB4IT9/KLDrS2WRXmY22sVB2wTsTwkpxjB8Q3mnakTENcYw3FRmfdYDy/acNmls+lHmDazgrRjK/yQ6hQAtwA==} + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1261,23 +1544,15 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} engines: {node: '>=10'} hasBin: true - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -1285,9 +1560,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1296,16 +1568,16 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -1313,35 +1585,19 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true @@ -1360,8 +1616,8 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + thingies@2.6.0: + resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 @@ -1369,17 +1625,21 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.9: - resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinypool@1.0.1: - resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} @@ -1388,10 +1648,6 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1399,11 +1655,8 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-dump@1.0.2: - resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -1415,11 +1668,11 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.3.0: - resolution: {integrity: sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1437,8 +1690,8 @@ packages: typescript: optional: true - tsx@4.19.1: - resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true @@ -1450,17 +1703,20 @@ packages: engines: {node: '>=14.17'} hasBin: true + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - vite-node@2.1.1: - resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} + vite-node@2.1.9: + resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.1.3: - resolution: {integrity: sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==} + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1468,6 +1724,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -1480,6 +1737,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -1487,15 +1746,15 @@ packages: terser: optional: true - vitest@2.1.1: - resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} + vitest@2.1.9: + resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.1 - '@vitest/ui': 2.1.1 + '@vitest/browser': 2.1.9 + '@vitest/ui': 2.1.9 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1515,19 +1774,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1538,68 +1787,17 @@ packages: engines: {node: '>=8'} hasBin: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - snapshots: - '@babel/runtime@7.23.9': - dependencies: - regenerator-runtime: 0.14.1 - - '@biomejs/biome@1.9.3': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.3 - '@biomejs/cli-darwin-x64': 1.9.3 - '@biomejs/cli-linux-arm64': 1.9.3 - '@biomejs/cli-linux-arm64-musl': 1.9.3 - '@biomejs/cli-linux-x64': 1.9.3 - '@biomejs/cli-linux-x64-musl': 1.9.3 - '@biomejs/cli-win32-arm64': 1.9.3 - '@biomejs/cli-win32-x64': 1.9.3 - - '@biomejs/cli-darwin-arm64@1.9.3': - optional: true - - '@biomejs/cli-darwin-x64@1.9.3': - optional: true - - '@biomejs/cli-linux-arm64-musl@1.9.3': - optional: true - - '@biomejs/cli-linux-arm64@1.9.3': - optional: true - - '@biomejs/cli-linux-x64-musl@1.9.3': - optional: true - - '@biomejs/cli-linux-x64@1.9.3': - optional: true + '@babel/runtime@7.29.2': {} - '@biomejs/cli-win32-arm64@1.9.3': - optional: true - - '@biomejs/cli-win32-x64@1.9.3': - optional: true - - '@changesets/apply-release-plan@7.0.5': + '@changesets/apply-release-plan@7.1.1': dependencies: - '@changesets/config': 3.0.3 + '@changesets/config': 3.1.4 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.1 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -1607,74 +1805,73 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.0 + semver: 7.8.0 - '@changesets/assemble-release-plan@6.0.4': + '@changesets/assemble-release-plan@6.0.10': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.0 + semver: 7.8.0 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/cli@2.27.8': + '@changesets/cli@2.31.0(@types/node@16.18.126)': dependencies: - '@changesets/apply-release-plan': 7.0.5 - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.3 + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.4 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.4 - '@changesets/git': 3.0.1 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@16.18.126) '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.7 ansi-colors: 4.1.3 - ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 - outdent: 0.5.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.0 - picocolors: 1.1.0 + package-manager-detector: 0.2.11 + picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.6.0 - spawndamnit: 2.0.0 + semver: 7.8.0 + spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' - '@changesets/config@3.0.3': + '@changesets/config@3.1.4': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-dependents-graph': 2.1.4 '@changesets/logger': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.2': + '@changesets/get-dependents-graph@2.1.4': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.0 - semver: 7.6.0 + picocolors: 1.1.1 + semver: 7.8.0 '@changesets/get-github-info@0.6.0': dependencies: @@ -1683,262 +1880,372 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.4': + '@changesets/get-release-plan@4.0.16': dependencies: - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/config': 3.0.3 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.7 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.1': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 '@changesets/logger@0.1.1': dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.3': dependencies: - '@changesets/types': 6.0.0 - js-yaml: 3.14.1 + '@changesets/types': 6.1.0 + js-yaml: 4.1.1 - '@changesets/pre@2.0.1': + '@changesets/pre@2.0.2': dependencies: '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.1': + '@changesets/read@0.6.7': dependencies: - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + '@changesets/parse': 0.4.3 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.0 + picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.1': + '@changesets/should-skip-package@0.1.2': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.2': + '@changesets/write@0.4.0': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.3 prettier: 2.8.8 - '@esbuild/aix-ppc64@0.19.12': + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.27.7': optional: true - '@esbuild/aix-ppc64@0.23.1': + '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.19.12': + '@esbuild/android-arm64@0.27.7': optional: true - '@esbuild/android-arm64@0.23.1': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.19.12': + '@esbuild/android-arm@0.27.7': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.19.12': + '@esbuild/android-x64@0.27.7': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.19.12': + '@esbuild/darwin-arm64@0.27.7': optional: true - '@esbuild/darwin-arm64@0.23.1': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.19.12': + '@esbuild/darwin-x64@0.27.7': optional: true - '@esbuild/darwin-x64@0.23.1': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.19.12': + '@esbuild/freebsd-arm64@0.27.7': optional: true - '@esbuild/freebsd-arm64@0.23.1': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.19.12': + '@esbuild/freebsd-x64@0.27.7': optional: true - '@esbuild/freebsd-x64@0.23.1': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.19.12': + '@esbuild/linux-arm64@0.27.7': optional: true - '@esbuild/linux-arm64@0.23.1': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.19.12': + '@esbuild/linux-arm@0.27.7': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.19.12': + '@esbuild/linux-ia32@0.27.7': optional: true - '@esbuild/linux-ia32@0.23.1': + '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.19.12': + '@esbuild/linux-loong64@0.27.7': optional: true - '@esbuild/linux-loong64@0.23.1': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.19.12': + '@esbuild/linux-mips64el@0.27.7': optional: true - '@esbuild/linux-mips64el@0.23.1': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.19.12': + '@esbuild/linux-ppc64@0.27.7': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.19.12': + '@esbuild/linux-riscv64@0.27.7': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.19.12': + '@esbuild/linux-s390x@0.27.7': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.19.12': + '@esbuild/linux-x64@0.27.7': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/netbsd-arm64@0.27.7': optional: true - '@esbuild/netbsd-x64@0.19.12': + '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/netbsd-x64@0.27.7': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/openbsd-arm64@0.27.7': optional: true - '@esbuild/openbsd-x64@0.19.12': + '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openbsd-x64@0.27.7': optional: true - '@esbuild/sunos-x64@0.19.12': + '@esbuild/openharmony-arm64@0.27.7': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/sunos-x64@0.27.7': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.19.12': + '@esbuild/win32-arm64@0.27.7': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.19.12': + '@esbuild/win32-ia32@0.27.7': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-x64@0.21.5': optional: true - '@isaacs/cliui@8.0.2': + '@esbuild/win32-x64@0.27.7': + optional: true + + '@inquirer/external-editor@1.0.3(@types/node@16.18.126)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 16.18.126 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 - '@jridgewell/trace-mapping@0.3.22': + '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.57.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/base64@1.1.2(tslib@2.7.0)': + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': dependencies: - tslib: 2.7.0 + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.1.0(tslib@2.7.0)': + '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.7.0) - '@jsonjoy.com/util': 1.3.0(tslib@2.7.0) + '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.7.0) - tslib: 2.7.0 + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/util@1.3.0(tslib@2.7.0)': + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: - tslib: 2.7.0 + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.29.2 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.23.9 + '@babel/runtime': 7.29.2 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -1955,221 +2262,340 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.20.1 + + '@oxfmt/binding-android-arm-eabi@0.48.0': + optional: true + + '@oxfmt/binding-android-arm64@0.48.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.48.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.48.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.48.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.48.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.48.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.48.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.48.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.48.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.48.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.48.0': + optional: true + + '@oxlint-tsgolint/darwin-arm64@0.22.1': + optional: true + + '@oxlint-tsgolint/darwin-x64@0.22.1': + optional: true + + '@oxlint-tsgolint/linux-arm64@0.22.1': + optional: true + + '@oxlint-tsgolint/linux-x64@0.22.1': + optional: true + + '@oxlint-tsgolint/win32-arm64@0.22.1': + optional: true + + '@oxlint-tsgolint/win32-x64@0.22.1': + optional: true + + '@oxlint/binding-android-arm-eabi@1.63.0': + optional: true + + '@oxlint/binding-android-arm64@1.63.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.63.0': + optional: true + + '@oxlint/binding-darwin-x64@1.63.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.63.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.63.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.63.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.63.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.63.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.63.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.63.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.63.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.63.0': + optional: true - '@pkgjs/parseargs@0.11.0': + '@oxlint/binding-win32-x64-msvc@1.63.0': optional: true - '@rollup/rollup-android-arm-eabi@4.23.0': + '@rollup/rollup-android-arm-eabi@4.60.3': optional: true - '@rollup/rollup-android-arm64@4.23.0': + '@rollup/rollup-android-arm64@4.60.3': optional: true - '@rollup/rollup-darwin-arm64@4.23.0': + '@rollup/rollup-darwin-arm64@4.60.3': optional: true - '@rollup/rollup-darwin-x64@4.23.0': + '@rollup/rollup-darwin-x64@4.60.3': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.23.0': + '@rollup/rollup-freebsd-arm64@4.60.3': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.23.0': + '@rollup/rollup-freebsd-x64@4.60.3': optional: true - '@rollup/rollup-linux-arm64-gnu@4.23.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': optional: true - '@rollup/rollup-linux-arm64-musl@4.23.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.3': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.23.0': + '@rollup/rollup-linux-arm64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.23.0': + '@rollup/rollup-linux-arm64-musl@4.60.3': optional: true - '@rollup/rollup-linux-s390x-gnu@4.23.0': + '@rollup/rollup-linux-loong64-gnu@4.60.3': optional: true - '@rollup/rollup-linux-x64-gnu@4.23.0': + '@rollup/rollup-linux-loong64-musl@4.60.3': optional: true - '@rollup/rollup-linux-x64-musl@4.23.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.3': optional: true - '@rollup/rollup-win32-arm64-msvc@4.23.0': + '@rollup/rollup-linux-ppc64-musl@4.60.3': optional: true - '@rollup/rollup-win32-ia32-msvc@4.23.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.3': optional: true - '@rollup/rollup-win32-x64-msvc@4.23.0': + '@rollup/rollup-linux-riscv64-musl@4.60.3': optional: true - '@tsconfig/node14@14.1.2': {} + '@rollup/rollup-linux-s390x-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.3': + optional: true + + '@tsconfig/node14@14.1.8': {} - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} + + '@types/estree@1.0.9': {} '@types/mock-fs@4.13.4': dependencies: - '@types/node': 16.18.82 + '@types/node': 16.18.126 '@types/node@12.20.55': {} - '@types/node@16.18.82': {} + '@types/node@16.18.126': {} '@types/picomatch@3.0.1': {} - '@types/semver@7.5.7': {} - '@types/supports-color@8.1.3': {} - '@vitest/expect@2.1.1': + '@vitest/expect@2.1.9': dependencies: - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 - chai: 5.1.1 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.1.3(@types/node@16.18.82))': + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@16.18.126))': dependencies: - '@vitest/spy': 2.1.1 + '@vitest/spy': 2.1.9 estree-walker: 3.0.3 - magic-string: 0.30.11 + magic-string: 0.30.21 optionalDependencies: - vite: 5.1.3(@types/node@16.18.82) + vite: 5.4.21(@types/node@16.18.126) - '@vitest/pretty-format@2.1.1': + '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.1': + '@vitest/runner@2.1.9': dependencies: - '@vitest/utils': 2.1.1 + '@vitest/utils': 2.1.9 pathe: 1.1.2 - '@vitest/snapshot@2.1.1': + '@vitest/snapshot@2.1.9': dependencies: - '@vitest/pretty-format': 2.1.1 - magic-string: 0.30.11 + '@vitest/pretty-format': 2.1.9 + magic-string: 0.30.21 pathe: 1.1.2 - '@vitest/spy@2.1.1': + '@vitest/spy@2.1.9': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.1': + '@vitest/utils@2.1.9': dependencies: - '@vitest/pretty-format': 2.1.1 - loupe: 3.1.1 + '@vitest/pretty-format': 2.1.9 + loupe: 3.2.1 tinyrainbow: 1.2.0 + acorn@8.16.0: {} + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 + argparse@2.0.1: {} + array-union@2.1.0: {} assertion-error@2.0.1: {} - balanced-match@1.0.2: {} - better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - binary-extensions@2.2.0: {} - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 - bundle-require@5.0.0(esbuild@0.23.1): + bundle-require@5.1.0(esbuild@0.27.7): dependencies: - esbuild: 0.23.1 + esbuild: 0.27.7 load-tsconfig: 0.2.5 cac@6.7.14: {} - chai@5.1.1: + chai@5.3.3: dependencies: assertion-error: 2.0.1 - check-error: 2.1.1 + check-error: 2.1.3 deep-eql: 5.0.2 - loupe: 3.1.1 - pathval: 2.0.0 + loupe: 3.2.1 + pathval: 2.0.1 changesets-changelog-clean@1.3.0: dependencies: '@changesets/get-github-info': 0.6.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 transitivePeerDependencies: - encoding - chardet@0.7.0: {} + chardet@2.1.1: {} - check-error@2.1.1: {} + check-error@2.1.3: {} - chokidar@3.6.0: + chokidar@4.0.3: dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - ci-info@3.9.0: {} + readdirp: 4.1.2 clipanion@3.2.1(typanion@3.14.0): dependencies: typanion: 3.14.0 - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - commander@4.1.1: {} - consola@3.2.3: {} + confbox@0.1.8: {} - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + consola@3.4.2: {} - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -2177,7 +2603,7 @@ snapshots: dataloader@1.4.0: {} - debug@4.3.7(supports-color@9.4.0): + debug@4.4.3(supports-color@9.4.0): dependencies: ms: 2.1.3 optionalDependencies: @@ -2191,113 +2617,95 @@ snapshots: dependencies: path-type: 4.0.0 - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - esbuild@0.19.12: + es-module-lexer@1.7.0: {} + + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - esbuild@0.23.1: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.27.7: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 esprima@4.0.1: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.9 - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 + expect-type@1.3.0: {} extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 - fastq@1.17.1: + fastq@1.20.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fdir@6.4.0(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.4 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2306,10 +2714,11 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - foreground-child@3.1.1: + fix-dts-default-cjs-exports@1.0.1: dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 + magic-string: 0.30.21 + mlly: 1.8.2 + rollup: 4.60.3 fs-extra@7.0.1: dependencies: @@ -2326,11 +2735,7 @@ snapshots: fsevents@2.3.3: optional: true - get-func-name@2.0.2: {} - - get-stream@6.0.1: {} - - get-tsconfig@4.8.1: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -2338,53 +2743,39 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: + glob-to-regex.js@1.2.0(tslib@2.8.1): dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + tslib: 2.8.1 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 graceful-fs@4.2.11: {} - human-id@1.0.2: {} - - human-signals@2.1.0: {} + human-id@4.1.3: {} hyperdyperid@1.2.0: {} - iconv-lite@0.4.24: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 - ignore@5.3.1: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 + ignore@5.3.2: {} is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-number@7.0.0: {} - is-stream@2.0.1: {} - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -2393,24 +2784,22 @@ snapshots: isexe@2.0.0: {} - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - joycon@3.1.1: {} - js-yaml@3.14.1: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - lilconfig@3.1.2: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -2420,52 +2809,44 @@ snapshots: dependencies: p-locate: 4.1.0 - lodash.sortby@4.7.0: {} - lodash.startcase@4.4.0: {} - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 - - lru-cache@10.2.0: {} + loupe@3.2.1: {} - lru-cache@4.1.5: + magic-string@0.30.21: dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - lru-cache@6.0.0: + memfs@4.57.2(tslib@2.8.1): dependencies: - yallist: 4.0.0 - - magic-string@0.30.11: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - memfs@4.12.0: - dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.7.0) - '@jsonjoy.com/util': 1.3.0(tslib@2.7.0) - tree-dump: 1.0.2(tslib@2.7.0) - tslib: 2.7.0 - - merge-stream@2.0.0: {} + '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 merge2@1.4.1: {} - micromatch@4.0.5: + micromatch@4.0.8: dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - mimic-fn@2.1.0: {} + braces: 3.0.3 + picomatch: 2.3.2 - minimatch@9.0.3: + mlly@1.8.2: dependencies: - brace-expansion: 2.0.1 - - minipass@7.0.4: {} + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 mri@1.2.0: {} @@ -2477,28 +2858,72 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.12: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - object-assign@4.1.1: {} - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - os-tmpdir@1.0.2: {} - outdent@0.5.0: {} + oxfmt@0.48.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.48.0 + '@oxfmt/binding-android-arm64': 0.48.0 + '@oxfmt/binding-darwin-arm64': 0.48.0 + '@oxfmt/binding-darwin-x64': 0.48.0 + '@oxfmt/binding-freebsd-x64': 0.48.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.48.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.48.0 + '@oxfmt/binding-linux-arm64-gnu': 0.48.0 + '@oxfmt/binding-linux-arm64-musl': 0.48.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.48.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.48.0 + '@oxfmt/binding-linux-riscv64-musl': 0.48.0 + '@oxfmt/binding-linux-s390x-gnu': 0.48.0 + '@oxfmt/binding-linux-x64-gnu': 0.48.0 + '@oxfmt/binding-linux-x64-musl': 0.48.0 + '@oxfmt/binding-openharmony-arm64': 0.48.0 + '@oxfmt/binding-win32-arm64-msvc': 0.48.0 + '@oxfmt/binding-win32-ia32-msvc': 0.48.0 + '@oxfmt/binding-win32-x64-msvc': 0.48.0 + + oxlint-tsgolint@0.22.1: + optionalDependencies: + '@oxlint-tsgolint/darwin-arm64': 0.22.1 + '@oxlint-tsgolint/darwin-x64': 0.22.1 + '@oxlint-tsgolint/linux-arm64': 0.22.1 + '@oxlint-tsgolint/linux-x64': 0.22.1 + '@oxlint-tsgolint/win32-arm64': 0.22.1 + '@oxlint-tsgolint/win32-x64': 0.22.1 + + oxlint@1.63.0(oxlint-tsgolint@0.22.1): + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.63.0 + '@oxlint/binding-android-arm64': 1.63.0 + '@oxlint/binding-darwin-arm64': 1.63.0 + '@oxlint/binding-darwin-x64': 1.63.0 + '@oxlint/binding-freebsd-x64': 1.63.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.63.0 + '@oxlint/binding-linux-arm-musleabihf': 1.63.0 + '@oxlint/binding-linux-arm64-gnu': 1.63.0 + '@oxlint/binding-linux-arm64-musl': 1.63.0 + '@oxlint/binding-linux-ppc64-gnu': 1.63.0 + '@oxlint/binding-linux-riscv64-gnu': 1.63.0 + '@oxlint/binding-linux-riscv64-musl': 1.63.0 + '@oxlint/binding-linux-s390x-gnu': 1.63.0 + '@oxlint/binding-linux-x64-gnu': 1.63.0 + '@oxlint/binding-linux-x64-musl': 1.63.0 + '@oxlint/binding-openharmony-arm64': 1.63.0 + '@oxlint/binding-win32-arm64-msvc': 1.63.0 + '@oxlint/binding-win32-ia32-msvc': 1.63.0 + '@oxlint/binding-win32-x64-msvc': 1.63.0 + oxlint-tsgolint: 0.22.1 + p-filter@2.1.0: dependencies: p-map: 2.1.0 @@ -2515,7 +2940,9 @@ snapshots: p-try@2.2.0: {} - package-manager-detector@0.2.0: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.11 parse-ms@4.0.0: {} @@ -2523,100 +2950,99 @@ snapshots: path-key@3.1.1: {} - path-scurry@1.10.1: - dependencies: - lru-cache: 10.2.0 - minipass: 7.0.4 - path-type@4.0.0: {} pathe@1.1.2: {} - pathval@2.0.0: {} + pathe@2.0.3: {} - picocolors@1.1.0: {} + pathval@2.0.1: {} - picomatch@2.3.1: {} + picocolors@1.1.1: {} - picomatch@4.0.2: {} + picomatch@2.3.2: {} + + picomatch@4.0.4: {} pify@4.0.1: {} - pirates@4.0.6: {} + pirates@4.0.7: {} - postcss-load-config@6.0.1(postcss@8.4.35)(tsx@4.19.1): + pkg-types@1.3.1: dependencies: - lilconfig: 3.1.2 - optionalDependencies: - postcss: 8.4.35 - tsx: 4.19.1 + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 - postcss@8.4.35: + postcss-load-config@6.0.1(postcss@8.5.14)(tsx@4.21.0): dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.0.2 + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.14 + tsx: 4.21.0 - prettier-plugin-organize-imports@4.1.0(prettier@3.3.3)(typescript@5.6.2): + postcss@8.5.14: dependencies: - prettier: 3.3.3 - typescript: 5.6.2 + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 prettier@2.8.8: {} - prettier@3.3.3: {} - pretty-bytes@6.1.1: {} - pretty-ms@9.1.0: + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 - pseudomap@1.0.2: {} - - punycode@2.3.1: {} + quansync@0.2.11: {} queue-microtask@1.2.3: {} read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.14.2 pify: 4.0.1 strip-bom: 3.0.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} + readdirp@4.1.2: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} - rollup@4.23.0: + rollup@4.60.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.23.0 - '@rollup/rollup-android-arm64': 4.23.0 - '@rollup/rollup-darwin-arm64': 4.23.0 - '@rollup/rollup-darwin-x64': 4.23.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.23.0 - '@rollup/rollup-linux-arm-musleabihf': 4.23.0 - '@rollup/rollup-linux-arm64-gnu': 4.23.0 - '@rollup/rollup-linux-arm64-musl': 4.23.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.23.0 - '@rollup/rollup-linux-riscv64-gnu': 4.23.0 - '@rollup/rollup-linux-s390x-gnu': 4.23.0 - '@rollup/rollup-linux-x64-gnu': 4.23.0 - '@rollup/rollup-linux-x64-musl': 4.23.0 - '@rollup/rollup-win32-arm64-msvc': 4.23.0 - '@rollup/rollup-win32-ia32-msvc': 4.23.0 - '@rollup/rollup-win32-x64-msvc': 4.23.0 + '@rollup/rollup-android-arm-eabi': 4.60.3 + '@rollup/rollup-android-arm64': 4.60.3 + '@rollup/rollup-darwin-arm64': 4.60.3 + '@rollup/rollup-darwin-x64': 4.60.3 + '@rollup/rollup-freebsd-arm64': 4.60.3 + '@rollup/rollup-freebsd-x64': 4.60.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 + '@rollup/rollup-linux-arm-musleabihf': 4.60.3 + '@rollup/rollup-linux-arm64-gnu': 4.60.3 + '@rollup/rollup-linux-arm64-musl': 4.60.3 + '@rollup/rollup-linux-loong64-gnu': 4.60.3 + '@rollup/rollup-linux-loong64-musl': 4.60.3 + '@rollup/rollup-linux-ppc64-gnu': 4.60.3 + '@rollup/rollup-linux-ppc64-musl': 4.60.3 + '@rollup/rollup-linux-riscv64-gnu': 4.60.3 + '@rollup/rollup-linux-riscv64-musl': 4.60.3 + '@rollup/rollup-linux-s390x-gnu': 4.60.3 + '@rollup/rollup-linux-x64-gnu': 4.60.3 + '@rollup/rollup-linux-x64-musl': 4.60.3 + '@rollup/rollup-openbsd-x64': 4.60.3 + '@rollup/rollup-openharmony-arm64': 4.60.3 + '@rollup/rollup-win32-arm64-msvc': 4.60.3 + '@rollup/rollup-win32-ia32-msvc': 4.60.3 + '@rollup/rollup-win32-x64-gnu': 4.60.3 + '@rollup/rollup-win32-x64-msvc': 4.60.3 fsevents: 2.3.3 run-parallel@1.2.0: @@ -2625,79 +3051,49 @@ snapshots: safer-buffer@2.1.2: {} - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 + semver@7.8.0: {} shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} slash@3.0.0: {} - source-map-js@1.0.2: {} + source-map-js@1.2.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.7.6: {} - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 + cross-spawn: 7.0.6 + signal-exit: 4.1.0 sprintf-js@1.0.3: {} stackback@0.0.2: {} - std-env@3.7.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + std-env@3.10.0: {} strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - strip-bom@3.0.0: {} - strip-final-newline@2.0.0: {} - - sucrase@3.35.0: + sucrase@3.35.1: dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 - glob: 10.3.10 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 + tinyglobby: 0.2.16 ts-interface-checker: 0.1.13 supports-color@9.4.0: {} @@ -2712,69 +3108,64 @@ snapshots: dependencies: any-promise: 1.3.0 - thingies@1.21.0(tslib@2.7.0): + thingies@2.6.0(tslib@2.8.1): dependencies: - tslib: 2.7.0 + tslib: 2.8.1 tinybench@2.9.0: {} - tinyexec@0.3.0: {} + tinyexec@0.3.2: {} - tinyglobby@0.2.9: + tinyglobby@0.2.16: dependencies: - fdir: 6.4.0(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinypool@1.1.1: {} - tinypool@1.0.1: {} + tinypool@2.1.0: {} tinyrainbow@1.2.0: {} tinyspy@3.0.2: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 tr46@0.0.3: {} - tr46@1.0.1: + tree-dump@1.1.0(tslib@2.8.1): dependencies: - punycode: 2.3.1 - - tree-dump@1.0.2(tslib@2.7.0): - dependencies: - tslib: 2.7.0 + tslib: 2.8.1 tree-kill@1.2.2: {} ts-interface-checker@0.1.13: {} - tslib@2.7.0: {} + tslib@2.8.1: {} - tsup@8.3.0(postcss@8.4.35)(supports-color@9.4.0)(tsx@4.19.1)(typescript@5.6.2): + tsup@8.5.1(postcss@8.5.14)(supports-color@9.4.0)(tsx@4.21.0)(typescript@5.6.2): dependencies: - bundle-require: 5.0.0(esbuild@0.23.1) + bundle-require: 5.1.0(esbuild@0.27.7) cac: 6.7.14 - chokidar: 3.6.0 - consola: 3.2.3 - debug: 4.3.7(supports-color@9.4.0) - esbuild: 0.23.1 - execa: 5.1.1 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3(supports-color@9.4.0) + esbuild: 0.27.7 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 - picocolors: 1.1.0 - postcss-load-config: 6.0.1(postcss@8.4.35)(tsx@4.19.1) + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.14)(tsx@4.21.0) resolve-from: 5.0.0 - rollup: 4.23.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 - tinyglobby: 0.2.9 + rollup: 4.60.3 + source-map: 0.7.6 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.16 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.35 + postcss: 8.5.14 typescript: 5.6.2 transitivePeerDependencies: - jiti @@ -2782,10 +3173,10 @@ snapshots: - tsx - yaml - tsx@4.19.1: + tsx@4.21.0: dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.8.1 + esbuild: 0.27.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -2793,61 +3184,67 @@ snapshots: typescript@5.6.2: {} + ufo@1.6.4: {} + universalify@0.1.2: {} - vite-node@2.1.1(@types/node@16.18.82)(supports-color@9.4.0): + vite-node@2.1.9(@types/node@16.18.126)(supports-color@9.4.0): dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@9.4.0) + debug: 4.4.3(supports-color@9.4.0) + es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.1.3(@types/node@16.18.82) + vite: 5.4.21(@types/node@16.18.126) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite@5.1.3(@types/node@16.18.82): + vite@5.4.21(@types/node@16.18.126): dependencies: - esbuild: 0.19.12 - postcss: 8.4.35 - rollup: 4.23.0 + esbuild: 0.21.5 + postcss: 8.5.14 + rollup: 4.60.3 optionalDependencies: - '@types/node': 16.18.82 + '@types/node': 16.18.126 fsevents: 2.3.3 - vitest@2.1.1(@types/node@16.18.82)(supports-color@9.4.0): - dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.1.3(@types/node@16.18.82)) - '@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.7(supports-color@9.4.0) - magic-string: 0.30.11 + vitest@2.1.9(@types/node@16.18.126)(supports-color@9.4.0): + dependencies: + '@vitest/expect': 2.1.9 + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@16.18.126)) + '@vitest/pretty-format': 2.1.9 + '@vitest/runner': 2.1.9 + '@vitest/snapshot': 2.1.9 + '@vitest/spy': 2.1.9 + '@vitest/utils': 2.1.9 + chai: 5.3.3 + debug: 4.4.3(supports-color@9.4.0) + expect-type: 1.3.0 + magic-string: 0.30.21 pathe: 1.1.2 - std-env: 3.7.0 + std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.0 - tinypool: 1.0.1 + tinyexec: 0.3.2 + tinypool: 1.1.1 tinyrainbow: 1.2.0 - vite: 5.1.3(@types/node@16.18.82) - vite-node: 2.1.1(@types/node@16.18.82)(supports-color@9.4.0) + vite: 5.4.21(@types/node@16.18.126) + vite-node: 2.1.9(@types/node@16.18.126)(supports-color@9.4.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 16.18.82 + '@types/node': 16.18.126 transitivePeerDependencies: - less - lightningcss - msw - sass + - sass-embedded - stylus - sugarss - supports-color @@ -2855,23 +3252,11 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@4.0.2: {} - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -2880,19 +3265,3 @@ snapshots: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - yallist@2.1.2: {} - - yallist@4.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..0477e6b --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,8 @@ +allowBuilds: + esbuild: set this to true or false + +engineStrict: true + +nodeVersion: '24.13.0' + +savePrefix: '' From 5ef9e17d66329022f4c25d6b9baec36e08e21edf Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 16:10:03 +0200 Subject: [PATCH 09/63] chore(vscode): update settings --- .vscode/settings.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ba1189c..43cfe58 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,6 @@ { // Make VSCode warn about same commit lengths for everyone - "git.inputValidation": "warn", + "git.inputValidation": true, "git.inputValidationLength": 100, "git.inputValidationSubjectLength": 72, @@ -30,19 +30,19 @@ // Ensure we use the same formatter for files "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[markdown]": { - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "oxc.oxc-vscode", "files.trimTrailingWhitespace": false // Markdown uses trailing whitespace for line breaks }, From ac6de030f64469d64916c7b64fbff5b81721c047 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 16:30:34 +0200 Subject: [PATCH 10/63] feat(esm): build only ESM, replace tsup with tsdown --- .changeset/green-foxes-see.md | 5 +++++ package.json | 23 ++++++++--------------- tsup.config.ts => tsdown.config.ts | 9 ++++----- 3 files changed, 17 insertions(+), 20 deletions(-) create mode 100644 .changeset/green-foxes-see.md rename tsup.config.ts => tsdown.config.ts (52%) diff --git a/.changeset/green-foxes-see.md b/.changeset/green-foxes-see.md new file mode 100644 index 0000000..4450225 --- /dev/null +++ b/.changeset/green-foxes-see.md @@ -0,0 +1,5 @@ +--- +'clean-modules': major +--- + +**BREAKING** Package is now ESM only. CLI usage is the same as before, but breaks CJS usage of the programmatic API. diff --git a/package.json b/package.json index 12a5c50..17f479e 100644 --- a/package.json +++ b/package.json @@ -29,25 +29,18 @@ ], "type": "module", "sideEffects": false, - "main": "dist/index.cjs", - "module": "dist/index.js", - "types": "dist/index.d.ts", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "exports": { ".": { - "import": { - "types": "./dist/index.d.ts", - "default": "./dist/index.js" - }, - "require": { - "types": "./dist/index.d.cts", - "default": "./dist/index.cjs" - } + "types": "./dist/index.d.ts", + "default": "./dist/index.js" } }, "scripts": { - "cli": "tsx src/cli/cli.ts", - "build": "tsup", - "dev": "tsc --watch", + "cli": "node bin/cli.js", + "build": "tsdown", + "dev": "tsdown --sourcemap true --watch", "test": "vitest", "prepublishOnly": "pnpm build", "stylecheck": "oxfmt --check src && oxlint src", @@ -77,7 +70,7 @@ "oxlint": "^1.63.0", "oxlint-tsgolint": "^0.22.1", "tslib": "^2.7.0", - "tsup": "^8.3.0", + "tsdown": "^0.22.0", "tsx": "^4.19.1", "typescript": "5.6.2", "vitest": "^2.1.1" diff --git a/tsup.config.ts b/tsdown.config.ts similarity index 52% rename from tsup.config.ts rename to tsdown.config.ts index c16cba8..f4fd828 100644 --- a/tsup.config.ts +++ b/tsdown.config.ts @@ -1,13 +1,12 @@ -import { defineConfig } from 'tsup'; +import { defineConfig } from 'tsdown'; export default defineConfig({ - format: ['cjs', 'esm'], + format: ['esm'], entry: ['src/index.ts', 'src/cli/cli.ts'], outDir: 'dist', - target: 'node14', - splitting: true, + target: 'node22', + outExtensions: () => ({ js: '.js', dts: '.d.ts' }), sourcemap: false, clean: true, - shims: true, dts: true, }); From 6fd8cde1fe1db521062afb0f3c6ffec4a63e6cca Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 16:35:42 +0200 Subject: [PATCH 11/63] feat(node): upgrade minimum Node version to v22 BREAKING CHANGE --- .changeset/whole-cycles-tickle.md | 5 + package.json | 4 +- pnpm-lock.yaml | 745 ++++++++++++++++++++---------- src/analyze.ts | 2 +- src/utils/filesystem.test.ts | 4 +- src/utils/filesystem.ts | 5 +- tsconfig.json | 25 +- 7 files changed, 525 insertions(+), 265 deletions(-) create mode 100644 .changeset/whole-cycles-tickle.md diff --git a/.changeset/whole-cycles-tickle.md b/.changeset/whole-cycles-tickle.md new file mode 100644 index 0000000..b4ace7a --- /dev/null +++ b/.changeset/whole-cycles-tickle.md @@ -0,0 +1,5 @@ +--- +'clean-modules': major +--- + +**BREAKING** Minimum supported Node version is now v22. diff --git a/package.json b/package.json index 17f479e..8a94bb6 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "test": "vitest", "prepublishOnly": "pnpm build", "stylecheck": "oxfmt --check src && oxlint src", + "typecheck": "tsc --noEmit", "format": "oxfmt --write .", "lint": "oxlint .", "lint:fix": "oxlint --fix .", @@ -59,9 +60,8 @@ }, "devDependencies": { "@changesets/cli": "^2.27.8", - "@tsconfig/node14": "^14.1.2", "@types/mock-fs": "4.13.4", - "@types/node": "16", + "@types/node": "^22.19.18", "@types/picomatch": "3.0.1", "@types/supports-color": "8.1.3", "changesets-changelog-clean": "^1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1aae377..9e0e01a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,16 +26,13 @@ importers: devDependencies: '@changesets/cli': specifier: ^2.27.8 - version: 2.31.0(@types/node@16.18.126) - '@tsconfig/node14': - specifier: ^14.1.2 - version: 14.1.8 + version: 2.31.0(@types/node@22.19.18) '@types/mock-fs': specifier: 4.13.4 version: 4.13.4 '@types/node': - specifier: '16' - version: 16.18.126 + specifier: ^22.19.18 + version: 22.19.18 '@types/picomatch': specifier: 3.0.1 version: 3.0.1 @@ -57,12 +54,12 @@ importers: oxlint-tsgolint: specifier: ^0.22.1 version: 0.22.1 + tsdown: + specifier: ^0.22.0 + version: 0.22.0(tsx@4.21.0)(typescript@5.6.2) tslib: specifier: ^2.7.0 version: 2.8.1 - tsup: - specifier: ^8.3.0 - version: 8.5.1(postcss@8.5.14)(supports-color@9.4.0)(tsx@4.21.0)(typescript@5.6.2) tsx: specifier: ^4.19.1 version: 4.21.0 @@ -71,14 +68,35 @@ importers: version: 5.6.2 vitest: specifier: ^2.1.1 - version: 2.1.9(@types/node@16.18.126)(supports-color@9.4.0) + version: 2.1.9(@types/node@22.19.18)(supports-color@9.4.0) packages: + '@babel/generator@8.0.0-rc.4': + resolution: {integrity: sha512-YZ+FuIgkj7KrIb2a2X1XiY0QYgDxAbVbYP64SjwJzOK3euCsUerzenh2oqdsmKuPSlhzmFOOklnxzHAzXagvpw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-string-parser@8.0.0-rc.4': + resolution: {integrity: sha512-dluR3v287dp6YPF57kyKKrHPKffUeuxH1zQcF1WD30TeFzWXhDiVi1U6PkqaDB0++H1PeCwRhmYl4DvoerlPIw==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/helper-validator-identifier@8.0.0-rc.4': + resolution: {integrity: sha512-HTD3bskipk5MSm08twTW6832jzIXUhxMddy4NPPzIMuyMEsrs0ZgwAaMj5ubB5+6hMlUjDu17vNconEmwsmpYg==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@babel/parser@8.0.0-rc.4': + resolution: {integrity: sha512-0S/1yefMa15N4i2v3t8Fw9pgMHhf2gF6Lc1UEXI96Ls6FNAjqvHHZouZ2ZS/deqLhbMFtmfVeFac6iTsvFbLwA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} + '@babel/types@8.0.0-rc.4': + resolution: {integrity: sha512-bw30DV880P/VYtsjWWdoWmJpb9S2Vn1/PqayyccTELzRQ/HslIO7+BD9rNoZ4AAFOAjC1vrNeBCkAsyh6Ibfww==} + engines: {node: ^20.19.0 || >=22.12.0} + '@changesets/apply-release-plan@7.1.1': resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} @@ -137,6 +155,15 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -579,6 +606,12 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -591,6 +624,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} + '@oxfmt/binding-android-arm-eabi@0.48.0': resolution: {integrity: sha512-uwqk+/KhQvBIpULD8SMM/zAafMRC/+DV/xsEQjkkIsJ/kLmEI/2bxonVowcYTiXqqZ/a0FEW8DPkZY3VvwELDA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -865,6 +901,107 @@ packages: cpu: [x64] os: [win32] + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} + '@rollup/rollup-android-arm-eabi@4.60.3': resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} cpu: [arm] @@ -1003,8 +1140,8 @@ packages: cpu: [x64] os: [win32] - '@tsconfig/node14@14.1.8': - resolution: {integrity: sha512-SjGT+qPvh8Uhc849yNMD0ZIPr69AyB7Z46nMqhrI3gCVocd6mhI0jP4YE4onO/ufpmengRfTxNMpdpKEp2xRIg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1012,6 +1149,9 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/mock-fs@4.13.4': resolution: {integrity: sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg==} @@ -1021,6 +1161,9 @@ packages: '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} + '@types/node@22.19.18': + resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} + '@types/picomatch@3.0.1': resolution: {integrity: sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==} @@ -1056,11 +1199,6 @@ packages: '@vitest/utils@2.1.9': resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1069,8 +1207,9 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1086,24 +1225,29 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-kit@3.0.0-beta.1: + resolution: {integrity: sha512-trmleAnZ2PxN/loHWVhhx1qeOHSRXq4TDsBBxq3GqeJitfk3+jTQ+v/C1km/KYq9M7wKqCewMh+/NAvVH7m+bw==} + engines: {node: '>=20.19.0'} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} + birpc@4.0.0: + resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - bundle-require@5.1.0: - resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.18' - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -1118,26 +1262,11 @@ packages: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - clipanion@3.2.1: resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} peerDependencies: typanion: '*' - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1158,6 +1287,9 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1166,6 +1298,19 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -1222,9 +1367,6 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - fix-dts-default-cjs-exports@1.0.1: - resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1241,6 +1383,10 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-tsconfig@5.0.0-beta.5: + resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} + engines: {node: '>=20.20.0'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1258,6 +1404,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + human-id@4.1.3: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true @@ -1274,6 +1423,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + import-without-cache@0.4.0: + resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==} + engines: {node: ^22.18.0 || >=24.0.0} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1297,10 +1450,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - js-yaml@3.14.2: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true @@ -1309,20 +1458,14 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1349,9 +1492,6 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -1359,9 +1499,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1376,9 +1513,8 @@ packages: encoding: optional: true - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -1466,31 +1602,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - postcss@8.5.14: resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} @@ -1511,6 +1622,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1518,10 +1632,6 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -1533,6 +1643,30 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rolldown-plugin-dts@0.25.0: + resolution: {integrity: sha512-GE3uDZgUuA9l6g+1u928TRmadd5IVhaWiwpWast2kCyLv9tYJJCC6E5HHkV0HGmwC5ZL73xh12/PRZI+KZ2vdQ==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20260325.1' + rolldown: ^1.0.0 + typescript: ^6.0.0 + vue-tsc: ~3.2.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.60.3: resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -1572,10 +1706,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1596,11 +1726,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - supports-color@9.4.0: resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} engines: {node: '>=12'} @@ -1609,13 +1734,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thingies@2.6.0: resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} engines: {node: '>=10.18'} @@ -1628,6 +1746,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} @@ -1665,30 +1787,42 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsup@8.5.1: - resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} - engines: {node: '>=18'} + tsdown@0.22.0: + resolution: {integrity: sha512-FgW0hHb27nGQA/+F3d5+U9wKXkfilk9DVkc5+7x/ZqF03g+Hoz/eeApT32jqxATt9eRoR+1jxk7MUMON+O4CXw==} + engines: {node: ^22.18.0 || >=24.0.0} hasBin: true peerDependencies: - '@microsoft/api-extractor': ^7.36.0 - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: '>=4.5.0' + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.22.0 + '@tsdown/exe': 0.22.0 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 + unplugin-unused: ^0.5.0 + unrun: '*' peerDependenciesMeta: - '@microsoft/api-extractor': + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': optional: true - '@swc/core': + publint: optional: true - postcss: + tsx: optional: true typescript: optional: true + unplugin-unused: + optional: true + unrun: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} @@ -1703,8 +1837,11 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.4: - resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -1789,8 +1926,30 @@ packages: snapshots: + '@babel/generator@8.0.0-rc.4': + dependencies: + '@babel/parser': 8.0.0-rc.4 + '@babel/types': 8.0.0-rc.4 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 + + '@babel/helper-string-parser@8.0.0-rc.4': {} + + '@babel/helper-validator-identifier@8.0.0-rc.4': {} + + '@babel/parser@8.0.0-rc.4': + dependencies: + '@babel/types': 8.0.0-rc.4 + '@babel/runtime@7.29.2': {} + '@babel/types@8.0.0-rc.4': + dependencies: + '@babel/helper-string-parser': 8.0.0-rc.4 + '@babel/helper-validator-identifier': 8.0.0-rc.4 + '@changesets/apply-release-plan@7.1.1': dependencies: '@changesets/config': 3.1.4 @@ -1820,7 +1979,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.31.0(@types/node@16.18.126)': + '@changesets/cli@2.31.0(@types/node@22.19.18)': dependencies: '@changesets/apply-release-plan': 7.1.1 '@changesets/assemble-release-plan': 6.0.10 @@ -1836,7 +1995,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@16.18.126) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.18) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 enquirer: 2.4.1 @@ -1941,6 +2100,22 @@ snapshots: human-id: 4.1.3 prettier: 2.8.8 + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -2088,12 +2263,12 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true - '@inquirer/external-editor@1.0.3(@types/node@16.18.126)': + '@inquirer/external-editor@1.0.3(@types/node@22.19.18)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 16.18.126 + '@types/node': 22.19.18 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -2252,6 +2427,13 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2264,6 +2446,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@oxc-project/types@0.129.0': {} + '@oxfmt/binding-android-arm-eabi@0.48.0': optional: true @@ -2396,6 +2580,61 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.63.0': optional: true + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.0.0': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0': + optional: true + + '@rolldown/pluginutils@1.0.0': {} + '@rollup/rollup-android-arm-eabi@4.60.3': optional: true @@ -2471,12 +2710,17 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.3': optional: true - '@tsconfig/node14@14.1.8': {} + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true '@types/estree@1.0.8': {} '@types/estree@1.0.9': {} + '@types/jsesc@2.5.1': {} + '@types/mock-fs@4.13.4': dependencies: '@types/node': 16.18.126 @@ -2485,6 +2729,10 @@ snapshots: '@types/node@16.18.126': {} + '@types/node@22.19.18': + dependencies: + undici-types: 6.21.0 + '@types/picomatch@3.0.1': {} '@types/supports-color@8.1.3': {} @@ -2496,13 +2744,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@16.18.126))': + '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.18))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@16.18.126) + vite: 5.4.21(@types/node@22.19.18) '@vitest/pretty-format@2.1.9': dependencies: @@ -2529,13 +2777,11 @@ snapshots: loupe: 3.2.1 tinyrainbow: 1.2.0 - acorn@8.16.0: {} - ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} - any-promise@1.3.0: {} + ansis@4.2.0: {} argparse@1.0.10: dependencies: @@ -2547,21 +2793,26 @@ snapshots: assertion-error@2.0.1: {} + ast-kit@3.0.0-beta.1: + dependencies: + '@babel/parser': 8.0.0-rc.4 + estree-walker: 3.0.3 + pathe: 2.0.3 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 + birpc@4.0.0: {} + braces@3.0.3: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.27.7): - dependencies: - esbuild: 0.27.7 - load-tsconfig: 0.2.5 - cac@6.7.14: {} + cac@7.0.0: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -2581,20 +2832,10 @@ snapshots: check-error@2.1.3: {} - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - clipanion@3.2.1(typanion@3.14.0): dependencies: typanion: 3.14.0 - commander@4.1.1: {} - - confbox@0.1.8: {} - - consola@3.4.2: {} - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2611,12 +2852,18 @@ snapshots: deep-eql@5.0.2: {} + defu@6.1.7: {} + detect-indent@6.1.0: {} dir-glob@3.0.1: dependencies: path-type: 4.0.0 + dts-resolver@3.0.0: {} + + empathic@2.0.1: {} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -2714,12 +2961,6 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - fix-dts-default-cjs-exports@1.0.1: - dependencies: - magic-string: 0.30.21 - mlly: 1.8.2 - rollup: 4.60.3 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -2739,6 +2980,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@5.0.0-beta.5: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2758,6 +3003,8 @@ snapshots: graceful-fs@4.2.11: {} + hookable@6.1.1: {} + human-id@4.1.3: {} hyperdyperid@1.2.0: {} @@ -2768,6 +3015,8 @@ snapshots: ignore@5.3.2: {} + import-without-cache@0.4.0: {} + is-extglob@2.1.1: {} is-glob@4.0.3: @@ -2784,8 +3033,6 @@ snapshots: isexe@2.0.0: {} - joycon@3.1.1: {} - js-yaml@3.14.2: dependencies: argparse: 1.0.10 @@ -2795,16 +3042,12 @@ snapshots: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - - load-tsconfig@0.2.5: {} - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -2841,30 +3084,17 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.4 - mri@1.2.0: {} ms@2.1.3: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.12: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - object-assign@4.1.1: {} + obug@2.1.1: {} outdent@0.5.0: {} @@ -2966,21 +3196,6 @@ snapshots: pify@4.0.1: {} - pirates@4.0.7: {} - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - - postcss-load-config@6.0.1(postcss@8.5.14)(tsx@4.21.0): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - postcss: 8.5.14 - tsx: 4.21.0 - postcss@8.5.14: dependencies: nanoid: 3.3.12 @@ -2997,6 +3212,8 @@ snapshots: quansync@0.2.11: {} + quansync@1.0.0: {} + queue-microtask@1.2.3: {} read-yaml-file@1.1.0: @@ -3006,14 +3223,49 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readdirp@4.1.2: {} - resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} reusify@1.1.0: {} + rolldown-plugin-dts@0.25.0(rolldown@1.0.0)(typescript@5.6.2): + dependencies: + '@babel/generator': 8.0.0-rc.4 + '@babel/helper-validator-identifier': 8.0.0-rc.4 + '@babel/parser': 8.0.0-rc.4 + ast-kit: 3.0.0-beta.1 + birpc: 4.0.0 + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.5 + obug: 2.1.1 + rolldown: 1.0.0 + optionalDependencies: + typescript: 5.6.2 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.0.0: + dependencies: + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 + rollup@4.60.3: dependencies: '@types/estree': 1.0.8 @@ -3067,8 +3319,6 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.7.6: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -3086,28 +3336,10 @@ snapshots: strip-bom@3.0.0: {} - sucrase@3.35.1: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - tinyglobby: 0.2.16 - ts-interface-checker: 0.1.13 - supports-color@9.4.0: {} term-size@2.2.1: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - thingies@2.6.0(tslib@2.8.1): dependencies: tslib: 2.8.1 @@ -3116,6 +3348,8 @@ snapshots: tinyexec@0.3.2: {} + tinyexec@1.1.2: {} + tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) @@ -3141,37 +3375,33 @@ snapshots: tree-kill@1.2.2: {} - ts-interface-checker@0.1.13: {} - - tslib@2.8.1: {} - - tsup@8.5.1(postcss@8.5.14)(supports-color@9.4.0)(tsx@4.21.0)(typescript@5.6.2): + tsdown@0.22.0(tsx@4.21.0)(typescript@5.6.2): dependencies: - bundle-require: 5.1.0(esbuild@0.27.7) - cac: 6.7.14 - chokidar: 4.0.3 - consola: 3.4.2 - debug: 4.4.3(supports-color@9.4.0) - esbuild: 0.27.7 - fix-dts-default-cjs-exports: 1.0.1 - joycon: 3.1.1 - picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.14)(tsx@4.21.0) - resolve-from: 5.0.0 - rollup: 4.60.3 - source-map: 0.7.6 - sucrase: 3.35.1 - tinyexec: 0.3.2 + ansis: 4.2.0 + cac: 7.0.0 + defu: 6.1.7 + empathic: 2.0.1 + hookable: 6.1.1 + import-without-cache: 0.4.0 + obug: 2.1.1 + picomatch: 4.0.4 + rolldown: 1.0.0 + rolldown-plugin-dts: 0.25.0(rolldown@1.0.0)(typescript@5.6.2) + semver: 7.8.0 + tinyexec: 1.1.2 tinyglobby: 0.2.16 tree-kill: 1.2.2 + unconfig-core: 7.5.0 optionalDependencies: - postcss: 8.5.14 + tsx: 4.21.0 typescript: 5.6.2 transitivePeerDependencies: - - jiti - - supports-color - - tsx - - yaml + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - vue-tsc + + tslib@2.8.1: {} tsx@4.21.0: dependencies: @@ -3184,17 +3414,22 @@ snapshots: typescript@5.6.2: {} - ufo@1.6.4: {} + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + undici-types@6.21.0: {} universalify@0.1.2: {} - vite-node@2.1.9(@types/node@16.18.126)(supports-color@9.4.0): + vite-node@2.1.9(@types/node@22.19.18)(supports-color@9.4.0): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@9.4.0) es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.21(@types/node@16.18.126) + vite: 5.4.21(@types/node@22.19.18) transitivePeerDependencies: - '@types/node' - less @@ -3206,19 +3441,19 @@ snapshots: - supports-color - terser - vite@5.4.21(@types/node@16.18.126): + vite@5.4.21(@types/node@22.19.18): dependencies: esbuild: 0.21.5 postcss: 8.5.14 rollup: 4.60.3 optionalDependencies: - '@types/node': 16.18.126 + '@types/node': 22.19.18 fsevents: 2.3.3 - vitest@2.1.9(@types/node@16.18.126)(supports-color@9.4.0): + vitest@2.1.9(@types/node@22.19.18)(supports-color@9.4.0): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@16.18.126)) + '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.18)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -3234,11 +3469,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@16.18.126) - vite-node: 2.1.9(@types/node@16.18.126)(supports-color@9.4.0) + vite: 5.4.21(@types/node@22.19.18) + vite-node: 2.1.9(@types/node@22.19.18)(supports-color@9.4.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 16.18.126 + '@types/node': 22.19.18 transitivePeerDependencies: - less - lightningcss diff --git a/src/analyze.ts b/src/analyze.ts index aae2902..0d40ef1 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -59,7 +59,7 @@ export async function analyze(options: AnalyzeOptions = {}): Promise { it('removes files at provided file paths', async () => { expect.hasAssertions(); - const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md']; + const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md'] as const; // files are initially there expect(fs.existsSync(filePaths[0])).toBe(true); @@ -340,7 +340,7 @@ describe(removeFiles, () => { it('does not remove files during dry runs', async () => { expect.hasAssertions(); - const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md']; + const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md'] as const; await removeFiles(filePaths, { dryRun: true }); diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index b66a147..7ff6566 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -159,7 +159,10 @@ export type RemoveFilesOptions = { * @param options dryRun: if true, don't actually remove the files * @returns the total size of the removed files */ -export async function removeFiles(filePaths: string[], options: RemoveFilesOptions = {}): Promise { +export async function removeFiles( + filePaths: string[] | readonly string[], + options: RemoveFilesOptions = {} +): Promise { let reducedSize = 0; await Promise.all( diff --git a/tsconfig.json b/tsconfig.json index 101a8af..70b0e00 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,31 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": ["@tsconfig/node14/tsconfig.json"], + "exclude": ["node_modules", "dist", ".history", "images"], "compilerOptions": { + "lib": ["esnext"], + "target": "esnext", + "module": "preserve", + "moduleResolution": "bundler", + "types": [], + "outDir": "dist", + "noEmit": true, + "tsBuildInfoFile": "./tsconfig.tsbuildinfo", + "incremental": true, + "strict": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "erasableSyntaxOnly": true, + "isolatedModules": true, + "resolveJsonModule": true, + "exactOptionalPropertyTypes": true, "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, "noImplicitReturns": true, - "noImplicitOverride": true + "noUncheckedIndexedAccess": true, + "noUncheckedSideEffectImports": true } } From db9ce693fd2fb57c1f44a8cf7a43bf92a78fd088 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 16:37:07 +0200 Subject: [PATCH 12/63] chore(deps): pin dev dependency versions --- package.json | 22 +- pnpm-lock.yaml | 739 ++++++++++++++++++++----------------------------- 2 files changed, 311 insertions(+), 450 deletions(-) diff --git a/package.json b/package.json index 8a94bb6..023f21a 100644 --- a/package.json +++ b/package.json @@ -59,21 +59,21 @@ "supports-color": "^9.4.0" }, "devDependencies": { - "@changesets/cli": "^2.27.8", + "@changesets/cli": "2.27.8", "@types/mock-fs": "4.13.4", - "@types/node": "^22.19.18", + "@types/node": "22.19.18", "@types/picomatch": "3.0.1", "@types/supports-color": "8.1.3", - "changesets-changelog-clean": "^1.3.0", - "memfs": "^4.12.0", - "oxfmt": "^0.48.0", - "oxlint": "^1.63.0", - "oxlint-tsgolint": "^0.22.1", - "tslib": "^2.7.0", - "tsdown": "^0.22.0", - "tsx": "^4.19.1", + "changesets-changelog-clean": "1.3.0", + "memfs": "4.12.0", + "oxfmt": "0.48.0", + "oxlint": "1.63.0", + "oxlint-tsgolint": "0.22.1", + "tslib": "2.7.0", + "tsdown": "0.22.0", + "tsx": "4.19.1", "typescript": "5.6.2", - "vitest": "^2.1.1" + "vitest": "2.1.1" }, "engines": { "node": ">=22" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e0e01a..cdf357d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,13 +25,13 @@ importers: version: 9.4.0 devDependencies: '@changesets/cli': - specifier: ^2.27.8 - version: 2.31.0(@types/node@22.19.18) + specifier: 2.27.8 + version: 2.27.8 '@types/mock-fs': specifier: 4.13.4 version: 4.13.4 '@types/node': - specifier: ^22.19.18 + specifier: 22.19.18 version: 22.19.18 '@types/picomatch': specifier: 3.0.1 @@ -40,35 +40,35 @@ importers: specifier: 8.1.3 version: 8.1.3 changesets-changelog-clean: - specifier: ^1.3.0 + specifier: 1.3.0 version: 1.3.0 memfs: - specifier: ^4.12.0 - version: 4.57.2(tslib@2.8.1) + specifier: 4.12.0 + version: 4.12.0 oxfmt: - specifier: ^0.48.0 + specifier: 0.48.0 version: 0.48.0 oxlint: - specifier: ^1.63.0 + specifier: 1.63.0 version: 1.63.0(oxlint-tsgolint@0.22.1) oxlint-tsgolint: - specifier: ^0.22.1 + specifier: 0.22.1 version: 0.22.1 tsdown: - specifier: ^0.22.0 - version: 0.22.0(tsx@4.21.0)(typescript@5.6.2) + specifier: 0.22.0 + version: 0.22.0(tsx@4.19.1)(typescript@5.6.2) tslib: - specifier: ^2.7.0 - version: 2.8.1 + specifier: 2.7.0 + version: 2.7.0 tsx: - specifier: ^4.19.1 - version: 4.21.0 + specifier: 4.19.1 + version: 4.19.1 typescript: specifier: 5.6.2 version: 5.6.2 vitest: - specifier: ^2.1.1 - version: 2.1.9(@types/node@22.19.18)(supports-color@9.4.0) + specifier: 2.1.1 + version: 2.1.1(@types/node@22.19.18)(supports-color@9.4.0) packages: @@ -106,8 +106,8 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.31.0': - resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} + '@changesets/cli@2.27.8': + resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} hasBin: true '@changesets/config@3.1.4': @@ -152,8 +152,8 @@ packages: '@changesets/types@6.1.0': resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -170,8 +170,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.7': - resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -182,8 +182,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.7': - resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -194,8 +194,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.7': - resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -206,8 +206,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.7': - resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -218,8 +218,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.7': - resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -230,8 +230,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.7': - resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -242,8 +242,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.7': - resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -254,8 +254,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.7': - resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -266,8 +266,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.7': - resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -278,8 +278,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.7': - resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -290,8 +290,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.7': - resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -302,8 +302,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.7': - resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -314,8 +314,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.7': - resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -326,8 +326,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.7': - resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -338,8 +338,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.7': - resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -350,8 +350,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.7': - resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -362,32 +362,26 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.7': - resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.7': - resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.7': - resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.7': - resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -398,26 +392,20 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.7': - resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.7': - resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.7': - resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -428,8 +416,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.7': - resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -440,8 +428,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.7': - resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -452,21 +440,12 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.7': - resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -486,120 +465,36 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/base64@17.67.0': - resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@jsonjoy.com/buffers@1.2.1': resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/buffers@17.67.0': - resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@jsonjoy.com/codegen@1.0.0': resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/codegen@17.67.0': - resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-core@4.57.2': - resolution: {integrity: sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-fsa@4.57.2': - resolution: {integrity: sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-builtins@4.57.2': - resolution: {integrity: sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-to-fsa@4.57.2': - resolution: {integrity: sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-utils@4.57.2': - resolution: {integrity: sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node@4.57.2': - resolution: {integrity: sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-print@4.57.2': - resolution: {integrity: sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-snapshot@4.57.2': - resolution: {integrity: sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@jsonjoy.com/json-pack@1.21.0': resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@17.67.0': - resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@jsonjoy.com/json-pointer@1.0.2': resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/json-pointer@17.67.0': - resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@jsonjoy.com/util@1.9.0': resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@17.67.0': - resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1158,25 +1053,26 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@16.18.126': - resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - '@types/node@22.19.18': resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} '@types/picomatch@3.0.1': resolution: {integrity: sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - '@vitest/expect@2.1.9': - resolution: {integrity: sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==} + '@vitest/expect@2.1.1': + resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - '@vitest/mocker@2.1.9': - resolution: {integrity: sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==} + '@vitest/mocker@2.1.1': + resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} peerDependencies: - msw: ^2.4.9 + '@vitest/spy': 2.1.1 + msw: ^2.3.5 vite: ^5.0.0 peerDependenciesMeta: msw: @@ -1184,20 +1080,23 @@ packages: vite: optional: true + '@vitest/pretty-format@2.1.1': + resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} + '@vitest/pretty-format@2.1.9': resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - '@vitest/runner@2.1.9': - resolution: {integrity: sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==} + '@vitest/runner@2.1.1': + resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} - '@vitest/snapshot@2.1.9': - resolution: {integrity: sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==} + '@vitest/snapshot@2.1.1': + resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} - '@vitest/spy@2.1.9': - resolution: {integrity: sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==} + '@vitest/spy@2.1.1': + resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} + '@vitest/utils@2.1.1': + resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -1255,18 +1154,25 @@ packages: changesets-changelog-clean@1.3.0: resolution: {integrity: sha512-3bGEYg+SuzS4TizAVwGxkiV+c/IMQI7+JPnrEApbvGeb5//c2cfcLG9pteNqpySVY6BNkpCFMM4dpZucnCPxtQ==} - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + clipanion@3.2.1: resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} peerDependencies: typanion: '*' + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1315,16 +1221,13 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - esbuild@0.27.7: - resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} engines: {node: '>=18'} hasBin: true @@ -1336,13 +1239,13 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -1391,12 +1294,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1407,16 +1304,15 @@ packages: hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} - human-id@4.1.3: - resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} - hasBin: true + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -1476,13 +1372,15 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - memfs@4.57.2: - resolution: {integrity: sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==} - peerDependencies: - tslib: '2' + memfs@4.12.0: + resolution: {integrity: sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==} + engines: {node: '>= 4.0.0'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1516,6 +1414,10 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -1619,6 +1521,9 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -1683,10 +1588,18 @@ packages: engines: {node: '>=10'} hasBin: true + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -1694,6 +1607,9 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1706,6 +1622,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1770,6 +1689,10 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1821,11 +1744,14 @@ packages: unrun: optional: true + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} engines: {node: '>=18.0.0'} hasBin: true @@ -1847,8 +1773,8 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - vite-node@2.1.9: - resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} + vite-node@2.1.1: + resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -1883,15 +1809,15 @@ packages: terser: optional: true - vitest@2.1.9: - resolution: {integrity: sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==} + vitest@2.1.1: + resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.9 - '@vitest/ui': 2.1.9 + '@vitest/browser': 2.1.1 + '@vitest/ui': 2.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1914,6 +1840,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1924,6 +1854,9 @@ packages: engines: {node: '>=8'} hasBin: true + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + snapshots: '@babel/generator@8.0.0-rc.4': @@ -1979,7 +1912,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.31.0(@types/node@22.19.18)': + '@changesets/cli@2.27.8': dependencies: '@changesets/apply-release-plan': 7.1.1 '@changesets/assemble-release-plan': 6.0.10 @@ -1994,21 +1927,23 @@ snapshots: '@changesets/read': 0.6.7 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@22.19.18) + '@changesets/write': 0.3.2 '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.7.1 ansi-colors: 4.1.3 + ci-info: 3.9.0 enquirer: 2.4.1 + external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 + outdent: 0.5.0 + p-limit: 2.3.0 package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.8.0 - spawndamnit: 3.0.1 + spawndamnit: 2.0.0 term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' '@changesets/config@3.1.4': dependencies: @@ -2093,11 +2028,11 @@ snapshots: '@changesets/types@6.1.0': {} - '@changesets/write@0.4.0': + '@changesets/write@0.3.2': dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.3 + human-id: 1.0.2 prettier: 2.8.8 '@emnapi/core@1.10.0': @@ -2119,157 +2054,144 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.27.7': + '@esbuild/aix-ppc64@0.23.1': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.27.7': + '@esbuild/android-arm64@0.23.1': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.27.7': + '@esbuild/android-arm@0.23.1': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.27.7': + '@esbuild/android-x64@0.23.1': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.27.7': + '@esbuild/darwin-arm64@0.23.1': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.27.7': + '@esbuild/darwin-x64@0.23.1': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.27.7': + '@esbuild/freebsd-arm64@0.23.1': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.27.7': + '@esbuild/freebsd-x64@0.23.1': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.27.7': + '@esbuild/linux-arm64@0.23.1': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.27.7': + '@esbuild/linux-arm@0.23.1': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.27.7': + '@esbuild/linux-ia32@0.23.1': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.27.7': + '@esbuild/linux-loong64@0.23.1': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.27.7': + '@esbuild/linux-mips64el@0.23.1': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.27.7': + '@esbuild/linux-ppc64@0.23.1': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.27.7': + '@esbuild/linux-riscv64@0.23.1': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.27.7': + '@esbuild/linux-s390x@0.23.1': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.27.7': - optional: true - - '@esbuild/netbsd-arm64@0.27.7': + '@esbuild/linux-x64@0.23.1': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.27.7': + '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.27.7': + '@esbuild/openbsd-arm64@0.23.1': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.27.7': - optional: true - - '@esbuild/openharmony-arm64@0.27.7': + '@esbuild/openbsd-x64@0.23.1': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.27.7': + '@esbuild/sunos-x64@0.23.1': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.27.7': + '@esbuild/win32-arm64@0.23.1': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.27.7': + '@esbuild/win32-ia32@0.23.1': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.27.7': + '@esbuild/win32-x64@0.23.1': optional: true - '@inquirer/external-editor@1.0.3(@types/node@22.19.18)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 22.19.18 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2288,82 +2210,14 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 - '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 - '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-core@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-fsa@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-builtins@4.57.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-to-fsa@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-utils@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-print@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-snapshot@4.57.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) - tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) @@ -2376,41 +2230,18 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.6.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) - tslib: 2.8.1 - '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) - tslib: 2.8.1 - '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.29.2 @@ -2723,57 +2554,61 @@ snapshots: '@types/mock-fs@4.13.4': dependencies: - '@types/node': 16.18.126 + '@types/node': 22.19.18 '@types/node@12.20.55': {} - '@types/node@16.18.126': {} - '@types/node@22.19.18': dependencies: undici-types: 6.21.0 '@types/picomatch@3.0.1': {} + '@types/semver@7.7.1': {} + '@types/supports-color@8.1.3': {} - '@vitest/expect@2.1.9': + '@vitest/expect@2.1.1': dependencies: - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.3.3 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.9(vite@5.4.21(@types/node@22.19.18))': + '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.21(@types/node@22.19.18))': dependencies: - '@vitest/spy': 2.1.9 + '@vitest/spy': 2.1.1 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 5.4.21(@types/node@22.19.18) + '@vitest/pretty-format@2.1.1': + dependencies: + tinyrainbow: 1.2.0 + '@vitest/pretty-format@2.1.9': dependencies: tinyrainbow: 1.2.0 - '@vitest/runner@2.1.9': + '@vitest/runner@2.1.1': dependencies: - '@vitest/utils': 2.1.9 + '@vitest/utils': 2.1.1 pathe: 1.1.2 - '@vitest/snapshot@2.1.9': + '@vitest/snapshot@2.1.1': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 2.1.1 magic-string: 0.30.21 pathe: 1.1.2 - '@vitest/spy@2.1.9': + '@vitest/spy@2.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.9': + '@vitest/utils@2.1.1': dependencies: - '@vitest/pretty-format': 2.1.9 + '@vitest/pretty-format': 2.1.1 loupe: 3.2.1 tinyrainbow: 1.2.0 @@ -2828,14 +2663,22 @@ snapshots: transitivePeerDependencies: - encoding - chardet@2.1.1: {} + chardet@0.7.0: {} check-error@2.1.3: {} + ci-info@3.9.0: {} + clipanion@3.2.1(typanion@3.14.0): dependencies: typanion: 3.14.0 + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2869,8 +2712,6 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - es-module-lexer@1.7.0: {} - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -2897,34 +2738,32 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.27.7: + esbuild@0.23.1: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.7 - '@esbuild/android-arm': 0.27.7 - '@esbuild/android-arm64': 0.27.7 - '@esbuild/android-x64': 0.27.7 - '@esbuild/darwin-arm64': 0.27.7 - '@esbuild/darwin-x64': 0.27.7 - '@esbuild/freebsd-arm64': 0.27.7 - '@esbuild/freebsd-x64': 0.27.7 - '@esbuild/linux-arm': 0.27.7 - '@esbuild/linux-arm64': 0.27.7 - '@esbuild/linux-ia32': 0.27.7 - '@esbuild/linux-loong64': 0.27.7 - '@esbuild/linux-mips64el': 0.27.7 - '@esbuild/linux-ppc64': 0.27.7 - '@esbuild/linux-riscv64': 0.27.7 - '@esbuild/linux-s390x': 0.27.7 - '@esbuild/linux-x64': 0.27.7 - '@esbuild/netbsd-arm64': 0.27.7 - '@esbuild/netbsd-x64': 0.27.7 - '@esbuild/openbsd-arm64': 0.27.7 - '@esbuild/openbsd-x64': 0.27.7 - '@esbuild/openharmony-arm64': 0.27.7 - '@esbuild/sunos-x64': 0.27.7 - '@esbuild/win32-arm64': 0.27.7 - '@esbuild/win32-ia32': 0.27.7 - '@esbuild/win32-x64': 0.27.7 + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 esprima@4.0.1: {} @@ -2932,10 +2771,14 @@ snapshots: dependencies: '@types/estree': 1.0.9 - expect-type@1.3.0: {} - extendable-error@0.1.7: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2988,10 +2831,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regex.js@1.2.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -3005,11 +2844,11 @@ snapshots: hookable@6.1.1: {} - human-id@4.1.3: {} + human-id@1.0.2: {} hyperdyperid@1.2.0: {} - iconv-lite@0.7.2: + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -3056,24 +2895,19 @@ snapshots: loupe@3.2.1: {} + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - memfs@4.57.2(tslib@2.8.1): + memfs@4.12.0: dependencies: - '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.6.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 @@ -3096,6 +2930,8 @@ snapshots: obug@2.1.1: {} + os-tmpdir@1.0.2: {} + outdent@0.5.0: {} oxfmt@0.48.0: @@ -3210,6 +3046,8 @@ snapshots: dependencies: parse-ms: 4.0.0 + pseudomap@1.0.2: {} + quansync@0.2.11: {} quansync@1.0.0: {} @@ -3305,20 +3143,33 @@ snapshots: semver@7.8.0: {} + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 + shebang-regex@1.0.0: {} + shebang-regex@3.0.0: {} siginfo@2.0.0: {} + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} slash@3.0.0: {} source-map-js@1.2.1: {} + spawndamnit@2.0.0: + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -3363,6 +3214,10 @@ snapshots: tinyspy@3.0.2: {} + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -3375,7 +3230,7 @@ snapshots: tree-kill@1.2.2: {} - tsdown@0.22.0(tsx@4.21.0)(typescript@5.6.2): + tsdown@0.22.0(tsx@4.19.1)(typescript@5.6.2): dependencies: ansis: 4.2.0 cac: 7.0.0 @@ -3393,7 +3248,7 @@ snapshots: tree-kill: 1.2.2 unconfig-core: 7.5.0 optionalDependencies: - tsx: 4.21.0 + tsx: 4.19.1 typescript: 5.6.2 transitivePeerDependencies: - '@ts-macro/tsc' @@ -3401,11 +3256,13 @@ snapshots: - oxc-resolver - vue-tsc + tslib@2.7.0: {} + tslib@2.8.1: {} - tsx@4.21.0: + tsx@4.19.1: dependencies: - esbuild: 0.27.7 + esbuild: 0.23.1 get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -3423,11 +3280,10 @@ snapshots: universalify@0.1.2: {} - vite-node@2.1.9(@types/node@22.19.18)(supports-color@9.4.0): + vite-node@2.1.1(@types/node@22.19.18)(supports-color@9.4.0): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@9.4.0) - es-module-lexer: 1.7.0 pathe: 1.1.2 vite: 5.4.21(@types/node@22.19.18) transitivePeerDependencies: @@ -3450,18 +3306,17 @@ snapshots: '@types/node': 22.19.18 fsevents: 2.3.3 - vitest@2.1.9(@types/node@22.19.18)(supports-color@9.4.0): + vitest@2.1.1(@types/node@22.19.18)(supports-color@9.4.0): dependencies: - '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@22.19.18)) + '@vitest/expect': 2.1.1 + '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.21(@types/node@22.19.18)) '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.9 - '@vitest/snapshot': 2.1.9 - '@vitest/spy': 2.1.9 - '@vitest/utils': 2.1.9 + '@vitest/runner': 2.1.1 + '@vitest/snapshot': 2.1.1 + '@vitest/spy': 2.1.1 + '@vitest/utils': 2.1.1 chai: 5.3.3 debug: 4.4.3(supports-color@9.4.0) - expect-type: 1.3.0 magic-string: 0.30.21 pathe: 1.1.2 std-env: 3.10.0 @@ -3470,7 +3325,7 @@ snapshots: tinypool: 1.1.1 tinyrainbow: 1.2.0 vite: 5.4.21(@types/node@22.19.18) - vite-node: 2.1.9(@types/node@22.19.18)(supports-color@9.4.0) + vite-node: 2.1.1(@types/node@22.19.18)(supports-color@9.4.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.18 @@ -3492,6 +3347,10 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -3500,3 +3359,5 @@ snapshots: dependencies: siginfo: 2.0.0 stackback: 0.0.2 + + yallist@2.1.2: {} From dee5c7548c2e73ba10dbdbbe56e08cbb03f24226 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 16:39:24 +0200 Subject: [PATCH 13/63] chore(deps): update to typescript v6, remove tslib --- package.json | 3 +-- pnpm-lock.yaml | 30 +++++++++++------------------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/package.json b/package.json index 023f21a..2e7701a 100644 --- a/package.json +++ b/package.json @@ -69,10 +69,9 @@ "oxfmt": "0.48.0", "oxlint": "1.63.0", "oxlint-tsgolint": "0.22.1", - "tslib": "2.7.0", "tsdown": "0.22.0", "tsx": "4.19.1", - "typescript": "5.6.2", + "typescript": "6.0.3", "vitest": "2.1.1" }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cdf357d..ee10824 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,16 +56,13 @@ importers: version: 0.22.1 tsdown: specifier: 0.22.0 - version: 0.22.0(tsx@4.19.1)(typescript@5.6.2) - tslib: - specifier: 2.7.0 - version: 2.7.0 + version: 0.22.0(tsx@4.19.1)(typescript@6.0.3) tsx: specifier: 4.19.1 version: 4.19.1 typescript: - specifier: 5.6.2 - version: 5.6.2 + specifier: 6.0.3 + version: 6.0.3 vitest: specifier: 2.1.1 version: 2.1.1(@types/node@22.19.18)(supports-color@9.4.0) @@ -1744,9 +1741,6 @@ packages: unrun: optional: true - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -1758,8 +1752,8 @@ packages: typanion@3.14.0: resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -3067,7 +3061,7 @@ snapshots: reusify@1.1.0: {} - rolldown-plugin-dts@0.25.0(rolldown@1.0.0)(typescript@5.6.2): + rolldown-plugin-dts@0.25.0(rolldown@1.0.0)(typescript@6.0.3): dependencies: '@babel/generator': 8.0.0-rc.4 '@babel/helper-validator-identifier': 8.0.0-rc.4 @@ -3079,7 +3073,7 @@ snapshots: obug: 2.1.1 rolldown: 1.0.0 optionalDependencies: - typescript: 5.6.2 + typescript: 6.0.3 transitivePeerDependencies: - oxc-resolver @@ -3230,7 +3224,7 @@ snapshots: tree-kill@1.2.2: {} - tsdown@0.22.0(tsx@4.19.1)(typescript@5.6.2): + tsdown@0.22.0(tsx@4.19.1)(typescript@6.0.3): dependencies: ansis: 4.2.0 cac: 7.0.0 @@ -3241,7 +3235,7 @@ snapshots: obug: 2.1.1 picomatch: 4.0.4 rolldown: 1.0.0 - rolldown-plugin-dts: 0.25.0(rolldown@1.0.0)(typescript@5.6.2) + rolldown-plugin-dts: 0.25.0(rolldown@1.0.0)(typescript@6.0.3) semver: 7.8.0 tinyexec: 1.1.2 tinyglobby: 0.2.16 @@ -3249,15 +3243,13 @@ snapshots: unconfig-core: 7.5.0 optionalDependencies: tsx: 4.19.1 - typescript: 5.6.2 + typescript: 6.0.3 transitivePeerDependencies: - '@ts-macro/tsc' - '@typescript/native-preview' - oxc-resolver - vue-tsc - tslib@2.7.0: {} - tslib@2.8.1: {} tsx@4.19.1: @@ -3269,7 +3261,7 @@ snapshots: typanion@3.14.0: {} - typescript@5.6.2: {} + typescript@6.0.3: {} unconfig-core@7.5.0: dependencies: From 404c03e6fa2dbf103d362f009edc1db4fcc5a816 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 17:02:31 +0200 Subject: [PATCH 14/63] chore(deps): update vite to v4 --- package.json | 2 +- pnpm-lock.yaml | 1115 +++++++++++++++++++----------------------------- 2 files changed, 443 insertions(+), 674 deletions(-) diff --git a/package.json b/package.json index 2e7701a..eb05c4c 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "tsdown": "0.22.0", "tsx": "4.19.1", "typescript": "6.0.3", - "vitest": "2.1.1" + "vitest": "4.1.5" }, "engines": { "node": ">=22" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee10824..8b60a66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,8 +64,8 @@ importers: specifier: 6.0.3 version: 6.0.3 vitest: - specifier: 2.1.1 - version: 2.1.1(@types/node@22.19.18)(supports-color@9.4.0) + specifier: 4.1.5 + version: 4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1)) packages: @@ -161,216 +161,108 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.23.1': resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.23.1': resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.23.1': resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.23.1': resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.23.1': resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.23.1': resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.23.1': resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.23.1': resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.23.1': resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.23.1': resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.23.1': resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.23.1': resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.23.1': resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.23.1': resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.23.1': resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} engines: {node: '>=18'} @@ -383,60 +275,30 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.23.1': resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.23.1': resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.23.1': resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.23.1': resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} engines: {node: '>=18'} @@ -516,6 +378,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oxc-project/types@0.128.0': + resolution: {integrity: sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==} + '@oxc-project/types@0.129.0': resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} @@ -802,30 +667,60 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0': resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0': resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-rc.18': + resolution: {integrity: sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0': resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': + resolution: {integrity: sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': + resolution: {integrity: sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0': resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -833,6 +728,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-arm64-musl@1.0.0': resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -840,6 +742,13 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': + resolution: {integrity: sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rolldown/binding-linux-ppc64-gnu@1.0.0': resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -847,6 +756,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0': resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -854,6 +770,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0': resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -861,6 +784,13 @@ packages: os: [linux] libc: [glibc] + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': + resolution: {integrity: sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rolldown/binding-linux-x64-musl@1.0.0': resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -868,175 +798,76 @@ packages: os: [linux] libc: [musl] + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': + resolution: {integrity: sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@rolldown/binding-openharmony-arm64@1.0.0': resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': + resolution: {integrity: sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0': resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + resolution: {integrity: sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0': resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': + resolution: {integrity: sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0': resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0': - resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} - - '@rollup/rollup-android-arm-eabi@4.60.3': - resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.60.3': - resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.60.3': - resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.60.3': - resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.60.3': - resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.60.3': - resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': - resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.60.3': - resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.60.3': - resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm64-musl@4.60.3': - resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.60.3': - resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.60.3': - resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.60.3': - resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.60.3': - resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.60.3': - resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.60.3': - resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.60.3': - resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-gnu@4.60.3': - resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-musl@4.60.3': - resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openbsd-x64@4.60.3': - resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': + resolution: {integrity: sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.60.3': - resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.60.3': - resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} - cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.3': - resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} - cpu: [ia32] - os: [win32] + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} - '@rollup/rollup-win32-x64-gnu@4.60.3': - resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} - cpu: [x64] - os: [win32] + '@rolldown/pluginutils@1.0.0-rc.18': + resolution: {integrity: sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==} - '@rollup/rollup-win32-x64-msvc@4.60.3': - resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} - cpu: [x64] - os: [win32] + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} @@ -1062,38 +893,34 @@ packages: '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - '@vitest/expect@2.1.1': - resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} + '@vitest/expect@4.1.5': + resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} - '@vitest/mocker@2.1.1': - resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + '@vitest/mocker@4.1.5': + resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} peerDependencies: - '@vitest/spy': 2.1.1 - msw: ^2.3.5 - vite: ^5.0.0 + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@2.1.1': - resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} + '@vitest/pretty-format@4.1.5': + resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} - '@vitest/runner@2.1.1': - resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + '@vitest/runner@4.1.5': + resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} - '@vitest/snapshot@2.1.1': - resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@vitest/snapshot@4.1.5': + resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} - '@vitest/spy@2.1.1': - resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@vitest/spy@4.1.5': + resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} - '@vitest/utils@2.1.1': - resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + '@vitest/utils@4.1.5': + resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -1136,16 +963,12 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} - chai@5.3.3: - resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} changesets-changelog-clean@1.3.0: @@ -1154,10 +977,6 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@2.1.3: - resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} - engines: {node: '>= 16'} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1167,6 +986,9 @@ packages: peerDependencies: typanion: '*' + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -1177,19 +999,6 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -1197,6 +1006,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1218,10 +1031,8 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} esbuild@0.23.1: resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} @@ -1236,6 +1047,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1359,6 +1174,80 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1366,9 +1255,6 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.2.1: - resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -1391,9 +1277,6 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1476,16 +1359,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1569,9 +1445,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.60.3: - resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.0-rc.18: + resolution: {integrity: sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true run-parallel@1.2.0: @@ -1631,8 +1507,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.10.0: - resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -1659,9 +1535,6 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.1.2: resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} @@ -1670,20 +1543,12 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - tinypool@2.1.0: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -1767,30 +1632,33 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - vite-node@2.1.1: - resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@8.0.11: + resolution: {integrity: sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true - less: + '@vitejs/devtools': optional: true - lightningcss: + esbuild: + optional: true + jiti: + optional: true + less: optional: true sass: optional: true @@ -1802,24 +1670,44 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true - vitest@2.1.1: - resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@4.1.5: + resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.1 - '@vitest/ui': 2.1.1 + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.5 + '@vitest/browser-preview': 4.1.5 + '@vitest/browser-webdriverio': 4.1.5 + '@vitest/coverage-istanbul': 4.1.5 + '@vitest/coverage-v8': 4.1.5 + '@vitest/ui': 4.1.5 happy-dom: '*' jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/node': optional: true - '@vitest/browser': + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true @@ -2045,144 +1933,75 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.23.1': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.23.1': optional: true @@ -2271,6 +2090,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@oxc-project/types@0.128.0': {} + '@oxc-project/types@0.129.0': {} '@oxfmt/binding-android-arm-eabi@0.48.0': @@ -2412,135 +2233,118 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0': + '@rolldown/binding-android-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.0.0': - optional: true - - '@rolldown/binding-linux-s390x-gnu@1.0.0': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.0.0': + '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0': + '@rolldown/binding-darwin-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0': + '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@rolldown/binding-darwin-x64@1.0.0-rc.18': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0': + '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0': + '@rolldown/binding-freebsd-x64@1.0.0-rc.18': optional: true - '@rolldown/pluginutils@1.0.0': {} - - '@rollup/rollup-android-arm-eabi@4.60.3': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rollup/rollup-android-arm64@4.60.3': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.18': optional: true - '@rollup/rollup-darwin-arm64@4.60.3': + '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rollup/rollup-darwin-x64@4.60.3': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-freebsd-arm64@4.60.3': + '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rollup/rollup-freebsd-x64@4.60.3': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.3': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.3': + '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.3': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.3': + '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.3': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.3': + '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.3': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.3': + '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.3': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.18': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.3': + '@rolldown/binding-wasm32-wasi@1.0.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rollup/rollup-linux-x64-gnu@4.60.3': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.18': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rollup/rollup-linux-x64-musl@4.60.3': + '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rollup/rollup-openbsd-x64@4.60.3': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': optional: true - '@rollup/rollup-openharmony-arm64@4.60.3': + '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.3': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.3': - optional: true + '@rolldown/pluginutils@1.0.0': {} - '@rollup/rollup-win32-x64-gnu@4.60.3': - optional: true + '@rolldown/pluginutils@1.0.0-rc.18': {} - '@rollup/rollup-win32-x64-msvc@4.60.3': - optional: true + '@standard-schema/spec@1.1.0': {} '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 optional: true - '@types/estree@1.0.8': {} + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.9': {} @@ -2562,49 +2366,46 @@ snapshots: '@types/supports-color@8.1.3': {} - '@vitest/expect@2.1.1': + '@vitest/expect@4.1.5': dependencies: - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 - chai: 5.3.3 - tinyrainbow: 1.2.0 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 + chai: 6.2.2 + tinyrainbow: 3.1.0 - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.21(@types/node@22.19.18))': + '@vitest/mocker@4.1.5(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1))': dependencies: - '@vitest/spy': 2.1.1 + '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@22.19.18) - - '@vitest/pretty-format@2.1.1': - dependencies: - tinyrainbow: 1.2.0 + vite: 8.0.11(@types/node@22.19.18)(tsx@4.19.1) - '@vitest/pretty-format@2.1.9': + '@vitest/pretty-format@4.1.5': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 3.1.0 - '@vitest/runner@2.1.1': + '@vitest/runner@4.1.5': dependencies: - '@vitest/utils': 2.1.1 - pathe: 1.1.2 + '@vitest/utils': 4.1.5 + pathe: 2.0.3 - '@vitest/snapshot@2.1.1': + '@vitest/snapshot@4.1.5': dependencies: - '@vitest/pretty-format': 2.1.1 + '@vitest/pretty-format': 4.1.5 + '@vitest/utils': 4.1.5 magic-string: 0.30.21 - pathe: 1.1.2 + pathe: 2.0.3 - '@vitest/spy@2.1.1': - dependencies: - tinyspy: 3.0.2 + '@vitest/spy@4.1.5': {} - '@vitest/utils@2.1.1': + '@vitest/utils@4.1.5': dependencies: - '@vitest/pretty-format': 2.1.1 - loupe: 3.2.1 - tinyrainbow: 1.2.0 + '@vitest/pretty-format': 4.1.5 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 ansi-colors@4.1.3: {} @@ -2638,17 +2439,9 @@ snapshots: dependencies: fill-range: 7.1.1 - cac@6.7.14: {} - cac@7.0.0: {} - chai@5.3.3: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.3 - deep-eql: 5.0.2 - loupe: 3.2.1 - pathval: 2.0.1 + chai@6.2.2: {} changesets-changelog-clean@1.3.0: dependencies: @@ -2659,14 +2452,14 @@ snapshots: chardet@0.7.0: {} - check-error@2.1.3: {} - ci-info@3.9.0: {} clipanion@3.2.1(typanion@3.14.0): dependencies: typanion: 3.14.0 + convert-source-map@2.0.0: {} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 @@ -2681,18 +2474,12 @@ snapshots: dataloader@1.4.0: {} - debug@4.4.3(supports-color@9.4.0): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 9.4.0 - - deep-eql@5.0.2: {} - defu@6.1.7: {} detect-indent@6.1.0: {} + detect-libc@2.1.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -2706,31 +2493,7 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + es-module-lexer@2.1.0: {} esbuild@0.23.1: optionalDependencies: @@ -2765,6 +2528,8 @@ snapshots: dependencies: '@types/estree': 1.0.9 + expect-type@1.3.0: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -2881,14 +2646,61 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 lodash.startcase@4.4.0: {} - loupe@3.2.1: {} - lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -2914,8 +2726,6 @@ snapshots: mri@1.2.0: {} - ms@2.1.3: {} - nanoid@3.3.12: {} node-fetch@2.7.0: @@ -3012,12 +2822,8 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} - pathe@2.0.3: {} - pathval@2.0.1: {} - picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -3098,36 +2904,26 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0 '@rolldown/binding-win32-x64-msvc': 1.0.0 - rollup@4.60.3: + rolldown@1.0.0-rc.18: dependencies: - '@types/estree': 1.0.8 + '@oxc-project/types': 0.128.0 + '@rolldown/pluginutils': 1.0.0-rc.18 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.3 - '@rollup/rollup-android-arm64': 4.60.3 - '@rollup/rollup-darwin-arm64': 4.60.3 - '@rollup/rollup-darwin-x64': 4.60.3 - '@rollup/rollup-freebsd-arm64': 4.60.3 - '@rollup/rollup-freebsd-x64': 4.60.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 - '@rollup/rollup-linux-arm-musleabihf': 4.60.3 - '@rollup/rollup-linux-arm64-gnu': 4.60.3 - '@rollup/rollup-linux-arm64-musl': 4.60.3 - '@rollup/rollup-linux-loong64-gnu': 4.60.3 - '@rollup/rollup-linux-loong64-musl': 4.60.3 - '@rollup/rollup-linux-ppc64-gnu': 4.60.3 - '@rollup/rollup-linux-ppc64-musl': 4.60.3 - '@rollup/rollup-linux-riscv64-gnu': 4.60.3 - '@rollup/rollup-linux-riscv64-musl': 4.60.3 - '@rollup/rollup-linux-s390x-gnu': 4.60.3 - '@rollup/rollup-linux-x64-gnu': 4.60.3 - '@rollup/rollup-linux-x64-musl': 4.60.3 - '@rollup/rollup-openbsd-x64': 4.60.3 - '@rollup/rollup-openharmony-arm64': 4.60.3 - '@rollup/rollup-win32-arm64-msvc': 4.60.3 - '@rollup/rollup-win32-ia32-msvc': 4.60.3 - '@rollup/rollup-win32-x64-gnu': 4.60.3 - '@rollup/rollup-win32-x64-msvc': 4.60.3 - fsevents: 2.3.3 + '@rolldown/binding-android-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.18 + '@rolldown/binding-darwin-x64': 1.0.0-rc.18 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.18 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.18 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.18 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.18 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.18 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.18 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.18 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.18 run-parallel@1.2.0: dependencies: @@ -3173,7 +2969,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.10.0: {} + std-env@4.1.0: {} strip-ansi@6.0.1: dependencies: @@ -3191,8 +2987,6 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.2: {} - tinyexec@1.1.2: {} tinyglobby@0.2.16: @@ -3200,13 +2994,9 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinypool@1.1.1: {} - tinypool@2.1.0: {} - tinyrainbow@1.2.0: {} - - tinyspy@3.0.2: {} + tinyrainbow@3.1.0: {} tmp@0.0.33: dependencies: @@ -3272,65 +3062,44 @@ snapshots: universalify@0.1.2: {} - vite-node@2.1.1(@types/node@22.19.18)(supports-color@9.4.0): + vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1): dependencies: - cac: 6.7.14 - debug: 4.4.3(supports-color@9.4.0) - pathe: 1.1.2 - vite: 5.4.21(@types/node@22.19.18) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - vite@5.4.21(@types/node@22.19.18): - dependencies: - esbuild: 0.21.5 + lightningcss: 1.32.0 + picomatch: 4.0.4 postcss: 8.5.14 - rollup: 4.60.3 + rolldown: 1.0.0-rc.18 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 22.19.18 fsevents: 2.3.3 + tsx: 4.19.1 - vitest@2.1.1(@types/node@22.19.18)(supports-color@9.4.0): - dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.21(@types/node@22.19.18)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.1 - '@vitest/snapshot': 2.1.1 - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 - chai: 5.3.3 - debug: 4.4.3(supports-color@9.4.0) + vitest@4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1)): + dependencies: + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1)) + '@vitest/pretty-format': 4.1.5 + '@vitest/runner': 4.1.5 + '@vitest/snapshot': 4.1.5 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 magic-string: 0.30.21 - pathe: 1.1.2 - std-env: 3.10.0 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.1.1 - tinyrainbow: 1.2.0 - vite: 5.4.21(@types/node@22.19.18) - vite-node: 2.1.1(@types/node@22.19.18)(supports-color@9.4.0) + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + tinyrainbow: 3.1.0 + vite: 8.0.11(@types/node@22.19.18)(tsx@4.19.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.18 transitivePeerDependencies: - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser webidl-conversions@3.0.1: {} From 4b12a94e229b13f33a1b5b6707c7a3c52415494c Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 22:19:20 +0200 Subject: [PATCH 15/63] chore(deps): remove tsx --- package.json | 1 - pnpm-lock.yaml | 290 ++----------------------------------------------- 2 files changed, 9 insertions(+), 282 deletions(-) diff --git a/package.json b/package.json index eb05c4c..f7ca52f 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,6 @@ "oxlint": "1.63.0", "oxlint-tsgolint": "0.22.1", "tsdown": "0.22.0", - "tsx": "4.19.1", "typescript": "6.0.3", "vitest": "4.1.5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b60a66..9b58153 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,16 +56,13 @@ importers: version: 0.22.1 tsdown: specifier: 0.22.0 - version: 0.22.0(tsx@4.19.1)(typescript@6.0.3) - tsx: - specifier: 4.19.1 - version: 4.19.1 + version: 0.22.0(typescript@6.0.3) typescript: specifier: 6.0.3 version: 6.0.3 vitest: specifier: 4.1.5 - version: 4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1)) + version: 4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)) packages: @@ -161,150 +158,6 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1034,11 +887,6 @@ packages: es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} - engines: {node: '>=18'} - hasBin: true - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -1095,9 +943,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-tsconfig@5.0.0-beta.5: resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} engines: {node: '>=20.20.0'} @@ -1609,11 +1454,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.19.1: - resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} - engines: {node: '>=18.0.0'} - hasBin: true - typanion@3.14.0: resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} @@ -1933,78 +1773,6 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.23.1': - optional: true - - '@esbuild/android-arm64@0.23.1': - optional: true - - '@esbuild/android-arm@0.23.1': - optional: true - - '@esbuild/android-x64@0.23.1': - optional: true - - '@esbuild/darwin-arm64@0.23.1': - optional: true - - '@esbuild/darwin-x64@0.23.1': - optional: true - - '@esbuild/freebsd-arm64@0.23.1': - optional: true - - '@esbuild/freebsd-x64@0.23.1': - optional: true - - '@esbuild/linux-arm64@0.23.1': - optional: true - - '@esbuild/linux-arm@0.23.1': - optional: true - - '@esbuild/linux-ia32@0.23.1': - optional: true - - '@esbuild/linux-loong64@0.23.1': - optional: true - - '@esbuild/linux-mips64el@0.23.1': - optional: true - - '@esbuild/linux-ppc64@0.23.1': - optional: true - - '@esbuild/linux-riscv64@0.23.1': - optional: true - - '@esbuild/linux-s390x@0.23.1': - optional: true - - '@esbuild/linux-x64@0.23.1': - optional: true - - '@esbuild/netbsd-x64@0.23.1': - optional: true - - '@esbuild/openbsd-arm64@0.23.1': - optional: true - - '@esbuild/openbsd-x64@0.23.1': - optional: true - - '@esbuild/sunos-x64@0.23.1': - optional: true - - '@esbuild/win32-arm64@0.23.1': - optional: true - - '@esbuild/win32-ia32@0.23.1': - optional: true - - '@esbuild/win32-x64@0.23.1': - optional: true - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2375,13 +2143,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1))': + '@vitest/mocker@4.1.5(vite@8.0.11(@types/node@22.19.18))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.11(@types/node@22.19.18)(tsx@4.19.1) + vite: 8.0.11(@types/node@22.19.18) '@vitest/pretty-format@4.1.5': dependencies: @@ -2495,33 +2263,6 @@ snapshots: es-module-lexer@2.1.0: {} - esbuild@0.23.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 - esprima@4.0.1: {} estree-walker@3.0.3: @@ -2578,10 +2319,6 @@ snapshots: fsevents@2.3.3: optional: true - get-tsconfig@4.14.0: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@5.0.0-beta.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -3014,7 +2751,7 @@ snapshots: tree-kill@1.2.2: {} - tsdown@0.22.0(tsx@4.19.1)(typescript@6.0.3): + tsdown@0.22.0(typescript@6.0.3): dependencies: ansis: 4.2.0 cac: 7.0.0 @@ -3032,7 +2769,6 @@ snapshots: tree-kill: 1.2.2 unconfig-core: 7.5.0 optionalDependencies: - tsx: 4.19.1 typescript: 6.0.3 transitivePeerDependencies: - '@ts-macro/tsc' @@ -3042,13 +2778,6 @@ snapshots: tslib@2.8.1: {} - tsx@4.19.1: - dependencies: - esbuild: 0.23.1 - get-tsconfig: 4.14.0 - optionalDependencies: - fsevents: 2.3.3 - typanion@3.14.0: {} typescript@6.0.3: {} @@ -3062,7 +2791,7 @@ snapshots: universalify@0.1.2: {} - vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1): + vite@8.0.11(@types/node@22.19.18): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -3072,12 +2801,11 @@ snapshots: optionalDependencies: '@types/node': 22.19.18 fsevents: 2.3.3 - tsx: 4.19.1 - vitest@4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1)): + vitest@4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@22.19.18)(tsx@4.19.1)) + '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@22.19.18)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -3094,7 +2822,7 @@ snapshots: tinyexec: 1.1.2 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 8.0.11(@types/node@22.19.18)(tsx@4.19.1) + vite: 8.0.11(@types/node@22.19.18) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.18 From 7d1d9ace569a389d648241b53cfd8cdc98df3599 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 22:20:05 +0200 Subject: [PATCH 16/63] chore(deps): update changesets --- package.json | 2 +- pnpm-lock.yaml | 162 ++++++++++++------------------------------------- 2 files changed, 41 insertions(+), 123 deletions(-) diff --git a/package.json b/package.json index f7ca52f..29c3793 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "supports-color": "^9.4.0" }, "devDependencies": { - "@changesets/cli": "2.27.8", + "@changesets/cli": "2.31.0", "@types/mock-fs": "4.13.4", "@types/node": "22.19.18", "@types/picomatch": "3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b58153..a613492 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,8 +25,8 @@ importers: version: 9.4.0 devDependencies: '@changesets/cli': - specifier: 2.27.8 - version: 2.27.8 + specifier: 2.31.0 + version: 2.31.0(@types/node@22.19.18) '@types/mock-fs': specifier: 4.13.4 version: 4.13.4 @@ -100,8 +100,8 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.27.8': - resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + '@changesets/cli@2.31.0': + resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} hasBin: true '@changesets/config@3.1.4': @@ -146,8 +146,8 @@ packages: '@changesets/types@6.1.0': resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} @@ -158,6 +158,15 @@ packages: '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -740,9 +749,6 @@ packages: '@types/picomatch@3.0.1': resolution: {integrity: sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} @@ -827,12 +833,8 @@ packages: changesets-changelog-clean@1.3.0: resolution: {integrity: sha512-3bGEYg+SuzS4TizAVwGxkiV+c/IMQI7+JPnrEApbvGeb5//c2cfcLG9pteNqpySVY6BNkpCFMM4dpZucnCPxtQ==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} clipanion@3.2.1: resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} @@ -842,9 +844,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -902,10 +901,6 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -961,15 +956,16 @@ packages: hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + hasBin: true hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} ignore@5.3.2: @@ -1100,9 +1096,6 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -1139,10 +1132,6 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} @@ -1239,9 +1228,6 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -1306,18 +1292,10 @@ packages: engines: {node: '>=10'} hasBin: true - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -1325,9 +1303,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -1340,9 +1315,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1396,10 +1368,6 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1562,10 +1530,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1576,9 +1540,6 @@ packages: engines: {node: '>=8'} hasBin: true - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - snapshots: '@babel/generator@8.0.0-rc.4': @@ -1634,7 +1595,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.27.8': + '@changesets/cli@2.31.0(@types/node@22.19.18)': dependencies: '@changesets/apply-release-plan': 7.1.1 '@changesets/assemble-release-plan': 6.0.10 @@ -1649,23 +1610,21 @@ snapshots: '@changesets/read': 0.6.7 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 - '@changesets/write': 0.3.2 + '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@22.19.18) '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.7.1 ansi-colors: 4.1.3 - ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 - outdent: 0.5.0 - p-limit: 2.3.0 package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.8.0 - spawndamnit: 2.0.0 + spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' '@changesets/config@3.1.4': dependencies: @@ -1750,11 +1709,11 @@ snapshots: '@changesets/types@6.1.0': {} - '@changesets/write@0.3.2': + '@changesets/write@0.4.0': dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.3 prettier: 2.8.8 '@emnapi/core@1.10.0': @@ -1773,6 +1732,13 @@ snapshots: tslib: 2.8.1 optional: true + '@inquirer/external-editor@1.0.3(@types/node@22.19.18)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 22.19.18 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2130,8 +2096,6 @@ snapshots: '@types/picomatch@3.0.1': {} - '@types/semver@7.7.1': {} - '@types/supports-color@8.1.3': {} '@vitest/expect@4.1.5': @@ -2218,9 +2182,7 @@ snapshots: transitivePeerDependencies: - encoding - chardet@0.7.0: {} - - ci-info@3.9.0: {} + chardet@2.1.1: {} clipanion@3.2.1(typanion@3.14.0): dependencies: @@ -2228,12 +2190,6 @@ snapshots: convert-source-map@2.0.0: {} - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -2273,12 +2229,6 @@ snapshots: extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2340,11 +2290,11 @@ snapshots: hookable@6.1.1: {} - human-id@1.0.2: {} + human-id@4.1.3: {} hyperdyperid@1.2.0: {} - iconv-lite@0.4.24: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -2438,11 +2388,6 @@ snapshots: lodash.startcase@4.4.0: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -2471,8 +2416,6 @@ snapshots: obug@2.1.1: {} - os-tmpdir@1.0.2: {} - outdent@0.5.0: {} oxfmt@0.48.0: @@ -2583,8 +2526,6 @@ snapshots: dependencies: parse-ms: 4.0.0 - pseudomap@1.0.2: {} - quansync@0.2.11: {} quansync@1.0.0: {} @@ -2670,33 +2611,20 @@ snapshots: semver@7.8.0: {} - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} slash@3.0.0: {} source-map-js@1.2.1: {} - spawndamnit@2.0.0: - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -2735,10 +2663,6 @@ snapshots: tinyrainbow@3.1.0: {} - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -2836,10 +2760,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -2848,5 +2768,3 @@ snapshots: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - - yallist@2.1.2: {} From 4d1f2aaf116f76c86b736a0cd6b28be26183e40a Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 22:20:39 +0200 Subject: [PATCH 17/63] chore(deps): update memfs --- package.json | 2 +- pnpm-lock.yaml | 208 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 203 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 29c3793..8d61fc7 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "@types/picomatch": "3.0.1", "@types/supports-color": "8.1.3", "changesets-changelog-clean": "1.3.0", - "memfs": "4.12.0", + "memfs": "4.57.2", "oxfmt": "0.48.0", "oxlint": "1.63.0", "oxlint-tsgolint": "0.22.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a613492..eb6dab2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,8 +43,8 @@ importers: specifier: 1.3.0 version: 1.3.0 memfs: - specifier: 4.12.0 - version: 4.12.0 + specifier: 4.57.2 + version: 4.57.2(tslib@2.8.1) oxfmt: specifier: 0.48.0 version: 0.48.0 @@ -186,36 +186,120 @@ packages: peerDependencies: tslib: '2' + '@jsonjoy.com/base64@17.67.0': + resolution: {integrity: sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/buffers@1.2.1': resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/buffers@17.67.0': + resolution: {integrity: sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/codegen@1.0.0': resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/codegen@17.67.0': + resolution: {integrity: sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.57.2': + resolution: {integrity: sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.57.2': + resolution: {integrity: sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.57.2': + resolution: {integrity: sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.57.2': + resolution: {integrity: sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.57.2': + resolution: {integrity: sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.57.2': + resolution: {integrity: sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.57.2': + resolution: {integrity: sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.57.2': + resolution: {integrity: sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/json-pack@1.21.0': resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/json-pack@17.67.0': + resolution: {integrity: sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/json-pointer@1.0.2': resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/json-pointer@17.67.0': + resolution: {integrity: sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/util@1.9.0': resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/util@17.67.0': + resolution: {integrity: sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -946,6 +1030,12 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1099,9 +1189,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - memfs@4.12.0: - resolution: {integrity: sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==} - engines: {node: '>= 4.0.0'} + memfs@4.57.2: + resolution: {integrity: sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==} + peerDependencies: + tslib: '2' merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -1757,14 +1848,82 @@ snapshots: dependencies: tslib: 2.8.1 + '@jsonjoy.com/base64@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/buffers@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/codegen@17.67.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.57.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.57.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) @@ -1777,18 +1936,41 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/json-pack@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.6.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/json-pointer@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/util': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/util@17.67.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.67.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) + tslib: 2.8.1 + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.29.2 @@ -2277,6 +2459,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -2392,10 +2578,20 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - memfs@4.12.0: + memfs@4.57.2(tslib@2.8.1): dependencies: + '@jsonjoy.com/fs-core': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.57.2(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.57.2(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.6.0(tslib@2.8.1) tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 From 14059f18f89ab057f42406405f8f92334d45b2e9 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 22:24:16 +0200 Subject: [PATCH 18/63] chore(deps): update @types/picomatch --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- src/utils/glob.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 8d61fc7..48f810c 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "@changesets/cli": "2.31.0", "@types/mock-fs": "4.13.4", "@types/node": "22.19.18", - "@types/picomatch": "3.0.1", + "@types/picomatch": "4.0.3", "@types/supports-color": "8.1.3", "changesets-changelog-clean": "1.3.0", "memfs": "4.57.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eb6dab2..1f1a33b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,8 +34,8 @@ importers: specifier: 22.19.18 version: 22.19.18 '@types/picomatch': - specifier: 3.0.1 - version: 3.0.1 + specifier: 4.0.3 + version: 4.0.3 '@types/supports-color': specifier: 8.1.3 version: 8.1.3 @@ -830,8 +830,8 @@ packages: '@types/node@22.19.18': resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} - '@types/picomatch@3.0.1': - resolution: {integrity: sha512-1MRgzpzY0hOp9pW/kLRxeQhUWwil6gnrUYd3oEpeYBqp/FexhaCPv3F8LsYr47gtUU45fO2cm1dbwkSrHEo8Uw==} + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} '@types/supports-color@8.1.3': resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} @@ -2276,7 +2276,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/picomatch@3.0.1': {} + '@types/picomatch@4.0.3': {} '@types/supports-color@8.1.3': {} diff --git a/src/utils/glob.ts b/src/utils/glob.ts index e41eaa0..3226816 100644 --- a/src/utils/glob.ts +++ b/src/utils/glob.ts @@ -22,7 +22,7 @@ export type GlobberPicoOptions = { cwd?: string; }; -export type GlobFunc = (filePath: string, test?: boolean) => boolean; +export type GlobFunc = (filePath: string, test?: false | undefined) => boolean; /** * Creates a picomatch matcher from a set of globs. From 6800d5da6b0baadebe5f1d755a0e9b6e11dc8f47 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 22:42:56 +0200 Subject: [PATCH 19/63] fix(deps): removed unnecessary colored ouput and supports-color dep --- .changeset/spotty-sides-flow.md | 5 +++++ package.json | 4 +--- pnpm-lock.yaml | 17 ----------------- src/cli/commands/clean.command.ts | 26 ++++++++++++-------------- src/cli/utils/terminal.ts | 17 ----------------- 5 files changed, 18 insertions(+), 51 deletions(-) create mode 100644 .changeset/spotty-sides-flow.md diff --git a/.changeset/spotty-sides-flow.md b/.changeset/spotty-sides-flow.md new file mode 100644 index 0000000..b50670c --- /dev/null +++ b/.changeset/spotty-sides-flow.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Removed unnecessary colored output and `supports-color` dependency. diff --git a/package.json b/package.json index 48f810c..31b8830 100644 --- a/package.json +++ b/package.json @@ -55,15 +55,13 @@ "clipanion": "^3.2.1", "picomatch": "^4.0.2", "pretty-bytes": "^6.1.1", - "pretty-ms": "^9.1.0", - "supports-color": "^9.4.0" + "pretty-ms": "^9.1.0" }, "devDependencies": { "@changesets/cli": "2.31.0", "@types/mock-fs": "4.13.4", "@types/node": "22.19.18", "@types/picomatch": "4.0.3", - "@types/supports-color": "8.1.3", "changesets-changelog-clean": "1.3.0", "memfs": "4.57.2", "oxfmt": "0.48.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1f1a33b..2e4e66f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,6 @@ importers: pretty-ms: specifier: ^9.1.0 version: 9.3.0 - supports-color: - specifier: ^9.4.0 - version: 9.4.0 devDependencies: '@changesets/cli': specifier: 2.31.0 @@ -36,9 +33,6 @@ importers: '@types/picomatch': specifier: 4.0.3 version: 4.0.3 - '@types/supports-color': - specifier: 8.1.3 - version: 8.1.3 changesets-changelog-clean: specifier: 1.3.0 version: 1.3.0 @@ -833,9 +827,6 @@ packages: '@types/picomatch@4.0.3': resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} - '@types/supports-color@8.1.3': - resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} - '@vitest/expect@4.1.5': resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} @@ -1426,10 +1417,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - supports-color@9.4.0: - resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} - engines: {node: '>=12'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -2278,8 +2265,6 @@ snapshots: '@types/picomatch@4.0.3': {} - '@types/supports-color@8.1.3': {} - '@vitest/expect@4.1.5': dependencies: '@standard-schema/spec': 1.1.0 @@ -2838,8 +2823,6 @@ snapshots: strip-bom@3.0.0: {} - supports-color@9.4.0: {} - term-size@2.2.1: {} thingies@2.6.0(tslib@2.8.1): diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 5b6edfe..d612b1e 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -3,7 +3,7 @@ import prettyBytes from 'pretty-bytes'; import prettyMs from 'pretty-ms'; import { clean } from '../../clean.js'; import { BaseCommand } from '../helpers/base.command.js'; -import { bold, green, makeLogger, yellow, yesOrNo } from '../utils/terminal.js'; +import { makeLogger, yesOrNo } from '../utils/terminal.js'; const JSON_INDENT = 2; @@ -37,11 +37,11 @@ export class CleanCommand extends BaseCommand { async execute(): Promise { const logger = makeLogger({ disabled: this.json || this.silent }); - logger.log(bold('clean-modules'), this.dryRun ? yellow('(dry run)') : ''); + logger.log(`clean-modules${this.dryRun ? ' (dry run)' : ''}`); if (!this.yes && !this.dryRun) { const warning = `\nPreparing to clean node_modules at: ${this.directory}\nAre you sure you want to continue? (Y/N) `; - const confirmed = await yesOrNo(yellow(warning)); + const confirmed = await yesOrNo(warning); if (!confirmed) { // oxlint-disable-next-line unicorn/no-process-exit @@ -62,7 +62,7 @@ export class CleanCommand extends BaseCommand { }); const cleanupDuration = Date.now() - cleanupStart; - logger.log(green(`Done in ${prettyMs(cleanupDuration)}!`)); + logger.log(`Done in ${prettyMs(cleanupDuration)}!`); if (this.json) { const output: Record = { @@ -76,19 +76,17 @@ export class CleanCommand extends BaseCommand { // oxlint-disable-next-line no-console console.log(JSON.stringify(output, null, JSON_INDENT)); } else { - logger.log(bold('\nResults:')); + logger.log('\nResults:'); logger.log( '- size reduced:', - green( - prettyBytes(reducedSize || 0, { - space: true, - minimumFractionDigits: 1, - maximumFractionDigits: 2, - }) - ) + prettyBytes(reducedSize || 0, { + space: true, + minimumFractionDigits: 1, + maximumFractionDigits: 2, + }) ); - logger.log('- files removed:', green(files.length)); - logger.log('- empty dirs removed:', green(removedEmptyDirs || 0)); + logger.log('- files removed:', files.length); + logger.log('- empty dirs removed:', removedEmptyDirs || 0); } } } diff --git a/src/cli/utils/terminal.ts b/src/cli/utils/terminal.ts index f386273..23ad8ca 100644 --- a/src/cli/utils/terminal.ts +++ b/src/cli/utils/terminal.ts @@ -1,5 +1,4 @@ import readline from 'node:readline'; -import supportsColor from 'supports-color'; type DisabledConsole = Console; @@ -38,19 +37,3 @@ export function yesOrNo(query: string): Promise { }); }); } - -/** - * Simple string colorizer factory. - */ -function colorizer(colorCode: string): (text: string | number) => string { - if (!supportsColor.stdout) { - // oxlint-disable-next-line unicorn/prefer-native-coercion-functions - return text => String(text); - } - - return text => `\u001B[${colorCode}m${text}\u001B[0m`; -} - -export const bold = colorizer('1'); -export const green = colorizer('32'); -export const yellow = colorizer('33'); From d428e34f2f758c4ee1e18a93a923c7cc0997cd00 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:13:39 +0200 Subject: [PATCH 20/63] fix(deps): replace pretty-bytes and pretty-ms with internal functions --- .changeset/cold-books-pay.md | 5 +++ .oxlintrc.json | 3 +- package.json | 4 +-- pnpm-lock.yaml | 26 -------------- src/cli/commands/clean.command.ts | 14 ++------ src/utils/formatting.test.ts | 59 +++++++++++++++++++++++++++++++ src/utils/formatting.ts | 57 +++++++++++++++++++++++++++++ 7 files changed, 127 insertions(+), 41 deletions(-) create mode 100644 .changeset/cold-books-pay.md create mode 100644 src/utils/formatting.test.ts create mode 100644 src/utils/formatting.ts diff --git a/.changeset/cold-books-pay.md b/.changeset/cold-books-pay.md new file mode 100644 index 0000000..db4dca3 --- /dev/null +++ b/.changeset/cold-books-pay.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Remove `pretty-bytes` and `pretty-ms` dependencies. diff --git a/.oxlintrc.json b/.oxlintrc.json index 4d63a16..5fcfd33 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -43,13 +43,14 @@ "no-duplicate-imports": ["error", { "allowSeparateTypeImports": true }], "no-implicit-coercion": "off", "no-inline-comments": "off", - "no-magic-numbers": ["error", { "ignore": [0] }], + "no-magic-numbers": ["error", { "ignore": [0, 1] }], "no-null": "off", "no-optional-chaining": "off", "no-plusplus": "off", "no-rest-spread-properties": "off", "no-ternary": "off", "no-undefined": "off", + "operator-assignment": "off", "prefer-template": "off", "prefer-ternary": "off", "promise/avoid-new": "off", diff --git a/package.json b/package.json index 31b8830..16534ec 100644 --- a/package.json +++ b/package.json @@ -53,9 +53,7 @@ }, "dependencies": { "clipanion": "^3.2.1", - "picomatch": "^4.0.2", - "pretty-bytes": "^6.1.1", - "pretty-ms": "^9.1.0" + "picomatch": "^4.0.2" }, "devDependencies": { "@changesets/cli": "2.31.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e4e66f..5c5a92f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,12 +14,6 @@ importers: picomatch: specifier: ^4.0.2 version: 4.0.4 - pretty-bytes: - specifier: ^6.1.1 - version: 6.1.1 - pretty-ms: - specifier: ^9.1.0 - version: 9.3.0 devDependencies: '@changesets/cli': specifier: 2.31.0 @@ -1259,10 +1253,6 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1302,14 +1292,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} @@ -2675,8 +2657,6 @@ snapshots: dependencies: quansync: 0.2.11 - parse-ms@4.0.0: {} - path-exists@4.0.0: {} path-key@3.1.1: {} @@ -2701,12 +2681,6 @@ snapshots: prettier@2.8.8: {} - pretty-bytes@6.1.1: {} - - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 - quansync@0.2.11: {} quansync@1.0.0: {} diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index d612b1e..3b8ed35 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -1,7 +1,6 @@ import { Command, Option } from 'clipanion'; -import prettyBytes from 'pretty-bytes'; -import prettyMs from 'pretty-ms'; import { clean } from '../../clean.js'; +import { formatBytes, formatMs } from '../../utils/formatting.js'; import { BaseCommand } from '../helpers/base.command.js'; import { makeLogger, yesOrNo } from '../utils/terminal.js'; @@ -62,7 +61,7 @@ export class CleanCommand extends BaseCommand { }); const cleanupDuration = Date.now() - cleanupStart; - logger.log(`Done in ${prettyMs(cleanupDuration)}!`); + logger.log(`Done in ${formatMs(cleanupDuration)}!`); if (this.json) { const output: Record = { @@ -77,14 +76,7 @@ export class CleanCommand extends BaseCommand { console.log(JSON.stringify(output, null, JSON_INDENT)); } else { logger.log('\nResults:'); - logger.log( - '- size reduced:', - prettyBytes(reducedSize || 0, { - space: true, - minimumFractionDigits: 1, - maximumFractionDigits: 2, - }) - ); + logger.log('- size reduced:', formatBytes(reducedSize || 0)); logger.log('- files removed:', files.length); logger.log('- empty dirs removed:', removedEmptyDirs || 0); } diff --git a/src/utils/formatting.test.ts b/src/utils/formatting.test.ts new file mode 100644 index 0000000..9bbe398 --- /dev/null +++ b/src/utils/formatting.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it, vi } from 'vitest'; +import { formatBytes, formatMs } from './formatting.js'; + +vi.setConfig({ testTimeout: 5000 }); + +describe(formatBytes, () => { + it('returns 0 B for non-positive or non-finite input', () => { + expect(formatBytes(0)).toBe('0 B'); + expect(formatBytes(-1)).toBe('0 B'); + expect(formatBytes(Number.NaN)).toBe('0 B'); + expect(formatBytes(Number.POSITIVE_INFINITY)).toBe('0 B'); + }); + + it('formats values under 1 kB as B', () => { + expect(formatBytes(1)).toBe('1 B'); + expect(formatBytes(999)).toBe('999 B'); + }); + + it('uses decimal SI steps (1000) up to GB', () => { + expect(formatBytes(1000)).toBe('1 kB'); + expect(formatBytes(1500)).toBe('1.5 kB'); + expect(formatBytes(1_000_000)).toBe('1 MB'); + expect(formatBytes(1_234_567)).toBe('1.23 MB'); + expect(formatBytes(1_000_000_000)).toBe('1 GB'); + expect(formatBytes(2_500_000_000)).toBe('2.5 GB'); + }); + + it('stays on GB for very large values', () => { + expect(formatBytes(5_000_000_000_000)).toBe('5000 GB'); + }); +}); + +describe(formatMs, () => { + it('returns 0ms for non-positive or non-finite input', () => { + expect(formatMs(0)).toBe('0ms'); + expect(formatMs(-1)).toBe('0ms'); + expect(formatMs(Number.NaN)).toBe('0ms'); + expect(formatMs(Number.POSITIVE_INFINITY)).toBe('0ms'); + }); + + it('formats sub-second durations in ms', () => { + expect(formatMs(1)).toBe('1ms'); + expect(formatMs(500)).toBe('500ms'); + expect(formatMs(999)).toBe('999ms'); + }); + + it('formats under one minute in seconds', () => { + expect(formatMs(1000)).toBe('1s'); + expect(formatMs(1500)).toBe('1.5s'); + expect(formatMs(59_950)).toBe('59.95s'); + }); + + it('formats one minute and up with m / m s', () => { + expect(formatMs(60_000)).toBe('1m'); + expect(formatMs(90_000)).toBe('1m 30s'); + expect(formatMs(61_000)).toBe('1m 1s'); + expect(formatMs(125_000)).toBe('2m 5s'); + }); +}); diff --git a/src/utils/formatting.ts b/src/utils/formatting.ts new file mode 100644 index 0000000..b117290 --- /dev/null +++ b/src/utils/formatting.ts @@ -0,0 +1,57 @@ +const SI = 1000; +const SIZE_UNITS = ['B', 'kB', 'MB', 'GB'] as const; +const MAX_FRACTION_DIGITS = 2; + +/** + * Trims a number to two fraction digits and removes trailing zeros. + */ +function trimNumber(value: number): string { + return value.toFixed(MAX_FRACTION_DIGITS).replace(/\.?0+$/, ''); +} + +/** + * Formats a byte length using decimal (SI) units up to GB (e.g. `1.2 MB`). + */ +export function formatBytes(bytes: number): string { + if (!Number.isFinite(bytes) || bytes <= 0) { + return '0 B'; + } + + if (bytes < SI) { + return `${Math.round(bytes)} B`; + } + + let value = bytes / SI; + let unit = 1; + while (value >= SI && unit < SIZE_UNITS.length - 1) { + value /= SI; + unit++; + } + + return `${trimNumber(value)} ${SIZE_UNITS[unit]}`; +} + +const MS_PER_SECOND = 1000; +const SEC_PER_MINUTE = 60; +const MS_PER_MINUTE = SEC_PER_MINUTE * MS_PER_SECOND; + +/** + * Formats a duration in milliseconds up to minutes (e.g. `250ms`, `2.5s`, `1m 30s`). + */ +export function formatMs(ms: number): string { + if (!Number.isFinite(ms) || ms <= 0) { + return '0ms'; + } + + if (ms < MS_PER_SECOND) { + return `${Math.round(ms)}ms`; + } + + if (ms < MS_PER_MINUTE) { + return `${trimNumber(ms / MS_PER_SECOND)}s`; + } + + const minutes = Math.floor(ms / MS_PER_MINUTE); + const seconds = Math.floor((ms % MS_PER_MINUTE) / MS_PER_SECOND); + return seconds === 0 ? `${minutes}m` : `${minutes}m ${seconds}s`; +} From 39365df2c6d210eaf659d8df8afe39a0d946b0ac Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:14:32 +0200 Subject: [PATCH 21/63] chore(test): split test and test:watch commands --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 16534ec..96f2333 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,8 @@ "cli": "node bin/cli.js", "build": "tsdown", "dev": "tsdown --sourcemap true --watch", - "test": "vitest", + "test": "vitest run", + "test:watch": "vitest --watch", "prepublishOnly": "pnpm build", "stylecheck": "oxfmt --check src && oxlint src", "typecheck": "tsc --noEmit", From 4f6266a39f72a9a179b6c45f40e7e1082e7dec30 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:17:38 +0200 Subject: [PATCH 22/63] chore: simplify logger --- src/cli/commands/clean.command.ts | 4 ++-- src/cli/utils/terminal.ts | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 3b8ed35..8b53a28 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -2,7 +2,7 @@ import { Command, Option } from 'clipanion'; import { clean } from '../../clean.js'; import { formatBytes, formatMs } from '../../utils/formatting.js'; import { BaseCommand } from '../helpers/base.command.js'; -import { makeLogger, yesOrNo } from '../utils/terminal.js'; +import { makeSimpleLogger, yesOrNo } from '../utils/terminal.js'; const JSON_INDENT = 2; @@ -34,7 +34,7 @@ export class CleanCommand extends BaseCommand { }); async execute(): Promise { - const logger = makeLogger({ disabled: this.json || this.silent }); + const logger = makeSimpleLogger({ disabled: this.json || this.silent }); logger.log(`clean-modules${this.dryRun ? ' (dry run)' : ''}`); diff --git a/src/cli/utils/terminal.ts b/src/cli/utils/terminal.ts index 23ad8ca..f8c839c 100644 --- a/src/cli/utils/terminal.ts +++ b/src/cli/utils/terminal.ts @@ -1,6 +1,6 @@ import readline from 'node:readline'; -type DisabledConsole = Console; +type SimpleConsole = Pick; // oxlint-disable-next-line no-empty-function const noop = (): void => {}; @@ -8,17 +8,17 @@ const noop = (): void => {}; /** * Creates a conditional console logger. */ -export function makeLogger({ disabled }: { disabled: boolean }): Console | DisabledConsole { +export function makeSimpleLogger({ disabled }: { disabled: boolean }): SimpleConsole { if (disabled) { - // oxlint-disable-next-line unicorn/no-array-reduce - return Object.keys(console).reduce((disabledConsole, key) => { - // oxlint-disable-next-line typescript/no-explicit-any - disabledConsole[key as keyof Console] = noop as any; - return disabledConsole; - }, {} as DisabledConsole); + return { + log: noop, + }; } - return console; + return { + // oxlint-disable-next-line no-console + log: console.log.bind(console), + }; } /** From dfbcb41d9c742400cbb8eb4f6b6ef1531aedb4d5 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:19:51 +0200 Subject: [PATCH 23/63] chore(pnpm): remove savePrefix --- pnpm-workspace.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0477e6b..e40dcf1 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,5 +4,3 @@ allowBuilds: engineStrict: true nodeVersion: '24.13.0' - -savePrefix: '' From 61b97e7d96e124c641f9c16a0e84f7deb86bbfd2 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:51:05 +0200 Subject: [PATCH 24/63] fix(terminal): replace clipanion with citty for CLI arg parsing --- .changeset/thirty-cases-run.md | 5 ++ .oxlintrc.json | 1 + package.json | 2 +- pnpm-lock.yaml | 21 ++---- src/cli/cli.ts | 34 ++++------ src/cli/commands/analyze.command.ts | 27 ++++---- src/cli/commands/clean.command.ts | 100 ++++++++++++++++------------ src/cli/helpers/args.ts | 33 +++++++++ src/cli/helpers/base.command.ts | 21 ------ 9 files changed, 130 insertions(+), 114 deletions(-) create mode 100644 .changeset/thirty-cases-run.md create mode 100644 src/cli/helpers/args.ts delete mode 100644 src/cli/helpers/base.command.ts diff --git a/.changeset/thirty-cases-run.md b/.changeset/thirty-cases-run.md new file mode 100644 index 0000000..d1464d5 --- /dev/null +++ b/.changeset/thirty-cases-run.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Replace `clipanion` with `citty` for CLI argument parsing. diff --git a/.oxlintrc.json b/.oxlintrc.json index 5fcfd33..a8b482e 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -51,6 +51,7 @@ "no-ternary": "off", "no-undefined": "off", "operator-assignment": "off", + "prefer-await-to-then": "off", "prefer-template": "off", "prefer-ternary": "off", "promise/avoid-new": "off", diff --git a/package.json b/package.json index 96f2333..89ce41f 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "release": "changeset publish" }, "dependencies": { - "clipanion": "^3.2.1", + "citty": "^0.2.2", "picomatch": "^4.0.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c5a92f..ea7d5c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,9 @@ importers: .: dependencies: - clipanion: - specifier: ^3.2.1 - version: 3.2.1(typanion@3.14.0) + citty: + specifier: ^0.2.2 + version: 0.2.2 picomatch: specifier: ^4.0.2 version: 4.0.4 @@ -905,10 +905,8 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - clipanion@3.2.1: - resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} - peerDependencies: - typanion: '*' + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1482,9 +1480,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typanion@3.14.0: - resolution: {integrity: sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==} - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -2333,9 +2328,7 @@ snapshots: chardet@2.1.1: {} - clipanion@3.2.1(typanion@3.14.0): - dependencies: - typanion: 3.14.0 + citty@0.2.2: {} convert-source-map@2.0.0: {} @@ -2855,8 +2848,6 @@ snapshots: tslib@2.8.1: {} - typanion@3.14.0: {} - typescript@6.0.3: {} unconfig-core@7.5.0: diff --git a/src/cli/cli.ts b/src/cli/cli.ts index af7abb9..3897152 100644 --- a/src/cli/cli.ts +++ b/src/cli/cli.ts @@ -1,24 +1,18 @@ -import { createRequire } from 'node:module'; -import path from 'node:path'; -import { Builtins, Cli } from 'clipanion'; -import { fileDir } from '../utils/filesystem.js'; -import { AnalyzeCommand } from './commands/analyze.command.js'; -import { CleanCommand } from './commands/clean.command.js'; +import { defineCommand, runMain } from 'citty'; +import pkgJson from '../../package.json' with { type: 'json' }; -const [_node, _app, ...args] = process.argv; -const esmRequire = createRequire(import.meta.url); -const cliDir = fileDir(import.meta.url); -const { name, version } = esmRequire(path.resolve(cliDir, '..', '..', 'package.json')); +const { name, version, description } = pkgJson; -const cli = new Cli({ - binaryLabel: name, - binaryVersion: version, - binaryName: name, +const main = defineCommand({ + meta: { + name, + version, + description, + }, + subCommands: { + clean: () => import('./commands/clean.command').then(module => module.cleanCommand), + analyze: () => import('./commands/analyze.command').then(module => module.analyzeCommand), + }, }); -cli.register(Builtins.HelpCommand); -cli.register(Builtins.VersionCommand); -cli.register(CleanCommand); -cli.register(AnalyzeCommand); - -cli.runExit(args); +runMain(main); diff --git a/src/cli/commands/analyze.command.ts b/src/cli/commands/analyze.command.ts index c014f9b..6fc9547 100644 --- a/src/cli/commands/analyze.command.ts +++ b/src/cli/commands/analyze.command.ts @@ -1,24 +1,25 @@ +import { defineCommand } from 'citty'; import { analyze } from '../../analyze.js'; -import { BaseCommand } from '../helpers/base.command.js'; +import { sharedArgs } from '../helpers/args.js'; const JSON_INDENT = 2; -export class AnalyzeCommand extends BaseCommand { - static override paths = [['analyze']]; - static override usage = { +export const analyzeCommand = defineCommand({ + meta: { + name: 'analyze', description: 'Helps determining why a file is included by the clean command without removing any files. Extra globs can be passed as positional args.', - }; - - async execute(): Promise { + }, + args: sharedArgs, + async run({ args }): Promise { const analyzeResults = await analyze({ - directory: this.directory, - globs: this.globs, - noDefaults: this.noDefaults, - globFile: this.globFile, + directory: args.directory, + noDefaults: args['no-defaults'], + globFile: args['glob-file'], + globs: args._, }); // oxlint-disable-next-line no-console console.log(JSON.stringify(analyzeResults, null, JSON_INDENT)); - } -} + }, +}); diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 8b53a28..b0d2f99 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -1,45 +1,57 @@ -import { Command, Option } from 'clipanion'; +import { defineCommand } from 'citty'; import { clean } from '../../clean.js'; import { formatBytes, formatMs } from '../../utils/formatting.js'; -import { BaseCommand } from '../helpers/base.command.js'; +import { sharedArgs } from '../helpers/args.js'; import { makeSimpleLogger, yesOrNo } from '../utils/terminal.js'; const JSON_INDENT = 2; -export class CleanCommand extends BaseCommand { - static override paths = [['clean'], Command.Default]; - static override usage = { +export const cleanCommand = defineCommand({ + meta: { + name: 'clean', description: - 'Default command. Removes unnecessary files to reduce the size of your node_modules directory. Extra globs can be passed as positional args.', - }; - - keepEmpty = Option.Boolean('-k,--keep-empty', false, { - description: 'Skips removing empty folders after removing contents', - }); - - dryRun = Option.Boolean('-d,--dry-run', false, { - description: 'Logs files that would be removed without removing any files', - }); - - silent = Option.Boolean('-s,--silent', false, { - description: 'Does not log anything to console (unless --json is enabled)', - }); - - yes = Option.Boolean('-y,--yes', false, { - description: 'Skips the confirmation prompt at the start of the script', - }); - - json = Option.Boolean('-j,--json', false, { - description: 'Output results as JSON', - }); - - async execute(): Promise { - const logger = makeSimpleLogger({ disabled: this.json || this.silent }); - - logger.log(`clean-modules${this.dryRun ? ' (dry run)' : ''}`); - - if (!this.yes && !this.dryRun) { - const warning = `\nPreparing to clean node_modules at: ${this.directory}\nAre you sure you want to continue? (Y/N) `; + 'Removes unnecessary files to reduce the size of your node_modules directory. Extra globs can be passed as positional args.', + }, + args: { + ...sharedArgs, + 'keep-empty': { + type: 'boolean', + alias: ['k'], + default: false, + description: 'Skips removing empty folders after removing contents', + }, + 'dry-run': { + type: 'boolean', + alias: ['d'], + default: false, + description: 'Logs files that would be removed without removing any files', + }, + 'silent': { + type: 'boolean', + alias: ['s'], + default: false, + description: 'Does not log anything to console (unless --json is enabled)', + }, + 'json': { + type: 'boolean', + alias: ['j'], + default: false, + description: 'Output results as JSON', + }, + 'yes': { + type: 'boolean', + alias: ['y'], + default: false, + description: 'Skips the confirmation prompt at the start of the script', + }, + }, + async run({ args }): Promise { + const logger = makeSimpleLogger({ disabled: args.json || args.silent }); + + logger.log(`clean-modules${args.dryRun ? ' (dry run)' : ''}`); + + if (!args.yes && !args.dryRun) { + const warning = `\nPreparing to clean node_modules at: ${args.directory}\nAre you sure you want to continue? (Y/N) `; const confirmed = await yesOrNo(warning); if (!confirmed) { @@ -53,23 +65,23 @@ export class CleanCommand extends BaseCommand { const cleanupStart = Date.now(); const { files, reducedSize, removedEmptyDirs } = await clean({ - globs: this.globs, - noDefaults: this.noDefaults, - globFile: this.globFile, - directory: this.directory, - dryRun: this.dryRun, + globs: args._, + dryRun: args['dry-run'], + noDefaults: args['no-defaults'], + globFile: args['glob-file'], + directory: args.directory, }); const cleanupDuration = Date.now() - cleanupStart; logger.log(`Done in ${formatMs(cleanupDuration)}!`); - if (this.json) { + if (args.json) { const output: Record = { removedFiles: files.length, reducedSize, removedEmptyDirs, duration: cleanupDuration, - dryRun: this.dryRun, + dryRun: args['dry-run'], }; // oxlint-disable-next-line no-console @@ -80,5 +92,5 @@ export class CleanCommand extends BaseCommand { logger.log('- files removed:', files.length); logger.log('- empty dirs removed:', removedEmptyDirs || 0); } - } -} + }, +}); diff --git a/src/cli/helpers/args.ts b/src/cli/helpers/args.ts new file mode 100644 index 0000000..6b2670f --- /dev/null +++ b/src/cli/helpers/args.ts @@ -0,0 +1,33 @@ +import type { ArgsDef } from 'citty'; +import { sharedDefaultOptions } from '../../shared.js'; + +/** + * Shared options for all commands. + */ +export const sharedArgs = { + 'directory': { + type: 'string', + alias: ['D'], + default: sharedDefaultOptions.directory, + description: 'Path to node_modules', + valueHint: 'path', + }, + 'glob-file': { + type: 'string', + alias: ['f'], + default: sharedDefaultOptions.globFile, + description: 'Path to a custom glob file', + valueHint: 'path', + }, + 'no-defaults': { + type: 'boolean', + alias: ['n'], + default: sharedDefaultOptions.noDefaults, + description: 'Only includes/excludes globs specified by a custom glob file or CLI arguments', + }, + 'globs': { + type: 'positional', + description: 'Optional extra globs to include or exclude', + required: false, + }, +} satisfies ArgsDef; diff --git a/src/cli/helpers/base.command.ts b/src/cli/helpers/base.command.ts deleted file mode 100644 index c9ff882..0000000 --- a/src/cli/helpers/base.command.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Command, Option } from 'clipanion'; -import { sharedDefaultOptions } from '../../shared.js'; - -/** - * Shared options for all commands. - */ -export abstract class BaseCommand extends Command { - directory = Option.String('-D,--directory', sharedDefaultOptions.directory, { - description: 'Path to node_modules', - }); - - globFile = Option.String('-f,--glob-file', sharedDefaultOptions.globFile, { - description: 'Path to a custom glob file', - }); - - noDefaults = Option.Boolean('-n,--no-defaults', sharedDefaultOptions.noDefaults, { - description: 'Only includes/excludes globs specified by a custom glob file or CLI arguments', - }); - - globs = Option.Rest({ name: 'globs' }); -} From e4ab8cca634d04c8d089066b56991a11ca6c2e8d Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:53:38 +0200 Subject: [PATCH 25/63] chore(deps): remove unused @types/mock-fs --- package.json | 1 - pnpm-lock.yaml | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/package.json b/package.json index 89ce41f..bf7813e 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ }, "devDependencies": { "@changesets/cli": "2.31.0", - "@types/mock-fs": "4.13.4", "@types/node": "22.19.18", "@types/picomatch": "4.0.3", "changesets-changelog-clean": "1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea7d5c8..da526f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,9 +18,6 @@ importers: '@changesets/cli': specifier: 2.31.0 version: 2.31.0(@types/node@22.19.18) - '@types/mock-fs': - specifier: 4.13.4 - version: 4.13.4 '@types/node': specifier: 22.19.18 version: 22.19.18 @@ -809,9 +806,6 @@ packages: '@types/jsesc@2.5.1': resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} - '@types/mock-fs@4.13.4': - resolution: {integrity: sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg==} - '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -2230,10 +2224,6 @@ snapshots: '@types/jsesc@2.5.1': {} - '@types/mock-fs@4.13.4': - dependencies: - '@types/node': 22.19.18 - '@types/node@12.20.55': {} '@types/node@22.19.18': From a50825419b173e77f63afdc83832a1064a3959fb Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 10 May 2026 23:58:59 +0200 Subject: [PATCH 26/63] chore(actions): update actions and CI steps --- .github/workflows/changesets.yml | 23 +++++++++++++---------- .github/workflows/checks.yml | 30 ++++++++++++++++-------------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml index 0ec5c66..6205748 100644 --- a/.github/workflows/changesets.yml +++ b/.github/workflows/changesets.yml @@ -5,9 +5,12 @@ on: branches: - main paths-ignore: - - '.vscode/**' - - 'images/**' - - '*.md' + - ".vscode/**" + - "images/**" + - ".gitattributes" + - ".gitignore" + - "*.md" + - "LICENSE" concurrency: ${{ github.workflow }}-${{ github.ref }} @@ -21,17 +24,17 @@ jobs: runs-on: ubuntu-latest steps: - name: ๐Ÿ— Setup repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: ๐Ÿ— Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v6 with: - version: 8 + version: 11 - name: ๐Ÿ— Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: 18.x + node-version: 22.x cache: pnpm - name: ๐Ÿ“ฆ Install dependencies @@ -41,8 +44,8 @@ jobs: id: changesets uses: changesets/action@v1 with: - title: '๐Ÿ†• Upcoming release' - commit: 'chore: bump version' + title: "๐Ÿ†• Upcoming release" + commit: "chore: bump version" version: pnpm run version publish: pnpm run release env: diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index ce541c4..ba4436a 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -4,9 +4,12 @@ on: workflow_dispatch: push: paths-ignore: - - '.vscode/**' - - 'images/**' - - '*.md' + - ".vscode/**" + - "images/**" + - ".gitattributes" + - ".gitignore" + - "*.md" + - "LICENSE" permissions: contents: read @@ -19,17 +22,17 @@ jobs: contents: read steps: - name: ๐Ÿ— Setup repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: ๐Ÿ— Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v6 with: - version: 8 + version: 11 - name: ๐Ÿ— Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: 18.x + node-version: 22.x cache: pnpm - name: ๐Ÿ“ฆ Install dependencies @@ -43,23 +46,22 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - node-version: [14.x, 18.x] runs-on: ${{ matrix.os }} steps: - name: ๐Ÿ— Setup repo - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: ๐Ÿ— Setup pnpm - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v6 with: - version: 8 + version: 11 - name: ๐Ÿ— Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: 18.x + node-version: 22.x cache: pnpm - name: ๐Ÿ“ฆ Install dependencies From 695f83eda9921a23e886040329f0e546e2df6c36 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 00:12:23 +0200 Subject: [PATCH 27/63] fix(clean): ensure --keep-empty is respected --- .changeset/smooth-jeans-rescue.md | 5 +++++ src/cli/commands/clean.command.ts | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .changeset/smooth-jeans-rescue.md diff --git a/.changeset/smooth-jeans-rescue.md b/.changeset/smooth-jeans-rescue.md new file mode 100644 index 0000000..37ac91f --- /dev/null +++ b/.changeset/smooth-jeans-rescue.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Ensure `--keep-empty` is respected by `clean` command. diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index b0d2f99..4ae0d67 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -48,9 +48,9 @@ export const cleanCommand = defineCommand({ async run({ args }): Promise { const logger = makeSimpleLogger({ disabled: args.json || args.silent }); - logger.log(`clean-modules${args.dryRun ? ' (dry run)' : ''}`); + logger.log(`clean-modules${args['dryRun'] ? ' (dry run)' : ''}`); - if (!args.yes && !args.dryRun) { + if (!args.yes && !args['dryRun']) { const warning = `\nPreparing to clean node_modules at: ${args.directory}\nAre you sure you want to continue? (Y/N) `; const confirmed = await yesOrNo(warning); @@ -69,6 +69,7 @@ export const cleanCommand = defineCommand({ dryRun: args['dry-run'], noDefaults: args['no-defaults'], globFile: args['glob-file'], + keepEmpty: args['keep-empty'], directory: args.directory, }); From a45ca667e22117251d837cce1ed98b4da69b6183 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 09:49:05 +0200 Subject: [PATCH 28/63] chore(ci): add type and style checking steps --- .github/workflows/checks.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index ba4436a..4bd2ecb 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -16,7 +16,7 @@ permissions: jobs: build: - name: ๐Ÿงฑ Build + name: ๐Ÿงฑ Check and build runs-on: ubuntu-latest permissions: contents: read @@ -38,6 +38,12 @@ jobs: - name: ๐Ÿ“ฆ Install dependencies run: pnpm install + - name: ๐Ÿงน Stylecheck project + run: pnpm stylecheck + + - name: ๐Ÿงน Typecheck project + run: pnpm typecheck + - name: ๐Ÿงฑ Build project run: pnpm build From af0d78517c7a547364fb8268587f8dcebbb505d3 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 09:49:36 +0200 Subject: [PATCH 29/63] test: fix incorrect filesystem test --- src/utils/filesystem.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/filesystem.test.ts b/src/utils/filesystem.test.ts index 2782d7c..0f13030 100644 --- a/src/utils/filesystem.test.ts +++ b/src/utils/filesystem.test.ts @@ -38,8 +38,8 @@ describe('file exists', () => { it('returns false if the file does not exists', async () => { expect.hasAssertions(); - const result = await fileExists('testdir/foo'); - expect(result).toBe(true); + const result = await fileExists('testdir/bar'); + expect(result).toBe(false); }); it("throws any error that isn't ENOENT", async () => { From 561c620512f014c95ebce2962c769968691fc5c9 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 10:16:58 +0200 Subject: [PATCH 30/63] fix: remove redundant number fallbacks --- src/clean.ts | 5 +---- src/cli/commands/clean.command.ts | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/clean.ts b/src/clean.ts index dacca9d..4ec709f 100644 --- a/src/clean.ts +++ b/src/clean.ts @@ -3,8 +3,6 @@ import type { SharedOptions } from './shared.js'; import { removeEmptyDirs, removeFiles } from './utils/filesystem.js'; import { findFilesByGlobLists, getGlobLists } from './utils/glob.js'; -const ZERO_DIRS = 0; - export const defaultCleanOptions: Required = { ...sharedDefaultOptions, dryRun: false, @@ -39,8 +37,7 @@ export async function clean(options: CleanOptions = {}): Promise { const globLists = await getGlobLists({ globs, noDefaults, globFile }); const files = await findFilesByGlobLists(directory, globLists); const reducedSize = await removeFiles(files, { dryRun }); - // oxlint-disable-next-line no-magic-numbers - const removedEmptyDirs = dryRun || keepEmpty ? ZERO_DIRS : await removeEmptyDirs(files); + const removedEmptyDirs = dryRun || keepEmpty ? 0 : await removeEmptyDirs(files); return { files, reducedSize, removedEmptyDirs }; } diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 4ae0d67..c74fcfa 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -89,9 +89,9 @@ export const cleanCommand = defineCommand({ console.log(JSON.stringify(output, null, JSON_INDENT)); } else { logger.log('\nResults:'); - logger.log('- size reduced:', formatBytes(reducedSize || 0)); + logger.log('- size reduced:', formatBytes(reducedSize)); logger.log('- files removed:', files.length); - logger.log('- empty dirs removed:', removedEmptyDirs || 0); + logger.log('- empty dirs removed:', removedEmptyDirs); } }, }); From 293e1492305175e4f2ed54f434d78dc3be4c1d30 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 10:29:07 +0200 Subject: [PATCH 31/63] fix(patterns): remove risky doc/ and docs/ patterns --- .changeset/tasty-balloons-sink.md | 5 +++++ .cleanmodules-default | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 .changeset/tasty-balloons-sink.md diff --git a/.changeset/tasty-balloons-sink.md b/.changeset/tasty-balloons-sink.md new file mode 100644 index 0000000..62c1d36 --- /dev/null +++ b/.changeset/tasty-balloons-sink.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Remove potentially unsafe `doc/` and `docs/` from default patterns. diff --git a/.cleanmodules-default b/.cleanmodules-default index 36bc3c2..474ed01 100644 --- a/.cleanmodules-default +++ b/.cleanmodules-default @@ -9,10 +9,6 @@ test/ tests/ powered-test/ -# docs -docs/ -doc/ - # IDE .idea/ .vscode/ From 9ab2ba39e384fbf9a9db5d862bf01734afe680e1 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 12:13:23 +0200 Subject: [PATCH 32/63] fix(patterns): update default file patterns --- .changeset/thick-banks-sing.md | 5 ++ .cleanmodules-default | 120 ++++++++++++++++++++++++--------- 2 files changed, 93 insertions(+), 32 deletions(-) create mode 100644 .changeset/thick-banks-sing.md diff --git a/.changeset/thick-banks-sing.md b/.changeset/thick-banks-sing.md new file mode 100644 index 0000000..14a03e4 --- /dev/null +++ b/.changeset/thick-banks-sing.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Update the default file patterns. diff --git a/.cleanmodules-default b/.cleanmodules-default index 474ed01..65dcbb9 100644 --- a/.cleanmodules-default +++ b/.cleanmodules-default @@ -5,9 +5,9 @@ # test __tests__/ +__mocks__/ test/ tests/ -powered-test/ # IDE .idea/ @@ -29,9 +29,27 @@ coverage/ # git .git/ +# ai +.claude/ +.cursor/ +.copilot/ +.codeium/ +.aider/ +.windsurf/ +.bolt/ +.codex/ +.continue/ + # other website/ .husky/ +.turbo/ +.pnpm-store/ +.kotlin/ +.gradle/ +.changeset/ +.storybook/ +.devcontainer/ # # FILE EXTENSIONS @@ -49,7 +67,6 @@ website/ # docs/text *.@(md|mkd|markdown|mdown) *.todo -*.mustache *.@(adoc|asciidoc) *.DOCS @@ -57,6 +74,7 @@ website/ # include .ts files but not .d.ts \!(*.d).ts *.coffee +*.flow # compressed *.zip @@ -64,11 +82,17 @@ website/ *.rar *.tar *.tgz +*.gz +*.xz +*.bz2 # images *.@(jpg|jpeg) *.png *.gif +*.bmp +*.ico +*.webp # compiled *.h @@ -77,6 +101,8 @@ website/ *.cpp *.o *.mk +*.hh +*.cc # other *.log @@ -90,6 +116,15 @@ website/ *.vcxproj*(.*) *.orig *.rej +*.lockfile +*.lcov +*.bak +*.tmp +*.temp +*.gyp +*.gypi +*.1 +*.un~ # # FILES @@ -112,13 +147,15 @@ circle.yml # Mac OS .DS_Store +._* # Windows Desktop.ini Thumbs.db # linters -.eslintrc*(.*) +*.eslintrc*(.*) +*.eslintcache eslint.config.@(cjs|js|mjs) stylelint.config.js .stylelintrc*(.*) @@ -127,14 +164,19 @@ htmllint.js .jshintrc*(.*) .lint tslint.json -.lintignore -.jshintignore -.eslintignore - -# prettier +biome.json +.oxlintrc.@(json|jsonc) +oxlint.config.ts +.oxfmtrc.@(json|jsonc) +oxfmt.config.ts .prettierrc*(.*) prettier.config.js +# ai +.cursorrules +.clinerules +.windsurfrules + # testing \!(utils)/test.js jest.config.js @@ -142,7 +184,7 @@ karma.conf.js wallaby.js wallaby.conf.js .coveralls.yml -.airtap.yml +vitest.config.* # docs readme*(.*) @@ -154,17 +196,23 @@ contributing*(.*) notice*(.*) copying*(.*) +# docker +docker-compose.@(yml|yaml) + +# editors +*.sublime-project +*.sublime-workspace + # licenses -licen@(s|c)e -licen@(s|c)e-mit -licen@(s|c)e.txt -licen@(s|c)e-mit.txt +licen@(s|c)e* +*.licen@(s|c)e* +LICEN@(S|C)E* +*.LICEN@(S|C)E* +ThirdPartyNotice*(.*) +CopyrightNotice*(.*) # typescript -.tsbuildinfo - -# npm -.npmrc +*.tsbuildinfo # ignore files .*ignore @@ -174,39 +222,47 @@ yarn.lock .yarnclean .yarn-metadata.json +# pnpm +pnpm-lock.yaml +pnpm-workspace.yaml + # git .gitmodules .gitattributes # configs -.npmrc -.babelrc -.editorconfig -.tern-project -.flowconfig -.documentup.json -.yo-rc.json +*.npmrc +*.nvmrc +*.babelrc +*.editorconfig +*.flowconfig +*.yo-rc.json _config.yml bower.json renovate.json .vimrc*(.*) -.zuul.yml .istanbul.yml .nycrc -.jscsrc +jsconfig.json +tsconfig.json +turbo.json +nx.json +deno.@(json|jsonc) # versioning .bmp.yml .release-it.@(cjs|js|json|toml|ts|yaml|yml) +# lint-staged +lint-staged.config.* +.lintstagedrc*(.*) + # other .dir-locals.el -binding.gyp -cakefile -component.json composer.json -contributors -.jamignore .codecov.yml pom.xml -OSSMETADATA +.browserslistrc +.browserslist +.node-version +.tool-versions From bc65618725939650805dbee32a1845856a5360c6 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 13:48:03 +0200 Subject: [PATCH 33/63] feat: surface unlink and crawl failures to the user --- .changeset/analyze-shape-shift.md | 23 ++ .changeset/silent-errors-speak.md | 12 + src/__snapshots__/analyze.test.ts.snap | 352 +++++++++++++------------ src/analyze.ts | 23 +- src/clean.test.ts | 8 + src/clean.ts | 20 +- src/cli/commands/analyze.command.ts | 4 +- src/cli/commands/clean.command.ts | 39 ++- src/index.ts | 2 +- src/shared.ts | 15 ++ src/utils/filesystem.test.ts | 138 +++++++++- src/utils/filesystem.ts | 144 +++++++--- src/utils/glob.test.ts | 54 +++- src/utils/glob.ts | 31 ++- 14 files changed, 621 insertions(+), 244 deletions(-) create mode 100644 .changeset/analyze-shape-shift.md create mode 100644 .changeset/silent-errors-speak.md diff --git a/.changeset/analyze-shape-shift.md b/.changeset/analyze-shape-shift.md new file mode 100644 index 0000000..96422a8 --- /dev/null +++ b/.changeset/analyze-shape-shift.md @@ -0,0 +1,23 @@ +--- +'clean-modules': major +--- + +**BREAKING** `analyze()` now returns `{ files, failures }` instead of an array of per-file results. + +The previous per-file type was renamed from `AnalyzeResult` to `AnalyzedFile`, and `AnalyzeResult` now refers to the top-level `{ files: AnalyzedFile[], failures: CleanFailure[] }` shape. This mirrors the structure of `CleanResult` and lets `analyze` report the same crawl failures that `clean` now surfaces. + +Migration: + +```ts +// Before +const results = await analyze(); +for (const file of results) { + /* ... */ +} + +// After +const { files } = await analyze(); +for (const file of files) { + /* ... */ +} +``` diff --git a/.changeset/silent-errors-speak.md b/.changeset/silent-errors-speak.md new file mode 100644 index 0000000..b9119fe --- /dev/null +++ b/.changeset/silent-errors-speak.md @@ -0,0 +1,12 @@ +--- +'clean-modules': minor +--- + +Surface non-fatal filesystem failures instead of swallowing them silently. + +- `CleanResult` now includes: + - `failures: CleanFailure[]` describing files that could not be processed (e.g. `EACCES`, `EBUSY`). + - `removedFilesCount: number` reflecting the number of files actually removed. Previously `files.length` was used as a stand-in even when some removals failed. +- The CLI prints a summary of failures (up to 10 by default) below the usual results; the full list is included in `--json` output. +- New `--fail-on-error` flag exits with a non-zero status code when any failure is recorded. Exit code stays `0` by default, matching prior behavior. +- `ENOENT` during `stat`, `unlink`, or `readdir` is still treated as a no-op since the file or directory is already gone. Other errors are now captured rather than silently dropped. diff --git a/src/__snapshots__/analyze.test.ts.snap b/src/__snapshots__/analyze.test.ts.snap index 9b950ce..d12cfd2 100644 --- a/src/__snapshots__/analyze.test.ts.snap +++ b/src/__snapshots__/analyze.test.ts.snap @@ -1,187 +1,191 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`analyze > accepts custom globs 1`] = ` -[ - { - "filePath": "/node_modules/dep1/.npmrc", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - ], - }, - { - "filePath": "/node_modules/dep2/CHANGELOG.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - { - "derived": "/node_modules/**/changelog*(.*)", - "original": "changelog*(.*)", - }, - ], - }, - { - "filePath": "/node_modules/dep4/nonDefaultFile.ext", - "includedByDefault": false, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**/nonDefaultFile.ext", - "original": "**/nonDefaultFile.ext", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test1.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test2.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/a-dir/doc.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - ], - }, -] +{ + "failures": [], + "files": [ + { + "filePath": "/node_modules/dep1/.npmrc", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.npmrc", + "original": "*.npmrc", + }, + ], + }, + { + "filePath": "/node_modules/dep2/CHANGELOG.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + { + "derived": "/node_modules/**/changelog*(.*)", + "original": "changelog*(.*)", + }, + ], + }, + { + "filePath": "/node_modules/dep4/nonDefaultFile.ext", + "includedByDefault": false, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**/nonDefaultFile.ext", + "original": "**/nonDefaultFile.ext", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test1.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test2.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/a-dir/doc.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + ], + }, + ], +} `; exports[`analyze > allows skipping default globs 1`] = ` -[ - { - "filePath": "/node_modules/dep4/nonDefaultFile.ext", - "includedByDefault": false, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**/nonDefaultFile.ext", - "original": "**/nonDefaultFile.ext", - }, - ], - }, -] +{ + "failures": [], + "files": [ + { + "filePath": "/node_modules/dep4/nonDefaultFile.ext", + "includedByDefault": false, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**/nonDefaultFile.ext", + "original": "**/nonDefaultFile.ext", + }, + ], + }, + ], +} `; exports[`analyze > returns information about the files that would be removed 1`] = ` -[ - { - "filePath": "/node_modules/dep1/.npmrc", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - { - "derived": "/node_modules/**/.npmrc", - "original": ".npmrc", - }, - ], - }, - { - "filePath": "/node_modules/dep2/CHANGELOG.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - { - "derived": "/node_modules/**/changelog*(.*)", - "original": "changelog*(.*)", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test1.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/__tests__/test2.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/__tests__/**", - "original": "__tests__/", - }, - ], - }, - { - "filePath": "/node_modules/dep1/a-dir/doc.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", - "original": "*.@(md|mkd|markdown|mdown)", - }, - ], - }, -] +{ + "failures": [], + "files": [ + { + "filePath": "/node_modules/dep1/.npmrc", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.npmrc", + "original": "*.npmrc", + }, + ], + }, + { + "filePath": "/node_modules/dep2/CHANGELOG.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + { + "derived": "/node_modules/**/changelog*(.*)", + "original": "changelog*(.*)", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test1.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/__tests__/test2.js", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/__tests__/**", + "original": "__tests__/", + }, + ], + }, + { + "filePath": "/node_modules/dep1/a-dir/doc.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/*.@(md|mkd|markdown|mdown)", + "original": "*.@(md|mkd|markdown|mdown)", + }, + ], + }, + ], +} `; exports[`analyze > uses custom glob file if provided 1`] = ` -[ - { - "filePath": "/node_modules/dep2/CHANGELOG.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**.md", - "original": "**.md", - }, - ], - }, - { - "filePath": "/node_modules/dep4/nonDefaultFile.ext", - "includedByDefault": false, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**/nonDefaultFile.ext", - "original": "**/nonDefaultFile.ext", - }, - ], - }, - { - "filePath": "/node_modules/dep1/a-dir/doc.md", - "includedByDefault": true, - "includedByGlobs": [ - { - "derived": "/node_modules/**/**.md", - "original": "**.md", - }, - ], - }, -] +{ + "failures": [], + "files": [ + { + "filePath": "/node_modules/dep2/CHANGELOG.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**.md", + "original": "**.md", + }, + ], + }, + { + "filePath": "/node_modules/dep4/nonDefaultFile.ext", + "includedByDefault": false, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**/nonDefaultFile.ext", + "original": "**/nonDefaultFile.ext", + }, + ], + }, + { + "filePath": "/node_modules/dep1/a-dir/doc.md", + "includedByDefault": true, + "includedByGlobs": [ + { + "derived": "/node_modules/**/**.md", + "original": "**.md", + }, + ], + }, + ], +} `; diff --git a/src/analyze.ts b/src/analyze.ts index 0d40ef1..e91e19a 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -1,4 +1,4 @@ -import type { SharedOptions } from './shared.js'; +import type { CleanFailure, SharedOptions } from './shared.js'; import { sharedDefaultOptions } from './shared.js'; import { findFilesByGlobLists, @@ -17,7 +17,7 @@ export type GlobVersions = { derived: string; }; -export type AnalyzeResult = { +export type AnalyzedFile = { /** The absolute path to the file. */ filePath: string; /** Whether the file was included by clean-modules' default globs. */ @@ -26,20 +26,27 @@ export type AnalyzeResult = { includedByGlobs: GlobVersions[]; }; +export type AnalyzeResult = { + /** Files that would be cleaned up by the corresponding `clean` call. */ + files: AnalyzedFile[]; + /** Non-fatal failures encountered while crawling the directory tree. */ + failures: CleanFailure[]; +}; + export type AnalyzeOptions = SharedOptions; /** * Helps determining why a file is included by the `clean` operation without removing any files. Extra globs can be passed as positional args. * @param options analyze options - * @returns list of files that were included by the clean operation and what globs they were included by + * @returns analyzed files alongside any crawl failures */ -export async function analyze(options: AnalyzeOptions = {}): Promise { +export async function analyze(options: AnalyzeOptions = {}): Promise { const mergedOptions = { ...sharedDefaultOptions, ...options }; const { globs, noDefaults, globFile, directory } = mergedOptions; const nodeModulesPath = directory || sharedDefaultOptions.directory; const globLists = await getGlobLists({ globs, noDefaults, globFile }); - const includedFiles = await findFilesByGlobLists(nodeModulesPath, globLists); + const { files: includedFiles, failures } = await findFilesByGlobLists(nodeModulesPath, globLists); const defaultGlobs = toAbsoluteGlobLists(optimizeGlobLists(await parseDefaultGlobsFile()), nodeModulesPath); @@ -53,9 +60,9 @@ export async function analyze(options: AnalyzeOptions = {}): Promise { + const analyzedFiles: AnalyzedFile[] = includedFiles.map(filePath => { const includedByDefault = includedByDefaultMatcher(filePath); - const includedByGlobs: { original: string; derived: string }[] = []; + const includedByGlobs: GlobVersions[] = []; for (const { original, derived, matcher } of globMatchers) { if (matcher(filePath)) { @@ -66,5 +73,5 @@ export async function analyze(options: AnalyzeOptions = {}): Promise { const result = await clean(); expect(result).toMatchInlineSnapshot(` { + "failures": [], "files": [ "/node_modules/dep1/.npmrc", "/node_modules/dep2/CHANGELOG.md", @@ -27,6 +28,7 @@ describe(clean, () => { ], "reducedSize": 5, "removedEmptyDirs": 3, + "removedFilesCount": 5, } `); }); @@ -37,6 +39,7 @@ describe(clean, () => { const result = await clean({ globs: ['**/nonDefaultFile.ext'] }); expect(result).toMatchInlineSnapshot(` { + "failures": [], "files": [ "/node_modules/dep1/.npmrc", "/node_modules/dep2/CHANGELOG.md", @@ -47,6 +50,7 @@ describe(clean, () => { ], "reducedSize": 6, "removedEmptyDirs": 4, + "removedFilesCount": 6, } `); }); @@ -57,11 +61,13 @@ describe(clean, () => { const result = await clean({ noDefaults: true, globs: ['**/nonDefaultFile.ext'] }); expect(result).toMatchInlineSnapshot(` { + "failures": [], "files": [ "/node_modules/dep4/nonDefaultFile.ext", ], "reducedSize": 1, "removedEmptyDirs": 1, + "removedFilesCount": 1, } `); }); @@ -75,6 +81,7 @@ describe(clean, () => { const result = await clean({ noDefaults: true, globFile: customGlobFile }); expect(result).toMatchInlineSnapshot(` { + "failures": [], "files": [ "/node_modules/dep2/CHANGELOG.md", "/node_modules/dep4/nonDefaultFile.ext", @@ -82,6 +89,7 @@ describe(clean, () => { ], "reducedSize": 3, "removedEmptyDirs": 2, + "removedFilesCount": 3, } `); }); diff --git a/src/clean.ts b/src/clean.ts index 4ec709f..557afef 100644 --- a/src/clean.ts +++ b/src/clean.ts @@ -1,5 +1,5 @@ +import type { CleanFailure, SharedOptions } from './shared.js'; import { sharedDefaultOptions } from './shared.js'; -import type { SharedOptions } from './shared.js'; import { removeEmptyDirs, removeFiles } from './utils/filesystem.js'; import { findFilesByGlobLists, getGlobLists } from './utils/glob.js'; @@ -10,12 +10,16 @@ export const defaultCleanOptions: Required = { }; export type CleanResult = { - /** List of all files that were cleaned up. */ + /** List of all files matched for cleanup. */ files: string[]; + /** Number of files that were removed. */ + removedFilesCount: number; /** How many bytes of data that was removed when cleaning. */ reducedSize: number; /** The number of empty directories that were cleaned up after the operation. */ removedEmptyDirs: number; + /** Non-fatal failures encountered while crawling or removing files. */ + failures: CleanFailure[]; }; export type CleanOptions = SharedOptions & { @@ -35,9 +39,15 @@ export async function clean(options: CleanOptions = {}): Promise { const { globs, noDefaults, globFile, directory, dryRun, keepEmpty } = mergedOptions; const globLists = await getGlobLists({ globs, noDefaults, globFile }); - const files = await findFilesByGlobLists(directory, globLists); - const reducedSize = await removeFiles(files, { dryRun }); + const { files, failures: crawlFailures } = await findFilesByGlobLists(directory, globLists); + const { removedFilesCount, reducedSize, failures: removeFailures } = await removeFiles(files, { dryRun }); const removedEmptyDirs = dryRun || keepEmpty ? 0 : await removeEmptyDirs(files); - return { files, reducedSize, removedEmptyDirs }; + return { + files, + removedFilesCount, + reducedSize, + removedEmptyDirs, + failures: [...crawlFailures, ...removeFailures], + }; } diff --git a/src/cli/commands/analyze.command.ts b/src/cli/commands/analyze.command.ts index 6fc9547..b1e5807 100644 --- a/src/cli/commands/analyze.command.ts +++ b/src/cli/commands/analyze.command.ts @@ -12,7 +12,7 @@ export const analyzeCommand = defineCommand({ }, args: sharedArgs, async run({ args }): Promise { - const analyzeResults = await analyze({ + const analyzeResult = await analyze({ directory: args.directory, noDefaults: args['no-defaults'], globFile: args['glob-file'], @@ -20,6 +20,6 @@ export const analyzeCommand = defineCommand({ }); // oxlint-disable-next-line no-console - console.log(JSON.stringify(analyzeResults, null, JSON_INDENT)); + console.log(JSON.stringify(analyzeResult, null, JSON_INDENT)); }, }); diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index c74fcfa..988cfdd 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -1,10 +1,17 @@ import { defineCommand } from 'citty'; import { clean } from '../../clean.js'; +import type { CleanFailure } from '../../shared.js'; import { formatBytes, formatMs } from '../../utils/formatting.js'; import { sharedArgs } from '../helpers/args.js'; import { makeSimpleLogger, yesOrNo } from '../utils/terminal.js'; const JSON_INDENT = 2; +const MAX_PRINTED_FAILURES = 5; + +function formatFailureLine(failure: CleanFailure): string { + const prefix = failure.code ? `${failure.code}: ` : ''; + return ` ${prefix}${failure.path} (${failure.phase} failed: ${failure.message})`; +} export const cleanCommand = defineCommand({ meta: { @@ -44,6 +51,11 @@ export const cleanCommand = defineCommand({ default: false, description: 'Skips the confirmation prompt at the start of the script', }, + 'fail-on-error': { + type: 'boolean', + default: false, + description: 'Exit with a non-zero status code if any file failed to be removed', + }, }, async run({ args }): Promise { const logger = makeSimpleLogger({ disabled: args.json || args.silent }); @@ -64,7 +76,7 @@ export const cleanCommand = defineCommand({ const cleanupStart = Date.now(); - const { files, reducedSize, removedEmptyDirs } = await clean({ + const { removedFilesCount, reducedSize, removedEmptyDirs, failures } = await clean({ globs: args._, dryRun: args['dry-run'], noDefaults: args['no-defaults'], @@ -78,11 +90,12 @@ export const cleanCommand = defineCommand({ if (args.json) { const output: Record = { - removedFiles: files.length, + removedFiles: removedFilesCount, reducedSize, removedEmptyDirs, duration: cleanupDuration, dryRun: args['dry-run'], + failures, }; // oxlint-disable-next-line no-console @@ -90,8 +103,28 @@ export const cleanCommand = defineCommand({ } else { logger.log('\nResults:'); logger.log('- size reduced:', formatBytes(reducedSize)); - logger.log('- files removed:', files.length); + logger.log('- files removed:', removedFilesCount); logger.log('- empty dirs removed:', removedEmptyDirs); + + if (failures.length > 0) { + logger.log('- failures:', failures.length); + + const printed = failures.slice(0, MAX_PRINTED_FAILURES); + const remaining = failures.length - printed.length; + + logger.log(`\nFailed to process ${failures.length} ${failures.length === 1 ? 'file' : 'files'}:`); + for (const failure of printed) { + logger.log(formatFailureLine(failure)); + } + if (remaining > 0) { + logger.log(` ...${remaining} more (use --json to see all)`); + } + } + } + + if (failures.length > 0 && args['fail-on-error']) { + // oxlint-disable-next-line unicorn/no-process-exit + process.exit(1); } }, }); diff --git a/src/index.ts b/src/index.ts index c68d83f..9065429 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,3 @@ export * from './analyze.js'; export * from './clean.js'; -export { type SharedOptions } from './shared.js'; +export { type CleanFailure, type CleanFailurePhase, type SharedOptions } from './shared.js'; diff --git a/src/shared.ts b/src/shared.ts index 68d5829..b4eb89b 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -20,3 +20,18 @@ export const sharedDefaultOptions: Required = { noDefaults: false, globs: [], }; + +/** Filesystem phase where a failure occurred. */ +export type CleanFailurePhase = 'readdir' | 'stat' | 'unlink'; + +/** A non-fatal filesystem failure that occurred while crawling or removing files. */ +export type CleanFailure = { + /** Absolute path that the operation was attempted against. */ + path: string; + /** Which filesystem operation failed. */ + phase: CleanFailurePhase; + /** Error code, when the underlying error exposes one (e.g. `EACCES`, `EBUSY`). */ + code?: string; + /** Human-readable error message. */ + message: string; +}; diff --git a/src/utils/filesystem.test.ts b/src/utils/filesystem.test.ts index 0f13030..e029c55 100644 --- a/src/utils/filesystem.test.ts +++ b/src/utils/filesystem.test.ts @@ -13,9 +13,18 @@ import { removeEmptyDirsUp, removeFiles, type CheckPathFunc, + type CrawlErrorHandler, type DirentAction, } from './filesystem.js'; +type NodeError = Error & { code: string }; + +function makeNodeError(message: string, code: string): NodeError { + const error = new Error(message) as NodeError; + error.code = code; + return error; +} + vi.setConfig({ testTimeout: 5000 }); describe('file exists', () => { @@ -35,10 +44,10 @@ describe('file exists', () => { expect(result).toBe(true); }); - it('returns false if the file does not exists', async () => { + it('returns false if the file does not exist', async () => { expect.hasAssertions(); - const result = await fileExists('testdir/bar'); + const result = await fileExists('testdir/nonexistent'); expect(result).toBe(false); }); @@ -91,6 +100,48 @@ describe(forEachDirentAsync, () => { expect.anything() ); }); + + it('does not call onError for ENOENT', async () => { + expect.hasAssertions(); + + const onError = vi.fn(); + await forEachDirentAsync('nonexistent', vi.fn(), onError); + + expect(onError).not.toHaveBeenCalled(); + }); + + it('does not call onError for ENOTDIR', async () => { + expect.hasAssertions(); + + const readdirSpy = vi + .spyOn(fs.promises, 'readdir') + .mockRejectedValue(makeNodeError('not a directory', 'ENOTDIR')); + const onError = vi.fn(); + + await forEachDirentAsync('testdir', vi.fn(), onError); + + expect(onError).not.toHaveBeenCalled(); + readdirSpy.mockRestore(); + }); + + it('calls onError with a failure when readdir fails with a non-ignored error', async () => { + expect.hasAssertions(); + + const readdirSpy = vi.spyOn(fs.promises, 'readdir').mockRejectedValue(makeNodeError('denied', 'EACCES')); + const onError = vi.fn(); + + await forEachDirentAsync('testdir', vi.fn(), onError); + + expect(onError).toHaveBeenCalledTimes(1); + expect(onError).toHaveBeenCalledWith({ + path: 'testdir', + phase: 'readdir', + code: 'EACCES', + message: 'denied', + }); + + readdirSpy.mockRestore(); + }); }); describe(readDirectory, () => { @@ -330,11 +381,13 @@ describe(removeFiles, () => { expect(fs.existsSync(filePaths[0])).toBe(true); expect(fs.existsSync(filePaths[1])).toBe(true); - await removeFiles(filePaths); + const result = await removeFiles(filePaths); // then they are not expect(fs.existsSync(filePaths[0])).toBe(false); expect(fs.existsSync(filePaths[1])).toBe(false); + expect(result.failures).toStrictEqual([]); + expect(result.reducedSize).toBeGreaterThan(0); }); it('does not remove files during dry runs', async () => { @@ -342,10 +395,12 @@ describe(removeFiles, () => { const filePaths = ['node_modules/dep1/__tests__/test1.js', 'node_modules/dep1/a-dir/doc.md'] as const; - await removeFiles(filePaths, { dryRun: true }); + const result = await removeFiles(filePaths, { dryRun: true }); expect(fs.existsSync(filePaths[0])).toBe(true); expect(fs.existsSync(filePaths[1])).toBe(true); + expect(result.failures).toStrictEqual([]); + expect(result.reducedSize).toBeGreaterThan(0); }); it('does not throw if path is invalid', async () => { @@ -354,4 +409,79 @@ describe(removeFiles, () => { const filePaths = ['/invalid/path/2', '/invalid/path/2']; await expect(() => removeFiles(filePaths)).not.toThrow(); }); + + it('does not record failures for files that are already gone (ENOENT)', async () => { + expect.hasAssertions(); + + const result = await removeFiles(['/invalid/path/2']); + + expect(result.failures).toStrictEqual([]); + expect(result.reducedSize).toBe(0); + }); + + it('records failures when stat fails with a non-ENOENT error', async () => { + expect.hasAssertions(); + + const filePath = 'node_modules/dep1/__tests__/test1.js'; + const statSpy = vi.spyOn(fs.promises, 'stat').mockRejectedValue(makeNodeError('denied', 'EACCES')); + + const result = await removeFiles([filePath]); + + expect(result.failures).toStrictEqual([ + { + path: filePath, + phase: 'stat', + code: 'EACCES', + message: 'denied', + }, + ]); + expect(result.reducedSize).toBe(0); + statSpy.mockRestore(); + }); + + it('records failures when unlink fails with a non-ENOENT error', async () => { + expect.hasAssertions(); + + const filePath = 'node_modules/dep1/__tests__/test1.js'; + const unlinkSpy = vi.spyOn(fs.promises, 'unlink').mockRejectedValue(makeNodeError('busy', 'EBUSY')); + + const result = await removeFiles([filePath]); + + expect(result.failures).toStrictEqual([ + { + path: filePath, + phase: 'unlink', + code: 'EBUSY', + message: 'busy', + }, + ]); + // size should not be counted when unlink fails + expect(result.reducedSize).toBe(0); + unlinkSpy.mockRestore(); + }); + + it('continues processing other files when one fails', async () => { + expect.hasAssertions(); + + const failing = 'node_modules/dep1/__tests__/test1.js'; + const succeeding = 'node_modules/dep1/__tests__/test2.js'; + + // Capture the (memfs-backed) original before installing the spy so we can pass-through. + const originalUnlink = fs.promises.unlink.bind(fs.promises); + const unlinkSpy = vi.spyOn(fs.promises, 'unlink').mockImplementation(filePath => + // oxlint-disable-next-line vitest/no-conditional-in-test + filePath === failing + ? Promise.reject(makeNodeError('busy', 'EBUSY')) + : originalUnlink(filePath as Parameters[0]) + ); + + const result = await removeFiles([failing, succeeding]); + + expect(result.failures).toHaveLength(1); + expect(result.failures[0]?.path).toBe(failing); + expect(fs.existsSync(failing)).toBe(true); + expect(fs.existsSync(succeeding)).toBe(false); + + unlinkSpy.mockRestore(); + }); }); diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index 7ff6566..4af3cb6 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -1,14 +1,34 @@ import fs, { type Dirent } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import type { CleanFailure, CleanFailurePhase } from '../shared.js'; export type DirentAction = (dirent: Dirent) => void; export type CheckPathFunc = (nextPath: string) => boolean; +export type CrawlErrorHandler = (failure: CleanFailure) => void; function hasErrorCode(error: unknown, code: string): boolean { return (error as { code?: string })?.code === code; } +/** + * Builds a `CleanFailure` from a thrown filesystem error. + */ +export function toFailure(filePath: string, phase: CleanFailurePhase, error: unknown): CleanFailure { + const err = error as { code?: string; message?: string } | undefined; + const failure: CleanFailure = { + path: filePath, + phase, + message: err?.message ?? String(error), + }; + + if (err?.code !== undefined) { + failure.code = err.code; + } + + return failure; +} + /** * Check if a file exists without throwing. */ @@ -28,14 +48,21 @@ export async function fileExists(filePath: string): Promise { /** * Asynchronously loop through each file in a directory, passing the dirents for each file to the provided action. + * ENOENT/ENOTDIR errors are treated as empty directories. Other errors are forwarded to `onError`, when provided. */ -export async function forEachDirentAsync(dirPath: string, action: DirentAction): Promise { +export async function forEachDirentAsync( + dirPath: string, + action: DirentAction, + onError?: CrawlErrorHandler +): Promise { let dirFiles: Dirent[] = []; try { dirFiles = await fs.promises.readdir(dirPath, { withFileTypes: true }); - } catch { - // do nothing + } catch (error: unknown) { + if (!hasErrorCode(error, 'ENOENT') && !hasErrorCode(error, 'ENOTDIR')) { + onError?.(toFailure(dirPath, 'readdir', error)); + } } await Promise.all(dirFiles.map(action)); @@ -76,7 +103,8 @@ export async function removeEmptyDirsUp( // oxlint-disable-next-line no-param-reassign count++; } catch { - // do nothing + // Do nothing, empty dir removal is best effort. + // A parent may become non-empty between checks, or be locked. } const parentDir = path.dirname(dirPath); @@ -109,16 +137,24 @@ export async function removeEmptyDirs(filePaths: string[]): Promise { /** * Find all files in a directory as fast as possible, without any extra checks or validations. */ -export async function crawlDirFast(filePaths: string[], dirPath: string): Promise { - await forEachDirentAsync(dirPath, async dirent => { - const nextPath = dirPath + path.sep + dirent.name; - - if (dirent.isDirectory()) { - await crawlDirFast(filePaths, nextPath); - } else { - filePaths.push(nextPath); - } - }); +export async function crawlDirFast( + filePaths: string[], + dirPath: string, + onError?: CrawlErrorHandler +): Promise { + await forEachDirentAsync( + dirPath, + async dirent => { + const nextPath = dirPath + path.sep + dirent.name; + + if (dirent.isDirectory()) { + await crawlDirFast(filePaths, nextPath, onError); + } else { + filePaths.push(nextPath); + } + }, + onError + ); } /** @@ -128,23 +164,28 @@ export async function crawlDirWithChecks( filePaths: string[], // Mutate array to avoid losing speed on spreading dirPath: string, checkDir: CheckPathFunc, - checkFile: CheckPathFunc + checkFile: CheckPathFunc, + onError?: CrawlErrorHandler ): Promise { - await forEachDirentAsync(dirPath, async nextPathDirent => { - const nextPath = dirPath + path.sep + nextPathDirent.name; + await forEachDirentAsync( + dirPath, + async nextPathDirent => { + const nextPath = dirPath + path.sep + nextPathDirent.name; - if (nextPathDirent.isDirectory()) { - if (checkDir(nextPath)) { - // If a full directory matches, include all of it. - await crawlDirFast(filePaths, nextPath); - } else { - // Keep recursively checking each directory - await crawlDirWithChecks(filePaths, nextPath, checkDir, checkFile); + if (nextPathDirent.isDirectory()) { + if (checkDir(nextPath)) { + // If a full directory matches, include all of it. + await crawlDirFast(filePaths, nextPath, onError); + } else { + // Keep recursively checking each directory + await crawlDirWithChecks(filePaths, nextPath, checkDir, checkFile, onError); + } + } else if (checkFile(nextPath)) { + filePaths.push(nextPath); } - } else if (checkFile(nextPath)) { - filePaths.push(nextPath); - } - }); + }, + onError + ); return filePaths; } @@ -153,35 +194,62 @@ export type RemoveFilesOptions = { dryRun?: boolean; }; +export type RemoveFilesResult = { + /** Number of files removed. */ + removedFilesCount: number; + /** Total size of the removed files, in bytes. */ + reducedSize: number; + /** Per-file failures encountered while stating or unlinking. */ + failures: CleanFailure[]; +}; + /** - * Removes files and returns the total size of the removed files. + * Removes files and returns the total size of the removed files alongside any per-file failures. + * + * ENOENT errors are treated as a no-op (the file already does not exist). Any other error during + * `stat` or `unlink` is captured as a {@link CleanFailure}. + * * @param filePaths the file paths to remove * @param options dryRun: if true, don't actually remove the files - * @returns the total size of the removed files */ export async function removeFiles( filePaths: string[] | readonly string[], options: RemoveFilesOptions = {} -): Promise { +): Promise { let reducedSize = 0; + const failures: CleanFailure[] = []; + let removedFilesCount = 0; await Promise.all( filePaths.map(async filePath => { + let fileStats: Awaited>; + try { - const fileStats = await fs.promises.stat(filePath); + fileStats = await fs.promises.stat(filePath); + removedFilesCount++; + } catch (error: unknown) { + if (!hasErrorCode(error, 'ENOENT')) { + failures.push(toFailure(filePath, 'stat', error)); + } + return; + } - if (!options.dryRun) { + if (!options.dryRun) { + try { await fs.promises.unlink(filePath); + } catch (error: unknown) { + if (!hasErrorCode(error, 'ENOENT')) { + failures.push(toFailure(filePath, 'unlink', error)); + } + return; } - - reducedSize += fileStats.size; - } catch { - // do nothing } + + reducedSize += fileStats.size; }) ); - return reducedSize; + return { removedFilesCount, reducedSize, failures }; } /** diff --git a/src/utils/glob.test.ts b/src/utils/glob.test.ts index cdb22d8..cd8cf71 100644 --- a/src/utils/glob.test.ts +++ b/src/utils/glob.test.ts @@ -1,3 +1,4 @@ +import fs from 'node:fs'; import path from 'node:path'; import { vol, type NestedDirectoryJSON } from 'memfs'; import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; @@ -18,6 +19,14 @@ import { type GlobLists, } from './glob.js'; +type NodeError = Error & { code: string }; + +function makeNodeError(message: string, code: string): NodeError { + const error = new Error(message) as NodeError; + error.code = code; + return error; +} + vi.setConfig({ testTimeout: 5000 }); describe(makeGlobMatcher, () => { @@ -342,11 +351,12 @@ describe(findFilesByGlobLists, () => { includedDirs: ['**/__tests__', '**/dep3'], }); - expect(result).toStrictEqual([ + expect(result.files).toStrictEqual([ path.join('node_modules', 'dep1', '__tests__', 'test1.js'), path.join('node_modules', 'dep1', '__tests__', 'test2.js'), path.join('node_modules', 'dep3', 'deeply', 'nested', 'file.ext'), ]); + expect(result.failures).toStrictEqual([]); }); it('includes files', async () => { @@ -357,10 +367,11 @@ describe(findFilesByGlobLists, () => { included: ['**/deeply/nested/file.ext', '**/dep4/**'], }); - expect(result).toStrictEqual([ + expect(result.files).toStrictEqual([ path.join('node_modules', 'dep4', 'nonDefaultFile.ext'), path.join('node_modules', 'dep3', 'deeply', 'nested', 'file.ext'), ]); + expect(result.failures).toStrictEqual([]); }); it('can exclude files and dirs by glob patterns', async () => { @@ -372,6 +383,43 @@ describe(findFilesByGlobLists, () => { excluded: ['**/test*.js'], }); - expect(result).toStrictEqual([path.join('node_modules', 'dep2', 'file.js')]); + expect(result.files).toStrictEqual([path.join('node_modules', 'dep2', 'file.js')]); + expect(result.failures).toStrictEqual([]); + }); + + it('collects crawl failures without aborting the walk', async () => { + expect.hasAssertions(); + + const failingDir = path.join('node_modules', 'dep1', '__tests__'); + + // Capture the (memfs-backed) original before installing the spy so we can pass-through. + const originalReaddir = fs.promises.readdir.bind(fs.promises); + const readdirSpy = vi.spyOn(fs.promises, 'readdir').mockImplementation(((dirPath, options) => + // oxlint-disable-next-line vitest/no-conditional-in-test + dirPath === failingDir + ? Promise.reject(makeNodeError('denied', 'EACCES')) + : originalReaddir(dirPath as never, options as never)) as typeof fs.promises.readdir); + + const result = await findFilesByGlobLists(nodeModulesPath, { + ...initGlobLists(), + included: ['**/*.js', '**/*.md'], + }); + + // file from the failing directory should be missing, but the walk should still complete + expect(result.files).toStrictEqual( + expect.arrayContaining([ + path.join('node_modules', 'dep2', 'CHANGELOG.md'), + path.join('node_modules', 'dep2', 'file.js'), + path.join('node_modules', 'dep1', 'a-dir', 'doc.md'), + ]) + ); + expect(result.failures).toHaveLength(1); + expect(result.failures[0]).toMatchObject({ + path: failingDir, + phase: 'readdir', + code: 'EACCES', + }); + + readdirSpy.mockRestore(); }); }); diff --git a/src/utils/glob.ts b/src/utils/glob.ts index 3226816..33ad517 100644 --- a/src/utils/glob.ts +++ b/src/utils/glob.ts @@ -1,8 +1,9 @@ import { promises as fsAsync } from 'node:fs'; import path from 'node:path'; import pm, { type PicomatchOptions } from 'picomatch'; +import type { CleanFailure } from '../shared.js'; import { DEFAULT_GLOBS_FILE_PATH } from '../shared.js'; -import { crawlDirWithChecks, fileExists } from './filesystem.js'; +import { type CrawlErrorHandler, crawlDirWithChecks, fileExists } from './filesystem.js'; export function initGlobLists(): GlobLists { return { excluded: [], included: [], includedDirs: [], originalIncluded: [] }; @@ -239,26 +240,44 @@ export async function getGlobLists({ noDefaults, globFile, globs }: GetGlobLists return mergedGlobLists; } +export type FindFilesResult = { + /** File paths that matched the include rules. */ + files: string[]; + /** Non-fatal failures encountered while crawling the directory tree. */ + failures: CleanFailure[]; +}; + /** * Finds all files matching the given glob lists in the given directory. + * + * Crawl errors (e.g. permission failures on a subdirectory) are collected as `failures` so the + * walk can continue and partial results are still returned. + * * @param directory the directory to search in * @param globLists the glob lists to match against - * @returns a promise that resolves to an array of matching file paths */ -export async function findFilesByGlobLists(directory: string, globLists: GlobLists): Promise { +export async function findFilesByGlobLists( + directory: string, + globLists: GlobLists +): Promise { const { included, includedDirs, excluded } = toAbsoluteGlobLists(optimizeGlobLists(globLists), directory); const picoOptions = { ignore: excluded }; const checkDir = includedDirs?.length ? makeGlobMatcher(includedDirs, picoOptions) : (): boolean => false; const checkFile = makeGlobMatcher(included, picoOptions); - let filesToRemove = await crawlDirWithChecks([], directory, checkDir, checkFile); + const failures: CleanFailure[] = []; + const onError: CrawlErrorHandler = failure => { + failures.push(failure); + }; + + let files = await crawlDirWithChecks([], directory, checkDir, checkFile, onError); if (excluded.length) { // make another pass to ensure that files included by dir globs are // matched with excluded globs too - filesToRemove = filesToRemove.filter(file => checkFile(file)); + files = files.filter(file => checkFile(file)); } - return filesToRemove; + return { files, failures }; } From e982b24c4ad6ded97ae11f4d469151871096ddb5 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 13:51:43 +0200 Subject: [PATCH 34/63] chore: formatting --- .github/workflows/changesets.yml | 16 ++++++++-------- .github/workflows/checks.yml | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml index 6205748..abd2247 100644 --- a/.github/workflows/changesets.yml +++ b/.github/workflows/changesets.yml @@ -5,12 +5,12 @@ on: branches: - main paths-ignore: - - ".vscode/**" - - "images/**" - - ".gitattributes" - - ".gitignore" - - "*.md" - - "LICENSE" + - '.vscode/**' + - 'images/**' + - '.gitattributes' + - '.gitignore' + - '*.md' + - 'LICENSE' concurrency: ${{ github.workflow }}-${{ github.ref }} @@ -44,8 +44,8 @@ jobs: id: changesets uses: changesets/action@v1 with: - title: "๐Ÿ†• Upcoming release" - commit: "chore: bump version" + title: '๐Ÿ†• Upcoming release' + commit: 'chore: bump version' version: pnpm run version publish: pnpm run release env: diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 4bd2ecb..0d1cc63 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -4,12 +4,12 @@ on: workflow_dispatch: push: paths-ignore: - - ".vscode/**" - - "images/**" - - ".gitattributes" - - ".gitignore" - - "*.md" - - "LICENSE" + - '.vscode/**' + - 'images/**' + - '.gitattributes' + - '.gitignore' + - '*.md' + - 'LICENSE' permissions: contents: read From a055bcb3fedc8fb0ea835f6b3fb5f6cf87c2e37c Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 11 May 2026 13:58:21 +0200 Subject: [PATCH 35/63] test: add tests for symlink handling with pnpm --- src/clean.test.ts | 59 ++++++++++++++++++++++++++++- src/utils/filesystem.test.ts | 73 ++++++++++++++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) diff --git a/src/clean.test.ts b/src/clean.test.ts index f4f0cc3..31ae2b6 100644 --- a/src/clean.test.ts +++ b/src/clean.test.ts @@ -1,5 +1,7 @@ +import fs from 'node:fs'; +import path from 'node:path'; import { vol } from 'memfs'; -import { vi, beforeEach, describe, expect, it } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { getMockedFileStructure } from './__test__/getMockedFileStructure.js'; import { clean } from './clean.js'; @@ -101,3 +103,58 @@ describe(clean, () => { expect(result.removedEmptyDirs).toBe(0); }); }); + +describe('symlink handling', () => { + beforeEach(() => { + vol.fromNestedJSON({ + ...fileStructure, + node_modules: { + '.pnpm': { + 'foo@1.0.0': { + node_modules: { + foo: { + '__tests__': { 'a.js': '.' }, + 'index.js': '.', + 'CHANGELOG.md': '.', + }, + }, + }, + }, + }, + }); + + vol.symlinkSync( + path.resolve('node_modules/.pnpm/foo@1.0.0/node_modules/foo'), + path.resolve('node_modules/foo') + ); + }); + + it('matches files exactly once via their real .pnpm path', async () => { + expect.hasAssertions(); + + const result = await clean(); + + const realChangelog = path.resolve('node_modules/.pnpm/foo@1.0.0/node_modules/foo/CHANGELOG.md'); + const linkedChangelog = path.resolve('node_modules/foo/CHANGELOG.md'); + + expect(result.files).toContain(realChangelog); + expect(result.files).not.toContain(linkedChangelog); + + const realTest = path.resolve('node_modules/.pnpm/foo@1.0.0/node_modules/foo/__tests__/a.js'); + expect(result.files).toContain(realTest); + + // No duplicates โ€” every matched path appears exactly once. + expect(new Set(result.files).size).toBe(result.files.length); + expect(result.failures).toStrictEqual([]); + }); + + it('leaves the symlink itself in place when its name does not match any glob', async () => { + expect.hasAssertions(); + + await clean(); + + // The symlink at node_modules/foo doesn't match any default glob, so it survives cleanup. + expect(fs.existsSync(path.resolve('node_modules/foo'))).toBe(true); + expect(fs.lstatSync(path.resolve('node_modules/foo')).isSymbolicLink()).toBe(true); + }); +}); diff --git a/src/utils/filesystem.test.ts b/src/utils/filesystem.test.ts index e029c55..8ca89d1 100644 --- a/src/utils/filesystem.test.ts +++ b/src/utils/filesystem.test.ts @@ -485,3 +485,76 @@ describe(removeFiles, () => { unlinkSpy.mockRestore(); }); }); + +describe('symlink handling', () => { + describe(crawlDirFast, () => { + beforeEach(() => { + vol.fromNestedJSON({ + root: { + realdir: { + 'file.txt': 'real', + }, + }, + }); + vol.symlinkSync(path.resolve('root/realdir'), path.resolve('root/linkdir')); + }); + + it('does not recurse into symlinks to directories', async () => { + expect.hasAssertions(); + + const filePaths: string[] = []; + await crawlDirFast(filePaths, 'root'); + + expect(filePaths).toContain(path.join('root', 'realdir', 'file.txt')); + expect(filePaths).toContain(path.join('root', 'linkdir')); + expect(filePaths).not.toContain(path.join('root', 'linkdir', 'file.txt')); + }); + }); + + describe(crawlDirWithChecks, () => { + beforeEach(() => { + vol.fromNestedJSON({ + root: { + realdir: { + 'file.txt': 'real', + }, + }, + }); + vol.symlinkSync(path.resolve('root/realdir'), path.resolve('root/linkdir')); + }); + + it('does not recurse into symlinks to directories', async () => { + expect.hasAssertions(); + + const filePaths: string[] = []; + const checkDir = vi.fn(() => false); + const checkFile = vi.fn(() => true); + + await crawlDirWithChecks(filePaths, 'root', checkDir, checkFile); + + expect(filePaths).toContain(path.join('root', 'realdir', 'file.txt')); + expect(filePaths).toContain(path.join('root', 'linkdir')); + expect(filePaths).not.toContain(path.join('root', 'linkdir', 'file.txt')); + // The symlink itself is offered to checkFile (not checkDir), so it can be matched + // by file globs but is never descended into. + expect(checkDir).toHaveBeenCalledWith(path.join('root', 'realdir')); + expect(checkDir).not.toHaveBeenCalledWith(path.join('root', 'linkdir')); + expect(checkFile).toHaveBeenCalledWith(path.join('root', 'linkdir')); + }); + }); + + describe(removeFiles, () => { + it('unlinks the symlink itself rather than its target', async () => { + expect.hasAssertions(); + + vol.fromNestedJSON({ 'target.md': 'content' }); + vol.symlinkSync(path.resolve('target.md'), path.resolve('link.md')); + + const result = await removeFiles(['link.md']); + + expect(result.failures).toStrictEqual([]); + expect(fs.existsSync('link.md')).toBe(false); + expect(fs.existsSync('target.md')).toBe(true); + }); + }); +}); From dfb87bcea37ae6916ac2404dcaf73e13583d058b Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 16:32:09 +0200 Subject: [PATCH 36/63] feat: use built-in parseArgs for CLI arg parsing --- .changeset/thirty-cases-run.md | 4 +- .oxlintrc.json | 9 ++- package.json | 3 +- pnpm-lock.yaml | 8 --- src/cli/cli.ts | 50 +++++++++---- src/cli/commands/analyze.command.ts | 33 +++++---- src/cli/commands/clean.command.ts | 67 +++++++++-------- src/cli/helpers/args.ts | 73 +++++++++++++++---- src/cli/helpers/help.ts | 108 ++++++++++++++++++++++++++++ src/cli/types.ts | 31 ++++++++ src/utils/formatting.ts | 4 ++ 11 files changed, 304 insertions(+), 86 deletions(-) create mode 100644 src/cli/helpers/help.ts create mode 100644 src/cli/types.ts diff --git a/.changeset/thirty-cases-run.md b/.changeset/thirty-cases-run.md index d1464d5..36c22b6 100644 --- a/.changeset/thirty-cases-run.md +++ b/.changeset/thirty-cases-run.md @@ -1,5 +1,5 @@ --- -'clean-modules': patch +'clean-modules': minor --- -Replace `clipanion` with `citty` for CLI argument parsing. +Replace `clipanion` built-in CLI parsing via `parseArgs`. diff --git a/.oxlintrc.json b/.oxlintrc.json index a8b482e..5010aee 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -26,6 +26,7 @@ "import/group-exports": "off", "import/no-named-export": "off", "import/no-nodejs-modules": "off", + "import/no-namespace": "off", "import/no-relative-parent-imports": "off", "import/prefer-default-export": "off", "init-declarations": "off", @@ -35,6 +36,7 @@ "jsdoc/require-returns": "off", "max-lines-per-function": "off", "max-lines": "off", + "id-length": "off", "max-params": "off", "max-statements": "off", "no-array-callback-reference": "off", @@ -43,7 +45,9 @@ "no-duplicate-imports": ["error", { "allowSeparateTypeImports": true }], "no-implicit-coercion": "off", "no-inline-comments": "off", - "no-magic-numbers": ["error", { "ignore": [0, 1] }], + "no-magic-numbers": ["error", { "ignore": [0, 1], "ignoreDefaultValues": true }], + "no-nested-ternary": "off", + "unicorn/no-nested-ternary": "off", "no-null": "off", "no-optional-chaining": "off", "no-plusplus": "off", @@ -72,7 +76,8 @@ { "files": ["src/cli/**/*.ts"], "rules": { - "new-cap": "off" + "new-cap": "off", + "no-console": "off" } }, { diff --git a/package.json b/package.json index bf7813e..4dc5f39 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "clean-modules", "version": "3.1.1", - "description": "Clean up/prune unnecessary files and reduce the size of your `node_modules` directory. Useful for CI caches or for reducing the size of serverless functions.", + "description": "Reduce the size of your `node_modules` directory.", "keywords": [ "ci", "cli-tool", @@ -53,7 +53,6 @@ "release": "changeset publish" }, "dependencies": { - "citty": "^0.2.2", "picomatch": "^4.0.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da526f2..a960dc7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,9 +8,6 @@ importers: .: dependencies: - citty: - specifier: ^0.2.2 - version: 0.2.2 picomatch: specifier: ^4.0.2 version: 4.0.4 @@ -899,9 +896,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - citty@0.2.2: - resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2318,8 +2312,6 @@ snapshots: chardet@2.1.1: {} - citty@0.2.2: {} - convert-source-map@2.0.0: {} cross-spawn@7.0.6: diff --git a/src/cli/cli.ts b/src/cli/cli.ts index 3897152..722b09a 100644 --- a/src/cli/cli.ts +++ b/src/cli/cli.ts @@ -1,18 +1,38 @@ -import { defineCommand, runMain } from 'citty'; -import pkgJson from '../../package.json' with { type: 'json' }; +import { analyzeCommand } from './commands/analyze.command.js'; +import { cleanCommand } from './commands/clean.command.js'; +import { formatHelp } from './helpers/help.js'; -const { name, version, description } = pkgJson; +const FIRST_POSITIONAL_INDEX = 2; -const main = defineCommand({ - meta: { - name, - version, - description, - }, - subCommands: { - clean: () => import('./commands/clean.command').then(module => module.cleanCommand), - analyze: () => import('./commands/analyze.command').then(module => module.analyzeCommand), - }, -}); +const firstPositional = process.argv + .slice(FIRST_POSITIONAL_INDEX) + .find(positional => !positional.startsWith('-')); -runMain(main); +switch (firstPositional) { + case cleanCommand.name: { + await cleanCommand.run(); + break; + } + + case analyzeCommand.name: { + await analyzeCommand.run(); + break; + } + + default: { + const rootCommand = { + ...cleanCommand, + renderHelp: (): string => + formatHelp({ + ...cleanCommand, + subcommands: [ + { name: `${cleanCommand.name} (default)`, description: cleanCommand.description }, + analyzeCommand, + ], + }), + }; + + await rootCommand.run(); + break; + } +} diff --git a/src/cli/commands/analyze.command.ts b/src/cli/commands/analyze.command.ts index b1e5807..0262f0f 100644 --- a/src/cli/commands/analyze.command.ts +++ b/src/cli/commands/analyze.command.ts @@ -1,25 +1,32 @@ -import { defineCommand } from 'citty'; import { analyze } from '../../analyze.js'; -import { sharedArgs } from '../helpers/args.js'; +import { formatJson } from '../../utils/formatting.js'; +import { processArgs, sharedOptions, sharedPositionals } from '../helpers/args.js'; +import { formatHelp } from '../helpers/help.js'; +import type { CommandDefinition } from '../types.js'; -const JSON_INDENT = 2; +export const analyzeCommand = { + name: 'analyze', + description: 'Analyze which files are cleaned up or not.', -export const analyzeCommand = defineCommand({ - meta: { - name: 'analyze', - description: - 'Helps determining why a file is included by the clean command without removing any files. Extra globs can be passed as positional args.', + allowPositionals: true, + positionals: sharedPositionals, + options: sharedOptions, + + renderHelp(): string { + return formatHelp(this as typeof analyzeCommand); }, - args: sharedArgs, - async run({ args }): Promise { + + async run(): Promise { + const { values: args, positionals: globs } = processArgs(this as typeof analyzeCommand); + const analyzeResult = await analyze({ + globs, directory: args.directory, noDefaults: args['no-defaults'], globFile: args['glob-file'], - globs: args._, }); // oxlint-disable-next-line no-console - console.log(JSON.stringify(analyzeResult, null, JSON_INDENT)); + console.log(formatJson(analyzeResult)); }, -}); +} satisfies CommandDefinition; diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 988cfdd..df4480f 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -1,11 +1,11 @@ -import { defineCommand } from 'citty'; import { clean } from '../../clean.js'; import type { CleanFailure } from '../../shared.js'; -import { formatBytes, formatMs } from '../../utils/formatting.js'; -import { sharedArgs } from '../helpers/args.js'; +import { formatBytes, formatJson, formatMs } from '../../utils/formatting.js'; +import { processArgs, sharedOptions, sharedPositionals } from '../helpers/args.js'; +import { formatHelp } from '../helpers/help.js'; +import type { CommandDefinition } from '../types.js'; import { makeSimpleLogger, yesOrNo } from '../utils/terminal.js'; -const JSON_INDENT = 2; const MAX_PRINTED_FAILURES = 5; function formatFailureLine(failure: CleanFailure): string { @@ -13,56 +13,65 @@ function formatFailureLine(failure: CleanFailure): string { return ` ${prefix}${failure.path} (${failure.phase} failed: ${failure.message})`; } -export const cleanCommand = defineCommand({ - meta: { - name: 'clean', - description: - 'Removes unnecessary files to reduce the size of your node_modules directory. Extra globs can be passed as positional args.', - }, - args: { - ...sharedArgs, +export const cleanCommand = { + name: 'clean', + description: 'Remove unnecessary files in your node_modules directory.', + extraUsageInfo: 'Extra globs can be passed as positional args.', + + allowPositionals: true, + positionals: sharedPositionals, + + options: { + ...sharedOptions, 'keep-empty': { type: 'boolean', - alias: ['k'], + short: 'k', + description: 'Skips removing empty folders after cleanup', default: false, - description: 'Skips removing empty folders after removing contents', }, 'dry-run': { type: 'boolean', - alias: ['d'], + short: 'd', + description: 'Runs clean without removing any files', default: false, - description: 'Logs files that would be removed without removing any files', }, 'silent': { type: 'boolean', - alias: ['s'], + short: 's', + description: 'Does not log anything to console', default: false, - description: 'Does not log anything to console (unless --json is enabled)', }, 'json': { type: 'boolean', - alias: ['j'], - default: false, + short: 'j', description: 'Output results as JSON', + default: false, }, 'yes': { type: 'boolean', - alias: ['y'], + short: 'y', + description: 'Skips the confirmation prompt', default: false, - description: 'Skips the confirmation prompt at the start of the script', }, 'fail-on-error': { type: 'boolean', + short: 'e', + description: 'Exit with a non-zero status code on file errors', default: false, - description: 'Exit with a non-zero status code if any file failed to be removed', }, }, - async run({ args }): Promise { + + renderHelp(): string { + return formatHelp(this as typeof cleanCommand); + }, + + async run(): Promise { + const { values: args, positionals: globs } = processArgs(this as typeof cleanCommand); const logger = makeSimpleLogger({ disabled: args.json || args.silent }); - logger.log(`clean-modules${args['dryRun'] ? ' (dry run)' : ''}`); + logger.log(`clean-modules${args['dry-run'] ? ' (dry run)' : ''}`); - if (!args.yes && !args['dryRun']) { + if (!args.yes && !args['dry-run']) { const warning = `\nPreparing to clean node_modules at: ${args.directory}\nAre you sure you want to continue? (Y/N) `; const confirmed = await yesOrNo(warning); @@ -77,7 +86,7 @@ export const cleanCommand = defineCommand({ const cleanupStart = Date.now(); const { removedFilesCount, reducedSize, removedEmptyDirs, failures } = await clean({ - globs: args._, + globs, dryRun: args['dry-run'], noDefaults: args['no-defaults'], globFile: args['glob-file'], @@ -99,7 +108,7 @@ export const cleanCommand = defineCommand({ }; // oxlint-disable-next-line no-console - console.log(JSON.stringify(output, null, JSON_INDENT)); + console.log(formatJson(output)); } else { logger.log('\nResults:'); logger.log('- size reduced:', formatBytes(reducedSize)); @@ -127,4 +136,4 @@ export const cleanCommand = defineCommand({ process.exit(1); } }, -}); +} satisfies CommandDefinition; diff --git a/src/cli/helpers/args.ts b/src/cli/helpers/args.ts index 6b2670f..15dd72d 100644 --- a/src/cli/helpers/args.ts +++ b/src/cli/helpers/args.ts @@ -1,33 +1,76 @@ -import type { ArgsDef } from 'citty'; +import { parseArgs } from 'node:util'; import { sharedDefaultOptions } from '../../shared.js'; +import type { CommandDefinition, OptionDescriptors, ParsedArgs } from '../types.js'; +import { formatHelp, VERSION } from './help.js'; -/** - * Shared options for all commands. - */ -export const sharedArgs = { +/** Shared positionals for all commands. */ +export const sharedPositionals = { + globs: { + multiple: true, + required: false, + }, +}; + +/** Shared options for all commands. */ +export const sharedOptions = { + 'help': { + type: 'boolean', + short: 'h', + description: 'Show help', + }, + 'version': { + type: 'boolean', + short: 'v', + description: 'Show version', + }, 'directory': { type: 'string', - alias: ['D'], + short: 'D', default: sharedDefaultOptions.directory, + defaultHint: '$PWD', description: 'Path to node_modules', valueHint: 'path', }, 'glob-file': { type: 'string', - alias: ['f'], + short: 'f', default: sharedDefaultOptions.globFile, description: 'Path to a custom glob file', valueHint: 'path', }, 'no-defaults': { type: 'boolean', - alias: ['n'], + short: 'n', default: sharedDefaultOptions.noDefaults, - description: 'Only includes/excludes globs specified by a custom glob file or CLI arguments', + description: 'Skips default glob patterns from being used', }, - 'globs': { - type: 'positional', - description: 'Optional extra globs to include or exclude', - required: false, - }, -} satisfies ArgsDef; +} satisfies OptionDescriptors; + +export function processArgs(command: T): ParsedArgs { + let parsed: ParsedArgs; + try { + parsed = parseArgs(command); + } catch (error: unknown) { + const msg = error instanceof Error ? error.message : String(error); + console.error(`${msg}\n\nRun with --help for usage.`); + // oxlint-disable-next-line unicorn/no-process-exit + process.exit(1); + } + + const values = parsed.values as { help?: boolean; version?: boolean }; + + if (values.version) { + console.log(VERSION); + // oxlint-disable-next-line unicorn/no-process-exit + process.exit(0); + } + + if (values.help) { + const helpText = command.renderHelp ? command.renderHelp() : formatHelp(command); + console.log(helpText); + // oxlint-disable-next-line unicorn/no-process-exit + process.exit(0); + } + + return parsed; +} diff --git a/src/cli/helpers/help.ts b/src/cli/helpers/help.ts new file mode 100644 index 0000000..04c2088 --- /dev/null +++ b/src/cli/helpers/help.ts @@ -0,0 +1,108 @@ +import pkgJson from '../../../package.json' with { type: 'json' }; +import type { CommandDefinition, OptionDescriptor, OptionDescriptors, PositionalDescriptors } from '../types'; + +export const VERSION = pkgJson.version; +const NAME = pkgJson.name; +const HOMEPAGE = pkgJson.homepage.replace('#readme', ''); + +function renderOptions(options: OptionDescriptors): string { + let longestArgNameLength = 0; + const optionItems: [string, string][] = Object.entries(options).map(([key, option]) => { + const argNames = (option as OptionDescriptor).short + ? `-${(option as OptionDescriptor).short}, --${key}` + : `--${key}`; + + const defaultText = option.defaultHint ?? option.default; + const argInfo = `${option.description}${defaultText ? ` (default: ${defaultText})` : ''}`; + + if (argNames.length > longestArgNameLength) { + longestArgNameLength = argNames.length; + } + + return [argNames, argInfo]; + }); + + return optionItems + .map(([argNames, argInfo]) => `${argNames.padEnd(longestArgNameLength)} ${argInfo}`) + .join('\n'); +} + +type CommandDescriptor = { name: string; description: string }; +type CommandDescriptors = CommandDescriptor[]; + +function renderCommands(commands: CommandDescriptors): string { + return commands.map(command => `${NAME} ${command.name}\n ${command.description}\n`).join('\n'); +} + +function renderUsage( + command: string, + positionals?: PositionalDescriptors, + hasOptions?: boolean, + extraUsageInfo?: string +): string { + let usage = `\n$ ${command}`; + + if (hasOptions) { + usage += ' [options]'; + } + + if (positionals) { + const positionalFlags = Object.entries(positionals) + .map(([name, { required, multiple }]) => { + const id = multiple ? `${name}...` : name; + return required ? `<${id}>` : `[${id}]`; + }) + .join(' '); + + usage += ` ${positionalFlags}`; + } + + if (extraUsageInfo) { + usage += `\n\n${extraUsageInfo}`; + } + + return usage; +} + +function renderHeading(heading: string, minLength = 20): string { + return `โ”โ”โ” ${heading} โ”โ”โ”${'โ”'.repeat(minLength - heading.length)}`; +} + +type FormatHelpOptions = Pick< + CommandDefinition, + 'name' | 'description' | 'options' | 'positionals' | 'extraUsageInfo' +> & { subcommands?: CommandDescriptors }; + +export function formatHelp({ + name, + description, + subcommands, + options, + positionals, + extraUsageInfo, +}: FormatHelpOptions): string { + const usageName = subcommands ? `${NAME} ` : name === NAME ? NAME : `${NAME} ${name}`; + + let help = ` +${renderHeading(`${NAME} v${VERSION}`)} +${HOMEPAGE} + +${description} + +${renderHeading('Usage')} +${renderUsage(usageName, positionals, !!options, extraUsageInfo)} + +`; + + if (subcommands) { + help += renderHeading('Commands') + '\n'; + help += renderCommands(subcommands) + '\n'; + } + + if (options) { + help += renderHeading('Options') + '\n'; + help += renderOptions(options) + '\n'; + } + + return help; +} diff --git a/src/cli/types.ts b/src/cli/types.ts new file mode 100644 index 0000000..fe26e9d --- /dev/null +++ b/src/cli/types.ts @@ -0,0 +1,31 @@ +import type { parseArgs, ParseArgsConfig, ParseArgsOptionDescriptor } from 'node:util'; + +export type OptionDescriptor = ParseArgsOptionDescriptor & { + description: string; + valueHint?: string; + defaultHint?: string; +}; + +export type OptionDescriptors = Record; + +export type PositionalDescriptor = { + required?: boolean; + multiple?: boolean; +}; + +export type PositionalDescriptors = Record; + +export type CommandDefinition< + TOptions extends OptionDescriptors = OptionDescriptors, + TPositionals extends PositionalDescriptors = PositionalDescriptors, +> = ParseArgsConfig & { + name: string; + description: string; + extraUsageInfo?: string; + options?: TOptions; + positionals?: TPositionals; + renderHelp?: () => string; + run(): Promise; +}; + +export type ParsedArgs = ReturnType>; diff --git a/src/utils/formatting.ts b/src/utils/formatting.ts index b117290..aa67847 100644 --- a/src/utils/formatting.ts +++ b/src/utils/formatting.ts @@ -55,3 +55,7 @@ export function formatMs(ms: number): string { const seconds = Math.floor((ms % MS_PER_MINUTE) / MS_PER_SECOND); return seconds === 0 ? `${minutes}m` : `${minutes}m ${seconds}s`; } + +export function formatJson(value: unknown, indent = 2): string { + return JSON.stringify(value, null, indent); +} From bbea51b56589ebaaefc6a50c5e35d5889a5d6798 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 16:34:11 +0200 Subject: [PATCH 37/63] chore: update dev dependencies --- package.json | 8 +- pnpm-lock.yaml | 421 +++++++++++++++++++++++++------------------------ 2 files changed, 217 insertions(+), 212 deletions(-) diff --git a/package.json b/package.json index 4dc5f39..32be552 100644 --- a/package.json +++ b/package.json @@ -61,15 +61,15 @@ "@types/picomatch": "4.0.3", "changesets-changelog-clean": "1.3.0", "memfs": "4.57.2", - "oxfmt": "0.48.0", - "oxlint": "1.63.0", + "oxfmt": "0.50.0", + "oxlint": "1.65.0", "oxlint-tsgolint": "0.22.1", "tsdown": "0.22.0", "typescript": "6.0.3", - "vitest": "4.1.5" + "vitest": "4.1.6" }, "engines": { "node": ">=22" }, - "packageManager": "pnpm@11.0.9" + "packageManager": "pnpm@11.1.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a960dc7..4676653 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,11 +28,11 @@ importers: specifier: 4.57.2 version: 4.57.2(tslib@2.8.1) oxfmt: - specifier: 0.48.0 - version: 0.48.0 + specifier: 0.50.0 + version: 0.50.0 oxlint: - specifier: 1.63.0 - version: 1.63.0(oxlint-tsgolint@0.22.1) + specifier: 1.65.0 + version: 1.65.0(oxlint-tsgolint@0.22.1) oxlint-tsgolint: specifier: 0.22.1 version: 0.22.1 @@ -43,8 +43,8 @@ importers: specifier: 6.0.3 version: 6.0.3 vitest: - specifier: 4.1.5 - version: 4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)) + specifier: 4.1.6 + version: 4.1.6(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)) packages: @@ -312,124 +312,124 @@ packages: '@oxc-project/types@0.129.0': resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} - '@oxfmt/binding-android-arm-eabi@0.48.0': - resolution: {integrity: sha512-uwqk+/KhQvBIpULD8SMM/zAafMRC/+DV/xsEQjkkIsJ/kLmEI/2bxonVowcYTiXqqZ/a0FEW8DPkZY3VvwELDA==} + '@oxfmt/binding-android-arm-eabi@0.50.0': + resolution: {integrity: sha512-ICXQVKrDvsWUtfx6EiVJxfWrajKTwTfRV8vz2XiMkxZeuCKJLgD4YAj6dE3BWvpqDlkVkie4VSTAtMUWO9LDXg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.48.0': - resolution: {integrity: sha512-VUCiKuXK5+McVssgHEJdrcGK7hRJzrRb36zm9/jwzMholyYt4BgXhw5Nm1V1DX6Ce717Zi/1jk432b/tgmQgtQ==} + '@oxfmt/binding-android-arm64@0.50.0': + resolution: {integrity: sha512-quwjLQFkuW6OwLHeDeIXsTzOmipQFQbqsYN9HLk2B5I01IlAQZHP1UiLIg0O7pP+dUgPD2AD7SCYA3gs6NH5/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.48.0': - resolution: {integrity: sha512-IkKp8rnIyQLW6Jt+6jragCbUVYSayk55lapiprLjIVvt4NczLyO/nwX2GgefLQ5iaBdfS8UEAFgCs/pLO6Cl0w==} + '@oxfmt/binding-darwin-arm64@0.50.0': + resolution: {integrity: sha512-ikU5umElcMi78/TNI334wtjr5WZ5F4nWa1aIDseAKKGL0W3ygxeYKkrIJ0fggWa8MOon66BmG3xCqmX1m9YAOw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.48.0': - resolution: {integrity: sha512-+aFuhsGIuvnoOjXyKVHMhPKJZR1kQkAl8QyrKoMlA7yJsSTC3N0Asl53La8TChSHhW8epToQ/Q0nvLmEmfNmLg==} + '@oxfmt/binding-darwin-x64@0.50.0': + resolution: {integrity: sha512-WT4MOYG4mv9IXrH0m60vHsJh+rRMPSOKTQmwDpwmgQ+DuW/i5dU4pqc0HDO5uclO5vjz5IFX5z/taW86LSVe/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.48.0': - resolution: {integrity: sha512-fbqzQL8FjI9gGnktI7RIo0dksDziTAYBy7xlI7jU7eID5fxLF/25fS4Xj6GydD8Y5oWHL83U4NK160QaOAxtyg==} + '@oxfmt/binding-freebsd-x64@0.50.0': + resolution: {integrity: sha512-gH0rycVXqV4juWkvLs2uPMtTyppDc7qEUVzXAxnQ7FpcSZNXqKowUgtjH8q67ngj416r8+4NnAlyR/D35zwwhQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': - resolution: {integrity: sha512-hn4i0zhAyTiB3ZHjQfYUZkDvrbVkohw1S7pySWxWUoZ87HnkDoTFThj7QTxk40hNPOTUP0vHbPRNamFIv1HBJQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.50.0': + resolution: {integrity: sha512-wL/k+o0hiTeRvi/gPzeC1L/yTHTXIeHDKWU09s2zTBmv7ma59wTm+fADNSGYxhJQDxyavQbwTf1QpW3Zj924tQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.48.0': - resolution: {integrity: sha512-R4WBD9qF3QM9hqgdAa+fBGXmquTvDUujrPQ36t2Sjk8RPOSKGHDeN7l/khr10hqbQaOq9KCgPHG9ubNET/X/RQ==} + '@oxfmt/binding-linux-arm-musleabihf@0.50.0': + resolution: {integrity: sha512-Y59FKqoUM3Gf00E395b4ixfWyJGwO2GzaZawF5MZoVWcb3f6CkWUXyao0jyOvoIxDMzMybcVRuXyG7ih/Nxweg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.48.0': - resolution: {integrity: sha512-5bVdwSwlm1M8wbYCorLOxWxUBw/8tBvHYyQNIfwWVPwOJaj5vg1APSGJQVpwJfV5VNE9PSrR91UKEpoNwHhqUA==} + '@oxfmt/binding-linux-arm64-gnu@0.50.0': + resolution: {integrity: sha512-OvXbfTjMignXWyJXg/NOFsiy996vFe8wb9tkxJaUq8ylq0XrzJg3ttavC5Tcmm6F8/GUs2r3XFJWWu9q/27uYw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.48.0': - resolution: {integrity: sha512-vCS3Fk7gFslTqE1lUE2IlroyVV7u/9SmMA/uBqDoshuck2psGWcjW0ePyPZI3rM3+qtf2pDaMVIKMHozraifuw==} + '@oxfmt/binding-linux-arm64-musl@0.50.0': + resolution: {integrity: sha512-rqmvHZm7vMa3NLYa0khwkhReCmp9tqKnF23TFZ7S5cYJLvIE4b0k8famWE7kO897/DXznJe675n5SohFBggbxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.48.0': - resolution: {integrity: sha512-gKtfFfueUClXDumyoHUbymqRf7prHejOOyzJK0eIJn93GF9JBdFHdo60TM1ZBHxkEwZvjuOgHmKtneKbEOc/Eg==} + '@oxfmt/binding-linux-ppc64-gnu@0.50.0': + resolution: {integrity: sha512-49bAdYbMSde42tzPDtuHnBWzOgmoS0PT9THCjvMnDVYMQYiHzPc2Mv5rkpBHVQOXM+PHfafJlxgK0anXSWBVvw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.48.0': - resolution: {integrity: sha512-SYt0UhOvZD/UwZz9sXq6J2uAw8o24f5VZpLB2DH01f6MevshmlgakQlZe2lwek2sZJkd07eLu7mZa0g7yeiw7Q==} + '@oxfmt/binding-linux-riscv64-gnu@0.50.0': + resolution: {integrity: sha512-VFT25/6kckkIM62KeWB2bi+xCEmC/zC+DcMaIpEfaio8ulkGDLSiTz11TyK0eqgTl3x5OklYEGDWohvAgOr8Bw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.48.0': - resolution: {integrity: sha512-JLbrwck2AopG4ud/XklZO5N+qxGC7cS7ROvXZVNfx0MCLDDL2kGOLvzuWORkVjnjAM0CMAfIMU2zNBtQbM+4dw==} + '@oxfmt/binding-linux-riscv64-musl@0.50.0': + resolution: {integrity: sha512-BBJMuNy6jjkXjUUINF5UTQqb/nvjmtJad43Gp7bab0AAURAdthhJvduR7rHpWInpWYiaMzYsdrmURNcrmpxdZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.48.0': - resolution: {integrity: sha512-mdxt5L8OQLxkQH+JVpdC/lknZNe0lX4hlO3d8+xvw2wToo+iDrid9tiGOd5bmHfUVd5wVhrUry0qlu5vq66NkQ==} + '@oxfmt/binding-linux-s390x-gnu@0.50.0': + resolution: {integrity: sha512-Xd4y+yjAYHKmryXhyUUwbyRD01iKfcvI74iE01L6p4F8SwjhZQXDshK+T8PcrPZLiFqH263P5xqJk94amjkjzQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.48.0': - resolution: {integrity: sha512-oEz1BQwMrV7OMEFx/3VPDU3n9TM0AnxpktDYXjEg5i6nTX87wo18wSfBvkl4tzAICdKtoAQAdBIl7Y7hsPlx5w==} + '@oxfmt/binding-linux-x64-gnu@0.50.0': + resolution: {integrity: sha512-Qp96rYJru7l++7mk4R+eh8qq9GFfFAMdmoN6VGoRHI8AA1XMnUIzH4u+zOcKZZwY+irHdsaBldDearwB4nOH7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.48.0': - resolution: {integrity: sha512-g2SKTTurP5mWjd8Ecait0erYqmltL4IqW1EwttM25BxM6NiTt4ubobJYMR1uox1V2QgG4UfHH10CGRvWlUixjw==} + '@oxfmt/binding-linux-x64-musl@0.50.0': + resolution: {integrity: sha512-5XLGp+yd5w2Key5LMqJO+X3XVsJKgeeUKljy32+MBF/J/JZ5m8WHl6dI5eOQOr3ixopxPiXIyDAxn3slI3UXiQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.48.0': - resolution: {integrity: sha512-CIg24VgheEpvolHL2gQuax5qcQ602bRMHrJ9g8XsQr3iVj9aSPgopigBKuMqrXsupwkrU+RQCn5cG8PgFntR6w==} + '@oxfmt/binding-openharmony-arm64@0.50.0': + resolution: {integrity: sha512-QAxwzh7+GHugCD7WuERolVs8TKQwXNIAZXAHHTecbKVc9oWBkWzOiLauQuezXS57tVcof5zhi1IjZ8tOV0htTg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.48.0': - resolution: {integrity: sha512-zeaWkcxcEULwkGF3I/HgEvcDPN8buYDrxibBUa/IFh5Vmwyge+KpLO+hEwSovW349H0O/C0Z2kaFmEzEDm00/Q==} + '@oxfmt/binding-win32-arm64-msvc@0.50.0': + resolution: {integrity: sha512-3nKN/kqClm9iCFWTwtJ9UpR5SGyExp5l3nw6uIiBt+3XitQtszin+vjHrL7JHfDksZ7Svigdaow2zqz/IKCfqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.48.0': - resolution: {integrity: sha512-yiEKnIAGvx5CyZQOlMaNlZkAbwT7/Quk0j3WLt+PR5hK+qYjPTRRJYDfD77wCBPLvEYAG41v4KG3iL0H+uxoxg==} + '@oxfmt/binding-win32-ia32-msvc@0.50.0': + resolution: {integrity: sha512-3r6XZ8+X6qlLbXaPW2NygfiAWSpKbkE36pAVzS83mY+cYY+pSMalJ+qnCgkr92tr+Iqv988XKQ1CpARTg9ITbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.48.0': - resolution: {integrity: sha512-GSD2+7t2UoVMV2NgxXypa4bKewflPMAjYnF0Xw9/ht82ZfafAHhb8STwrEd7wlH2PFogt5zw3WVCxYJaHUdbeQ==} + '@oxfmt/binding-win32-x64-msvc@0.50.0': + resolution: {integrity: sha512-BSE8D8KsvquMG9vU+Qt4qGuoOcZ36rxU5S6ZkHNguj+MlWkXWCBETnno3yJ9CfWvfCrbmieaN9LK6hdcdHNZ/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -464,124 +464,124 @@ packages: cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.63.0': - resolution: {integrity: sha512-A9xLtQt7i0OA1PoB/meog6kikXI9CdwEp7ZwQqmgnpKn3G3b1orvTDy8CQ6T7w1HvDrgWGB78PkFKcWgibcTCg==} + '@oxlint/binding-android-arm-eabi@1.65.0': + resolution: {integrity: sha512-jDVaGNURT5pEA9qcabh6WusIoBNybOMMDPCx+EFt+gxo6rVvoUf0+73Xy5x81+ZrxU+ewk5uRBYifjy5pgkcnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.63.0': - resolution: {integrity: sha512-SQo+ZMvdR9l3CxZp5W5gFNxSiDxclY6lOzzNpKYLF8asESpm3Pwumx0gER5T7aHLF1/2BAAtLD3DiDkdgy4V1A==} + '@oxlint/binding-android-arm64@1.65.0': + resolution: {integrity: sha512-v0z80IWNA7c9RhUydq9YprBxCVZrQ6Ixls2tdxUC1F/1FFqSfa7xTX+EJf0mj6+BKRg2zWXqWfcbJUnETlLlIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.63.0': - resolution: {integrity: sha512-6W82XjJDTmMnjg30427l0dufpnyLoq7wEukKdM6/g2VIybRVuQiBVh43EA4b+UxZ3+tLcKm+Or/pXGNgLCEU8g==} + '@oxlint/binding-darwin-arm64@1.65.0': + resolution: {integrity: sha512-pL/mG/5gMzBwp1gdc5+Cwi87F9j3XRnPxHGyVj5Zd+dCEV5YkKt0L70PB3EGmEEHxgn4H+jnMS3xLuXs6mZW/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.63.0': - resolution: {integrity: sha512-CnWd/YCuVG5W1BYkjJEVbJG11o526O9qAwBEQM+nh8K19CRFUkFdROXCyYkGmroHEYQe4vgQ6+lh3550Lp35Xw==} + '@oxlint/binding-darwin-x64@1.65.0': + resolution: {integrity: sha512-jVTneaeuHtqTrKYnhrdH1buhnSorinvpy1sv43ayclfWx/e/DfdRWv+h1fopJcHQbYr5WMcZMmDvnfEBkPZ+1A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.63.0': - resolution: {integrity: sha512-a4eZAqrmtajqcxfdAzC+l7g3PaE3V8hpAYqqeD3fTxLXOMFdK3eNTZrU80n4dDEVm0JXy1aL5PqvqWldBl6zYA==} + '@oxlint/binding-freebsd-x64@1.65.0': + resolution: {integrity: sha512-8lJQ7B6RloYDUhwVdbSpwT2eKsCN5KP1Scn18ly1tytCuhXhbs0nkfKHT4jWWZBJqmynWuzd+78bF7wILrj6pw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.63.0': - resolution: {integrity: sha512-tYUtU9TdbU3uXF5D62g5zXJ13iniFGhXQx5vp9cyEjGdbSAY3VdFBSaldYvyoDmgMZ0ZYuwQP1Y4t2Fhejwa0w==} + '@oxlint/binding-linux-arm-gnueabihf@1.65.0': + resolution: {integrity: sha512-EgmZY+DeWhLLEnNl70/49j3ltA8I6X9kxMfexupWi2Vwfp6RonGsBaHtGoedLolaU37ne7eDUgoxa3CFB95GZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.63.0': - resolution: {integrity: sha512-I5r3twFf776UZg9dmRo2xbrKt00tTkORXEVe0ctg4vdTkQvJAjiCHxnbAU2HL1AiJ9cqADA76MAliuilsAWnvg==} + '@oxlint/binding-linux-arm-musleabihf@1.65.0': + resolution: {integrity: sha512-OJMWmAYRVBCPPxnYr3j5sXRwHPh1bAuMlTStGco1Z8q3HkvSH4h+A10E9MiRNYmLhUuli5a2P5wmfj8cagiF5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.63.0': - resolution: {integrity: sha512-t7ltUkg6FFh4b564QyGir8xIj/QZbXu8FlcRkcyW9+ztr/mfRHlvUOFd95pJCXi9s/L5DrUeWWgpXRS+V+6igQ==} + '@oxlint/binding-linux-arm64-gnu@1.65.0': + resolution: {integrity: sha512-D8uNi50LsYKgS0vGARZDRx05TBZeSxAVdLGddSEqQLSU7xsiqdImHPEw55xq8sKA5rCc/4au/5uS7FQALWdLCg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.63.0': - resolution: {integrity: sha512-Q5mmZy/XWjuYFUuQyYjOvZ5U/JkKEwnpir6hGxhh6HcdP0V/BKxLo8dqkfF/t7r7AguB17dfS/8+go5AQDRR6g==} + '@oxlint/binding-linux-arm64-musl@1.65.0': + resolution: {integrity: sha512-IpbA8QGbwFehQhO+YaHwmoI81f93xvywpspf8HrdPCWOIeKwYfM1dhVhO4YKfZewTRRQEPY/JFjTOXTgkwhKrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.63.0': - resolution: {integrity: sha512-uBGtuZ0TzLB4x5wVa82HGNvYqY8buwDhyCnCP0R0gkk9szqVsP0MeTtD5HX7EsEuFIt+aYmYxuxeVxs3nTSwtQ==} + '@oxlint/binding-linux-ppc64-gnu@1.65.0': + resolution: {integrity: sha512-ZSe8HgaZdgyHSv2+/pTG68z10+OarB18CkFKQOhRs3lmmP/p2vuigedK2e9d0ztoG2DU/duJzhxXBSjy/492HQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.63.0': - resolution: {integrity: sha512-h4s6FwxE+9MeA181o0dnDwHP32Y/bG8EiB/vrD6Ib+AMt6haigDc/0bUtI/sLmQDBMJnUfaCmtSSrEAqjtEVrA==} + '@oxlint/binding-linux-riscv64-gnu@1.65.0': + resolution: {integrity: sha512-DcTERf++v6HyPHukKAr0JFTRqB+YeDEvqzRgNDMaz7jITPf+tlJIwRxodlAqoXMYhNVEZhXdQM5RAAYH8/oPuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.63.0': - resolution: {integrity: sha512-2EaNcCBR8Mcjl5ARtuN3BdEpVkX7KpjSjMGZ/mJMIeaXgTtdz5ytg2VwygMSStA/k0ixfvZFoZOfjDEcouV5vQ==} + '@oxlint/binding-linux-riscv64-musl@1.65.0': + resolution: {integrity: sha512-xjhMwuFJwRh40NOBzol4gM5gqAa0xPCJU+GQLM6BydV8TbfkIA7JeyCFNhyfbE9Q/5EWcKYTx62R0cRcjP7DAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.63.0': - resolution: {integrity: sha512-p4hlf/fd7TrYYl3QrWWD0GocqJefwMu3cHQhmi2FvEB/YOvFb5DZN3SMBaPi7B1TM5DeypkEtrVib674q1KKPg==} + '@oxlint/binding-linux-s390x-gnu@1.65.0': + resolution: {integrity: sha512-lrWSXb8JzboPWYBG6Kunt/eemvjo2oCFXktShsm3yMToY7HjzKLjxh7CljSvGnnZH9oohNFHOKc9xYpGKCPm6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.63.0': - resolution: {integrity: sha512-Vgq9rkRVcPcjbcH+ihYTfpeR7vCXfqpd+z5ItTGc0yYUV59L5ceHYN1iV4H9bKGV7Rn5hkVc7x3mSvHegduENA==} + '@oxlint/binding-linux-x64-gnu@1.65.0': + resolution: {integrity: sha512-A7xfghw250m4a1sPV+q44Mow2G5bhiC9FBvhAuIhJS6QovWnqzuL5AFQPEuwOB+PM4DhABkqxVa3Iwe3Y/nFlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.63.0': - resolution: {integrity: sha512-3/Lkq/ncooA61rorrC+ZQed1Bc4VpGj+WnGsp58zmxKgvZ2vhreu+dcVyr3mX8NUpq7mfZ4gDDTou/yrF1Pd7A==} + '@oxlint/binding-linux-x64-musl@1.65.0': + resolution: {integrity: sha512-reqOun1+pWO3fW6cv7bsa8hHG0TN3t/82qPdaoJo90FwugXiMjKhZMChmH5Z01cFNRHmxN4+543Fy8478cM/iA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.63.0': - resolution: {integrity: sha512-0/EdD/6hDkx5Mfd769PTjvEM8mZ/6Dfukp1dBCL/2PjlIVGEtYdNZyok6ChqYPsT9JcFnlQnUeQzO0/1L/oC9w==} + '@oxlint/binding-openharmony-arm64@1.65.0': + resolution: {integrity: sha512-KQpqOb/juDBO0xyloDkVDhOVxDUgAfZ2OAAVq99TJScJDzT319xry1QzB9LQohV9QGnA7p6m/XATZkMXc84lwA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.63.0': - resolution: {integrity: sha512-wb0CUkN8ngwPiRQBjD1Cj0LsHeNvm+Xt6YBHDMtj2DVQVD6Oj8Ri7g6BD+KICf6LaBqZlmzOvy6nF9E/8yyGOg==} + '@oxlint/binding-win32-arm64-msvc@1.65.0': + resolution: {integrity: sha512-xfqcOc3nJFeAd1kDY4T9d3XeJIhr00twaaW0kOAzGPyUHkruXtNJv6zz1Ra9fRtSek5VpW2Yoj5AcwPIlT0ZiQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.63.0': - resolution: {integrity: sha512-BX5iq+ovdNlVYhSn5qPMUIT0uwAwt2lmEnCnzK+Gkhw4DovIvhGb96OFhV8yzQNUnQxn/xGkOR+X+BLrLDNm8w==} + '@oxlint/binding-win32-ia32-msvc@1.65.0': + resolution: {integrity: sha512-JV+pXm45p8sdgs3c7LOPAohW23optCNZETFOXUcjn6cS4PYZhEU/RI54Z5dHdMudab3nw7T48PZILthM+Q0COQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.63.0': - resolution: {integrity: sha512-QeN/WELOfsXMeYwxvfgQrl6CbVftYUCZsGXHjXQd5Trccm8+i4gmtxaOui4xbJQaiDlviF8F3yLSBloQUeFsfA==} + '@oxlint/binding-win32-x64-msvc@1.65.0': + resolution: {integrity: sha512-D7L/oBbskLss21bYrRbFuIs81AiSQV+wRzwck54dOkHIlq2qu1xjLz8u6jCqGH8Fltk8bB5DLBpVhE7v/fA8XQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -812,11 +812,11 @@ packages: '@types/picomatch@4.0.3': resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.6': + resolution: {integrity: sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.6': + resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -826,20 +826,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.6': + resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.6': + resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.6': + resolution: {integrity: sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.6': + resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.6': + resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -1197,17 +1197,22 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxfmt@0.48.0: - resolution: {integrity: sha512-AVaLh+7XeGx+R1zfFV+f6VV61nT2MWVJXVUDhbTm5LBWGyNt64xAyh3NYYyjeY2WykNt9AvqSQLPHcbWquYF9g==} + oxfmt@0.50.0: + resolution: {integrity: sha512-owwjTnhfM5aCOJhYeqDvk7iM504OeYFZpdRU7cxx7xtZMo4uVpjlryTUon+Cf76CugsvnqA32e6rC73pr1hXaw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + peerDependencies: + svelte: ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true oxlint-tsgolint@0.22.1: resolution: {integrity: sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg==} hasBin: true - oxlint@1.63.0: - resolution: {integrity: sha512-9TGXetdjgIHOJ9OiReomP7nnrMkV9HxC1xM2ramJSLQpzxjsAJtQwa4wqkJN2f/uCrqZuJseFuSlWDdvcruveg==} + oxlint@1.65.0: + resolution: {integrity: sha512-ChUuE3Q7XnAbscvT4XLMsH7HFJmLgLVv9lu+RRgFL5wSXnDqUOzTp5IS8qWDBGd/ZDSzQ2tbX8fjAmijlGLC7A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1526,20 +1531,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.6: + resolution: {integrity: sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.6 + '@vitest/browser-preview': 4.1.6 + '@vitest/browser-webdriverio': 4.1.6 + '@vitest/coverage-istanbul': 4.1.6 + '@vitest/coverage-v8': 4.1.6 + '@vitest/ui': 4.1.6 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1962,61 +1967,61 @@ snapshots: '@oxc-project/types@0.129.0': {} - '@oxfmt/binding-android-arm-eabi@0.48.0': + '@oxfmt/binding-android-arm-eabi@0.50.0': optional: true - '@oxfmt/binding-android-arm64@0.48.0': + '@oxfmt/binding-android-arm64@0.50.0': optional: true - '@oxfmt/binding-darwin-arm64@0.48.0': + '@oxfmt/binding-darwin-arm64@0.50.0': optional: true - '@oxfmt/binding-darwin-x64@0.48.0': + '@oxfmt/binding-darwin-x64@0.50.0': optional: true - '@oxfmt/binding-freebsd-x64@0.48.0': + '@oxfmt/binding-freebsd-x64@0.50.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.48.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.50.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.48.0': + '@oxfmt/binding-linux-arm-musleabihf@0.50.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.48.0': + '@oxfmt/binding-linux-arm64-gnu@0.50.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.48.0': + '@oxfmt/binding-linux-arm64-musl@0.50.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.48.0': + '@oxfmt/binding-linux-ppc64-gnu@0.50.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.48.0': + '@oxfmt/binding-linux-riscv64-gnu@0.50.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.48.0': + '@oxfmt/binding-linux-riscv64-musl@0.50.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.48.0': + '@oxfmt/binding-linux-s390x-gnu@0.50.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.48.0': + '@oxfmt/binding-linux-x64-gnu@0.50.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.48.0': + '@oxfmt/binding-linux-x64-musl@0.50.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.48.0': + '@oxfmt/binding-openharmony-arm64@0.50.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.48.0': + '@oxfmt/binding-win32-arm64-msvc@0.50.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.48.0': + '@oxfmt/binding-win32-ia32-msvc@0.50.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.48.0': + '@oxfmt/binding-win32-x64-msvc@0.50.0': optional: true '@oxlint-tsgolint/darwin-arm64@0.22.1': @@ -2037,61 +2042,61 @@ snapshots: '@oxlint-tsgolint/win32-x64@0.22.1': optional: true - '@oxlint/binding-android-arm-eabi@1.63.0': + '@oxlint/binding-android-arm-eabi@1.65.0': optional: true - '@oxlint/binding-android-arm64@1.63.0': + '@oxlint/binding-android-arm64@1.65.0': optional: true - '@oxlint/binding-darwin-arm64@1.63.0': + '@oxlint/binding-darwin-arm64@1.65.0': optional: true - '@oxlint/binding-darwin-x64@1.63.0': + '@oxlint/binding-darwin-x64@1.65.0': optional: true - '@oxlint/binding-freebsd-x64@1.63.0': + '@oxlint/binding-freebsd-x64@1.65.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.63.0': + '@oxlint/binding-linux-arm-gnueabihf@1.65.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.63.0': + '@oxlint/binding-linux-arm-musleabihf@1.65.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.63.0': + '@oxlint/binding-linux-arm64-gnu@1.65.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.63.0': + '@oxlint/binding-linux-arm64-musl@1.65.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.63.0': + '@oxlint/binding-linux-ppc64-gnu@1.65.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.63.0': + '@oxlint/binding-linux-riscv64-gnu@1.65.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.63.0': + '@oxlint/binding-linux-riscv64-musl@1.65.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.63.0': + '@oxlint/binding-linux-s390x-gnu@1.65.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.63.0': + '@oxlint/binding-linux-x64-gnu@1.65.0': optional: true - '@oxlint/binding-linux-x64-musl@1.63.0': + '@oxlint/binding-linux-x64-musl@1.65.0': optional: true - '@oxlint/binding-openharmony-arm64@1.63.0': + '@oxlint/binding-openharmony-arm64@1.65.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.63.0': + '@oxlint/binding-win32-arm64-msvc@1.65.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.63.0': + '@oxlint/binding-win32-ia32-msvc@1.65.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.63.0': + '@oxlint/binding-win32-x64-msvc@1.65.0': optional: true '@quansync/fs@1.0.0': @@ -2226,44 +2231,44 @@ snapshots: '@types/picomatch@4.0.3': {} - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.6': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.0.11(@types/node@22.19.18))': + '@vitest/mocker@4.1.6(vite@8.0.11(@types/node@22.19.18))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 8.0.11(@types/node@22.19.18) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.6': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.6': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.6 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.6': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.6 + '@vitest/utils': 4.1.6 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.6': {} - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.6': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.6 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -2556,29 +2561,29 @@ snapshots: outdent@0.5.0: {} - oxfmt@0.48.0: + oxfmt@0.50.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.48.0 - '@oxfmt/binding-android-arm64': 0.48.0 - '@oxfmt/binding-darwin-arm64': 0.48.0 - '@oxfmt/binding-darwin-x64': 0.48.0 - '@oxfmt/binding-freebsd-x64': 0.48.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.48.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.48.0 - '@oxfmt/binding-linux-arm64-gnu': 0.48.0 - '@oxfmt/binding-linux-arm64-musl': 0.48.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.48.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.48.0 - '@oxfmt/binding-linux-riscv64-musl': 0.48.0 - '@oxfmt/binding-linux-s390x-gnu': 0.48.0 - '@oxfmt/binding-linux-x64-gnu': 0.48.0 - '@oxfmt/binding-linux-x64-musl': 0.48.0 - '@oxfmt/binding-openharmony-arm64': 0.48.0 - '@oxfmt/binding-win32-arm64-msvc': 0.48.0 - '@oxfmt/binding-win32-ia32-msvc': 0.48.0 - '@oxfmt/binding-win32-x64-msvc': 0.48.0 + '@oxfmt/binding-android-arm-eabi': 0.50.0 + '@oxfmt/binding-android-arm64': 0.50.0 + '@oxfmt/binding-darwin-arm64': 0.50.0 + '@oxfmt/binding-darwin-x64': 0.50.0 + '@oxfmt/binding-freebsd-x64': 0.50.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.50.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.50.0 + '@oxfmt/binding-linux-arm64-gnu': 0.50.0 + '@oxfmt/binding-linux-arm64-musl': 0.50.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.50.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.50.0 + '@oxfmt/binding-linux-riscv64-musl': 0.50.0 + '@oxfmt/binding-linux-s390x-gnu': 0.50.0 + '@oxfmt/binding-linux-x64-gnu': 0.50.0 + '@oxfmt/binding-linux-x64-musl': 0.50.0 + '@oxfmt/binding-openharmony-arm64': 0.50.0 + '@oxfmt/binding-win32-arm64-msvc': 0.50.0 + '@oxfmt/binding-win32-ia32-msvc': 0.50.0 + '@oxfmt/binding-win32-x64-msvc': 0.50.0 oxlint-tsgolint@0.22.1: optionalDependencies: @@ -2589,27 +2594,27 @@ snapshots: '@oxlint-tsgolint/win32-arm64': 0.22.1 '@oxlint-tsgolint/win32-x64': 0.22.1 - oxlint@1.63.0(oxlint-tsgolint@0.22.1): + oxlint@1.65.0(oxlint-tsgolint@0.22.1): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.63.0 - '@oxlint/binding-android-arm64': 1.63.0 - '@oxlint/binding-darwin-arm64': 1.63.0 - '@oxlint/binding-darwin-x64': 1.63.0 - '@oxlint/binding-freebsd-x64': 1.63.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.63.0 - '@oxlint/binding-linux-arm-musleabihf': 1.63.0 - '@oxlint/binding-linux-arm64-gnu': 1.63.0 - '@oxlint/binding-linux-arm64-musl': 1.63.0 - '@oxlint/binding-linux-ppc64-gnu': 1.63.0 - '@oxlint/binding-linux-riscv64-gnu': 1.63.0 - '@oxlint/binding-linux-riscv64-musl': 1.63.0 - '@oxlint/binding-linux-s390x-gnu': 1.63.0 - '@oxlint/binding-linux-x64-gnu': 1.63.0 - '@oxlint/binding-linux-x64-musl': 1.63.0 - '@oxlint/binding-openharmony-arm64': 1.63.0 - '@oxlint/binding-win32-arm64-msvc': 1.63.0 - '@oxlint/binding-win32-ia32-msvc': 1.63.0 - '@oxlint/binding-win32-x64-msvc': 1.63.0 + '@oxlint/binding-android-arm-eabi': 1.65.0 + '@oxlint/binding-android-arm64': 1.65.0 + '@oxlint/binding-darwin-arm64': 1.65.0 + '@oxlint/binding-darwin-x64': 1.65.0 + '@oxlint/binding-freebsd-x64': 1.65.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.65.0 + '@oxlint/binding-linux-arm-musleabihf': 1.65.0 + '@oxlint/binding-linux-arm64-gnu': 1.65.0 + '@oxlint/binding-linux-arm64-musl': 1.65.0 + '@oxlint/binding-linux-ppc64-gnu': 1.65.0 + '@oxlint/binding-linux-riscv64-gnu': 1.65.0 + '@oxlint/binding-linux-riscv64-musl': 1.65.0 + '@oxlint/binding-linux-s390x-gnu': 1.65.0 + '@oxlint/binding-linux-x64-gnu': 1.65.0 + '@oxlint/binding-linux-x64-musl': 1.65.0 + '@oxlint/binding-openharmony-arm64': 1.65.0 + '@oxlint/binding-win32-arm64-msvc': 1.65.0 + '@oxlint/binding-win32-ia32-msvc': 1.65.0 + '@oxlint/binding-win32-x64-msvc': 1.65.0 oxlint-tsgolint: 0.22.1 p-filter@2.1.0: @@ -2852,15 +2857,15 @@ snapshots: '@types/node': 22.19.18 fsevents: 2.3.3 - vitest@4.1.5(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)): + vitest@4.1.6(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)): dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.0.11(@types/node@22.19.18)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/expect': 4.1.6 + '@vitest/mocker': 4.1.6(vite@8.0.11(@types/node@22.19.18)) + '@vitest/pretty-format': 4.1.6 + '@vitest/runner': 4.1.6 + '@vitest/snapshot': 4.1.6 + '@vitest/spy': 4.1.6 + '@vitest/utils': 4.1.6 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 From 069ec1fa2d620793b10d39ceccf41cee2f83532e Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 16:36:17 +0200 Subject: [PATCH 38/63] chore: disable require-unicode-regexp --- .oxlintrc.json | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 5010aee..5a7a109 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -22,11 +22,12 @@ "exports-last": "off", "filename-case": ["error", { "case": "camelCase" }], "func-style": "off", + "id-length": "off", "import/consistent-type-specifier-style": "off", "import/group-exports": "off", "import/no-named-export": "off", - "import/no-nodejs-modules": "off", "import/no-namespace": "off", + "import/no-nodejs-modules": "off", "import/no-relative-parent-imports": "off", "import/prefer-default-export": "off", "init-declarations": "off", @@ -36,7 +37,6 @@ "jsdoc/require-returns": "off", "max-lines-per-function": "off", "max-lines": "off", - "id-length": "off", "max-params": "off", "max-statements": "off", "no-array-callback-reference": "off", @@ -47,7 +47,6 @@ "no-inline-comments": "off", "no-magic-numbers": ["error", { "ignore": [0, 1], "ignoreDefaultValues": true }], "no-nested-ternary": "off", - "unicorn/no-nested-ternary": "off", "no-null": "off", "no-optional-chaining": "off", "no-plusplus": "off", @@ -59,12 +58,11 @@ "prefer-template": "off", "prefer-ternary": "off", "promise/avoid-new": "off", + "require-unicode-regexp": "off", "sort-imports": "off", "sort-keys": "off", "typescript/explicit-member-accessibility": ["error", { "accessibility": "no-public" }], - - "prefer-string-replace-all": "warn", - "require-unicode-regexp": "warn" + "unicorn/no-nested-ternary": "off" }, "overrides": [ { From b0a183847f98cab08d3da6c3742c1ef114d0214a Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 17:32:51 +0200 Subject: [PATCH 39/63] fix: skip confirmation prompt without tty, check y or yes --- .changeset/sunny-lilies-dress.md | 5 +++++ src/cli/commands/clean.command.ts | 9 +++++++++ src/cli/utils/terminal.ts | 7 ++++++- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 .changeset/sunny-lilies-dress.md diff --git a/.changeset/sunny-lilies-dress.md b/.changeset/sunny-lilies-dress.md new file mode 100644 index 0000000..f62cddd --- /dev/null +++ b/.changeset/sunny-lilies-dress.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Skip confirmation prompt without in CI/without TTY, require --yes or -y. diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index df4480f..1b16199 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -72,6 +72,15 @@ export const cleanCommand = { logger.log(`clean-modules${args['dry-run'] ? ' (dry run)' : ''}`); if (!args.yes && !args['dry-run']) { + if (!process.stdin.isTTY) { + console.error( + 'stdin is not a TTY, skipping confirmation prompt. Please use --yes or -y to skip the prompt.' + ); + + // oxlint-disable-next-line unicorn/no-process-exit + process.exit(1); + } + const warning = `\nPreparing to clean node_modules at: ${args.directory}\nAre you sure you want to continue? (Y/N) `; const confirmed = await yesOrNo(warning); diff --git a/src/cli/utils/terminal.ts b/src/cli/utils/terminal.ts index f8c839c..810edbf 100644 --- a/src/cli/utils/terminal.ts +++ b/src/cli/utils/terminal.ts @@ -25,6 +25,11 @@ export function makeSimpleLogger({ disabled }: { disabled: boolean }): SimpleCon * Prompts the user with a yes/no question and waits for the answer. */ export function yesOrNo(query: string): Promise { + if (!process.stdin.isTTY) { + console.error('stdin is not a TTY, skipping confirmation prompt. Please use --yes or -y to skip the prompt.'); + return Promise.resolve(false); + } + const rl = readline.createInterface({ input: process.stdin, output: process.stdout, @@ -33,7 +38,7 @@ export function yesOrNo(query: string): Promise { return new Promise(resolve => { rl.question(query, (answer: string) => { rl.close(); - resolve(/ye?s?/i.test(answer)); + resolve(/^\s*y(es)?\s*$/i.test(answer)); }); }); } From 409fdf29e2c670d841a1017f275f6fad8f3c9996 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 17:39:53 +0200 Subject: [PATCH 40/63] fix: correct removed files count --- src/utils/filesystem.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index 4af3cb6..d2efea6 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -226,7 +226,6 @@ export async function removeFiles( try { fileStats = await fs.promises.stat(filePath); - removedFilesCount++; } catch (error: unknown) { if (!hasErrorCode(error, 'ENOENT')) { failures.push(toFailure(filePath, 'stat', error)); @@ -237,6 +236,7 @@ export async function removeFiles( if (!options.dryRun) { try { await fs.promises.unlink(filePath); + removedFilesCount++; } catch (error: unknown) { if (!hasErrorCode(error, 'ENOENT')) { failures.push(toFailure(filePath, 'unlink', error)); From c3bd4b21bdbd5ba8a311994a05109da8e6808f10 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 17:40:56 +0200 Subject: [PATCH 41/63] fix: add dry run suffixes to results --- .changeset/fair-paws-appear.md | 5 +++++ src/cli/commands/clean.command.ts | 12 +++++++----- src/cli/helpers/help.ts | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 .changeset/fair-paws-appear.md diff --git a/.changeset/fair-paws-appear.md b/.changeset/fair-paws-appear.md new file mode 100644 index 0000000..a50c76b --- /dev/null +++ b/.changeset/fair-paws-appear.md @@ -0,0 +1,5 @@ +--- +'clean-modules': patch +--- + +Results now clearly indicate which results were skipped with `--dry-run`. diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 1b16199..7536346 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -2,7 +2,7 @@ import { clean } from '../../clean.js'; import type { CleanFailure } from '../../shared.js'; import { formatBytes, formatJson, formatMs } from '../../utils/formatting.js'; import { processArgs, sharedOptions, sharedPositionals } from '../helpers/args.js'; -import { formatHelp } from '../helpers/help.js'; +import { formatHelp, NAME } from '../helpers/help.js'; import type { CommandDefinition } from '../types.js'; import { makeSimpleLogger, yesOrNo } from '../utils/terminal.js'; @@ -69,7 +69,7 @@ export const cleanCommand = { const { values: args, positionals: globs } = processArgs(this as typeof cleanCommand); const logger = makeSimpleLogger({ disabled: args.json || args.silent }); - logger.log(`clean-modules${args['dry-run'] ? ' (dry run)' : ''}`); + logger.log(`${NAME}${args['dry-run'] ? ' (dry run)' : ''}`); if (!args.yes && !args['dry-run']) { if (!process.stdin.isTTY) { @@ -94,7 +94,7 @@ export const cleanCommand = { const cleanupStart = Date.now(); - const { removedFilesCount, reducedSize, removedEmptyDirs, failures } = await clean({ + const { files, removedFilesCount, reducedSize, removedEmptyDirs, failures } = await clean({ globs, dryRun: args['dry-run'], noDefaults: args['no-defaults'], @@ -119,10 +119,12 @@ export const cleanCommand = { // oxlint-disable-next-line no-console console.log(formatJson(output)); } else { + const dryRunSuffix = args['dry-run'] ? '(skipped in dry run)' : ''; logger.log('\nResults:'); logger.log('- size reduced:', formatBytes(reducedSize)); - logger.log('- files removed:', removedFilesCount); - logger.log('- empty dirs removed:', removedEmptyDirs); + logger.log('- files matched:', files.length); + logger.log('- files removed:', removedFilesCount, dryRunSuffix); + logger.log('- empty dirs removed:', removedEmptyDirs, dryRunSuffix); if (failures.length > 0) { logger.log('- failures:', failures.length); diff --git a/src/cli/helpers/help.ts b/src/cli/helpers/help.ts index 04c2088..91c71e4 100644 --- a/src/cli/helpers/help.ts +++ b/src/cli/helpers/help.ts @@ -2,7 +2,7 @@ import pkgJson from '../../../package.json' with { type: 'json' }; import type { CommandDefinition, OptionDescriptor, OptionDescriptors, PositionalDescriptors } from '../types'; export const VERSION = pkgJson.version; -const NAME = pkgJson.name; +export const NAME = pkgJson.name; const HOMEPAGE = pkgJson.homepage.replace('#readme', ''); function renderOptions(options: OptionDescriptors): string { From 3caf8a493b1d56ca2250b7166cba34e5028c9c17 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 17:42:14 +0200 Subject: [PATCH 42/63] chore: remove obsolete changesets --- .changeset/many-houses-unite.md | 5 ----- .changeset/silent-errors-speak.md | 2 +- .changeset/thirty-cases-run.md | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) delete mode 100644 .changeset/many-houses-unite.md delete mode 100644 .changeset/thirty-cases-run.md diff --git a/.changeset/many-houses-unite.md b/.changeset/many-houses-unite.md deleted file mode 100644 index b231a55..0000000 --- a/.changeset/many-houses-unite.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': major ---- - -Update `pretty-ms` dependency to v9. diff --git a/.changeset/silent-errors-speak.md b/.changeset/silent-errors-speak.md index b9119fe..9d9c9d1 100644 --- a/.changeset/silent-errors-speak.md +++ b/.changeset/silent-errors-speak.md @@ -7,6 +7,6 @@ Surface non-fatal filesystem failures instead of swallowing them silently. - `CleanResult` now includes: - `failures: CleanFailure[]` describing files that could not be processed (e.g. `EACCES`, `EBUSY`). - `removedFilesCount: number` reflecting the number of files actually removed. Previously `files.length` was used as a stand-in even when some removals failed. -- The CLI prints a summary of failures (up to 10 by default) below the usual results; the full list is included in `--json` output. +- The CLI prints a summary of failures below the usual results; the full list is included in `--json` output. - New `--fail-on-error` flag exits with a non-zero status code when any failure is recorded. Exit code stays `0` by default, matching prior behavior. - `ENOENT` during `stat`, `unlink`, or `readdir` is still treated as a no-op since the file or directory is already gone. Other errors are now captured rather than silently dropped. diff --git a/.changeset/thirty-cases-run.md b/.changeset/thirty-cases-run.md deleted file mode 100644 index 36c22b6..0000000 --- a/.changeset/thirty-cases-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': minor ---- - -Replace `clipanion` built-in CLI parsing via `parseArgs`. From ca6a4a145369e7af4f5d8d68cea6fa4de9b5d09c Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 18:01:55 +0200 Subject: [PATCH 43/63] chore: fix tsbuildinfo file name --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 70b0e00..440f4ff 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,7 @@ "outDir": "dist", "noEmit": true, - "tsBuildInfoFile": "./tsconfig.tsbuildinfo", + "tsBuildInfoFile": "./.tsbuildinfo", "incremental": true, "strict": true, From 6f878df7290afdc5abd5e2a784de51582d912e5b Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 18:15:59 +0200 Subject: [PATCH 44/63] fix(perf): avoid parsing default globs twice in analyze --- src/analyze.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/analyze.ts b/src/analyze.ts index e91e19a..68ed906 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -4,6 +4,7 @@ import { findFilesByGlobLists, getGlobLists, makeGlobMatcher, + mergeGlobLists, optimizeGlobLists, parseDefaultGlobsFile, toAbsoluteGlobLists, @@ -45,11 +46,13 @@ export async function analyze(options: AnalyzeOptions = {}): Promise Date: Sun, 17 May 2026 18:21:01 +0200 Subject: [PATCH 45/63] fix: don't double prefix `**` to globs not starting with `/` --- src/__snapshots__/analyze.test.ts.snap | 6 +++--- src/utils/glob.test.ts | 14 ++++++++++---- src/utils/glob.ts | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/__snapshots__/analyze.test.ts.snap b/src/__snapshots__/analyze.test.ts.snap index d12cfd2..be12a91 100644 --- a/src/__snapshots__/analyze.test.ts.snap +++ b/src/__snapshots__/analyze.test.ts.snap @@ -33,7 +33,7 @@ exports[`analyze > accepts custom globs 1`] = ` "includedByDefault": false, "includedByGlobs": [ { - "derived": "/node_modules/**/**/nonDefaultFile.ext", + "derived": "/node_modules/**/nonDefaultFile.ext", "original": "**/nonDefaultFile.ext", }, ], @@ -81,7 +81,7 @@ exports[`analyze > allows skipping default globs 1`] = ` "includedByDefault": false, "includedByGlobs": [ { - "derived": "/node_modules/**/**/nonDefaultFile.ext", + "derived": "/node_modules/**/nonDefaultFile.ext", "original": "**/nonDefaultFile.ext", }, ], @@ -171,7 +171,7 @@ exports[`analyze > uses custom glob file if provided 1`] = ` "includedByDefault": false, "includedByGlobs": [ { - "derived": "/node_modules/**/**/nonDefaultFile.ext", + "derived": "/node_modules/**/nonDefaultFile.ext", "original": "**/nonDefaultFile.ext", }, ], diff --git a/src/utils/glob.test.ts b/src/utils/glob.test.ts index cd8cf71..bdf30cf 100644 --- a/src/utils/glob.test.ts +++ b/src/utils/glob.test.ts @@ -196,6 +196,12 @@ describe(formatGlob, () => { const result = formatGlob('/path/to/directory/'); expect(result).toBe('path/to/directory/**'); }); + + it('does not double-prepend globstars when the glob already starts with **/', () => { + expect(formatGlob('**/foo')).toBe('**/foo'); + expect(formatGlob('**/foo/**')).toBe('**/foo/**'); + expect(formatGlob('**/foo/')).toBe('**/foo/**'); + }); }); describe(processGlobs, () => { @@ -207,12 +213,12 @@ describe(processGlobs, () => { "**/test.js", ], "included": [ - "**/**/test", - "**/**/path/to/directory/**", + "**/test", + "**/path/to/directory/**", "**/*.ext", ], "includedDirs": [ - "**/**/path/to/directory", + "**/path/to/directory", ], "originalIncluded": [ "**/test", @@ -225,7 +231,7 @@ describe(processGlobs, () => { it('removes trailing globstars from dir globs', () => { const result = processGlobs(['**/foo/**', '/bar/**']); - expect(result.includedDirs).toStrictEqual(['**/**/foo', 'bar']); + expect(result.includedDirs).toStrictEqual(['**/foo', 'bar']); }); it('filters empty strings', () => { diff --git a/src/utils/glob.ts b/src/utils/glob.ts index 33ad517..0433429 100644 --- a/src/utils/glob.ts +++ b/src/utils/glob.ts @@ -131,7 +131,7 @@ const EXCLAMATION_START = /^\s*!/; // Globs starting with ! const DIR_GLOB_REGEX = /\/\**$/; // Globs ending with /, /* or /** const EXCLUDED_GLOB_REGEX = /^!/; // Globs starting with ! const ESCAPED_NEGATIVE_GLOB_REGEX = /^\\!/; // Globs starting with \! -const NOT_FIXED_START_GLOB_REGEX = /^([^/])/; // Globs not starting with / +const NOT_FIXED_START_GLOB_REGEX = /^(?!\*\*\/)([^/])/; // Globs not starting with / or **/ const FIXED_START_GLOB_REGEX = /^\//; // Globs starting with / /** From 9ab007957fee11707768091193719de7c4747d21 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 18:40:00 +0200 Subject: [PATCH 46/63] fix: add line breaks to confirmation message --- src/cli/commands/clean.command.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index 7536346..e910c9a 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -81,7 +81,7 @@ export const cleanCommand = { process.exit(1); } - const warning = `\nPreparing to clean node_modules at: ${args.directory}\nAre you sure you want to continue? (Y/N) `; + const warning = `\nPreparing to clean node_modules at:\n${args.directory}\n\nAre you sure you want to continue? (Y/N) `; const confirmed = await yesOrNo(warning); if (!confirmed) { From 540c37287b97ada49f7ce3eb1dc72b438ca3178f Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 18:40:39 +0200 Subject: [PATCH 47/63] fix: improve `removeEmptyDirsUp`, avoiding redundant `readdir` calls --- src/utils/filesystem.test.ts | 90 +++++++++++++++------------ src/utils/filesystem.ts | 117 +++++++++++++++++++++++++---------- 2 files changed, 132 insertions(+), 75 deletions(-) diff --git a/src/utils/filesystem.test.ts b/src/utils/filesystem.test.ts index 8ca89d1..7682cd1 100644 --- a/src/utils/filesystem.test.ts +++ b/src/utils/filesystem.test.ts @@ -10,7 +10,6 @@ import { forEachDirentAsync, readDirectory, removeEmptyDirs, - removeEmptyDirsUp, removeFiles, type CheckPathFunc, type CrawlErrorHandler, @@ -164,46 +163,6 @@ describe(readDirectory, () => { }); }); -describe(removeEmptyDirsUp, () => { - beforeEach(() => { - vol.fromNestedJSON({ - a0: { - b0: { - c0: { - d0: { - e0: {}, - }, - }, - c1: 'its a file', - }, - }, - }); - }); - - it('recursively removes empty directories up in the file tree', async () => { - expect.hasAssertions(); - - const checkedDirs = new Set(); - await removeEmptyDirsUp(checkedDirs, 'a0/b0/c0/d0/e0'); - - expect([...checkedDirs]).toStrictEqual(['a0/b0/c0/d0/e0', 'a0/b0/c0/d0', 'a0/b0/c0', 'a0/b0']); - - // dirs no longer exist - expect(fs.existsSync('a0/b0/c0/d0/e0')).toBe(false); - expect(fs.existsSync('a0/b0/c0/d0')).toBe(false); - expect(fs.existsSync('a0/b0/c0')).toBe(false); - expect(fs.existsSync('a0/b0')).toBe(true); - expect(fs.existsSync('a0')).toBe(true); - }); - - it('does not throw if path is invalid', async () => { - expect.hasAssertions(); - - const checkedDirs = new Set(); - await expect(() => removeEmptyDirsUp(checkedDirs, 'invalid/path')).not.toThrow(); - }); -}); - describe(removeEmptyDirs, () => { beforeEach(async () => { const fileStructure = await getMockedFileStructure(); @@ -238,6 +197,55 @@ describe(removeEmptyDirs, () => { const filePaths = ['invalid/path/2', 'invalid/path/2']; await expect(() => removeEmptyDirs(filePaths)).not.toThrow(); }); + + it('walks up the tree, removing every empty ancestor', async () => { + expect.hasAssertions(); + + vol.fromNestedJSON({ + a0: { + b0: { + c0: { + d0: { + e0: { 'leaf.js': '.' }, + }, + }, + c1: 'its a file', + }, + }, + }); + + fs.unlinkSync('a0/b0/c0/d0/e0/leaf.js'); + const removed = await removeEmptyDirs(['a0/b0/c0/d0/e0/leaf.js']); + + expect(removed).toBe(3); + expect(fs.existsSync('a0/b0/c0/d0/e0')).toBe(false); + expect(fs.existsSync('a0/b0/c0/d0')).toBe(false); + expect(fs.existsSync('a0/b0/c0')).toBe(false); + expect(fs.existsSync('a0/b0')).toBe(true); // contains the unrelated c1 file + expect(fs.existsSync('a0')).toBe(true); + }); + + it('removes a parent that becomes empty only after multiple sibling cleanups', async () => { + expect.hasAssertions(); + + vol.fromNestedJSON({ + parent: { + sub1: { 'a.js': '.' }, + sub2: { 'b.js': '.' }, + }, + }); + + const filePaths = ['parent/sub1/a.js', 'parent/sub2/b.js']; + for (const filePath of filePaths) { + fs.unlinkSync(filePath); + } + + const removed = await removeEmptyDirs(filePaths); + + // sub1, sub2 and the parent that became empty because of them + expect(removed).toBe(3); + expect(fs.existsSync('parent')).toBe(false); + }); }); describe(crawlDirFast, () => { diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index d2efea6..564c42c 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -85,53 +85,102 @@ export async function readDirectory(dirPath: string): Promise { } /** - * Remove empty directories, recursively travelling up in the file until the first non-empty directory is reached. + * Counts the path separators in a directory path. Used to bucket directories + * by depth so they can be processed strictly bottom-up. */ -export async function removeEmptyDirsUp( - checkedDirs: Set, - dirPath: string, - count = 0 -): Promise { - if (!checkedDirs.has(dirPath)) { - const files = await readDirectory(dirPath); - const emptyDir = files.length === 0; - checkedDirs.add(dirPath); - - if (emptyDir) { - try { - await fs.promises.rmdir(dirPath); - // oxlint-disable-next-line no-param-reassign - count++; - } catch { - // Do nothing, empty dir removal is best effort. - // A parent may become non-empty between checks, or be locked. - } - - const parentDir = path.dirname(dirPath); - // oxlint-disable-next-line no-param-reassign - count = await removeEmptyDirsUp(checkedDirs, parentDir, count); +function depthOf(dirPath: string): number { + let count = 0; + for (const char of dirPath) { + if (char === path.sep) { + count++; } } - return count; } +/** + * Attempts to remove a directory if it's empty. Returns true if it was removed. + * ENOENT, EBUSY and similar errors are treated as no-ops (best effort). + */ +async function tryRemoveDirIfEmpty(dirPath: string): Promise { + try { + const entries = await fs.promises.readdir(dirPath); + if (entries.length > 0) { + return false; + } + await fs.promises.rmdir(dirPath); + return true; + } catch { + return false; + } +} + /** * Deeply removes empty directories for each file path. + * + * Walks up from each file's immediate parent and removes any ancestor that is + * empty. Directories are processed in waves grouped by depth to avoid redundant + * `readdir` calls on shared ancestors. + * * @param filePaths the file paths to remove empty directories for * @returns the number of empty directories removed */ -export async function removeEmptyDirs(filePaths: string[]): Promise { - let removedEmptyDirs = 0; +export async function removeEmptyDirs(filePaths: string[] | readonly string[]): Promise { + if (filePaths.length === 0) { + return 0; + } - await Promise.all( - filePaths.map(async filePath => { - const removedParentDirs = await removeEmptyDirsUp(new Set(), path.dirname(filePath)); - removedEmptyDirs += removedParentDirs; - }) - ); + const dirsByDepth = new Map>(); + let maxDepth = 0; + + function queue(dir: string): void { + const depth = depthOf(dir); + let bucket = dirsByDepth.get(depth); + + if (!bucket) { + bucket = new Set(); + dirsByDepth.set(depth, bucket); + } + + bucket.add(dir); + + if (depth > maxDepth) { + maxDepth = depth; + } + } + + for (const filePath of filePaths) { + queue(path.dirname(filePath)); + } + + let removedCount = 0; + + for (let depth = maxDepth; depth >= 0; depth--) { + const bucket = dirsByDepth.get(depth); + if (!bucket || bucket.size === 0) { + continue; + } + + // oxlint-disable-next-line no-await-in-loop + const results = await Promise.all( + [...bucket].map(async dir => ({ dir, removed: await tryRemoveDirIfEmpty(dir) })) + ); + + for (const { dir, removed } of results) { + if (!removed) { + continue; + } + + removedCount++; + + const parent = path.dirname(dir); + if (parent !== dir) { + queue(parent); + } + } + } - return removedEmptyDirs; + return removedCount; } /** From 9a1f211eeedab4029b1bc07c5c1b6a5b5a59b503 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sun, 17 May 2026 19:18:52 +0200 Subject: [PATCH 48/63] test: add CLI tests --- .oxlintrc.json | 1 + src/cli/__snapshots__/cli.test.ts.snap | 160 +++++++ src/cli/cli.test.ts | 579 +++++++++++++++++++++++++ src/cli/utils/terminal.ts | 4 +- 4 files changed, 743 insertions(+), 1 deletion(-) create mode 100644 src/cli/__snapshots__/cli.test.ts.snap create mode 100644 src/cli/cli.test.ts diff --git a/.oxlintrc.json b/.oxlintrc.json index 5a7a109..d161d2f 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -55,6 +55,7 @@ "no-undefined": "off", "operator-assignment": "off", "prefer-await-to-then": "off", + "prefer-destructuring": "off", "prefer-template": "off", "prefer-ternary": "off", "promise/avoid-new": "off", diff --git a/src/cli/__snapshots__/cli.test.ts.snap b/src/cli/__snapshots__/cli.test.ts.snap new file mode 100644 index 0000000..0f8dcbb --- /dev/null +++ b/src/cli/__snapshots__/cli.test.ts.snap @@ -0,0 +1,160 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`analyze command > renders the analyze help 1`] = ` +" +โ”โ”โ” clean-modules vX.Y.Z โ”โ”โ” +https://github.com/duniul/clean-modules + +Analyze which files are cleaned up or not. + +โ”โ”โ” Usage โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” + +$ clean-modules analyze [options] [globs...] + +โ”โ”โ” Options โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +-h, --help Show help +-v, --version Show version +-D, --directory Path to node_modules (default: $PWD) +-f, --glob-file Path to a custom glob file (default: .cleanmodules) +-n, --no-defaults Skips default glob patterns from being used +" +`; + +exports[`clean command > renders the clean help 1`] = ` +" +โ”โ”โ” clean-modules vX.Y.Z โ”โ”โ” +https://github.com/duniul/clean-modules + +Remove unnecessary files in your node_modules directory. + +โ”โ”โ” Usage โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” + +$ clean-modules clean [options] [globs...] + +Extra globs can be passed as positional args. + +โ”โ”โ” Options โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +-h, --help Show help +-v, --version Show version +-D, --directory Path to node_modules (default: $PWD) +-f, --glob-file Path to a custom glob file (default: .cleanmodules) +-n, --no-defaults Skips default glob patterns from being used +-k, --keep-empty Skips removing empty folders after cleanup +-d, --dry-run Runs clean without removing any files +-s, --silent Does not log anything to console +-j, --json Output results as JSON +-y, --yes Skips the confirmation prompt +-e, --fail-on-error Exit with a non-zero status code on file errors +" +`; + +exports[`clean output formatting > emits a JSON summary with --json (no human-readable text) 1`] = ` +"{ + "removedFiles": 5, + "reducedSize": 5, + "removedEmptyDirs": 3, + "duration": , + "dryRun": false, + "failures": [] +}" +`; + +exports[`clean output formatting > lists failures (truncated past MAX_PRINTED_FAILURES) below the summary 1`] = ` +"clean-modules + +Cleaning up node_modules... +Done in ! + +Results: +- size reduced: 12.35 kB +- files matched: 8 +- files removed: 3 +- empty dirs removed: 0 +- failures: 8 + +Failed to process 8 files: + EACCES: /node_modules/dep/file-0 (unlink failed: permission denied (0)) + EACCES: /node_modules/dep/file-1 (unlink failed: permission denied (1)) + EACCES: /node_modules/dep/file-2 (unlink failed: permission denied (2)) + EACCES: /node_modules/dep/file-3 (unlink failed: permission denied (3)) + EACCES: /node_modules/dep/file-4 (unlink failed: permission denied (4)) + ...3 more (use --json to see all)" +`; + +exports[`clean output formatting > marks the run as a dry run in the human-readable output 1`] = ` +"clean-modules (dry run) + +Cleaning up node_modules... +Done in ! + +Results: +- size reduced: 5 B +- files matched: 5 +- files removed: 0 (skipped in dry run) +- empty dirs removed: 0 (skipped in dry run)" +`; + +exports[`clean output formatting > renders a human-readable summary after a successful clean 1`] = ` +"clean-modules + +Cleaning up node_modules... +Done in ! + +Results: +- size reduced: 5 B +- files matched: 5 +- files removed: 5 +- empty dirs removed: 3 " +`; + +exports[`clean output formatting > uses singular wording and skips truncation when there is a single failure 1`] = ` +"clean-modules + +Cleaning up node_modules... +Done in ! + +Results: +- size reduced: 0 B +- files matched: 1 +- files removed: 0 +- empty dirs removed: 0 +- failures: 1 + +Failed to process 1 file: + /node_modules/dep/only-file (unlink failed: boom)" +`; + +exports[`default command > renders help that lists both subcommands 1`] = ` +" +โ”โ”โ” clean-modules vX.Y.Z โ”โ”โ” +https://github.com/duniul/clean-modules + +Remove unnecessary files in your node_modules directory. + +โ”โ”โ” Usage โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” + +$ clean-modules [options] [globs...] + +Extra globs can be passed as positional args. + +โ”โ”โ” Commands โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +clean-modules clean (default) + Remove unnecessary files in your node_modules directory. + +clean-modules analyze + Analyze which files are cleaned up or not. + +โ”โ”โ” Options โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” +-h, --help Show help +-v, --version Show version +-D, --directory Path to node_modules (default: $PWD) +-f, --glob-file Path to a custom glob file (default: .cleanmodules) +-n, --no-defaults Skips default glob patterns from being used +-k, --keep-empty Skips removing empty folders after cleanup +-d, --dry-run Runs clean without removing any files +-s, --silent Does not log anything to console +-j, --json Output results as JSON +-y, --yes Skips the confirmation prompt +-e, --fail-on-error Exit with a non-zero status code on file errors +" +`; diff --git a/src/cli/cli.test.ts b/src/cli/cli.test.ts new file mode 100644 index 0000000..c1bf6e8 --- /dev/null +++ b/src/cli/cli.test.ts @@ -0,0 +1,579 @@ +import { vol } from 'memfs'; +import { beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'; +import { getMockedFileStructure } from '../__test__/getMockedFileStructure.js'; +import type { analyze, AnalyzeResult } from '../analyze.js'; +import type * as cleanModule from '../clean.js'; +import type { clean, CleanResult } from '../clean.js'; +import type * as terminalModule from './utils/terminal.js'; +import type { yesOrNo } from './utils/terminal.js'; + +vi.setConfig({ testTimeout: 5000 }); + +type CleanFn = typeof clean; +type AnalyzeFn = typeof analyze; + +const mocks = vi.hoisted(() => ({ + clean: vi.fn(), + analyze: vi.fn(), + yesOrNo: vi.fn(), +})); + +vi.mock(import('../clean.js'), () => ({ clean: mocks.clean })); +vi.mock(import('../analyze.js'), () => ({ analyze: mocks.analyze })); +vi.mock(import('./utils/terminal.js'), async () => { + const actual = await vi.importActual('./utils/terminal.js'); + return { ...actual, yesOrNo: mocks.yesOrNo }; +}); + +const DEFAULT_CLEAN_RESULT: CleanResult = { + files: [], + removedFilesCount: 0, + reducedSize: 0, + removedEmptyDirs: 0, + failures: [], +}; + +const DEFAULT_ANALYZE_RESULT: AnalyzeResult = { + files: [], + failures: [], +}; + +class ExitError extends Error { + override name = 'ExitError'; + exitCode: number; + constructor(code: number) { + super(`process.exit(${code})`); + this.exitCode = code; + } +} + +type RunOptions = { + stdinTTY?: boolean; + confirm?: boolean; + cleanResult?: CleanResult; + cleanImpl?: CleanFn; + analyzeResult?: AnalyzeResult; + analyzeImpl?: AnalyzeFn; +}; + +type RunResult = { + exitCode: number; + stdout: string; + stderr: string; +}; + +function formatArg(arg: unknown): string { + return typeof arg === 'string' ? arg : String(arg); +} + +/** + * Runs the CLI as if invoked from a shell with the given args. + */ +async function runCli(argv: string[], opts: RunOptions = {}): Promise { + const originalArgv = process.argv; + const originalIsTTY = process.stdin.isTTY; + + process.argv = ['node', 'cli.js', ...argv]; + (process.stdin as { isTTY?: boolean }).isTTY = opts.stdinTTY ?? true; + + const cleanSetup = mocks.clean.mockReset(); + if (opts.cleanImpl) { + cleanSetup.mockImplementation(opts.cleanImpl); + } else { + cleanSetup.mockResolvedValue(opts.cleanResult ?? DEFAULT_CLEAN_RESULT); + } + + const analyzeSetup = mocks.analyze.mockReset(); + if (opts.analyzeImpl) { + analyzeSetup.mockImplementation(opts.analyzeImpl); + } else { + analyzeSetup.mockResolvedValue(opts.analyzeResult ?? DEFAULT_ANALYZE_RESULT); + } + + mocks.yesOrNo.mockReset().mockResolvedValue(opts.confirm ?? true); + + const stdoutLines: string[] = []; + const stderrLines: string[] = []; + let exitCode = 0; + + const logSpy = vi.spyOn(console, 'log').mockImplementation((...args: unknown[]): void => { + stdoutLines.push(args.map(formatArg).join(' ')); + }); + const errSpy = vi.spyOn(console, 'error').mockImplementation((...args: unknown[]): void => { + stderrLines.push(args.map(formatArg).join(' ')); + }); + const exitSpy = vi.spyOn(process, 'exit').mockImplementation(((code?: number): never => { + throw new ExitError(typeof code === 'number' ? code : 0); + }) as typeof process.exit); + + vi.resetModules(); + + try { + await import('./cli.js'); + } catch (error) { + if (error instanceof ExitError) { + exitCode = error.exitCode; + } else { + throw error; + } + } finally { + process.argv = originalArgv; + (process.stdin as { isTTY?: boolean }).isTTY = originalIsTTY; + logSpy.mockRestore(); + errSpy.mockRestore(); + exitSpy.mockRestore(); + } + + return { + exitCode, + stdout: stdoutLines.join('\n'), + stderr: stderrLines.join('\n'), + }; +} + +/** Normalizes non-deterministic bits (version, durations) so snapshots stay stable. */ +function normalize(text: string): string { + return text + .replaceAll(/v\d+\.\d+\.\d+/g, 'vX.Y.Z') + .replaceAll(/Done in \d+(?:\.\d+)?(?:ms|s|m \d+s|m)!/g, 'Done in !') + .replaceAll(/"duration": \d+/g, '"duration": '); +} + +describe('default command', () => { + it('renders help that lists both subcommands', async () => { + expect.hasAssertions(); + + const result = await runCli(['--help']); + + expect(result.exitCode).toBe(0); + expect(result.stderr).toBe(''); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('renders the package version on --version', async () => { + expect.hasAssertions(); + + const result = await runCli(['--version']); + + expect(result.exitCode).toBe(0); + expect(result.stdout).toMatch(/^\d+\.\d+\.\d+$/); + }); + + it('runs clean when no subcommand is given', async () => { + expect.hasAssertions(); + + const result = await runCli(['--yes']); + + expect(result.exitCode).toBe(0); + expect(mocks.clean).toHaveBeenCalledTimes(1); + expect(mocks.analyze).not.toHaveBeenCalled(); + }); + + it('forwards positional args as globs to clean', async () => { + expect.hasAssertions(); + + await runCli(['--yes', '**/*.foo', '**/*.bar']); + + expect(mocks.clean).toHaveBeenCalledTimes(1); + expect(mocks.clean).toHaveBeenCalledWith( + expect.objectContaining({ globs: expect.arrayContaining(['**/*.foo', '**/*.bar']) }) + ); + }); + + it('forwards clean options when no subcommand is given', async () => { + expect.hasAssertions(); + + await runCli(['--yes', '--dry-run', '--keep-empty', '--directory', '/tmp/nm']); + + expect(mocks.clean).toHaveBeenCalledWith( + expect.objectContaining({ dryRun: true, keepEmpty: true, directory: '/tmp/nm' }) + ); + }); + + it('exits with code 1 when an unknown option is passed', async () => { + expect.hasAssertions(); + + const result = await runCli(['--bogus']); + + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain('Run with --help for usage.'); + expect(mocks.clean).not.toHaveBeenCalled(); + }); +}); + +describe('clean command', () => { + it('renders the clean help', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--help']); + + expect(result.exitCode).toBe(0); + expect(result.stderr).toBe(''); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('calls clean with default options when none are passed', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes']); + + expect(mocks.clean).toHaveBeenCalledTimes(1); + expect(mocks.clean).toHaveBeenCalledWith( + expect.objectContaining({ + dryRun: false, + keepEmpty: false, + noDefaults: false, + globFile: '.cleanmodules', + }) + ); + }); + + it('forwards positional args as globs', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes', '**/foo', '**/bar']); + + expect(mocks.clean).toHaveBeenCalledWith( + expect.objectContaining({ globs: expect.arrayContaining(['**/foo', '**/bar']) }) + ); + }); + + it('forwards --directory / -D', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes', '--directory', '/long/path']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ directory: '/long/path' })); + + await runCli(['clean', '--yes', '-D', '/short/path']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ directory: '/short/path' })); + }); + + it('forwards --glob-file / -f', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes', '--glob-file', '.custom-globs']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ globFile: '.custom-globs' })); + + await runCli(['clean', '--yes', '-f', '.short-globs']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ globFile: '.short-globs' })); + }); + + it('forwards --no-defaults / -n', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes', '--no-defaults']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ noDefaults: true })); + + await runCli(['clean', '--yes', '-n']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ noDefaults: true })); + }); + + it('forwards --keep-empty / -k', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes', '--keep-empty']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ keepEmpty: true })); + + await runCli(['clean', '--yes', '-k']); + expect(mocks.clean).toHaveBeenLastCalledWith(expect.objectContaining({ keepEmpty: true })); + }); + + it('forwards --dry-run / -d and skips confirmation', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--dry-run'], { stdinTTY: false }); + + expect(result.exitCode).toBe(0); + expect(mocks.clean).toHaveBeenCalledWith(expect.objectContaining({ dryRun: true })); + expect(mocks.yesOrNo).not.toHaveBeenCalled(); + expect(result.stdout).toContain('(dry run)'); + }); + + it('-d short flag also enables dry run', async () => { + expect.hasAssertions(); + + await runCli(['clean', '-d'], { stdinTTY: false }); + + expect(mocks.clean).toHaveBeenCalledWith(expect.objectContaining({ dryRun: true })); + }); + + it('--silent / -s suppresses logger output but still calls clean', async () => { + expect.hasAssertions(); + + const longResult = await runCli(['clean', '--yes', '--silent']); + expect(longResult.exitCode).toBe(0); + expect(longResult.stdout).toBe(''); + expect(mocks.clean).toHaveBeenCalledTimes(1); + + const shortResult = await runCli(['clean', '--yes', '-s']); + expect(shortResult.stdout).toBe(''); + }); + + it('--json / -j prints a JSON summary instead of human-readable output', async () => { + expect.hasAssertions(); + + const cleanResult: CleanResult = { + files: ['/x'], + removedFilesCount: 1, + reducedSize: 100, + removedEmptyDirs: 2, + failures: [], + }; + + const result = await runCli(['clean', '--yes', '--json'], { cleanResult }); + + expect(result.exitCode).toBe(0); + const parsed = JSON.parse(result.stdout); + expect(parsed).toStrictEqual( + expect.objectContaining({ + removedFiles: 1, + reducedSize: 100, + removedEmptyDirs: 2, + dryRun: false, + failures: [], + }) + ); + }); + + it('--yes / -y skips the readline confirmation prompt', async () => { + expect.hasAssertions(); + + await runCli(['clean', '--yes']); + expect(mocks.yesOrNo).not.toHaveBeenCalled(); + expect(mocks.clean).toHaveBeenCalledTimes(1); + + await runCli(['clean', '-y']); + expect(mocks.yesOrNo).not.toHaveBeenCalled(); + expect(mocks.clean).toHaveBeenCalledTimes(1); + }); + + it('prompts for confirmation and continues when the user confirms', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean'], { confirm: true }); + + expect(result.exitCode).toBe(0); + expect(mocks.yesOrNo).toHaveBeenCalledTimes(1); + expect(mocks.clean).toHaveBeenCalledTimes(1); + }); + + it('prompts for confirmation and aborts when the user declines', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean'], { confirm: false }); + + expect(result.exitCode).toBe(0); + expect(mocks.yesOrNo).toHaveBeenCalledTimes(1); + expect(mocks.clean).not.toHaveBeenCalled(); + }); + + it('exits 1 when stdin is not a TTY and confirmation is required', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean'], { stdinTTY: false }); + + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain('stdin is not a TTY'); + expect(mocks.clean).not.toHaveBeenCalled(); + }); + + it('--fail-on-error / -e exits 1 when clean() reports failures', async () => { + expect.hasAssertions(); + + const cleanResult: CleanResult = { + files: [], + removedFilesCount: 0, + reducedSize: 0, + removedEmptyDirs: 0, + failures: [{ path: '/x', phase: 'unlink', message: 'boom' }], + }; + + const longResult = await runCli(['clean', '--yes', '--fail-on-error'], { cleanResult }); + expect(longResult.exitCode).toBe(1); + + const shortResult = await runCli(['clean', '--yes', '-e'], { cleanResult }); + expect(shortResult.exitCode).toBe(1); + }); + + it('--fail-on-error exits 0 when there are no failures', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--yes', '--fail-on-error']); + + expect(result.exitCode).toBe(0); + }); +}); + +describe('analyze command', () => { + it('renders the analyze help', async () => { + expect.hasAssertions(); + + const result = await runCli(['analyze', '--help']); + + expect(result.exitCode).toBe(0); + expect(result.stderr).toBe(''); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('calls analyze with default options when none are passed', async () => { + expect.hasAssertions(); + + await runCli(['analyze']); + + expect(mocks.analyze).toHaveBeenCalledTimes(1); + expect(mocks.clean).not.toHaveBeenCalled(); + expect(mocks.analyze).toHaveBeenCalledWith( + expect.objectContaining({ noDefaults: false, globFile: '.cleanmodules' }) + ); + }); + + it('forwards positional args as globs', async () => { + expect.hasAssertions(); + + await runCli(['analyze', '**/foo', '**/bar']); + + expect(mocks.analyze).toHaveBeenCalledWith( + expect.objectContaining({ globs: expect.arrayContaining(['**/foo', '**/bar']) }) + ); + }); + + it('forwards --directory / -D', async () => { + expect.hasAssertions(); + + await runCli(['analyze', '--directory', '/long/path']); + expect(mocks.analyze).toHaveBeenLastCalledWith(expect.objectContaining({ directory: '/long/path' })); + + await runCli(['analyze', '-D', '/short/path']); + expect(mocks.analyze).toHaveBeenLastCalledWith(expect.objectContaining({ directory: '/short/path' })); + }); + + it('forwards --glob-file / -f', async () => { + expect.hasAssertions(); + + await runCli(['analyze', '--glob-file', '.custom-globs']); + expect(mocks.analyze).toHaveBeenLastCalledWith(expect.objectContaining({ globFile: '.custom-globs' })); + + await runCli(['analyze', '-f', '.short-globs']); + expect(mocks.analyze).toHaveBeenLastCalledWith(expect.objectContaining({ globFile: '.short-globs' })); + }); + + it('forwards --no-defaults / -n', async () => { + expect.hasAssertions(); + + await runCli(['analyze', '--no-defaults']); + expect(mocks.analyze).toHaveBeenLastCalledWith(expect.objectContaining({ noDefaults: true })); + + await runCli(['analyze', '-n']); + expect(mocks.analyze).toHaveBeenLastCalledWith(expect.objectContaining({ noDefaults: true })); + }); + + it('prints the analyze result as JSON', async () => { + expect.hasAssertions(); + + const analyzeResult: AnalyzeResult = { + files: [{ filePath: '/x', includedByDefault: true, includedByGlobs: [] }], + failures: [], + }; + + const result = await runCli(['analyze'], { analyzeResult }); + + expect(result.exitCode).toBe(0); + expect(JSON.parse(result.stdout)).toStrictEqual(analyzeResult); + }); + + it('exits 1 on unknown option', async () => { + expect.hasAssertions(); + + const result = await runCli(['analyze', '--bogus']); + + expect(result.exitCode).toBe(1); + expect(result.stderr).toContain('Run with --help for usage.'); + expect(mocks.analyze).not.toHaveBeenCalled(); + }); +}); + +/** + * End-to-end smoke tests for the human-readable output that clean.command.ts + * renders. Runs the real `clean` implementation against a memfs fixture for + * the success paths, and inject mocked results for the failure paths. + */ +describe('clean output formatting', () => { + let realClean: CleanFn; + let fileStructure: Awaited>; + + beforeAll(async () => { + const actualCleanModule = await vi.importActual('../clean.js'); + realClean = actualCleanModule.clean; + fileStructure = await getMockedFileStructure(); + }); + + beforeEach(() => { + vol.fromNestedJSON(fileStructure); + }); + + it('renders a human-readable summary after a successful clean', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--yes'], { cleanImpl: realClean }); + + expect(result.exitCode).toBe(0); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('marks the run as a dry run in the human-readable output', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--dry-run'], { cleanImpl: realClean }); + + expect(result.exitCode).toBe(0); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('emits a JSON summary with --json (no human-readable text)', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--yes', '--json'], { cleanImpl: realClean }); + + expect(result.exitCode).toBe(0); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('lists failures (truncated past MAX_PRINTED_FAILURES) below the summary', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--yes'], { + cleanResult: { + files: Array.from({ length: 8 }, (_, i) => `/node_modules/dep/file-${i}`), + removedFilesCount: 3, + reducedSize: 12_345, + removedEmptyDirs: 0, + failures: Array.from({ length: 8 }, (_, i) => ({ + path: `/node_modules/dep/file-${i}`, + phase: 'unlink', + code: 'EACCES', + message: `permission denied (${i})`, + })), + }, + }); + + expect(result.exitCode).toBe(0); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); + + it('uses singular wording and skips truncation when there is a single failure', async () => { + expect.hasAssertions(); + + const result = await runCli(['clean', '--yes'], { + cleanResult: { + files: ['/node_modules/dep/only-file'], + removedFilesCount: 0, + reducedSize: 0, + removedEmptyDirs: 0, + failures: [{ path: '/node_modules/dep/only-file', phase: 'unlink', message: 'boom' }], + }, + }); + + expect(result.exitCode).toBe(0); + expect(normalize(result.stdout)).toMatchSnapshot(); + }); +}); diff --git a/src/cli/utils/terminal.ts b/src/cli/utils/terminal.ts index 810edbf..2cf8c6a 100644 --- a/src/cli/utils/terminal.ts +++ b/src/cli/utils/terminal.ts @@ -26,7 +26,9 @@ export function makeSimpleLogger({ disabled }: { disabled: boolean }): SimpleCon */ export function yesOrNo(query: string): Promise { if (!process.stdin.isTTY) { - console.error('stdin is not a TTY, skipping confirmation prompt. Please use --yes or -y to skip the prompt.'); + console.error( + 'stdin is not a TTY, skipping confirmation prompt. Please use --yes or -y to skip the prompt.' + ); return Promise.resolve(false); } From 7e796ce78227d6da03406fd4e0a5f7ddd9333f22 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 18 May 2026 23:02:34 +0200 Subject: [PATCH 49/63] chore: update README and package description --- README.md | 339 +++++++++++++++------------------------------------ package.json | 2 +- 2 files changed, 102 insertions(+), 239 deletions(-) diff --git a/README.md b/README.md index 94432ec..3cfd44d 100644 --- a/README.md +++ b/README.md @@ -1,202 +1,131 @@ # clean-modules ๐Ÿงน + - - - -> Clean up/prune unnecessary files and reduce the size of your `node_modules` directory. Useful for -> CI caches or for reducing the size of serverless functions. - -- ๐Ÿงน Removes directories and files that are unnecessary and **safe to remove in production** -- ๐Ÿ›  Easily customizable through glob patterns (either through [CLI args](#positionals) or a - [configuration file](#glob-patterns-and-configuration-file)) -- ๐Ÿ“ Cleans up empty directories after removing files -- โšก๏ธ Super fast, but still written in Node -- ๐Ÿ” Allows analyzing results, like which pattern excluded which file -- ๐Ÿง‘โ€๐Ÿ’ป Supports both CLI and programmatic usage - -

- Small project - Large project - Dry run -

+ +Saves space by removing redundant files from your `node_modules`. Useful for CI caches +or reducing the size of serverless functions. + +- Fully customizable through glob patterns, either via [CLI args](#positionals) or + [config file](#glob-patterns-and-configuration-file). +- Pure Node.js, no separate binary or runtime needed. +- Fast. ## Table of contents
Click to open -- [Quick start](#quick-start) - [Installation](#installation) +- [Quick start](#quick-start) - [Commands](#commands) - - [`clean-modules clean` (default command) ๐Ÿงน](#clean-modules-clean-default-command-) - - [Usage](#usage) + - [`clean-modules [clean]`](#clean-modules-clean) - [Positionals](#positionals) - [Options](#options) - - [`--directory | -D`](#--directory---d) - - [`--glob-file | -f`](#--glob-file---f) - - [`--no-defaults | -n`](#--no-defaults---n) - - [`--keep-empty | -k`](#--keep-empty---k) - - [`--dry-run | -d`](#--dry-run---d) - - [`--json | -j`](#--json---j) - - [`--yes | -y`](#--yes---y) - - [`clean-modules analyze` ๐Ÿ”Ž](#clean-modules-analyze-) - - [Usage](#usage-1) + - [`clean-modules analyze`](#clean-modules-analyze) - [Positionals](#positionals-1) - [Options](#options-1) - - [Example output](#example-output) - [Glob patterns and configuration file](#glob-patterns-and-configuration-file) - [Example configuration file](#example-configuration-file) - [Default globs](#default-globs) - [Common extra inclusions](#common-extra-inclusions) - [Common extra exclusions](#common-extra-exclusions) - [Programmatic usage](#programmatic-usage) -- [Alternatives](#alternatives) - - [Comparisons](#comparisons) - - [clean-modules (this project)](#clean-modules-this-project) - - [yarn autoclean](#yarn-autoclean) - - [modclean](#modclean) - - [node-prune](#node-prune) - - [nm-prune](#nm-prune)
-## Quick start - -Simply run the command in the directory where your `node_modules` are: +## Installation ```bash -clean-modules +npm install --save-dev clean-modules ``` -You can also pass any options that you need, like custom globs or a path to a specific -`node_modules` directory. +Project installation is optional. You can also install it globally, or run it directly via `npx clean-modules` or equivalent. + +## Quick start + +Run it in your project root: ```bash -clean-modules --directory "path/to/node_modules" "extra/included/file/glob.txt" "!extra/excluded/glob.ts +npx clean-modules ``` -Check out the [command](#clean-modules-clean-default-command-๐Ÿงน) section for all available options. - -## Installation +Accept the confirmation prompt, and you'll see output like: -`clean-modules` can be installed globally if you only want to use it as a CLI tool. You can also -install it locally if you want to use it in a package command. +``` +clean-modules -```bash -# global -npm install --global clean-modules +Cleaning up node_modules... +Done in 1.15s! -# dev dependency -npm install --save-dev clean-modules +Results: +- size reduced: 314.4 MB +- files matched: 25741 +- files removed: 25741 +- empty dirs removed: 1361 ``` -## Commands +_To include/exclude extra files or set other options, see the [clean command docs](#clean-modules-clean) below._ -### `clean-modules clean` (default command) ๐Ÿงน +## Commands -The default command, cleans up your `node_modules` based on a set of _most likely_ safe glob -patterns and removes empty directories. +### `clean-modules [clean]` -#### Usage +**Default command.** Cleans up your `node_modules` based on a set of _likely_ safe glob +patterns. ```bash -clean-modules [options] <...globs> +clean-modules [options] [globs...] +# or +clean-modules clean [options] [globs...] ``` #### Positionals -Extra glob patterns can be passed as positional arguments. By default they are combined with the globs loaded from the the default globs file and any custom globs file passed through the [`--glob-file`](#glob-file---f) option. - -For information on how the globs are parsed, see the [Glob patterns](#glob-patterns-and-configuration-file) section. - -**Example**: +Glob patterns can be passed as positional arguments to include or exclude extra files. See the [Glob patterns](#glob-patterns-and-configuration-file) section for how the globs are +parsed. ```bash -# include all TypeScript declaration files and @types folders -clean-modules "**/*.d.ts" "**/@types/**" +# include all .d.ts files and @types folders +clean-modules "*.d.ts" "**/@types/**" # exclude all sourcemap files and PNG files -clean-modules "!**/*.map.js" "!**/*.png" +clean-modules "!*.map.js" "!*.png" # include .d.ts files but exclude PNG files -clean-modules "**/*.d.ts" "!**/*.png" +clean-modules "*.d.ts" "!*.png" ``` #### Options -##### `--directory | -D` - -`string` [default: `./node_modules`] - -Accepts a path to a directory to run the script on. - -**Example**: - -```bash -clean-modules --directory "path/to/custom/node_modules" -``` - -##### `--glob-file | -f` - -`string` [default: `./.cleanmodules`] - -Accepts a path to a file from which clean-modules should read any custom globs. See the -[glob patterns](#glob-patterns-and-configuration-file) section for information about how the glob -file works and what patterns work. - -##### `--no-defaults | -n` - -`boolean` - -Excludes all default globs, using only custom globs added through the -[glob file](#glob-patterns-and-configuration-file) or by the include or exclude options. Useful if -you want complete control over what files to include. - -See the [`.cleanmodules-default`](./cleanmodules-default) to see what patterns are included by -default by default. - -##### `--keep-empty | -k` - -`boolean` - -Skips removing empty folders after removing files. - -##### `--dry-run | -d` - -`boolean` - -Runs the script and prints the result without actually removing any files. Does not count the number -of removed empty directories. - -##### `--json | -j` - -`boolean` - -Only logs a final JSON dump at the end of the script (useful for logs or services). - -##### `--yes | -y` - -`boolean` - -Skips the confirmation prompt at the start of the script. - -### `clean-modules analyze` ๐Ÿ”Ž - -Compiles a list of all files that would be included by `clean-modules` and gives a breakdown of: - -- exact file path -- what glob patterns it was included by -- how the patterns were formatted and passed along to `picomatch` -- if the file was included by default - -#### Usage +| Flag | Description | +| -------------------------- | ---------------------------------------------------------------------- | +| `--directory `, `-D` | Path to your `node_modules` directory.
_Default: `./node_modules`_ | +| `--glob-file `, `-f` | Path to a file with custom globs.
_Default: `./.cleanmodules`_ | +| `--no-defaults`, `-n` | Skip the default globs, use only globs explicitly set by you. | +| `--keep-empty`, `-k` | Skip removing empty folders after removing files. | +| `--yes`, `-y` | Skip the confirmation prompt at the start. | +| `--dry-run`, `-d` | Run without actually removing any files, just the final summary. | +| `--silent`, `-s` | Suppress all console output. | +| `--json`, `-j` | Only output a single JSON summary at the end. | +| `--fail-on-error`, `-e` | Exit with a non-zero status code if any files failed. | +| `--help`, `-h` | Show help. | +| `--version`, `-v` | Show version. | + +### `clean-modules analyze` + +Compiles a list of all files that would be marked for cleaning and gives a breakdown of: + +- Exact file path. +- What glob pattern(s) included it. +- How the patterns were parsed and passed to `picomatch`. +- Whether the file was included by default. ```bash -clean-modules analyze [options] +clean-modules analyze [options] [globs...] ``` -Because of the amount of data it can be useful to pipe it somewhere, like: +Because of the amount of data it can be useful to pipe it somewhere: ```bash clean-modules analyze >> clean-modules-result.json @@ -204,57 +133,38 @@ clean-modules analyze >> clean-modules-result.json #### Positionals -The `analyze` command accepts the same type of positionals as the [default command](). +Accepts the same positional globs as the [default clean command](#positionals). #### Options -The `analyze` command accepts several of the default command's options and applies them in the same -way: - -- [`--directory`](#directory---d) -- [`--glob-file`](#glob-file---f) -- [`--no-defaults`](#no-defaults---n) - -#### Example output - -```json -[ - { - "filePath": "/Users/me/projects/foo/node_modules/dependency/__tests__/test1.js", - "includedByDefault": true, - "includedByGlobs": [ - { - "original": "__tests__/", - "derived": "/Users/me/projects/foo/node_modules/dependency/**/__tests__/**" - } - ] - } - // ... -] -``` +| Flag | Description | +| -------------------------- | ---------------------------------------------------------------------- | +| `--directory `, `-D` | Path to your `node_modules` directory.
_Default: `./node_modules`_ | +| `--glob-file `, `-f` | Path to a file with custom globs.
_Default: `./.cleanmodules`_ | +| `--no-defaults`, `-n` | Skip the default globs, use only globs explicitly set by you. | +| `--help`, `-h` | Show help. | +| `--version`, `-v` | Show version. | ## Glob patterns and configuration file -clean-modules accepts globs from either a configuration file (`.cleanmodules` next to -`node_modules` by default) or CLI arguments. It uses -[`.gitignore`-like](https://www.atlassian.com/git/tutorials/saving-changes/gitignore) glob patterns -that are converted to valid [`picomatch`](https://github.com/micromatch/picomatch) globs, which is -what is used to match file paths under the hood. +Custom globs can be provided to clean-modules in two ways: + +- Via a configuration file (`.cleanmodules` by default, can be changed via `--glob-file`). +- As positional CLI arguments. + +Both approaches accept the same .gitignore-like syntax, which is later converted to optimized [`picomatch`](https://github.com/micromatch/picomatch) compatible globs under the hood. **Differences from regular gitignore syntax:** -- To include a directory the pattern _must_ end with `/`, `/*` or `/**` - - This is to prevent directories matching common file names from being included by the globs. - Casing is ignored. - -**Like with .gitignore, globs should use forward-slashes as separators on all operative systems (including Windows)!** +- To include a directory the pattern _must_ end with `/`, `/*` or `/**`. This is to prevent + directories matching common file names from being included by the globs. +- Extended glob matching is supported ([extglobs](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)). ### Example configuration file -```ignore -# this is a comment (starts with a #) - -# to include include directories, end patterns with / or /* or /** +```sh +# to include directories, end patterns with / or /* or /** dep1/ dep1/* dep2/** @@ -279,11 +189,10 @@ dep2/** ### Default globs The default globs can be found in the [`.cleanmodules-default`](./.cleanmodules-default) file. It -only contains inclusions (as exclusions would override custom inclusions) and consists of a large -list of the most common files that are safe to remove. +consists of a large list of the most common files that are safe to remove. -That said, it's impossible to guarantee that none of the files are needed, and you might need to do -custom exclusions depending on what packages you use. +That said, it's impossible to guarantee that all redundant files are removed (or that no removed +files are needed), and you might need to add custom exclusions depending on what packages you use. #### Common extra inclusions @@ -294,17 +203,17 @@ custom exclusions depending on what packages you use. #### Common extra exclusions - `!**/*.map.js`: **If you are running `clean-modules` locally or need source files in production.** - `clean-modules` removes sourcemap files by default since they take up a lot of space and does not + Sourcemap files are removed by default since they take up a lot of space and don't break builds when removed. They can be nice to have though, especially while developing. -## Programmatic usage - -Clean modules can be used programmatically too! +- `!*.{jpg,jpeg,png,gif,webp}`: **If you are using dependencies that provide image files.** + Images and media files are removed by default since they take up a lot of space and are usually not + included in libraries, but some dependencies might use them at runtime. -Simply import the corresponding function from the package: +## Programmatic usage ```ts -import { clean, analyze } from 'clean-modules'; +import { analyze, clean } from 'clean-modules'; // analyze, all options are optional const analyzeResult = await analyze({ @@ -325,56 +234,10 @@ const cleanResult = await clean({ }); ``` -## Alternatives - -The most common issues I found with available tools are: - -- They only allow inclusion/exclusion of file names, not file paths. This prevents you from e.g. - excluding subdirectories of a specific folder, like `@types/react-native`. -- They include too many, or too few, patterns by default. Lots of them also include patterns like - `*.ts` by default, which breaks TypeScript declaration files on build. -- They are too slow (only relevant when running on large projects) -- They are abandoned or don't respond to issues. - -### Comparisons - -#### clean-modules (this project) - -- โœ… Inclusion/exclusion through file path globs -- โœ… Fast -- โœ… Safe list of files and folders included by default (for production use) -- โœ… Cleans up empty directories - -#### [yarn autoclean](https://classic.yarnpkg.com/en/docs/cli/autoclean/) - -- โœ… Included with Yarn by default -- โœ… Inclusion/exclusion through globs -- โ›”๏ธ Very slow compared to alternatives -- โ›”๏ธ Runs on every install, both locally and in CI -- โ›”๏ธ Small list of files included by default - -#### [modclean](https://github.com/ModClean/modclean) - -- โœ… Cleans up empty directories -- โœ… Safe list of files and folders included by default -- โ›”๏ธ Slow, only slightly faster than `yarn clean` -- โ›”๏ธ Only allows inclusion/exclusion by file name globs, not file path -- โ›”๏ธ Complains about empty folders that doesn't exist -- โ›”๏ธ Abandoned - -#### [node-prune](https://github.com/tj/node-prune) - -- โœ… Fastest option available -- โ›”๏ธ Written in Go and might require separate binary download -- โ›”๏ธ Removes some dangerous files by default (like `.d.ts` files and `assets` folder) -- โ›”๏ธ Only allows inclusion/exclusion by file name globs, not file path -- โ›”๏ธ Globs are very limited since it uses Go's `filepath.Match` -- โ›”๏ธ Does not remove empty folders +Both functions return a result object that mirrors the JSON output of the corresponding CLI command: -#### [nm-prune](https://github.com/tuananh/node-prune) +- `clean` resolves to `{ files, removedFilesCount, reducedSize, removedEmptyDirs, failures }`. +- `analyze` resolves to `{ files, failures }`. -- โœ… Fast -- โ›”๏ธ Removes some dangerous files by default (like `.d.ts` files and `assets` folder) -- โ›”๏ธ Only allows inclusion/exclusion by file name, not file paths or globs -- โ›”๏ธ Does not remove empty folders -- โ›”๏ธ Small list of files included by default +`failures` is a list of non-fatal filesystem errors encountered while crawling or removing files +(e.g. permission errors). diff --git a/package.json b/package.json index 32be552..882ee44 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "clean-modules", "version": "3.1.1", - "description": "Reduce the size of your `node_modules` directory.", + "description": "Saves space by removing redundant files from your node_modules. Useful for CI caches or reducing the size of serverless functions.", "keywords": [ "ci", "cli-tool", From bb467f9765522844e70e60d58f0d2422f0226c08 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 18 May 2026 23:06:38 +0200 Subject: [PATCH 50/63] chore: update changesets schema --- .changeset/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index 3244c8d..e66ca0c 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,5 +1,5 @@ { - "$schema": "https://unpkg.com/@changesets/config@2.1.1/schema.json", + "$schema": "https://unpkg.com/@changesets/config@2.31.0/schema.json", "changelog": ["changesets-changelog-clean", { "repo": "duniul/clean-modules" }], "commit": false, "fixed": [], From d2cf7e4ddc48b5822b1b58e237b230f2862de1cf Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 18 May 2026 23:21:16 +0200 Subject: [PATCH 51/63] fixup readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3cfd44d..fd14b48 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ clean-modules analyze [options] [globs...] Because of the amount of data it can be useful to pipe it somewhere: ```bash -clean-modules analyze >> clean-modules-result.json +clean-modules analyze > clean-modules-result.json ``` #### Positionals @@ -219,7 +219,7 @@ import { analyze, clean } from 'clean-modules'; const analyzeResult = await analyze({ directory: '/path/to/node_modules', globFile: '/path/to/.cleanmodules', - globs: ['**/*.js'], + globs: ['**/*.d.ts'], noDefaults: false, }); @@ -227,7 +227,7 @@ const analyzeResult = await analyze({ const cleanResult = await clean({ directory: '/path/to/node_modules', globFile: '/path/to/.cleanmodules', - globs: ['**/*.js'], + globs: ['**/*.d.ts'], noDefaults: false, keepEmpty: false, dryRun: false, From b44d0effe6679f8be0b74f145ffaa6b275df328d Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 18 May 2026 23:23:04 +0200 Subject: [PATCH 52/63] fix: update directory defaultHint --- src/cli/__snapshots__/cli.test.ts.snap | 16 ++++++++-------- src/cli/helpers/args.ts | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/cli/__snapshots__/cli.test.ts.snap b/src/cli/__snapshots__/cli.test.ts.snap index 0f8dcbb..fd4d14f 100644 --- a/src/cli/__snapshots__/cli.test.ts.snap +++ b/src/cli/__snapshots__/cli.test.ts.snap @@ -14,7 +14,7 @@ $ clean-modules analyze [options] [globs...] โ”โ”โ” Options โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -h, --help Show help -v, --version Show version --D, --directory Path to node_modules (default: $PWD) +-D, --directory Path to node_modules (default: $PWD/node_modules) -f, --glob-file Path to a custom glob file (default: .cleanmodules) -n, --no-defaults Skips default glob patterns from being used " @@ -36,7 +36,7 @@ Extra globs can be passed as positional args. โ”โ”โ” Options โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -h, --help Show help -v, --version Show version --D, --directory Path to node_modules (default: $PWD) +-D, --directory Path to node_modules (default: $PWD/node_modules) -f, --glob-file Path to a custom glob file (default: .cleanmodules) -n, --no-defaults Skips default glob patterns from being used -k, --keep-empty Skips removing empty folders after cleanup @@ -68,8 +68,8 @@ Done in ! Results: - size reduced: 12.35 kB - files matched: 8 -- files removed: 3 -- empty dirs removed: 0 +- files removed: 3 +- empty dirs removed: 0 - failures: 8 Failed to process 8 files: @@ -103,7 +103,7 @@ Done in ! Results: - size reduced: 5 B - files matched: 5 -- files removed: 5 +- files removed: 5 - empty dirs removed: 3 " `; @@ -116,8 +116,8 @@ Done in ! Results: - size reduced: 0 B - files matched: 1 -- files removed: 0 -- empty dirs removed: 0 +- files removed: 0 +- empty dirs removed: 0 - failures: 1 Failed to process 1 file: @@ -147,7 +147,7 @@ clean-modules analyze โ”โ”โ” Options โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” -h, --help Show help -v, --version Show version --D, --directory Path to node_modules (default: $PWD) +-D, --directory Path to node_modules (default: $PWD/node_modules) -f, --glob-file Path to a custom glob file (default: .cleanmodules) -n, --no-defaults Skips default glob patterns from being used -k, --keep-empty Skips removing empty folders after cleanup diff --git a/src/cli/helpers/args.ts b/src/cli/helpers/args.ts index 15dd72d..d636e3b 100644 --- a/src/cli/helpers/args.ts +++ b/src/cli/helpers/args.ts @@ -27,7 +27,7 @@ export const sharedOptions = { type: 'string', short: 'D', default: sharedDefaultOptions.directory, - defaultHint: '$PWD', + defaultHint: '$PWD/node_modules', description: 'Path to node_modules', valueHint: 'path', }, From 06b490cf7b997db92d981f54a471ca7a7035194c Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Mon, 18 May 2026 23:23:26 +0200 Subject: [PATCH 53/63] fixup readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fd14b48..b3ba9cb 100644 --- a/README.md +++ b/README.md @@ -100,8 +100,8 @@ clean-modules "*.d.ts" "!*.png" | Flag | Description | | -------------------------- | ---------------------------------------------------------------------- | -| `--directory `, `-D` | Path to your `node_modules` directory.
_Default: `./node_modules`_ | -| `--glob-file `, `-f` | Path to a file with custom globs.
_Default: `./.cleanmodules`_ | +| `--directory `, `-D` | Path to your `node_modules` directory.
_Default: `$PWD/node_modules`_ | +| `--glob-file `, `-f` | Path to a file with custom globs.
_Default: `$PWD/.cleanmodules`_ | | `--no-defaults`, `-n` | Skip the default globs, use only globs explicitly set by you. | | `--keep-empty`, `-k` | Skip removing empty folders after removing files. | | `--yes`, `-y` | Skip the confirmation prompt at the start. | From 64849ba20de143abcd3b27b61a95f328f3ac513e Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 15:48:02 +0200 Subject: [PATCH 54/63] chore: remove unused image files --- images/dry-run.png | Bin 68748 -> 0 bytes images/large-project.png | Bin 58155 -> 0 bytes images/small-project.png | Bin 60112 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/dry-run.png delete mode 100644 images/large-project.png delete mode 100644 images/small-project.png diff --git a/images/dry-run.png b/images/dry-run.png deleted file mode 100644 index 958a2552b727854ab8502f52707cc9a023287ba0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68748 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

cd`7)Z}6eXcLHZ8=O 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 Qvj6}907*qoM6N<$g3-jG6951J diff --git a/images/large-project.png b/images/large-project.png deleted file mode 100644 index 4c4c1a241d09fee8e4f9cdd266050010b94a0dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58155 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 NV*`YKHSBKG{{XOLuZ{o! diff --git a/images/small-project.png b/images/small-project.png deleted file mode 100644 index c8cb261bccc672a6d52c231a8a1ba58a0dfaeef3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60112 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
    D> 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 Date: Sat, 23 May 2026 15:48:12 +0200 Subject: [PATCH 55/63] docs: fix badges --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b3ba9cb..5b745a3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # clean-modules ๐Ÿงน - - - +[![npm version](https://img.shields.io/npm/v/clean-modules)](https://www.npmjs.com/package/clean-modules) +[![npm downloads](https://img.shields.io/npm/dm/clean-modules)](https://www.npmjs.com/package/clean-modules) +[![node lts](https://img.shields.io/node/v-lts/clean-modules)](https://www.npmjs.com/package/clean-modules) Saves space by removing redundant files from your `node_modules`. Useful for CI caches or reducing the size of serverless functions. From f47e9b2c5d51490b1886c885255ad9041eff0181 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 15:56:15 +0200 Subject: [PATCH 56/63] chore: update dev deps --- package.json | 10 +- pnpm-lock.yaml | 480 ++++++++++++++++++++++++------------------------- 2 files changed, 245 insertions(+), 245 deletions(-) diff --git a/package.json b/package.json index 882ee44..47f8eba 100644 --- a/package.json +++ b/package.json @@ -61,15 +61,15 @@ "@types/picomatch": "4.0.3", "changesets-changelog-clean": "1.3.0", "memfs": "4.57.2", - "oxfmt": "0.50.0", - "oxlint": "1.65.0", - "oxlint-tsgolint": "0.22.1", + "oxfmt": "0.51.0", + "oxlint": "1.66.0", + "oxlint-tsgolint": "0.23.0", "tsdown": "0.22.0", "typescript": "6.0.3", - "vitest": "4.1.6" + "vitest": "4.1.7" }, "engines": { "node": ">=22" }, - "packageManager": "pnpm@11.1.2" + "packageManager": "pnpm@11.2.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4676653..ed0a3d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,14 +28,14 @@ importers: specifier: 4.57.2 version: 4.57.2(tslib@2.8.1) oxfmt: - specifier: 0.50.0 - version: 0.50.0 + specifier: 0.51.0 + version: 0.51.0 oxlint: - specifier: 1.65.0 - version: 1.65.0(oxlint-tsgolint@0.22.1) + specifier: 1.66.0 + version: 1.66.0(oxlint-tsgolint@0.23.0) oxlint-tsgolint: - specifier: 0.22.1 - version: 0.22.1 + specifier: 0.23.0 + version: 0.23.0 tsdown: specifier: 0.22.0 version: 0.22.0(typescript@6.0.3) @@ -43,8 +43,8 @@ importers: specifier: 6.0.3 version: 6.0.3 vitest: - specifier: 4.1.6 - version: 4.1.6(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)) + specifier: 4.1.7 + version: 4.1.7(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)) packages: @@ -312,276 +312,276 @@ packages: '@oxc-project/types@0.129.0': resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} - '@oxfmt/binding-android-arm-eabi@0.50.0': - resolution: {integrity: sha512-ICXQVKrDvsWUtfx6EiVJxfWrajKTwTfRV8vz2XiMkxZeuCKJLgD4YAj6dE3BWvpqDlkVkie4VSTAtMUWO9LDXg==} + '@oxfmt/binding-android-arm-eabi@0.51.0': + resolution: {integrity: sha512-Ni0sCqg5CIHaLIYFGj+ncbcumylvNC6FE4rfD0KfdmnWHbPJ+zev0qZCXKxy2hFVa0fYRK0yPzf5nzPbkZou7g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.50.0': - resolution: {integrity: sha512-quwjLQFkuW6OwLHeDeIXsTzOmipQFQbqsYN9HLk2B5I01IlAQZHP1UiLIg0O7pP+dUgPD2AD7SCYA3gs6NH5/g==} + '@oxfmt/binding-android-arm64@0.51.0': + resolution: {integrity: sha512-eu5lAZjuo0KAkp+M24EhDqfOwA8owQ8d7wyBlOUUGRbDLHpU3IRlDHp8Dif+YqGlxs6jra7yS6WQu/NkPhAxeg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.50.0': - resolution: {integrity: sha512-ikU5umElcMi78/TNI334wtjr5WZ5F4nWa1aIDseAKKGL0W3ygxeYKkrIJ0fggWa8MOon66BmG3xCqmX1m9YAOw==} + '@oxfmt/binding-darwin-arm64@0.51.0': + resolution: {integrity: sha512-6LsUNIdURhhcIfIn8+xsOb61mSTa9msAHTeSGx9Jf4rsP/gN8PGCF+SKWPAQZbND2w/WBkqQ6303jqEEIXzMdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.50.0': - resolution: {integrity: sha512-WT4MOYG4mv9IXrH0m60vHsJh+rRMPSOKTQmwDpwmgQ+DuW/i5dU4pqc0HDO5uclO5vjz5IFX5z/taW86LSVe/g==} + '@oxfmt/binding-darwin-x64@0.51.0': + resolution: {integrity: sha512-9aUMGmVxdHjYMsEAW1tNRoieTJXlVNDFkRvIR1J7LttJXWjVYCu2ekclLij2KJtxBxSQOYSHd12ME/adVGVbZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.50.0': - resolution: {integrity: sha512-gH0rycVXqV4juWkvLs2uPMtTyppDc7qEUVzXAxnQ7FpcSZNXqKowUgtjH8q67ngj416r8+4NnAlyR/D35zwwhQ==} + '@oxfmt/binding-freebsd-x64@0.51.0': + resolution: {integrity: sha512-mkY1nhZTqYb+NHaAWxOCKISN6FwdrwMNsu17vTUA3wzUV2VJ+Paq15ZokRcsMU/2PUdHO73prxyeJpjXQ3MPpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.50.0': - resolution: {integrity: sha512-wL/k+o0hiTeRvi/gPzeC1L/yTHTXIeHDKWU09s2zTBmv7ma59wTm+fADNSGYxhJQDxyavQbwTf1QpW3Zj924tQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.51.0': + resolution: {integrity: sha512-wtFwNwE4+YCNuPaWoGDZeGsKvD6D1YSUNBJNn/rJBh7CrDBThFE+TBI5kY7vRW9rIOQRsbW2IpyyL3Du4Zqwiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.50.0': - resolution: {integrity: sha512-Y59FKqoUM3Gf00E395b4ixfWyJGwO2GzaZawF5MZoVWcb3f6CkWUXyao0jyOvoIxDMzMybcVRuXyG7ih/Nxweg==} + '@oxfmt/binding-linux-arm-musleabihf@0.51.0': + resolution: {integrity: sha512-rnOaNx86G7iRKM6lsCIQMux0SMGNC/TEbFR+r7lpruJ12bnrIWgxd5w1PLqOvgR9r8ZJbpK/zfRKctJnh8/Jfg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.50.0': - resolution: {integrity: sha512-OvXbfTjMignXWyJXg/NOFsiy996vFe8wb9tkxJaUq8ylq0XrzJg3ttavC5Tcmm6F8/GUs2r3XFJWWu9q/27uYw==} + '@oxfmt/binding-linux-arm64-gnu@0.51.0': + resolution: {integrity: sha512-jOgDzSqWcICGRjsp4mc08FxKMN8vzP2Kgs4E0d2HUP99F+nJDQKklRV4Zuj+0gcBgjrzx2CbpqaIdUVPepCojA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.50.0': - resolution: {integrity: sha512-rqmvHZm7vMa3NLYa0khwkhReCmp9tqKnF23TFZ7S5cYJLvIE4b0k8famWE7kO897/DXznJe675n5SohFBggbxA==} + '@oxfmt/binding-linux-arm64-musl@0.51.0': + resolution: {integrity: sha512-KBUCdrH5bwVrAvI9gU/1S55oH6fzXjr++J/oVocdu7bYTks1l7DNNT+rLd/1TDdAEjObGwmfWamn7LC1m8A0DQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.50.0': - resolution: {integrity: sha512-49bAdYbMSde42tzPDtuHnBWzOgmoS0PT9THCjvMnDVYMQYiHzPc2Mv5rkpBHVQOXM+PHfafJlxgK0anXSWBVvw==} + '@oxfmt/binding-linux-ppc64-gnu@0.51.0': + resolution: {integrity: sha512-NapfjYsABFqTJ1Dn9Efq6sN5esaHconVKwVLbDGNQLrwpOx/g17mkwErHzU72PutL67nf3wNAkbq122H+zLxag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.50.0': - resolution: {integrity: sha512-VFT25/6kckkIM62KeWB2bi+xCEmC/zC+DcMaIpEfaio8ulkGDLSiTz11TyK0eqgTl3x5OklYEGDWohvAgOr8Bw==} + '@oxfmt/binding-linux-riscv64-gnu@0.51.0': + resolution: {integrity: sha512-5dlDt1dUZCVi6elIhiK1PWg9wpTzTcIuj0IZnSurvIoMrhOWqqTcc1dSTxcSkNaBZhfsNqRZdINI1zAgbKkJNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.50.0': - resolution: {integrity: sha512-BBJMuNy6jjkXjUUINF5UTQqb/nvjmtJad43Gp7bab0AAURAdthhJvduR7rHpWInpWYiaMzYsdrmURNcrmpxdZA==} + '@oxfmt/binding-linux-riscv64-musl@0.51.0': + resolution: {integrity: sha512-pgdWUJn0S5nulyiVdlFV8DzCUnGXkU99W5PSkkmbaZW+LrZBPxpezun4G0DDHbQaVYuJeCuKsXsGKGo77CkUTQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.50.0': - resolution: {integrity: sha512-Xd4y+yjAYHKmryXhyUUwbyRD01iKfcvI74iE01L6p4F8SwjhZQXDshK+T8PcrPZLiFqH263P5xqJk94amjkjzQ==} + '@oxfmt/binding-linux-s390x-gnu@0.51.0': + resolution: {integrity: sha512-2XTFUe97CbDGAI8vjwDfZ1HdakO0XIADyJ24idEg64SC4/K4in/OisXVnrW4NMK7I6TgC7EqRhC0Ln/nKhAemA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.50.0': - resolution: {integrity: sha512-Qp96rYJru7l++7mk4R+eh8qq9GFfFAMdmoN6VGoRHI8AA1XMnUIzH4u+zOcKZZwY+irHdsaBldDearwB4nOH7A==} + '@oxfmt/binding-linux-x64-gnu@0.51.0': + resolution: {integrity: sha512-kQ1OuCqqt/yyf0ZN9VFxW1/JnlgJgii3Dr7pWf9vNBvrX1hv6g39/+mc5oGRHRGJFZtl3zsGDWR9c5N2B/gwBw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.50.0': - resolution: {integrity: sha512-5XLGp+yd5w2Key5LMqJO+X3XVsJKgeeUKljy32+MBF/J/JZ5m8WHl6dI5eOQOr3ixopxPiXIyDAxn3slI3UXiQ==} + '@oxfmt/binding-linux-x64-musl@0.51.0': + resolution: {integrity: sha512-ARTYqxHF475o96Gbn41hvSWSSRygPlRDXZZgZ9I2scU1y0qiWpCQyZCoefaQa0mwv+wwtZ+luS4YOzsRzM/izg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.50.0': - resolution: {integrity: sha512-QAxwzh7+GHugCD7WuERolVs8TKQwXNIAZXAHHTecbKVc9oWBkWzOiLauQuezXS57tVcof5zhi1IjZ8tOV0htTg==} + '@oxfmt/binding-openharmony-arm64@0.51.0': + resolution: {integrity: sha512-QiC1XrCl6a6BmqMzduO8hdIRMf1m44hCkt2Q68KWkTvUB/E7fd2iomyNh6KnnRca5w6eBrRAAtLFqTh+xjsjJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.50.0': - resolution: {integrity: sha512-3nKN/kqClm9iCFWTwtJ9UpR5SGyExp5l3nw6uIiBt+3XitQtszin+vjHrL7JHfDksZ7Svigdaow2zqz/IKCfqw==} + '@oxfmt/binding-win32-arm64-msvc@0.51.0': + resolution: {integrity: sha512-NC/hJb9dtU23Zf8L7IVK95xnFjiQ7AfcLO2l5pb69TDEr958qxrtnB2CveeeNSCBFNIkgaTCfd/vHNSoG78l9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.50.0': - resolution: {integrity: sha512-3r6XZ8+X6qlLbXaPW2NygfiAWSpKbkE36pAVzS83mY+cYY+pSMalJ+qnCgkr92tr+Iqv988XKQ1CpARTg9ITbQ==} + '@oxfmt/binding-win32-ia32-msvc@0.51.0': + resolution: {integrity: sha512-2C45za4Rj36n8YIbhRL1PQbxmXJYf81WEcAgvj5I4ptRROG+A+81hREEN5bmCHADE1UfYaN312U6tkILoZZy6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.50.0': - resolution: {integrity: sha512-BSE8D8KsvquMG9vU+Qt4qGuoOcZ36rxU5S6ZkHNguj+MlWkXWCBETnno3yJ9CfWvfCrbmieaN9LK6hdcdHNZ/w==} + '@oxfmt/binding-win32-x64-msvc@0.51.0': + resolution: {integrity: sha512-73RqdAuVKQTkjZIDw08JaDHUM4lav5Qu+CaPwg4QbbA7k8o7LEW0p3UsfZ/F8dsO/pwVYh3RzFcanwLRTTahbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.22.1': - resolution: {integrity: sha512-4150Lpgc1YM09GcjA6GSrra1JoPjC7aOpfywLjWEY4vW0Sd1qKzqHF1WRaiw0/qUZ40OATYdv3aRd7ipPkWQbw==} + '@oxlint-tsgolint/darwin-arm64@0.23.0': + resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.22.1': - resolution: {integrity: sha512-vFWcPWYOgZs4HWcgS1EjUZg33NLcNfEYU49KGImmCfZWkflENrmBYV4HN/C0YeAPum6ZZ/goPSvQrB/cOD+NfA==} + '@oxlint-tsgolint/darwin-x64@0.23.0': + resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.22.1': - resolution: {integrity: sha512-6LiUpP0Zir3+29FvBm7Y28q/dBjSHqTZ5MhG1Ckw4fGhI4cAvbcwXaKvbjx1TP7rRmBNOoq/M5xdpHjTb+GAew==} + '@oxlint-tsgolint/linux-arm64@0.23.0': + resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.22.1': - resolution: {integrity: sha512-fuX1hEQfpHauUbXADsfqVhRzrUrGabzGXbj5wsp2vKhV5uk/Rze8Mba9GdjFGECzvXudMGqHqxB4r6jGRdhxVA==} + '@oxlint-tsgolint/linux-x64@0.23.0': + resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.22.1': - resolution: {integrity: sha512-8SZidAj+jrbZf9ZjBEYW0tiNZ+KasqB2zgW26qdiPpQSF/DzURnPmXz651IeA9YsmbVdHGIooEHUmev6QJdquA==} + '@oxlint-tsgolint/win32-arm64@0.23.0': + resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.22.1': - resolution: {integrity: sha512-QweSk9H5lFh5Y+WUf2Kq/OAN88V6+62ZwGhP38gqdRotI90luXSMkruFTj7Q2rYrzH4ZVNaSqx7NY8JpSfIzqg==} + '@oxlint-tsgolint/win32-x64@0.23.0': + resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.65.0': - resolution: {integrity: sha512-jDVaGNURT5pEA9qcabh6WusIoBNybOMMDPCx+EFt+gxo6rVvoUf0+73Xy5x81+ZrxU+ewk5uRBYifjy5pgkcnA==} + '@oxlint/binding-android-arm-eabi@1.66.0': + resolution: {integrity: sha512-f7kq8N51T4phpzqfBpA2qaVTI/KrkCmNwaj3t/97I/WLTDI+UhlP5GL9eER+zVxBhtlx5rKXWByJU1/zDAvyaw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.65.0': - resolution: {integrity: sha512-v0z80IWNA7c9RhUydq9YprBxCVZrQ6Ixls2tdxUC1F/1FFqSfa7xTX+EJf0mj6+BKRg2zWXqWfcbJUnETlLlIw==} + '@oxlint/binding-android-arm64@1.66.0': + resolution: {integrity: sha512-xu6QO71tdDS9mjmLZ3AqhtaVHBvdmsOKkYnReNNDgh+XiwnsipeQOIxbiYOOO0iAXycJ+GK0wdMSZP/2j/AmSg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.65.0': - resolution: {integrity: sha512-pL/mG/5gMzBwp1gdc5+Cwi87F9j3XRnPxHGyVj5Zd+dCEV5YkKt0L70PB3EGmEEHxgn4H+jnMS3xLuXs6mZW/Q==} + '@oxlint/binding-darwin-arm64@1.66.0': + resolution: {integrity: sha512-HZ24VimSOC7mxuEA99e0H2FS0C1yO3+iW13jPRAk+e2njsUs3QeAXsafCDyaIrV/MirdOVez+etQNQsJE43zNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.65.0': - resolution: {integrity: sha512-jVTneaeuHtqTrKYnhrdH1buhnSorinvpy1sv43ayclfWx/e/DfdRWv+h1fopJcHQbYr5WMcZMmDvnfEBkPZ+1A==} + '@oxlint/binding-darwin-x64@1.66.0': + resolution: {integrity: sha512-awhj8ZvJrrRSnXj7V++rpZvTmnl99L6mi0B7gg7Cp7BN6cKpzuI481bHNLvXGA9GB1/oEgA3ponuyoAc6Md12A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.65.0': - resolution: {integrity: sha512-8lJQ7B6RloYDUhwVdbSpwT2eKsCN5KP1Scn18ly1tytCuhXhbs0nkfKHT4jWWZBJqmynWuzd+78bF7wILrj6pw==} + '@oxlint/binding-freebsd-x64@1.66.0': + resolution: {integrity: sha512-KQF0oVV21/FjIqkRuL8Q1vh8ECsE5+ocdH5tcqTQ4ZnYuDVoYibQUNfqBjQaUsP6UIIda5Y75Wpm5p4RgQWiWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.65.0': - resolution: {integrity: sha512-EgmZY+DeWhLLEnNl70/49j3ltA8I6X9kxMfexupWi2Vwfp6RonGsBaHtGoedLolaU37ne7eDUgoxa3CFB95GZA==} + '@oxlint/binding-linux-arm-gnueabihf@1.66.0': + resolution: {integrity: sha512-9u1rgwZSEXWb30vbFZzQ78HVXBo0WCKNwJ3a2InRUTNMRng+PUDIoSFmA+m4HdUfBaIqftShq8J8qHc+eE/Vig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.65.0': - resolution: {integrity: sha512-OJMWmAYRVBCPPxnYr3j5sXRwHPh1bAuMlTStGco1Z8q3HkvSH4h+A10E9MiRNYmLhUuli5a2P5wmfj8cagiF5Q==} + '@oxlint/binding-linux-arm-musleabihf@1.66.0': + resolution: {integrity: sha512-Ynot2HR1bHxUaNWoC280MVTDfZuaWuP3XfSMRDhyuZrVjhzoaBCVFlw8h8qeZjWKVUBhPWFIxB7AQTlK8Z2WWg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.65.0': - resolution: {integrity: sha512-D8uNi50LsYKgS0vGARZDRx05TBZeSxAVdLGddSEqQLSU7xsiqdImHPEw55xq8sKA5rCc/4au/5uS7FQALWdLCg==} + '@oxlint/binding-linux-arm64-gnu@1.66.0': + resolution: {integrity: sha512-xCbgzciGgo+A4aQZEknsNrNiIwY7sU5SfRuMmRjPIvZAgdF34cIHiKvwOsS5XRLjlTVSFwitmq6YclTtHTfU+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.65.0': - resolution: {integrity: sha512-IpbA8QGbwFehQhO+YaHwmoI81f93xvywpspf8HrdPCWOIeKwYfM1dhVhO4YKfZewTRRQEPY/JFjTOXTgkwhKrA==} + '@oxlint/binding-linux-arm64-musl@1.66.0': + resolution: {integrity: sha512-hmo+ZB/lHkR1HdDmnziNpzSLmulnUSu10VEqX2Yex7OwvoBAbjJQLvy4gIBRV3AAwWnCvAxKp5Nv1GE6LU1QMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.65.0': - resolution: {integrity: sha512-ZSe8HgaZdgyHSv2+/pTG68z10+OarB18CkFKQOhRs3lmmP/p2vuigedK2e9d0ztoG2DU/duJzhxXBSjy/492HQ==} + '@oxlint/binding-linux-ppc64-gnu@1.66.0': + resolution: {integrity: sha512-2Invd4Uyy81mVooQC5FBtfxSNrvcX1OxbMlVQ6M2erRrNI2awFYF26YNW2yFxdVFZ4ffNOWKghtMjhnUPsXsVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.65.0': - resolution: {integrity: sha512-DcTERf++v6HyPHukKAr0JFTRqB+YeDEvqzRgNDMaz7jITPf+tlJIwRxodlAqoXMYhNVEZhXdQM5RAAYH8/oPuw==} + '@oxlint/binding-linux-riscv64-gnu@1.66.0': + resolution: {integrity: sha512-s0iXPDQVdgayE3RGa/N2DZF7tjgg0TwEtD1sGoDxqPDGrIXgo45H0yHknT0f9A0yteASsweYZtDyTuVlM4aSag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.65.0': - resolution: {integrity: sha512-xjhMwuFJwRh40NOBzol4gM5gqAa0xPCJU+GQLM6BydV8TbfkIA7JeyCFNhyfbE9Q/5EWcKYTx62R0cRcjP7DAA==} + '@oxlint/binding-linux-riscv64-musl@1.66.0': + resolution: {integrity: sha512-OekL4XFiu7RPK0JIZi8VeHgtIXPREf42t8Cy/rKEsC+P3gcqDgNAAGiyuUOpdbG4wwbfue1q4CHcCO7spSve6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.65.0': - resolution: {integrity: sha512-lrWSXb8JzboPWYBG6Kunt/eemvjo2oCFXktShsm3yMToY7HjzKLjxh7CljSvGnnZH9oohNFHOKc9xYpGKCPm6w==} + '@oxlint/binding-linux-s390x-gnu@1.66.0': + resolution: {integrity: sha512-Ga1D0kj1SFslm34ThA/BdkUlyAYEnTsXyRC4pF0C5agZSwtGdHYWMTQWemUfBGp4RCG4QWXgdO+HmmmKqOtlBg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.65.0': - resolution: {integrity: sha512-A7xfghw250m4a1sPV+q44Mow2G5bhiC9FBvhAuIhJS6QovWnqzuL5AFQPEuwOB+PM4DhABkqxVa3Iwe3Y/nFlQ==} + '@oxlint/binding-linux-x64-gnu@1.66.0': + resolution: {integrity: sha512-p5jfP1wUZe/IC3qpQO84n9DRnf9g3lKRtLBlQq23ykyrDglHcVx7sWmVTlPuU6SBw8mNnPzyOn022G3XZHnlww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.65.0': - resolution: {integrity: sha512-reqOun1+pWO3fW6cv7bsa8hHG0TN3t/82qPdaoJo90FwugXiMjKhZMChmH5Z01cFNRHmxN4+543Fy8478cM/iA==} + '@oxlint/binding-linux-x64-musl@1.66.0': + resolution: {integrity: sha512-vUB/sYlYZorDL1ZD+o9mRv7zbsykrrFRtmgS6R8musZqLtrPRQn1gc1eGpuX+sfdccz42STl/AqldY6XRb2upQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.65.0': - resolution: {integrity: sha512-KQpqOb/juDBO0xyloDkVDhOVxDUgAfZ2OAAVq99TJScJDzT319xry1QzB9LQohV9QGnA7p6m/XATZkMXc84lwA==} + '@oxlint/binding-openharmony-arm64@1.66.0': + resolution: {integrity: sha512-yde+6p/F59xRkGR9H1HfngWRif1QRJjynZK349l+UI0H6w9hL3G8/AVaTHFyTtLVQ56qtNbX2/5Dc77n1ovnOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.65.0': - resolution: {integrity: sha512-xfqcOc3nJFeAd1kDY4T9d3XeJIhr00twaaW0kOAzGPyUHkruXtNJv6zz1Ra9fRtSek5VpW2Yoj5AcwPIlT0ZiQ==} + '@oxlint/binding-win32-arm64-msvc@1.66.0': + resolution: {integrity: sha512-O9GLucgoTdmOrbBX+EjzNe7o/Ze5TFOvXcib6bzUOtBOmj6cV+zw18NgB+cGKAkDw1Pdqs8vGkfHbbsLuDtXWg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.65.0': - resolution: {integrity: sha512-JV+pXm45p8sdgs3c7LOPAohW23optCNZETFOXUcjn6cS4PYZhEU/RI54Z5dHdMudab3nw7T48PZILthM+Q0COQ==} + '@oxlint/binding-win32-ia32-msvc@1.66.0': + resolution: {integrity: sha512-m3Pjwc2MfTcom4E4gOv7DyuGyt7OfGNCbmqDHd+N7EzXmP+ppHuudm2NjcA3AjV5TSeGxaguVF4SbTKHe1USYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.65.0': - resolution: {integrity: sha512-D7L/oBbskLss21bYrRbFuIs81AiSQV+wRzwck54dOkHIlq2qu1xjLz8u6jCqGH8Fltk8bB5DLBpVhE7v/fA8XQ==} + '@oxlint/binding-win32-x64-msvc@1.66.0': + resolution: {integrity: sha512-/DbBvw8UFBhja6PqudUjV4UtfsJr0Oa7jUjWVKB0g86lj/VwnPrkngn0sFql3c9RDA0O16dh7ozsXb6GjNAzBQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -812,11 +812,11 @@ packages: '@types/picomatch@4.0.3': resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} - '@vitest/expect@4.1.6': - resolution: {integrity: sha512-7EHDquPthALSV0jhhjgEW8FXaviMx7rSqu8W6oqCoAuOhKov814P99QDV1pxMA3QPv21YudvJngIhjrNI4opLg==} + '@vitest/expect@4.1.7': + resolution: {integrity: sha512-1R+tw0ortHEbZDGMymm+pN7/AFQ/RkFFdtd7EN+VBpynKmLbP8A3rpEXdshBJ7+8hQ9zBJh/i1s0yKNtxAnU7w==} - '@vitest/mocker@4.1.6': - resolution: {integrity: sha512-MCFc63czMjEInOlcY2cpQCvCN+KgbAn+60xu9cMgP4sKaLC5JNAKw7JH8QdAnoAC88hW1IiSNZ+GgVXlN1UcMQ==} + '@vitest/mocker@4.1.7': + resolution: {integrity: sha512-vY7nuamKgfvpA1Koa3oYIw/k7D6kZnpGyNMZW8loow2bsBYla1TFdqTaXncWdRn4pgwNs+90RhnXhJScDwQeJA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -826,20 +826,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.6': - resolution: {integrity: sha512-h5SxD/IzNhZYnrSZRsUZQIC+vD0GY8cUvq0iwsmkFKixRCKLLWqCXa/FIQ4S1R+sI+PGoojkHsdNrbZiM9Qpgw==} + '@vitest/pretty-format@4.1.7': + resolution: {integrity: sha512-umgCarTOYQWIaDMvGDRZij+6b9oVeLIyJzfN+AS88e0ZOU3QTgNNSTtjQOpcvWr3np1N0j4WgZj+sb3oYBDscw==} - '@vitest/runner@4.1.6': - resolution: {integrity: sha512-nOPCmn2+yD0ZNmKdsXGv/UxMMWbMuKeD6GyYncNwdkYDxpQvrPSKYj2rWuDjC2Y4b6w6hjip5dBKFzEUuZe3vA==} + '@vitest/runner@4.1.7': + resolution: {integrity: sha512-BapjmAQ2aI78WdMEfeUWivnfVzB+VPGwWRQcJE0OUq7qEeEcBsCSf+0T5iREBNE5nBb4wA5Ya0W6IA+sghdEFw==} - '@vitest/snapshot@4.1.6': - resolution: {integrity: sha512-YhsdE6xAVfTDmzjxL2ZDUvjj+ZsgyOKe+TdQzqkD72wIOmHka8NuGQ6NpTNZv9D2Z63fbwWKJPeVpEw4EQgYxw==} + '@vitest/snapshot@4.1.7': + resolution: {integrity: sha512-ZacLzja+TmJeZ1h14xW2FB/WpeimUD3haBXQPyJqxvo8jQTmfeA8zv58mtjN2C7EHXZDYVcVYdYmAxjkWVvKCw==} - '@vitest/spy@4.1.6': - resolution: {integrity: sha512-JFKxMx6udhwKh/Ldo270e17QX710vgunMkuPAvXjHSvC6oqLWAHhVhjg/I71q0u0CBSErIODV1Kjv0FQNSWjdg==} + '@vitest/spy@4.1.7': + resolution: {integrity: sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q==} - '@vitest/utils@4.1.6': - resolution: {integrity: sha512-FxIY+U81R3LGKCxaHHFRQ5+g6/iRgGLmeHWdp2Amj4ljQRrEIWHmZyDfDYBRZlpyqA7qKxtS9DD1dhk8RnRIVQ==} + '@vitest/utils@4.1.7': + resolution: {integrity: sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -1197,8 +1197,8 @@ packages: outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - oxfmt@0.50.0: - resolution: {integrity: sha512-owwjTnhfM5aCOJhYeqDvk7iM504OeYFZpdRU7cxx7xtZMo4uVpjlryTUon+Cf76CugsvnqA32e6rC73pr1hXaw==} + oxfmt@0.51.0: + resolution: {integrity: sha512-l/AoAnaEOV7Q5/Z9kHOMDehVJnCgYN7wRoooWCTUMBMi16BJhLZqd9cmCnwcVFfVlzkt53zK2KLPFNp8vSsoDg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1207,12 +1207,12 @@ packages: svelte: optional: true - oxlint-tsgolint@0.22.1: - resolution: {integrity: sha512-YUSGSLUnoolsu8gxISEDio3q1rtsCozwfOzASUn3DT2mR2EeQ93uEEnen7s+6LpF+lyTQFln1pQfqwBh/fsVEg==} + oxlint-tsgolint@0.23.0: + resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==} hasBin: true - oxlint@1.65.0: - resolution: {integrity: sha512-ChUuE3Q7XnAbscvT4XLMsH7HFJmLgLVv9lu+RRgFL5wSXnDqUOzTp5IS8qWDBGd/ZDSzQ2tbX8fjAmijlGLC7A==} + oxlint@1.66.0: + resolution: {integrity: sha512-N4LLxYLd94KEBqXDMDM5f+2PUpItTjDLreXe2Gn5KhjhCK4Qp2YUXaBi8Yu325ryOgKwt22m45fpD7nPOn69Yw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -1531,20 +1531,20 @@ packages: yaml: optional: true - vitest@4.1.6: - resolution: {integrity: sha512-6lvjbS3p9b4CrdCmguzbh2/4uoXhGE2q71R4OX5sqF9R1bo9Xd6fGrMAfvp5wnCzlBnFVdCOp6onuTQVbo8iUQ==} + vitest@4.1.7: + resolution: {integrity: sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.6 - '@vitest/browser-preview': 4.1.6 - '@vitest/browser-webdriverio': 4.1.6 - '@vitest/coverage-istanbul': 4.1.6 - '@vitest/coverage-v8': 4.1.6 - '@vitest/ui': 4.1.6 + '@vitest/browser-playwright': 4.1.7 + '@vitest/browser-preview': 4.1.7 + '@vitest/browser-webdriverio': 4.1.7 + '@vitest/coverage-istanbul': 4.1.7 + '@vitest/coverage-v8': 4.1.7 + '@vitest/ui': 4.1.7 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1967,136 +1967,136 @@ snapshots: '@oxc-project/types@0.129.0': {} - '@oxfmt/binding-android-arm-eabi@0.50.0': + '@oxfmt/binding-android-arm-eabi@0.51.0': optional: true - '@oxfmt/binding-android-arm64@0.50.0': + '@oxfmt/binding-android-arm64@0.51.0': optional: true - '@oxfmt/binding-darwin-arm64@0.50.0': + '@oxfmt/binding-darwin-arm64@0.51.0': optional: true - '@oxfmt/binding-darwin-x64@0.50.0': + '@oxfmt/binding-darwin-x64@0.51.0': optional: true - '@oxfmt/binding-freebsd-x64@0.50.0': + '@oxfmt/binding-freebsd-x64@0.51.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.50.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.51.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.50.0': + '@oxfmt/binding-linux-arm-musleabihf@0.51.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.50.0': + '@oxfmt/binding-linux-arm64-gnu@0.51.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.50.0': + '@oxfmt/binding-linux-arm64-musl@0.51.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.50.0': + '@oxfmt/binding-linux-ppc64-gnu@0.51.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.50.0': + '@oxfmt/binding-linux-riscv64-gnu@0.51.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.50.0': + '@oxfmt/binding-linux-riscv64-musl@0.51.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.50.0': + '@oxfmt/binding-linux-s390x-gnu@0.51.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.50.0': + '@oxfmt/binding-linux-x64-gnu@0.51.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.50.0': + '@oxfmt/binding-linux-x64-musl@0.51.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.50.0': + '@oxfmt/binding-openharmony-arm64@0.51.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.50.0': + '@oxfmt/binding-win32-arm64-msvc@0.51.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.50.0': + '@oxfmt/binding-win32-ia32-msvc@0.51.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.50.0': + '@oxfmt/binding-win32-x64-msvc@0.51.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.22.1': + '@oxlint-tsgolint/darwin-arm64@0.23.0': optional: true - '@oxlint-tsgolint/darwin-x64@0.22.1': + '@oxlint-tsgolint/darwin-x64@0.23.0': optional: true - '@oxlint-tsgolint/linux-arm64@0.22.1': + '@oxlint-tsgolint/linux-arm64@0.23.0': optional: true - '@oxlint-tsgolint/linux-x64@0.22.1': + '@oxlint-tsgolint/linux-x64@0.23.0': optional: true - '@oxlint-tsgolint/win32-arm64@0.22.1': + '@oxlint-tsgolint/win32-arm64@0.23.0': optional: true - '@oxlint-tsgolint/win32-x64@0.22.1': + '@oxlint-tsgolint/win32-x64@0.23.0': optional: true - '@oxlint/binding-android-arm-eabi@1.65.0': + '@oxlint/binding-android-arm-eabi@1.66.0': optional: true - '@oxlint/binding-android-arm64@1.65.0': + '@oxlint/binding-android-arm64@1.66.0': optional: true - '@oxlint/binding-darwin-arm64@1.65.0': + '@oxlint/binding-darwin-arm64@1.66.0': optional: true - '@oxlint/binding-darwin-x64@1.65.0': + '@oxlint/binding-darwin-x64@1.66.0': optional: true - '@oxlint/binding-freebsd-x64@1.65.0': + '@oxlint/binding-freebsd-x64@1.66.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.65.0': + '@oxlint/binding-linux-arm-gnueabihf@1.66.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.65.0': + '@oxlint/binding-linux-arm-musleabihf@1.66.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.65.0': + '@oxlint/binding-linux-arm64-gnu@1.66.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.65.0': + '@oxlint/binding-linux-arm64-musl@1.66.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.65.0': + '@oxlint/binding-linux-ppc64-gnu@1.66.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.65.0': + '@oxlint/binding-linux-riscv64-gnu@1.66.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.65.0': + '@oxlint/binding-linux-riscv64-musl@1.66.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.65.0': + '@oxlint/binding-linux-s390x-gnu@1.66.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.65.0': + '@oxlint/binding-linux-x64-gnu@1.66.0': optional: true - '@oxlint/binding-linux-x64-musl@1.65.0': + '@oxlint/binding-linux-x64-musl@1.66.0': optional: true - '@oxlint/binding-openharmony-arm64@1.65.0': + '@oxlint/binding-openharmony-arm64@1.66.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.65.0': + '@oxlint/binding-win32-arm64-msvc@1.66.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.65.0': + '@oxlint/binding-win32-ia32-msvc@1.66.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.65.0': + '@oxlint/binding-win32-x64-msvc@1.66.0': optional: true '@quansync/fs@1.0.0': @@ -2231,44 +2231,44 @@ snapshots: '@types/picomatch@4.0.3': {} - '@vitest/expect@4.1.6': + '@vitest/expect@4.1.7': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.6 - '@vitest/utils': 4.1.6 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.6(vite@8.0.11(@types/node@22.19.18))': + '@vitest/mocker@4.1.7(vite@8.0.11(@types/node@22.19.18))': dependencies: - '@vitest/spy': 4.1.6 + '@vitest/spy': 4.1.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 8.0.11(@types/node@22.19.18) - '@vitest/pretty-format@4.1.6': + '@vitest/pretty-format@4.1.7': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.6': + '@vitest/runner@4.1.7': dependencies: - '@vitest/utils': 4.1.6 + '@vitest/utils': 4.1.7 pathe: 2.0.3 - '@vitest/snapshot@4.1.6': + '@vitest/snapshot@4.1.7': dependencies: - '@vitest/pretty-format': 4.1.6 - '@vitest/utils': 4.1.6 + '@vitest/pretty-format': 4.1.7 + '@vitest/utils': 4.1.7 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.6': {} + '@vitest/spy@4.1.7': {} - '@vitest/utils@4.1.6': + '@vitest/utils@4.1.7': dependencies: - '@vitest/pretty-format': 4.1.6 + '@vitest/pretty-format': 4.1.7 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -2561,61 +2561,61 @@ snapshots: outdent@0.5.0: {} - oxfmt@0.50.0: + oxfmt@0.51.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.50.0 - '@oxfmt/binding-android-arm64': 0.50.0 - '@oxfmt/binding-darwin-arm64': 0.50.0 - '@oxfmt/binding-darwin-x64': 0.50.0 - '@oxfmt/binding-freebsd-x64': 0.50.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.50.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.50.0 - '@oxfmt/binding-linux-arm64-gnu': 0.50.0 - '@oxfmt/binding-linux-arm64-musl': 0.50.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.50.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.50.0 - '@oxfmt/binding-linux-riscv64-musl': 0.50.0 - '@oxfmt/binding-linux-s390x-gnu': 0.50.0 - '@oxfmt/binding-linux-x64-gnu': 0.50.0 - '@oxfmt/binding-linux-x64-musl': 0.50.0 - '@oxfmt/binding-openharmony-arm64': 0.50.0 - '@oxfmt/binding-win32-arm64-msvc': 0.50.0 - '@oxfmt/binding-win32-ia32-msvc': 0.50.0 - '@oxfmt/binding-win32-x64-msvc': 0.50.0 - - oxlint-tsgolint@0.22.1: + '@oxfmt/binding-android-arm-eabi': 0.51.0 + '@oxfmt/binding-android-arm64': 0.51.0 + '@oxfmt/binding-darwin-arm64': 0.51.0 + '@oxfmt/binding-darwin-x64': 0.51.0 + '@oxfmt/binding-freebsd-x64': 0.51.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.51.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.51.0 + '@oxfmt/binding-linux-arm64-gnu': 0.51.0 + '@oxfmt/binding-linux-arm64-musl': 0.51.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.51.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.51.0 + '@oxfmt/binding-linux-riscv64-musl': 0.51.0 + '@oxfmt/binding-linux-s390x-gnu': 0.51.0 + '@oxfmt/binding-linux-x64-gnu': 0.51.0 + '@oxfmt/binding-linux-x64-musl': 0.51.0 + '@oxfmt/binding-openharmony-arm64': 0.51.0 + '@oxfmt/binding-win32-arm64-msvc': 0.51.0 + '@oxfmt/binding-win32-ia32-msvc': 0.51.0 + '@oxfmt/binding-win32-x64-msvc': 0.51.0 + + oxlint-tsgolint@0.23.0: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.22.1 - '@oxlint-tsgolint/darwin-x64': 0.22.1 - '@oxlint-tsgolint/linux-arm64': 0.22.1 - '@oxlint-tsgolint/linux-x64': 0.22.1 - '@oxlint-tsgolint/win32-arm64': 0.22.1 - '@oxlint-tsgolint/win32-x64': 0.22.1 - - oxlint@1.65.0(oxlint-tsgolint@0.22.1): + '@oxlint-tsgolint/darwin-arm64': 0.23.0 + '@oxlint-tsgolint/darwin-x64': 0.23.0 + '@oxlint-tsgolint/linux-arm64': 0.23.0 + '@oxlint-tsgolint/linux-x64': 0.23.0 + '@oxlint-tsgolint/win32-arm64': 0.23.0 + '@oxlint-tsgolint/win32-x64': 0.23.0 + + oxlint@1.66.0(oxlint-tsgolint@0.23.0): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.65.0 - '@oxlint/binding-android-arm64': 1.65.0 - '@oxlint/binding-darwin-arm64': 1.65.0 - '@oxlint/binding-darwin-x64': 1.65.0 - '@oxlint/binding-freebsd-x64': 1.65.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.65.0 - '@oxlint/binding-linux-arm-musleabihf': 1.65.0 - '@oxlint/binding-linux-arm64-gnu': 1.65.0 - '@oxlint/binding-linux-arm64-musl': 1.65.0 - '@oxlint/binding-linux-ppc64-gnu': 1.65.0 - '@oxlint/binding-linux-riscv64-gnu': 1.65.0 - '@oxlint/binding-linux-riscv64-musl': 1.65.0 - '@oxlint/binding-linux-s390x-gnu': 1.65.0 - '@oxlint/binding-linux-x64-gnu': 1.65.0 - '@oxlint/binding-linux-x64-musl': 1.65.0 - '@oxlint/binding-openharmony-arm64': 1.65.0 - '@oxlint/binding-win32-arm64-msvc': 1.65.0 - '@oxlint/binding-win32-ia32-msvc': 1.65.0 - '@oxlint/binding-win32-x64-msvc': 1.65.0 - oxlint-tsgolint: 0.22.1 + '@oxlint/binding-android-arm-eabi': 1.66.0 + '@oxlint/binding-android-arm64': 1.66.0 + '@oxlint/binding-darwin-arm64': 1.66.0 + '@oxlint/binding-darwin-x64': 1.66.0 + '@oxlint/binding-freebsd-x64': 1.66.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.66.0 + '@oxlint/binding-linux-arm-musleabihf': 1.66.0 + '@oxlint/binding-linux-arm64-gnu': 1.66.0 + '@oxlint/binding-linux-arm64-musl': 1.66.0 + '@oxlint/binding-linux-ppc64-gnu': 1.66.0 + '@oxlint/binding-linux-riscv64-gnu': 1.66.0 + '@oxlint/binding-linux-riscv64-musl': 1.66.0 + '@oxlint/binding-linux-s390x-gnu': 1.66.0 + '@oxlint/binding-linux-x64-gnu': 1.66.0 + '@oxlint/binding-linux-x64-musl': 1.66.0 + '@oxlint/binding-openharmony-arm64': 1.66.0 + '@oxlint/binding-win32-arm64-msvc': 1.66.0 + '@oxlint/binding-win32-ia32-msvc': 1.66.0 + '@oxlint/binding-win32-x64-msvc': 1.66.0 + oxlint-tsgolint: 0.23.0 p-filter@2.1.0: dependencies: @@ -2857,15 +2857,15 @@ snapshots: '@types/node': 22.19.18 fsevents: 2.3.3 - vitest@4.1.6(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)): + vitest@4.1.7(@types/node@22.19.18)(vite@8.0.11(@types/node@22.19.18)): dependencies: - '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@8.0.11(@types/node@22.19.18)) - '@vitest/pretty-format': 4.1.6 - '@vitest/runner': 4.1.6 - '@vitest/snapshot': 4.1.6 - '@vitest/spy': 4.1.6 - '@vitest/utils': 4.1.6 + '@vitest/expect': 4.1.7 + '@vitest/mocker': 4.1.7(vite@8.0.11(@types/node@22.19.18)) + '@vitest/pretty-format': 4.1.7 + '@vitest/runner': 4.1.7 + '@vitest/snapshot': 4.1.7 + '@vitest/spy': 4.1.7 + '@vitest/utils': 4.1.7 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 From b595761aaa0903dac6094b6294fd95e6890b1f80 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 16:17:38 +0200 Subject: [PATCH 57/63] chore: update permissions and pnpm version in GH actions --- .github/workflows/changesets.yml | 4 +--- .github/workflows/checks.yml | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/changesets.yml b/.github/workflows/changesets.yml index abd2247..8738416 100644 --- a/.github/workflows/changesets.yml +++ b/.github/workflows/changesets.yml @@ -17,6 +17,7 @@ concurrency: ${{ github.workflow }}-${{ github.ref }} permissions: contents: write pull-requests: write + id-token: write jobs: main: @@ -28,8 +29,6 @@ jobs: - name: ๐Ÿ— Setup pnpm uses: pnpm/action-setup@v6 - with: - version: 11 - name: ๐Ÿ— Setup Node uses: actions/setup-node@v6 @@ -50,4 +49,3 @@ jobs: publish: pnpm run release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 0d1cc63..f590be3 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -26,8 +26,6 @@ jobs: - name: ๐Ÿ— Setup pnpm uses: pnpm/action-setup@v6 - with: - version: 11 - name: ๐Ÿ— Setup Node uses: actions/setup-node@v6 From d1e0c916c2abd89f3c925d28235b1940c344cf7c Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 16:20:33 +0200 Subject: [PATCH 58/63] chore: use pnpm in release command --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 47f8eba..29c24a9 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "lint": "oxlint .", "lint:fix": "oxlint --fix .", "version": "changeset version", - "release": "changeset publish" + "release": "pnpm publish -r" }, "dependencies": { "picomatch": "^4.0.2" From 782414c5304b4f3653e64b0f1c0595fee6658996 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 16:35:41 +0200 Subject: [PATCH 59/63] chore: bump version and fix changelog --- .changeset/analyze-shape-shift.md | 23 ------------------ .changeset/cold-books-pay.md | 5 ---- .changeset/fair-paws-appear.md | 5 ---- .changeset/green-foxes-see.md | 5 ---- .changeset/khaki-fans-sit.md | 5 ---- .changeset/ninety-shoes-invent.md | 5 ---- .changeset/old-hounds-matter.md | 5 ---- .changeset/silent-errors-speak.md | 12 ---------- .changeset/smooth-jeans-rescue.md | 5 ---- .changeset/spotty-sides-flow.md | 5 ---- .changeset/sunny-lilies-dress.md | 5 ---- .changeset/tasty-balloons-sink.md | 5 ---- .changeset/thick-banks-sing.md | 5 ---- .changeset/thirty-cups-decide.md | 5 ---- .changeset/whole-cycles-tickle.md | 5 ---- CHANGELOG.md | 39 +++++++++++++++++++++++++++---- package.json | 2 +- 17 files changed, 36 insertions(+), 105 deletions(-) delete mode 100644 .changeset/analyze-shape-shift.md delete mode 100644 .changeset/cold-books-pay.md delete mode 100644 .changeset/fair-paws-appear.md delete mode 100644 .changeset/green-foxes-see.md delete mode 100644 .changeset/khaki-fans-sit.md delete mode 100644 .changeset/ninety-shoes-invent.md delete mode 100644 .changeset/old-hounds-matter.md delete mode 100644 .changeset/silent-errors-speak.md delete mode 100644 .changeset/smooth-jeans-rescue.md delete mode 100644 .changeset/spotty-sides-flow.md delete mode 100644 .changeset/sunny-lilies-dress.md delete mode 100644 .changeset/tasty-balloons-sink.md delete mode 100644 .changeset/thick-banks-sing.md delete mode 100644 .changeset/thirty-cups-decide.md delete mode 100644 .changeset/whole-cycles-tickle.md diff --git a/.changeset/analyze-shape-shift.md b/.changeset/analyze-shape-shift.md deleted file mode 100644 index 96422a8..0000000 --- a/.changeset/analyze-shape-shift.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -'clean-modules': major ---- - -**BREAKING** `analyze()` now returns `{ files, failures }` instead of an array of per-file results. - -The previous per-file type was renamed from `AnalyzeResult` to `AnalyzedFile`, and `AnalyzeResult` now refers to the top-level `{ files: AnalyzedFile[], failures: CleanFailure[] }` shape. This mirrors the structure of `CleanResult` and lets `analyze` report the same crawl failures that `clean` now surfaces. - -Migration: - -```ts -// Before -const results = await analyze(); -for (const file of results) { - /* ... */ -} - -// After -const { files } = await analyze(); -for (const file of files) { - /* ... */ -} -``` diff --git a/.changeset/cold-books-pay.md b/.changeset/cold-books-pay.md deleted file mode 100644 index db4dca3..0000000 --- a/.changeset/cold-books-pay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Remove `pretty-bytes` and `pretty-ms` dependencies. diff --git a/.changeset/fair-paws-appear.md b/.changeset/fair-paws-appear.md deleted file mode 100644 index a50c76b..0000000 --- a/.changeset/fair-paws-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Results now clearly indicate which results were skipped with `--dry-run`. diff --git a/.changeset/green-foxes-see.md b/.changeset/green-foxes-see.md deleted file mode 100644 index 4450225..0000000 --- a/.changeset/green-foxes-see.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': major ---- - -**BREAKING** Package is now ESM only. CLI usage is the same as before, but breaks CJS usage of the programmatic API. diff --git a/.changeset/khaki-fans-sit.md b/.changeset/khaki-fans-sit.md deleted file mode 100644 index 67a0834..0000000 --- a/.changeset/khaki-fans-sit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Set `"sideEffects": false` in package.json. diff --git a/.changeset/ninety-shoes-invent.md b/.changeset/ninety-shoes-invent.md deleted file mode 100644 index e200dad..0000000 --- a/.changeset/ninety-shoes-invent.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Update minor dependency versions. diff --git a/.changeset/old-hounds-matter.md b/.changeset/old-hounds-matter.md deleted file mode 100644 index 93d7648..0000000 --- a/.changeset/old-hounds-matter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Fix `repository` definition in package.json. diff --git a/.changeset/silent-errors-speak.md b/.changeset/silent-errors-speak.md deleted file mode 100644 index 9d9c9d1..0000000 --- a/.changeset/silent-errors-speak.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'clean-modules': minor ---- - -Surface non-fatal filesystem failures instead of swallowing them silently. - -- `CleanResult` now includes: - - `failures: CleanFailure[]` describing files that could not be processed (e.g. `EACCES`, `EBUSY`). - - `removedFilesCount: number` reflecting the number of files actually removed. Previously `files.length` was used as a stand-in even when some removals failed. -- The CLI prints a summary of failures below the usual results; the full list is included in `--json` output. -- New `--fail-on-error` flag exits with a non-zero status code when any failure is recorded. Exit code stays `0` by default, matching prior behavior. -- `ENOENT` during `stat`, `unlink`, or `readdir` is still treated as a no-op since the file or directory is already gone. Other errors are now captured rather than silently dropped. diff --git a/.changeset/smooth-jeans-rescue.md b/.changeset/smooth-jeans-rescue.md deleted file mode 100644 index 37ac91f..0000000 --- a/.changeset/smooth-jeans-rescue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Ensure `--keep-empty` is respected by `clean` command. diff --git a/.changeset/spotty-sides-flow.md b/.changeset/spotty-sides-flow.md deleted file mode 100644 index b50670c..0000000 --- a/.changeset/spotty-sides-flow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Removed unnecessary colored output and `supports-color` dependency. diff --git a/.changeset/sunny-lilies-dress.md b/.changeset/sunny-lilies-dress.md deleted file mode 100644 index f62cddd..0000000 --- a/.changeset/sunny-lilies-dress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Skip confirmation prompt without in CI/without TTY, require --yes or -y. diff --git a/.changeset/tasty-balloons-sink.md b/.changeset/tasty-balloons-sink.md deleted file mode 100644 index 62c1d36..0000000 --- a/.changeset/tasty-balloons-sink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Remove potentially unsafe `doc/` and `docs/` from default patterns. diff --git a/.changeset/thick-banks-sing.md b/.changeset/thick-banks-sing.md deleted file mode 100644 index 14a03e4..0000000 --- a/.changeset/thick-banks-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': patch ---- - -Update the default file patterns. diff --git a/.changeset/thirty-cups-decide.md b/.changeset/thirty-cups-decide.md deleted file mode 100644 index e982617..0000000 --- a/.changeset/thirty-cups-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': major ---- - -Update `picomatch` dependency to v4. diff --git a/.changeset/whole-cycles-tickle.md b/.changeset/whole-cycles-tickle.md deleted file mode 100644 index b4ace7a..0000000 --- a/.changeset/whole-cycles-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'clean-modules': major ---- - -**BREAKING** Minimum supported Node version is now v22. diff --git a/CHANGELOG.md b/CHANGELOG.md index 820dbad..a46b69a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,36 @@ # clean-modules +## 4.0.0 + +### Major Changes + +- **BREAKING** `analyze()` now returns `{ files, failures }` instead of an array of per-file results. _[`bc65618`](https://github.com/duniul/clean-modules/commit/bc65618725939650805dbee32a1845856a5360c6) [@duniul](https://github.com/duniul)_ +- **BREAKING** Package is now ESM only. CLI usage works the same as before, but breaks CJS usage of the programmatic API. _[`ac6de03`](https://github.com/duniul/clean-modules/commit/ac6de030f64469d64916c7b64fbff5b81721c047) [@duniul](https://github.com/duniul)_ +- **BREAKING** Minimum supported Node version is now v22. _[`6fd8cde`](https://github.com/duniul/clean-modules/commit/6fd8cde1fe1db521062afb0f3c6ffec4a63e6cca) [@duniul](https://github.com/duniul)_ + +### Minor Changes + +- Update `picomatch` dependency to v4. _[`00c3cd6`](https://github.com/duniul/clean-modules/commit/00c3cd60a0dd4072d40aedf0ad52e46b50f1ebdf) [@duniul](https://github.com/duniul)_ +- Surface non-fatal filesystem failures instead of swallowing them silently. _[`bc65618`](https://github.com/duniul/clean-modules/commit/bc65618725939650805dbee32a1845856a5360c6) [@duniul](https://github.com/duniul)_ +- Add new `--fail-on-error` flag which exits with a non-zero status code when any failure is recorded. Exit code stays `0` by default, matching prior behavior. _[`bc65618`](https://github.com/duniul/clean-modules/commit/bc65618725939650805dbee32a1845856a5360c6) [@duniul](https://github.com/duniul)_ + +### Patch Changes + +- Remove potentially unsafe `doc/` and `docs/` from default patterns. _[`293e149`](https://github.com/duniul/clean-modules/commit/293e1492305175e4f2ed54f434d78dc3be4c1d30) [@duniul](https://github.com/duniul)_ +- Remove `pretty-bytes`, `pretty-ms`, `supports-color`, and `clipanion` dependencies. _[`d428e34`](https://github.com/duniul/clean-modules/commit/d428e34f2f758c4ee1e18a93a923c7cc0997cd00) [`61b97e7`](https://github.com/duniul/clean-modules/commit/61b97e7d96e124c641f9c16a0e84f7deb86bbfd2) [`dfb87bc`](https://github.com/duniul/clean-modules/commit/dfb87bcea37ae6916ac2404dcaf73e13583d058b) [@duniul](https://github.com/duniul)_ +- Replace `clipanion` with Node's built-in `parseArgs` for CLI args parsing. _[`61b97e7`](https://github.com/duniul/clean-modules/commit/61b97e7d96e124c641f9c16a0e84f7deb86bbfd2) [`dfb87bc`](https://github.com/duniul/clean-modules/commit/dfb87bcea37ae6916ac2404dcaf73e13583d058b) [@duniul](https://github.com/duniul)_ +- Clearly indicate which steps were skipped in `--dry-run` output. _[`c3bd4b2`](https://github.com/duniul/clean-modules/commit/c3bd4b21bdbd5ba8a311994a05109da8e6808f10) [@duniul](https://github.com/duniul)_ +- Set `"sideEffects": false` in package.json. _[`f67c2c9`](https://github.com/duniul/clean-modules/commit/f67c2c9fe7b3b4e461b2ea38823f439e4cba5e8e) [@duniul](https://github.com/duniul)_ +- Fix `repository` definition in package.json. _[`47b01ae`](https://github.com/duniul/clean-modules/commit/47b01ae18030e89ea4d6af90bb9020c0556dbf69) [@duniul](https://github.com/duniul)_ +- Fix the default hint shown for the `--directory` option. _[`b44d0ef`](https://github.com/duniul/clean-modules/commit/b44d0effe6679f8be0b74f145ffaa6b275df328d) [@duniul](https://github.com/duniul)_ +- Fix globs not starting with `/` being incorrectly prefixed with an extra `**`. _[`34a3b27`](https://github.com/duniul/clean-modules/commit/34a3b278ded6b9f87a923e6a761295bc4f1356ec) [@duniul](https://github.com/duniul)_ +- Ensure `--keep-empty` is respected by `clean` command. _[`695f83e`](https://github.com/duniul/clean-modules/commit/695f83eda9921a23e886040329f0e546e2df6c36) [@duniul](https://github.com/duniul)_ +- Skip confirmation prompt in CI/without TTY, require --yes or -y. _[`b0a1838`](https://github.com/duniul/clean-modules/commit/b0a183847f98cab08d3da6c3742c1ef114d0214a) [@duniul](https://github.com/duniul)_ +- Avoid parsing default globs twice in `analyze`. _[`6f878df`](https://github.com/duniul/clean-modules/commit/6f878df7290afdc5abd5e2a784de51582d912e5b) [@duniul](https://github.com/duniul)_ +- Avoid redundant `readdir` calls when removing empty parent directories. _[`540c372`](https://github.com/duniul/clean-modules/commit/540c37287b97ada49f7ce3eb1dc72b438ca3178f) [@duniul](https://github.com/duniul)_ +- Update minor dependency versions. _[`7491637`](https://github.com/duniul/clean-modules/commit/749163777904a4e09f88bf4eb09adae05dbd8234) [@duniul](https://github.com/duniul)_ +- Update the default file patterns. _[`9ab2ba3`](https://github.com/duniul/clean-modules/commit/9ab2ba39e384fbf9a9db5d862bf01734afe680e1) [@duniul](https://github.com/duniul)_ + ## 3.1.1 ### Patch Changes @@ -108,11 +139,11 @@ # 2.0.0 -### BREAKING CHANGES +### Major changes -- Node versions lower than 12 are no longer supported. _[`#5`](https://github.com/duniul/clean-modules/pull/5) [`d6c66f2`](https://github.com/duniul/clean-modules/commit/d6c66f2ab75ec03a573b848c396d74316fc085d6) [@duniul](https://github.com/duniul)_ -- A path to `node_modules` should now be supplied to the `--directory` option instead of a positional. _[`#5`](https://github.com/duniul/clean-modules/pull/5) [`6aa9d55`](https://github.com/duniul/clean-modules/commit/6aa9d556fe0fa42b70966c6e7788442dae7a3426) [@duniul](https://github.com/duniul)_ -- The `--analyze` option has been replaced by a separate command. _[`#5`](https://github.com/duniul/clean-modules/pull/5) [`6aa9d55`](https://github.com/duniul/clean-modules/commit/6aa9d556fe0fa42b70966c6e7788442dae7a3426) [@duniul](https://github.com/duniul)_ +- **BREAKING** Node versions lower than 12 are no longer supported. _[`#5`](https://github.com/duniul/clean-modules/pull/5) [`d6c66f2`](https://github.com/duniul/clean-modules/commit/d6c66f2ab75ec03a573b848c396d74316fc085d6) [@duniul](https://github.com/duniul)_ +- **BREAKING** A path to `node_modules` should now be supplied to the `--directory` option instead of a positional. _[`#5`](https://github.com/duniul/clean-modules/pull/5) [`6aa9d55`](https://github.com/duniul/clean-modules/commit/6aa9d556fe0fa42b70966c6e7788442dae7a3426) [@duniul](https://github.com/duniul)_ +- **BREAKING** The `--analyze` option has been replaced by a separate command. _[`#5`](https://github.com/duniul/clean-modules/pull/5) [`6aa9d55`](https://github.com/duniul/clean-modules/commit/6aa9d556fe0fa42b70966c6e7788442dae7a3426) [@duniul](https://github.com/duniul)_ ### Minor Changes diff --git a/package.json b/package.json index 29c24a9..dab387b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clean-modules", - "version": "3.1.1", + "version": "4.0.0", "description": "Saves space by removing redundant files from your node_modules. Useful for CI caches or reducing the size of serverless functions.", "keywords": [ "ci", From f9cc11e680bf11f14c7ca248039ab25c5265fbda Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 16:38:47 +0200 Subject: [PATCH 60/63] chore: format readme --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 5b745a3..8de4c2b 100644 --- a/README.md +++ b/README.md @@ -98,19 +98,19 @@ clean-modules "*.d.ts" "!*.png" #### Options -| Flag | Description | -| -------------------------- | ---------------------------------------------------------------------- | +| Flag | Description | +| -------------------------- | ------------------------------------------------------------------------- | | `--directory `, `-D` | Path to your `node_modules` directory.
    _Default: `$PWD/node_modules`_ | | `--glob-file `, `-f` | Path to a file with custom globs.
    _Default: `$PWD/.cleanmodules`_ | -| `--no-defaults`, `-n` | Skip the default globs, use only globs explicitly set by you. | -| `--keep-empty`, `-k` | Skip removing empty folders after removing files. | -| `--yes`, `-y` | Skip the confirmation prompt at the start. | -| `--dry-run`, `-d` | Run without actually removing any files, just the final summary. | -| `--silent`, `-s` | Suppress all console output. | -| `--json`, `-j` | Only output a single JSON summary at the end. | -| `--fail-on-error`, `-e` | Exit with a non-zero status code if any files failed. | -| `--help`, `-h` | Show help. | -| `--version`, `-v` | Show version. | +| `--no-defaults`, `-n` | Skip the default globs, use only globs explicitly set by you. | +| `--keep-empty`, `-k` | Skip removing empty folders after removing files. | +| `--yes`, `-y` | Skip the confirmation prompt at the start. | +| `--dry-run`, `-d` | Run without actually removing any files, just the final summary. | +| `--silent`, `-s` | Suppress all console output. | +| `--json`, `-j` | Only output a single JSON summary at the end. | +| `--fail-on-error`, `-e` | Exit with a non-zero status code if any files failed. | +| `--help`, `-h` | Show help. | +| `--version`, `-v` | Show version. | ### `clean-modules analyze` From 59856ac0ccd17c93baa7276fb1f9af02cec83d85 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 16:41:20 +0200 Subject: [PATCH 61/63] chore: resolve pnpm version from packageManager in CI --- .github/workflows/checks.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index f590be3..7a9257f 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -59,8 +59,6 @@ jobs: - name: ๐Ÿ— Setup pnpm uses: pnpm/action-setup@v6 - with: - version: 11 - name: ๐Ÿ— Setup Node uses: actions/setup-node@v6 From a3138646484d52ad46e173cd81f07db48eeb86bc Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 16:45:16 +0200 Subject: [PATCH 62/63] fix: avoid extra space in dry run output --- src/cli/__snapshots__/cli.test.ts.snap | 2 +- src/cli/commands/clean.command.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/cli/__snapshots__/cli.test.ts.snap b/src/cli/__snapshots__/cli.test.ts.snap index fd4d14f..33c5255 100644 --- a/src/cli/__snapshots__/cli.test.ts.snap +++ b/src/cli/__snapshots__/cli.test.ts.snap @@ -104,7 +104,7 @@ Results: - size reduced: 5 B - files matched: 5 - files removed: 5 -- empty dirs removed: 3 " +- empty dirs removed: 3" `; exports[`clean output formatting > uses singular wording and skips truncation when there is a single failure 1`] = ` diff --git a/src/cli/commands/clean.command.ts b/src/cli/commands/clean.command.ts index e910c9a..65ab6d3 100644 --- a/src/cli/commands/clean.command.ts +++ b/src/cli/commands/clean.command.ts @@ -123,8 +123,16 @@ export const cleanCommand = { logger.log('\nResults:'); logger.log('- size reduced:', formatBytes(reducedSize)); logger.log('- files matched:', files.length); - logger.log('- files removed:', removedFilesCount, dryRunSuffix); - logger.log('- empty dirs removed:', removedEmptyDirs, dryRunSuffix); + + const filesRemovedLogArgs = ['- files removed:', removedFilesCount]; + const emptyDirLogArgs = ['- empty dirs removed:', removedEmptyDirs]; + if (dryRunSuffix) { + filesRemovedLogArgs.push(dryRunSuffix); + emptyDirLogArgs.push(dryRunSuffix); + } + + logger.log(...filesRemovedLogArgs); + logger.log(...emptyDirLogArgs); if (failures.length > 0) { logger.log('- failures:', failures.length); From 0f76b9cc8b7d3d1fd30ee6e17d13724e233d1eb1 Mon Sep 17 00:00:00 2001 From: Daniel Grefberg Date: Sat, 23 May 2026 17:02:32 +0200 Subject: [PATCH 63/63] fix: fix path separator check for Windows in clean up in removeEmptyDirs --- src/utils/filesystem.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils/filesystem.ts b/src/utils/filesystem.ts index 564c42c..840db9d 100644 --- a/src/utils/filesystem.ts +++ b/src/utils/filesystem.ts @@ -91,7 +91,8 @@ export async function readDirectory(dirPath: string): Promise { function depthOf(dirPath: string): number { let count = 0; for (const char of dirPath) { - if (char === path.sep) { + // Counts both `/` and `\` because Windows accepts either as a separator and `path.dirname` preserves whichever the input used. + if (char === '/' || char === '\\') { count++; } }