diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 018a8703b..9dca5d0ae 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -47,29 +47,45 @@ jobs: run: cat /tmp/preview.log || true if: always() - - name: Upload Playwright report - uses: actions/upload-artifact@v4 - if: failure() - with: - name: playwright-report - path: tests/e2e/playwright-report/ - retention-days: 3 + - name: Check for Chromatic Storybook project token + id: chromatic-storybook-check + shell: bash + run: | + if [ "${{ secrets.CHROMATIC_STORYBOOK_PROJECT_TOKEN }}" != '' ]; then + echo "available=true" >> $GITHUB_OUTPUT; + else + echo "available=false" >> $GITHUB_OUTPUT; + fi - - name: Check for Chromatic project token - id: chromatic-check + - name: Check for Chromatic Playwright project token + id: chromatic-playwright-check shell: bash run: | - if [ "${{ secrets.CHROMATIC_PROJECT_TOKEN }}" != '' ]; then + if [ "${{ secrets.CHROMATIC_PLAYWRIGHT_PROJECT_TOKEN }}" != '' ]; then echo "available=true" >> $GITHUB_OUTPUT; else echo "available=false" >> $GITHUB_OUTPUT; fi - - name: Publish to Chromatic - uses: chromaui/action@v11 + - name: Publish Playwright to Chromatic + id: chromatic-playwright + uses: chromaui/action@latest + with: + playwright: true + projectToken: ${{ secrets.CHROMATIC_PLAYWRIGHT_PROJECT_TOKEN }} + workingDir: tests/e2e/ + env: + CHROMATIC_ARCHIVE_LOCATION: ./test-results-drupal + if: + ${{steps.chromatic-playwright-check.outputs.available == 'true' && + (success() || failure()) }} + + - name: Publish Storybook to Chromatic + id: chromatic-storybook + uses: chromaui/action@latest with: token: ${{ secrets.GITHUB_TOKEN }} - projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + projectToken: ${{ secrets.CHROMATIC_STORYBOOK_PROJECT_TOKEN }} storybookBuildDir: packages/ui/storybook-static storybookBaseDir: packages/ui onlyChanged: true @@ -77,7 +93,7 @@ jobs: externals: | static/stories/webforms/** if: - ${{ steps.chromatic-check.outputs.available == 'true' && + ${{ steps.chromatic-storybook-check.outputs.available == 'true' && github.ref != 'refs/heads/dev' }} - name: Deploy storybook to netlify diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11d3d1568..b0fa33450 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -790,6 +790,9 @@ importers: '@amazeelabs/save-webpage': specifier: ^1.1.1 version: 1.1.1 + '@chromatic-com/playwright': + specifier: ^0.10.1 + version: 0.10.1(@playwright/test@1.44.1)(esbuild@0.20.2)(typescript@5.6.3) '@custom/eslint-config': specifier: workspace:* version: link:../../packages/eslint-config @@ -799,6 +802,9 @@ importers: '@types/node': specifier: ^18 version: 18.0.0 + chromatic: + specifier: ^11.20.0 + version: 11.20.0(@chromatic-com/playwright@0.10.1) typescript: specifier: ^5.3.3 version: 5.6.3 @@ -2746,6 +2752,40 @@ packages: resolution: {integrity: sha512-snXIGNiZpqjno3XYQN2lbBB+05hsQR/LSttbtIW1c0gmZ7Kh/DIo0YrxlDxCDulAMFPFM8J+4voLwvYepSj3sw==} hasBin: true + /@chromatic-com/playwright@0.10.1(@playwright/test@1.44.1)(esbuild@0.20.2)(typescript@5.6.3): + resolution: {integrity: sha512-8+SCVHd4G85h21Cw1zIJFcseWwti1XhqXKtMMVsGOez6V0bvMjn+xvVcnGhLmlZmVdTDLwwSjmzzXmQWm+FaPw==} + hasBin: true + peerDependencies: + '@playwright/test': ^1.0.0 + dependencies: + '@chromaui/rrweb-snapshot': 2.0.0-alpha.17-noAbsolute + '@playwright/test': 1.44.1 + '@segment/analytics-node': 1.3.0 + '@storybook/addon-essentials': 8.3.3(storybook@8.3.3) + '@storybook/csf': 0.1.11 + '@storybook/manager-api': 8.3.3(storybook@8.3.3) + '@storybook/server-webpack5': 8.4.6(esbuild@0.20.2)(storybook@8.3.3)(typescript@5.6.3) + storybook: 8.3.3 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - bufferutil + - encoding + - esbuild + - supports-color + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + dev: true + + /@chromaui/rrweb-snapshot@2.0.0-alpha.17-noAbsolute: + resolution: {integrity: sha512-8jV8EyLA6s8mLGy+eLLGlve7BEjzdnyrJDBu34D405eYUtazzyP+cG4nOvylYyfR+/RkUhJ/GXeB+hbg8au62A==} + dependencies: + postcss: 8.4.49 + dev: true + /@cloudinary/transformation-builder-sdk@1.13.3: resolution: {integrity: sha512-tBMpjcwBjUgINGm2lKodb1fe32yBeq2KTSD7TrrFPm2/dQOb7lKmVuDaDe89IPcV+QZbb1JY/ZWL9pZjUV4aKw==} dependencies: @@ -5928,11 +5968,23 @@ packages: requiresBuild: true optional: true + /@lukeed/csprng@1.1.0: + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + dev: true + /@lukeed/ms@2.0.2: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} dev: false + /@lukeed/uuid@2.0.1: + resolution: {integrity: sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==} + engines: {node: '>=8'} + dependencies: + '@lukeed/csprng': 1.1.0 + dev: true + /@mapbox/hast-util-table-cell-style@0.2.1: resolution: {integrity: sha512-LyQz4XJIdCdY/+temIhD/Ed0x/p4GAOUycpFSEK2Ads1CPKZy6b7V/2ROEtQiLLQ8soIs0xe/QAoR6kwpyW/yw==} engines: {node: '>=12'} @@ -7577,6 +7629,35 @@ packages: /@rtsao/scc@1.1.0: resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + /@segment/analytics-core@1.4.1: + resolution: {integrity: sha512-kV0Pf33HnthuBOVdYNani21kYyj118Fn+9757bxqoksiXoZlYvBsFq6giNdCsKcTIE1eAMqNDq3xE1VQ0cfsHA==} + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-generic-utils': 1.1.1 + dset: 3.1.3 + tslib: 2.8.1 + dev: true + + /@segment/analytics-generic-utils@1.1.1: + resolution: {integrity: sha512-THTIzBPHnvu1HYJU3fARdJ3qIkukO3zDXsmDm+kAeUks5R9CBXOQ6rPChiASVzSmwAIIo5uFIXXnCraojlq/Gw==} + dependencies: + tslib: 2.8.1 + dev: true + + /@segment/analytics-node@1.3.0: + resolution: {integrity: sha512-lRLz1WZaDokMoUe299yP5JkInc3OgJuqNNlxb6j0q22umCiq6b5iDo2gRmFn93reirIvJxWIicQsGrHd93q8GQ==} + engines: {node: '>=14'} + dependencies: + '@lukeed/uuid': 2.0.1 + '@segment/analytics-core': 1.4.1 + '@segment/analytics-generic-utils': 1.1.1 + buffer: 6.0.3 + node-fetch: 2.7.0 + tslib: 2.8.1 + transitivePeerDependencies: + - encoding + dev: true + /@sideway/address@4.1.5: resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} dependencies: @@ -7923,6 +8004,50 @@ packages: - supports-color dev: true + /@storybook/builder-webpack5@8.4.6(esbuild@0.20.2)(storybook@8.3.3)(typescript@5.6.3): + resolution: {integrity: sha512-/ZInCFk2myJZinnAU05bATe+9iJn3+YRoxl+CUpYljxzsjoqb7iAwaNaMNolZCDOnMj24Kg2Pt87WtzAhu+ilw==} + peerDependencies: + storybook: ^8.4.6 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/core-webpack': 8.4.6(storybook@8.3.3) + '@types/node': 22.9.0 + '@types/semver': 7.5.8 + browser-assert: 1.2.1 + case-sensitive-paths-webpack-plugin: 2.4.0 + cjs-module-lexer: 1.2.3 + constants-browserify: 1.0.0 + css-loader: 6.11.0(webpack@5.91.0) + es-module-lexer: 1.5.0 + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.6.3)(webpack@5.91.0) + html-webpack-plugin: 5.6.3(webpack@5.91.0) + magic-string: 0.30.13 + path-browserify: 1.0.1 + process: 0.11.10 + semver: 7.6.3 + storybook: 8.3.3 + style-loader: 3.3.4(webpack@5.91.0) + terser-webpack-plugin: 5.3.10(esbuild@0.20.2)(webpack@5.91.0) + ts-dedent: 2.2.0 + typescript: 5.6.3 + url: 0.11.3 + util: 0.12.5 + util-deprecate: 1.0.2 + webpack: 5.91.0(esbuild@0.20.2) + webpack-dev-middleware: 6.1.3(webpack@5.91.0) + webpack-hot-middleware: 2.26.1 + webpack-virtual-modules: 0.6.1 + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - esbuild + - uglify-js + - webpack-cli + dev: true + /@storybook/channels@8.0.8: resolution: {integrity: sha512-L3EGVkabv3fweXnykD/GlNUDO5HtwlIfSovC7BF4MmP7662j2/eqlZrJxDojGtbv11XHjWp/UJHUIfKpcHXYjQ==} dependencies: @@ -7947,6 +8072,14 @@ packages: storybook: 8.3.3 dev: true + /@storybook/components@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-9tKSJJCyFT5RZMRGyozTBJkr9C9Yfk1nuOE9XbDEE1Z+3/IypKR9+iwc5mfNBStDNY+rxtYWNLKBb5GPR2yhzA==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.3.3 + dev: true + /@storybook/core-common@8.0.8: resolution: {integrity: sha512-CL15M2oeQW+Rb1l7ciunLDI2Re+ojL2lX1ZFAiDedcOU+JHsdq43zAuXoZVzp8icUi2AUSwEjZIxGCSingj+JQ==} dependencies: @@ -7989,6 +8122,16 @@ packages: ts-dedent: 2.2.0 dev: true + /@storybook/core-webpack@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-5NE4pUy0iHKc8UKHm7A7SikxSMOO92udl7kcBUlQKwcAgrAk1rFpvfXGodDb48AVgfK+07qAOSjBm7GcZ7X1jw==} + peerDependencies: + storybook: ^8.4.6 + dependencies: + '@types/node': 22.9.0 + storybook: 8.3.3 + ts-dedent: 2.2.0 + dev: true + /@storybook/core@8.3.3: resolution: {integrity: sha512-pmf2bP3fzh45e56gqOuBT8sDX05hGdUKIZ/hcI84d5xmd6MeHiPW8th2v946wCHcxHzxib2/UU9vQUh+mB4VNw==} dependencies: @@ -8076,10 +8219,34 @@ packages: storybook: 8.3.3 dev: true + /@storybook/manager-api@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-TsXlQ5m5rTl2KNT9icPFyy822AqXrx1QplZBt/L7cFn7SpqQKDeSta21FH7MG0piAvzOweXebVSqKngJ6cCWWQ==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.3.3 + dev: true + /@storybook/node-logger@8.0.8: resolution: {integrity: sha512-ymps3MMTxtMWq0eDiXk1iO7iv0Eg0PuUvOpPPohEJauGzU9THv81xx01aaHKSprFFJYD2LMQr1aFuUplItO12g==} dev: true + /@storybook/preset-server-webpack@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-N1cKsMcOoSlhaXyp/2+sURcTup2KBDU+GlNPCnEXdUuV+grOHrx1UwZSIbA2lyCU8j8cXjUUYJjnjISLeZqIPw==} + engines: {node: '>=18.0.0'} + peerDependencies: + storybook: ^8.4.6 + dependencies: + '@storybook/core-webpack': 8.4.6(storybook@8.3.3) + '@storybook/global': 5.0.0 + '@storybook/server': 8.4.6(storybook@8.3.3) + '@types/node': 22.9.0 + safe-identifier: 0.4.2 + storybook: 8.3.3 + ts-dedent: 2.2.0 + yaml-loader: 0.8.1 + dev: true + /@storybook/preview-api@8.3.3(storybook@8.3.3): resolution: {integrity: sha512-GP2QlaF3BBQGAyo248N7549YkTQjCentsc1hUvqPnFWU4xfjkejbnFk8yLaIw0VbYbL7jfd7npBtjZ+6AnphMQ==} peerDependencies: @@ -8088,6 +8255,14 @@ packages: storybook: 8.3.3 dev: true + /@storybook/preview-api@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-LbD+lR1FGvWaJBXteVx5xdgs1x1D7tyidBg2CsW2ex+cP0iJ176JgjPfutZxlWOfQnhfRYNnJ3WKoCIfxFOTKA==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.3.3 + dev: true + /@storybook/react-dom-shim@8.3.3(react-dom@18.2.0)(react@18.2.0)(storybook@8.3.3): resolution: {integrity: sha512-0dPC9K7+K5+X/bt3GwYmh+pCpisUyKVjWsI+PkzqGnWqaXFakzFakjswowIAIO1rf7wYZR591x3ehUAyL2bJiQ==} peerDependencies: @@ -8173,6 +8348,43 @@ packages: util-deprecate: 1.0.2 dev: true + /@storybook/server-webpack5@8.4.6(esbuild@0.20.2)(storybook@8.3.3)(typescript@5.6.3): + resolution: {integrity: sha512-/LZ6lFFuqnGACGltDXowFPCwlSeIyduvwprhDgm5KsY/AAxDxOJHYfbDdDw9ILPyeWm/LrVToCt8xrIsS4/X7g==} + engines: {node: '>=18.0.0'} + peerDependencies: + storybook: ^8.4.6 + dependencies: + '@storybook/builder-webpack5': 8.4.6(esbuild@0.20.2)(storybook@8.3.3)(typescript@5.6.3) + '@storybook/preset-server-webpack': 8.4.6(storybook@8.3.3) + '@storybook/server': 8.4.6(storybook@8.3.3) + '@types/node': 22.9.0 + storybook: 8.3.3 + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - esbuild + - typescript + - uglify-js + - webpack-cli + dev: true + + /@storybook/server@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-UGZZR9j+Rdrr4vCmv5aLdPT3mm6xEgcRm/EqXS+sHXlFp8p+R21e+1lGMh0djghcj0QFp4T6xNYdDxJ2Rwut+A==} + engines: {node: '>=18.0.0'} + peerDependencies: + storybook: ^8.4.6 + dependencies: + '@storybook/components': 8.4.6(storybook@8.3.3) + '@storybook/csf': 0.1.11 + '@storybook/global': 5.0.0 + '@storybook/manager-api': 8.4.6(storybook@8.3.3) + '@storybook/preview-api': 8.4.6(storybook@8.3.3) + '@storybook/theming': 8.4.6(storybook@8.3.3) + storybook: 8.3.3 + ts-dedent: 2.2.0 + yaml: 2.4.1 + dev: true + /@storybook/test-runner@0.19.1(@types/node@18.15.3)(storybook@8.3.3): resolution: {integrity: sha512-Nc4djXw3Lv3AAXg6TJ7yVTeuMryjMsTDd8GCbE/PStU602rpe8syEqElz78GPoJqB1VYWQ3T9pcu93MKyHT+xQ==} engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -8237,6 +8449,14 @@ packages: storybook: 8.3.3 dev: true + /@storybook/theming@8.4.6(storybook@8.3.3): + resolution: {integrity: sha512-q7vDPN/mgj7cXIVQ9R1/V75hrzNgKkm2G0LjMo57//9/djQ+7LxvBsR1iScbFIRSEqppvMiBFzkts+2uXidySA==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + dependencies: + storybook: 8.3.3 + dev: true + /@storybook/types@8.0.8: resolution: {integrity: sha512-NGsgCsXnWlaZmHenHDgHGs21zhweZACkqTNsEQ7hvsiF08QeiKAdgJLQg3YeGK73h9mFDRP9djprUtJYab6vnQ==} dependencies: @@ -8944,7 +9164,7 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.56.7 + '@types/eslint': 9.6.1 '@types/estree': 1.0.6 /@types/eslint@7.29.0: @@ -8953,18 +9173,11 @@ packages: '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 - /@types/eslint@8.56.7: - resolution: {integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==} - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - /@types/eslint@9.6.1: resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} dependencies: '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 - dev: true /@types/eslint__js@8.42.3: resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} @@ -9063,6 +9276,10 @@ packages: hoist-non-react-statics: 3.3.2 dev: false + /@types/html-minifier-terser@6.1.0: + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + dev: true + /@types/http-cache-semantics@4.0.4: resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} @@ -11033,6 +11250,15 @@ packages: dependencies: acorn: 8.11.3 + /acorn-import-assertions@1.9.0(acorn@8.14.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + deprecated: package has been renamed to acorn-import-attributes + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.14.0 + dev: true + /acorn-import-attributes@1.9.5(acorn@8.11.3): resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -11171,7 +11397,6 @@ packages: optional: true dependencies: ajv: 8.12.0 - dev: false /ajv-formats@3.0.1(ajv@8.12.0): resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} @@ -11198,7 +11423,6 @@ packages: dependencies: ajv: 8.12.0 fast-deep-equal: 3.1.3 - dev: false /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -12498,7 +12722,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -12663,7 +12886,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.8.1 /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} @@ -12707,6 +12930,11 @@ packages: tslib: 2.6.2 upper-case-first: 2.0.2 + /case-sensitive-paths-webpack-plugin@2.4.0: + resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} + engines: {node: '>=4'} + dev: true + /ccount@1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} dev: false @@ -12945,6 +13173,21 @@ packages: engines: {node: '>=10'} dev: false + /chromatic@11.20.0(@chromatic-com/playwright@0.10.1): + resolution: {integrity: sha512-Btdli1qoAI01UKmk3Iqe6vKhAhePRXqNI/2uKKy2R16q7SN/5kLTqhd1JI20LFOZSnH3xSJaUXeJ2xZOJB//3A==} + hasBin: true + peerDependencies: + '@chromatic-com/cypress': ^0.*.* || ^1.0.0 + '@chromatic-com/playwright': ^0.*.* || ^1.0.0 + peerDependenciesMeta: + '@chromatic-com/cypress': + optional: true + '@chromatic-com/playwright': + optional: true + dependencies: + '@chromatic-com/playwright': 0.10.1(@playwright/test@1.44.1)(esbuild@0.20.2)(typescript@5.6.3) + dev: true + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -12981,6 +13224,13 @@ packages: static-extend: 0.1.2 dev: false + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + /clean-deep@3.4.0: resolution: {integrity: sha512-Lo78NV5ItJL/jl+B5w0BycAisaieJGXK1qYi/9m4SjR8zbqmrUtO7Yhro40wEShGmmxs/aJLI/A+jNhdkXK8mw==} engines: {node: '>=4'} @@ -13296,6 +13546,11 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -13468,6 +13723,10 @@ packages: tslib: 2.6.2 upper-case: 2.0.2 + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + /content-disposition@0.5.2: resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} engines: {node: '>= 0.6'} @@ -13857,6 +14116,29 @@ packages: semver: 7.6.3 webpack: 5.91.0 + /css-loader@6.11.0(webpack@5.91.0): + resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} + engines: {node: '>= 12.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + dependencies: + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.49) + postcss-modules-scope: 3.2.0(postcss@8.4.49) + postcss-modules-values: 4.0.0(postcss@8.4.49) + postcss-value-parser: 4.2.0 + semver: 7.6.3 + webpack: 5.91.0(esbuild@0.20.2) + dev: true + /css-minimizer-webpack-plugin@2.0.0(webpack@5.91.0): resolution: {integrity: sha512-cG/uc94727tx5pBNtb1Sd7gvUPzwmcQi1lkpfqTpdkuNq75hJCw7bIVsCNijLm4dhDcr1atvuysl2rZqOG8Txw==} engines: {node: '>= 10.13.0'} @@ -15482,7 +15764,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} @@ -18011,6 +18293,29 @@ packages: typescript: 5.6.3 webpack: 5.91.0 + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.6.3)(webpack@5.91.0): + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + dependencies: + '@babel/code-frame': 7.24.2 + chalk: 4.1.2 + chokidar: 3.6.0 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + node-abort-controller: 3.1.1 + schema-utils: 3.3.0 + semver: 7.6.3 + tapable: 2.2.1 + typescript: 5.6.3 + webpack: 5.91.0(esbuild@0.20.2) + dev: true + /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} @@ -20437,6 +20742,20 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.30.3 + dev: true + /html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -20450,6 +20769,26 @@ packages: resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} dev: false + /html-webpack-plugin@5.6.3(webpack@5.91.0): + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.91.0(esbuild@0.20.2) + dev: true + /htmlparser2@3.10.1: resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} dependencies: @@ -20674,6 +21013,15 @@ packages: dependencies: postcss: 8.4.38 + /icss-utils@5.1.0(postcss@8.4.49): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.49 + dev: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -23011,7 +23359,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} @@ -24914,7 +25262,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 /node-abi@3.57.0: resolution: {integrity: sha512-Dp+A9JWxRaKuHP35H77I4kCKesDy5HUDEmScia2FyncMTOXASMyg251F5PhFoDA5uqBrDDffiLpbqnrZmNXW+g==} @@ -24923,6 +25271,10 @@ packages: semver: 7.6.3 dev: false + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + /node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} @@ -25765,7 +26117,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -25885,7 +26237,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} @@ -25898,6 +26250,10 @@ packages: ansi-escapes: 4.3.2 cross-spawn: 7.0.6 + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + /path-case@3.0.4: resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} dependencies: @@ -26601,6 +26957,15 @@ packages: dependencies: postcss: 8.4.38 + /postcss-modules-extract-imports@3.1.0(postcss@8.4.49): + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.49 + dev: true + /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} engines: {node: ^10 || ^12 || >= 14} @@ -26612,6 +26977,18 @@ packages: postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 + /postcss-modules-local-by-default@4.0.5(postcss@8.4.49): + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + dev: true + /postcss-modules-scope@3.2.0(postcss@8.4.38): resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} engines: {node: ^10 || ^12 || >= 14} @@ -26621,6 +26998,16 @@ packages: postcss: 8.4.38 postcss-selector-parser: 6.0.16 + /postcss-modules-scope@3.2.0(postcss@8.4.49): + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + dev: true + /postcss-modules-values@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} @@ -26630,6 +27017,16 @@ packages: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 + /postcss-modules-values@4.0.0(postcss@8.4.49): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 + dev: true + /postcss-nested@6.0.1(postcss@8.4.32): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} @@ -27099,6 +27496,13 @@ packages: lodash: 4.17.21 renderkid: 2.0.7 + /pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + dev: true + /pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -27311,19 +27715,11 @@ packages: dependencies: side-channel: 1.0.6 - /qs@6.12.0: - resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: false - /qs@6.12.1: resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.6 - dev: false /query-string@6.14.1: resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==} @@ -28277,7 +28673,7 @@ packages: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.6.2 + tslib: 2.8.1 dev: true /recursive-readdir@2.2.3: @@ -28544,6 +28940,11 @@ packages: unified: 10.1.2 dev: false + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: @@ -28733,6 +29134,16 @@ packages: lodash: 4.17.21 strip-ansi: 3.0.1 + /renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + dev: true + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} @@ -29003,6 +29414,10 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + /safe-identifier@0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + dev: true + /safe-json-stringify@1.2.0: resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} dev: false @@ -29079,6 +29494,16 @@ packages: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + ajv-keywords: 5.1.0(ajv@8.12.0) + dev: true + /scroll-into-view-if-needed@2.2.31: resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} dependencies: @@ -30374,6 +30799,15 @@ packages: schema-utils: 3.3.0 webpack: 5.91.0 + /style-loader@3.3.4(webpack@5.91.0): + resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + webpack: 5.91.0(esbuild@0.20.2) + dev: true + /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} dependencies: @@ -30776,6 +31210,31 @@ packages: webpack: 5.91.0(esbuild@0.19.12) dev: true + /terser-webpack-plugin@5.3.10(esbuild@0.20.2)(webpack@5.91.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + esbuild: 0.20.2 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.30.3 + webpack: 5.91.0(esbuild@0.20.2) + dev: true + /terser-webpack-plugin@5.3.10(webpack@5.91.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -31851,7 +32310,7 @@ packages: resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} engines: {node: '>=14.0.0'} dependencies: - acorn: 8.11.3 + acorn: 8.14.0 chokidar: 3.6.0 webpack-sources: 3.2.3 webpack-virtual-modules: 0.6.1 @@ -31946,7 +32405,7 @@ packages: dependencies: browserslist: 4.23.0 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.1.1 /update-check@1.5.4: resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} @@ -32023,8 +32482,7 @@ packages: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} dependencies: punycode: 1.4.1 - qs: 6.12.0 - dev: false + qs: 6.12.1 /urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} @@ -33086,6 +33544,31 @@ packages: schema-utils: 3.3.0 webpack: 5.91.0 + /webpack-dev-middleware@6.1.3(webpack@5.91.0): + resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + dependencies: + colorette: 2.0.20 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.91.0(esbuild@0.20.2) + dev: true + + /webpack-hot-middleware@2.26.1: + resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==} + dependencies: + ansi-html-community: 0.0.8 + html-entities: 2.5.2 + strip-ansi: 6.0.1 + dev: true + /webpack-merge@5.10.0: resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} engines: {node: '>=10.0.0'} @@ -33272,6 +33755,46 @@ packages: - uglify-js dev: true + /webpack@5.91.0(esbuild@0.20.2): + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.14.0 + acorn-import-assertions: 1.9.0(acorn@8.14.0) + browserslist: 4.23.0 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.16.0 + es-module-lexer: 1.5.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(esbuild@0.20.2)(webpack@5.91.0) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /website-scraper@5.3.1: resolution: {integrity: sha512-gogqPXD2gVsxoyd2yRiympw3rA5GuEpD1CaDEJ/J8zzanx7hkbTtneoO1SGs436PpLbWVcUge+6APGLhzsuZPA==} engines: {node: '>=14.14'} diff --git a/tests/e2e/.gitignore b/tests/e2e/.gitignore index 4c423d1b0..7e59afc82 100644 --- a/tests/e2e/.gitignore +++ b/tests/e2e/.gitignore @@ -1,5 +1,9 @@ node_modules/ /test-results/ +/test-results-drupal/ +/test-results-decap/ +/test-results-webform-snapshots/ /playwright-report/ /playwright/.cache/ .auth +build-archive.log diff --git a/tests/e2e/package.json b/tests/e2e/package.json index 90d9ccae2..5c7ff5b0d 100644 --- a/tests/e2e/package.json +++ b/tests/e2e/package.json @@ -12,6 +12,7 @@ "test:integration:decap": "playwright install chromium && playwright test --config playwright.config.decap.ts", "test:headed:drupal": "playwright install chromium && playwright test --headed --config playwright.config.drupal.ts", "test:headed:decap": "playwright install chromium && playwright test --headed --config playwright.config.decap.ts", + "chromatic": "chromatic --playwright --exit-zero-on-changes", "dev:decap": "playwright install chromium && playwright test --ui --config playwright.config.decap.ts", "dev:drupal": "playwright install chromium && playwright test --ui --config playwright.config.drupal.ts", "webform-snapshots": "playwright install chromium && playwright test --config playwright.config.webforms.ts", @@ -19,9 +20,11 @@ }, "devDependencies": { "@amazeelabs/save-webpage": "^1.1.1", + "@chromatic-com/playwright": "^0.10.1", "@custom/eslint-config": "workspace:*", "@playwright/test": "^1.44.1", "@types/node": "^18", + "chromatic": "^11.20.0", "typescript": "^5.3.3" } } diff --git a/tests/e2e/playwright.config.decap.ts b/tests/e2e/playwright.config.decap.ts index 9a553f363..cf9ca99b8 100644 --- a/tests/e2e/playwright.config.decap.ts +++ b/tests/e2e/playwright.config.decap.ts @@ -5,6 +5,7 @@ import defaults from './playwright.config.default'; export default defineConfig({ ...defaults, testDir: './specs/decap', + outputDir: './test-results-decap', webServer: [ { command: diff --git a/tests/e2e/playwright.config.default.ts b/tests/e2e/playwright.config.default.ts index 11b79ecae..013a3d5f4 100644 --- a/tests/e2e/playwright.config.default.ts +++ b/tests/e2e/playwright.config.default.ts @@ -1,6 +1,7 @@ +import { ChromaticConfig } from '@chromatic-com/playwright'; import { defineConfig } from '@playwright/test'; -export default defineConfig({ +export default defineConfig({ fullyParallel: true, retries: process.env.CI ? 2 : 0, workers: 1, @@ -8,5 +9,11 @@ export default defineConfig({ use: { trace: process.env.CI ? 'retain-on-failure' : 'on', actionTimeout: 10_000, + ignoreSelectors: [ + // Ignore the following selectors in the visual regression tests + // these contain dynamic content that changes on every page load + 'div#edit-meta-changed', + 'article.profile > .form-item', + ], }, }); diff --git a/tests/e2e/playwright.config.drupal.ts b/tests/e2e/playwright.config.drupal.ts index 54027f2fb..9dbe1782d 100644 --- a/tests/e2e/playwright.config.drupal.ts +++ b/tests/e2e/playwright.config.drupal.ts @@ -5,6 +5,7 @@ import defaults from './playwright.config.default'; export default defineConfig({ ...defaults, testDir: './specs/drupal', + outputDir: './test-results-drupal', webServer: [ { command: 'pnpm run --filter "@custom/cms" start >> /tmp/cms.log 2>&1', diff --git a/tests/e2e/playwright.config.webforms.ts b/tests/e2e/playwright.config.webforms.ts index db2c897e8..bae701556 100644 --- a/tests/e2e/playwright.config.webforms.ts +++ b/tests/e2e/playwright.config.webforms.ts @@ -5,6 +5,7 @@ import defaults from './playwright.config.default'; export default defineConfig({ ...defaults, testDir: './webform-snapshots', + outputDir: './test-results-webform-snapshots', webServer: [ { command: 'pnpm run --filter "@custom/cms" start >> /tmp/cms.log 2>&1', diff --git a/tests/e2e/specs/decap/admin.spec.ts b/tests/e2e/specs/decap/admin.spec.ts index df5118eef..f34c4d35d 100644 --- a/tests/e2e/specs/decap/admin.spec.ts +++ b/tests/e2e/specs/decap/admin.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/decap/decap-pages.spec.ts b/tests/e2e/specs/decap/decap-pages.spec.ts index 4ef7a35d3..031568033 100644 --- a/tests/e2e/specs/decap/decap-pages.spec.ts +++ b/tests/e2e/specs/decap/decap-pages.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { QuickActions, SiteLanguage } from '../../helpers/quick-actions'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/decap/translatables.spec.ts b/tests/e2e/specs/decap/translatables.spec.ts index 2433a9c84..adc385e16 100644 --- a/tests/e2e/specs/decap/translatables.spec.ts +++ b/tests/e2e/specs/decap/translatables.spec.ts @@ -1,8 +1,8 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; -test('translatable strings', async ({ page }) => { +test('decap translatable strings', async ({ page }) => { await page.goto(websiteUrl('/de')); const footer = page.getByRole('contentinfo'); await expect(footer.getByText(/Alle Rechte vorbehalten/)).toBeVisible(); diff --git a/tests/e2e/specs/drupal/blocks.spec.ts b/tests/e2e/specs/drupal/blocks.spec.ts index 2432ac6b7..3674661ab 100644 --- a/tests/e2e/specs/drupal/blocks.spec.ts +++ b/tests/e2e/specs/drupal/blocks.spec.ts @@ -1,8 +1,9 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; test('All blocks are rendered', async ({ page }) => { + await page.emulateMedia({ reducedMotion: 'reduce' }); await page.goto(websiteUrl('/en/blocks-complete')); // Hero diff --git a/tests/e2e/specs/drupal/campaign-urls.spec.ts b/tests/e2e/specs/drupal/campaign-urls.spec.ts index 1478fcabe..920e0dd9b 100644 --- a/tests/e2e/specs/drupal/campaign-urls.spec.ts +++ b/tests/e2e/specs/drupal/campaign-urls.spec.ts @@ -1,7 +1,9 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; +test.use({ disableAutoSnapshot: true }); + test.describe('campaign url redirects', () => { test('simple redirects', async ({ page }) => { await page.goto(websiteUrl('/php_redirect')); diff --git a/tests/e2e/specs/drupal/content-editing.spec.ts b/tests/e2e/specs/drupal/content-editing.spec.ts index b90810480..f3e930367 100644 --- a/tests/e2e/specs/drupal/content-editing.spec.ts +++ b/tests/e2e/specs/drupal/content-editing.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { cmsUrl } from '../../helpers/url'; @@ -16,6 +16,8 @@ test.describe('content-editing', () => { test('"More settings" fieldset is removed', async ({ page }) => { await page.goto(cmsUrl('/drupal')); await page.locator('li.tabs__tab a:text("Edit")').click(); + // Wait for the block editor to load + await page.waitForSelector('.block-editor-block-list__block'); // Why we expect it to be removed: // - It's too long to scroll to the bottom of long pages // - If we have any valuable controls in the "More settings" fieldset, diff --git a/tests/e2e/specs/drupal/content-hub.spec.ts b/tests/e2e/specs/drupal/content-hub.spec.ts index 5098712aa..67ea584a0 100644 --- a/tests/e2e/specs/drupal/content-hub.spec.ts +++ b/tests/e2e/specs/drupal/content-hub.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { QuickActions, SiteLanguage } from '../../helpers/quick-actions'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/drupal-pages.spec.ts b/tests/e2e/specs/drupal/drupal-pages.spec.ts index 4bdba52b7..03df63c2e 100644 --- a/tests/e2e/specs/drupal/drupal-pages.spec.ts +++ b/tests/e2e/specs/drupal/drupal-pages.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { QuickActions, SiteLanguage } from '../../helpers/quick-actions'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/entity-usage.spec.ts b/tests/e2e/specs/drupal/entity-usage.spec.ts index 1a6378571..1f240eacc 100644 --- a/tests/e2e/specs/drupal/entity-usage.spec.ts +++ b/tests/e2e/specs/drupal/entity-usage.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { cmsUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/homepage.spec.ts b/tests/e2e/specs/drupal/homepage.spec.ts index 5ab474a1d..3fe4f794e 100644 --- a/tests/e2e/specs/drupal/homepage.spec.ts +++ b/tests/e2e/specs/drupal/homepage.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { QuickActions, SiteLanguage } from '../../helpers/quick-actions'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/inquiry.spec.ts b/tests/e2e/specs/drupal/inquiry.spec.ts index f5323ebdc..cc37e2f5d 100644 --- a/tests/e2e/specs/drupal/inquiry.spec.ts +++ b/tests/e2e/specs/drupal/inquiry.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/links.spec.ts b/tests/e2e/specs/drupal/links.spec.ts index ded231855..db662cdc8 100644 --- a/tests/e2e/specs/drupal/links.spec.ts +++ b/tests/e2e/specs/drupal/links.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/login.spec.ts b/tests/e2e/specs/drupal/login.spec.ts index 085781977..0e79ef9ea 100644 --- a/tests/e2e/specs/drupal/login.spec.ts +++ b/tests/e2e/specs/drupal/login.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { cmsUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/menus.spec.ts b/tests/e2e/specs/drupal/menus.spec.ts index 4bfd228fa..d9ac9bea8 100644 --- a/tests/e2e/specs/drupal/menus.spec.ts +++ b/tests/e2e/specs/drupal/menus.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { QuickActions, SiteLanguage } from '../../helpers/quick-actions'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/metatags.spec.ts b/tests/e2e/specs/drupal/metatags.spec.ts index 93d9d0c8c..de8033895 100644 --- a/tests/e2e/specs/drupal/metatags.spec.ts +++ b/tests/e2e/specs/drupal/metatags.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/notfound.spec.ts b/tests/e2e/specs/drupal/notfound.spec.ts index 7de96d7ca..73bf872b6 100644 --- a/tests/e2e/specs/drupal/notfound.spec.ts +++ b/tests/e2e/specs/drupal/notfound.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/preview-editor-sidebar.spec.ts b/tests/e2e/specs/drupal/preview-editor-sidebar.spec.ts index c35288741..39e818509 100644 --- a/tests/e2e/specs/drupal/preview-editor-sidebar.spec.ts +++ b/tests/e2e/specs/drupal/preview-editor-sidebar.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { cmsUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/preview.spec.ts b/tests/e2e/specs/drupal/preview.spec.ts index 0affafdb2..233482aeb 100644 --- a/tests/e2e/specs/drupal/preview.spec.ts +++ b/tests/e2e/specs/drupal/preview.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { cmsUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/redirects.spec.ts b/tests/e2e/specs/drupal/redirects.spec.ts index 13eec233e..b2558df7e 100644 --- a/tests/e2e/specs/drupal/redirects.spec.ts +++ b/tests/e2e/specs/drupal/redirects.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/setup.ts b/tests/e2e/specs/drupal/setup.ts index c9dfad05b..e828adc40 100644 --- a/tests/e2e/specs/drupal/setup.ts +++ b/tests/e2e/specs/drupal/setup.ts @@ -1,7 +1,9 @@ -import { expect, test as setup } from '@playwright/test'; +import { expect, test as setup } from '@chromatic-com/playwright'; import { cmsUrl } from '../../helpers/url'; +setup.use({ disableAutoSnapshot: true }); + setup('setup', async ({ page }) => { await page.goto(cmsUrl('/user/login')); await page.getByRole('textbox', { name: 'Username' }).fill('admin'); diff --git a/tests/e2e/specs/drupal/translatables.spec.ts b/tests/e2e/specs/drupal/translatables.spec.ts index dd8beca36..3c183767c 100644 --- a/tests/e2e/specs/drupal/translatables.spec.ts +++ b/tests/e2e/specs/drupal/translatables.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/specs/drupal/webforms.spec.ts b/tests/e2e/specs/drupal/webforms.spec.ts index d099cd505..de78d06f4 100644 --- a/tests/e2e/specs/drupal/webforms.spec.ts +++ b/tests/e2e/specs/drupal/webforms.spec.ts @@ -1,4 +1,4 @@ -import { expect, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; import { websiteUrl } from '../../helpers/url'; diff --git a/tests/e2e/webform-snapshots/webforms.spec.ts b/tests/e2e/webform-snapshots/webforms.spec.ts index 1fe4ba862..0063810c9 100644 --- a/tests/e2e/webform-snapshots/webforms.spec.ts +++ b/tests/e2e/webform-snapshots/webforms.spec.ts @@ -1,5 +1,6 @@ import { saveWebpage } from '@amazeelabs/save-webpage'; -import { expect, Page, test } from '@playwright/test'; +import { expect, test } from '@chromatic-com/playwright'; +import { Page } from '@playwright/test'; import { execSync } from 'child_process'; import { cmsUrl } from '../helpers/url';