From f4cfeb954dee46db157f148e62daf1403527c8f5 Mon Sep 17 00:00:00 2001 From: poongaloo Date: Mon, 8 Jun 2026 18:16:16 +0200 Subject: [PATCH] add tests and graphic corrections --- .gitignore | 3 + demos/minimal/index.html | 182 +- package-lock.json | 1962 +++++++++++++++++ package.json | 18 + playwright.config.mjs | 21 + tests/unit/turn.unit.test.js | 143 ++ tests/visual/minimal.spec.js | 148 ++ .../minimal-book-compact-page-1-linux.png | Bin 0 -> 18427 bytes .../minimal-book-page-1-linux.png | Bin 0 -> 21038 bytes .../minimal-book-page-2-linux.png | Bin 0 -> 36571 bytes .../minimal-book-turning-page-4-linux.png | Bin 0 -> 17307 bytes vitest.config.mjs | 7 + 12 files changed, 2424 insertions(+), 60 deletions(-) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 playwright.config.mjs create mode 100644 tests/unit/turn.unit.test.js create mode 100644 tests/visual/minimal.spec.js create mode 100644 tests/visual/minimal.spec.js-snapshots/minimal-book-compact-page-1-linux.png create mode 100644 tests/visual/minimal.spec.js-snapshots/minimal-book-page-1-linux.png create mode 100644 tests/visual/minimal.spec.js-snapshots/minimal-book-page-2-linux.png create mode 100644 tests/visual/minimal.spec.js-snapshots/minimal-book-turning-page-4-linux.png create mode 100644 vitest.config.mjs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dbd64df --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +test-results/ +playwright-report/ diff --git a/demos/minimal/index.html b/demos/minimal/index.html index e811ae7..73c0929 100644 --- a/demos/minimal/index.html +++ b/demos/minimal/index.html @@ -24,43 +24,61 @@ box-sizing: border-box; } + .book-frame { + width: min(720px, calc(100vw - 56px)); + aspect-ratio: 72 / 46; + } + #book { - width: 720px; - height: 460px; + width: 100%; + height: 100%; background: #cbd3df; } #book .page { - display: flex; - flex-direction: column; - gap: 16px; - width: 360px; - height: 460px; - box-sizing: border-box; - padding: 28px; - border: 1px solid #aeb8c8; background: #fff8df; - font-size: 18px; - line-height: 1.2; + overflow: hidden; } - #book .page:nth-child(even) { + #book .page.alt { background: #e7f1ff; } - #book .page h1, - #book .page h2 { + #book .page-content { + display: flex; + flex-direction: column; + gap: 16px; + box-sizing: border-box; + width: 100%; + height: 100%; + padding: 28px; + border: 1px solid #aeb8c8; + font-size: 18px; + line-height: 1.2; + overflow: hidden; + } + + #book .page.alt .page-content { + background: #e7f1ff; + } + + #book .page:not(.alt) .page-content { + background: #fff8df; + } + + #book .page-content h1, + #book .page-content h2 { margin: 0; font-size: 30px; line-height: 1.05; } - #book .page p { + #book .page-content p { margin: 0; line-height: 1.45; } - #book .page img { + #book .page-content img { display: block; width: 100%; height: 180px; @@ -104,53 +122,76 @@ text-align: center; } - @media (max-width: 820px) { - #book { - width: 92vw; - height: 58vw; - max-height: 460px; + @media (max-width: 620px) { + #book .page-content { + gap: 12px; + padding: 20px; + font-size: 15px; + } + + #book .page-content h1, + #book .page-content h2 { + font-size: 24px; + } + + #book .page-content img { + height: 130px; } }
-
-
- Demo minimale -

Explorer turn.js

- Livre ouvert avec pages colorees -

Un exemple autonome pour verifier rapidement le chargement de jQuery 4, l'initialisation du plugin et le changement de page.

-
-
- Page 2 -

Un livre HTML

-

Chaque page est un simple element HTML. Le plugin ajoute les wrappers, gere les vues et anime le passage d'une page a l'autre.

- Composition de pages dans un navigateur -
-
- Page 3 -

Images et texte

- Image abstraite avec cadres de contenu -

La demo contient du texte et des images locales afin de tester un rendu un peu plus proche d'un cas reel.

-
-
- Page 4 -

Navigation

-

Utilise les boutons, les fleches du clavier ou le coin de page pour changer de vue.

- Fleches de navigation autour d'un livre -
-
- Page 5 -

Compatibilite

- Fenetre de navigateur avec indicateurs de compatibilite -

Cette page charge jQuery 4.0.0 depuis le CDN officiel et la version locale de turn.js depuis le depot clone.

-
-
- Page 6 -

Fin du test

-

Si cette derniere page s'affiche et que le retour fonctionne, le scenario minimal est operationnel.

- Marque de validation sur une page +
+
+
+
+ Demo minimale +

Explorer turn.js

+ Livre ouvert avec pages colorees +

Un exemple autonome pour verifier rapidement le chargement de jQuery 4, l'initialisation du plugin et le changement de page.

+
+
+
+
+ Page 2 +

Un livre HTML

+

Chaque page est un simple element HTML. Le plugin ajoute les wrappers, gere les vues et anime le passage d'une page a l'autre.

+ Composition de pages dans un navigateur +
+
+
+
+ Page 3 +

Images et texte

+ Image abstraite avec cadres de contenu +

La demo contient du texte et des images locales afin de tester un rendu un peu plus proche d'un cas reel.

+
+
+
+
+ Page 4 +

Navigation

+

Utilise les boutons, les fleches du clavier ou le coin de page pour changer de vue.

+ Fleches de navigation autour d'un livre +
+
+
+
+ Page 5 +

Compatibilite

+ Fenetre de navigateur avec indicateurs de compatibilite +

Cette page charge jQuery 4.0.0 depuis le CDN officiel et la version locale de turn.js depuis le depot clone.

+
+
+
+
+ Page 6 +

Fin du test

+

Si cette derniere page s'affiche et que le retour fonctionne, le scenario minimal est operationnel.

+ Marque de validation sur une page +
+
@@ -166,15 +207,34 @@ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..663d6d9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1962 @@ +{ + "name": "turn.js", + "version": "3.0.0-local", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "turn.js", + "version": "3.0.0-local", + "devDependencies": { + "@playwright/test": "1.60.0", + "jquery": "4.0.0", + "jsdom": "27.2.0", + "vitest": "^4.1.8" + } + }, + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@asamuzakjp/css-color": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", + "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.0.0", + "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.5" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", + "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.1.tgz", + "integrity": "sha512-eZ5XOtyhK+mggRafYUWzA0tvaYOFgdY8AkgQiCJF9qNAePnUo/zmsqqYubBBb3sQ8uNUaSKTY9s9klfRaAXL0g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.2.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.5.tgz", + "integrity": "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", + "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.8", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", + "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "@vitest/utils": "4.1.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssstyle": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-5.3.7.tgz", + "integrity": "sha512-7D2EPVltRrsTkhpQmksIu+LxeWAIEk6wRDMJ1qljlv+CKHJM+cJLlfhWIzNA44eAsHXSNe3+vO6DW1yCYx8SuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^4.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.21", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-6.0.1.tgz", + "integrity": "sha512-euIQENZg6x8mj3fO6o9+fOW8MimUI4PpD/fZBhJfeioZVy9TUpM4UY7KjQNVZFlqwJ0UdzRDzkycB997HEq1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^15.1.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jquery": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", + "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-27.2.0.tgz", + "integrity": "sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.23", + "@asamuzakjp/dom-selector": "^6.7.4", + "cssstyle": "^5.3.3", + "data-urls": "^6.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^15.1.0", + "ws": "^8.18.3", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.2.tgz", + "integrity": "sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.2.tgz", + "integrity": "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.2" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.2.tgz", + "integrity": "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/vite": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vitest": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", + "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.8", + "@vitest/mocker": "4.1.8", + "@vitest/pretty-format": "4.1.8", + "@vitest/runner": "4.1.8", + "@vitest/snapshot": "4.1.8", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.8", + "@vitest/browser-preview": "4.1.8", + "@vitest/browser-webdriverio": "4.1.8", + "@vitest/coverage-istanbul": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "@vitest/ui": "4.1.8", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-15.1.0.tgz", + "integrity": "sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5b476ce --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "turn.js", + "version": "3.0.0-local", + "private": true, + "type": "module", + "scripts": { + "test": "npm run test:unit && npm run test:visual", + "test:unit": "vitest run", + "test:visual": "playwright test", + "test:visual:update": "playwright test --update-snapshots" + }, + "devDependencies": { + "@playwright/test": "1.60.0", + "jquery": "4.0.0", + "jsdom": "27.2.0", + "vitest": "^4.1.8" + } +} diff --git a/playwright.config.mjs b/playwright.config.mjs new file mode 100644 index 0000000..992a58e --- /dev/null +++ b/playwright.config.mjs @@ -0,0 +1,21 @@ +import { defineConfig } from '@playwright/test'; +import { existsSync } from 'node:fs'; + +const chromiumExecutable = process.env.CHROMIUM_EXECUTABLE_PATH || '/usr/bin/chromium'; + +export default defineConfig({ + testDir: './tests/visual', + timeout: 30_000, + expect: { + timeout: 5_000, + toHaveScreenshot: { + maxDiffPixelRatio: 0.02 + } + }, + use: { + browserName: 'chromium', + viewport: { width: 1100, height: 760 }, + deviceScaleFactor: 1, + launchOptions: existsSync(chromiumExecutable) ? { executablePath: chromiumExecutable } : {} + } +}); diff --git a/tests/unit/turn.unit.test.js b/tests/unit/turn.unit.test.js new file mode 100644 index 0000000..3aedf0f --- /dev/null +++ b/tests/unit/turn.unit.test.js @@ -0,0 +1,143 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { JSDOM } from 'jsdom'; +import { createRequire } from 'node:module'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; + +const require = createRequire(import.meta.url); +const __dirname = dirname(fileURLToPath(import.meta.url)); +const jqueryDist = dirname(require.resolve('jquery')); +const jquerySource = readFileSync(resolve(jqueryDist, 'jquery.js'), 'utf8'); +const turnSource = readFileSync(resolve(__dirname, '../../turn.js'), 'utf8'); + +function createFixture(pageCount = 4) { + const pages = Array.from({ length: pageCount }, (_, index) => ( + `
Page ${index + 1}
` + )).join(''); + + const dom = new JSDOM(`
${pages}
`, { + pretendToBeVisual: true, + runScripts: 'outside-only', + url: 'http://localhost/' + }); + + dom.window.eval(jquerySource); + const $ = dom.window.jQuery; + dom.window.eval(turnSource); + + return { window: dom.window, document: dom.window.document, $ }; +} + +describe('turn.js jQuery plugin', () => { + let fixture; + + beforeEach(() => { + fixture = createFixture(); + }); + + afterEach(() => { + fixture.window.close(); + vi.restoreAllMocks(); + }); + + it('registers the turn, flip and transform plugins', () => { + const { $ } = fixture; + + expect($.fn.turn).toBeTypeOf('function'); + expect($.fn.flip).toBeTypeOf('function'); + expect($.fn.transform).toBeTypeOf('function'); + }); + + it('initializes a book and exposes page, view, pages and size state', () => { + const { $ } = fixture; + const $book = $('#book'); + + $book.turn({ + width: 600, + height: 400, + display: 'double', + gradients: false, + acceleration: false + }); + + expect($book.turn('page')).toBe(1); + expect($book.turn('pages')).toBe(4); + expect($book.turn('view')).toEqual([0, 1]); + expect($book.turn('size')).toEqual({ width: 600, height: 400 }); + expect($book.find('.turn-page-wrapper').length).toBeGreaterThan(0); + }); + + it('supports initial page selection without animation', () => { + const { $ } = fixture; + const $book = $('#book'); + + $book.turn({ + width: 600, + height: 400, + display: 'double', + gradients: false, + acceleration: false, + page: 2 + }); + + expect($book.turn('page')).toBe(2); + expect($book.turn('view')).toEqual([2, 3]); + }); + + it('can add and remove pages dynamically', () => { + const { $ } = fixture; + const $book = $('#book'); + + $book.turn({ + width: 600, + height: 400, + display: 'double', + gradients: false, + acceleration: false + }); + + $book.turn('addPage', $('
Page 5
'), 5); + expect($book.turn('pages')).toBe(5); + expect($book.turn('hasPage', 5)).toBe(true); + + $book.turn('removePage', 5); + expect($book.turn('pages')).toBe(4); + expect($book.turn('hasPage', 5)).toBe(false); + }); + + it('registers internal handlers with event namespaces', () => { + fixture.window.close(); + fixture = createFixture(); + + const { $ } = fixture; + const onSpy = vi.spyOn($.fn, 'on'); + + $('#book').turn({ + width: 600, + height: 400, + display: 'double', + gradients: false, + acceleration: false, + when: { + turned: function() {} + } + }); + + const eventNames = onSpy.mock.calls + .map(call => call[0]) + .filter(name => typeof name === 'string'); + + const pointerEvents = $.isTouch + ? ['touchstart.turn', 'touchmove.turn', 'touchend.turn'] + : ['mousedown.turn', 'mousemove.turn', 'mouseup.turn']; + + expect(eventNames).toContain('turned.turn'); + expect(eventNames).toEqual(expect.arrayContaining(pointerEvents)); + expect(eventNames).toContain('pressed.turnFlip'); + expect(eventNames).toContain('released.turnFlip'); + expect(eventNames).toContain('start.turnFlip'); + expect(eventNames).toContain('end.turnFlip'); + expect(eventNames).toContain('flip.turnFlip'); + }); +}); diff --git a/tests/visual/minimal.spec.js b/tests/visual/minimal.spec.js new file mode 100644 index 0000000..d714a5a --- /dev/null +++ b/tests/visual/minimal.spec.js @@ -0,0 +1,148 @@ +import { expect, test } from '@playwright/test'; +import { createServer } from 'node:http'; +import { readFile } from 'node:fs/promises'; +import { createRequire } from 'node:module'; +import { extname, join, normalize } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { dirname, resolve } from 'node:path'; + +const require = createRequire(import.meta.url); +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = resolve(__dirname, '../..'); +const jqueryDist = dirname(require.resolve('jquery')); +const jqueryPath = resolve(jqueryDist, 'jquery.min.js'); + +const contentTypes = { + '.html': 'text/html; charset=utf-8', + '.js': 'text/javascript; charset=utf-8', + '.svg': 'image/svg+xml; charset=utf-8' +}; + +let server; +let baseUrl; + +test.beforeAll(async () => { + server = createServer(async (request, response) => { + try { + const url = new URL(request.url, 'http://127.0.0.1'); + const pathname = url.pathname === '/' ? '/demos/minimal/index.html' : url.pathname; + const file = normalize(join(root, pathname)); + + if (!file.startsWith(root)) { + response.writeHead(403); + response.end('Forbidden'); + return; + } + + const body = await readFile(file); + response.writeHead(200, { + 'content-type': contentTypes[extname(file)] || 'application/octet-stream' + }); + response.end(body); + } catch (error) { + response.writeHead(404); + response.end(error.message); + } + }); + + await new Promise(resolveListen => server.listen(0, '127.0.0.1', resolveListen)); + baseUrl = `http://127.0.0.1:${server.address().port}`; +}); + +test.afterAll(async () => { + await new Promise(resolveClose => server.close(resolveClose)); +}); + +test.beforeEach(async ({ page }) => { + await page.route('https://code.jquery.com/jquery-4.0.0.min.js', route => { + route.fulfill({ + path: jqueryPath, + contentType: 'text/javascript; charset=utf-8' + }); + }); +}); + +test('minimal demo renders the opening page', async ({ page }) => { + await page.goto(`${baseUrl}/demos/minimal/index.html`); + await page.waitForFunction(() => window.jQuery && window.jQuery.fn.jquery === '4.0.0' && typeof window.jQuery.fn.turn === 'function'); + await expect(page.locator('#book')).toHaveScreenshot('minimal-book-page-1.png'); +}); + +test('minimal demo renders after turning to the next page', async ({ page }) => { + await page.goto(`${baseUrl}/demos/minimal/index.html`); + await page.waitForFunction(() => window.jQuery && window.jQuery.fn.jquery === '4.0.0' && typeof window.jQuery.fn.turn === 'function'); + + await page.locator('#next').click(); + await expect(page.locator('#status')).toHaveText('Page 2 / 6'); + await page.waitForTimeout(700); + + await expect(page.locator('#book')).toHaveScreenshot('minimal-book-page-2.png'); +}); + +test('minimal demo keeps turn geometry aligned in a compact viewport', async ({ page }) => { + await page.setViewportSize({ width: 600, height: 720 }); + await page.goto(`${baseUrl}/demos/minimal/index.html`); + await page.waitForFunction(() => window.jQuery && window.jQuery.fn.jquery === '4.0.0' && typeof window.jQuery.fn.turn === 'function'); + + const metrics = await page.evaluate(() => { + const book = document.querySelector('#book').getBoundingClientRect(); + const wrapper = document.querySelector('.turn-page-wrapper').getBoundingClientRect(); + const size = $('#book').turn('size'); + + return { + book: { width: Math.round(book.width), height: Math.round(book.height) }, + wrapper: { width: Math.round(wrapper.width), height: Math.round(wrapper.height) }, + size + }; + }); + + expect(metrics.size).toEqual(metrics.book); + expect(metrics.wrapper.height).toBe(metrics.book.height); + expect(metrics.wrapper.width).toBe(metrics.book.width / 2); + await expect(page.locator('#book')).toHaveScreenshot('minimal-book-compact-page-1.png'); +}); + +test('minimal demo keeps page measurements aligned during a page turn', async ({ page }) => { + await page.goto(`${baseUrl}/demos/minimal/index.html`); + await page.waitForFunction(() => window.jQuery && window.jQuery.fn.jquery === '4.0.0' && typeof window.jQuery.fn.turn === 'function'); + + await page.locator('#next').click(); + await page.waitForTimeout(700); + await page.locator('#next').click(); + await page.waitForTimeout(700); + await expect(page.locator('#status')).toHaveText('Page 4 / 6'); + + await page.locator('#next').click(); + await page.waitForTimeout(160); + + const metrics = await page.evaluate(() => { + const book = document.querySelector('#book').getBoundingClientRect(); + const pageWidth = Math.round(book.width / 2); + const pageHeight = Math.round(book.height); + + const pages = [...document.querySelectorAll('.turn-page')] + .map(element => { + const rect = element.getBoundingClientRect(); + + return { + page: element.className, + width: Math.round(rect.width), + height: Math.round(rect.height), + jqueryWidth: Math.round($(element).width()), + jqueryHeight: Math.round($(element).height()) + }; + }) + .filter(item => item.width || item.height); + + return { pageWidth, pageHeight, pages }; + }); + + for (const item of metrics.pages) { + expect(item.width, item.page).toBe(metrics.pageWidth); + expect(item.height, item.page).toBe(metrics.pageHeight); + expect(item.jqueryWidth, item.page).toBe(metrics.pageWidth); + expect(item.jqueryHeight, item.page).toBe(metrics.pageHeight); + } + + await expect(page.locator('#book')).toHaveScreenshot('minimal-book-turning-page-4.png'); +}); diff --git a/tests/visual/minimal.spec.js-snapshots/minimal-book-compact-page-1-linux.png b/tests/visual/minimal.spec.js-snapshots/minimal-book-compact-page-1-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b606a6bbbf28e2089c412f23a03ed2fea402c3 GIT binary patch literal 18427 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 z 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 Ya=H_jPPl+JD-jWE3kUP(ratli1c~P7=Kufz literal 0 HcmV?d00001 diff --git a/tests/visual/minimal.spec.js-snapshots/minimal-book-page-2-linux.png b/tests/visual/minimal.spec.js-snapshots/minimal-book-page-2-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..48458b5572fcffecfa759f999f889ad6992ce7a4 GIT binary patch literal 36571 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 NGOE($uiyUl-vB{MG@<|i literal 0 HcmV?d00001 diff --git a/vitest.config.mjs b/vitest.config.mjs new file mode 100644 index 0000000..4591209 --- /dev/null +++ b/vitest.config.mjs @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + include: ['tests/unit/**/*.test.js'] + } +});