From d84abf4613a63e5d300053030ab9cc4ffbd35f07 Mon Sep 17 00:00:00 2001 From: Teimur Gasanov Date: Thu, 2 Oct 2025 15:56:31 +0600 Subject: [PATCH 1/3] perf: use blazediff for faster screenshots comparison --- indicator-examples/package-lock.json | 5 ++- package-lock.json | 42 ++++++++----------- package.json | 3 +- plugin-examples/package-lock.json | 5 ++- tests/e2e/graphics/README.md | 4 +- .../graphics/helpers/compare-screenshots.ts | 4 +- 6 files changed, 28 insertions(+), 35 deletions(-) diff --git a/indicator-examples/package-lock.json b/indicator-examples/package-lock.json index 25d110f667d..187e58e8ba8 100644 --- a/indicator-examples/package-lock.json +++ b/indicator-examples/package-lock.json @@ -24,6 +24,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { + "@blazediff/core": "~1.1.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", @@ -34,7 +35,6 @@ "@types/express": "5.0.1", "@types/glob": "8.1.0", "@types/node": "22", - "@types/pixelmatch": "5.2.6", "@types/pngjs": "6.0.5", "@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/eslint-plugin-tslint": "7.0.2", @@ -64,7 +64,6 @@ "markdownlint-cli": "0.44.0", "memlab": "1.1.57", "npm-run-all": "4.1.5", - "pixelmatch": "7.1.0", "pngjs": "7.0.0", "puppeteer": "24.6.1", "rimraf": "6.0.1", @@ -1442,6 +1441,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -1585,6 +1585,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, diff --git a/package-lock.json b/package-lock.json index 49ecbb7cec1..6b47644f78c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { + "@blazediff/core": "~1.1.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", @@ -23,7 +24,6 @@ "@types/express": "5.0.1", "@types/glob": "8.1.0", "@types/node": "22", - "@types/pixelmatch": "5.2.6", "@types/pngjs": "6.0.5", "@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/eslint-plugin-tslint": "7.0.2", @@ -53,7 +53,6 @@ "markdownlint-cli": "0.44.0", "memlab": "1.1.57", "npm-run-all": "4.1.5", - "pixelmatch": "7.1.0", "pngjs": "7.0.0", "puppeteer": "24.6.1", "rimraf": "6.0.1", @@ -201,6 +200,22 @@ "node": ">=6.9.0" } }, + "node_modules/@blazediff/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.1.0.tgz", + "integrity": "sha512-f1qdZ2Z0f9bqityiH07mFz29uVGBL9QySKFpBz6dyTjt5ucCdW0pb4umTepZI5rKJVzaw0ZAsE7VoGC56usO/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/types": "1.1.0" + } + }, + "node_modules/@blazediff/types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@blazediff/types/-/types-1.1.0.tgz", + "integrity": "sha512-yNTG53982iTy6sFzEdxnt0pLcFyMuLVY+FKaeMQiyeCaOjELGmELmamDxltIHfDnr8/laxijPgdnmTRy58sOiQ==", + "dev": true + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2573,16 +2588,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/pixelmatch": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.6.tgz", - "integrity": "sha512-wC83uexE5KGuUODn6zkm9gMzTwdY5L0chiK+VrKcDfEjzxh1uadlWTvOmAbCpnM9zx/Ww3f8uKlYQVnO/TrqVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/pngjs": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", @@ -11003,19 +11008,6 @@ "node": ">=4" } }, - "node_modules/pixelmatch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", - "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", - "dev": true, - "license": "ISC", - "dependencies": { - "pngjs": "^7.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", diff --git a/package.json b/package.json index 041063aee90..54f0ff142ad 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { + "@blazediff/core": "~1.1.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", @@ -65,7 +66,6 @@ "@types/express": "5.0.1", "@types/glob": "8.1.0", "@types/node": "22", - "@types/pixelmatch": "5.2.6", "@types/pngjs": "6.0.5", "@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/eslint-plugin-tslint": "7.0.2", @@ -95,7 +95,6 @@ "markdownlint-cli": "0.44.0", "memlab": "1.1.57", "npm-run-all": "4.1.5", - "pixelmatch": "7.1.0", "pngjs": "7.0.0", "puppeteer": "24.6.1", "rimraf": "6.0.1", diff --git a/plugin-examples/package-lock.json b/plugin-examples/package-lock.json index 3ef6ed05f93..64fe19667ec 100644 --- a/plugin-examples/package-lock.json +++ b/plugin-examples/package-lock.json @@ -24,6 +24,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { + "@blazediff/core": "~1.1.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", @@ -34,7 +35,6 @@ "@types/express": "5.0.1", "@types/glob": "8.1.0", "@types/node": "22", - "@types/pixelmatch": "5.2.6", "@types/pngjs": "6.0.5", "@typescript-eslint/eslint-plugin": "7.18.0", "@typescript-eslint/eslint-plugin-tslint": "7.0.2", @@ -64,7 +64,6 @@ "markdownlint-cli": "0.44.0", "memlab": "1.1.57", "npm-run-all": "4.1.5", - "pixelmatch": "7.1.0", "pngjs": "7.0.0", "puppeteer": "24.6.1", "rimraf": "6.0.1", @@ -1442,6 +1441,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -1585,6 +1585,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, diff --git a/tests/e2e/graphics/README.md b/tests/e2e/graphics/README.md index a03beafe6b4..4ba27c07d7d 100644 --- a/tests/e2e/graphics/README.md +++ b/tests/e2e/graphics/README.md @@ -1,13 +1,13 @@ # Graphics tests -This tests uses [puppeteer](https://github.com/GoogleChrome/puppeteer) to generate screenshots and then [pixelmatch](https://github.com/mapbox/pixelmatch) to compare them. +This tests uses [puppeteer](https://github.com/GoogleChrome/puppeteer) to generate screenshots and then [blazediff](https://blazediff.dev) to compare them. ## How it works 1. If there are local files to serve - run web server. 1. Run `node:test` with loaded test cases. 1. Then, for each test case, open webpage by `puppeteer` for golden and test version, take 2 screenshots. -1. Compare given screenshots by `pixelmatch`, write them in out folder (with HTML pages). +1. Compare given screenshots by `blazediff`, write them in out folder (with HTML pages). ## Writing new test case diff --git a/tests/e2e/graphics/helpers/compare-screenshots.ts b/tests/e2e/graphics/helpers/compare-screenshots.ts index c23d3f5f3e4..5dd29fa7870 100644 --- a/tests/e2e/graphics/helpers/compare-screenshots.ts +++ b/tests/e2e/graphics/helpers/compare-screenshots.ts @@ -1,4 +1,4 @@ -import pixelmatch from 'pixelmatch'; +import blazediff from '@blazediff/core'; import { PNG } from 'pngjs'; export interface CompareResult { @@ -20,7 +20,7 @@ export function compareScreenshots(leftImg: PNG, rightImg: PNG): CompareResult { height: rightImg.height, }); - const diffPixelsCount = pixelmatch( + const diffPixelsCount = blazediff( leftImg.data, rightImg.data, diffImg.data, leftImg.width, leftImg.height, From 9509b0904609d19402df034c85e5d5ef350f0cce Mon Sep 17 00:00:00 2001 From: Teimur Gasanov Date: Thu, 9 Oct 2025 13:41:10 +0600 Subject: [PATCH 2/3] fix: typing issue --- indicator-examples/package-lock.json | 2 +- package-lock.json | 16 ++++++++-------- package.json | 2 +- plugin-examples/package-lock.json | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/indicator-examples/package-lock.json b/indicator-examples/package-lock.json index 187e58e8ba8..801bb147fa1 100644 --- a/indicator-examples/package-lock.json +++ b/indicator-examples/package-lock.json @@ -24,7 +24,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "~1.1.0", + "@blazediff/core": "1.4.1", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", diff --git a/package-lock.json b/package-lock.json index 6b47644f78c..94dd6d9bf6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "~1.1.0", + "@blazediff/core": "~1.4.1", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", @@ -201,19 +201,19 @@ } }, "node_modules/@blazediff/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.1.0.tgz", - "integrity": "sha512-f1qdZ2Z0f9bqityiH07mFz29uVGBL9QySKFpBz6dyTjt5ucCdW0pb4umTepZI5rKJVzaw0ZAsE7VoGC56usO/g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.4.1.tgz", + "integrity": "sha512-mNhxncafu6xHV1+6v4K7AvwOodnIFcmqERNbdcDCL7jb9mMXDy4DKcidbnQG5ExKsgBYUhOhJs2qrpdOS52qUA==", "dev": true, "license": "MIT", "dependencies": { - "@blazediff/types": "1.1.0" + "@blazediff/types": "1.4.1" } }, "node_modules/@blazediff/types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@blazediff/types/-/types-1.1.0.tgz", - "integrity": "sha512-yNTG53982iTy6sFzEdxnt0pLcFyMuLVY+FKaeMQiyeCaOjELGmELmamDxltIHfDnr8/laxijPgdnmTRy58sOiQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@blazediff/types/-/types-1.4.1.tgz", + "integrity": "sha512-c5se1YZMvdJiF/M/kPOFkw/E1BbfV6U4KsE6QcJiM9dVL1ix4ze/EmLIYvHwOX54kzxi2iWL0BZgMOlfWQRJ2A==", "dev": true }, "node_modules/@cspotcode/source-map-support": { diff --git a/package.json b/package.json index 54f0ff142ad..de0fd45e1f6 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "~1.1.0", + "@blazediff/core": "~1.4.1", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", diff --git a/plugin-examples/package-lock.json b/plugin-examples/package-lock.json index 64fe19667ec..df12911af8d 100644 --- a/plugin-examples/package-lock.json +++ b/plugin-examples/package-lock.json @@ -24,7 +24,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "~1.1.0", + "@blazediff/core": "1.4.1", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", From bcab858897b454298540f0d1f99f2c61bb99d30c Mon Sep 17 00:00:00 2001 From: Teimur Gasanov Date: Tue, 13 Jan 2026 12:52:58 +0600 Subject: [PATCH 3/3] chore: use latest blazediff --- indicator-examples/package-lock.json | 2 +- package-lock.json | 19 +++++-------------- package.json | 2 +- plugin-examples/package-lock.json | 2 +- 4 files changed, 8 insertions(+), 17 deletions(-) diff --git a/indicator-examples/package-lock.json b/indicator-examples/package-lock.json index 801bb147fa1..7d5d017639d 100644 --- a/indicator-examples/package-lock.json +++ b/indicator-examples/package-lock.json @@ -24,7 +24,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "1.4.1", + "@blazediff/core": "~1.9.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", diff --git a/package-lock.json b/package-lock.json index 94dd6d9bf6a..c1752b4100e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "~1.4.1", + "@blazediff/core": "~1.9.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", @@ -201,20 +201,11 @@ } }, "node_modules/@blazediff/core": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.4.1.tgz", - "integrity": "sha512-mNhxncafu6xHV1+6v4K7AvwOodnIFcmqERNbdcDCL7jb9mMXDy4DKcidbnQG5ExKsgBYUhOhJs2qrpdOS52qUA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.0.tgz", + "integrity": "sha512-4W6TNzvD5KyUWiAHT+MyAg79FWe8rv493nfvWKeWox67lbUHTiTy40n7rmg6cQjhu5hflCDw73FExgmv22IgNQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@blazediff/types": "1.4.1" - } - }, - "node_modules/@blazediff/types": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@blazediff/types/-/types-1.4.1.tgz", - "integrity": "sha512-c5se1YZMvdJiF/M/kPOFkw/E1BbfV6U4KsE6QcJiM9dVL1ix4ze/EmLIYvHwOX54kzxi2iWL0BZgMOlfWQRJ2A==", - "dev": true + "license": "MIT" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", diff --git a/package.json b/package.json index de0fd45e1f6..7b56f187aba 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "~1.4.1", + "@blazediff/core": "~1.9.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2", diff --git a/plugin-examples/package-lock.json b/plugin-examples/package-lock.json index df12911af8d..c594c1e4cc5 100644 --- a/plugin-examples/package-lock.json +++ b/plugin-examples/package-lock.json @@ -24,7 +24,7 @@ "fancy-canvas": "2.1.0" }, "devDependencies": { - "@blazediff/core": "1.4.1", + "@blazediff/core": "~1.9.0", "@juggle/resize-observer": "3.4.0", "@rollup/plugin-node-resolve": "16.0.1", "@rollup/plugin-replace": "6.0.2",