From bc5b6837dd524f02f7a8b6a3a84d5a1bb5cb4cf8 Mon Sep 17 00:00:00 2001 From: romovs Date: Wed, 12 Aug 2026 14:23:56 +0300 Subject: [PATCH 1/4] [playwright] Record failure location --- packages/playwright/src/reporter/PwEventProcessor.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/playwright/src/reporter/PwEventProcessor.ts b/packages/playwright/src/reporter/PwEventProcessor.ts index cb3a601..910a4c1 100644 --- a/packages/playwright/src/reporter/PwEventProcessor.ts +++ b/packages/playwright/src/reporter/PwEventProcessor.ts @@ -119,7 +119,7 @@ export class PwEventProcessor { cbCaseResult.steps = this._getCbStepsFromPwSteps(pwResult.steps, testDir, failureScreenshot); if (pwResult.status === 'failed' && this._hasNoFailedSteps(cbCaseResult.steps)) { - cbCaseResult.failure = this._getCbFailureFromPwError(pwResult); + cbCaseResult.failure = this._getCbFailureFromPwError(pwResult, testDir); } // update end-time of the parent suites + update status @@ -427,7 +427,7 @@ export class PwEventProcessor { location: pwStep.location ? getCodeLocation(pwStep.location, testDir) : undefined, type: this._getCbStepTypeFromPwCategory(pwStep.category), status: pwStep.error || childStepFailed ? ResultStatusEnum.FAILED : ResultStatusEnum.PASSED, - failure: this._getCbFailureFromPwError(pwStep), + failure: this._getCbFailureFromPwError(pwStep, testDir), // FIXME: we can probably need to convert the inline screenshot to an attachment to reduce the payload size // screenShot: pwStep.error && failureScreenshot ? this._getBase64FromScreeenshot(failureScreenshot) : undefined, steps: childSteps, @@ -459,7 +459,7 @@ export class PwEventProcessor { return StepTypeEnum.GENERAL; } - private _getCbFailureFromPwError(pwStepOrTest?: TestStep | TestResult): CbFailureResult | undefined { + private _getCbFailureFromPwError(pwStepOrTest?: TestStep | TestResult, testDir?: string): CbFailureResult | undefined { if (!pwStepOrTest || !pwStepOrTest.error) { return undefined; } @@ -476,6 +476,8 @@ export class PwEventProcessor { snippet: error.snippet, message: message, stacktrace: stack, + location: error.location ? getCodeLocation(error.location, testDir) : undefined, + line: error.location?.line, }; } From f075a10d122779990a67a56ab1f271a0c51a0608 Mon Sep 17 00:00:00 2001 From: romovs Date: Wed, 12 Aug 2026 14:37:03 +0300 Subject: [PATCH 2/4] Fix lint errors --- packages/playwright/src/clients/LocalReporterClient.ts | 4 +++- packages/playwright/src/reporter/PwEventProcessor.ts | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/playwright/src/clients/LocalReporterClient.ts b/packages/playwright/src/clients/LocalReporterClient.ts index 046a477..8e3b370 100644 --- a/packages/playwright/src/clients/LocalReporterClient.ts +++ b/packages/playwright/src/clients/LocalReporterClient.ts @@ -89,7 +89,9 @@ export class LocalReporterClient implements CbReporterClient { } onCasePending(cbCase: CaseResult, cbParentSuite: SuiteResult): void { - if (!this.cbApiClient) return; + if (!this.cbApiClient) { + return; + } this.cbApiClient.updateCaseStatus({ timestamp: new Date().getTime(), runId: this.runId!, diff --git a/packages/playwright/src/reporter/PwEventProcessor.ts b/packages/playwright/src/reporter/PwEventProcessor.ts index 910a4c1..25b01fe 100644 --- a/packages/playwright/src/reporter/PwEventProcessor.ts +++ b/packages/playwright/src/reporter/PwEventProcessor.ts @@ -91,6 +91,7 @@ export class PwEventProcessor { public onTestBegin(pwTest: TestCase) { const cbCase = this.cbCaseCache.get(pwTest)!; // @ts-expect-error access to private property _parent + // eslint-disable-next-line no-underscore-dangle const cbParentSuite = cbCase._parent as CbSuiteResult; this.cbClient.onCaseStart(cbCase, cbParentSuite); } From 81b72bc7a92d43dbc3c491b58c30bd264eba9f52 Mon Sep 17 00:00:00 2001 From: romovs Date: Wed, 12 Aug 2026 14:38:27 +0300 Subject: [PATCH 3/4] [client] Bump vulnerable deps --- package-lock.json | 318 ++++++++++++++++++++++++++++++----- package.json | 2 +- packages/client/package.json | 6 +- 3 files changed, 280 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 217806a..2bed98f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "eslint-plugin-prefer-arrow": "^1.2.3", "husky": "^8.0.3", "lerna": "7.4.2", - "rimraf": "^3.0.2", + "rimraf": "6.1.3", "typescript": "^5.2.2" } }, @@ -1017,6 +1017,23 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/move-file/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -1769,10 +1786,11 @@ } }, "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -2466,13 +2484,13 @@ } }, "node_modules/axios": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", - "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.19.0.tgz", + "integrity": "sha512-ht/iuYZXEjFxLH/Hkezgd7m6JKlHHXEUSneaDz8uZe1Gj5QZtCnpyDsckvAiEnT89OEbCLmnte4R4sn7P0EKFw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -2717,6 +2735,69 @@ "node": ">=8" } }, + "node_modules/cacache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/cacache/node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/cacache/node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", @@ -4451,6 +4532,23 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/flatted": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", @@ -4515,16 +4613,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -5092,9 +5190,9 @@ "dev": true }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -7202,6 +7300,23 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/node-gyp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/node-machine-id": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", @@ -8131,6 +8246,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "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/pacote": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", @@ -9330,15 +9452,104 @@ } }, "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^7.1.3" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" }, "bin": { - "rimraf": "bin.js" + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10302,6 +10513,23 @@ "node": ">=8.17.0" } }, + "node_modules/tmp/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11206,14 +11434,37 @@ "license": "GPL-3.0", "dependencies": { "@cloudbeat/types": "1.0.8", - "axios": "^1.16.1", - "debug": "^4.3.4", + "axios": "^1.19.0", + "debug": "^4.4.3", "moment": "^2.30.1" }, "devDependencies": { - "@types/debug": "^4.1.12" + "@types/debug": "^4.1.13" + } + }, + "packages/client/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, + "packages/client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "packages/cucumber": { "name": "@cloudbeat/cucumber", "version": "3.2.2", @@ -11284,7 +11535,7 @@ }, "packages/playwright": { "name": "@cloudbeat/playwright", - "version": "2.1.0", + "version": "2.2.0", "license": "GPL-3.0", "dependencies": { "@cloudbeat/client": "2.0.0", @@ -11303,17 +11554,6 @@ "node": ">=18" } }, - "packages/playwright/node_modules/axios": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.30.3.tgz", - "integrity": "sha512-5/tmEb6TmE/ax3mdXBc/Mi6YdPGxQsv+0p5YlciXWt3PHIn0VamqCXhRMtScnwY3lbgSXLneOuXAKUhgmSRpwg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, "packages/playwright/node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -11337,12 +11577,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "packages/playwright/node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, "packages/types": { "name": "@cloudbeat/types", "version": "1.0.8", diff --git a/package.json b/package.json index c10c0e5..87ce858 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "eslint-plugin-prefer-arrow": "^1.2.3", "husky": "^8.0.3", "lerna": "7.4.2", - "rimraf": "^3.0.2", + "rimraf": "6.1.3", "typescript": "^5.2.2" }, "workspaces": [ diff --git a/packages/client/package.json b/packages/client/package.json index 98a2591..a2f2f6e 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -33,8 +33,8 @@ }, "dependencies": { "@cloudbeat/types": "1.0.8", - "axios": "^1.16.1", - "debug": "^4.3.4", + "axios": "^1.19.0", + "debug": "^4.4.3", "moment": "^2.30.1" }, "scripts": { @@ -48,6 +48,6 @@ "registry": "https://registry.npmjs.org/" }, "devDependencies": { - "@types/debug": "^4.1.12" + "@types/debug": "^4.1.13" } } From 8e80b779da89a86fe0218f6f71f2f76f8388f87f Mon Sep 17 00:00:00 2001 From: romovs Date: Wed, 12 Aug 2026 14:56:32 +0300 Subject: [PATCH 4/4] [cucumber] Record failure location --- packages/cucumber/src/utils.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/cucumber/src/utils.ts b/packages/cucumber/src/utils.ts index 9143f84..2258b94 100644 --- a/packages/cucumber/src/utils.ts +++ b/packages/cucumber/src/utils.ts @@ -66,6 +66,29 @@ export function determineTestCaseStatus(result: CbCaseResult): ResultStatusEnum return hasFailedSteps ? ResultStatusEnum.FAILED : ResultStatusEnum.PASSED; } +// exception.stackTrace has "at ... (file:line:col)" frames - the first one is often inside an assertion library +// (e.g. node_modules/playwright/lib/matchers/expect.js), so skip node_modules/node: frames to +// find the actual line in the user's own step definition / page object that caused the failure +const STACK_FRAME_REGEX = /at\s+(?:.*?\s+)?\(?([^\s()]+):(\d+):(\d+)\)?\s*$/; + +function getLocationFromStackTrace(stackTrace: string | undefined): string | undefined { + if (!stackTrace) { + return undefined; + } + for (const line of stackTrace.split('\n')) { + const match = STACK_FRAME_REGEX.exec(line.trim()); + if (!match) { + continue; + } + const [, file, lineNum, col] = match; + if (file.includes('node_modules') || file.startsWith('node:')) { + continue; + } + return `${file}:${lineNum}:${col}`; + } + return undefined; +} + export function getFailureFromException(exception: any, defaultErrorType?: string | undefined): FailureResult | undefined { if (!exception) { return undefined; @@ -79,6 +102,7 @@ export function getFailureFromException(exception: any, defaultErrorType?: strin failure.subtype = exception.type; failure.message = exception.message; failure.stacktrace = exception.stackTrace || exception.stack; + failure.location = getLocationFromStackTrace(failure.stacktrace); return failure; }