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..d517515b 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", @@ -17,23 +17,23 @@ "@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", - "camelcase": "^8.0.0", + "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", "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": "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", @@ -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", @@ -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": { @@ -661,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", @@ -700,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" @@ -734,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": { @@ -763,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": { @@ -791,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", @@ -834,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": { @@ -875,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" @@ -906,6 +964,7 @@ "integrity": "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", @@ -913,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": { @@ -928,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" }, @@ -1471,20 +1560,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": { @@ -1506,23 +1595,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" @@ -1541,24 +1630,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": { @@ -1568,12 +1711,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": { @@ -1884,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": { @@ -5520,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" @@ -5621,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": { @@ -6046,13 +6164,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": { @@ -9610,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": { @@ -11091,23 +11209,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": { @@ -12780,9 +12885,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": { @@ -14850,38 +14955,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" @@ -15068,38 +15189,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": { @@ -15120,6 +15244,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", @@ -16362,9 +16528,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" @@ -17185,6 +17351,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", @@ -17513,6 +17692,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", @@ -18302,6 +18491,7 @@ "https://github.com/sponsors/ctavan" ], "license": "MIT", + "peer": true, "bin": { "uuid": "dist/esm/bin/uuid" } @@ -18333,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": { @@ -19061,9 +19251,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 4e3797cd..f3ef70d8 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", @@ -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", @@ -68,23 +68,23 @@ "@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", - "camelcase": "^8.0.0", + "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", "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": "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", @@ -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", 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..ed4dd41d --- /dev/null +++ b/src/package/scripts/script-comparator.js @@ -0,0 +1,55 @@ +function sortTestScript() { + return -1; +} + +function isRelatedScript(a, b, prefix) { + return a.startsWith(prefix) && a.slice(prefix.length) === b; +} + +function isPreScriptFor(a, b) { + return isRelatedScript(a, b, 'pre'); +} + +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; + if (isPostScriptFor(a, b)) return 1; + if (isPostScriptFor(b, a)) return -1; + + if ('test' === a) { + return sortTestScript(a, b); + } + + if ('test' === b) { + return -sortTestScript(b, a); + } + + const aBase = getBaseScriptOf(a); + const bBase = getBaseScriptOf(b); + + if (aBase.startsWith('lint:') && bBase.startsWith('test:')) { + return -1; + } + + if (bBase.startsWith('lint:') && aBase.startsWith('test:')) { + return 1; + } + + if (aBase.startsWith('lint:') && !bBase.startsWith('lint:')) { + return -1; + } + + if (bBase.startsWith('lint:') && !aBase.startsWith('lint:')) { + return 1; + } + + return a.localeCompare(b); +} diff --git a/src/package/scripts/script-comparator.test.js b/src/package/scripts/script-comparator.test.js new file mode 100644 index 00000000..1a077736 --- /dev/null +++ b/src/package/scripts/script-comparator.test.js @@ -0,0 +1,69 @@ +import {describe, it, expect} from 'vitest'; +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 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 () => { + 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('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(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(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); + }); + + 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); + }); +}); 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); + }); +});