diff --git a/package-lock.json b/package-lock.json index 746a78e49..9dc777574 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,8 @@ "@cucumber/junit-xml-formatter": "0.9.0", "@cucumber/message-streams": "4.0.1", "@cucumber/messages": "31.1.0", - "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/pretty-formatter": "2.4.1", + "@cucumber/query": "14.7.0", "@cucumber/tag-expressions": "8.1.0", "assertion-error-formatter": "^3.0.0", "capital-case": "^1.0.4", @@ -55,7 +56,6 @@ }, "devDependencies": { "@cucumber/compatibility-kit": "^26.0.0", - "@cucumber/query": "14.7.0", "@eslint/compat": "^2.0.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.29.0", @@ -448,63 +448,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@cucumber/cucumber": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-12.1.0.tgz", - "integrity": "sha512-F72uKHUtHFFn4OAw6r6MoS+PWSMomQoIpW4+W/dcwNYY9oAKVAGyGJkEPIDXX00YtZY+EH3RUcNPlkD+f+dI0Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "@cucumber/ci-environment": "10.0.1", - "@cucumber/cucumber-expressions": "18.0.1", - "@cucumber/gherkin": "32.2.0", - "@cucumber/gherkin-streams": "5.0.1", - "@cucumber/gherkin-utils": "9.2.0", - "@cucumber/html-formatter": "21.13.0", - "@cucumber/junit-xml-formatter": "0.7.1", - "@cucumber/message-streams": "4.0.1", - "@cucumber/messages": "27.2.0", - "@cucumber/tag-expressions": "6.2.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", - "debug": "^4.3.4", - "error-stack-parser": "^2.1.4", - "figures": "^3.2.0", - "glob": "^11.0.0", - "has-ansi": "^4.0.1", - "indent-string": "^4.0.0", - "is-installed-globally": "^0.4.0", - "is-stream": "^2.0.0", - "knuth-shuffle-seeded": "^1.0.6", - "lodash.merge": "^4.6.2", - "lodash.mergewith": "^4.6.2", - "luxon": "3.6.1", - "mime": "^3.0.0", - "mkdirp": "^2.1.5", - "mz": "^2.7.0", - "progress": "^2.0.3", - "read-package-up": "^11.0.0", - "semver": "7.7.2", - "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" - }, - "bin": { - "cucumber-js": "bin/cucumber.js" - }, - "engines": { - "node": "20 || 22 || >=24" - }, - "funding": { - "url": "https://opencollective.com/cucumber" - } - }, "node_modules/@cucumber/cucumber-expressions": { "version": "18.0.1", "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-18.0.1.tgz", @@ -514,426 +457,6 @@ "regexp-match-indices": "1.0.2" } }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true - }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/gherkin": { - "version": "32.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-32.2.0.tgz", - "integrity": "sha512-X8xuVhSIqlUjxSRifRJ7t0TycVWyX58fygJH3wDNmHINLg9sYEkvQT0SO2G5YlRZnYc11TIFr4YPenscvdlBIw==", - "license": "MIT", - "peer": true, - "dependencies": { - "@cucumber/messages": ">=19.1.4 <28" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "commander": "9.1.0", - "source-map-support": "0.5.21" - }, - "bin": { - "gherkin-javascript": "bin/gherkin" - }, - "peerDependencies": { - "@cucumber/gherkin": ">=22.0.0", - "@cucumber/message-streams": ">=4.0.0", - "@cucumber/messages": ">=17.1.1" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "@cucumber/gherkin": "^31.0.0", - "@cucumber/messages": "^27.0.0", - "@teppeis/multimaps": "3.0.0", - "commander": "13.1.0", - "source-map-support": "^0.5.21" - }, - "bin": { - "gherkin-utils": "bin/gherkin-utils" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "@cucumber/messages": ">=19.1.4 <=26" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/uuid": "10.0.0", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.2", - "uuid": "10.0.0" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@cucumber/cucumber/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==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/html-formatter": { - "version": "21.13.0", - "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.13.0.tgz", - "integrity": "sha512-/zkBZNGZca7AeY4hSMMu3PBqZBZtZ45qhynZC++LAstlyhXQrzl6zmjVLZMX7jIbdF1Lb+TjN4PWiGtS5VOM6g==", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@cucumber/messages": ">=18" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "@cucumber/query": "^13.0.2", - "@teppeis/multimaps": "^3.0.0", - "luxon": "^3.5.0", - "xmlbuilder": "^15.1.1" - }, - "peerDependencies": { - "@cucumber/messages": "*" - } - }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/messages": { - "version": "27.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.2.0.tgz", - "integrity": "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/uuid": "10.0.0", - "class-transformer": "0.5.1", - "reflect-metadata": "0.2.2", - "uuid": "11.0.5" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "@teppeis/multimaps": "3.0.0", - "lodash.sortby": "^4.7.0" - }, - "peerDependencies": { - "@cucumber/messages": "*" - } - }, - "node_modules/@cucumber/cucumber/node_modules/@cucumber/tag-expressions": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.2.0.tgz", - "integrity": "sha512-KIF0eLcafHbWOuSDWFw0lMmgJOLdDRWjEL1kfXEWrqHmx2119HxVAr35WuEd9z542d3Yyg+XNqSr+81rIKqEdg==", - "license": "MIT", - "peer": true - }, - "node_modules/@cucumber/cucumber/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@cucumber/cucumber/node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@cucumber/cucumber/node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "ISC", - "peer": true - }, - "node_modules/@cucumber/cucumber/node_modules/luxon": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz", - "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@cucumber/cucumber/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "dependencies": { - "find-up-simple": "^1.0.0", - "read-pkg": "^9.0.0", - "type-fest": "^4.6.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@cucumber/cucumber/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==", - "license": "MIT", - "peer": true, - "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" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@cucumber/cucumber/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@cucumber/cucumber/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@cucumber/cucumber/node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/@cucumber/cucumber/node_modules/yup": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.6.1.tgz", - "integrity": "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==", - "license": "MIT", - "peer": true, - "dependencies": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - } - }, - "node_modules/@cucumber/cucumber/node_modules/yup/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "peer": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@cucumber/gherkin": { "version": "37.0.1", "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-37.0.1.tgz", @@ -1051,33 +574,17 @@ } }, "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==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-2.4.1.tgz", + "integrity": "sha512-HomNZWTO7CqP44PNHOtguPqpHteIKzxyZNjFiuWKUXJ+DDTwLcdlBY2gIuP4BxEt9Q5AMu4ahde2Syo1elmTJQ==", "license": "MIT", "dependencies": { - "ansi-styles": "^5.0.0", - "cli-table3": "^0.6.0", - "figures": "^3.2.0", - "ts-dedent": "^2.0.0" + "@cucumber/query": "^14.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==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@cucumber/query": { "version": "14.7.0", "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-14.7.0.tgz", @@ -1386,6 +893,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -1403,6 +911,7 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -1415,12 +924,14 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -1438,6 +949,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" @@ -1453,6 +965,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", @@ -3820,6 +3333,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -4205,6 +3719,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, "license": "MIT" }, "node_modules/ee-first": { @@ -6708,7 +6223,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", @@ -6827,22 +6343,6 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "peer": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jake": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", @@ -8208,6 +7708,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pad-right": { @@ -8293,6 +7794,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -9479,6 +8981,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -9490,6 +8993,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -9797,6 +9301,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -9882,6 +9387,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -10159,15 +9665,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -10531,19 +10028,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", - "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -10663,6 +10147,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10804,6 +10289,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", diff --git a/package.json b/package.json index effea39f1..19e1376a4 100644 --- a/package.json +++ b/package.json @@ -226,7 +226,8 @@ "@cucumber/junit-xml-formatter": "0.9.0", "@cucumber/message-streams": "4.0.1", "@cucumber/messages": "31.1.0", - "@cucumber/pretty-formatter": "1.0.1", + "@cucumber/pretty-formatter": "2.4.1", + "@cucumber/query": "14.7.0", "@cucumber/tag-expressions": "8.1.0", "assertion-error-formatter": "^3.0.0", "capital-case": "^1.0.4", @@ -260,7 +261,6 @@ }, "devDependencies": { "@cucumber/compatibility-kit": "^26.0.0", - "@cucumber/query": "14.7.0", "@eslint/compat": "^2.0.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.29.0", diff --git a/src/formatter/builtin/index.ts b/src/formatter/builtin/index.ts index a7b6097b7..4f86f29bf 100644 --- a/src/formatter/builtin/index.ts +++ b/src/formatter/builtin/index.ts @@ -1,12 +1,13 @@ import { FormatterImplementation } from '../index' import JsonFormatter from '../json_formatter' -import ProgressFormatter from '../progress_formatter' import ProgressBarFormatter from '../progress_bar_formatter' import RerunFormatter from '../rerun_formatter' import SnippetsFormatter from '../snippets_formatter' -import SummaryFormatter from '../summary_formatter' import UsageFormatter from '../usage_formatter' import UsageJsonFormatter from '../usage_json_formatter' +import summaryFormatter from './summary' +import prettyFormatter from './pretty' +import progressFormatter from './progress' import messageFormatter from './message' import htmlFormatter from './html' @@ -14,15 +15,15 @@ const builtin = { // new plugin-based formatters html: htmlFormatter, junit: '@cucumber/junit-xml-formatter', - pretty: '@cucumber/pretty-formatter', message: messageFormatter, + pretty: prettyFormatter, + progress: progressFormatter, + summary: summaryFormatter, // legacy class-based formatters json: JsonFormatter, - progress: ProgressFormatter, 'progress-bar': ProgressBarFormatter, rerun: RerunFormatter, snippets: SnippetsFormatter, - summary: SummaryFormatter, usage: UsageFormatter, 'usage-json': UsageJsonFormatter, } as const satisfies Record @@ -33,16 +34,16 @@ export const documentation = { // new plugin-based formatters html: 'Outputs a HTML report', junit: 'Produces a JUnit XML report', + message: 'Emits Cucumber messages in newline-delimited JSON', pretty: 'Writes a rich report of the scenario and example execution as it happens', - message: 'Emits Cucumber messages in newline-delimited JSON', + progress: 'Prints one character per scenario.', + summary: 'Summary output of feature and scenarios', // legacy class-based formatters json: JsonFormatter.documentation, - progress: ProgressFormatter.documentation, 'progress-bar': ProgressBarFormatter.documentation, rerun: RerunFormatter.documentation, snippets: SnippetsFormatter.documentation, - summary: SummaryFormatter.documentation, usage: UsageFormatter.documentation, 'usage-json': UsageJsonFormatter.documentation, } satisfies Record diff --git a/src/formatter/builtin/pretty.ts b/src/formatter/builtin/pretty.ts new file mode 100644 index 000000000..f43a51833 --- /dev/null +++ b/src/formatter/builtin/pretty.ts @@ -0,0 +1,15 @@ +import { PrettyPrinter } from '@cucumber/pretty-formatter' +import { FormatterPlugin } from '../../plugin' + +export default { + type: 'formatter', + formatter({ on, stream, write }) { + const printer = new PrettyPrinter(stream, write) + on('message', (envelope) => { + printer.update(envelope) + if (envelope.testRunFinished) { + printer.summarise() + } + }) + }, +} satisfies FormatterPlugin diff --git a/src/formatter/builtin/progress.ts b/src/formatter/builtin/progress.ts new file mode 100644 index 000000000..e4516c5a2 --- /dev/null +++ b/src/formatter/builtin/progress.ts @@ -0,0 +1,15 @@ +import { ProgressPrinter } from '@cucumber/pretty-formatter' +import { FormatterPlugin } from '../../plugin' + +export default { + type: 'formatter', + formatter({ on, stream, write }) { + const printer = new ProgressPrinter(stream, write) + on('message', (envelope) => { + printer.update(envelope) + if (envelope.testRunFinished) { + printer.summarise() + } + }) + }, +} satisfies FormatterPlugin diff --git a/src/formatter/builtin/summary.ts b/src/formatter/builtin/summary.ts new file mode 100644 index 000000000..e73f19c4c --- /dev/null +++ b/src/formatter/builtin/summary.ts @@ -0,0 +1,16 @@ +import { SummaryPrinter } from '@cucumber/pretty-formatter' +import { Query } from '@cucumber/query' +import { FormatterPlugin } from '../../plugin' + +export default { + type: 'formatter', + formatter({ on, stream, write }) { + const query = new Query() + on('message', (envelope) => { + query.update(envelope) + if (envelope.testRunFinished) { + new SummaryPrinter(query, stream, write).printSummary() + } + }) + }, +} satisfies FormatterPlugin diff --git a/src/runtime/format_error.ts b/src/runtime/format_error.ts index 3082e7fed..7132146c2 100644 --- a/src/runtime/format_error.ts +++ b/src/runtime/format_error.ts @@ -7,7 +7,7 @@ export function formatError( error: Error, filterStackTraces: boolean ): Pick { - let processedStackTrace: string + let processedStackTrace: string = error.stack try { const parsedStack = errorStackParser.parse(error) const filteredStack = filterStackTraces @@ -17,19 +17,25 @@ export function formatError( } catch { // if we weren't able to parse and process, we'll settle for the original } - const message = format(error, { + const legacyMessage = format(error, { colorFns: { errorStack: (stack: string) => { return processedStackTrace ? `\n${processedStackTrace}` : stack }, }, }) + const type = error.name || 'Error' + const message = typeof error === 'string' ? error : error.message + let stackTrace = `${type}: ${message}` + if (processedStackTrace) { + stackTrace += '\n' + processedStackTrace + } return { - message, + message: legacyMessage, exception: { - type: error.name || 'Error', - message: typeof error === 'string' ? error : error.message, - stackTrace: processedStackTrace ?? error.stack, + type, + message, + stackTrace, }, } } diff --git a/src/runtime/format_error_spec.ts b/src/runtime/format_error_spec.ts index b3167923d..6d10e873f 100644 --- a/src/runtime/format_error_spec.ts +++ b/src/runtime/format_error_spec.ts @@ -77,35 +77,38 @@ describe('formatError', () => { } it('should handle a custom error', () => { - expect( - testFormatError(() => { - assert.ok(false, 'Thing that should have been truthy was falsy!') - }) - ).to.have.string(' at ') + const result = testFormatError(() => { + assert.ok(false, 'Thing that should have been truthy was falsy!') + }) + expect(result).to.have.string(' at ') + expect(result).to.have.string( + 'AssertionError: Thing that should have been truthy was falsy!' + ) }) it('should handle a generic error', () => { - expect( - testFormatError(() => { - throw new Error('A generally bad thing happened!') - }) - ).to.have.string(' at ') + const result = testFormatError(() => { + throw new Error('A generally bad thing happened!') + }) + expect(result).to.have.string(' at ') + expect(result).to.have.string( + 'Error: A generally bad thing happened!' + ) }) it('should handle an omitted message', () => { - expect( - testFormatError(() => { - throw new Error() - }) - ).to.have.string(' at ') + const result = testFormatError(() => { + throw new Error() + }) + expect(result).to.have.string(' at ') + expect(result).to.have.string('Error: ') }) it('should handle a thrown string', () => { - expect( - testFormatError(() => { - throw 'Yikes!' - }) - ).to.be.undefined + const result = testFormatError(() => { + throw 'Yikes!' + }) + expect(result).to.eq('Error: Yikes!') }) }) })