From 500ce9817e6baeff8fbfe3b7d5e1d649b811bf98 Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Thu, 6 Nov 2025 11:37:46 +0100 Subject: [PATCH 1/7] adjust version number --- package-lock.json | 186 +++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 93 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62ff6f2..0444571 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,9 +47,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", - "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -57,21 +57,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", - "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.28.3", "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -88,14 +88,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -184,9 +184,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -218,13 +218,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -488,18 +488,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -507,14 +507,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -547,9 +547,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -610,9 +610,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "engines": { @@ -1267,13 +1267,13 @@ } }, "node_modules/@types/node": { - "version": "24.5.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", - "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.12.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/stack-utils": { @@ -1284,9 +1284,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", "dev": true, "license": "MIT", "dependencies": { @@ -1415,9 +1415,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -1563,9 +1563,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", - "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "version": "2.8.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", + "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1608,9 +1608,9 @@ } }, "node_modules/browserslist": { - "version": "4.26.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", - "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -1628,11 +1628,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001741", - "electron-to-chromium": "^1.5.218", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -1692,9 +1692,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001743", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", - "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "version": "1.0.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", "dev": true, "funding": [ { @@ -1812,9 +1812,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", "dev": true, "license": "MIT" }, @@ -2039,9 +2039,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", - "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "version": "1.5.245", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", + "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", "dev": true, "license": "ISC" }, @@ -2696,9 +2696,9 @@ } }, "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { @@ -3069,9 +3069,9 @@ } }, "node_modules/istanbul-lib-instrument/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==", + "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": { @@ -3608,9 +3608,9 @@ } }, "node_modules/jest-snapshot/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==", + "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": { @@ -3896,9 +3896,9 @@ } }, "node_modules/make-dir/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==", + "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": { @@ -4014,9 +4014,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -4478,13 +4478,13 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4879,16 +4879,16 @@ } }, "node_modules/undici-types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", - "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { From c376a9c10e6d5f5b76cb02819399224d8c12b061 Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Thu, 6 Nov 2025 11:42:12 +0100 Subject: [PATCH 2/7] update CLI terminal --- bin/cli.js | 20 ++++++++++++++++---- lib/cli/devMode.js | 7 ++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/bin/cli.js b/bin/cli.js index 68aa48e..05cf549 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -459,6 +459,7 @@ program .option("--html-preview", "Get a static html of the export-view of the template generated with the Liquid Test data (optional)", false) .option("--preview-only", "Skip the checking of the results of the Liquid Test in case you only want to generate a preview template (optional)", false) .option("--status", "Only return the status of the test runs as PASSED/FAILED (optional)", false) + .option("-b, --batch ", "Run all tests that contain this batch identifier (optional)", "") .action((options) => { if (!options.handle && !options.accountTemplate) { @@ -466,17 +467,22 @@ program process.exit(1); } + if (options.test && options.batch) { + consola.error("You cannot use both --test and --batch options at the same time"); + process.exit(1); + } + const templateType = options.handle ? "reconciliationText" : "accountTemplate"; const templateName = options.handle ? options.handle : options.accountTemplate; if (options.status) { - liquidTestRunner.runTestsStatusOnly(options.firm, templateType, templateName, options.test); + liquidTestRunner.runTestsStatusOnly(options.firm, templateType, templateName, options.test, options.batch); } else { if (options.previewOnly && !options.htmlInput && !options.htmlPreview) { consola.info(`When using "--preview-only" you need to specify at least one of the following options: "--html-input", "--html-preview"`); process.exit(1); } - liquidTestRunner.runTestsWithOutput(options.firm, templateType, templateName, options.test, options.previewOnly, options.htmlInput, options.htmlPreview); + liquidTestRunner.runTestsWithOutput(options.firm, templateType, templateName, options.test, options.previewOnly, options.htmlInput, options.htmlPreview, options.batch); } }); @@ -682,20 +688,26 @@ program .option("-t, --test ", `Specify the name of the test to be run (optional). It has to be used together with "--handle"`, "") .option("--html", `Get a html file of the template's input-view generated with the Liquid Test information (optional). It has to be used together with "--handle"`, false) .option("--yes", "Skip the prompt confirmation (optional)") + .option("-b, --batch ", `Run all tests that contain this batch identifier (optional). It has to be used together with "--handle" or "--account-template"`, "") .action((options) => { cliUtils.checkDefaultFirm(options.firm, firmIdDefault); cliUtils.checkUniqueOption(["handle", "updateTemplates", "accountTemplate"], options); + if (options.test && options.batch) { + consola.error("You cannot use both --test and --batch options at the same time"); + process.exit(1); + } + if (options.updateTemplates && !options.yes) { cliUtils.promptConfirmation(); } if (options.accountTemplate) { - devMode.watchLiquidTest(options.firm, options.accountTemplate, options.test, options.html, "accountTemplate"); + devMode.watchLiquidTest(options.firm, options.accountTemplate, options.test, options.html, "accountTemplate", options.batch); } if (options.handle) { - devMode.watchLiquidTest(options.firm, options.handle, options.test, options.html, "reconciliationText"); + devMode.watchLiquidTest(options.firm, options.handle, options.test, options.html, "reconciliationText", options.batch); } if (options.updateTemplates) { devMode.watchLiquidFiles(options.firm); diff --git a/lib/cli/devMode.js b/lib/cli/devMode.js index 2a5dc3a..6648226 100644 --- a/lib/cli/devMode.js +++ b/lib/cli/devMode.js @@ -13,8 +13,9 @@ const chokidar = require("chokidar"); * @param {String} testName - Test name (empty string to run all tests) * @param {boolean} renderInput - Open browser and show the HTML from input view * @param {String} templateType - Template type (reconciliationText, accountTemplate) + * @param {String} batch - Batch identifier to filter tests (empty string to run all tests) */ -async function watchLiquidTest(firmId, handle, testName, renderInput, templateType) { +async function watchLiquidTest(firmId, handle, testName, renderInput, templateType, batch = "") { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); process.exit(1); @@ -33,7 +34,7 @@ async function watchLiquidTest(firmId, handle, testName, renderInput, templateTy // Watch YAML chokidar.watch(filePath).on("change", async () => { // Run test - await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput); + await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput, false, batch); }); // Watch liquid files @@ -41,7 +42,7 @@ async function watchLiquidTest(firmId, handle, testName, renderInput, templateTy for (const filePath of liquidFiles) { chokidar.watch(filePath).on("change", async () => { // Run test - await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput); + await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput, false, batch); }); } } From 67103f0cd6481aaeb9e74be1260abce8ccc04e27 Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Thu, 6 Nov 2025 13:49:08 +0100 Subject: [PATCH 3/7] update liquidTestRunner --- lib/liquidTestRunner.js | 103 +++++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 11 deletions(-) diff --git a/lib/liquidTestRunner.js b/lib/liquidTestRunner.js index 9ade06d..03884e8 100644 --- a/lib/liquidTestRunner.js +++ b/lib/liquidTestRunner.js @@ -31,7 +31,62 @@ function findTestRows(testContent) { return indexes; } -function buildTestParams(firmId, templateType, handle, testName = "", renderMode) { +function filterTestsByBatch(testContent, batchIdentifier, testIndexes) { + const indexes = testIndexes || findTestRows(testContent); + const matchingTests = Object.keys(indexes).filter((testName) => testName.includes(batchIdentifier)); + + if (matchingTests.length === 0) { + return { filteredContent: "", matchingTests: [] }; + } + + const testRows = testContent.split("\n"); + + const orderedTests = Object.entries(indexes) + .map(([name, index]) => ({ name, index })) + .sort((a, b) => a.index - b.index); + + const matchingSet = new Set(matchingTests); + const segments = []; + + orderedTests.forEach((test, idx) => { + if (!matchingSet.has(test.name)) { + return; + } + + let start = test.index; + + while (start > 0) { + const previousLine = testRows[start - 1]; + const trimmedPrevious = previousLine.trim(); + if (trimmedPrevious === "" || trimmedPrevious.startsWith("#")) { + start -= 1; + } else { + break; + } + } + + let end = testRows.length; + for (let nextIdx = idx + 1; nextIdx < orderedTests.length; nextIdx++) { + const nextTest = orderedTests[nextIdx]; + if (nextTest.index > test.index) { + end = nextTest.index; + break; + } + } + + const segment = testRows.slice(start, end).join("\n").trimEnd(); + segments.push(segment); + }); + + const orderedMatchingTests = orderedTests.filter((test) => matchingSet.has(test.name)).map((test) => test.name); + + return { + filteredContent: segments.join("\n\n").trim(), + matchingTests: orderedMatchingTests, + }; +} + +function buildTestParams(firmId, templateType, handle, testName = "", renderMode, batch = "") { let relativePath = `./reconciliation_texts/${handle}`; if (templateType === "accountTemplate") { @@ -63,6 +118,24 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode return false; } + const testIndexes = findTestRows(testContent); + + let finalTests = testContent; + + if (batch) { + const { filteredContent, matchingTests } = filterTestsByBatch(testContent, batch, testIndexes); + + if (!matchingTests.length) { + consola.error(`No tests found containing "${batch}" in their name`); + process.exit(1); + } + + finalTests = filteredContent; + consola.info( + `Running ${matchingTests.length} test${matchingTests.length === 1 ? "" : "s"} containing "${batch}": ${matchingTests.join(", ")}` + ); + } + let templateContent; if (templateType === "accountTemplate") { @@ -88,18 +161,17 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode const testParams = { template: templateContent, - tests: testContent, + tests: finalTests, mode: renderMode, }; // Include only one test if (testName) { - const indexes = findTestRows(testContent); - if (!Object.keys(indexes).includes(testName)) { + if (!Object.keys(testIndexes).includes(testName)) { consola.error(`Test ${testName} not found in YAML`); process.exit(1); } - testParams.test_line = indexes[testName] + 1; + testParams.test_line = testIndexes[testName] + 1; } return testParams; } @@ -365,14 +437,14 @@ async function handleHTMLfiles(testName = "", testRun, renderMode) { } // Used by VSCode Extension -async function runTests(firmId, templateType, handle, testName = "", previewOnly = false, renderMode = "none") { +async function runTests(firmId, templateType, handle, testName = "", previewOnly = false, renderMode = "none", batch = "") { try { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); process.exit(1); } - const testParams = buildTestParams(firmId, templateType, handle, testName, renderMode); + const testParams = buildTestParams(firmId, templateType, handle, testName, renderMode, batch); if (!testParams) return; @@ -398,7 +470,16 @@ async function runTests(firmId, templateType, handle, testName = "", previewOnly } } -async function runTestsWithOutput(firmId, templateType, handle, testName = "", previewOnly = false, htmlInput = false, htmlPreview = false) { +async function runTestsWithOutput( + firmId, + templateType, + handle, + testName = "", + previewOnly = false, + htmlInput = false, + htmlPreview = false, + batch = "" +) { try { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); @@ -406,7 +487,7 @@ async function runTestsWithOutput(firmId, templateType, handle, testName = "", p } const renderMode = runTestUtils.checkRenderMode(htmlInput, htmlPreview); - const testsRun = await runTests(firmId, templateType, handle, testName, previewOnly, renderMode); + const testsRun = await runTests(firmId, templateType, handle, testName, previewOnly, renderMode, batch); if (!testsRun) return; processTestRunResponse(testsRun?.testRun || testsRun?.previewRun, previewOnly); @@ -421,14 +502,14 @@ async function runTestsWithOutput(firmId, templateType, handle, testName = "", p // RETURN (AND LOG) ONLY PASSED OR FAILED // CAN BE USED BY GITHUB ACTIONS -async function runTestsStatusOnly(firmId, templateType, handle, testName = "") { +async function runTestsStatusOnly(firmId, templateType, handle, testName = "", batch = "") { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); process.exit(1); } let status = "FAILED"; - const testResult = await runTests(firmId, templateType, handle, testName, false, "none"); + const testResult = await runTests(firmId, templateType, handle, testName, false, "none", batch); if (!testResult) { status = "PASSED"; From 1acc60ca3fd6c0fcf9166c52f030433b4401e694 Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Thu, 6 Nov 2025 13:56:40 +0100 Subject: [PATCH 4/7] make sure error message in terminal refers to correct code line --- lib/liquidTestRunner.js | 51 ++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/lib/liquidTestRunner.js b/lib/liquidTestRunner.js index 03884e8..329e5fb 100644 --- a/lib/liquidTestRunner.js +++ b/lib/liquidTestRunner.js @@ -36,7 +36,7 @@ function filterTestsByBatch(testContent, batchIdentifier, testIndexes) { const matchingTests = Object.keys(indexes).filter((testName) => testName.includes(batchIdentifier)); if (matchingTests.length === 0) { - return { filteredContent: "", matchingTests: [] }; + return { filteredContent: "", matchingTests: [], lineAdjustments: {} }; } const testRows = testContent.split("\n"); @@ -78,11 +78,25 @@ function filterTestsByBatch(testContent, batchIdentifier, testIndexes) { segments.push(segment); }); + const filteredContent = segments.join("\n\n").trim(); const orderedMatchingTests = orderedTests.filter((test) => matchingSet.has(test.name)).map((test) => test.name); + const lineAdjustments = {}; + if (filteredContent) { + const filteredIndexes = findTestRows(filteredContent); + orderedMatchingTests.forEach((testName) => { + const originalIndex = indexes[testName]; + const filteredIndex = filteredIndexes[testName]; + if (typeof originalIndex === "number" && typeof filteredIndex === "number") { + lineAdjustments[testName] = originalIndex - filteredIndex; + } + }); + } + return { - filteredContent: segments.join("\n\n").trim(), + filteredContent, matchingTests: orderedMatchingTests, + lineAdjustments, }; } @@ -121,9 +135,10 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode const testIndexes = findTestRows(testContent); let finalTests = testContent; + let lineAdjustments = {}; if (batch) { - const { filteredContent, matchingTests } = filterTestsByBatch(testContent, batch, testIndexes); + const { filteredContent, matchingTests, lineAdjustments: batchLineAdjustments } = filterTestsByBatch(testContent, batch, testIndexes); if (!matchingTests.length) { consola.error(`No tests found containing "${batch}" in their name`); @@ -131,6 +146,7 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode } finalTests = filteredContent; + lineAdjustments = batchLineAdjustments; consola.info( `Running ${matchingTests.length} test${matchingTests.length === 1 ? "" : "s"} containing "${batch}": ${matchingTests.join(", ")}` ); @@ -173,7 +189,7 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode } testParams.test_line = testIndexes[testName] + 1; } - return testParams; + return { testParams, metadata: { lineAdjustments } }; } async function fetchResult(firmId, testRunId, templateType) { @@ -201,12 +217,14 @@ async function fetchResult(firmId, testRunId, templateType) { return testRun; } -function listErrors(items, type) { +function listErrors(items, type, lineAdjustment = 0) { const itemsKeys = Object.keys(items); consola.log(chalk.red(`${itemsKeys.length} ${type} expectation${itemsKeys.length > 1 ? "s" : ""} failed`)); itemsKeys.forEach((itemName) => { const itemDetails = items[itemName]; - consola.log(`At line number ${itemDetails.line_number}`); + if (typeof itemDetails.line_number === "number") { + consola.log(`At line number ${itemDetails.line_number + lineAdjustment}`); + } let gotDataType = typeof itemDetails.got; let expectedDataType = typeof itemDetails.expected; let displayedGot = itemDetails.got; @@ -287,7 +305,7 @@ function checkTestErrorsPresent(testName, testsFeedback) { return errorsPresent; } -function processTestRunResponse(testRun, previewOnly) { +function processTestRunResponse(testRun, previewOnly, lineAdjustments = {}) { // Possible status: started, completed, test_error, internal_error let errorsPresent; switch (testRun.status) { @@ -321,6 +339,7 @@ function processTestRunResponse(testRun, previewOnly) { consola.log(chalk.bold(testName)); const testElements = testRun.tests[testName]; + const lineAdjustment = lineAdjustments[testName] || 0; // Display success messages of test if (testElements.reconciled === null) { @@ -340,19 +359,21 @@ function processTestRunResponse(testRun, previewOnly) { // Reconciled if (testElements.reconciled !== null) { consola.log(chalk.red("Reconciliation expectation failed")); - consola.log(`At line number ${testElements.reconciled.line_number}`); + if (typeof testElements.reconciled.line_number === "number") { + consola.log(`At line number ${testElements.reconciled.line_number + lineAdjustment}`); + } consola.log(`got ${chalk.blue.bold(testElements.reconciled.got)} but expected ${chalk.blue.bold(testElements.reconciled.expected)}`); consola.log(""); } // Results if (Object.keys(testElements.results).length > 0) { - listErrors(testElements.results, "result"); + listErrors(testElements.results, "result", lineAdjustment); } // Rollforwards if (Object.keys(testElements.rollforwards).length > 0) { - listErrors(testElements.rollforwards, "rollforward"); + listErrors(testElements.rollforwards, "rollforward", lineAdjustment); } }); break; @@ -444,9 +465,11 @@ async function runTests(firmId, templateType, handle, testName = "", previewOnly process.exit(1); } - const testParams = buildTestParams(firmId, templateType, handle, testName, renderMode, batch); + const buildResult = buildTestParams(firmId, templateType, handle, testName, renderMode, batch); + + if (!buildResult) return; - if (!testParams) return; + const { testParams, metadata } = buildResult; let testRun = null; let previewRun = null; @@ -464,7 +487,7 @@ async function runTests(firmId, templateType, handle, testName = "", previewOnly testRun = await fetchResult(firmId, testRunId, templateType); } - return { testRun, previewRun }; + return { testRun, previewRun, metadata }; } catch (error) { errorUtils.errorHandler(error); } @@ -490,7 +513,7 @@ async function runTestsWithOutput( const testsRun = await runTests(firmId, templateType, handle, testName, previewOnly, renderMode, batch); if (!testsRun) return; - processTestRunResponse(testsRun?.testRun || testsRun?.previewRun, previewOnly); + processTestRunResponse(testsRun?.testRun || testsRun?.previewRun, previewOnly, testsRun?.metadata?.lineAdjustments || {}); if (testsRun.previewRun && testsRun.previewRun.status !== "test_error" && renderMode !== "none") { handleHTMLfiles(testName, testsRun.previewRun, renderMode); From cc3edb9769793a76434e7510a02a9fb54dd31580 Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Fri, 12 Dec 2025 15:54:27 +0100 Subject: [PATCH 5/7] adjust naming from 'batch' to 'pattern' (review comment) --- bin/cli.js | 20 ++++++++++---------- lib/cli/devMode.js | 8 ++++---- lib/liquidTestRunner.js | 28 ++++++++++++++-------------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/bin/cli.js b/bin/cli.js index 05cf549..fdbff46 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -459,7 +459,7 @@ program .option("--html-preview", "Get a static html of the export-view of the template generated with the Liquid Test data (optional)", false) .option("--preview-only", "Skip the checking of the results of the Liquid Test in case you only want to generate a preview template (optional)", false) .option("--status", "Only return the status of the test runs as PASSED/FAILED (optional)", false) - .option("-b, --batch ", "Run all tests that contain this batch identifier (optional)", "") + .option("-p, --pattern ", "Run all tests that match this pattern (optional)", "") .action((options) => { if (!options.handle && !options.accountTemplate) { @@ -467,8 +467,8 @@ program process.exit(1); } - if (options.test && options.batch) { - consola.error("You cannot use both --test and --batch options at the same time"); + if (options.test && options.pattern) { + consola.error("You cannot use both --test and --pattern options at the same time"); process.exit(1); } @@ -476,13 +476,13 @@ program const templateName = options.handle ? options.handle : options.accountTemplate; if (options.status) { - liquidTestRunner.runTestsStatusOnly(options.firm, templateType, templateName, options.test, options.batch); + liquidTestRunner.runTestsStatusOnly(options.firm, templateType, templateName, options.test, options.pattern); } else { if (options.previewOnly && !options.htmlInput && !options.htmlPreview) { consola.info(`When using "--preview-only" you need to specify at least one of the following options: "--html-input", "--html-preview"`); process.exit(1); } - liquidTestRunner.runTestsWithOutput(options.firm, templateType, templateName, options.test, options.previewOnly, options.htmlInput, options.htmlPreview, options.batch); + liquidTestRunner.runTestsWithOutput(options.firm, templateType, templateName, options.test, options.previewOnly, options.htmlInput, options.htmlPreview, options.pattern); } }); @@ -688,13 +688,13 @@ program .option("-t, --test ", `Specify the name of the test to be run (optional). It has to be used together with "--handle"`, "") .option("--html", `Get a html file of the template's input-view generated with the Liquid Test information (optional). It has to be used together with "--handle"`, false) .option("--yes", "Skip the prompt confirmation (optional)") - .option("-b, --batch ", `Run all tests that contain this batch identifier (optional). It has to be used together with "--handle" or "--account-template"`, "") + .option("-b, --pattern ", `Run all tests that match this pattern (optional). It has to be used together with "--handle" or "--account-template"`, "") .action((options) => { cliUtils.checkDefaultFirm(options.firm, firmIdDefault); cliUtils.checkUniqueOption(["handle", "updateTemplates", "accountTemplate"], options); - if (options.test && options.batch) { - consola.error("You cannot use both --test and --batch options at the same time"); + if (options.test && options.pattern) { + consola.error("You cannot use both --test and --pattern options at the same time"); process.exit(1); } @@ -703,11 +703,11 @@ program } if (options.accountTemplate) { - devMode.watchLiquidTest(options.firm, options.accountTemplate, options.test, options.html, "accountTemplate", options.batch); + devMode.watchLiquidTest(options.firm, options.accountTemplate, options.test, options.html, "accountTemplate", options.pattern); } if (options.handle) { - devMode.watchLiquidTest(options.firm, options.handle, options.test, options.html, "reconciliationText", options.batch); + devMode.watchLiquidTest(options.firm, options.handle, options.test, options.html, "reconciliationText", options.pattern); } if (options.updateTemplates) { devMode.watchLiquidFiles(options.firm); diff --git a/lib/cli/devMode.js b/lib/cli/devMode.js index 6648226..d2ea32b 100644 --- a/lib/cli/devMode.js +++ b/lib/cli/devMode.js @@ -13,9 +13,9 @@ const chokidar = require("chokidar"); * @param {String} testName - Test name (empty string to run all tests) * @param {boolean} renderInput - Open browser and show the HTML from input view * @param {String} templateType - Template type (reconciliationText, accountTemplate) - * @param {String} batch - Batch identifier to filter tests (empty string to run all tests) + * @param {String} pattern - Pattern to match test names (empty string to run all tests) */ -async function watchLiquidTest(firmId, handle, testName, renderInput, templateType, batch = "") { +async function watchLiquidTest(firmId, handle, testName, renderInput, templateType, pattern = "") { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); process.exit(1); @@ -34,7 +34,7 @@ async function watchLiquidTest(firmId, handle, testName, renderInput, templateTy // Watch YAML chokidar.watch(filePath).on("change", async () => { // Run test - await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput, false, batch); + await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput, false, pattern); }); // Watch liquid files @@ -42,7 +42,7 @@ async function watchLiquidTest(firmId, handle, testName, renderInput, templateTy for (const filePath of liquidFiles) { chokidar.watch(filePath).on("change", async () => { // Run test - await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput, false, batch); + await liquidTestRunner.runTestsWithOutput(firmId, templateType, handle, testName, false, renderInput, false, pattern); }); } } diff --git a/lib/liquidTestRunner.js b/lib/liquidTestRunner.js index 329e5fb..9bb8837 100644 --- a/lib/liquidTestRunner.js +++ b/lib/liquidTestRunner.js @@ -31,9 +31,9 @@ function findTestRows(testContent) { return indexes; } -function filterTestsByBatch(testContent, batchIdentifier, testIndexes) { +function filterTestsByPattern(testContent, pattern, testIndexes) { const indexes = testIndexes || findTestRows(testContent); - const matchingTests = Object.keys(indexes).filter((testName) => testName.includes(batchIdentifier)); + const matchingTests = Object.keys(indexes).filter((testName) => testName.includes(pattern)); if (matchingTests.length === 0) { return { filteredContent: "", matchingTests: [], lineAdjustments: {} }; @@ -100,7 +100,7 @@ function filterTestsByBatch(testContent, batchIdentifier, testIndexes) { }; } -function buildTestParams(firmId, templateType, handle, testName = "", renderMode, batch = "") { +function buildTestParams(firmId, templateType, handle, testName = "", renderMode, pattern = "") { let relativePath = `./reconciliation_texts/${handle}`; if (templateType === "accountTemplate") { @@ -137,18 +137,18 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode let finalTests = testContent; let lineAdjustments = {}; - if (batch) { - const { filteredContent, matchingTests, lineAdjustments: batchLineAdjustments } = filterTestsByBatch(testContent, batch, testIndexes); + if (pattern) { + const { filteredContent, matchingTests, lineAdjustments: patternLineAdjustments } = filterTestsByPattern(testContent, pattern, testIndexes); if (!matchingTests.length) { - consola.error(`No tests found containing "${batch}" in their name`); + consola.error(`No tests found containing "${pattern}" in their name`); process.exit(1); } finalTests = filteredContent; - lineAdjustments = batchLineAdjustments; + lineAdjustments = patternLineAdjustments; consola.info( - `Running ${matchingTests.length} test${matchingTests.length === 1 ? "" : "s"} containing "${batch}": ${matchingTests.join(", ")}` + `Running ${matchingTests.length} test${matchingTests.length === 1 ? "" : "s"} containing "${pattern}": ${matchingTests.join(", ")}` ); } @@ -458,14 +458,14 @@ async function handleHTMLfiles(testName = "", testRun, renderMode) { } // Used by VSCode Extension -async function runTests(firmId, templateType, handle, testName = "", previewOnly = false, renderMode = "none", batch = "") { +async function runTests(firmId, templateType, handle, testName = "", previewOnly = false, renderMode = "none", pattern = "") { try { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); process.exit(1); } - const buildResult = buildTestParams(firmId, templateType, handle, testName, renderMode, batch); + const buildResult = buildTestParams(firmId, templateType, handle, testName, renderMode, pattern); if (!buildResult) return; @@ -501,7 +501,7 @@ async function runTestsWithOutput( previewOnly = false, htmlInput = false, htmlPreview = false, - batch = "" + pattern = "" ) { try { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { @@ -510,7 +510,7 @@ async function runTestsWithOutput( } const renderMode = runTestUtils.checkRenderMode(htmlInput, htmlPreview); - const testsRun = await runTests(firmId, templateType, handle, testName, previewOnly, renderMode, batch); + const testsRun = await runTests(firmId, templateType, handle, testName, previewOnly, renderMode, pattern); if (!testsRun) return; processTestRunResponse(testsRun?.testRun || testsRun?.previewRun, previewOnly, testsRun?.metadata?.lineAdjustments || {}); @@ -525,14 +525,14 @@ async function runTestsWithOutput( // RETURN (AND LOG) ONLY PASSED OR FAILED // CAN BE USED BY GITHUB ACTIONS -async function runTestsStatusOnly(firmId, templateType, handle, testName = "", batch = "") { +async function runTestsStatusOnly(firmId, templateType, handle, testName = "", pattern = "") { if (templateType !== "reconciliationText" && templateType !== "accountTemplate") { consola.error(`Template type is missing or invalid`); process.exit(1); } let status = "FAILED"; - const testResult = await runTests(firmId, templateType, handle, testName, false, "none", batch); + const testResult = await runTests(firmId, templateType, handle, testName, false, "none", pattern); if (!testResult) { status = "PASSED"; From fdc8386158ec8373765c9faacfb3dfb2a9bd38bb Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Fri, 12 Dec 2025 16:24:27 +0100 Subject: [PATCH 6/7] adjust printed formatting to bullet points (review comment) --- lib/liquidTestRunner.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/liquidTestRunner.js b/lib/liquidTestRunner.js index 9bb8837..8ab01b7 100644 --- a/lib/liquidTestRunner.js +++ b/lib/liquidTestRunner.js @@ -148,8 +148,11 @@ function buildTestParams(firmId, templateType, handle, testName = "", renderMode finalTests = filteredContent; lineAdjustments = patternLineAdjustments; consola.info( - `Running ${matchingTests.length} test${matchingTests.length === 1 ? "" : "s"} containing "${pattern}": ${matchingTests.join(", ")}` + `Running ${matchingTests.length} test${matchingTests.length === 1 ? "" : "s"} matching pattern "${pattern}":` ); + matchingTests.forEach((testName) => { + consola.log(` • ${testName}`); + }); } let templateContent; From 8b2951086a5dfcb1f3de34e45054b89a1c354470 Mon Sep 17 00:00:00 2001 From: Delphine Demeulenaere Date: Wed, 7 Jan 2026 11:15:56 +0100 Subject: [PATCH 7/7] change version number --- CHANGELOG.md | 3 ++ bin/cli.js | 2 +- package-lock.json | 113 ++++++++++++++++++++++++---------------------- package.json | 2 +- 4 files changed, 63 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index caa3194..5b50771 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog All notable changes to this project will be documented in this file. +## [1.49.0] (07/01/2026) +In this version we are introducing Liquid batch/pattern testing. An extra option was added to the `silverfin run-test`command to run all tests which conatin a common string. +To enable it run `silverfin run-test -p "string pattern" -h template_handle` ## [1.48.0] (25/09/2025) In this version we are introducing TAB autocompletion for the CLI commands. It should autocomplete command names, flags, and template handles and names. diff --git a/bin/cli.js b/bin/cli.js index fdbff46..f6d7fbb 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -688,7 +688,7 @@ program .option("-t, --test ", `Specify the name of the test to be run (optional). It has to be used together with "--handle"`, "") .option("--html", `Get a html file of the template's input-view generated with the Liquid Test information (optional). It has to be used together with "--handle"`, false) .option("--yes", "Skip the prompt confirmation (optional)") - .option("-b, --pattern ", `Run all tests that match this pattern (optional). It has to be used together with "--handle" or "--account-template"`, "") + .option("-p, --pattern ", `Run all tests that match this pattern (optional). It has to be used together with "--handle" or "--account-template"`, "") .action((options) => { cliUtils.checkDefaultFirm(options.firm, firmIdDefault); cliUtils.checkUniqueOption(["handle", "updateTemplates", "accountTemplate"], options); diff --git a/package-lock.json b/package-lock.json index 0444571..0334f3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "silverfin-cli", - "version": "1.48.0", + "version": "1.49.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "silverfin-cli", - "version": "1.48.0", + "version": "1.49.0", "license": "MIT", "dependencies": { "axios": "^1.6.2", @@ -528,9 +528,9 @@ "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -610,9 +610,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -702,9 +702,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -1267,9 +1267,9 @@ } }, "node_modules/@types/node": { - "version": "24.10.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", - "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "dev": true, "license": "MIT", "dependencies": { @@ -1284,9 +1284,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", - "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -1563,9 +1563,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.25", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.25.tgz", - "integrity": "sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==", + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1608,9 +1608,9 @@ } }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1628,11 +1628,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1692,9 +1692,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001754", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", - "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "version": "1.0.30001762", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", + "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", "dev": true, "funding": [ { @@ -1942,9 +1942,9 @@ } }, "node_modules/dedent": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.0.tgz", - "integrity": "sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", + "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2039,9 +2039,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.245", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.245.tgz", - "integrity": "sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==", + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", "dev": true, "license": "ISC" }, @@ -2315,9 +2315,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2432,9 +2432,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -2536,9 +2536,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -3729,9 +3729,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -4886,9 +4886,9 @@ "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -5034,15 +5034,18 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { diff --git a/package.json b/package.json index 6c39a3e..8aaed65 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "silverfin-cli", - "version": "1.48.0", + "version": "1.49.0", "description": "Command line tool for Silverfin template development", "main": "index.js", "license": "MIT",