From 270945f9248e62edf25a2bc50d80f13c22306f95 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 9 Apr 2026 13:45:02 +0300 Subject: [PATCH 01/26] Pass tag explicitly so that it is not replaced with hash --- .github/workflows/build-electron-app.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-electron-app.yml b/.github/workflows/build-electron-app.yml index 1fc31426..70cf537b 100644 --- a/.github/workflows/build-electron-app.yml +++ b/.github/workflows/build-electron-app.yml @@ -285,6 +285,7 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, release_id: draft.id, + tag_name: draft.tag_name || `v${version}`, body: content, }) linux-e2e-test-runner: From a4c080e2b57f3072501207cd36373e3811599186 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 13:41:35 +0300 Subject: [PATCH 02/26] Update deps for gh workflow ci --- .github/workflows/ci.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d0cb0d2..61ad7854 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,25 +15,21 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6.0.2 with: submodules: recursive - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6.3.0 with: node-version: 24.14.0 - name: Setup configs and install deps run: ./scripts/setup.sh -u - name: Run tests - uses: nick-fields/retry@v3 - continue-on-error: false - with: - timeout_minutes: 20 - retry_wait_seconds: 10 - max_attempts: 3 - retry_on: any - command: npm test -- -- --reporter=json --reporter-option output=test-report.json - - uses: actions/upload-artifact@v4 + run: npm test -- -- --reporter=json --reporter-option output=test-report.json + - uses: actions/upload-artifact@v7.0.0 if: success() || failure() with: name: test-results path: test-report.json + web-page-report: + needs: linux-test-runner + uses: ./.github/workflows/test-report.yml From 175a1f4317be289b99f2cb8e33bcc61f61046070 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 13:42:19 +0300 Subject: [PATCH 03/26] Update deps for gh workflow for test report summary --- .github/workflows/test-report.yml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index bf11d9d5..4bf6cbf3 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -2,10 +2,7 @@ name: 'Test Report' run-name: 'Test Report: Commit ${{ github.sha }}' on: - workflow_run: - workflows: ['CI'] - types: - - completed + workflow_call permissions: contents: read @@ -19,22 +16,18 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download test results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: - run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: test-results path: test-results - - uses: dorny/test-reporter@v1.8.0 + - uses: dorny/test-reporter@v3.0.0 id: test-results with: name: Mocha Tests path: test-results/test-report.json reporter: mocha-json + collapsed: never # Workaround for error 'fatal: not a git repository' caused by a call to 'git ls-files' # See: https://github.com/dorny/test-reporter/issues/169#issuecomment-1583560458 max-annotations: 0 - - name: Test Report Summary - run: | - echo "### Test Report page is ready! :rocket:" >> $GITHUB_STEP_SUMMARY - echo "And available at the following [Link](${{ steps.test-results.outputs.url_html }})" >> $GITHUB_STEP_SUMMARY From 65be384b6e51a7d2d64d3749fbc532644a60dad2 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 13:43:40 +0300 Subject: [PATCH 04/26] Update deps for gh workflow for electron app building --- .github/workflows/build-electron-app.yml | 66 ++++++++++++------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/.github/workflows/build-electron-app.yml b/.github/workflows/build-electron-app.yml index 70cf537b..70a859d1 100644 --- a/.github/workflows/build-electron-app.yml +++ b/.github/workflows/build-electron-app.yml @@ -37,7 +37,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6.0.2 with: submodules: recursive - if: github.event.inputs.version != '' @@ -63,7 +63,7 @@ jobs: fi - name: Cache Electron binaries id: electron-cache - uses: actions/cache@v4 + uses: actions/cache@v5.0.4 env: cache-name: electron-cache-v1 with: @@ -75,7 +75,7 @@ jobs: ${{ runner.os }}-build-${{ env.cache-name }}- - name: Build release id: release-builder - uses: nick-fields/retry@v3 + uses: nick-fields/retry@v4.0.0 continue-on-error: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -93,20 +93,20 @@ jobs: - name: Zip Linux Unpacked build run: zip -r dist/linux-unpacked.zip dist/linux-unpacked - name: Upload Linux Unpacked build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: linux-unpacked path: dist/linux-unpacked.zip - name: Zip Win Unpacked build run: zip -r dist/win-unpacked.zip dist/win-unpacked - name: Upload Win Unpacked build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: win-unpacked path: dist/win-unpacked.zip - if: env.REPO_OWNER != github.repository_owner name: Upload Linux Dist Release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: linux-dist-release path: | @@ -115,7 +115,7 @@ jobs: dist/latest-linux.yml - if: env.REPO_OWNER != github.repository_owner name: Upload Win Dist Release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: win-dist-release path: | @@ -132,7 +132,7 @@ jobs: runs-on: macos-15-intel steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6.0.2 with: submodules: recursive - if: github.event.inputs.version != '' @@ -160,12 +160,12 @@ jobs: else echo "REPO_OWNER=${{ github.repository_owner }}" >> $GITHUB_ENV fi - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6.3.0 with: node-version: 24.14.0 - name: Cache Electron binaries id: electron-cache - uses: actions/cache@v4 + uses: actions/cache@v5.0.4 env: cache-name: electron-cache-v1 with: @@ -176,7 +176,7 @@ jobs: ${{ runner.os }}-build-${{ env.cache-name }}- - name: Build release id: release-builder - uses: nick-fields/retry@v3 + uses: nick-fields/retry@v4.0.0 continue-on-error: false env: APPLE_TEAM_ID: ${{ secrets.BFX_APPLE_TEAM_ID }} @@ -208,13 +208,13 @@ jobs: - name: Zip Mac Unpacked build run: zip -r dist/mac.zip dist/mac - name: Upload Mac Unpacked build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: mac-unpacked path: dist/mac.zip - if: env.REPO_OWNER != github.repository_owner name: Upload Mac Dist Release - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: mac-dist-release path: | @@ -231,7 +231,7 @@ jobs: needs: [linux-win-docker-builder, mac-builder] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6.0.2 - name: Get release version id: version run: | @@ -251,7 +251,7 @@ jobs: echo "$CONTENT" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Update matching draft release - uses: actions/github-script@v8 + uses: actions/github-script@v9.0.0 env: VERSION: ${{ steps.version.outputs.version }} CONTENT: ${{ steps.changelog.outputs.content }} @@ -295,27 +295,27 @@ jobs: needs: [linux-win-docker-builder] steps: - name: Checkout - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + uses: actions/checkout@v6.0.2 + - uses: actions/setup-node@v6.3.0 with: node-version: 24.14.0 - name: Install main dev deps - run: npm i --development --no-audit --progress=false --force + run: npm ci --no-audit --force - name: Download Linux Unpacked build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: name: linux-unpacked path: dist - name: Unzip Linux Unpacked build run: unzip dist/linux-unpacked.zip - - name: Run tests + - name: Run tests # TODO: https://webdriver.io/docs/headless-and-xvfb/ uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a with: run: npm run e2e - name: Normalize E2E test report run: node ./scripts/node/normalize-e2e-test-report e2e-test-report.xml - name: Upload Linux E2E test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: linux-e2e-test-results path: e2e-test-report.xml @@ -327,27 +327,27 @@ jobs: needs: [linux-win-docker-builder] steps: - name: Checkout - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 + uses: actions/checkout@v6.0.2 + - uses: actions/setup-node@v6.3.0 with: node-version: 24.14.0 - name: Install main dev deps - run: npm i --development --no-audit --progress=false --force + run: npm ci --no-audit --force - name: Download Linux Unpacked build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: name: win-unpacked path: dist - name: Unzip Win Unpacked build run: 7z -y x dist/win-unpacked.zip - - name: Run tests + - name: Run tests # TODO: https://webdriver.io/docs/headless-and-xvfb/ uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a with: run: npm run e2e - name: Normalize E2E test report run: node ./scripts/node/normalize-e2e-test-report e2e-test-report.xml - name: Upload Win E2E test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: win-e2e-test-results path: e2e-test-report.xml @@ -359,29 +359,29 @@ jobs: needs: [mac-builder] steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6.0.2 - name: Prepare Mac runner uses: ./.github/actions/prepare-mac-runner - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6.3.0 with: node-version: 24.14.0 - name: Install main dev deps - run: npm i --development --no-audit --progress=false --force + run: npm ci --no-audit --force - name: Download Mac Unpacked build - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: name: mac-unpacked path: dist - name: Unzip Mac Unpacked build run: unzip dist/mac.zip - - name: Run tests + - name: Run tests # TODO: https://webdriver.io/docs/headless-and-xvfb/ uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a with: run: npm run e2e - name: Normalize E2E test report run: node ./scripts/node/normalize-e2e-test-report e2e-test-report.xml - name: Upload Mac E2E test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7.0.0 with: name: mac-e2e-test-results path: e2e-test-report.xml From 8c24cc9a69b55c059967f53112378e8cd719ad95 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 13:44:01 +0300 Subject: [PATCH 05/26] Update deps for gh workflow for e2e test report summary --- .github/workflows/e2e-test-report.yml | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/e2e-test-report.yml b/.github/workflows/e2e-test-report.yml index 7ce5edd3..00fc962a 100644 --- a/.github/workflows/e2e-test-report.yml +++ b/.github/workflows/e2e-test-report.yml @@ -19,53 +19,49 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download Linux E2E test results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: linux-e2e-test-results path: linux-e2e-test-results - - uses: dorny/test-reporter@v1.8.0 + - uses: dorny/test-reporter@v3.0.0 id: linux-e2e-test-results with: name: Linux E2E Tests path: linux-e2e-test-results/e2e-test-report.xml reporter: jest-junit + collapsed: never # Workaround for error 'fatal: not a git repository' caused by a call to 'git ls-files' # See: https://github.com/dorny/test-reporter/issues/169#issuecomment-1583560458 max-annotations: 0 - name: Download Win E2E test results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: win-e2e-test-results path: win-e2e-test-results - - uses: dorny/test-reporter@v1.8.0 + - uses: dorny/test-reporter@v3.0.0 id: win-e2e-test-results with: name: Win E2E Tests path: win-e2e-test-results/e2e-test-report.xml reporter: jest-junit + collapsed: never max-annotations: 0 - name: Download Mac E2E test results - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8.0.0 with: run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: mac-e2e-test-results path: mac-e2e-test-results - - uses: dorny/test-reporter@v1.8.0 + - uses: dorny/test-reporter@v3.0.0 id: mac-e2e-test-results with: name: Mac E2E Tests path: mac-e2e-test-results/e2e-test-report.xml reporter: jest-junit + collapsed: never max-annotations: 0 - - name: E2E Test Report Summary - run: | - echo "### E2E Test Report page is ready! :rocket:" >> $GITHUB_STEP_SUMMARY - echo "And available at the following links for applicable OSs:" >> $GITHUB_STEP_SUMMARY - echo "- [Linux](${{ steps.linux-e2e-test-results.outputs.url_html }})" >> $GITHUB_STEP_SUMMARY - echo "- [Win](${{ steps.win-e2e-test-results.outputs.url_html }})" >> $GITHUB_STEP_SUMMARY - echo "- [Mac](${{ steps.mac-e2e-test-results.outputs.url_html }})" >> $GITHUB_STEP_SUMMARY From 914da5d2cd2d1c56ccb8515c942acba3e99ef066 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 13:57:36 +0300 Subject: [PATCH 06/26] Fix test report workflow condition --- .github/workflows/test-report.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test-report.yml b/.github/workflows/test-report.yml index 4bf6cbf3..43753b0a 100644 --- a/.github/workflows/test-report.yml +++ b/.github/workflows/test-report.yml @@ -13,7 +13,6 @@ jobs: web-page-report: name: Web Page Report runs-on: ubuntu-22.04 - if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download test results uses: actions/download-artifact@v8.0.0 From 28ba86c6c2d5770c7fc63f4c44230e59f78bc85c Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 14:11:29 +0300 Subject: [PATCH 07/26] Enhance headless and xvfb usage for e2e testrunner https://webdriver.io/docs/headless-and-xvfb/ --- .github/workflows/build-electron-app.yml | 18 ++++++------------ wdio.conf.js | 5 +++++ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-electron-app.yml b/.github/workflows/build-electron-app.yml index 70a859d1..7b068a9a 100644 --- a/.github/workflows/build-electron-app.yml +++ b/.github/workflows/build-electron-app.yml @@ -308,10 +308,8 @@ jobs: path: dist - name: Unzip Linux Unpacked build run: unzip dist/linux-unpacked.zip - - name: Run tests # TODO: https://webdriver.io/docs/headless-and-xvfb/ - uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a - with: - run: npm run e2e + - name: Run tests + run: npm run e2e - name: Normalize E2E test report run: node ./scripts/node/normalize-e2e-test-report e2e-test-report.xml - name: Upload Linux E2E test results @@ -340,10 +338,8 @@ jobs: path: dist - name: Unzip Win Unpacked build run: 7z -y x dist/win-unpacked.zip - - name: Run tests # TODO: https://webdriver.io/docs/headless-and-xvfb/ - uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a - with: - run: npm run e2e + - name: Run tests + run: npm run e2e - name: Normalize E2E test report run: node ./scripts/node/normalize-e2e-test-report e2e-test-report.xml - name: Upload Win E2E test results @@ -374,10 +370,8 @@ jobs: path: dist - name: Unzip Mac Unpacked build run: unzip dist/mac.zip - - name: Run tests # TODO: https://webdriver.io/docs/headless-and-xvfb/ - uses: coactions/setup-xvfb@6b00cf1889f4e1d5a48635647013c0508128ee1a - with: - run: npm run e2e + - name: Run tests + run: npm run e2e - name: Normalize E2E test report run: node ./scripts/node/normalize-e2e-test-report e2e-test-report.xml - name: Upload Mac E2E test results diff --git a/wdio.conf.js b/wdio.conf.js index f2a70bd1..a3a5cb97 100644 --- a/wdio.conf.js +++ b/wdio.conf.js @@ -19,6 +19,11 @@ const getAppBinaryPath = () => { } exports.config = { + // Use Xvfb when needed + // https://webdriver.io/docs/headless-and-xvfb/ + autoXvfb: true, + // Auto-install Xvfb packages + xvfbAutoInstall: true, // // ==================== // Runner Configuration From f2b2043b7b25247584ca313262b6a8ca1356fed5 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 14:32:19 +0300 Subject: [PATCH 08/26] Rework e2e test report generation --- .github/workflows/build-electron-app.yml | 10 ++++++++++ .github/workflows/e2e-test-report.yml | 8 +------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-electron-app.yml b/.github/workflows/build-electron-app.yml index 7b068a9a..8f0efea7 100644 --- a/.github/workflows/build-electron-app.yml +++ b/.github/workflows/build-electron-app.yml @@ -379,3 +379,13 @@ jobs: with: name: mac-e2e-test-results path: e2e-test-report.xml + web-page-report: + needs: + - linux-e2e-test-runner + - win-e2e-test-runner + - mac-e2e-test-runner + permissions: + contents: read + actions: read + checks: write + uses: ./.github/workflows/e2e-test-report.yml diff --git a/.github/workflows/e2e-test-report.yml b/.github/workflows/e2e-test-report.yml index 00fc962a..650cb730 100644 --- a/.github/workflows/e2e-test-report.yml +++ b/.github/workflows/e2e-test-report.yml @@ -2,10 +2,7 @@ name: 'E2E Test Report' run-name: 'E2E Test Report: Commit ${{ github.sha }}' on: - workflow_run: - workflows: ['Build release'] - types: - - completed + workflow_call permissions: contents: read @@ -21,7 +18,6 @@ jobs: - name: Download Linux E2E test results uses: actions/download-artifact@v8.0.0 with: - run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: linux-e2e-test-results path: linux-e2e-test-results @@ -38,7 +34,6 @@ jobs: - name: Download Win E2E test results uses: actions/download-artifact@v8.0.0 with: - run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: win-e2e-test-results path: win-e2e-test-results @@ -53,7 +48,6 @@ jobs: - name: Download Mac E2E test results uses: actions/download-artifact@v8.0.0 with: - run-id: ${{ github.event.workflow_run.id }} github-token: ${{ secrets.GITHUB_TOKEN }} name: mac-e2e-test-results path: mac-e2e-test-results From 7088af0019468d26274b50377486ea66ec10a9a5 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 13 Apr 2026 15:17:34 +0300 Subject: [PATCH 09/26] Fix e2e test report workflow condition --- .github/workflows/e2e-test-report.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/e2e-test-report.yml b/.github/workflows/e2e-test-report.yml index 650cb730..0a455004 100644 --- a/.github/workflows/e2e-test-report.yml +++ b/.github/workflows/e2e-test-report.yml @@ -13,7 +13,6 @@ jobs: e2e-web-page-report: name: E2E Web Page Report runs-on: ubuntu-22.04 - if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Download Linux E2E test results uses: actions/download-artifact@v8.0.0 From 5d25a64b5724dc1ad536e0e74b1532d658f7e397 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 14 Apr 2026 09:49:51 +0300 Subject: [PATCH 10/26] Add e2e test report titles for platform definition --- .github/workflows/e2e-test-report.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/e2e-test-report.yml b/.github/workflows/e2e-test-report.yml index 0a455004..ed3692f4 100644 --- a/.github/workflows/e2e-test-report.yml +++ b/.github/workflows/e2e-test-report.yml @@ -24,6 +24,7 @@ jobs: id: linux-e2e-test-results with: name: Linux E2E Tests + report-title: Linux E2E Tests path: linux-e2e-test-results/e2e-test-report.xml reporter: jest-junit collapsed: never @@ -40,6 +41,7 @@ jobs: id: win-e2e-test-results with: name: Win E2E Tests + report-title: Win E2E Tests path: win-e2e-test-results/e2e-test-report.xml reporter: jest-junit collapsed: never @@ -54,6 +56,7 @@ jobs: id: mac-e2e-test-results with: name: Mac E2E Tests + report-title: Mac E2E Tests path: mac-e2e-test-results/e2e-test-report.xml reporter: jest-junit collapsed: never From 0758aebd016f31899362a3ab0fb5c5f5cc338d44 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 14 Apr 2026 11:56:01 +0300 Subject: [PATCH 11/26] Increase e2e timeout --- wdio.conf.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wdio.conf.js b/wdio.conf.js index a3a5cb97..1a2e53e8 100644 --- a/wdio.conf.js +++ b/wdio.conf.js @@ -132,7 +132,7 @@ exports.config = { baseUrl: '', // // Default timeout for all waitFor* commands. - waitforTimeout: 20_000, + waitforTimeout: 60_000, // // Default timeout in milliseconds for request // if browser driver or grid doesn't send response @@ -182,7 +182,7 @@ exports.config = { // See the full list at http://mochajs.org/ mochaOpts: { ui: 'bdd', - timeout: 60000 + timeout: 3 * 60_000 } // From fc22e57188ecd6347ee4b361bcdc07c8a10a7182 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Tue, 14 Apr 2026 15:33:27 +0300 Subject: [PATCH 12/26] Implement total e2e time calc for test-reporter compatibility --- package-lock.json | 23 ++++++------ package.json | 1 + scripts/node/normalize-e2e-test-report.js | 46 ++++++++++++++++++++--- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index f358f787..24abc26b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,7 @@ "electron-chromedriver": "40.8.2", "eslint": "8.57.0", "eslint-config-standard": "17.1.0", + "fast-xml-parser": "5.5.12", "mocha": "11.1.0", "standard": "17.1.2" }, @@ -7789,9 +7790,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.9", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", - "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.12.tgz", + "integrity": "sha512-nUR0q8PPfoA/svPM43Gup7vLOZWppaNrYgGmrVqrAVJa7cOH4hMG6FX9M4mQ8dZA1/ObGZHzES7Ed88hxEBSJg==", "dev": true, "funding": [ { @@ -7802,8 +7803,8 @@ "license": "MIT", "dependencies": { "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.2.0", - "strnum": "^2.2.2" + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" @@ -12332,9 +12333,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", - "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "dev": true, "funding": [ { @@ -15087,9 +15088,9 @@ } }, "node_modules/strnum": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", - "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index e7d70ea7..e7447e0f 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "electron-chromedriver": "40.8.2", "eslint": "8.57.0", "eslint-config-standard": "17.1.0", + "fast-xml-parser": "5.5.12", "mocha": "11.1.0", "standard": "17.1.2" }, diff --git a/scripts/node/normalize-e2e-test-report.js b/scripts/node/normalize-e2e-test-report.js index 4de742b1..ae69945d 100644 --- a/scripts/node/normalize-e2e-test-report.js +++ b/scripts/node/normalize-e2e-test-report.js @@ -1,20 +1,54 @@ 'use strict' -const path = require('path') +const path = require('node:path') const { readFileSync, writeFileSync -} = require('fs') +} = require('node:fs') +const { + XMLParser, + XMLBuilder +} = require('fast-xml-parser') const cwd = process.cwd() const fileName = process.argv[2] const filePath = path.join(cwd, fileName) -const content = readFileSync(filePath, { encoding: 'utf8' }) +const reportXML = readFileSync(filePath, { encoding: 'utf8' }) + +const opts = { + ignoreAttributes: false, + allowBooleanAttributes: true, + attributeNamePrefix: 'attr_', + cdataPropName: '__cdata', + format: true, + unpairedTags: 'property', + suppressUnpairedNode: false +} +const parser = new XMLParser(opts) +const reportObj = parser.parse(reportXML) + /* * For compatibility with the dorny/test-reporter, * there needs to be 'time' attribute to '' tag */ -const normalizedContent = content - .replace(//gi, '') -writeFileSync(filePath, normalizedContent) +const testsuites = Array.isArray(reportObj.testsuites.testsuite) + ? reportObj.testsuites.testsuite + : [reportObj.testsuites.testsuite] +const totalTime = testsuites.reduce((accum, curr) => { + if (!curr?.attr_time) { + return accum + } + + const time = Number.parseFloat(curr.attr_time) + + return Number.isFinite(time) + ? accum + time + : accum +}, 0) +reportObj.testsuites.attr_time = totalTime + +const builder = new XMLBuilder(opts) +const outputXML = builder.build(reportObj) + +writeFileSync(filePath, outputXML) From 1b023034a9451737bc92d757a60aeba155580c4a Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 13:56:50 +0300 Subject: [PATCH 13/26] Add error testers --- .../log-exclusions/error-testers.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/error-manager/log-exclusions/error-testers.js diff --git a/src/error-manager/log-exclusions/error-testers.js b/src/error-manager/log-exclusions/error-testers.js new file mode 100644 index 00000000..bec8f25b --- /dev/null +++ b/src/error-manager/log-exclusions/error-testers.js @@ -0,0 +1,21 @@ +'use strict' + +const _getErrorString = (err) => { + const errStr = err instanceof Error + ? err.stack ?? err.toString() + : err + + if (typeof errStr !== 'string') { + return '' + } + + return errStr +} + +const isDocumentsPathGettingError = (err) => ( + /Failed to get 'documents' path/i.test(_getErrorString(err)) +) + +module.exports = { + isDocumentsPathGettingError +} From 565de4ebd2df357ecdfe9f487fea0ba52ec60490 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 13:57:44 +0300 Subject: [PATCH 14/26] Use documents path getting error tester --- src/error-manager/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/error-manager/index.js b/src/error-manager/index.js index 0aac7588..690d737a 100644 --- a/src/error-manager/index.js +++ b/src/error-manager/index.js @@ -8,6 +8,9 @@ const { isENetError } = require( '../../bfx-reports-framework/workers/loc.api/helpers/api-errors-testers' ) +const { + isDocumentsPathGettingError +} = require('./log-exclusions/error-testers') const cleanStack = require('./clean-stack') const log = require('./log') const getErrorDescription = require('./get-error-description') @@ -215,7 +218,7 @@ const initLogger = () => { if (message.level === 'error') { const error = message.data.join(os.EOL) - if (/Failed to get 'documents' path/gi.test(error)) { + if (isDocumentsPathGettingError(error)) { const title = i18next.t('errorManager.failedToGetDocsPath.title') const msg = i18next.t('errorManager.failedToGetDocsPath.message') From 9e37c8fddcba27a34f861f50b56b8cb5487506d8 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 14:23:36 +0300 Subject: [PATCH 15/26] Add error testers to skip logging --- .../log-exclusions/error-testers.js | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/error-manager/log-exclusions/error-testers.js b/src/error-manager/log-exclusions/error-testers.js index bec8f25b..09829df1 100644 --- a/src/error-manager/log-exclusions/error-testers.js +++ b/src/error-manager/log-exclusions/error-testers.js @@ -12,10 +12,44 @@ const _getErrorString = (err) => { return errStr } +const _testRegExp = (regExp, err) => ( + regExp.test(_getErrorString(err)) +) + const isDocumentsPathGettingError = (err) => ( - /Failed to get 'documents' path/i.test(_getErrorString(err)) + _testRegExp(err, /Failed to get 'documents' path/i) +) + +const isContextIsolationError = (err) => ( + _testRegExp(err, /contextIsolation is deprecated/i) +) + +const isInetDisconnectionError = (err) => ( + _testRegExp(err, /ERR_INTERNET_DISCONNECTED/i) +) + +const isCodeSignatureError = (err) => ( + _testRegExp(err, /Could not get code signature/i) +) + +const isBfxApiServerAvailabilityError = (err) => ( + _testRegExp(err, /ERR_BFX_API_SERVER_IS_NOT_AVAILABLE/i) +) + +const isDatabaseLockError = (err) => ( + _testRegExp(err, /database is locked/i) +) + +const isNetworkTimeoutError = (err) => ( + _testRegExp(err, /network timeout/i) ) module.exports = { - isDocumentsPathGettingError + isDocumentsPathGettingError, + isContextIsolationError, + isInetDisconnectionError, + isCodeSignatureError, + isBfxApiServerAvailabilityError, + isDatabaseLockError, + isNetworkTimeoutError } From efb649f95c5cd49e346a5ac4afe9c8cbce657add Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 14:59:53 +0300 Subject: [PATCH 16/26] Add tester: should log be skipped --- src/error-manager/log-exclusions/index.js | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/error-manager/log-exclusions/index.js diff --git a/src/error-manager/log-exclusions/index.js b/src/error-manager/log-exclusions/index.js new file mode 100644 index 00000000..b0b8695b --- /dev/null +++ b/src/error-manager/log-exclusions/index.js @@ -0,0 +1,25 @@ +'use strict' + +const errorTesters = require('./error-testers') +const { + isContextIsolationError, + isInetDisconnectionError, + isCodeSignatureError, + isBfxApiServerAvailabilityError, + isDatabaseLockError, + isNetworkTimeoutError +} = errorTesters + +const shouldLogBeSkipped = (err) => ( + isContextIsolationError(err) || + isInetDisconnectionError(err) || + isCodeSignatureError(err) || + isBfxApiServerAvailabilityError(err) || + isDatabaseLockError(err) || + isNetworkTimeoutError(err) +) + +module.exports = { + errorTesters, + shouldLogBeSkipped +} From 4e74a083fed776ff18758c9b7093cb8ce7ec8b9b Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 15:00:23 +0300 Subject: [PATCH 17/26] Use tester: should log be skipped --- src/error-manager/index.js | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/src/error-manager/index.js b/src/error-manager/index.js index 690d737a..c08e237c 100644 --- a/src/error-manager/index.js +++ b/src/error-manager/index.js @@ -9,8 +9,9 @@ const { isENetError } = require( ) const { - isDocumentsPathGettingError -} = require('./log-exclusions/error-testers') + shouldLogBeSkipped, + errorTesters: { isDocumentsPathGettingError } +} = require('./log-exclusions') const cleanStack = require('./clean-stack') const log = require('./log') const getErrorDescription = require('./get-error-description') @@ -72,36 +73,6 @@ const _manageErrorLogLevel = async (error) => { } } -const _getErrorStr = (val) => { - if (!(val instanceof Error)) { - return val - } - - const str = typeof val.stack === 'string' - ? val.stack - : val.toString() - - return str -} - -const _isLogSkipped = (log) => { - const str = _getErrorStr(log) - - return ( - str && - typeof str === 'string' && - ( - str.includes('contextIsolation is deprecated') || - str.includes('ERR_INTERNET_DISCONNECTED') || - // Skip error when can't get code signature on mac - str.includes('Could not get code signature') || - str.includes('ERR_BFX_API_SERVER_IS_NOT_AVAILABLE') || - str.includes('database is locked') || - str.includes('network timeout') - ) - ) -} - const _lockIssueManager = () => { _isLocked = true @@ -196,7 +167,7 @@ const initLogger = () => { ) { return message } - if (message.data.some((val) => _isLogSkipped(val))) { + if (message.data.some((val) => shouldLogBeSkipped(val))) { return false } From 10b9bbfcd153aa8090c0b1e397f58a8de6deaf99 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 15:42:00 +0300 Subject: [PATCH 18/26] Add error testers to suppress err modal win --- .../log-exclusions/error-testers.js | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/error-manager/log-exclusions/error-testers.js b/src/error-manager/log-exclusions/error-testers.js index 09829df1..9dbb6b46 100644 --- a/src/error-manager/log-exclusions/error-testers.js +++ b/src/error-manager/log-exclusions/error-testers.js @@ -44,6 +44,32 @@ const isNetworkTimeoutError = (err) => ( _testRegExp(err, /network timeout/i) ) +const isDiffUpdateDownloadError = (err) => ( + _testRegExp(err, /Cannot download differentially/i) +) + +const isGHUpdateDownloadError = (err) => ( + _testRegExp(err, /objects\.githubusercontent\.com/i) +) + +const isHtmlLoadingForPdfError = (err) => ( + _testRegExp(err, /Error: ERR_FAILED \(-2\) loading 'file:.*\.html'/i) +) + +const isPdfGenerationError = (err) => ( + _testRegExp(err, /Failed to generate PDF/i) +) + +// https://github.com/electron/electron/issues/47390 +const isDeprecationWarningFsStatsError = (err) => ( + _testRegExp(err, /DeprecationWarning: fs\.Stats/i) +) + +// https://github.com/electron/electron/issues/47390 +const isDeprecationWarningUrlParseError = (err) => ( + _testRegExp(err, /DeprecationWarning: `url\.parse\(\)`/i) +) + module.exports = { isDocumentsPathGettingError, isContextIsolationError, @@ -51,5 +77,11 @@ module.exports = { isCodeSignatureError, isBfxApiServerAvailabilityError, isDatabaseLockError, - isNetworkTimeoutError + isNetworkTimeoutError, + isDiffUpdateDownloadError, + isGHUpdateDownloadError, + isHtmlLoadingForPdfError, + isPdfGenerationError, + isDeprecationWarningFsStatsError, + isDeprecationWarningUrlParseError } From 0d0af4af8cd0185d951c59e82063229f099a62da Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 15:42:21 +0300 Subject: [PATCH 19/26] Add tester: should error modal win be suppressed --- src/error-manager/log-exclusions/index.js | 27 +++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/error-manager/log-exclusions/index.js b/src/error-manager/log-exclusions/index.js index b0b8695b..8bf88f8e 100644 --- a/src/error-manager/log-exclusions/index.js +++ b/src/error-manager/log-exclusions/index.js @@ -7,9 +7,20 @@ const { isCodeSignatureError, isBfxApiServerAvailabilityError, isDatabaseLockError, - isNetworkTimeoutError + isNetworkTimeoutError, + isDiffUpdateDownloadError, + isGHUpdateDownloadError, + isHtmlLoadingForPdfError, + isPdfGenerationError, + isDeprecationWarningFsStatsError, + isDeprecationWarningUrlParseError } = errorTesters +const { isENetError } = require( + '../../../bfx-reports-framework/workers/loc.api/helpers/api-errors-testers' +) + +// If log is skipped, a new GH issue will be suppressed const shouldLogBeSkipped = (err) => ( isContextIsolationError(err) || isInetDisconnectionError(err) || @@ -19,7 +30,19 @@ const shouldLogBeSkipped = (err) => ( isNetworkTimeoutError(err) ) +// Don't open a new GH issue, but log anyway +const shouldErrorModalWinBeSuppressed = (err) => ( + isENetError(err) || + isDiffUpdateDownloadError(err) || + isGHUpdateDownloadError(err) || + isHtmlLoadingForPdfError(err) || + isPdfGenerationError(err) || + isDeprecationWarningFsStatsError(err) || + isDeprecationWarningUrlParseError(err) +) + module.exports = { errorTesters, - shouldLogBeSkipped + shouldLogBeSkipped, + shouldErrorModalWinBeSuppressed } From fed8591dff7a713c3d246f502e179de7e4349fe6 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Thu, 16 Apr 2026 15:42:43 +0300 Subject: [PATCH 20/26] Use tester: should error modal win be suppressed --- src/error-manager/index.js | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/src/error-manager/index.js b/src/error-manager/index.js index c08e237c..d11090db 100644 --- a/src/error-manager/index.js +++ b/src/error-manager/index.js @@ -4,13 +4,10 @@ const { app } = require('electron') const os = require('os') const i18next = require('i18next') -const { isENetError } = require( - '../../bfx-reports-framework/workers/loc.api/helpers/api-errors-testers' -) - const { + errorTesters: { isDocumentsPathGettingError }, shouldLogBeSkipped, - errorTesters: { isDocumentsPathGettingError } + shouldErrorModalWinBeSuppressed } = require('./log-exclusions') const cleanStack = require('./clean-stack') const log = require('./log') @@ -209,22 +206,7 @@ const initLogger = () => { return } - - /* - * Don't open a new issue when: - * - It can't download differentially it would fallback to full download - * - GitHub server can't respond to the auto-update requests - */ - if ( - isENetError(error) || - /Cannot download differentially/gi.test(error) || - /objects\.githubusercontent\.com/gi.test(error) || - /Error: ERR_FAILED \(-2\) loading 'file:.*\.html'/gi.test(error) || - /Failed to generate PDF/gi.test(error) || - // https://github.com/electron/electron/issues/47390 - /DeprecationWarning: fs\.Stats/gi.test(error) || - /DeprecationWarning: `url\.parse\(\)`/gi.test(error) - ) { + if (shouldErrorModalWinBeSuppressed(error)) { return message } From 21ca0a33ed614f1667d7bd6cd695842923d996ca Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Fri, 17 Apr 2026 13:27:30 +0300 Subject: [PATCH 21/26] Fix reg exp tester --- src/error-manager/log-exclusions/error-testers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/error-manager/log-exclusions/error-testers.js b/src/error-manager/log-exclusions/error-testers.js index 9dbb6b46..4952bf5e 100644 --- a/src/error-manager/log-exclusions/error-testers.js +++ b/src/error-manager/log-exclusions/error-testers.js @@ -12,7 +12,7 @@ const _getErrorString = (err) => { return errStr } -const _testRegExp = (regExp, err) => ( +const _testRegExp = (err, regExp) => ( regExp.test(_getErrorString(err)) ) From ebb6418230548780cb3188fceb91686a64a75c75 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Mon, 20 Apr 2026 10:39:23 +0300 Subject: [PATCH 22/26] Improve error str getter readability --- src/error-manager/log-exclusions/error-testers.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/error-manager/log-exclusions/error-testers.js b/src/error-manager/log-exclusions/error-testers.js index 4952bf5e..4646c835 100644 --- a/src/error-manager/log-exclusions/error-testers.js +++ b/src/error-manager/log-exclusions/error-testers.js @@ -1,15 +1,14 @@ 'use strict' const _getErrorString = (err) => { - const errStr = err instanceof Error - ? err.stack ?? err.toString() - : err - - if (typeof errStr !== 'string') { - return '' + if (typeof err === 'string') { + return err + } + if (err instanceof Error) { + return err.stack ?? err.toString() } - return errStr + return '' } const _testRegExp = (err, regExp) => ( From 5082fe5bc71bce21544ce0bbf4f1e464195538be Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 09:45:31 +0300 Subject: [PATCH 23/26] Fix GH Actions workflow permissions --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 61ad7854..d2ad7351 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,4 +32,8 @@ jobs: path: test-report.json web-page-report: needs: linux-test-runner + permissions: + contents: read + actions: read + checks: write uses: ./.github/workflows/test-report.yml From bbbb1777c5958f1f649225074a48d65241e876a0 Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 12:06:23 +0300 Subject: [PATCH 24/26] Bump version up to v4.44.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 24abc26b..7d6e76f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "bfx-report-electron", - "version": "4.43.1", + "version": "4.44.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bfx-report-electron", - "version": "4.43.1", + "version": "4.44.0", "license": "Apache-2.0", "dependencies": { "@bitfinex/bfx-svc-test-helper": "git+https://github.com/bitfinexcom/bfx-svc-test-helper.git", diff --git a/package.json b/package.json index e7447e0f..0b31079b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bfx-report-electron", - "version": "4.43.1", + "version": "4.44.0", "repository": "https://github.com/bitfinexcom/bfx-report-electron", "description": "Reporting tool", "author": "bitfinex.com", From d02aaacf18853995b6bdad037f34a3b8aa5f61cd Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 12:07:21 +0300 Subject: [PATCH 25/26] Add changelog for v4.44.0 --- CHANGELOG.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b680e9b..47bc027b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.44.0] - 2026-04-29 + +### Added + +- Implemented the possibility to download the `DEB` app releases instead of `AppImage` for better UX. PR: [bfx-report-ui#1062](https://github.com/bitfinexcom/bfx-report-ui/pull/1062) +- Added independent integration tests with GH Actions to ensure changes to the express layer will work with the `bfx-report` worker. PR: [bfx-report-express#60](https://github.com/bitfinexcom/bfx-report-express/pull/60) + +### Changed + +- Refactored the `Average Win/Loss` report as a functional and implemented a unified `useFetchLifecycle` hook that will replace legacy (tightly coupled to class components) helpers and will be widely reused in further step-by-step reports refactoring. PR: [bfx-report-ui#1067](https://github.com/bitfinexcom/bfx-report-ui/pull/1067) +- Removed unused report PGP signature since the ability to create a signature for reports was implemented 7 years ago and has still not been merged into the repository [bfx-ext-gpg-js#1](https://github.com/bitfinexcom/bfx-ext-gpg-js/pull/1). PRs: [bfx-report#472](https://github.com/bitfinexcom/bfx-report/pull/472), [bfx-reports-framework#507](https://github.com/bitfinexcom/bfx-reports-framework/pull/507) +- Updated GH Actions to resolve: `nodejs v20 actions are deprecated`. PRs: [bfx-report#470](https://github.com/bitfinexcom/bfx-report/pull/470), [bfx-reports-framework#505](https://github.com/bitfinexcom/bfx-reports-framework/pull/505), [bfx-report-electron#618](https://github.com/bitfinexcom/bfx-report-electron/pull/618), [bfx-facs-db-better-sqlite#16](https://github.com/bitfinexcom/bfx-facs-db-better-sqlite/pull/16) +- Reworked error logging exceptions to simplify support and bring clarity of understanding. PR: [bfx-report-electron#619](https://github.com/bitfinexcom/bfx-report-electron/pull/619) + +### Fixed + +- Fixed GH Actions workflow permissions. The workflow is requesting 'actions: read, checks: write', but is only allowed 'actions: none, checks: none'. PRs: [bfx-report#473](https://github.com/bitfinexcom/bfx-report/pull/473), [bfx-reports-framework#509](https://github.com/bitfinexcom/bfx-reports-framework/pull/509), [bfx-report-express#63](https://github.com/bitfinexcom/bfx-report-express/pull/63), [bfx-report-electron#620](https://github.com/bitfinexcom/bfx-report-electron/pull/620), [bfx-facs-db-better-sqlite#17](https://github.com/bitfinexcom/bfx-facs-db-better-sqlite/pull/17) +- Bumped `redux-saga` from `0.16.2` to `1.4.2`, actualized effects/utils usage and fixed a couple of legacy bugs. PR: [bfx-report-ui#1066](https://github.com/bitfinexcom/bfx-report-ui/pull/1066) +- Fixed selected type representation in the `Average Win/Loss` report. PR: [bfx-report-ui#1064](https://github.com/bitfinexcom/bfx-report-ui/pull/1064) +- Fixed `node-fetch` timeout handling. PR: [bfx-report#471](https://github.com/bitfinexcom/bfx-report/pull/471) +- Fixed the issue with pushing untagged drafts of the electron app release, passes the tag explicitly so that it is not replaced with a hash. PR: [bfx-report-electron#617](https://github.com/bitfinexcom/bfx-report-electron/pull/617) + +### Security + +- Updated UI dependencies to fix high vulnerabilities. PR: [bfx-report-ui#1068](https://github.com/bitfinexcom/bfx-report-ui/pull/1068) + ## [4.43.1] - 2026-04-09 ### Fixed From 31c765dd625e80a15265f46fe93a8771eddcd5df Mon Sep 17 00:00:00 2001 From: Vladimir Voronkov Date: Wed, 29 Apr 2026 14:22:54 +0300 Subject: [PATCH 26/26] Update sub-modules --- bfx-report-ui | 2 +- bfx-reports-framework | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bfx-report-ui b/bfx-report-ui index ac767ddc..a68255e3 160000 --- a/bfx-report-ui +++ b/bfx-report-ui @@ -1 +1 @@ -Subproject commit ac767ddc1c7326306bd60b73ac4a5cafaea4b8bd +Subproject commit a68255e3243738fedde64de5a75a00557639d8c1 diff --git a/bfx-reports-framework b/bfx-reports-framework index d7d4b7f3..63060fc3 160000 --- a/bfx-reports-framework +++ b/bfx-reports-framework @@ -1 +1 @@ -Subproject commit d7d4b7f3a25090ba69180cd0a974407815084412 +Subproject commit 63060fc36f8eb726eb66859e5a4bb85a54c4d3b0