From e018fef82cc896e1f3743478644bdae33ed2e4e5 Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Wed, 24 Dec 2025 00:33:14 -0600 Subject: [PATCH 01/13] feat(node-versions): require a minimum of node v20 BREAKING CHANGE: support for node versions v18 and v21 has been dropped closes #1263 --- .github/workflows/node-ci.yml | 5 ++--- package-lock.json | 33 +++++++++++++-------------------- package.json | 2 +- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 8f079663..8175b629 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -34,9 +34,8 @@ jobs: strategy: matrix: node: - - 18.19.0 - - 20.9.0 - - 22.11.0 + - 20.19.0 + - 22.14.0 - 24 steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 diff --git a/package-lock.json b/package-lock.json index 481b494a..3fcca576 100644 --- a/package-lock.json +++ b/package-lock.json @@ -65,7 +65,7 @@ "vitest-when": "0.10.0" }, "engines": { - "node": "^18.19.0 || ^20.9.0 || >=22.11.0" + "node": "^20.19.0 || >=22.14.0" } }, "node_modules/@babel/code-frame": { @@ -98,6 +98,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -896,6 +897,7 @@ "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@cucumber/messages": ">=17.1.1" } @@ -906,6 +908,7 @@ "integrity": "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", @@ -2017,7 +2020,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2027,7 +2029,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2052,7 +2053,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2074,7 +2074,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", @@ -2102,7 +2101,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", @@ -2125,7 +2123,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2169,7 +2166,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -2179,7 +2175,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2201,7 +2196,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2223,7 +2217,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2246,7 +2239,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", @@ -2276,7 +2268,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2299,7 +2290,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", @@ -2323,7 +2313,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "license": "MIT", - "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2348,7 +2337,6 @@ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -4126,6 +4114,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -4370,6 +4359,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5197,6 +5187,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -5916,7 +5907,6 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "license": "ISC", - "peer": true, "engines": { "node": ">= 12" } @@ -6401,6 +6391,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "license": "MIT", + "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -7378,6 +7369,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7583,6 +7575,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -12859,7 +12852,6 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -16090,6 +16082,7 @@ "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -16208,7 +16201,6 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.12.0" } @@ -18524,6 +18516,7 @@ "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -18599,6 +18592,7 @@ "integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.16", "@vitest/mocker": "4.0.16", @@ -19052,7 +19046,6 @@ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, diff --git a/package.json b/package.json index 4e3797cd..94b92811 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "version": "0.0.0-semantically-released", "type": "module", "engines": { - "node": "^18.19.0 || ^20.9.0 || >=22.11.0" + "node": "^20.19.0 || >=22.14.0" }, "author": "Matt Travi (https://matt.travi.org)", "repository": "form8ion/javascript", From 6d2b51e7b79e21b9e68b9b18c8aecb972a07358c Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Wed, 24 Dec 2025 00:44:49 -0600 Subject: [PATCH 02/13] fix(deps): upgrade to the new beta of the codecov plugin --- package-lock.json | 117 ++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 88 insertions(+), 31 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3fcca576..c1775b02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0-semantically-released", "license": "MIT", "dependencies": { - "@form8ion/codecov": "^6.0.0", + "@form8ion/codecov": "^7.0.0-beta.1", "@form8ion/commit-convention": "^8.0.0-beta.6", "@form8ion/config-file": "^1.1.1", "@form8ion/core": "^4.0.0", @@ -1474,20 +1474,20 @@ } }, "node_modules/@form8ion/codecov": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@form8ion/codecov/-/codecov-6.2.0.tgz", - "integrity": "sha512-dyXMIMDHuIRpef9/yG3nyAAem7qxEaBmM0t50AxlOrwzMCTSykQumShmM5nngYqn0Dngg383MBbivEm8/qh61w==", + "version": "7.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@form8ion/codecov/-/codecov-7.0.0-beta.1.tgz", + "integrity": "sha512-nu7xFL/q86KtJLj3pHz0zZZq0zNEOe/gHAnfaPQWMga4KUXjl5OxHLxSTmoJaYTQKkgWPzYl1w8CJT6VLcmR2Q==", "license": "MIT", "dependencies": { "@form8ion/core": "^4.6.1", "@form8ion/github-workflows-core": "^5.3.0", "@form8ion/javascript-core": "^11.0.0", "deepmerge": "^4.3.1", - "execa": "^5.1.1", + "execa": "^6.1.0", "got": "^11.8.5" }, "engines": { - "node": "^18.17.0 || >=20.6.1" + "node": "^20.19.0 || >=22.14.0" } }, "node_modules/@form8ion/codecov/node_modules/@form8ion/javascript-core": { @@ -1509,23 +1509,23 @@ } }, "node_modules/@form8ion/codecov/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^6.0.1", + "human-signals": "^3.0.1", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" @@ -1544,24 +1544,78 @@ } }, "node_modules/@form8ion/codecov/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=12.20.0" + } + }, + "node_modules/@form8ion/codecov/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@form8ion/codecov/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@form8ion/codecov/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@form8ion/codecov/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@form8ion/codecov/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@form8ion/codecov/node_modules/signal-exit": { @@ -1571,12 +1625,15 @@ "license": "ISC" }, "node_modules/@form8ion/codecov/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@form8ion/commit-convention": { diff --git a/package.json b/package.json index 94b92811..2a5ca5be 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ }, "packageManager": "npm@11.7.0+sha512.c22099a6fff8d5b2286c2a09df5352b4858a7c0c716320f58989d60ad8b29ecf2ce6fdfe97ccb41c23ffb1272e1fa079f868487dd6b81d02a2a9e199c095a117", "dependencies": { - "@form8ion/codecov": "^6.0.0", + "@form8ion/codecov": "^7.0.0-beta.1", "@form8ion/commit-convention": "^8.0.0-beta.6", "@form8ion/config-file": "^1.1.1", "@form8ion/core": "^4.0.0", From 7724d6931a1fde518e75f098c8a5894a4f4e6d5f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 06:49:55 +0000 Subject: [PATCH 03/13] chore(deps): update dependency @cucumber/cucumber to v12 --- package-lock.json | 504 ++++++++++++++++++++++++++++++---------------- package.json | 2 +- 2 files changed, 337 insertions(+), 169 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1775b02..0d0953fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "validate-npm-package-name": "^6.0.0" }, "devDependencies": { - "@cucumber/cucumber": "11.3.0", + "@cucumber/cucumber": "12.4.0", "@form8ion/commitlint-config": "2.0.8", "@form8ion/eslint-config": "7.0.13", "@form8ion/eslint-config-cucumber": "1.4.1", @@ -98,7 +98,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -662,38 +661,39 @@ } }, "node_modules/@cucumber/ci-environment": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.1.tgz", - "integrity": "sha512-/+ooDMPtKSmvcPMDYnMZt4LuoipfFfHaYspStI4shqw8FyKcfQAmekz6G+QKWjQQrvM+7Hkljwx58MEwPCwwzg==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-12.0.0.tgz", + "integrity": "sha512-SqCEnbCNl3zCXCFpqGUuoaSNhLC0jLw4tKeFcAxTw9MD/QRlJjeAC/fyvVLFuXuSq0OunJlFfxLu+Z3HE+oLPg==", "dev": true, "license": "MIT" }, "node_modules/@cucumber/cucumber": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-11.3.0.tgz", - "integrity": "sha512-1YGsoAzRfDyVOnRMTSZP/EcFsOBElOKa2r+5nin0DJAeK+Mp0mzjcmSllMgApGtck7Ji87wwy3kFONfHUHMn4g==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-12.4.0.tgz", + "integrity": "sha512-zGtGIx4Q/+AMbZclgCOvlbJzQxFd35/gpnB+bbpRGarsQks8nL4MxoHz9qn/sYzqBiFPgnv29wcL8r4nOb8r3g==", "dev": true, "license": "MIT", "dependencies": { - "@cucumber/ci-environment": "10.0.1", + "@cucumber/ci-environment": "12.0.0", "@cucumber/cucumber-expressions": "18.0.1", - "@cucumber/gherkin": "30.0.4", - "@cucumber/gherkin-streams": "5.0.1", - "@cucumber/gherkin-utils": "9.2.0", - "@cucumber/html-formatter": "21.10.1", - "@cucumber/junit-xml-formatter": "0.7.1", + "@cucumber/gherkin": "37.0.0", + "@cucumber/gherkin-streams": "6.0.0", + "@cucumber/gherkin-utils": "10.0.0", + "@cucumber/html-formatter": "22.2.0", + "@cucumber/junit-xml-formatter": "0.9.0", "@cucumber/message-streams": "4.0.1", - "@cucumber/messages": "27.2.0", - "@cucumber/tag-expressions": "6.1.2", + "@cucumber/messages": "31.0.0", + "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/tag-expressions": "8.1.0", "assertion-error-formatter": "^3.0.0", "capital-case": "^1.0.4", "chalk": "^4.1.2", "cli-table3": "0.6.5", - "commander": "^10.0.0", + "commander": "^14.0.0", "debug": "^4.3.4", "error-stack-parser": "^2.1.4", "figures": "^3.2.0", - "glob": "^10.3.10", + "glob": "^13.0.0", "has-ansi": "^4.0.1", "indent-string": "^4.0.0", "is-installed-globally": "^0.4.0", @@ -701,25 +701,25 @@ "knuth-shuffle-seeded": "^1.0.6", "lodash.merge": "^4.6.2", "lodash.mergewith": "^4.6.2", - "luxon": "3.6.1", + "luxon": "3.7.2", "mime": "^3.0.0", - "mkdirp": "^2.1.5", + "mkdirp": "^3.0.0", "mz": "^2.7.0", "progress": "^2.0.3", - "read-package-up": "^11.0.0", - "semver": "7.7.1", + "read-package-up": "^12.0.0", + "semver": "7.7.3", "string-argv": "0.3.1", "supports-color": "^8.1.1", "type-fest": "^4.41.0", "util-arity": "^1.1.0", "yaml": "^2.2.2", - "yup": "1.6.1" + "yup": "1.7.1" }, "bin": { "cucumber-js": "bin/cucumber.js" }, "engines": { - "node": "18 || 20 || 22 || >=23" + "node": "20 || 22 || >=24" }, "funding": { "url": "https://opencollective.com/cucumber" @@ -735,24 +735,106 @@ "regexp-match-indices": "1.0.2" } }, + "node_modules/@cucumber/cucumber/node_modules/@cucumber/messages": { + "version": "31.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-31.0.0.tgz", + "integrity": "sha512-Dqhatp4AjMsH9SREfWz3Q8nlGuwJMTW7YAW5L3OzRId86ZUEu/a8vIL1RO2c0agQefuBS2SVH9fEZ66ovrMYRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2" + } + }, + "node_modules/@cucumber/cucumber/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/@cucumber/cucumber/node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@cucumber/cucumber/node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@cucumber/cucumber/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@cucumber/cucumber/node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@cucumber/gherkin": { - "version": "30.0.4", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-30.0.4.tgz", - "integrity": "sha512-pb7lmAJqweZRADTTsgnC3F5zbTh3nwOB1M83Q9ZPbUKMb3P76PzK6cTcPTJBHWy3l7isbigIv+BkDjaca6C8/g==", + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-37.0.0.tgz", + "integrity": "sha512-vKJVJ6h4HCktG870wgYUUskNpFxbFI0WmAkVLPTz1LlLwJX7/KOBqFcr2/L3u0pPoHjbLRW+IpbiXLT2T13/wg==", "dev": true, "license": "MIT", "dependencies": { - "@cucumber/messages": ">=19.1.4 <=26" + "@cucumber/messages": ">=31.0.0 <32" } }, "node_modules/@cucumber/gherkin-streams": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", - "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-6.0.0.tgz", + "integrity": "sha512-HLSHMmdDH0vCr7vsVEURcDA4WwnRLdjkhqr6a4HQ3i4RFK1wiDGPjBGVdGJLyuXuRdJpJbFc6QxHvT8pU4t6jw==", "dev": true, "license": "MIT", "dependencies": { - "commander": "9.1.0", + "commander": "14.0.0", "source-map-support": "0.5.21" }, "bin": { @@ -764,27 +846,17 @@ "@cucumber/messages": ">=17.1.1" } }, - "node_modules/@cucumber/gherkin-streams/node_modules/commander": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", - "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/@cucumber/gherkin-utils": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-9.2.0.tgz", - "integrity": "sha512-3nmRbG1bUAZP3fAaUBNmqWO0z0OSkykZZotfLjyhc8KWwDSOrOmMJlBTd474lpA8EWh4JFLAX3iXgynBqBvKzw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-10.0.0.tgz", + "integrity": "sha512-BcujlDT343GXXNrMPl3ws6Il3zs8dQw3Yp/d3HnOJF8i2snGGgiapoTbko7MdvAt7ivDL7SDo+e1d5Cnpl3llA==", "dev": true, "license": "MIT", "dependencies": { - "@cucumber/gherkin": "^31.0.0", - "@cucumber/messages": "^27.0.0", + "@cucumber/gherkin": "^34.0.0", + "@cucumber/messages": "^29.0.0", "@teppeis/multimaps": "3.0.0", - "commander": "13.1.0", + "commander": "14.0.0", "source-map-support": "^0.5.21" }, "bin": { @@ -792,42 +864,43 @@ } }, "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": { - "version": "31.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-31.0.0.tgz", - "integrity": "sha512-wlZfdPif7JpBWJdqvHk1Mkr21L5vl4EfxVUOS4JinWGf3FLRV6IKUekBv5bb5VX79fkDcfDvESzcQ8WQc07Wgw==", + "version": "34.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-34.0.0.tgz", + "integrity": "sha512-659CCFsrsyvuBi/Eix1fnhSheMnojSfnBcqJ3IMPNawx7JlrNJDcXYSSdxcUw3n/nG05P+ptCjmiZY3i14p+tA==", "dev": true, "license": "MIT", "dependencies": { - "@cucumber/messages": ">=19.1.4 <=26" + "@cucumber/messages": ">=19.1.4 <29" } }, "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-26.0.1.tgz", - "integrity": "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==", + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-28.1.0.tgz", + "integrity": "sha512-2LzZtOwYKNlCuNf31ajkrekoy2M4z0Z1QGiPH40n4gf5t8VOUFb7m1ojtR4LmGvZxBGvJZP8voOmRqDWzBzYKA==", "dev": true, "license": "MIT", "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", - "uuid": "10.0.0" + "uuid": "11.1.0" } }, - "node_modules/@cucumber/gherkin-utils/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-29.0.1.tgz", + "integrity": "sha512-aAvIYfQD6/aBdF8KFQChC3CQ1Q+GX9orlR6GurGiX6oqaCnBkxA4WU3OQUVepDynEFrPayerqKRFcAMhdcXReQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2" } }, "node_modules/@cucumber/gherkin-utils/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -835,40 +908,24 @@ ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-26.0.1.tgz", - "integrity": "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==", + "version": "31.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-31.1.0.tgz", + "integrity": "sha512-BViwUQ9YMjcGL98Ww2QHMgu3S4JLUjbTz+Jo/jsq+8ZjS47/2v3IszpD6e12Y6IzZoGfrZriauZHPQ4PAmN9XA==", "dev": true, "license": "MIT", "dependencies": { - "@types/uuid": "10.0.0", "class-transformer": "0.5.1", - "reflect-metadata": "0.2.2", - "uuid": "10.0.0" - } - }, - "node_modules/@cucumber/gherkin/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "reflect-metadata": "0.2.2" } }, "node_modules/@cucumber/html-formatter": { - "version": "21.10.1", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.10.1.tgz", - "integrity": "sha512-isaaNMNnBYThsvaHy7i+9kkk9V3+rhgdkt0pd6TCY6zY1CSRZQ7tG6ST9pYyRaECyfbCeF7UGH0KpNEnh6UNvQ==", + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-22.2.0.tgz", + "integrity": "sha512-fUNC/KngTIz+hAQ2Yr4XjdYq+MO60PwK9SidxBQ54jNI1Vw7erlgsPq0TOWneCIvdjU3qp+YDqYG1hw3zuUuDA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -876,13 +933,13 @@ } }, "node_modules/@cucumber/junit-xml-formatter": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@cucumber/junit-xml-formatter/-/junit-xml-formatter-0.7.1.tgz", - "integrity": "sha512-AzhX+xFE/3zfoYeqkT7DNq68wAQfBcx4Dk9qS/ocXM2v5tBv6eFQ+w8zaSfsktCjYzu4oYRH/jh4USD1CYHfaQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@cucumber/junit-xml-formatter/-/junit-xml-formatter-0.9.0.tgz", + "integrity": "sha512-WF+A7pBaXpKMD1i7K59Nk5519zj4extxY4+4nSgv5XLsGXHDf1gJnb84BkLUzevNtp2o2QzMG0vWLwSm8V5blw==", "dev": true, "license": "MIT", "dependencies": { - "@cucumber/query": "^13.0.2", + "@cucumber/query": "^14.0.1", "@teppeis/multimaps": "^3.0.0", "luxon": "^3.5.0", "xmlbuilder": "^15.1.1" @@ -897,7 +954,6 @@ "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "@cucumber/messages": ">=17.1.1" } @@ -916,10 +972,40 @@ "uuid": "11.0.5" } }, + "node_modules/@cucumber/pretty-formatter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.1.tgz", + "integrity": "sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^5.0.0", + "cli-table3": "^0.6.0", + "figures": "^3.2.0", + "ts-dedent": "^2.0.0" + }, + "peerDependencies": { + "@cucumber/cucumber": ">=7.0.0", + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/pretty-formatter/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@cucumber/query": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-13.6.0.tgz", - "integrity": "sha512-tiDneuD5MoWsJ9VKPBmQok31mSX9Ybl+U4wqDoXeZgsXHDURqzM3rnpWVV3bC34y9W6vuFxrlwF/m7HdOxwqRw==", + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-14.7.0.tgz", + "integrity": "sha512-fiqZ4gMEgYjmbuWproF/YeCdD5y+gD2BqgBIGbpihOsx6UlNsyzoDSfO+Tny0q65DxfK+pHo2UkPyEl7dO7wmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -931,9 +1017,9 @@ } }, "node_modules/@cucumber/tag-expressions": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.2.tgz", - "integrity": "sha512-xa3pER+ntZhGCxRXSguDTKEHTZpUUsp+RzTRNnit+vi5cqnk6abLdSLg5i3HZXU3c74nQ8afQC6IT507EN74oQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-8.1.0.tgz", + "integrity": "sha512-UFeOVUyc711/E7VHjThxMwg3jbGod9TlbM1gxNixX/AGDKg82Eha4cE0tKki3GGUs7uB2NyI+hQAuhB8rL2h5A==", "dev": true, "license": "MIT" }, @@ -2077,6 +2163,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2086,6 +2173,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2110,6 +2198,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2131,6 +2220,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", @@ -2158,6 +2248,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/external-editor": "^1.0.3", @@ -2180,6 +2271,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2223,6 +2315,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2232,6 +2325,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2253,6 +2347,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" @@ -2274,6 +2369,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2296,6 +2392,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/checkbox": "^4.3.2", "@inquirer/confirm": "^5.1.21", @@ -2325,6 +2422,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10", @@ -2347,6 +2445,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/figures": "^1.0.15", @@ -2370,6 +2469,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "license": "MIT", + "peer": true, "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", @@ -2394,6 +2494,7 @@ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -4171,7 +4272,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -4416,7 +4516,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5244,7 +5343,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -5964,6 +6062,7 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "license": "ISC", + "peer": true, "engines": { "node": ">= 12" } @@ -6093,13 +6192,13 @@ } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", + "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">=20" } }, "node_modules/commitizen": { @@ -6448,7 +6547,6 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -7426,7 +7524,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7632,7 +7729,6 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -11141,23 +11237,10 @@ "node": ">=0.1.90" } }, - "node_modules/ls-engines/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/luxon": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", - "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", "dev": true, "license": "MIT", "engines": { @@ -12830,9 +12913,9 @@ } }, "node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, "license": "MIT", "bin": { @@ -12909,6 +12992,7 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "license": "ISC", + "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -14899,38 +14983,54 @@ } }, "node_modules/read-package-up": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", - "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", "dev": true, "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-package-up/node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz", + "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.3", - "normalize-package-data": "^6.0.0", - "parse-json": "^8.0.0", - "type-fest": "^4.6.0", - "unicorn-magic": "^0.1.0" + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.2.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15117,38 +15217,41 @@ } }, "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/read-pkg/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", "dev": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", + "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^7.0.0", + "hosted-git-info": "^9.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/read-pkg/node_modules/parse-json": { @@ -15169,6 +15272,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.1.tgz", + "integrity": "sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -16139,7 +16284,6 @@ "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -16258,6 +16402,7 @@ "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.12.0" } @@ -16411,9 +16556,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -17234,6 +17379,19 @@ "node": ">=10.0.0" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -17562,6 +17720,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -18351,6 +18519,7 @@ "https://github.com/sponsors/ctavan" ], "license": "MIT", + "peer": true, "bin": { "uuid": "dist/esm/bin/uuid" } @@ -18573,7 +18742,6 @@ "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -18649,7 +18817,6 @@ "integrity": "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.16", "@vitest/mocker": "4.0.16", @@ -19103,6 +19270,7 @@ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -19111,9 +19279,9 @@ } }, "node_modules/yup": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.6.1.tgz", - "integrity": "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz", + "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 2a5ca5be..6882c63b 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "validate-npm-package-name": "^6.0.0" }, "devDependencies": { - "@cucumber/cucumber": "11.3.0", + "@cucumber/cucumber": "12.4.0", "@form8ion/commitlint-config": "2.0.8", "@form8ion/eslint-config": "7.0.13", "@form8ion/eslint-config-cucumber": "1.4.1", From ef843768efdd6ab738ad7be691c781b028e2acc5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 09:41:16 +0000 Subject: [PATCH 04/13] fix(deps): update dependency @form8ion/prettier to v3 --- package-lock.json | 40 ++++++---------------------------------- package.json | 2 +- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0d0953fb..63f212ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@form8ion/husky": "^7.0.0-beta.1", "@form8ion/javascript-core": "^12.0.0-beta.1", "@form8ion/overridable-prompts": "^1.2.0", - "@form8ion/prettier": "^2.0.0", + "@form8ion/prettier": "^3.0.0", "@hapi/hoek": "^11.0.0", "@travi/cli-messages": "^1.1.0", "@travi/language-scaffolder-prompts": "^2.0.0-beta.1", @@ -2030,44 +2030,16 @@ } }, "node_modules/@form8ion/prettier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@form8ion/prettier/-/prettier-2.0.0.tgz", - "integrity": "sha512-5aN0NeEH7JlbrQJTHb7ARuMl8qGOO3RHQtEfoG0A9gLOyG7f2y24sO9ohJzb86uVuCT26GmBTyhmsJU/6kWNaQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@form8ion/prettier/-/prettier-3.1.0.tgz", + "integrity": "sha512-2WvgS3K1Ns8U3BHbzrqZkSKxU+UB+bKz3JZKizersQFLIYNwlySlarZrjSZSdB/kBbmhJ+G3yoDbyDU5jjcaGg==", "license": "MIT", "dependencies": { "@form8ion/config-file": "^1.0.1", - "@form8ion/core": "^3.0.0" - }, - "engines": { - "node": "^16.14 || >=18" - } - }, - "node_modules/@form8ion/prettier/node_modules/@form8ion/core": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@form8ion/core/-/core-3.3.0.tgz", - "integrity": "sha512-c6pA2A/DNIKp3fOE7woradqvLy6kBXjoBz6Gi6LB3yeslR9bnWnbS0HEcG3QrwihlG8qhD2+3oqaYRU5tiGV1Q==", - "license": "MIT", - "dependencies": { - "@hapi/hoek": "^11.0.2", - "@travi/cli-messages": "^1.0.5", - "deepmerge": "^4.2.2", - "js-yaml": "^4.1.0", - "spdx-license-list": "6.8.0" + "@form8ion/core": "^4.10.0" }, "engines": { - "node": "^16.14 || >=18" - } - }, - "node_modules/@form8ion/prettier/node_modules/spdx-license-list": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-6.8.0.tgz", - "integrity": "sha512-5UdM7r9yJ1EvsPQZWfa41AZjLQngl9iMMysm9XBW7Lqhq7aF8cllfqjS+rFCHB8FFMGSM0yFWue2LUV9mR0QzQ==", - "license": "CC0-1.0", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || >=22.14.0" } }, "node_modules/@form8ion/remark-lint-preset": { diff --git a/package.json b/package.json index 6882c63b..530a50e1 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "@form8ion/husky": "^7.0.0-beta.1", "@form8ion/javascript-core": "^12.0.0-beta.1", "@form8ion/overridable-prompts": "^1.2.0", - "@form8ion/prettier": "^2.0.0", + "@form8ion/prettier": "^3.0.0", "@hapi/hoek": "^11.0.0", "@travi/cli-messages": "^1.1.0", "@travi/language-scaffolder-prompts": "^2.0.0-beta.1", From 2d4b3e6bf3b23fae1388378086b9dd37d3b5f4a9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 13:43:57 +0000 Subject: [PATCH 05/13] fix(deps): update dependency camelcase to v9 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63f212ed..2e4fe1f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@hapi/hoek": "^11.0.0", "@travi/cli-messages": "^1.1.0", "@travi/language-scaffolder-prompts": "^2.0.0-beta.1", - "camelcase": "^8.0.0", + "camelcase": "^9.0.0", "deepmerge": "^4.2.2", "execa": "^9.5.1", "ini": "^5.0.0", @@ -5638,12 +5638,12 @@ } }, "node_modules/camelcase": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", - "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-9.0.0.tgz", + "integrity": "sha512-TO9xmyXTZ9HUHI8M1OnvExxYB0eYVS/1e5s7IDMTAoIcwUd+aNcFODs6Xk83mobk0velyHFQgA1yIrvYc6wclw==", "license": "MIT", "engines": { - "node": ">=16" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/package.json b/package.json index 530a50e1..5698d135 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@hapi/hoek": "^11.0.0", "@travi/cli-messages": "^1.1.0", "@travi/language-scaffolder-prompts": "^2.0.0-beta.1", - "camelcase": "^8.0.0", + "camelcase": "^9.0.0", "deepmerge": "^4.2.2", "execa": "^9.5.1", "ini": "^5.0.0", From f29777c480ebeaf2cb7eef8896924c0ee41fb333 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 16:38:50 +0000 Subject: [PATCH 06/13] fix(deps): update dependency ini to v6 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2e4fe1f8..d518a876 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "camelcase": "^9.0.0", "deepmerge": "^4.2.2", "execa": "^9.5.1", - "ini": "^5.0.0", + "ini": "^6.0.0", "joi": "^17.5.0", "mustache": "^4.2.0", "npm-conf": "^1.1.3", @@ -9728,12 +9728,12 @@ "license": "ISC" }, "node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/inquirer": { diff --git a/package.json b/package.json index 5698d135..019b711f 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "camelcase": "^9.0.0", "deepmerge": "^4.2.2", "execa": "^9.5.1", - "ini": "^5.0.0", + "ini": "^6.0.0", "joi": "^17.5.0", "mustache": "^4.2.0", "npm-conf": "^1.1.3", From 00b79c817b90bb3bccca671f22a716136edc33d8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 21:58:22 +0000 Subject: [PATCH 07/13] fix(deps): update dependency validate-npm-package-name to v7 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index d518a876..63270424 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,7 +30,7 @@ "npm-conf": "^1.1.3", "sort-object-keys": "^2.0.0", "touch": "^3.1.0", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "devDependencies": { "@cucumber/cucumber": "12.4.0", @@ -18523,12 +18523,12 @@ } }, "node_modules/validate-npm-package-name": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", - "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-7.0.1.tgz", + "integrity": "sha512-BM0Upcemlce8/9+HE+/VpWqn3u3mYh6Om/FEC8yPMnEHwf710fW5Q6fhjT1SQyRlZD1G9CJbgfH+rWgAcIvjlQ==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/vfile": { diff --git a/package.json b/package.json index 019b711f..4a973cd5 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "npm-conf": "^1.1.3", "sort-object-keys": "^2.0.0", "touch": "^3.1.0", - "validate-npm-package-name": "^6.0.0" + "validate-npm-package-name": "^7.0.0" }, "devDependencies": { "@cucumber/cucumber": "12.4.0", From 529098ee51cfd0d6b763e3957fd09fef1c4436c5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Dec 2025 21:46:52 +0000 Subject: [PATCH 08/13] chore(deps): update dependency chai to v6.2.2 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63270424..d517515b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@travi/any": "3.1.3", "ban-sensitive-files": "1.10.11", "c8": "10.1.3", - "chai": "6.2.1", + "chai": "6.2.2", "cross-env": "10.1.0", "cz-conventional-changelog": "3.3.0", "gherkin-lint": "4.2.4", @@ -5739,9 +5739,9 @@ } }, "node_modules/chai": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", - "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 4a973cd5..f3ef70d8 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "@travi/any": "3.1.3", "ban-sensitive-files": "1.10.11", "c8": "10.1.3", - "chai": "6.2.1", + "chai": "6.2.2", "cross-env": "10.1.0", "cz-conventional-changelog": "3.3.0", "gherkin-lint": "4.2.4", From e4d6065499903bc07240e26b737db831c1a0420f Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Sun, 4 Jan 2026 21:24:33 -0600 Subject: [PATCH 09/13] feat(scripts): add initial version of sorting --- src/package/property-sorter.js | 6 ++-- src/package/scripts/lifter.js | 3 +- src/package/scripts/lifter.test.js | 6 +++- src/package/scripts/script-comparator.js | 35 +++++++++++++++++++ src/package/scripts/script-comparator.test.js | 29 +++++++++++++++ src/package/scripts/scripts-sorter.js | 7 ++++ src/package/scripts/scripts-sorter.test.js | 20 +++++++++++ 7 files changed, 101 insertions(+), 5 deletions(-) create mode 100644 src/package/scripts/script-comparator.js create mode 100644 src/package/scripts/script-comparator.test.js create mode 100644 src/package/scripts/scripts-sorter.js create mode 100644 src/package/scripts/scripts-sorter.test.js diff --git a/src/package/property-sorter.js b/src/package/property-sorter.js index 2067b17a..24aadbb0 100644 --- a/src/package/property-sorter.js +++ b/src/package/property-sorter.js @@ -1,7 +1,7 @@ -import sortProperties from 'sort-object-keys'; +import sortObjectKeys from 'sort-object-keys'; -export default function (packageContents) { - return sortProperties( +export default function sortProperties(packageContents) { + return sortObjectKeys( packageContents, [ 'name', diff --git a/src/package/scripts/lifter.js b/src/package/scripts/lifter.js index 870f073d..44533fb6 100644 --- a/src/package/scripts/lifter.js +++ b/src/package/scripts/lifter.js @@ -1,8 +1,9 @@ import updateTestScript from './test-script-updater.js'; +import sortScripts from './scripts-sorter.js'; export default function ({existingScripts, scripts}) { return { - scripts: updateTestScript({...existingScripts, ...scripts}), + scripts: sortScripts(updateTestScript({...existingScripts, ...scripts})), dependencies: { javascript: { development: ['npm-run-all2'], diff --git a/src/package/scripts/lifter.test.js b/src/package/scripts/lifter.test.js index 7632cf93..b653b60c 100644 --- a/src/package/scripts/lifter.test.js +++ b/src/package/scripts/lifter.test.js @@ -3,8 +3,10 @@ import {when} from 'vitest-when'; import {describe, expect, it, vi} from 'vitest'; import updateTestScript from './test-script-updater.js'; +import sortScripts from './scripts-sorter.js'; import liftScripts from './lifter.js'; +vi.mock('./scripts-sorter.js'); vi.mock('./test-script-updater.js'); describe('package.json scripts lifter', () => { @@ -12,10 +14,12 @@ describe('package.json scripts lifter', () => { const existingScripts = any.simpleObject(); const scripts = any.simpleObject(); const updatedScripts = any.simpleObject(); + const sortedScripts = any.simpleObject(); when(updateTestScript).calledWith({...existingScripts, ...scripts}).thenReturn(updatedScripts); + when(sortScripts).calledWith(updatedScripts).thenReturn(sortedScripts); expect(liftScripts({existingScripts, scripts})).toEqual({ - scripts: updatedScripts, + scripts: sortedScripts, dependencies: { javascript: { development: ['npm-run-all2'], diff --git a/src/package/scripts/script-comparator.js b/src/package/scripts/script-comparator.js new file mode 100644 index 00000000..65151959 --- /dev/null +++ b/src/package/scripts/script-comparator.js @@ -0,0 +1,35 @@ +function sortTestScript() { + return -1; +} + +function isPreScriptFor(a, b) { + return a.startsWith('pre') && a.slice(3) === b; +} + +export default function compareScriptNames(a, b) { + if (isPreScriptFor(a, b)) { + return -1; + } + + if (isPreScriptFor(b, a)) { + return 1; + } + + if ('test' === a) { + return sortTestScript(a, b); + } + + if ('test' === b) { + return -sortTestScript(b, a); + } + + if (a.startsWith('lint:') && b.startsWith('test:')) { + return -1; + } + + if (b.startsWith('lint:') && a.startsWith('test:')) { + return 1; + } + + return 0; +} diff --git a/src/package/scripts/script-comparator.test.js b/src/package/scripts/script-comparator.test.js new file mode 100644 index 00000000..3b6ea702 --- /dev/null +++ b/src/package/scripts/script-comparator.test.js @@ -0,0 +1,29 @@ +import {describe, it, expect} from 'vitest'; +import any from '@travi/any'; + +import compareScriptNames from './script-comparator.js'; + +describe('script name comparator', () => { + it('should consider undefined sort orders as equivalent', async () => { + expect(compareScriptNames(any.word(), any.word())).toEqual(0); + }); + + it('should sort `pre` scripts ahead of their related scripts', async () => { + const baseScriptName = any.word(); + expect(compareScriptNames(`pre${baseScriptName}`, baseScriptName)).toEqual(-1); + expect(compareScriptNames(baseScriptName, `pre${baseScriptName}`)).toEqual(1); + + expect(compareScriptNames('pretest', 'test')).toEqual(-1); + expect(compareScriptNames('test', 'pretest')).toEqual(1); + }); + + it('should sort the `test` script ahead of any sub-test scripts', async () => { + expect(compareScriptNames('test', `test:${any.word()}`)).toEqual(-1); + expect(compareScriptNames(`test:${any.word()}`, 'test')).toEqual(1); + }); + + it('should sort `lint:` scripts above `test:` scripts', async () => { + expect(compareScriptNames(`lint:${any.word()}`, `test:${any.word()}`)).toEqual(-1); + expect(compareScriptNames(`test:${any.word()}`, `lint:${any.word()}`)).toEqual(1); + }); +}); diff --git a/src/package/scripts/scripts-sorter.js b/src/package/scripts/scripts-sorter.js new file mode 100644 index 00000000..6764f71f --- /dev/null +++ b/src/package/scripts/scripts-sorter.js @@ -0,0 +1,7 @@ +import sortObjectKeys from 'sort-object-keys'; + +import compareScriptNames from './script-comparator.js'; + +export default function sortScripts(scripts) { + return sortObjectKeys(scripts, compareScriptNames); +} diff --git a/src/package/scripts/scripts-sorter.test.js b/src/package/scripts/scripts-sorter.test.js new file mode 100644 index 00000000..58b57578 --- /dev/null +++ b/src/package/scripts/scripts-sorter.test.js @@ -0,0 +1,20 @@ +import sortObjectKeys from 'sort-object-keys'; + +import {it, describe, expect, vi} from 'vitest'; +import {when} from 'vitest-when'; +import any from '@travi/any'; + +import compareScriptNames from './script-comparator.js'; +import sortScripts from './scripts-sorter.js'; + +vi.mock('sort-object-keys'); + +describe('npm scripts sorter', () => { + it('should sort the scripts based on the defined order', async () => { + const unsortedScripts = any.simpleObject(); + const sortedScripts = any.simpleObject(); + when(sortObjectKeys).calledWith(unsortedScripts, compareScriptNames).thenReturn(sortedScripts); + + expect(sortScripts(unsortedScripts)).toEqual(sortedScripts); + }); +}); From 401e52764af198b2145fc1ec330508c65fcfd91e Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Sun, 4 Jan 2026 22:15:45 -0600 Subject: [PATCH 10/13] feat(script-sorting): handle post-script ordering --- src/package/scripts/script-comparator.js | 21 +++++++++----- src/package/scripts/script-comparator.test.js | 29 +++++++++++++------ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/package/scripts/script-comparator.js b/src/package/scripts/script-comparator.js index 65151959..11cda988 100644 --- a/src/package/scripts/script-comparator.js +++ b/src/package/scripts/script-comparator.js @@ -2,18 +2,23 @@ function sortTestScript() { return -1; } +function isRelatedScript(a, b, prefix) { + return a.startsWith(prefix) && a.slice(prefix.length) === b; +} + function isPreScriptFor(a, b) { - return a.startsWith('pre') && a.slice(3) === b; + return isRelatedScript(a, b, 'pre'); } -export default function compareScriptNames(a, b) { - if (isPreScriptFor(a, b)) { - return -1; - } +function isPostScriptFor(a, b) { + return isRelatedScript(a, b, 'post'); +} - if (isPreScriptFor(b, a)) { - return 1; - } +export default function compareScriptNames(a, b) { + if (isPreScriptFor(a, b)) return -1; + if (isPreScriptFor(b, a)) return 1; + if (isPostScriptFor(a, b)) return 1; + if (isPostScriptFor(b, a)) return -1; if ('test' === a) { return sortTestScript(a, b); diff --git a/src/package/scripts/script-comparator.test.js b/src/package/scripts/script-comparator.test.js index 3b6ea702..555cfed2 100644 --- a/src/package/scripts/script-comparator.test.js +++ b/src/package/scripts/script-comparator.test.js @@ -4,26 +4,37 @@ import any from '@travi/any'; import compareScriptNames from './script-comparator.js'; describe('script name comparator', () => { + const A_AFTER_B = 1; + const A_BEFORE_B = -1; + const baseScriptName = any.word(); + it('should consider undefined sort orders as equivalent', async () => { expect(compareScriptNames(any.word(), any.word())).toEqual(0); }); it('should sort `pre` scripts ahead of their related scripts', async () => { - const baseScriptName = any.word(); - expect(compareScriptNames(`pre${baseScriptName}`, baseScriptName)).toEqual(-1); - expect(compareScriptNames(baseScriptName, `pre${baseScriptName}`)).toEqual(1); + expect(compareScriptNames(`pre${baseScriptName}`, baseScriptName)).toEqual(A_BEFORE_B); + expect(compareScriptNames(baseScriptName, `pre${baseScriptName}`)).toEqual(A_AFTER_B); + + expect(compareScriptNames('pretest', 'test')).toEqual(A_BEFORE_B); + expect(compareScriptNames('test', 'pretest')).toEqual(A_AFTER_B); + }); + + it('should sort `post` scripts after of their related scripts', async () => { + expect(compareScriptNames(`post${baseScriptName}`, baseScriptName)).toEqual(A_AFTER_B); + expect(compareScriptNames(baseScriptName, `post${baseScriptName}`)).toEqual(A_BEFORE_B); - expect(compareScriptNames('pretest', 'test')).toEqual(-1); - expect(compareScriptNames('test', 'pretest')).toEqual(1); + expect(compareScriptNames('posttest', 'test')).toEqual(A_AFTER_B); + expect(compareScriptNames('test', 'posttest')).toEqual(A_BEFORE_B); }); it('should sort the `test` script ahead of any sub-test scripts', async () => { - expect(compareScriptNames('test', `test:${any.word()}`)).toEqual(-1); - expect(compareScriptNames(`test:${any.word()}`, 'test')).toEqual(1); + expect(compareScriptNames('test', `test:${any.word()}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`test:${any.word()}`, 'test')).toEqual(A_AFTER_B); }); it('should sort `lint:` scripts above `test:` scripts', async () => { - expect(compareScriptNames(`lint:${any.word()}`, `test:${any.word()}`)).toEqual(-1); - expect(compareScriptNames(`test:${any.word()}`, `lint:${any.word()}`)).toEqual(1); + expect(compareScriptNames(`lint:${any.word()}`, `test:${any.word()}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`test:${any.word()}`, `lint:${any.word()}`)).toEqual(A_AFTER_B); }); }); From 8d8848f7ab057012f9fff37b7e350a36d99e76b8 Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Sun, 4 Jan 2026 22:56:22 -0600 Subject: [PATCH 11/13] feat(script-sorting): sort pre and post scripts the same as base scripts --- src/package/scripts/script-comparator.js | 11 +++++++++-- src/package/scripts/script-comparator.test.js | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/package/scripts/script-comparator.js b/src/package/scripts/script-comparator.js index 11cda988..180fcc93 100644 --- a/src/package/scripts/script-comparator.js +++ b/src/package/scripts/script-comparator.js @@ -14,6 +14,10 @@ function isPostScriptFor(a, b) { return isRelatedScript(a, b, 'post'); } +function getBaseScriptOf(script) { + return script.replace(/^(?:pre|post)/, ''); +} + export default function compareScriptNames(a, b) { if (isPreScriptFor(a, b)) return -1; if (isPreScriptFor(b, a)) return 1; @@ -28,11 +32,14 @@ export default function compareScriptNames(a, b) { return -sortTestScript(b, a); } - if (a.startsWith('lint:') && b.startsWith('test:')) { + const aBase = getBaseScriptOf(a); + const bBase = getBaseScriptOf(b); + + if (aBase.startsWith('lint:') && bBase.startsWith('test:')) { return -1; } - if (b.startsWith('lint:') && a.startsWith('test:')) { + if (bBase.startsWith('lint:') && aBase.startsWith('test:')) { return 1; } diff --git a/src/package/scripts/script-comparator.test.js b/src/package/scripts/script-comparator.test.js index 555cfed2..27aeb962 100644 --- a/src/package/scripts/script-comparator.test.js +++ b/src/package/scripts/script-comparator.test.js @@ -36,5 +36,14 @@ describe('script name comparator', () => { it('should sort `lint:` scripts above `test:` scripts', async () => { expect(compareScriptNames(`lint:${any.word()}`, `test:${any.word()}`)).toEqual(A_BEFORE_B); expect(compareScriptNames(`test:${any.word()}`, `lint:${any.word()}`)).toEqual(A_AFTER_B); + + expect(compareScriptNames(`prelint:${any.word()}`, `test:${any.word()}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`test:${any.word()}`, `prelint:${any.word()}`)).toEqual(A_AFTER_B); + + expect(compareScriptNames(`lint:${any.word()}`, `pretest:${any.word()}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`pretest:${any.word()}`, `lint:${any.word()}`)).toEqual(A_AFTER_B); + + expect(compareScriptNames(`prelint:${any.word()}`, `pretest:${any.word()}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`pretest:${any.word()}`, `prelint:${any.word()}`)).toEqual(A_AFTER_B); }); }); From c52dd56ca857affacf2f82dcaf41de168e60c806 Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Mon, 5 Jan 2026 10:50:34 -0600 Subject: [PATCH 12/13] feat(script-ordering): it should sort lint scripts above other scripts --- src/package/scripts/script-comparator.js | 8 ++++++++ src/package/scripts/script-comparator.test.js | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/src/package/scripts/script-comparator.js b/src/package/scripts/script-comparator.js index 180fcc93..a0530fac 100644 --- a/src/package/scripts/script-comparator.js +++ b/src/package/scripts/script-comparator.js @@ -43,5 +43,13 @@ export default function compareScriptNames(a, b) { return 1; } + if (aBase.startsWith('lint:')) { + return -1; + } + + if (bBase.startsWith('lint:')) { + return 1; + } + return 0; } diff --git a/src/package/scripts/script-comparator.test.js b/src/package/scripts/script-comparator.test.js index 27aeb962..a11132dd 100644 --- a/src/package/scripts/script-comparator.test.js +++ b/src/package/scripts/script-comparator.test.js @@ -46,4 +46,9 @@ describe('script name comparator', () => { expect(compareScriptNames(`prelint:${any.word()}`, `pretest:${any.word()}`)).toEqual(A_BEFORE_B); expect(compareScriptNames(`pretest:${any.word()}`, `prelint:${any.word()}`)).toEqual(A_AFTER_B); }); + + it('should sort undefined scripts below `lint:` scripts', async () => { + expect(compareScriptNames(any.word(), `lint:${any.word()}`)).toEqual(A_AFTER_B); + expect(compareScriptNames(`lint:${any.word()}`, any.word())).toEqual(A_BEFORE_B); + }); }); From e1a09779bf832531ee25e258baa99c03f929da4e Mon Sep 17 00:00:00 2001 From: Matt Travi Date: Mon, 5 Jan 2026 12:13:16 -0600 Subject: [PATCH 13/13] feat(script-sorting): sort alphabetically when higher rules dont apply --- src/package/scripts/script-comparator.js | 6 +++--- src/package/scripts/script-comparator.test.js | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/package/scripts/script-comparator.js b/src/package/scripts/script-comparator.js index a0530fac..ed4dd41d 100644 --- a/src/package/scripts/script-comparator.js +++ b/src/package/scripts/script-comparator.js @@ -43,13 +43,13 @@ export default function compareScriptNames(a, b) { return 1; } - if (aBase.startsWith('lint:')) { + if (aBase.startsWith('lint:') && !bBase.startsWith('lint:')) { return -1; } - if (bBase.startsWith('lint:')) { + if (bBase.startsWith('lint:') && !aBase.startsWith('lint:')) { return 1; } - return 0; + return a.localeCompare(b); } diff --git a/src/package/scripts/script-comparator.test.js b/src/package/scripts/script-comparator.test.js index a11132dd..1a077736 100644 --- a/src/package/scripts/script-comparator.test.js +++ b/src/package/scripts/script-comparator.test.js @@ -8,8 +8,12 @@ describe('script name comparator', () => { const A_BEFORE_B = -1; const baseScriptName = any.word(); - it('should consider undefined sort orders as equivalent', async () => { - expect(compareScriptNames(any.word(), any.word())).toEqual(0); + it('should sort alphabetically if no other rules apply', async () => { + const a = `a${any.word()}`; + const b = `b${any.word()}`; + + expect(compareScriptNames(a, b)).toEqual(A_BEFORE_B); + expect(compareScriptNames(b, a)).toEqual(A_AFTER_B); }); it('should sort `pre` scripts ahead of their related scripts', async () => { @@ -47,6 +51,17 @@ describe('script name comparator', () => { expect(compareScriptNames(`pretest:${any.word()}`, `prelint:${any.word()}`)).toEqual(A_AFTER_B); }); + it('should sort subscripts alphabetically', async () => { + const a = `a${any.word()}`; + const b = `b${any.word()}`; + + expect(compareScriptNames(`lint:${a}`, `lint:${b}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`lint:${b}`, `lint:${a}`)).toEqual(A_AFTER_B); + + expect(compareScriptNames(`test:${a}`, `test:${b}`)).toEqual(A_BEFORE_B); + expect(compareScriptNames(`test:${b}`, `test:${a}`)).toEqual(A_AFTER_B); + }); + it('should sort undefined scripts below `lint:` scripts', async () => { expect(compareScriptNames(any.word(), `lint:${any.word()}`)).toEqual(A_AFTER_B); expect(compareScriptNames(`lint:${any.word()}`, any.word())).toEqual(A_BEFORE_B);