diff --git a/e2e/pages/filter/color-matrix-cacheasbitmap-child.html b/e2e/pages/filter/color-matrix-cacheasbitmap-child.html new file mode 100644 index 00000000..a4e44995 --- /dev/null +++ b/e2e/pages/filter/color-matrix-cacheasbitmap-child.html @@ -0,0 +1,100 @@ + + + + + + Next2D E2E - ColorMatrixFilter parent with cacheAsBitmap child + + + + + + + diff --git a/e2e/pages/filter/color-matrix-sprite-transformed.html b/e2e/pages/filter/color-matrix-sprite-transformed.html new file mode 100644 index 00000000..94b8e4d3 --- /dev/null +++ b/e2e/pages/filter/color-matrix-sprite-transformed.html @@ -0,0 +1,119 @@ + + + + + + Next2D E2E - ColorMatrixFilter on Sprite with transformed Shapes (issue #274) + + + + + + + diff --git a/e2e/pages/filter/filters-cacheasbitmap-child.html b/e2e/pages/filter/filters-cacheasbitmap-child.html new file mode 100644 index 00000000..1641278e --- /dev/null +++ b/e2e/pages/filter/filters-cacheasbitmap-child.html @@ -0,0 +1,94 @@ + + + + + + Next2D E2E - 全フィルターに対する cacheAsBitmap子の回帰確認 (issue #274) + + + + + + + diff --git a/e2e/pages/filter/filters-sprite-transformed.html b/e2e/pages/filter/filters-sprite-transformed.html new file mode 100644 index 00000000..7c3e1952 --- /dev/null +++ b/e2e/pages/filter/filters-sprite-transformed.html @@ -0,0 +1,102 @@ + + + + + + Next2D E2E - Filters on Sprite with transformed Shapes (issue #274 regression) + + + + + + + diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-bevel-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-bevel-webgl-darwin.png index 3df3bd1f..5b657f1e 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-bevel-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-bevel-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-color-matrix-cacheasbitmap-child-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-color-matrix-cacheasbitmap-child-webgl-darwin.png new file mode 100644 index 00000000..037e7588 Binary files /dev/null and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-color-matrix-cacheasbitmap-child-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-color-matrix-sprite-transformed-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-color-matrix-sprite-transformed-webgl-darwin.png new file mode 100644 index 00000000..36252cbe Binary files /dev/null and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-color-matrix-sprite-transformed-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-convolution-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-convolution-webgl-darwin.png index bcea7fd8..9e06c6b8 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-convolution-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-convolution-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-displacement-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-displacement-webgl-darwin.png index 61219c55..11d6e041 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-displacement-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-displacement-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-drop-shadow-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-drop-shadow-webgl-darwin.png index 0c35a0e8..96edfb9e 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-drop-shadow-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-drop-shadow-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-gradient-glow-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-gradient-glow-webgl-darwin.png index f603a218..545cdf2f 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-gradient-glow-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-gradient-glow-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-modes-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-modes-webgl-darwin.png index b5d64651..9422fd93 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-modes-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-modes-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-multi-filter-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-multi-filter-webgl-darwin.png index ab4b4dca..41da3170 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-multi-filter-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-multi-filter-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-quality-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-quality-webgl-darwin.png index f519354e..98cb1677 100644 Binary files a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-quality-webgl-darwin.png and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filter-quality-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filters-cacheasbitmap-child-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filters-cacheasbitmap-child-webgl-darwin.png new file mode 100644 index 00000000..acd0abe6 Binary files /dev/null and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filters-cacheasbitmap-child-webgl-darwin.png differ diff --git a/e2e/snapshots/webgl/filter.spec.ts-snapshots/filters-sprite-transformed-webgl-darwin.png b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filters-sprite-transformed-webgl-darwin.png new file mode 100644 index 00000000..3d732cd2 Binary files /dev/null and b/e2e/snapshots/webgl/filter.spec.ts-snapshots/filters-sprite-transformed-webgl-darwin.png differ diff --git a/e2e/snapshots/webgpu/blendmode.spec.ts-snapshots/blendmode-all-webgpu-darwin.png b/e2e/snapshots/webgpu/blendmode.spec.ts-snapshots/blendmode-all-webgpu-darwin.png index e10a4087..99ef90a0 100644 Binary files a/e2e/snapshots/webgpu/blendmode.spec.ts-snapshots/blendmode-all-webgpu-darwin.png and b/e2e/snapshots/webgpu/blendmode.spec.ts-snapshots/blendmode-all-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-bevel-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-bevel-webgpu-darwin.png index d5c70798..77720cf2 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-bevel-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-bevel-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-color-matrix-cacheasbitmap-child-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-color-matrix-cacheasbitmap-child-webgpu-darwin.png new file mode 100644 index 00000000..037e7588 Binary files /dev/null and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-color-matrix-cacheasbitmap-child-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-color-matrix-sprite-transformed-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-color-matrix-sprite-transformed-webgpu-darwin.png new file mode 100644 index 00000000..36252cbe Binary files /dev/null and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-color-matrix-sprite-transformed-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-convolution-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-convolution-webgpu-darwin.png index 93a00f90..36e7d182 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-convolution-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-convolution-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-displacement-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-displacement-webgpu-darwin.png index 3cb8c677..354ccbbb 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-displacement-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-displacement-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-drop-shadow-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-drop-shadow-webgpu-darwin.png index 27354c9d..5b2c568f 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-drop-shadow-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-drop-shadow-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-gradient-glow-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-gradient-glow-webgpu-darwin.png index e05ddd20..662263f0 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-gradient-glow-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-gradient-glow-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-modes-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-modes-webgpu-darwin.png index 0b2cb269..454e9785 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-modes-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-modes-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-multi-filter-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-multi-filter-webgpu-darwin.png index fc3a910a..ba8ebbe6 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-multi-filter-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-multi-filter-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-quality-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-quality-webgpu-darwin.png index 69c64611..f2f2e95e 100644 Binary files a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-quality-webgpu-darwin.png and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filter-quality-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filters-cacheasbitmap-child-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filters-cacheasbitmap-child-webgpu-darwin.png new file mode 100644 index 00000000..acd0abe6 Binary files /dev/null and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filters-cacheasbitmap-child-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filters-sprite-transformed-webgpu-darwin.png b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filters-sprite-transformed-webgpu-darwin.png new file mode 100644 index 00000000..8c44f9e8 Binary files /dev/null and b/e2e/snapshots/webgpu/filter.spec.ts-snapshots/filters-sprite-transformed-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/mask.spec.ts-snapshots/mask-sprite-webgpu-darwin.png b/e2e/snapshots/webgpu/mask.spec.ts-snapshots/mask-sprite-webgpu-darwin.png index 5c11d5dc..609c3d3a 100644 Binary files a/e2e/snapshots/webgpu/mask.spec.ts-snapshots/mask-sprite-webgpu-darwin.png and b/e2e/snapshots/webgpu/mask.spec.ts-snapshots/mask-sprite-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/cache-as-bitmap-webgpu-darwin.png b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/cache-as-bitmap-webgpu-darwin.png index cd88dacf..c79d0117 100644 Binary files a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/cache-as-bitmap-webgpu-darwin.png and b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/cache-as-bitmap-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/fill-bitmap-webgpu-darwin.png b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/fill-bitmap-webgpu-darwin.png index ccac7aa6..53a9bdc6 100644 Binary files a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/fill-bitmap-webgpu-darwin.png and b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/fill-bitmap-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-flip-webgpu-darwin.png b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-flip-webgpu-darwin.png index 268921f2..462bba4f 100644 Binary files a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-flip-webgpu-darwin.png and b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-flip-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-webgpu-darwin.png b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-webgpu-darwin.png index 73fae52d..d8bdf1ac 100644 Binary files a/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-webgpu-darwin.png and b/e2e/snapshots/webgpu/shape.spec.ts-snapshots/load-image-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/sprite.spec.ts-snapshots/sprite-filter-webgpu-darwin.png b/e2e/snapshots/webgpu/sprite.spec.ts-snapshots/sprite-filter-webgpu-darwin.png index f1fedcf9..ccd28471 100644 Binary files a/e2e/snapshots/webgpu/sprite.spec.ts-snapshots/sprite-filter-webgpu-darwin.png and b/e2e/snapshots/webgpu/sprite.spec.ts-snapshots/sprite-filter-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-auto-font-size-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-auto-font-size-webgpu-darwin.png index fe6290b5..77e6fa46 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-auto-font-size-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-auto-font-size-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-basic-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-basic-webgpu-darwin.png index 2ef3d02c..47b527ba 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-basic-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-basic-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-blendmode-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-blendmode-webgpu-darwin.png index b07792d7..5c0aa655 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-blendmode-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-blendmode-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-filter-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-filter-webgpu-darwin.png index 0c4560a5..765efba6 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-filter-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-filter-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-format-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-format-webgpu-darwin.png index 20623eed..a7a2fd57 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-format-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-format-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-html-text-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-html-text-webgpu-darwin.png index 59e8d578..4d0379e7 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-html-text-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-html-text-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-scroll-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-scroll-webgpu-darwin.png index 4448bb0b..58f351cb 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-scroll-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-scroll-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-thickness-webgpu-darwin.png b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-thickness-webgpu-darwin.png index 9113c4bb..0204e7f1 100644 Binary files a/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-thickness-webgpu-darwin.png and b/e2e/snapshots/webgpu/textfield.spec.ts-snapshots/textfield-thickness-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-blendmode-webgpu-darwin.png b/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-blendmode-webgpu-darwin.png index 08b8242f..5bea8829 100644 Binary files a/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-blendmode-webgpu-darwin.png and b/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-blendmode-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-filter-webgpu-darwin.png b/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-filter-webgpu-darwin.png index 9dda5728..5c93b1a3 100644 Binary files a/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-filter-webgpu-darwin.png and b/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-filter-webgpu-darwin.png differ diff --git a/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-playback-webgpu-darwin.png b/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-playback-webgpu-darwin.png index ced20616..6a2f1132 100644 Binary files a/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-playback-webgpu-darwin.png and b/e2e/snapshots/webgpu/video.spec.ts-snapshots/video-playback-webgpu-darwin.png differ diff --git a/e2e/tests/filter.spec.ts b/e2e/tests/filter.spec.ts index 3aa18e17..e8f1a947 100644 --- a/e2e/tests/filter.spec.ts +++ b/e2e/tests/filter.spec.ts @@ -85,4 +85,32 @@ test.describe("Filterテスト", () => { await expect(page).toHaveScreenshot("filter-quality.png"); }); + + test("ColorMatrixFilter on Sprite with transformed Shapes (issue #274)", async ({ page }) => { + await page.goto("/e2e/pages/filter/color-matrix-sprite-transformed.html"); + await waitForCanvas(page); + + await expect(page).toHaveScreenshot("filter-color-matrix-sprite-transformed.png"); + }); + + test("全フィルター on Sprite with transformed Shapes (issue #274 regression)", async ({ page }) => { + await page.goto("/e2e/pages/filter/filters-sprite-transformed.html"); + await waitForCanvas(page); + + await expect(page).toHaveScreenshot("filters-sprite-transformed.png"); + }); + + test("ColorMatrixFilter on Sprite with cacheAsBitmap child (issue #274)", async ({ page }) => { + await page.goto("/e2e/pages/filter/color-matrix-cacheasbitmap-child.html"); + await waitForCanvas(page); + + await expect(page).toHaveScreenshot("filter-color-matrix-cacheasbitmap-child.png"); + }); + + test("全フィルター on Sprite with cacheAsBitmap child (issue #274 regression)", async ({ page }) => { + await page.goto("/e2e/pages/filter/filters-cacheasbitmap-child.html"); + await waitForCanvas(page); + + await expect(page).toHaveScreenshot("filters-cacheasbitmap-child.png"); + }); }); diff --git a/package-lock.json b/package-lock.json index 8a9d7603..18604180 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@next2d/player", - "version": "3.1.0", + "version": "3.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@next2d/player", - "version": "3.1.0", + "version": "3.2.0", "license": "MIT", "workspaces": [ "packages/*" @@ -14,22 +14,22 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^10.0.1", - "@playwright/test": "^1.59.0", + "@playwright/test": "^1.59.1", "@rollup/plugin-commonjs": "^29.0.2", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", "@rollup/plugin-typescript": "^12.3.0", - "@typescript-eslint/eslint-plugin": "^8.58.0", - "@typescript-eslint/parser": "^8.58.0", + "@typescript-eslint/eslint-plugin": "^8.58.2", + "@typescript-eslint/parser": "^8.58.2", "@webgpu/types": "^0.1.69", - "eslint": "^10.1.0", + "eslint": "^10.2.1", "eslint-plugin-unused-imports": "^4.4.1", - "globals": "^17.4.0", - "jsdom": "^29.0.1", - "rollup": "^4.60.1", - "typescript": "^6.0.2", - "vite": "^8.0.3", - "vitest": "^4.1.2", + "globals": "^17.5.0", + "jsdom": "^29.0.2", + "rollup": "^4.60.2", + "typescript": "^6.0.3", + "vite": "^8.0.8", + "vitest": "^4.1.4", "vitest-webgl-canvas-mock": "^1.1.0" }, "funding": { @@ -55,39 +55,49 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.1.tgz", - "integrity": "sha512-iGWN8E45Ws0XWx3D44Q1t6vX2LqhCKcwfmwBYCDsFrYFS6m4q/Ks61L2veETaLv+ckDC6+dTETJoaAAb7VjLiw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz", + "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==", "dev": true, "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.1.1", - "@csstools/css-color-parser": "^4.0.2", + "@asamuzakjp/generational-cache": "^1.0.1", + "@csstools/css-calc": "^3.2.0", + "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.7" + "@csstools/css-tokenizer": "^4.0.0" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/dom-selector": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.4.tgz", - "integrity": "sha512-jXR6x4AcT3eIrS2fSNAwJpwirOkGcd+E7F7CP3zjdTqz9B/2huHOL8YJZBgekKwLML+u7qB/6P1LXQuMScsx0w==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.0.tgz", + "integrity": "sha512-ASf825+5vsGuYWoyFyNsex2mNtPTXpCvYTR942+w/eNw7PqS0Lhl/PE1hC7bajneI3m/Oxi+yrP3vTOPxfwM8A==", "dev": true, "license": "MIT", "dependencies": { + "@asamuzakjp/generational-cache": "^1.0.1", "@asamuzakjp/nwsapi": "^2.3.9", "bidi-js": "^1.0.3", "css-tree": "^3.2.1", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.7" + "is-potential-custom-element-name": "^1.0.1" }, "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/@asamuzakjp/generational-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz", + "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/@asamuzakjp/nwsapi": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", @@ -129,9 +139,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", - "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.0.tgz", + "integrity": "sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==", "dev": true, "funding": [ { @@ -153,9 +163,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", - "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.0.tgz", + "integrity": "sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==", "dev": true, "funding": [ { @@ -170,7 +180,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.1.1" + "@csstools/css-calc": "^3.2.0" }, "engines": { "node": ">=20.19.0" @@ -204,9 +214,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.2.tgz", - "integrity": "sha512-5GkLzz4prTIpoyeUiIu3iV6CSG3Plo7xRVOFPKI7FVEJ3mZ0A8SwK0XU3Gl7xAkiQ+mDyam+NNp875/C5y+jSA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.3.tgz", + "integrity": "sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==", "dev": true, "funding": [ { @@ -249,38 +259,35 @@ } }, "node_modules/@emnapi/core": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", - "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.0", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", - "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", "dev": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", - "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "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, - "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -315,13 +322,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", - "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^3.0.3", + "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" }, @@ -369,22 +376,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", - "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz", + "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.1" + "@eslint/core": "^1.2.1" }, "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", - "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -453,9 +460,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", - "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -463,13 +470,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", - "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz", + "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.1", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { @@ -495,29 +502,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -597,9 +618,9 @@ } }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", - "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "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, @@ -676,9 +697,9 @@ "link": true }, "node_modules/@oxc-project/types": { - "version": "0.122.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", - "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "version": "0.124.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", "dev": true, "license": "MIT", "funding": { @@ -686,13 +707,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.0.tgz", - "integrity": "sha512-TOA5sTLd49rTDaZpYpvCQ9hGefHQq/OYOyCVnGqS2mjMfX+lGZv2iddIJd0I48cfxqSPttS9S3OuLKyylHcO1w==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.0" + "playwright": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -702,9 +723,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", "cpu": [ "arm64" ], @@ -719,9 +740,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", "cpu": [ "arm64" ], @@ -736,9 +757,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", "cpu": [ "x64" ], @@ -753,9 +774,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", - "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", "cpu": [ "x64" ], @@ -770,9 +791,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", - "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", "cpu": [ "arm" ], @@ -787,9 +808,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", "cpu": [ "arm64" ], @@ -807,9 +828,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", "cpu": [ "arm64" ], @@ -827,9 +848,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", "cpu": [ "ppc64" ], @@ -847,9 +868,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", "cpu": [ "s390x" ], @@ -867,9 +888,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", - "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", "cpu": [ "x64" ], @@ -887,9 +908,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", - "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", "cpu": [ "x64" ], @@ -907,9 +928,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", - "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", "cpu": [ "arm64" ], @@ -924,9 +945,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", - "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", "cpu": [ "wasm32" ], @@ -934,16 +955,18 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^1.1.1" + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", "cpu": [ "arm64" ], @@ -958,9 +981,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", - "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", "cpu": [ "x64" ], @@ -975,9 +998,9 @@ } }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", - "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", "dev": true, "license": "MIT" }, @@ -1107,9 +1130,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", - "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", "cpu": [ "arm" ], @@ -1121,9 +1144,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", - "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", "cpu": [ "arm64" ], @@ -1135,9 +1158,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", - "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", "cpu": [ "arm64" ], @@ -1149,9 +1172,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", - "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", "cpu": [ "x64" ], @@ -1163,9 +1186,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", - "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", "cpu": [ "arm64" ], @@ -1177,9 +1200,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", - "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", "cpu": [ "x64" ], @@ -1191,9 +1214,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", - "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", "cpu": [ "arm" ], @@ -1208,9 +1231,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", - "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", "cpu": [ "arm" ], @@ -1225,9 +1248,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", - "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", "cpu": [ "arm64" ], @@ -1242,9 +1265,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", - "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", "cpu": [ "arm64" ], @@ -1259,9 +1282,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", - "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", "cpu": [ "loong64" ], @@ -1276,9 +1299,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", - "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", "cpu": [ "loong64" ], @@ -1293,9 +1316,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", - "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", "cpu": [ "ppc64" ], @@ -1310,9 +1333,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", - "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", "cpu": [ "ppc64" ], @@ -1327,9 +1350,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", - "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", "cpu": [ "riscv64" ], @@ -1344,9 +1367,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", - "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", "cpu": [ "riscv64" ], @@ -1361,9 +1384,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", - "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", "cpu": [ "s390x" ], @@ -1378,9 +1401,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", - "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", "cpu": [ "x64" ], @@ -1395,9 +1418,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", - "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", "cpu": [ "x64" ], @@ -1412,9 +1435,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", - "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", "cpu": [ "x64" ], @@ -1426,9 +1449,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", - "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", "cpu": [ "arm64" ], @@ -1440,9 +1463,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", - "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", "cpu": [ "arm64" ], @@ -1454,9 +1477,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", - "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", "cpu": [ "ia32" ], @@ -1468,9 +1491,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", - "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", "cpu": [ "x64" ], @@ -1482,9 +1505,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", - "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", "cpu": [ "x64" ], @@ -1560,17 +1583,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", - "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.2.tgz", + "integrity": "sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/type-utils": "8.58.0", - "@typescript-eslint/utils": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/scope-manager": "8.58.2", + "@typescript-eslint/type-utils": "8.58.2", + "@typescript-eslint/utils": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1583,7 +1606,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.58.0", + "@typescript-eslint/parser": "^8.58.2", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -1599,16 +1622,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz", - "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.2.tgz", + "integrity": "sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/scope-manager": "8.58.2", + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/typescript-estree": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3" }, "engines": { @@ -1624,14 +1647,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz", - "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz", + "integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.0", - "@typescript-eslint/types": "^8.58.0", + "@typescript-eslint/tsconfig-utils": "^8.58.2", + "@typescript-eslint/types": "^8.58.2", "debug": "^4.4.3" }, "engines": { @@ -1646,14 +1669,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz", - "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz", + "integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0" + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1664,9 +1687,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz", - "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz", + "integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==", "dev": true, "license": "MIT", "engines": { @@ -1681,15 +1704,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz", - "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.2.tgz", + "integrity": "sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0", - "@typescript-eslint/utils": "8.58.0", + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/typescript-estree": "8.58.2", + "@typescript-eslint/utils": "8.58.2", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1706,9 +1729,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", - "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", + "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", "dev": true, "license": "MIT", "engines": { @@ -1720,16 +1743,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz", - "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz", + "integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.0", - "@typescript-eslint/tsconfig-utils": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/visitor-keys": "8.58.0", + "@typescript-eslint/project-service": "8.58.2", + "@typescript-eslint/tsconfig-utils": "8.58.2", + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/visitor-keys": "8.58.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1787,16 +1810,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz", - "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.2.tgz", + "integrity": "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.0", - "@typescript-eslint/types": "8.58.0", - "@typescript-eslint/typescript-estree": "8.58.0" + "@typescript-eslint/scope-manager": "8.58.2", + "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/typescript-estree": "8.58.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1811,13 +1834,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz", - "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==", + "version": "8.58.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", + "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.0", + "@typescript-eslint/types": "8.58.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1842,16 +1865,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", - "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.4.tgz", + "integrity": "sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", + "@vitest/spy": "4.1.4", + "@vitest/utils": "4.1.4", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -1860,13 +1883,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", - "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.4.tgz", + "integrity": "sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.2", + "@vitest/spy": "4.1.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -1897,9 +1920,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", - "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.4.tgz", + "integrity": "sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==", "dev": true, "license": "MIT", "dependencies": { @@ -1910,13 +1933,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", - "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.4.tgz", + "integrity": "sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.2", + "@vitest/utils": "4.1.4", "pathe": "^2.0.3" }, "funding": { @@ -1924,14 +1947,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", - "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.4.tgz", + "integrity": "sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.2", - "@vitest/utils": "4.1.2", + "@vitest/pretty-format": "4.1.4", + "@vitest/utils": "4.1.4", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -1940,9 +1963,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", - "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.4.tgz", + "integrity": "sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==", "dev": true, "license": "MIT", "funding": { @@ -1950,13 +1973,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", - "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.4.tgz", + "integrity": "sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.2", + "@vitest/pretty-format": "4.1.4", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -2046,9 +2069,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, "license": "MIT", "dependencies": { @@ -2232,6 +2255,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", @@ -2253,18 +2286,18 @@ } }, "node_modules/eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", - "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.1.tgz", + "integrity": "sha512-wiyGaKsDgqXvF40P8mDwiUp/KQjE1FdrIEJsM8PZ3XCiniTMXS3OHWWUe5FI5agoCnr8x4xPrTDZuxsBlNHl+Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.3", - "@eslint/config-helpers": "^0.5.3", - "@eslint/core": "^1.1.1", - "@eslint/plugin-kit": "^0.6.1", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -2649,9 +2682,9 @@ } }, "node_modules/globals": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", - "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", + "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", "dev": true, "license": "MIT", "engines": { @@ -2662,9 +2695,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2808,14 +2841,14 @@ } }, "node_modules/jsdom": { - "version": "29.0.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.1.tgz", - "integrity": "sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==", + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", + "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@asamuzakjp/dom-selector": "^7.0.3", + "@asamuzakjp/css-color": "^5.1.5", + "@asamuzakjp/dom-selector": "^7.0.6", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.1", "@exodus/bytes": "^1.15.0", @@ -3183,9 +3216,9 @@ } }, "node_modules/lru-cache": { - "version": "11.2.7", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", - "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", + "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -3407,13 +3440,13 @@ } }, "node_modules/playwright": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0.tgz", - "integrity": "sha512-wihGScriusvATUxmhfENxg0tj1vHEFeIwxlnPFKQTOQVd7aG08mUfvvniRP/PtQOC+2Bs52kBOC/Up1jTXeIbw==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.59.0" + "playwright-core": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -3426,9 +3459,9 @@ } }, "node_modules/playwright-core": { - "version": "1.59.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0.tgz", - "integrity": "sha512-PW/X/IoZ6BMUUy8rpwHEZ8Kc0IiLIkgKYGNFaMs5KmQhcfLILNx9yCQD0rnWeWfz1PNeqcFP1BsihQhDOBCwZw==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3439,9 +3472,9 @@ } }, "node_modules/postcss": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", - "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { @@ -3498,12 +3531,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -3529,14 +3563,14 @@ } }, "node_modules/rolldown": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", - "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.122.0", - "@rolldown/pluginutils": "1.0.0-rc.12" + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" }, "bin": { "rolldown": "bin/cli.mjs" @@ -3545,27 +3579,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", - "@rolldown/binding-darwin-x64": "1.0.0-rc.12", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" } }, "node_modules/rollup": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", - "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3579,31 +3613,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.1", - "@rollup/rollup-android-arm64": "4.60.1", - "@rollup/rollup-darwin-arm64": "4.60.1", - "@rollup/rollup-darwin-x64": "4.60.1", - "@rollup/rollup-freebsd-arm64": "4.60.1", - "@rollup/rollup-freebsd-x64": "4.60.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", - "@rollup/rollup-linux-arm-musleabihf": "4.60.1", - "@rollup/rollup-linux-arm64-gnu": "4.60.1", - "@rollup/rollup-linux-arm64-musl": "4.60.1", - "@rollup/rollup-linux-loong64-gnu": "4.60.1", - "@rollup/rollup-linux-loong64-musl": "4.60.1", - "@rollup/rollup-linux-ppc64-gnu": "4.60.1", - "@rollup/rollup-linux-ppc64-musl": "4.60.1", - "@rollup/rollup-linux-riscv64-gnu": "4.60.1", - "@rollup/rollup-linux-riscv64-musl": "4.60.1", - "@rollup/rollup-linux-s390x-gnu": "4.60.1", - "@rollup/rollup-linux-x64-gnu": "4.60.1", - "@rollup/rollup-linux-x64-musl": "4.60.1", - "@rollup/rollup-openbsd-x64": "4.60.1", - "@rollup/rollup-openharmony-arm64": "4.60.1", - "@rollup/rollup-win32-arm64-msvc": "4.60.1", - "@rollup/rollup-win32-ia32-msvc": "4.60.1", - "@rollup/rollup-win32-x64-gnu": "4.60.1", - "@rollup/rollup-win32-x64-msvc": "4.60.1", + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", "fsevents": "~2.3.2" } }, @@ -3722,9 +3756,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", - "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "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" }, @@ -3788,9 +3822,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", - "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.1.tgz", + "integrity": "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==", "dev": true, "license": "MIT", "engines": { @@ -3798,14 +3832,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -3825,22 +3859,22 @@ } }, "node_modules/tldts": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", - "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", + "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.27" + "tldts-core": "^7.0.28" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", - "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", + "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", "dev": true, "license": "MIT" }, @@ -3905,9 +3939,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3919,9 +3953,9 @@ } }, "node_modules/undici": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", - "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", "dev": true, "license": "MIT", "engines": { @@ -3939,16 +3973,16 @@ } }, "node_modules/vite": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", - "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.8", - "rolldown": "1.0.0-rc.12", + "rolldown": "1.0.0-rc.15", "tinyglobby": "^0.2.15" }, "bin": { @@ -3966,7 +4000,7 @@ "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", - "esbuild": "^0.27.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", @@ -4032,19 +4066,19 @@ } }, "node_modules/vitest": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", - "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.4.tgz", + "integrity": "sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.2", - "@vitest/mocker": "4.1.2", - "@vitest/pretty-format": "4.1.2", - "@vitest/runner": "4.1.2", - "@vitest/snapshot": "4.1.2", - "@vitest/spy": "4.1.2", - "@vitest/utils": "4.1.2", + "@vitest/expect": "4.1.4", + "@vitest/mocker": "4.1.4", + "@vitest/pretty-format": "4.1.4", + "@vitest/runner": "4.1.4", + "@vitest/snapshot": "4.1.4", + "@vitest/spy": "4.1.4", + "@vitest/utils": "4.1.4", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -4072,10 +4106,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.2", - "@vitest/browser-preview": "4.1.2", - "@vitest/browser-webdriverio": "4.1.2", - "@vitest/ui": "4.1.2", + "@vitest/browser-playwright": "4.1.4", + "@vitest/browser-preview": "4.1.4", + "@vitest/browser-webdriverio": "4.1.4", + "@vitest/coverage-istanbul": "4.1.4", + "@vitest/coverage-v8": "4.1.4", + "@vitest/ui": "4.1.4", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -4099,6 +4135,12 @@ "@vitest/browser-webdriverio": { "optional": true }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, "@vitest/ui": { "optional": true }, diff --git a/package.json b/package.json index b47b277d..c1fbadd6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@next2d/player", - "version": "3.1.0", + "version": "3.2.0", "description": "Experience the fast and beautiful anti-aliased rendering of WebGL. You can create rich, interactive graphics, cross-platform applications and games without worrying about browser or device compatibility.", "author": "Toshiyuki Ienaga (https://github.com/ienaga/)", "license": "MIT", @@ -50,22 +50,22 @@ "devDependencies": { "@eslint/eslintrc": "^3.3.5", "@eslint/js": "^10.0.1", - "@playwright/test": "^1.59.0", + "@playwright/test": "^1.59.1", "@rollup/plugin-commonjs": "^29.0.2", "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-terser": "^1.0.0", "@rollup/plugin-typescript": "^12.3.0", - "@typescript-eslint/eslint-plugin": "^8.58.0", - "@typescript-eslint/parser": "^8.58.0", + "@typescript-eslint/eslint-plugin": "^8.58.2", + "@typescript-eslint/parser": "^8.58.2", "@webgpu/types": "^0.1.69", - "eslint": "^10.1.0", + "eslint": "^10.2.1", "eslint-plugin-unused-imports": "^4.4.1", - "globals": "^17.4.0", - "jsdom": "^29.0.1", - "rollup": "^4.60.1", - "typescript": "^6.0.2", - "vite": "^8.0.3", - "vitest": "^4.1.2", + "globals": "^17.5.0", + "jsdom": "^29.0.2", + "rollup": "^4.60.2", + "typescript": "^6.0.3", + "vite": "^8.0.8", + "vitest": "^4.1.4", "vitest-webgl-canvas-mock": "^1.1.0" }, "peerDependencies": { diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.test.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.test.ts index 3f16606a..4c30403e 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.test.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.test.ts @@ -41,8 +41,32 @@ describe("DisplayObjectSetRotationUseCase.js test", () => expect(displayObject.$rotation).toBe(32); execute(displayObject, 32); - + expect(displayObject.changed).toBe(false); expect(displayObject.$rotation).toBe(32); }); + + // Regression guard for issue #274: scaleX×sin(rotation) が ±1 になる組み合わせ + // (例: scaleX=2, rotation=30°) でも a/d が維持されることを確認する。 + it("preserves matrix.a when scaleX * sin(rotation) happens to equal 1 (issue #274)", () => + { + const displayObject = new DisplayObject(); + displayObject.scaleX = 2; + displayObject.scaleY = 1; + displayObject.rotation = 30; + + const rawData = displayObject.$matrix?.rawData; + if (!rawData) { + throw new Error("rawData is null"); + } + + // a = scaleX * cos(30°) = 2 * 0.866 ≈ 1.732 + expect(rawData[0]).toBeCloseTo(1.7320508, 5); + // b = scaleX * sin(30°) = 2 * 0.5 = 1 + expect(rawData[1]).toBeCloseTo(1, 5); + // c = -scaleY * sin(30°) = -0.5 + expect(rawData[2]).toBeCloseTo(-0.5, 5); + // d = scaleY * cos(30°) ≈ 0.866 + expect(rawData[3]).toBeCloseTo(0.8660254, 5); + }); }); \ No newline at end of file diff --git a/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts b/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts index 2cadf64a..928620ca 100644 --- a/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts +++ b/packages/display/src/DisplayObject/usecase/DisplayObjectSetRotationUseCase.ts @@ -51,19 +51,19 @@ export const execute = (display_object: D, rotation: nu radianY = radianY + radian - radianX; radianX = radian; - matrix.b = scaleX * Math.sin(radianX); - if (matrix.b === 1 || matrix.b === -1) { - matrix.a = 0; - } else { - matrix.a = scaleX * Math.cos(radianX); - } + // cosが0(sinが±1)の時のみ a/d を 0 にクリアする。 + // 以前は matrix.b の値そのものを見ていたため、scaleX×sin(θ) がたまたま + // ±1 になるケース(例: scaleX=2, rotation=30°)で誤検出が発生し + // matrix.a が消えて幅が潰れる不具合を起こしていた。 + const sinX = Math.sin(radianX); + const cosX = Math.cos(radianX); + matrix.b = scaleX * sinX; + matrix.a = Math.abs(sinX) === 1 ? 0 : scaleX * cosX; - matrix.c = -scaleY * Math.sin(radianY); - if (matrix.c === 1 || matrix.c === -1) { - matrix.d = 0; - } else { - matrix.d = scaleY * Math.cos(radianY); - } + const sinY = Math.sin(radianY); + const cosY = Math.cos(radianY); + matrix.c = -scaleY * sinY; + matrix.d = Math.abs(sinY) === 1 ? 0 : scaleY * cosY; } display_object.$scaleX = null; diff --git a/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateRenderQueueUseCase.ts b/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateRenderQueueUseCase.ts index 396045ab..67418821 100644 --- a/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateRenderQueueUseCase.ts +++ b/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGenerateRenderQueueUseCase.ts @@ -13,6 +13,7 @@ import { execute as displayObjectIsMaskReflectedInDisplayUseCase } from "../../D import { execute as displayObjectContainerGenerateClipQueueUseCase } from "../../DisplayObjectContainer/usecase/DisplayObjectContainerGenerateClipQueueUseCase"; import { execute as displayObjectBlendToNumberService } from "../../DisplayObject/service/DisplayObjectBlendToNumberService"; import { execute as displayObjectContainerGetLayerBoundsUseCase } from "./DisplayObjectContainerGetLayerBoundsUseCase"; +import { execute as displayObjectContainerGetLayerScaleUseCase } from "./DisplayObjectContainerGetLayerScaleUseCase"; import { execute as displayObjectContainerCalcBoundsMatrixUseCase } from "../../DisplayObjectContainer/usecase/DisplayObjectContainerCalcBoundsMatrixUseCase"; import { stage } from "../../Stage"; import { renderQueue } from "@next2d/render-queue"; @@ -51,7 +52,8 @@ export const execute =

( matrix: Float32Array, color_transform: Float32Array, renderer_width: number, - renderer_height: number + renderer_height: number, + in_filter_layer: boolean = false ): void => { if (!display_object_container.visible) { @@ -120,6 +122,9 @@ export const execute =

( // キャッシュテクスチャは親のスケールを含むサイズで描画し、 // コンポジットは setTransform(1,0,0,1,x,y) で1:1描画されるため正しい画面サイズになる // 親の移動はキャッシュヒット(位置だけ更新)、スケール変更はキャッシュミス(再描画) + // 親がfilter等の中間レイヤー内にいる場合、filter layer 側で layerScale倍の + // 解像度を確保してから最終compose時に 1/layerScale で縮小合成する仕組みによって + // cacheAsBitmap子のテクスチャが親layerに収まる (issue #274 根本対応)。 const cacheMatrix = display_object_container.cacheAsBitmap; if (cacheMatrix) { @@ -184,15 +189,19 @@ export const execute =

( const screenX = matrix[0] * localOriginX + matrix[2] * localOriginY + matrix[4]; const screenY = matrix[1] * localOriginX + matrix[3] * localOriginY + matrix[5]; - // Shapeと同様にmatrixにcacheScaleを乗算して送る - // レンダラーで matrix/renderScale → cacheScale成分が反映される + // 通常: matrixにcacheScaleを乗算。レンダラで matrix/renderScale → cacheScale成分が反映される。 + // issue #274: 親がfilter layer を持ち、layer を cacheScale 倍解像度で確保している場合は、 + // 親のtMatrix に既に layerScale (=cacheScale) が掛かっているため、cacheScale 乗算を省略して + // 合成 scale=1 で layer にちょうど収まるようにする。 + const hitMatrixScaleX = in_filter_layer ? 1 : cacheScaleX; + const hitMatrixScaleY = in_filter_layer ? 1 : cacheScaleY; renderQueue.push(1, 0, 0, // layerWidth/Height: HIT時は未使用 2, 1, display_object_container.instanceId, bitmapCacheKey, cacheFilterBounds[0], cacheFilterBounds[1], cacheFilterBounds[2], cacheFilterBounds[3], renderScaleX, renderScaleY, - matrix[0] * cacheScaleX, matrix[1] * cacheScaleX, - matrix[2] * cacheScaleY, matrix[3] * cacheScaleY, + matrix[0] * hitMatrixScaleX, matrix[1] * hitMatrixScaleX, + matrix[2] * hitMatrixScaleY, matrix[3] * hitMatrixScaleY, screenX, screenY, tColorTransform[0], tColorTransform[1], tColorTransform[2], tColorTransform[3], tColorTransform[4], tColorTransform[5], tColorTransform[6], tColorTransform[7] @@ -249,14 +258,17 @@ export const execute =

( const missScreenX = matrix[0] * localOriginX + matrix[2] * localOriginY + matrix[4]; const missScreenY = matrix[1] * localOriginX + matrix[3] * localOriginY + matrix[5]; + // HITパスと同じ規則: filter layer 内では cacheScale 乗算を省略 + const missMatrixScaleX = in_filter_layer ? 1 : cacheScaleX; + const missMatrixScaleY = in_filter_layer ? 1 : cacheScaleY; renderQueue.push( 1, localLayerWidth, localLayerHeight, 2, 0, display_object_container.instanceId, bitmapCacheKey, cacheFilterBounds[0], cacheFilterBounds[1], cacheFilterBounds[2], cacheFilterBounds[3], renderScaleX, renderScaleY, - matrix[0] * cacheScaleX, matrix[1] * cacheScaleX, - matrix[2] * cacheScaleY, matrix[3] * cacheScaleY, + matrix[0] * missMatrixScaleX, matrix[1] * missMatrixScaleX, + matrix[2] * missMatrixScaleY, matrix[3] * missMatrixScaleY, missScreenX, missScreenY, tColorTransform[0], tColorTransform[1], tColorTransform[2], tColorTransform[3], tColorTransform[4], tColorTransform[5], tColorTransform[6], tColorTransform[7], @@ -368,16 +380,29 @@ export const execute =

( display_object_container, matrix ); + // 子孫にcacheAsBitmapを持つ要素があれば、そのスケールに合わせて + // filterレイヤーの解像度を引き上げる。これにより親レイヤー内で + // 子のcacheScale倍テクスチャが端まで収まる (issue #274 発展対応)。 + const layerScale = new Float32Array([1, 1]); + displayObjectContainerGetLayerScaleUseCase( + display_object_container, layerScale + ); + const layerScaleX = layerScale[0]; + const layerScaleY = layerScale[1]; + + const layerWidth = Math.ceil(Math.abs(layerBounds[2] - layerBounds[0]) * layerScaleX); + const layerHeight = Math.ceil(Math.abs(layerBounds[3] - layerBounds[1]) * layerScaleY); + if (filterCache) { // キャッシュがあって、変更がなければキャッシュを使用 if (!updated) { renderQueue.push(1, - Math.ceil(Math.abs(layerBounds[2] - layerBounds[0])), - Math.ceil(Math.abs(layerBounds[3] - layerBounds[1])), + layerWidth, layerHeight, 1, 1, display_object_container.instanceId, filterKey, bounds[0], bounds[1], bounds[2], bounds[3], tMatrix[0], tMatrix[1], tMatrix[2], tMatrix[3], layerBounds[0], layerBounds[1], + layerScaleX, layerScaleY, tColorTransform[0], tColorTransform[1], tColorTransform[2], tColorTransform[3], tColorTransform[4], tColorTransform[5], tColorTransform[6], tColorTransform[7] ); @@ -400,23 +425,26 @@ export const execute =

( renderQueue.push( 1, - Math.ceil(Math.abs(layerBounds[2] - layerBounds[0])), - Math.ceil(Math.abs(layerBounds[3] - layerBounds[1])), + layerWidth, layerHeight, 1, 0, display_object_container.instanceId, filterKey, bounds[0], bounds[1], bounds[2], bounds[3], tMatrix[0], tMatrix[1], tMatrix[2], tMatrix[3], layerBounds[0], layerBounds[1], + layerScaleX, layerScaleY, tColorTransform[0], tColorTransform[1], tColorTransform[2], tColorTransform[3], tColorTransform[4], tColorTransform[5], tColorTransform[6], tColorTransform[7], params.length ); renderQueue.set(new Float32Array(params)); - const fa0 = tMatrix[0]; - const fa1 = tMatrix[1]; - const fa2 = tMatrix[2]; - const fa3 = tMatrix[3]; - const faTx = tMatrix[4] - layerBounds[0]; - const faTy = tMatrix[5] - layerBounds[1]; + // 子に渡すtMatrixは layerScale 倍で scale して、layer 内の + // 拡張座標系で描画させる。layer自体は compose時に 1/layerScaleで + // 縮小合成され最終的に元サイズで表示される。 + const fa0 = tMatrix[0] * layerScaleX; + const fa1 = tMatrix[1] * layerScaleX; + const fa2 = tMatrix[2] * layerScaleY; + const fa3 = tMatrix[3] * layerScaleY; + const faTx = (tMatrix[4] - layerBounds[0]) * layerScaleX; + const faTy = (tMatrix[5] - layerBounds[1]) * layerScaleY; if (tMatrix !== matrix) { Matrix.release(tMatrix); @@ -642,6 +670,11 @@ export const execute =

( continue; } + // 自身が filter を発動した、または既に filter layer 内にいる場合は、 + // 子コンテナに伝播して cacheAsBitmap 合成scaleの二重適用を防ぐ + const childInFilterLayer = in_filter_layer + || Boolean(display_object_container.filters && display_object_container.filters.length); + switch (true) { case child.isContainerEnabled: // 0x00 @@ -651,7 +684,8 @@ export const execute =

( tMatrix, tColorTransform, renderer_width, - renderer_height + renderer_height, + childInFilterLayer ); break; diff --git a/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGetLayerScaleUseCase.test.ts b/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGetLayerScaleUseCase.test.ts new file mode 100644 index 00000000..b944338b --- /dev/null +++ b/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGetLayerScaleUseCase.test.ts @@ -0,0 +1,137 @@ +import { execute } from "./DisplayObjectContainerGetLayerScaleUseCase"; +import { Shape } from "../../Shape"; +import { Sprite } from "../../Sprite"; +import { DisplayObjectContainer } from "../../DisplayObjectContainer"; +import { Matrix } from "@next2d/geom"; +import { describe, expect, it } from "vitest"; + +describe("DisplayObjectContainerGetLayerScaleUseCase.ts test", () => +{ + it("子要素がない場合はoutが初期値のまま", () => + { + const container = new DisplayObjectContainer(); + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBe(1); + expect(out[1]).toBe(1); + }); + + it("cacheAsBitmap を持たない子コンテナはoutを変更しない", () => + { + const container = new DisplayObjectContainer(); + const child = new Sprite(); + container.addChild(child); + + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBe(1); + expect(out[1]).toBe(1); + }); + + it("cacheAsBitmap を持つ子コンテナのスケールを反映する", () => + { + const container = new DisplayObjectContainer(); + const child = new Sprite(); + child.cacheAsBitmap = new Matrix(1.5, 0, 0, 2.0, 0, 0); + container.addChild(child); + + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBeCloseTo(1.5, 5); + expect(out[1]).toBeCloseTo(2.0, 5); + }); + + it("複数子の cacheAsBitmap のうち最大値を採用する", () => + { + const container = new DisplayObjectContainer(); + + const childA = new Sprite(); + childA.cacheAsBitmap = new Matrix(1.2, 0, 0, 3.0, 0, 0); + container.addChild(childA); + + const childB = new Sprite(); + childB.cacheAsBitmap = new Matrix(2.5, 0, 0, 1.5, 0, 0); + container.addChild(childB); + + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBeCloseTo(2.5, 5); + expect(out[1]).toBeCloseTo(3.0, 5); + }); + + it("孫のcacheAsBitmapも再帰的に収集する", () => + { + const root = new DisplayObjectContainer(); + const middle = new Sprite(); + root.addChild(middle); + + const leaf = new Sprite(); + leaf.cacheAsBitmap = new Matrix(1.5, 0, 0, 1.5, 0, 0); + middle.addChild(leaf); + + const out = new Float32Array([1, 1]); + execute(root, out); + expect(out[0]).toBeCloseTo(1.5, 5); + expect(out[1]).toBeCloseTo(1.5, 5); + }); + + it("既存のoutの値が大きい場合は上書きしない (max を取る)", () => + { + const container = new DisplayObjectContainer(); + const child = new Sprite(); + child.cacheAsBitmap = new Matrix(1.2, 0, 0, 1.2, 0, 0); + container.addChild(child); + + const out = new Float32Array([2.0, 2.0]); + execute(container, out); + expect(out[0]).toBeCloseTo(2.0, 5); + expect(out[1]).toBeCloseTo(2.0, 5); + }); + + it("非表示 (visible=false) の子はスキップする", () => + { + const container = new DisplayObjectContainer(); + + const hidden = new Sprite(); + hidden.cacheAsBitmap = new Matrix(3.0, 0, 0, 3.0, 0, 0); + hidden.visible = false; + container.addChild(hidden); + + const visibleChild = new Sprite(); + visibleChild.cacheAsBitmap = new Matrix(1.5, 0, 0, 1.5, 0, 0); + container.addChild(visibleChild); + + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBeCloseTo(1.5, 5); + expect(out[1]).toBeCloseTo(1.5, 5); + }); + + it("非Container (Shape) の子はスキップする", () => + { + const container = new DisplayObjectContainer(); + const shape = new Shape(); + container.addChild(shape); + + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBe(1); + expect(out[1]).toBe(1); + }); + + it("cacheAsBitmap に回転成分がある場合も scale 成分を抽出する", () => + { + const container = new DisplayObjectContainer(); + const child = new Sprite(); + // 45度回転 + scale 2 相当: a=cos*2, b=sin*2 ... sqrt(a^2+b^2)=2 + const cos = Math.cos(Math.PI / 4); + const sin = Math.sin(Math.PI / 4); + child.cacheAsBitmap = new Matrix(cos * 2, sin * 2, -sin * 2, cos * 2, 0, 0); + container.addChild(child); + + const out = new Float32Array([1, 1]); + execute(container, out); + expect(out[0]).toBeCloseTo(2, 5); + expect(out[1]).toBeCloseTo(2, 5); + }); +}); diff --git a/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGetLayerScaleUseCase.ts b/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGetLayerScaleUseCase.ts new file mode 100644 index 00000000..766f845d --- /dev/null +++ b/packages/display/src/DisplayObjectContainer/usecase/DisplayObjectContainerGetLayerScaleUseCase.ts @@ -0,0 +1,49 @@ +import type { DisplayObject } from "../../DisplayObject"; +import type { DisplayObjectContainer } from "../../DisplayObjectContainer"; + +/** + * @description コンテナ内部の子孫が描画時に必要とする最大cacheAsBitmapスケールを返却します。 + * 親がfilter/cacheAsBitmap等のレイヤーを作成する際、そのテクスチャの解像度を + * 子孫のcacheScaleに合わせて拡張しないと、描画時にテクスチャ不足で端が欠ける。 + * 戻り値は [scaleX, scaleY] の2要素で、いずれも1以上。 + * Return the maximum cacheAsBitmap scale required by descendants. + * The parent layer texture must reserve this much resolution to avoid + * cropping descendants that render at cacheScale resolution. + * + * @param {DisplayObjectContainer} display_object_container + * @param {Float32Array} out [scaleX, scaleY] を格納するバッファ + * @return {void} + * @method + * @protected + */ +export const execute =

( + display_object_container: P, + out: Float32Array +): void => { + const children = display_object_container.children; + for (let idx = 0; idx < children.length; idx++) { + + const child = children[idx] as DisplayObject; + if (!child || !child.visible) { + continue; + } + + if (child.isContainerEnabled) { + const container = child as DisplayObjectContainer; + const cache = container.cacheAsBitmap; + if (cache) { + const m = cache.rawData; + const csx = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + const csy = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (csx > out[0]) { + out[0] = csx; + } + if (csy > out[1]) { + out[1] = csy; + } + } + // 孫以下にも cacheAsBitmap がある可能性があるため再帰 + execute(container, out); + } + } +}; diff --git a/packages/display/src/Graphics/service/GraphicsToNumberArrayService.ts b/packages/display/src/Graphics/service/GraphicsToNumberArrayService.ts index 2dd35dda..3dcc694e 100644 --- a/packages/display/src/Graphics/service/GraphicsToNumberArrayService.ts +++ b/packages/display/src/Graphics/service/GraphicsToNumberArrayService.ts @@ -123,7 +123,7 @@ export const execute = (recodes : any[] | null): any[] => { const type: IGradientType = recodes[idx++]; const stops: IColorStop[] = recodes[idx++]; - const matrix: Float32Array = recodes[idx++]; + const matrix: ArrayLike = recodes[idx++]; const spread: ISpreadMethod = recodes[idx++]; const interpolation: IInterpolationMethod = recodes[idx++]; const focal: number = recodes[idx++]; @@ -146,7 +146,12 @@ export const execute = (recodes : any[] | null): any[] => ); } - array.push(...matrix); + // JSON由来のデシリアライズではFloat32Arrayがkeyed object + // ({0:v,...,5:v})になるためspreadではなくindexアクセスで読む + array.push( + matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5] + ); switch (spread) { @@ -225,7 +230,7 @@ export const execute = (recodes : any[] | null): any[] => const type: IGradientType = recodes[idx++]; const stops: IColorStop[] = recodes[idx++]; - const matrix: Float32Array = recodes[idx++]; + const matrix: ArrayLike = recodes[idx++]; const spread: ISpreadMethod = recodes[idx++]; const interpolation: IInterpolationMethod = recodes[idx++]; const focal: number = recodes[idx++]; @@ -244,7 +249,12 @@ export const execute = (recodes : any[] | null): any[] => ); } - array.push(...matrix); + // JSON由来のデシリアライズではFloat32Arrayがkeyed object + // ({0:v,...,5:v})になるためspreadではなくindexアクセスで読む + array.push( + matrix[0], matrix[1], matrix[2], + matrix[3], matrix[4], matrix[5] + ); switch (spread) { diff --git a/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.test.ts b/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.test.ts index 5b75a1e9..4328ad4f 100644 --- a/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.test.ts +++ b/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.test.ts @@ -137,6 +137,8 @@ describe("DisplayObjectContainerRenderUseCase.js test", () => { data.push(-10, -10, 110, 110); // matrix (6) data.push(1, 0, 0, 1, 0, 0); + // layerScaleX, layerScaleY (2) + data.push(1, 1); // colorTransform (8) data.push(1, 1, 1, 1, 0, 0, 0, 0); diff --git a/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.ts b/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.ts index fa08b0c9..d314f72b 100644 --- a/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.ts +++ b/packages/renderer/src/DisplayObjectContainer/usecase/DisplayObjectContainerRenderUseCase.ts @@ -46,6 +46,9 @@ export const execute = ( let filterParams: Float32Array | null = null; let matrix: Float32Array | null = null; let colorTransform: Float32Array | null = null; + // filter layer内部スケール (子孫のcacheAsBitmap最大値)。compose時に 1/layerScaleで縮小合成する。 + let layerScaleX = 1; + let layerScaleY = 1; if (useLayer) { layerWidth = render_queue[index++]; @@ -113,6 +116,9 @@ export const execute = ( matrix = render_queue.subarray(index, index + 6); index += 6; + // layerScale (HIT時は合成時のscale補正には未使用) + index += 2; + colorTransform = render_queue.subarray(index, index + 8); index += 8; @@ -130,6 +136,9 @@ export const execute = ( matrix = render_queue.subarray(index, index + 6); index += 6; + layerScaleX = render_queue[index++]; + layerScaleY = render_queue[index++]; + colorTransform = render_queue.subarray(index, index + 8); index += 8; @@ -331,7 +340,8 @@ export const execute = ( $context.containerEndLayer( blendMode, matrix!, colorTransform, useFilter, filterBounds, filterParams, - uniqueKey, filterKey + uniqueKey, filterKey, + layerScaleX, layerScaleY ); } diff --git a/packages/webgl/src/AtlasManager.ts b/packages/webgl/src/AtlasManager.ts index 02b9ae96..d15eddfa 100644 --- a/packages/webgl/src/AtlasManager.ts +++ b/packages/webgl/src/AtlasManager.ts @@ -29,17 +29,19 @@ export const $setAtlasAttachmentObject = (attachment_object: IAttachmentObject): export const $getAtlasAttachmentObject = (): IAttachmentObject => { - if (!($activeAtlasIndex in $atlasAttachmentObjects)) { - $setAtlasAttachmentObject( - frameBufferManagerGetAttachmentObjectUseCase($RENDER_MAX_SIZE, $RENDER_MAX_SIZE, true) + let attachmentObject = $atlasAttachmentObjects[$activeAtlasIndex]; + if (!attachmentObject) { + attachmentObject = frameBufferManagerGetAttachmentObjectUseCase( + $RENDER_MAX_SIZE, $RENDER_MAX_SIZE, true ); + $atlasAttachmentObjects[$activeAtlasIndex] = attachmentObject; } - return $atlasAttachmentObjects[$activeAtlasIndex]; + return attachmentObject; }; export const $hasAtlasAttachmentObject = (): boolean => { - return $activeAtlasIndex in $atlasAttachmentObjects; + return !!$atlasAttachmentObjects[$activeAtlasIndex]; }; export const $rootNodes: TexturePacker[] = []; @@ -58,15 +60,17 @@ const $transferBounds: Float32Array[] = []; export const $getActiveTransferBounds = (index: number): Float32Array => { - if (!(index in $transferBounds)) { - $transferBounds[index] = new Float32Array([ + let bounds = $transferBounds[index]; + if (!bounds) { + bounds = new Float32Array([ $MAX_VALUE, $MAX_VALUE, $MIN_VALUE, $MIN_VALUE ]); + $transferBounds[index] = bounds; } - return $transferBounds[index]; + return bounds; }; export const $clearTransferBounds = (): void => diff --git a/packages/webgl/src/Context.ts b/packages/webgl/src/Context.ts index f53b295d..31b68a61 100644 --- a/packages/webgl/src/Context.ts +++ b/packages/webgl/src/Context.ts @@ -502,12 +502,15 @@ export class Context filter_bounds: Float32Array | null, filter_params: Float32Array | null, unique_key: string, - filter_key: string + filter_key: string, + layer_scale_x: number = 1, + layer_scale_y: number = 1 ): void { contextContainerEndLayerUseCase( blend_mode, matrix, color_transform, use_filter, filter_bounds, filter_params, - unique_key, filter_key + unique_key, filter_key, + layer_scale_x, layer_scale_y ); } diff --git a/packages/webgl/src/Context/usecase/ContextContainerEndLayerUseCase.ts b/packages/webgl/src/Context/usecase/ContextContainerEndLayerUseCase.ts index e215fcdf..f5888bad 100644 --- a/packages/webgl/src/Context/usecase/ContextContainerEndLayerUseCase.ts +++ b/packages/webgl/src/Context/usecase/ContextContainerEndLayerUseCase.ts @@ -55,7 +55,11 @@ export const execute = ( filter_bounds: Float32Array | null, filter_params: Float32Array | null, unique_key: string, - filter_key: string + filter_key: string, + // layer_scale は display 側で layer サイズに反映済み。 + // compose時は layer 全体を等倍でmainに貼るので直接は参照しない。 + _layer_scale_x: number = 1, + _layer_scale_y: number = 1 ): void => { // 一時アタッチメントへの描画をフラッシュ @@ -228,6 +232,11 @@ export const execute = ( } } + // issue #274: layer は layerScale 倍解像度で確保されており、 + // 子孫のcacheAsBitmap子は既にその倍解像度でlayer内に収まっている。 + // cacheAsBitmap の仕様としてスクリーン上も cacheScale 倍のサイズで + // 表示されるため、ここでの縮小は行わずそのまま main に合成する。 + // キャッシュに保存 if (unique_key) { $cacheStore.set(unique_key, "fKey", filter_key); @@ -268,6 +277,7 @@ export const execute = ( $context.bind($context.$mainAttachmentObject as IAttachmentObject); if (textureObject) { + // cacheAsBitmap と同様、layer は layerScale 倍解像度のままmainに合成する $context.reset(); $context.globalCompositeOperation = blend_mode; blendDrawFilterToMainUseCase( diff --git a/packages/webgl/src/Mesh.ts b/packages/webgl/src/Mesh.ts index 07629b0f..67bb0d53 100644 --- a/packages/webgl/src/Mesh.ts +++ b/packages/webgl/src/Mesh.ts @@ -73,7 +73,9 @@ export const $addFillBuffer = (buffer: Float32Array): void => const length = buffer.length + $fillBufferOffset; if (length > $fillBuffer.length) { const newBuffer = new Float32Array($upperPowerOfTwo(length)); - newBuffer.set($fillBuffer); + if ($fillBufferOffset > 0) { + newBuffer.set($fillBuffer.subarray(0, $fillBufferOffset)); + } newBuffer.set(buffer, $fillBufferOffset); $fillBuffer = newBuffer; diff --git a/packages/webgl/src/TextureManager/service/TextureManagerBindService.ts b/packages/webgl/src/TextureManager/service/TextureManagerBindService.ts index 2c449121..8271d429 100644 --- a/packages/webgl/src/TextureManager/service/TextureManagerBindService.ts +++ b/packages/webgl/src/TextureManager/service/TextureManagerBindService.ts @@ -25,15 +25,19 @@ export const execute = ( smooth: boolean = false ): void => { - if ($activeTextureUnit === -1 || unit !== $activeTextureUnit) { + if ($activeTextureUnit !== unit) { $setActiveTextureUnit(unit); $gl.activeTexture(unit); } - const boundTextures = $boundTextures[index]; - if (boundTextures !== null && texture_object !== null - && boundTextures.id === texture_object.id - || texture_object === boundTextures + const boundTexture = $boundTextures[index]; + if (boundTexture === texture_object) { + // Same reference, already bound to this unit. + return; + } + if (boundTexture !== null + && texture_object !== null + && boundTexture.id === texture_object.id ) { return; } @@ -43,7 +47,8 @@ export const execute = ( if (texture_object && texture_object.smooth !== smooth) { texture_object.smooth = smooth; - $gl.texParameteri($gl.TEXTURE_2D, $gl.TEXTURE_MIN_FILTER, smooth ? $gl.LINEAR : $gl.NEAREST); - $gl.texParameteri($gl.TEXTURE_2D, $gl.TEXTURE_MAG_FILTER, smooth ? $gl.LINEAR : $gl.NEAREST); + const filter = smooth ? $gl.LINEAR : $gl.NEAREST; + $gl.texParameteri($gl.TEXTURE_2D, $gl.TEXTURE_MIN_FILTER, filter); + $gl.texParameteri($gl.TEXTURE_2D, $gl.TEXTURE_MAG_FILTER, filter); } }; \ No newline at end of file diff --git a/packages/webgl/src/TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase.ts b/packages/webgl/src/TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase.ts index f3ec47e7..adc33407 100644 --- a/packages/webgl/src/TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase.ts +++ b/packages/webgl/src/TextureManager/usecase/TextureManagerReleaseTextureObjectUseCase.ts @@ -1,5 +1,6 @@ import type { ITextureObject } from "../../interface/ITextureObject"; import { $gl } from "../../WebGLUtil"; +import { $boundTextures } from "../../TextureManager"; /** * @description TextureObjectをオブジェクトプールに保管、サイズオーバー時は削除します。 @@ -12,5 +13,10 @@ import { $gl } from "../../WebGLUtil"; */ export const execute = (texture_object: ITextureObject): void => { + for (let idx = 0; idx < $boundTextures.length; ++idx) { + if ($boundTextures[idx] === texture_object) { + $boundTextures[idx] = null; + } + } $gl.deleteTexture(texture_object.resource); }; diff --git a/packages/webgpu/src/AtlasManager.ts b/packages/webgpu/src/AtlasManager.ts index f53c9050..520e6ad9 100644 --- a/packages/webgpu/src/AtlasManager.ts +++ b/packages/webgpu/src/AtlasManager.ts @@ -102,15 +102,15 @@ export const $setAtlasCreator = (creator: AtlasCreator): void => */ export const $getAtlasAttachmentObject = (): IAttachmentObject | null => { - if (!($activeAtlasIndex in $atlasAttachmentObjects)) { - if ($atlasCreator) { - const attachment = $atlasCreator($activeAtlasIndex); - $setAtlasAttachmentObject(attachment); - } else { + let attachment = $atlasAttachmentObjects[$activeAtlasIndex]; + if (!attachment) { + if (!$atlasCreator) { return null; } + attachment = $atlasCreator($activeAtlasIndex); + $setAtlasAttachmentObject(attachment); } - return $atlasAttachmentObjects[$activeAtlasIndex]; + return attachment; }; /** @@ -121,10 +121,7 @@ export const $getAtlasAttachmentObject = (): IAttachmentObject | null => */ export const $getAtlasAttachmentObjectByIndex = (index: number): IAttachmentObject | null => { - if (!(index in $atlasAttachmentObjects)) { - return null; - } - return $atlasAttachmentObjects[index]; + return $atlasAttachmentObjects[index] ?? null; }; /** @@ -149,15 +146,17 @@ const $transferBounds: Float32Array[] = []; */ export const $getActiveTransferBounds = (index: number): Float32Array => { - if (!(index in $transferBounds)) { - $transferBounds[index] = new Float32Array([ + let bounds = $transferBounds[index]; + if (!bounds) { + bounds = new Float32Array([ $MAX_VALUE, $MAX_VALUE, $MIN_VALUE, $MIN_VALUE ]); + $transferBounds[index] = bounds; } - return $transferBounds[index]; + return bounds; }; /** diff --git a/packages/webgpu/src/Context.ts b/packages/webgpu/src/Context.ts index 20927001..508293c0 100644 --- a/packages/webgpu/src/Context.ts +++ b/packages/webgpu/src/Context.ts @@ -2522,7 +2522,9 @@ export class Context filter_bounds: Float32Array | null, filter_params: Float32Array | null, unique_key: string, - filter_key: string + filter_key: string, + layer_scale_x: number = 1, + layer_scale_y: number = 1 ): void { this.drawArraysInstanced(); @@ -2558,7 +2560,9 @@ export class Context contentSize.width, contentSize.height, this.$filterConfig, - this.bufferManager + this.bufferManager, + layer_scale_x, + layer_scale_y ); // メインのアタッチメントをバインド diff --git a/packages/webgpu/src/Context/usecase/ContextContainerEndLayerUseCase.ts b/packages/webgpu/src/Context/usecase/ContextContainerEndLayerUseCase.ts index 8ad48391..0108fe43 100644 --- a/packages/webgpu/src/Context/usecase/ContextContainerEndLayerUseCase.ts +++ b/packages/webgpu/src/Context/usecase/ContextContainerEndLayerUseCase.ts @@ -674,7 +674,11 @@ export const execute = ( _content_width: number, _content_height: number, config: ILocalFilterConfig, - buffer_manager: BufferManager + buffer_manager: BufferManager, + // TODO: WebGPU版でも layer_scale による 1/layerScale 縮小合成に対応する。 + // 現状はWebGL版のみで動作、WebGPU版は従来通り layer_scale=1 として合成される。 + _layer_scale_x: number = 1, + _layer_scale_y: number = 1 ): void => { if (use_filter && matrix && filter_bounds && params) { diff --git a/packages/webgpu/src/Context/usecase/ContextDrawArraysInstancedUseCase.ts b/packages/webgpu/src/Context/usecase/ContextDrawArraysInstancedUseCase.ts index bd0051b4..767d44c5 100644 --- a/packages/webgpu/src/Context/usecase/ContextDrawArraysInstancedUseCase.ts +++ b/packages/webgpu/src/Context/usecase/ContextDrawArraysInstancedUseCase.ts @@ -14,15 +14,20 @@ import { import { $getAtlasAttachmentObject } from "../../AtlasManager"; /** - * @description キャッシュ済みバインドグループ - * Cached bind group + * @description atlasViewをキーにしたBindGroupキャッシュ。複数アトラスを + * 交互に描画してもヒットする。textureが破棄されたら自動GC。 + * BindGroup cache keyed by atlas view. Survives multi-atlas + * switching; entries are GC'd when the texture view is released. */ -let $cachedBindGroup: GPUBindGroup | null = null; +let $bindGroupCache: WeakMap = new WeakMap(); /** - * @description キャッシュ済みアトラステクスチャビュー - * Cached atlas texture view + * @description キャッシュの整合性ガード。samplerまたはbindGroupLayoutが + * 切り替わった場合は全エントリを無効化する。 + * Invalidates the entire cache when the sampler or bind + * group layout changes. */ -let $cachedAtlasView: GPUTextureView | null = null; +let $cachedSampler: GPUSampler | null = null; +let $cachedLayout: GPUBindGroupLayout | null = null; /** * @description ブレンドモードに応じたインスタンスパイプライン名を返す @@ -176,10 +181,17 @@ export const execute = ( return null; } - // BindGroupキャッシュ: アトラスのテクスチャビューが同じなら再利用 + // BindGroupキャッシュ: atlasView毎にBindGroupを保持。sampler/layoutが + // 切り替わった場合はキャッシュをクリアして整合性を保つ。 const atlasView = atlasAttachment.texture!.view; - if (!$cachedBindGroup || $cachedAtlasView !== atlasView) { - $cachedBindGroup = device.createBindGroup({ + if ($cachedSampler !== sampler || $cachedLayout !== bindGroupLayout) { + $bindGroupCache = new WeakMap(); + $cachedSampler = sampler; + $cachedLayout = bindGroupLayout; + } + let bindGroup = $bindGroupCache.get(atlasView); + if (!bindGroup) { + bindGroup = device.createBindGroup({ "layout": bindGroupLayout, "entries": [ { @@ -192,13 +204,13 @@ export const execute = ( } ] }); - $cachedAtlasView = atlasView; + $bindGroupCache.set(atlasView, bindGroup); } // 描画 passEncoder.setVertexBuffer(0, vertexBuffer); passEncoder.setVertexBuffer(1, instanceBuffer); - passEncoder.setBindGroup(0, $cachedBindGroup); + passEncoder.setBindGroup(0, bindGroup); passEncoder.draw(6, shaderManager.count, 0, 0); // レンダーパスを終了 diff --git a/src/index.ts b/src/index.ts index dec5f198..addc578a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,7 +3,7 @@ import { Next2D } from "@next2d/core"; if (!("next2d" in window)) { - console.log("%c Next2D Player %c 3.1.0 %c https://next2d.app", + console.log("%c Next2D Player %c 3.2.0 %c https://next2d.app", "color: #fff; background: #5f5f5f", "color: #fff; background: #4bc729", "");