From 7272be3a31bd4ba3d84e8424af3ec1a630ef9a51 Mon Sep 17 00:00:00 2001 From: Jan Potoms <2109932+Janpot@users.noreply.github.com> Date: Thu, 19 Feb 2026 14:58:50 +0100 Subject: [PATCH 1/2] [code-infra] Exclusively enable test mode in jsdom (#47812) --- packages/mui-codemod/package.json | 2 +- .../mui-codemod/src/v5.0.0/path-imports.js | 7 - .../src/v5.0.0/top-level-imports.js | 7 +- pnpm-lock.yaml | 506 +++++++++++++++--- test/setupVitest.ts | 4 +- 5 files changed, 427 insertions(+), 99 deletions(-) diff --git a/packages/mui-codemod/package.json b/packages/mui-codemod/package.json index f717125862dbf1..fbcf1ef734ed82 100644 --- a/packages/mui-codemod/package.json +++ b/packages/mui-codemod/package.json @@ -31,6 +31,7 @@ "@babel/core": "^7.28.6", "@babel/runtime": "^7.28.6", "@babel/traverse": "^7.28.6", + "@mui/material-v5": "npm:@mui/material@5.18.0", "jscodeshift": "^17.1.2", "jscodeshift-add-imports": "^1.0.11", "postcss": "^8.5.6", @@ -39,7 +40,6 @@ }, "devDependencies": { "@material-ui/core": "^4.12.4", - "@mui/material-v5": "npm:@mui/material@5.18.0", "@types/chai": "5.2.3", "@types/jscodeshift": "0.12.0", "chai": "6.2.2" diff --git a/packages/mui-codemod/src/v5.0.0/path-imports.js b/packages/mui-codemod/src/v5.0.0/path-imports.js index de43a0ee992e7b..5247b400e2ed71 100644 --- a/packages/mui-codemod/src/v5.0.0/path-imports.js +++ b/packages/mui-codemod/src/v5.0.0/path-imports.js @@ -1,12 +1,5 @@ import addImports from 'jscodeshift-add-imports'; -// istanbul ignore next -if (globalThis.MUI_TEST_ENV) { - const resolve = require.resolve; - require.resolve = (source) => - resolve(source.replace(/^@mui\/material\/modern/, '../../../mui-material/src')); -} - const barrelImportsToTransform = { material: {}, 'icons-material': {}, diff --git a/packages/mui-codemod/src/v5.0.0/top-level-imports.js b/packages/mui-codemod/src/v5.0.0/top-level-imports.js index 68df5e4188fdba..39ac92f11f7b0b 100644 --- a/packages/mui-codemod/src/v5.0.0/top-level-imports.js +++ b/packages/mui-codemod/src/v5.0.0/top-level-imports.js @@ -7,13 +7,8 @@ export default function transformer(fileInfo, api, options) { const importModule = options.importModule || '@mui/material'; const targetModule = options.targetModule || '@mui/material'; - let resolveModule = importModule; - if (globalThis.MUI_TEST_ENV) { - resolveModule = resolveModule.replace(/^@mui\/material/, '@mui/material-v5'); - } - const whitelist = getJSExports( - require.resolve(`${resolveModule}/modern`, { + require.resolve(`@mui/material-v5/modern`, { paths: [dirname(fileInfo.path)], }), ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3c1252f7a929c1..9a1e7d0f231043 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 4.6.0(@types/express@5.0.0) '@vitest/eslint-plugin': specifier: ^1.6.6 - version: 1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13) + version: 1.6.9(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13) babel-plugin-transform-import-meta: specifier: ^2.3.3 version: 2.3.3(@babel/core@7.28.6) @@ -432,7 +432,7 @@ importers: version: 1.5.0 markdown-to-jsx: specifier: ^9.6.1 - version: 9.6.1(react@19.2.3) + version: 9.7.4(react@19.2.3) material-ui-popup-state: specifier: ^5.3.6 version: 5.3.6(@mui/material@packages+mui-material+build)(@types/react@19.2.9)(react@19.2.3) @@ -793,7 +793,7 @@ importers: version: 1.44.0 marked: specifier: ^17.0.1 - version: 17.0.1 + version: 17.0.2 prismjs: specifier: ^1.30.0 version: 1.30.0 @@ -816,6 +816,9 @@ importers: '@babel/traverse': specifier: ^7.28.6 version: 7.28.6 + '@mui/material-v5': + specifier: npm:@mui/material@5.18.0 + version: '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)' jscodeshift: specifier: ^17.1.2 version: 17.1.2(@babel/preset-env@7.28.6(@babel/core@7.28.6)) @@ -835,9 +838,6 @@ importers: '@material-ui/core': specifier: ^4.12.4 version: 4.12.4(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@mui/material-v5': - specifier: npm:@mui/material@5.18.0 - version: '@mui/material@5.18.0(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)' '@types/chai': specifier: 5.2.3 version: 5.2.3 @@ -907,7 +907,7 @@ importers: version: 19.2.9 next: specifier: 15.5.11 - version: 15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.2)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 @@ -1073,7 +1073,7 @@ importers: version: 3.3.3 next: specifier: 15.5.11 - version: 15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.2)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 @@ -1256,7 +1256,7 @@ importers: version: 19.2.9 next: specifier: 15.5.11 - version: 15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.2)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: specifier: 19.2.3 version: 19.2.3 @@ -1272,7 +1272,7 @@ importers: version: link:../mui-system/build '@pigment-css/react': specifier: 0.0.30 - version: 0.0.30(@types/react@19.2.9)(react@19.2.3)(typescript@5.9.3) + version: 0.0.30(@types/react@19.2.14)(react@19.2.3)(typescript@5.9.3) devDependencies: react: specifier: 19.2.3 @@ -1384,7 +1384,7 @@ importers: version: 19.2.3 styled-components: specifier: 6.3.8 - version: 6.3.8(patch_hash=383c648dfdb5dfc82fbe414d54027d8c982a01c6320370f0ecfdb387e753c09f)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 6.3.8(patch_hash=383c648dfdb5dfc82fbe414d54027d8c982a01c6320370f0ecfdb387e753c09f)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) publishDirectory: build packages/mui-stylis-plugin-rtl: @@ -1484,7 +1484,7 @@ importers: version: 21.0.1 styled-components: specifier: 6.3.8 - version: 6.3.8(patch_hash=383c648dfdb5dfc82fbe414d54027d8c982a01c6320370f0ecfdb387e753c09f)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 6.3.8(patch_hash=383c648dfdb5dfc82fbe414d54027d8c982a01c6320370f0ecfdb387e753c09f)(react-dom@19.2.4(react@19.2.3))(react@19.2.3) publishDirectory: build packages/mui-types: @@ -2705,9 +2705,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.25': - resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.0.27': + resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -4450,6 +4449,10 @@ packages: resolution: {integrity: sha512-9lCTqxaoa9c9cdkzSSx+q/qaYrCrUPEwTWzLkVYg1/T8ESH3BG9vmb1zRc6ODsBVB0+gnGRSqSr01pxTS1yX3A==} engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/run-script@10.0.3': + resolution: {integrity: sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==} + engines: {node: ^20.17.0 || >=22.9.0} + '@nx/devkit@21.6.8': resolution: {integrity: sha512-N0cj0NqdxY2pcI0IJV+fAu362B6tppdv2ohSBNGacNeSqxfAlJxO5TFZePDmxX5nt0t9hAqT+iasfu4BSYGfZw==} peerDependencies: @@ -4724,6 +4727,11 @@ packages: engines: {node: '>=18'} hasBin: true + '@playwright/test@1.58.2': + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + engines: {node: '>=18'} + hasBin: true + '@pnpm/constants@1001.3.1': resolution: {integrity: sha512-2hf0s4pVrVEH8RvdJJ7YRKjQdiG8m0iAT26TTqXnCbK30kKwJW69VLmP5tED5zstmDRXcOeH5eRcrpkdwczQ9g==} engines: {node: '>=18.12'} @@ -4923,10 +4931,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@sindresorhus/merge-streams@2.2.1': - resolution: {integrity: sha512-255V7MMIKw6aQ43Wbqp9HZ+VHn6acddERTLiiLnlcPLU9PdTq9Aijl12oklAgUEblLWye+vHLzmqBx6f2TGcZw==} - engines: {node: '>=18'} - '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -5512,6 +5516,9 @@ packages: peerDependencies: '@types/react': '*' + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.9': resolution: {integrity: sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==} @@ -5578,16 +5585,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.55.0': + resolution: {integrity: sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.54.0': resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.55.0': + resolution: {integrity: sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.54.0': resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.55.0': + resolution: {integrity: sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.54.0': resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5599,12 +5622,22 @@ packages: resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.55.0': + resolution: {integrity: sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.54.0': resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.55.0': + resolution: {integrity: sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.54.0': resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5612,10 +5645,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.55.0': + resolution: {integrity: sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.54.0': resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.55.0': + resolution: {integrity: sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -5748,8 +5792,8 @@ packages: '@vitest/browser': optional: true - '@vitest/eslint-plugin@1.6.6': - resolution: {integrity: sha512-bwgQxQWRtnTVzsUHK824tBmHzjV0iTx3tZaiQIYDjX3SA7TsQS8CuDVqxXrRY3FaOUMgbGavesCxI9MOfFLm7Q==} + '@vitest/eslint-plugin@1.6.9': + resolution: {integrity: sha512-9WfPx1OwJ19QLCSRLkqVO7//1WcWnK3fE/3fJhKMAmDe8+9G4rB47xCNIIeCq3FdEzkIoLTfDlwDlPBaUTMhow==} engines: {node: '>=18'} peerDependencies: eslint: '>=8.57.0' @@ -5910,6 +5954,10 @@ packages: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -6828,8 +6876,8 @@ packages: engines: {node: '>=20'} hasBin: true - cpy@12.0.1: - resolution: {integrity: sha512-hCnNla4AB27lUncMuO7KFjge0u0C5R74iKMBOajKOMB9ONGXcIek314ZTpxg16BuNYRTjPz7UW3tPXgJVLxUww==} + cpy@12.1.0: + resolution: {integrity: sha512-3z9tP1rPBLG7pQYn9iRgl7JOSew0SMPuWmakaRfzhXpmFBHmRbp7JekpuqPkXbbWOdSeKSbInYEcdIZjov2fNQ==} engines: {node: '>=20'} crc-32@1.2.2: @@ -7272,8 +7320,8 @@ packages: resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} engines: {node: '>=0.6'} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} engines: {node: '>=10.13.0'} enquirer@2.3.6: @@ -8013,10 +8061,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - globby@15.0.0: resolution: {integrity: sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==} engines: {node: '>=20'} @@ -9173,8 +9217,8 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - markdown-to-jsx@9.6.1: - resolution: {integrity: sha512-FLZPygHQzEGNUwIJ3Egdf3Lzm5M4ebswji8aMfM5tAq1vxkSw31a7OBmYXA3tg264PPyJw5UMDHw1fU+wFaQ9Q==} + markdown-to-jsx@9.7.4: + resolution: {integrity: sha512-W4ERh57uGFDT4Z0HDlk8fR8/vYwj+9cMMVwhLdVtvVLqGatGjroZIMk5IY/PMbV0ig0sos2FJVwUMQj/7l2VDg==} engines: {node: '>= 18'} peerDependencies: react: '>= 16.0.0' @@ -9211,8 +9255,8 @@ packages: peerDependencies: marked: '>=1 <16' - marked@17.0.1: - resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} + marked@17.0.2: + resolution: {integrity: sha512-s5HZGFQea7Huv5zZcAGhJLT3qLpAfnY7v7GWkICUr0+Wd5TFEtdlRR2XUL5Gg+RH7u2Df595ifrxR03mBaw7gA==} engines: {node: '>= 20'} hasBin: true @@ -9673,6 +9717,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + node-gyp@12.2.0: + resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + node-html-parser@7.0.1: resolution: {integrity: sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==} @@ -9690,6 +9739,11 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -9955,8 +10009,8 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + p-map@7.0.4: + resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} engines: {node: '>=18'} p-pipe@3.1.0: @@ -10213,11 +10267,21 @@ packages: engines: {node: '>=18'} hasBin: true + playwright-core@1.58.2: + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + engines: {node: '>=18'} + hasBin: true + playwright@1.58.0: resolution: {integrity: sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==} engines: {node: '>=18'} hasBin: true + playwright@1.58.2: + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + engines: {node: '>=18'} + hasBin: true + pngjs@7.0.0: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} @@ -10451,6 +10515,11 @@ packages: peerDependencies: react: ^19.2.3 + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + peerDependencies: + react: ^19.2.4 + react-draggable@4.5.0: resolution: {integrity: sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==} peerDependencies: @@ -11165,6 +11234,10 @@ packages: resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} engines: {node: '>=20'} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + engines: {node: '>=20'} + string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} @@ -11383,8 +11456,8 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - tar@7.5.2: - resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + tar@7.5.7: + resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -13892,7 +13965,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.0.25': {} + '@csstools/css-syntax-patches-for-csstree@1.0.27': {} '@csstools/css-tokenizer@3.0.4': {} @@ -13988,6 +14061,22 @@ snapshots: '@emotion/memoize@0.9.0': {} + '@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - supports-color + '@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -14023,6 +14112,21 @@ snapshots: '@emotion/sheet@1.4.0': {} + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.3) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.3) + '@emotion/utils': 1.4.2 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + transitivePeerDependencies: + - supports-color + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -14910,9 +15014,9 @@ snapshots: '@octokit/oauth-methods': 6.0.2 '@octokit/rest': 22.0.1 '@pnpm/find-workspace-dir': 1000.1.3 - '@typescript-eslint/types': 8.54.0 - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13) + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@vitest/eslint-plugin': 1.6.9(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13) babel-plugin-optimize-clsx: 2.6.2 babel-plugin-react-compiler: 1.0.0 babel-plugin-transform-import-meta: 2.3.3(@babel/core@7.28.6) @@ -15074,6 +15178,15 @@ snapshots: optionalDependencies: '@types/react': 19.2.9 + '@mui/private-theming@6.4.8(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/utils': 6.4.8(@types/react@19.2.14)(react@19.2.3) + prop-types: 15.8.1 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + '@mui/private-theming@6.4.8(@types/react@19.2.9)(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -15095,6 +15208,19 @@ snapshots: '@emotion/react': 11.14.0(@types/react@19.2.9)(react@19.2.3) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3) + '@mui/styled-engine@6.4.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 19.2.3 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.3) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3) + '@mui/styled-engine@6.4.0(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3))(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -15124,6 +15250,22 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3) '@types/react': 19.2.9 + '@mui/system@6.4.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/private-theming': 6.4.8(@types/react@19.2.14)(react@19.2.3) + '@mui/styled-engine': 6.4.0(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3))(react@19.2.3) + '@mui/types': 7.4.9(@types/react@19.2.14) + '@mui/utils': 6.4.8(@types/react@19.2.14)(react@19.2.3) + clsx: 2.1.1 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 19.2.3 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.3) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3) + '@types/react': 19.2.14 + '@mui/system@6.4.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -15140,10 +15282,20 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.9)(react@19.2.3))(@types/react@19.2.9)(react@19.2.3) '@types/react': 19.2.9 + '@mui/types@7.2.24(@types/react@19.2.14)': + optionalDependencies: + '@types/react': 19.2.14 + '@mui/types@7.2.24(@types/react@19.2.9)': optionalDependencies: '@types/react': 19.2.9 + '@mui/types@7.4.9(@types/react@19.2.14)': + dependencies: + '@babel/runtime': 7.28.6 + optionalDependencies: + '@types/react': 19.2.14 + '@mui/types@7.4.9(@types/react@19.2.9)': dependencies: '@babel/runtime': 7.28.6 @@ -15162,6 +15314,18 @@ snapshots: optionalDependencies: '@types/react': 19.2.9 + '@mui/utils@6.4.8(@types/react@19.2.14)(react@19.2.3)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/types': 7.2.24(@types/react@19.2.14) + '@types/prop-types': 15.7.15 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.2.3 + react-is: 19.2.3 + optionalDependencies: + '@types/react': 19.2.14 + '@mui/utils@6.4.8(@types/react@19.2.9)(react@19.2.3)': dependencies: '@babel/runtime': 7.28.6 @@ -15657,7 +15821,7 @@ snapshots: '@npmcli/package-json': 7.0.2 '@npmcli/query': 4.0.1 '@npmcli/redact': 3.2.2 - '@npmcli/run-script': 10.0.2 + '@npmcli/run-script': 10.0.3 bin-links: 5.0.0 cacache: 20.0.1 common-ancestor-path: 1.0.1 @@ -15779,6 +15943,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@npmcli/run-script@10.0.3': + dependencies: + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.2 + '@npmcli/promise-spawn': 9.0.1 + node-gyp: 12.2.0 + proc-log: 6.0.0 + which: 6.0.0 + transitivePeerDependencies: + - supports-color + '@nx/devkit@21.6.8(nx@21.6.8)': dependencies: ejs: 3.1.10 @@ -16006,6 +16181,36 @@ snapshots: '@opentelemetry/api@1.8.0': optional: true + '@pigment-css/react@0.0.30(@types/react@19.2.14)(react@19.2.3)(typescript@5.9.3)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@emotion/css': 11.13.4 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@19.2.14)(react@19.2.3) + '@emotion/serialize': 1.3.3 + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3) + '@mui/system': 6.4.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3))(@types/react@19.2.14)(react@19.2.3) + '@mui/utils': 6.4.8(@types/react@19.2.14)(react@19.2.3) + '@wyw-in-js/processor-utils': 0.5.5 + '@wyw-in-js/shared': 0.5.5 + '@wyw-in-js/transform': 0.5.5(typescript@5.9.3) + clsx: 2.1.1 + cssesc: 3.0.0 + csstype: 3.2.3 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 19.2.3 + stylis: 4.3.6 + stylis-plugin-rtl: 2.1.1(stylis@4.3.6) + transitivePeerDependencies: + - '@types/react' + - supports-color + - typescript + '@pigment-css/react@0.0.30(@types/react@19.2.9)(react@19.2.3)(typescript@5.9.3)': dependencies: '@babel/core': 7.28.6 @@ -16045,6 +16250,11 @@ snapshots: dependencies: playwright: 1.58.0 + '@playwright/test@1.58.2': + dependencies: + playwright: 1.58.2 + optional: true + '@pnpm/constants@1001.3.1': {} '@pnpm/error@1000.0.5': @@ -16196,8 +16406,6 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@sindresorhus/merge-streams@2.2.1': {} - '@sindresorhus/merge-streams@4.0.0': {} '@sinonjs/commons@3.0.1': @@ -16625,7 +16833,7 @@ snapshots: '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.19.0 jiti: 2.6.1 lightningcss: 1.30.2 magic-string: 0.30.21 @@ -16927,6 +17135,11 @@ snapshots: dependencies: '@types/react': 19.2.9 + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + optional: true + '@types/react@19.2.9': dependencies: csstype: 3.2.3 @@ -17002,8 +17215,17 @@ snapshots: '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.55.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: @@ -17014,10 +17236,19 @@ snapshots: '@typescript-eslint/types': 8.54.0 '@typescript-eslint/visitor-keys': 8.54.0 + '@typescript-eslint/scope-manager@8.55.0': + dependencies: + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.54.0 @@ -17032,6 +17263,8 @@ snapshots: '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/types@8.55.0': {} + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) @@ -17047,6 +17280,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.55.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.55.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.55.0(typescript@5.9.3) + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/visitor-keys': 8.55.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) @@ -17058,11 +17306,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.54.0': dependencies: '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.55.0': + dependencies: + '@typescript-eslint/types': 8.55.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.9.2': @@ -17185,10 +17449,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.6.6(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13)': + '@vitest/eslint-plugin@1.6.9(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13)': dependencies: - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 @@ -17405,6 +17669,8 @@ snapshots: abbrev@3.0.1: {} + abbrev@4.0.0: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -17957,9 +18223,9 @@ snapshots: minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 7.0.3 + p-map: 7.0.4 ssri: 12.0.0 - tar: 7.5.2 + tar: 7.5.7 unique-filename: 4.0.0 cacache@20.0.1: @@ -17972,7 +18238,7 @@ snapshots: minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 7.0.3 + p-map: 7.0.4 ssri: 12.0.0 unique-filename: 4.0.0 @@ -18416,17 +18682,17 @@ snapshots: cpy-cli@6.0.0: dependencies: - cpy: 12.0.1 + cpy: 12.1.0 meow: 13.2.0 - cpy@12.0.1: + cpy@12.1.0: dependencies: copy-file: 11.1.0 - globby: 14.1.0 + globby: 15.0.0 junk: 4.0.1 micromatch: 4.0.8 p-filter: 4.1.0 - p-map: 7.0.3 + p-map: 7.0.4 crc-32@1.2.2: {} @@ -18521,7 +18787,7 @@ snapshots: cssstyle@5.3.7: dependencies: '@asamuzakjp/css-color': 4.1.1 - '@csstools/css-syntax-patches-for-csstree': 1.0.25 + '@csstools/css-syntax-patches-for-csstree': 1.0.27 css-tree: 3.1.0 lru-cache: 11.2.4 @@ -18873,7 +19139,7 @@ snapshots: memory-fs: 0.2.0 tapable: 0.1.10 - enhanced-resolve@5.18.3: + enhanced-resolve@5.19.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -19238,8 +19504,8 @@ snapshots: eslint-plugin-testing-library@7.15.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/scope-manager': 8.54.0 - '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/utils': 8.55.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) transitivePeerDependencies: - supports-color @@ -19864,15 +20130,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.2.1 - fast-glob: 3.3.3 - ignore: 7.0.5 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - globby@15.0.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -21155,7 +21412,7 @@ snapshots: markdown-table@3.0.4: {} - markdown-to-jsx@9.6.1(react@19.2.3): + markdown-to-jsx@9.7.4(react@19.2.3): optionalDependencies: react: 19.2.3 @@ -21200,7 +21457,7 @@ snapshots: node-emoji: 2.2.0 supports-hyperlinks: 3.2.0 - marked@17.0.1: {} + marked@17.0.2: {} marked@9.1.6: {} @@ -21800,6 +22057,32 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.11(@babel/core@7.28.6)(@opentelemetry/api@1.8.0)(@playwright/test@1.58.2)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@next/env': 15.5.11 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001760 + postcss: 8.4.31 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.28.6)(babel-plugin-macros@3.1.0)(react@19.2.3) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + '@opentelemetry/api': 1.8.0 + '@playwright/test': 1.58.2 + babel-plugin-react-compiler: 1.0.0 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nice-try@1.0.5: {} no-case@3.0.4: @@ -21840,12 +22123,27 @@ snapshots: nopt: 8.1.0 proc-log: 5.0.0 semver: 7.7.3 - tar: 7.5.2 + tar: 7.5.7 tinyglobby: 0.2.15 which: 5.0.0 transitivePeerDependencies: - supports-color + node-gyp@12.2.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.2 + graceful-fs: 4.2.11 + make-fetch-happen: 15.0.2 + nopt: 9.0.0 + proc-log: 6.0.0 + semver: 7.7.3 + tar: 7.5.7 + tinyglobby: 0.2.15 + which: 6.0.0 + transitivePeerDependencies: + - supports-color + node-html-parser@7.0.1: dependencies: css-select: 5.2.2 @@ -21861,6 +22159,10 @@ snapshots: dependencies: abbrev: 3.0.1 + nopt@9.0.0: + dependencies: + abbrev: 4.0.0 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -22211,7 +22513,7 @@ snapshots: p-filter@4.1.0: dependencies: - p-map: 7.0.3 + p-map: 7.0.4 p-finally@1.0.0: {} @@ -22249,7 +22551,7 @@ snapshots: dependencies: aggregate-error: 3.1.0 - p-map@7.0.3: {} + p-map@7.0.4: {} p-pipe@3.1.0: {} @@ -22287,7 +22589,7 @@ snapshots: '@npmcli/installed-package-contents': 3.0.0 '@npmcli/package-json': 7.0.2 '@npmcli/promise-spawn': 8.0.3 - '@npmcli/run-script': 10.0.2 + '@npmcli/run-script': 10.0.3 cacache: 20.0.1 fs-minipass: 3.0.3 minipass: 7.1.2 @@ -22299,7 +22601,7 @@ snapshots: promise-retry: 2.0.1 sigstore: 4.0.0 ssri: 12.0.0 - tar: 7.5.2 + tar: 7.5.7 transitivePeerDependencies: - supports-color @@ -22309,7 +22611,7 @@ snapshots: '@npmcli/installed-package-contents': 4.0.0 '@npmcli/package-json': 7.0.2 '@npmcli/promise-spawn': 9.0.1 - '@npmcli/run-script': 10.0.2 + '@npmcli/run-script': 10.0.3 cacache: 20.0.1 fs-minipass: 3.0.3 minipass: 7.1.2 @@ -22321,7 +22623,7 @@ snapshots: promise-retry: 2.0.1 sigstore: 4.0.0 ssri: 13.0.0 - tar: 7.5.2 + tar: 7.5.7 transitivePeerDependencies: - supports-color @@ -22504,12 +22806,22 @@ snapshots: playwright-core@1.58.0: {} + playwright-core@1.58.2: + optional: true + playwright@1.58.0: dependencies: playwright-core: 1.58.0 optionalDependencies: fsevents: 2.3.2 + playwright@1.58.2: + dependencies: + playwright-core: 1.58.2 + optionalDependencies: + fsevents: 2.3.2 + optional: true + pngjs@7.0.0: {} popper.js@1.16.1-lts: {} @@ -22752,6 +23064,12 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 + react-dom@19.2.4(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + optional: true + react-draggable@4.5.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: clsx: 2.1.1 @@ -23631,6 +23949,11 @@ snapshots: get-east-asian-width: 1.3.0 strip-ansi: 7.1.2 + string-width@8.1.1: + dependencies: + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.2 + string.prototype.includes@2.0.1: dependencies: call-bind: 1.0.8 @@ -23743,6 +24066,21 @@ snapshots: optionalDependencies: react-dom: 19.2.3(react@19.2.3) + styled-components@6.3.8(patch_hash=383c648dfdb5dfc82fbe414d54027d8c982a01c6320370f0ecfdb387e753c09f)(react-dom@19.2.4(react@19.2.3))(react@19.2.3): + dependencies: + '@emotion/is-prop-valid': 1.4.0 + '@emotion/unitless': 0.10.0 + '@types/stylis': 4.2.7 + css-to-react-native: 3.2.0 + csstype: 3.2.3 + postcss: 8.4.49 + react: 19.2.3 + shallowequal: 1.1.0 + stylis: 4.3.6 + tslib: 2.8.1 + optionalDependencies: + react-dom: 19.2.4(react@19.2.3) + styled-jsx@5.1.6(@babel/core@7.28.6)(babel-plugin-macros@3.1.0)(react@19.2.3): dependencies: client-only: 0.0.1 @@ -23763,7 +24101,7 @@ snapshots: stylelint@17.1.1(typescript@5.9.3): dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-syntax-patches-for-csstree': 1.0.25 + '@csstools/css-syntax-patches-for-csstree': 1.0.27 '@csstools/css-tokenizer': 4.0.0 '@csstools/media-query-list-parser': 5.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/selector-resolve-nested': 4.0.0(postcss-selector-parser@7.1.1) @@ -23795,7 +24133,7 @@ snapshots: postcss-safe-parser: 7.0.1(postcss@8.5.6) postcss-selector-parser: 7.1.1 postcss-value-parser: 4.2.0 - string-width: 8.1.0 + string-width: 8.1.1 supports-hyperlinks: 4.4.0 svg-tags: 1.0.0 table: 6.9.0 @@ -23912,7 +24250,7 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.5.2: + tar@7.5.7: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -24067,7 +24405,7 @@ snapshots: tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.19.0 tapable: 2.3.0 tsconfig-paths: 4.2.0 @@ -24541,7 +24879,7 @@ snapshots: acorn-import-phases: 1.0.3(acorn@8.15.0) browserslist: 4.28.1 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.19.0 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 diff --git a/test/setupVitest.ts b/test/setupVitest.ts index 880aaf0aee6a97..7a3a8696700dc8 100644 --- a/test/setupVitest.ts +++ b/test/setupVitest.ts @@ -1,5 +1,7 @@ import setupVitest from '@mui/internal-test-utils/setupVitest'; -(globalThis as any).MUI_TEST_ENV = true; +if (navigator.userAgent.includes('jsdom')) { + (globalThis as any).MUI_TEST_ENV = true; +} setupVitest({ emotion: true }); From da479c0db2ce4bd87e1fe1314f895d33ebdf4fd1 Mon Sep 17 00:00:00 2001 From: Jan Potoms <2109932+Janpot@users.noreply.github.com> Date: Thu, 26 Feb 2026 11:29:05 +0100 Subject: [PATCH 2/2] [code-infra] Detect browser envs that don't support layout (#47813) Co-authored-by: Claude Opus 4.6 --- eslint.config.mjs | 12 +++++++ packages/mui-docs/src/i18n/i18n.tsx | 4 ++- packages/mui-material/src/Popover/Popover.js | 34 ++++++++++--------- .../mui-material/src/Popper/BasePopper.tsx | 34 ++++++++++--------- packages/mui-material/src/Slide/Slide.js | 32 +++++++++-------- packages/mui-material/src/Tabs/Tabs.js | 3 +- .../src/utils/isLayoutSupported.ts | 8 +++++ test/setupVitest.ts | 4 --- 8 files changed, 78 insertions(+), 53 deletions(-) create mode 100644 packages/mui-material/src/utils/isLayoutSupported.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index 903acbc423b4fb..f9cd42269aa1a1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -278,6 +278,18 @@ export default defineConfig( 'no-bitwise': 'off', }, }, + { + files: [`packages/*/src/**/*${EXTENSION_TS}`], + ignores: ['**/*.spec.*', '**/*.test.*', '**/mui-lab/**'], + rules: { + 'mui/require-dev-wrapper': [ + 'error', + { + functionNames: ['warnOnce', 'warn', 'checkSlot', 'isLayoutSupported'], + }, + ], + }, + }, { files: [`packages/*/src/**/*${EXTENSION_TS}`], ignores: ['**/*.d.ts', '**/*.spec.*', 'packages/mui-joy/**/*'], diff --git a/packages/mui-docs/src/i18n/i18n.tsx b/packages/mui-docs/src/i18n/i18n.tsx index f49df2559c98a9..19ed0bdf0946b8 100644 --- a/packages/mui-docs/src/i18n/i18n.tsx +++ b/packages/mui-docs/src/i18n/i18n.tsx @@ -128,7 +128,9 @@ export function useTranslate(): Translate { const translation = getPath(wordings, key); if (!translation) { - warn(userLanguage, key, ignoreWarning); + if (process.env.NODE_ENV !== 'production') { + warn(userLanguage, key, ignoreWarning); + } const enTranslation = getPath(translations.en, key); return enTranslation ?? null; diff --git a/packages/mui-material/src/Popover/Popover.js b/packages/mui-material/src/Popover/Popover.js index 7a34d81321ac2f..d6391bf218ad41 100644 --- a/packages/mui-material/src/Popover/Popover.js +++ b/packages/mui-material/src/Popover/Popover.js @@ -11,6 +11,7 @@ import chainPropTypes from '@mui/utils/chainPropTypes'; import isHostComponent from '@mui/utils/isHostComponent'; import { styled } from '../zero-styled'; import { useDefaultProps } from '../DefaultPropsProvider'; +import isLayoutSupported from '../utils/isLayoutSupported'; import debounce from '../utils/debounce'; import ownerDocument from '../utils/ownerDocument'; import ownerWindow from '../utils/ownerWindow'; @@ -167,7 +168,7 @@ const Popover = React.forwardRef(function Popover(inProps, ref) { const box = anchorElement.getBoundingClientRect(); if ( - !globalThis.MUI_TEST_ENV && + isLayoutSupported() && box.top === 0 && box.left === 0 && box.right === 0 && @@ -479,21 +480,22 @@ Popover.propTypes /* remove-proptypes */ = { if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) { const box = resolvedAnchorEl.getBoundingClientRect(); - if ( - process.env.NODE_ENV !== 'production' && - !globalThis.MUI_TEST_ENV && - box.top === 0 && - box.left === 0 && - box.right === 0 && - box.bottom === 0 - ) { - return new Error( - [ - 'MUI: The `anchorEl` prop provided to the component is invalid.', - 'The anchor element should be part of the document layout.', - "Make sure the element is present in the document or that it's not display none.", - ].join('\n'), - ); + if (process.env.NODE_ENV !== 'production') { + if ( + isLayoutSupported() && + box.top === 0 && + box.left === 0 && + box.right === 0 && + box.bottom === 0 + ) { + return new Error( + [ + 'MUI: The `anchorEl` prop provided to the component is invalid.', + 'The anchor element should be part of the document layout.', + "Make sure the element is present in the document or that it's not display none.", + ].join('\n'), + ); + } } } else { return new Error( diff --git a/packages/mui-material/src/Popper/BasePopper.tsx b/packages/mui-material/src/Popper/BasePopper.tsx index b197e0f379d60a..4c32775a506c15 100644 --- a/packages/mui-material/src/Popper/BasePopper.tsx +++ b/packages/mui-material/src/Popper/BasePopper.tsx @@ -10,6 +10,7 @@ import { createPopper, Instance, Modifier, Placement, State, VirtualElement } fr import PropTypes from 'prop-types'; import composeClasses from '@mui/utils/composeClasses'; import useSlotProps from '@mui/utils/useSlotProps'; +import isLayoutSupported from '../utils/isLayoutSupported'; import Portal from '../Portal'; import { getPopperUtilityClass } from './popperClasses'; import { WithOptionalOwnerState } from '../utils/types'; @@ -147,7 +148,7 @@ const PopperTooltip = React.forwardRef(funct const box = resolvedAnchorElement.getBoundingClientRect(); if ( - !(globalThis as any).MUI_TEST_ENV && + isLayoutSupported() && box.top === 0 && box.left === 0 && box.right === 0 && @@ -350,21 +351,22 @@ Popper.propTypes /* remove-proptypes */ = { resolvedAnchorEl.nodeType === 1 ) { const box = resolvedAnchorEl.getBoundingClientRect(); - if ( - process.env.NODE_ENV !== 'production' && - !(globalThis as any).MUI_TEST_ENV && - box.top === 0 && - box.left === 0 && - box.right === 0 && - box.bottom === 0 - ) { - return new Error( - [ - 'MUI: The `anchorEl` prop provided to the component is invalid.', - 'The anchor element should be part of the document layout.', - "Make sure the element is present in the document or that it's not display none.", - ].join('\n'), - ); + if (process.env.NODE_ENV !== 'production') { + if ( + isLayoutSupported() && + box.top === 0 && + box.left === 0 && + box.right === 0 && + box.bottom === 0 + ) { + return new Error( + [ + 'MUI: The `anchorEl` prop provided to the component is invalid.', + 'The anchor element should be part of the document layout.', + "Make sure the element is present in the document or that it's not display none.", + ].join('\n'), + ); + } } } else if ( !resolvedAnchorEl || diff --git a/packages/mui-material/src/Slide/Slide.js b/packages/mui-material/src/Slide/Slide.js index b75034081cef60..75718dac338c02 100644 --- a/packages/mui-material/src/Slide/Slide.js +++ b/packages/mui-material/src/Slide/Slide.js @@ -6,6 +6,7 @@ import chainPropTypes from '@mui/utils/chainPropTypes'; import HTMLElementType from '@mui/utils/HTMLElementType'; import elementAcceptingRef from '@mui/utils/elementAcceptingRef'; import getReactElementRef from '@mui/utils/getReactElementRef'; +import isLayoutSupported from '../utils/isLayoutSupported'; import debounce from '../utils/debounce'; import useForkRef from '../utils/useForkRef'; import { useTheme } from '../zero-styled'; @@ -300,21 +301,22 @@ Slide.propTypes /* remove-proptypes */ = { if (resolvedContainer && resolvedContainer.nodeType === 1) { const box = resolvedContainer.getBoundingClientRect(); - if ( - process.env.NODE_ENV !== 'production' && - !globalThis.MUI_TEST_ENV && - box.top === 0 && - box.left === 0 && - box.right === 0 && - box.bottom === 0 - ) { - return new Error( - [ - 'MUI: The `container` prop provided to the component is invalid.', - 'The anchor element should be part of the document layout.', - "Make sure the element is present in the document or that it's not display none.", - ].join('\n'), - ); + if (process.env.NODE_ENV !== 'production') { + if ( + isLayoutSupported() && + box.top === 0 && + box.left === 0 && + box.right === 0 && + box.bottom === 0 + ) { + return new Error( + [ + 'MUI: The `container` prop provided to the component is invalid.', + 'The anchor element should be part of the document layout.', + "Make sure the element is present in the document or that it's not display none.", + ].join('\n'), + ); + } } } else if ( !resolvedContainer || diff --git a/packages/mui-material/src/Tabs/Tabs.js b/packages/mui-material/src/Tabs/Tabs.js index 14eedc26b85fc6..65ca63f16c0b52 100644 --- a/packages/mui-material/src/Tabs/Tabs.js +++ b/packages/mui-material/src/Tabs/Tabs.js @@ -19,6 +19,7 @@ import tabsClasses, { getTabsUtilityClass } from './tabsClasses'; import ownerDocument from '../utils/ownerDocument'; import ownerWindow from '../utils/ownerWindow'; import getActiveElement from '../utils/getActiveElement'; +import isLayoutSupported from '../utils/isLayoutSupported'; import useSlot from '../utils/useSlot'; const nextItem = (list, item) => { @@ -432,7 +433,7 @@ const Tabs = React.forwardRef(function Tabs(inProps, ref) { if (process.env.NODE_ENV !== 'production') { if ( - !globalThis.MUI_TEST_ENV && + isLayoutSupported() && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && diff --git a/packages/mui-material/src/utils/isLayoutSupported.ts b/packages/mui-material/src/utils/isLayoutSupported.ts new file mode 100644 index 00000000000000..8029bbba0c3b73 --- /dev/null +++ b/packages/mui-material/src/utils/isLayoutSupported.ts @@ -0,0 +1,8 @@ +export default function isLayoutSupported(): boolean { + return !( + /jsdom|HappyDOM/.test(window.navigator.userAgent) || + // TODO(v9): Remove the test environment check + // eslint-disable-next-line mui/consistent-production-guard + process.env.NODE_ENV === 'test' + ); +} diff --git a/test/setupVitest.ts b/test/setupVitest.ts index 7a3a8696700dc8..7f41ebf7f3c709 100644 --- a/test/setupVitest.ts +++ b/test/setupVitest.ts @@ -1,7 +1,3 @@ import setupVitest from '@mui/internal-test-utils/setupVitest'; -if (navigator.userAgent.includes('jsdom')) { - (globalThis as any).MUI_TEST_ENV = true; -} - setupVitest({ emotion: true });