From 848efccd2e32cc75bd13195b072f6f289a2c08e5 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 09:35:41 -0800 Subject: [PATCH 01/28] test(ui): migrate jest tests to swc-safe mocking --- jest.config.ts | 60 +- knip.config.ts | 4 - package.json | 8 +- pnpm-lock.yaml | 1906 +++++------------ .../app/actionCreators/organization.spec.tsx | 8 + static/app/actionCreators/tags.spec.tsx | 8 + .../commandPalette/ui/content.spec.tsx | 8 + .../contentSliderDiff/index.spec.tsx | 12 +- .../components/core/layout/styles.spec.tsx | 41 +- .../events/contexts/contextCard.spec.tsx | 19 +- .../featureFeedback/feedbackModal.spec.tsx | 8 + .../components/pageFilters/actions.spec.tsx | 66 +- .../components/pageFilters/container.spec.tsx | 16 +- static/app/stores/groupingStore.spec.tsx | 12 +- .../highlightFuseMatches.spec.tsx.snap | 18 +- static/app/utils/demoMode/index.spec.tsx | 16 +- static/app/utils/useFeedbackForm.spec.tsx | 21 +- .../assertionSuggestionsButton.spec.tsx | 7 +- .../uptime/testUptimeMonitorButton.spec.tsx | 9 + static/app/views/dashboards/detail.spec.tsx | 69 +- .../dashboards/widgetCard/index.spec.tsx | 16 + static/app/views/detectors/edit.spec.tsx | 4 +- static/app/views/discover/homepage.spec.tsx | 10 +- static/app/views/discover/results.spec.tsx | 8 + .../app/views/explore/logs/content.spec.tsx | 33 +- .../savedQueries/exploreParams.spec.tsx | 8 + .../app/views/explore/spans/spansTab.spec.tsx | 39 +- .../issueDetails/groupEventCarousel.spec.tsx | 33 +- .../hooks/useCopyIssueDetails.spec.tsx | 61 +- .../sidebar/activitySection.spec.tsx | 12 +- .../streamline/sidebar/seerDrawer.spec.tsx | 32 +- .../views/issueList/actions/index.spec.tsx | 8 + .../app/views/onboarding/onboarding.spec.tsx | 67 +- static/app/views/organizationContext.spec.tsx | 8 + .../projectDetail/projectDetail.spec.tsx | 8 + .../projectInstall/createProject.spec.tsx | 18 +- .../messagingIntegrationAlertRule.spec.tsx | 49 +- .../views/projectsDashboard/index.spec.tsx | 10 +- .../views/seerExplorer/explorerPanel.spec.tsx | 60 +- .../settings/account/apiTokenDetails.spec.tsx | 9 + .../changeTracking/index.spec.tsx | 8 + .../organizationAuthTokens/index.spec.tsx | 9 + .../newAuthToken.spec.tsx | 8 + .../index.spec.tsx | 9 + .../projectPerformance.spec.tsx | 8 + .../settings/projectPlugins/details.spec.tsx | 8 + .../customers/customerOverview.spec.tsx | 35 +- .../customers/pendingChanges.spec.tsx | 12 +- .../deleteBillingMetricHistory.spec.tsx | 36 +- static/gsAdmin/views/docIntegrations.spec.tsx | 9 + .../gsAdmin/views/relocationDetails.spec.tsx | 8 + .../gsApp/views/seerAutomation/index.spec.tsx | 6 +- .../usageOverview/index.spec.tsx | 34 +- tests/js/setup.ts | 32 +- 54 files changed, 1261 insertions(+), 1770 deletions(-) diff --git a/jest.config.ts b/jest.config.ts index e88b72e9b04628..731aeabcdde70d 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -2,39 +2,39 @@ import {execFileSync} from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; -import type {TransformOptions} from '@babel/core'; import type {Config} from '@jest/types'; +import type {Options as SwcOptions} from '@swc/core'; -const babelConfig: TransformOptions = { - presets: [ - [ - '@babel/preset-react', - { +const swcConfig: SwcOptions = { + isModule: 'unknown', + module: { + type: 'commonjs', + }, + sourceMaps: 'inline', + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + dynamicImport: true, + }, + transform: { + react: { runtime: 'automatic', importSource: '@emotion/react', }, - ], - [ - '@babel/preset-env', - { - useBuiltIns: 'usage', - corejs: '3.41', - targets: { - node: 'current', - }, - }, - ], - // TODO: Remove allowDeclareFields when we upgrade to Babel 8 - ['@babel/preset-typescript', {allowDeclareFields: true, onlyRemoveTypeImports: true}], - ], - plugins: [ - [ - '@emotion/babel-plugin', - { - sourceMap: false, - }, - ], - ], + }, + experimental: { + plugins: [ + [ + '@swc/plugin-emotion', + { + sourceMap: false, + autoLabel: 'never', + }, + ], + ], + }, + }, }; const { @@ -301,9 +301,7 @@ const config: Config.InitialOptions = { '/node_modules/reflux', ], transform: { - '^.+\\.jsx?$': ['babel-jest', babelConfig as any], - '^.+\\.tsx?$': ['babel-jest', babelConfig as any], - '^.+\\.mjs?$': ['babel-jest', babelConfig as any], + '^.+\\.[mc]?[jt]sx?$': ['@swc/jest', swcConfig as any], '^.+\\.pegjs?$': '/tests/js/jest-pegjs-transform.js', }, transformIgnorePatterns: [ diff --git a/knip.config.ts b/knip.config.ts index bf0f9ecb3266a1..64e08bfe825210 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -80,10 +80,6 @@ const config: KnipConfig = { 'process', // rspack.ProvidePlugin, needs better knip plugin '@types/webpack-env', // needed to make require.context work '@types/gtag.js', // needed for global `gtag` namespace typings - '@babel/preset-env', // Still used in jest - '@babel/preset-react', // Still used in jest - '@babel/preset-typescript', // Still used in jest - '@emotion/babel-plugin', // Still used in jest ], rules: { binaries: 'off', diff --git a/package.json b/package.json index 624700be618bf7..dbabf44ba6d5a0 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,10 @@ }, "dependencies": { "@amplitude/analytics-browser": "^1.5.3", - "@babel/core": "~7.28.0", - "@babel/preset-env": "~7.28.0", - "@babel/preset-react": "^7.27.1", - "@babel/preset-typescript": "^7.27.1", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "7.0.0", "@dnd-kit/sortable": "^8.0.0", "@dnd-kit/utilities": "^3.2.2", - "@emotion/babel-plugin": "^11.13.5", "@emotion/cache": "^11.14.0", "@emotion/css": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", @@ -198,6 +193,8 @@ "@sentry/jest-environment": "6.1.0", "@sentry/profiling-node": "10.27.0", "@styled/typescript-styled-plugin": "^1.0.1", + "@swc/core": "^1.15.11", + "@swc/jest": "^0.2.39", "@tanstack/eslint-plugin-query": "5.83.1", "@testing-library/dom": "10.4.0", "@testing-library/jest-dom": "6.6.3", @@ -206,7 +203,6 @@ "@types/gettext-parser": "8.0.0", "@types/node": "^22.9.1", "@typescript/native-preview": "7.0.0-dev.20260112.1", - "babel-jest": "30.0.4", "eslint": "9.34.0", "eslint-config-prettier": "10.1.8", "eslint-import-resolver-typescript": "^3.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fbe0e0e0fe3b4a..10982139931d8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,18 +18,6 @@ importers: '@amplitude/analytics-browser': specifier: ^1.5.3 version: 1.13.7 - '@babel/core': - specifier: ~7.28.0 - version: 7.28.0 - '@babel/preset-env': - specifier: ~7.28.0 - version: 7.28.0(@babel/core@7.28.0) - '@babel/preset-react': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.0) - '@babel/preset-typescript': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.0) '@dnd-kit/core': specifier: ^6.1.0 version: 6.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -42,9 +30,6 @@ importers: '@dnd-kit/utilities': specifier: ^3.2.2 version: 3.2.2(react@19.2.3) - '@emotion/babel-plugin': - specifier: ^11.13.5 - version: 11.13.5 '@emotion/cache': specifier: ^11.14.0 version: 11.14.0 @@ -62,7 +47,7 @@ importers: version: 11.14.0(@emotion/react@11.14.0(@types/react@19.2.1)(react@19.2.3))(@types/react@19.2.1)(react@19.2.3) '@mdx-js/loader': specifier: ^3.1.0 - version: 3.1.0(acorn@8.15.0)(webpack@5.99.6(esbuild@0.25.10)) + version: 3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) '@mdx-js/mdx': specifier: ^3.1.0 version: 3.1.0(acorn@8.15.0) @@ -173,13 +158,13 @@ importers: version: 1.23.2 '@rsdoctor/rspack-plugin': specifier: 1.5.0 - version: 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + version: 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) '@rspack/cli': specifier: 1.7.3 - version: 1.7.3(@rspack/core@1.7.3(@swc/helpers@0.5.15))(@types/express@4.17.25)(webpack@5.99.6(esbuild@0.25.10)) + version: 1.7.3(@rspack/core@1.7.3)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) '@rspack/core': specifier: 1.7.3 - version: 1.7.3(@swc/helpers@0.5.15) + version: 1.7.3 '@rspack/plugin-react-refresh': specifier: 1.6.0 version: 1.6.0(react-refresh@0.18.0) @@ -218,7 +203,7 @@ importers: version: 1.0.0-beta.16(react@19.2.3) '@sentry/webpack-plugin': specifier: 4.6.1 - version: 4.6.1(encoding@0.1.13)(webpack@5.99.6(esbuild@0.25.10)) + version: 4.6.1(encoding@0.1.13)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) '@stripe/react-stripe-js': specifier: ^3.9.2 version: 3.9.2(@stripe/stripe-js@5.10.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -335,7 +320,7 @@ importers: version: 5.0.2 compression-webpack-plugin: specifier: 11.1.0 - version: 11.1.0(webpack@5.99.6(esbuild@0.25.10)) + version: 11.1.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) conduit-client: specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -347,7 +332,7 @@ importers: version: 2.50.0 css-loader: specifier: ^7.1.2 - version: 7.1.2(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + version: 7.1.2(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) diff: specifier: 8.0.3 version: 8.0.3 @@ -383,7 +368,7 @@ importers: version: 3.4.3 html-webpack-plugin: specifier: 5.6.3 - version: 5.6.3(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + version: 5.6.3(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) idb-keyval: specifier: 6.2.2 version: 6.2.2 @@ -410,7 +395,7 @@ importers: version: 4.3.0 less-loader: specifier: ^12.2.0 - version: 12.2.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(less@4.3.0)(webpack@5.99.6(esbuild@0.25.10)) + version: 12.2.0(@rspack/core@1.7.3)(less@4.3.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) lodash: specifier: ^4.17.23 version: 4.17.23 @@ -524,13 +509,13 @@ importers: version: 1.0.3 style-loader: specifier: 4.0.0 - version: 4.0.0(webpack@5.99.6(esbuild@0.25.10)) + version: 4.0.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) swc-plugin-component-annotate: specifier: 1.13.0 version: 1.13.0 ts-checker-rspack-plugin: specifier: 1.2.6 - version: 1.2.6(@rspack/core@1.7.3(@swc/helpers@0.5.15))(typescript@5.9.3) + version: 1.2.6(@rspack/core@1.7.3)(typescript@5.9.3) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -552,7 +537,7 @@ importers: devDependencies: '@codecov/webpack-plugin': specifier: ^1.9.0 - version: 1.9.0(webpack-sources@3.3.3)(webpack@5.99.6(esbuild@0.25.10)) + version: 1.9.0(webpack-sources@3.3.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) '@emotion/eslint-plugin': specifier: ^11.12.0 version: 11.12.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3) @@ -573,13 +558,19 @@ importers: version: 2.40.0 '@sentry/jest-environment': specifier: 6.1.0 - version: 6.1.0(@sentry/node@10.27.0)(@sentry/profiling-node@10.27.0)(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3))) + version: 6.1.0(@sentry/node@10.27.0)(@sentry/profiling-node@10.27.0)(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3))) '@sentry/profiling-node': specifier: 10.27.0 version: 10.27.0 '@styled/typescript-styled-plugin': specifier: ^1.0.1 version: 1.0.1 + '@swc/core': + specifier: ^1.15.11 + version: 1.15.11 + '@swc/jest': + specifier: ^0.2.39 + version: 0.2.39(@swc/core@1.15.11) '@tanstack/eslint-plugin-query': specifier: 5.83.1 version: 5.83.1(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3) @@ -604,9 +595,6 @@ importers: '@typescript/native-preview': specifier: 7.0.0-dev.20260112.1 version: 7.0.0-dev.20260112.1 - babel-jest: - specifier: 30.0.4 - version: 30.0.4(@babel/core@7.28.0) eslint: specifier: 9.34.0 version: 9.34.0(jiti@2.6.1) @@ -624,7 +612,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.8.3)(eslint@9.34.0(jiti@2.6.1)) eslint-plugin-jest: specifier: 29.0.1 - version: 29.0.1(@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)))(typescript@5.9.3) + version: 29.0.1(@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)))(typescript@5.9.3) eslint-plugin-jest-dom: specifier: ^5.5.0 version: 5.5.0(@testing-library/dom@10.4.0)(eslint@9.34.0(jiti@2.6.1)) @@ -663,7 +651,7 @@ importers: version: 16.3.0 jest: specifier: 30.0.4 - version: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + version: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) jest-canvas-mock: specifier: ^2.5.2 version: 2.5.2 @@ -832,17 +820,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} @@ -873,12 +850,6 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} @@ -901,10 +872,6 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} @@ -914,36 +881,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -951,12 +888,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-async-generators@7.8.4': resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -978,12 +909,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} @@ -1054,542 +979,177 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/runtime@7.27.6': + resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/traverse@7.27.7': + resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.0': - resolution: {integrity: sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==} + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.0': - resolution: {integrity: sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@boundaries/elements@1.1.2': + resolution: {integrity: sha512-DnGHL+v36YVMoWhWZqyJYVZ9dapNm7h4N3/P0lDPirJj0CHVPkjChMCCotj74cg6LW7iPJZFGrdEfh0X0g2bmQ==} + engines: {node: '>=18.18'} - '@babel/plugin-transform-destructuring@7.28.0': - resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@codecov/bundler-plugin-core@1.9.0': + resolution: {integrity: sha512-UB0I5haL0gnF4ei46wxNo7ptCHqFAh3PnmcLLeXRb2zV7HeobOF8WRjOW/PwrXAphPS/6bL7PDUmh3ruVObGtg==} + engines: {node: '>=18.0.0'} - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} + '@codecov/webpack-plugin@1.9.0': + resolution: {integrity: sha512-A8KcQ8gs/Xge3DFyD95iEh6DVJqjHwR6pwz2q38xvXYwh63d2hv8Wnlyfg9vhvNdbTfCsQlGH22yx1jMgd6syA==} + engines: {node: '>=18.0.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + webpack: 5.x - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/color-helpers@5.0.2': + resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} + engines: {node: '>=18'} - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} - engines: {node: '>=6.9.0'} + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} - engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-tokenizer': ^3.0.3 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} + '@csstools/media-query-list-parser@3.0.1': + resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@csstools/css-parser-algorithms': ^3.0.1 + '@csstools/css-tokenizer': ^3.0.1 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} + '@csstools/selector-specificity@4.0.0': + resolution: {integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==} + engines: {node: '>=18'} peerDependencies: - '@babel/core': ^7.0.0-0 + postcss-selector-parser: ^6.1.0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@ctrl/tinycolor@4.1.0': + resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} + engines: {node: '>=14'} - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} - engines: {node: '>=6.9.0'} + '@dnd-kit/accessibility@3.1.0': + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: '>=16.8.0' - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} + '@dnd-kit/core@6.1.0': + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: '>=16.8.0' + react-dom: '>=16.8.0' - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} + '@dnd-kit/modifiers@7.0.0': + resolution: {integrity: sha512-BG/ETy3eBjFap7+zIti53f0PCLGDzNXyTmn6fSdrudORf+OH04MxrW4p5+mPu4mgMk9kM41iYONjc3DOUWTcfg==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} + '@dnd-kit/sortable@8.0.0': + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} peerDependencies: - '@babel/core': ^7.0.0-0 + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} - engines: {node: '>=6.9.0'} + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} peerDependencies: - '@babel/core': ^7.0.0-0 + react: '>=16.8.0' - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@babel/plugin-transform-object-rest-spread@7.28.0': - resolution: {integrity: sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@emotion/css@11.13.5': + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} + '@emotion/eslint-plugin@11.12.0': + resolution: {integrity: sha512-N0rtAVKk6w8RchWtexdG/GFbg48tdlO4cnq9Jg6H3ul3EDDgkYkPE0PKMb1/CJ7cDyYsiNPYVc3ZnWnd2/d0tA==} + engines: {node: '>=6'} peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-development@7.27.1': - resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-pure-annotations@7.27.1': - resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.28.0': - resolution: {integrity: sha512-LOAozRVbqxEVjSKfhGnuLoE4Kz4Oc5UJzuvFUhSsQzdCdaAQu06mG8zDv2GFSerM62nImUZ7K92vxnQcLSDlCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.27.1': - resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.28.0': - resolution: {integrity: sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-react@7.27.1': - resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.27.1': - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.26.10': - resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.7': - resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.0': - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@boundaries/elements@1.1.2': - resolution: {integrity: sha512-DnGHL+v36YVMoWhWZqyJYVZ9dapNm7h4N3/P0lDPirJj0CHVPkjChMCCotj74cg6LW7iPJZFGrdEfh0X0g2bmQ==} - engines: {node: '>=18.18'} - - '@codecov/bundler-plugin-core@1.9.0': - resolution: {integrity: sha512-UB0I5haL0gnF4ei46wxNo7ptCHqFAh3PnmcLLeXRb2zV7HeobOF8WRjOW/PwrXAphPS/6bL7PDUmh3ruVObGtg==} - engines: {node: '>=18.0.0'} - - '@codecov/webpack-plugin@1.9.0': - resolution: {integrity: sha512-A8KcQ8gs/Xge3DFyD95iEh6DVJqjHwR6pwz2q38xvXYwh63d2hv8Wnlyfg9vhvNdbTfCsQlGH22yx1jMgd6syA==} - engines: {node: '>=18.0.0'} - peerDependencies: - webpack: 5.x - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} - engines: {node: '>=18'} - - '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-color-parser@3.0.10': - resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} - engines: {node: '>=18'} - - '@csstools/media-query-list-parser@3.0.1': - resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.1 - '@csstools/css-tokenizer': ^3.0.1 - - '@csstools/selector-specificity@4.0.0': - resolution: {integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==} - engines: {node: '>=18'} - peerDependencies: - postcss-selector-parser: ^6.1.0 - - '@ctrl/tinycolor@4.1.0': - resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==} - engines: {node: '>=14'} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@dnd-kit/accessibility@3.1.0': - resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} - peerDependencies: - react: '>=16.8.0' - - '@dnd-kit/core@6.1.0': - resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@dnd-kit/modifiers@7.0.0': - resolution: {integrity: sha512-BG/ETy3eBjFap7+zIti53f0PCLGDzNXyTmn6fSdrudORf+OH04MxrW4p5+mPu4mgMk9kM41iYONjc3DOUWTcfg==} - peerDependencies: - '@dnd-kit/core': ^6.1.0 - react: '>=16.8.0' - - '@dnd-kit/sortable@8.0.0': - resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} - peerDependencies: - '@dnd-kit/core': ^6.1.0 - react: '>=16.8.0' - - '@dnd-kit/utilities@3.2.2': - resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} - peerDependencies: - react: '>=16.8.0' - - '@dual-bundle/import-meta-resolve@4.1.0': - resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} - - '@emmetio/abbreviation@2.3.3': - resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} - - '@emmetio/css-abbreviation@2.1.8': - resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} - - '@emmetio/scanner@1.0.4': - resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} - - '@emnapi/core@1.5.0': - resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - - '@emnapi/runtime@1.5.0': - resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} - - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - - '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - - '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - - '@emotion/css@11.13.5': - resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} - - '@emotion/eslint-plugin@11.12.0': - resolution: {integrity: sha512-N0rtAVKk6w8RchWtexdG/GFbg48tdlO4cnq9Jg6H3ul3EDDgkYkPE0PKMb1/CJ7cDyYsiNPYVc3ZnWnd2/d0tA==} - engines: {node: '>=6'} - peerDependencies: - eslint: 6 || 7 || 8 + eslint: 6 || 7 || 8 '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -1962,6 +1522,10 @@ packages: node-notifier: optional: true + '@jest/create-cache-key-function@30.2.0': + resolution: {integrity: sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.0.0': resolution: {integrity: sha512-xMbtoCeKJDto86GW6AiwVv7M4QAuI56R7dVBr1RNGYbOT44M2TIzOiske2RxopBqkumDY+A1H55pGvuribRY9A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2037,6 +1601,10 @@ packages: resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/snapshot-utils@30.0.4': resolution: {integrity: sha512-BEpX8M/Y5lG7MI3fmiO+xCnacOrVsnbqVrcDZIT8aSGkKV1w2WwvRQxSWw5SIS8ozg7+h8tSj5EO1Riqqxcdag==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2065,6 +1633,10 @@ packages: resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.2.0': + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -3369,15 +2941,93 @@ packages: '@styled/typescript-styled-plugin@1.0.1': resolution: {integrity: sha512-4n9uYJiui4hqGIEMvs/u7sfjbs1/84shYt2Fxcm0JQbvUGfuFhtsqVG5y1hSvw5kTwdpIe4rbXMMOwVHcuAh1g==} + '@swc/core-darwin-arm64@1.15.11': + resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.11': + resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.11': + resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.11': + resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.15.11': + resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.15.11': + resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.15.11': + resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.15.11': + resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.11': + resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.11': + resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.11': + resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/jest@0.2.39': + resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} + engines: {npm: '>= 7.0.0'} + peerDependencies: + '@swc/core': '*' + '@swc/plugin-emotion@14.3.0': resolution: {integrity: sha512-BGlMPa73k2u01gXJHULC5Pvt0Mgjt+/34ceOxN5IGVGvZu8h4ryG4K6p/+JUpUojfNTEng/hpIcmCWtOHmg7Pw==} + '@swc/types@0.1.25': + resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@tanstack/devtools-client@0.0.5': resolution: {integrity: sha512-hsNDE3iu4frt9cC2ppn1mNRnLKo2uc1/1hXAyY9z4UYb+o40M2clFAhiFoo4HngjfGJDV3x18KVVIq7W4Un+zA==} engines: {node: '>=18'} @@ -4359,21 +4009,6 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-preset-current-node-syntax@1.1.0: resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: @@ -4764,9 +4399,6 @@ packages: core-js-compat@3.41.0: resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - core-js-compat@3.44.0: - resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} - core-js@3.45.0: resolution: {integrity: sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==} @@ -6712,6 +6344,9 @@ packages: jsonc-parser@2.3.1: resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@6.2.0: resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} @@ -6804,9 +6439,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. @@ -7944,13 +7576,6 @@ packages: peerDependencies: react: '>=0.13.0 <16' - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} @@ -7975,13 +7600,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true @@ -8785,22 +8403,6 @@ packages: resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} @@ -9448,789 +9050,225 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.0': {} - - '@babel/core@7.28.0': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 - convert-source-map: 2.0.0 - debug: 4.4.1 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.28.0': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.28.0 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1 - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.27.1': - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.0 - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helper-wrap-function@7.27.1': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.27.6': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - - '@babel/parser@7.28.0': - dependencies: - '@babel/types': 7.28.0 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-block-scoping@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - - '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': + '@babel/core@7.28.0': dependencies: - '@babel/core': 7.28.0 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': + '@babel/generator@7.28.0': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.0 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-globals@7.28.0': {} - '@babel/plugin-transform-object-rest-spread@7.28.0(@babel/core@7.28.0)': + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/traverse': 7.27.4 + '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.0)': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.0 + + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.28.0)': + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.6': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': + '@babel/parser@7.28.0': dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color + '@babel/types': 7.28.0 - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.27.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) '@babel/helper-plugin-utils': 7.27.1 - '@babel/preset-env@7.28.0(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': dependencies: - '@babel/compat-data': 7.28.0 '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.28.0(@babel/core@7.28.0) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.44.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.0 - esutils: 2.0.3 - '@babel/preset-react@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color '@babel/runtime@7.26.10': dependencies: @@ -10317,11 +9355,11 @@ snapshots: transitivePeerDependencies: - webpack-sources - '@codecov/webpack-plugin@1.9.0(webpack-sources@3.3.3)(webpack@5.99.6(esbuild@0.25.10))': + '@codecov/webpack-plugin@1.9.0(webpack-sources@3.3.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@codecov/bundler-plugin-core': 1.9.0(webpack-sources@3.3.3) unplugin: 1.14.1(webpack-sources@3.3.3) - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) transitivePeerDependencies: - webpack-sources @@ -10824,7 +9862,7 @@ snapshots: jest-util: 30.0.2 slash: 3.0.0 - '@jest/core@30.0.4(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3))': + '@jest/core@30.0.4(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3))': dependencies: '@jest/console': 30.0.4 '@jest/pattern': 30.0.1 @@ -10839,7 +9877,7 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.0.2 - jest-config: 30.0.4(@types/node@22.19.2)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + jest-config: 30.0.4(@types/node@22.19.2)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) jest-haste-map: 30.0.2 jest-message-util: 30.0.2 jest-regex-util: 30.0.1 @@ -10860,6 +9898,10 @@ snapshots: - supports-color - ts-node + '@jest/create-cache-key-function@30.2.0': + dependencies: + '@jest/types': 30.2.0 + '@jest/diff-sequences@30.0.0': {} '@jest/diff-sequences@30.0.1': {} @@ -10926,7 +9968,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.19.2 + '@types/node': 22.19.7 jest-regex-util: 30.0.1 '@jest/reporters@30.0.4': @@ -10965,6 +10007,10 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.33 + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.33 + '@jest/snapshot-utils@30.0.4': dependencies: '@jest/types': 30.0.1 @@ -11032,6 +10078,16 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 + '@jest/types@30.2.0': + dependencies: + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.5 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.19.7 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.12': dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -11114,12 +10170,12 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} - '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.99.6(esbuild@0.25.10))': + '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) source-map: 0.7.4 optionalDependencies: - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) transitivePeerDependencies: - acorn - supports-color @@ -12223,13 +11279,13 @@ snapshots: '@rsdoctor/client@1.5.0': {} - '@rsdoctor/core@1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10))': + '@rsdoctor/core@1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@rsbuild/plugin-check-syntax': 1.6.0 - '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) browserslist-load-config: 1.0.1 enhanced-resolve: 5.12.0 es-toolkit: 1.44.0 @@ -12245,10 +11301,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10))': + '@rsdoctor/graph@1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) es-toolkit: 1.44.0 path-browserify: 1.0.1 source-map: 0.7.6 @@ -12256,15 +11312,15 @@ snapshots: - '@rspack/core' - webpack - '@rsdoctor/rspack-plugin@1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10))': + '@rsdoctor/rspack-plugin@1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: - '@rsdoctor/core': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + '@rsdoctor/core': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) optionalDependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) + '@rspack/core': 1.7.3 transitivePeerDependencies: - '@rsbuild/core' - bufferutil @@ -12272,12 +11328,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10))': + '@rsdoctor/sdk@1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@rsdoctor/client': 1.5.0 - '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) safer-buffer: 2.1.2 socket.io: 4.8.1 tapable: 2.2.3 @@ -12288,20 +11344,20 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10))': + '@rsdoctor/types@1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 '@types/tapable': 2.2.7 source-map: 0.7.6 optionalDependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) - webpack: 5.99.6(esbuild@0.25.10) + '@rspack/core': 1.7.3 + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) - '@rsdoctor/utils@1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10))': + '@rsdoctor/utils@1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@babel/code-frame': 7.26.2 - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) '@types/estree': 1.0.5 acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -12364,11 +11420,11 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.7.3 '@rspack/binding-win32-x64-msvc': 1.7.3 - '@rspack/cli@1.7.3(@rspack/core@1.7.3(@swc/helpers@0.5.15))(@types/express@4.17.25)(webpack@5.99.6(esbuild@0.25.10))': + '@rspack/cli@1.7.3(@rspack/core@1.7.3)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) - '@rspack/dev-server': 1.1.5(@rspack/core@1.7.3(@swc/helpers@0.5.15))(@types/express@4.17.25)(webpack@5.99.6(esbuild@0.25.10)) + '@rspack/core': 1.7.3 + '@rspack/dev-server': 1.1.5(@rspack/core@1.7.3)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) exit-hook: 4.0.0 webpack-bundle-analyzer: 4.10.2 transitivePeerDependencies: @@ -12380,21 +11436,19 @@ snapshots: - webpack - webpack-cli - '@rspack/core@1.7.3(@swc/helpers@0.5.15)': + '@rspack/core@1.7.3': dependencies: '@module-federation/runtime-tools': 0.22.0 '@rspack/binding': 1.7.3 '@rspack/lite-tapable': 1.1.0 - optionalDependencies: - '@swc/helpers': 0.5.15 - '@rspack/dev-server@1.1.5(@rspack/core@1.7.3(@swc/helpers@0.5.15))(@types/express@4.17.25)(webpack@5.99.6(esbuild@0.25.10))': + '@rspack/dev-server@1.1.5(@rspack/core@1.7.3)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) + '@rspack/core': 1.7.3 chokidar: 3.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.25) p-retry: 6.2.1 - webpack-dev-server: 5.2.2(webpack@5.99.6(esbuild@0.25.10)) + webpack-dev-server: 5.2.2(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) ws: 8.18.0 transitivePeerDependencies: - '@types/express' @@ -12556,11 +11610,11 @@ snapshots: '@sentry/core@10.27.0': {} - '@sentry/jest-environment@6.1.0(@sentry/node@10.27.0)(@sentry/profiling-node@10.27.0)(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)))': + '@sentry/jest-environment@6.1.0(@sentry/node@10.27.0)(@sentry/profiling-node@10.27.0)(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)))': dependencies: '@sentry/node': 10.27.0 '@sentry/profiling-node': 10.27.0 - jest: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + jest: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) '@sentry/node-core@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': dependencies: @@ -12650,12 +11704,12 @@ snapshots: dependencies: react: 19.2.3 - '@sentry/webpack-plugin@4.6.1(encoding@0.1.13)(webpack@5.99.6(esbuild@0.25.10))': + '@sentry/webpack-plugin@4.6.1(encoding@0.1.13)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': dependencies: '@sentry/bundler-plugin-core': 4.6.1(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) transitivePeerDependencies: - encoding - supports-color @@ -12758,16 +11812,73 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 + '@swc/core-darwin-arm64@1.15.11': + optional: true + + '@swc/core-darwin-x64@1.15.11': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.11': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.11': + optional: true + + '@swc/core-linux-arm64-musl@1.15.11': + optional: true + + '@swc/core-linux-x64-gnu@1.15.11': + optional: true + + '@swc/core-linux-x64-musl@1.15.11': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.11': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.11': + optional: true + + '@swc/core-win32-x64-msvc@1.15.11': + optional: true + + '@swc/core@1.15.11': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.25 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.11 + '@swc/core-darwin-x64': 1.15.11 + '@swc/core-linux-arm-gnueabihf': 1.15.11 + '@swc/core-linux-arm64-gnu': 1.15.11 + '@swc/core-linux-arm64-musl': 1.15.11 + '@swc/core-linux-x64-gnu': 1.15.11 + '@swc/core-linux-x64-musl': 1.15.11 + '@swc/core-win32-arm64-msvc': 1.15.11 + '@swc/core-win32-ia32-msvc': 1.15.11 + '@swc/core-win32-x64-msvc': 1.15.11 + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@swc/jest@0.2.39(@swc/core@1.15.11)': + dependencies: + '@jest/create-cache-key-function': 30.2.0 + '@swc/core': 1.15.11 + '@swc/counter': 0.1.3 + jsonc-parser: 3.3.1 + '@swc/plugin-emotion@14.3.0': dependencies: '@swc/counter': 0.1.3 + '@swc/types@0.1.25': + dependencies: + '@swc/counter': 0.1.3 + '@tanstack/devtools-client@0.0.5': dependencies: '@tanstack/devtools-event-client': 0.4.0 @@ -13924,30 +13035,6 @@ snapshots: cosmiconfig: 7.0.1 resolve: 1.22.10 - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.0): - dependencies: - '@babel/compat-data': 7.28.0 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.44.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 @@ -14274,11 +13361,11 @@ snapshots: dependencies: mime-db: 1.54.0 - compression-webpack-plugin@11.1.0(webpack@5.99.6(esbuild@0.25.10)): + compression-webpack-plugin@11.1.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) compression@1.8.1: dependencies: @@ -14339,10 +13426,6 @@ snapshots: dependencies: browserslist: 4.24.4 - core-js-compat@3.44.0: - dependencies: - browserslist: 4.25.1 - core-js@3.45.0: {} core-util-is@1.0.3: {} @@ -14388,7 +13471,7 @@ snapshots: css-functions-list@3.2.3: {} - css-loader@7.1.2(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)): + css-loader@7.1.2(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: icss-utils: 5.1.0(postcss@8.5.3) postcss: 8.5.3 @@ -14399,8 +13482,8 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) - webpack: 5.99.6(esbuild@0.25.10) + '@rspack/core': 1.7.3 + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) css-select@4.1.3: dependencies: @@ -15086,13 +14169,13 @@ snapshots: optionalDependencies: '@testing-library/dom': 10.4.0 - eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)))(typescript@5.9.3): + eslint-plugin-jest@29.0.1(@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.26.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3) eslint: 9.34.0(jiti@2.6.1) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.34.0(jiti@2.6.1))(typescript@5.9.3) - jest: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + jest: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) transitivePeerDependencies: - supports-color - typescript @@ -15949,7 +15032,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(@rspack/core@1.7.3(@swc/helpers@0.5.15))(webpack@5.99.6(esbuild@0.25.10)): + html-webpack-plugin@5.6.3(@rspack/core@1.7.3)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -15957,8 +15040,8 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) - webpack: 5.99.6(esbuild@0.25.10) + '@rspack/core': 1.7.3 + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) htmlparser2@10.0.0: dependencies: @@ -16393,15 +15476,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)): + jest-cli@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)): dependencies: - '@jest/core': 30.0.4(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + '@jest/core': 30.0.4(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) '@jest/test-result': 30.0.4 '@jest/types': 30.0.1 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + jest-config: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) jest-util: 30.0.2 jest-validate: 30.0.2 yargs: 17.7.2 @@ -16412,7 +15495,7 @@ snapshots: - supports-color - ts-node - jest-config@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)): + jest-config@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.0.1 @@ -16440,12 +15523,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.15.21 - ts-node: 10.9.2(@types/node@22.15.21)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.0.4(@types/node@22.19.2)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)): + jest-config@30.0.4(@types/node@22.19.2)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.0.1 @@ -16473,7 +15556,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.19.2 - ts-node: 10.9.2(@types/node@22.15.21)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -16770,12 +15853,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)): + jest@30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)): dependencies: - '@jest/core': 30.0.4(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + '@jest/core': 30.0.4(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) '@jest/types': 30.0.1 import-local: 3.2.0 - jest-cli: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3)) + jest-cli: 30.0.4(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -16895,6 +15978,8 @@ snapshots: jsonc-parser@2.3.1: {} + jsonc-parser@3.3.1: {} + jsonfile@6.2.0: dependencies: universalify: 2.0.1 @@ -16944,12 +16029,12 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 - less-loader@12.2.0(@rspack/core@1.7.3(@swc/helpers@0.5.15))(less@4.3.0)(webpack@5.99.6(esbuild@0.25.10)): + less-loader@12.2.0(@rspack/core@1.7.3)(less@4.3.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: less: 4.3.0 optionalDependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) - webpack: 5.99.6(esbuild@0.25.10) + '@rspack/core': 1.7.3 + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) less@4.3.0: dependencies: @@ -17001,8 +16086,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash.debounce@4.0.8: {} - lodash.isequal@4.5.0: {} lodash.merge@4.6.2: {} @@ -18454,12 +17537,6 @@ snapshots: react: 19.2.3 reflux-core: 0.3.0 - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - regenerator-runtime@0.14.0: {} regex-recursion@6.0.2: @@ -18490,17 +17567,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - - regjsgen@0.8.0: {} - regjsparser@0.12.0: dependencies: jsesc: 3.0.2 @@ -19096,9 +18162,9 @@ snapshots: strip-json-comments@5.0.3: {} - style-loader@4.0.0(webpack@5.99.6(esbuild@0.25.10)): + style-loader@4.0.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) style-to-js@1.1.16: dependencies: @@ -19209,15 +18275,16 @@ snapshots: tapable@2.3.0: {} - terser-webpack-plugin@5.3.16(esbuild@0.25.10)(webpack@5.99.6(esbuild@0.25.10)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.40.0 - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) optionalDependencies: + '@swc/core': 1.15.11 esbuild: 0.25.10 terser@5.40.0: @@ -19302,7 +18369,7 @@ snapshots: dependencies: typescript: 5.9.3 - ts-checker-rspack-plugin@1.2.6(@rspack/core@1.7.3(@swc/helpers@0.5.15))(typescript@5.9.3): + ts-checker-rspack-plugin@1.2.6(@rspack/core@1.7.3)(typescript@5.9.3): dependencies: '@babel/code-frame': 7.27.1 '@rspack/lite-tapable': 1.1.0 @@ -19313,14 +18380,14 @@ snapshots: picocolors: 1.1.1 typescript: 5.9.3 optionalDependencies: - '@rspack/core': 1.7.3(@swc/helpers@0.5.15) + '@rspack/core': 1.7.3 ts-morph@27.0.2: dependencies: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - ts-node@10.9.2(@types/node@22.15.21)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -19337,6 +18404,8 @@ snapshots: typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.15.11 optional: true tsconfig-paths@3.15.0: @@ -19450,17 +18519,6 @@ snapshots: undici@7.20.0: {} - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.2.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - unicode-trie@2.0.0: dependencies: pako: 0.2.9 @@ -19779,7 +18837,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@7.4.5(webpack@5.99.6(esbuild@0.25.10)): + webpack-dev-middleware@7.4.5(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: colorette: 2.0.20 memfs: 4.51.1 @@ -19788,9 +18846,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) - webpack-dev-server@5.2.2(webpack@5.99.6(esbuild@0.25.10)): + webpack-dev-server@5.2.2(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -19818,10 +18876,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.99.6(esbuild@0.25.10)) + webpack-dev-middleware: 7.4.5(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) ws: 8.18.0 optionalDependencies: - webpack: 5.99.6(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) transitivePeerDependencies: - bufferutil - debug @@ -19834,7 +18892,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.99.6(esbuild@0.25.10): + webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -19856,7 +18914,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.25.10)(webpack@5.99.6(esbuild@0.25.10)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: diff --git a/static/app/actionCreators/organization.spec.tsx b/static/app/actionCreators/organization.spec.tsx index 45f6117b26be5b..f66b5c0fae04f1 100644 --- a/static/app/actionCreators/organization.spec.tsx +++ b/static/app/actionCreators/organization.spec.tsx @@ -8,6 +8,14 @@ import OrganizationStore from 'sentry/stores/organizationStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import TeamStore from 'sentry/stores/teamStore'; +jest.mock('sentry/actionCreators/organizations', () => { + const actual = jest.requireActual('sentry/actionCreators/organizations'); + return { + ...actual, + setActiveOrganization: jest.fn(), + }; +}); + describe('OrganizationActionCreator', () => { const org = OrganizationFixture(); diff --git a/static/app/actionCreators/tags.spec.tsx b/static/app/actionCreators/tags.spec.tsx index 6b61b49ad8ac9f..3c0533a86d7f9f 100644 --- a/static/app/actionCreators/tags.spec.tsx +++ b/static/app/actionCreators/tags.spec.tsx @@ -5,6 +5,14 @@ import TagStore from 'sentry/stores/tagStore'; import {loadOrganizationTags} from './tags'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + }; +}); + describe('loadOrganizationTags', () => { const api = new MockApiClient(); const selection = { diff --git a/static/app/components/commandPalette/ui/content.spec.tsx b/static/app/components/commandPalette/ui/content.spec.tsx index 8a027cccde7bfd..88fef0ffdb3d96 100644 --- a/static/app/components/commandPalette/ui/content.spec.tsx +++ b/static/app/components/commandPalette/ui/content.spec.tsx @@ -6,6 +6,14 @@ import type {CommandPaletteAction} from 'sentry/components/commandPalette/types' import {CommandPaletteContent} from 'sentry/components/commandPalette/ui/content'; import {useCommandPaletteActions} from 'sentry/components/commandPalette/useCommandPaletteActions'; +jest.mock('sentry/actionCreators/modal', () => { + const actual = jest.requireActual('sentry/actionCreators/modal'); + return { + ...actual, + closeModal: jest.fn(), + }; +}); + function RegisterActions({actions}: {actions: CommandPaletteAction[]}) { useCommandPaletteActions(actions); return null; diff --git a/static/app/components/contentSliderDiff/index.spec.tsx b/static/app/components/contentSliderDiff/index.spec.tsx index 7cb686b5aa6f04..2b511ea2c3f368 100644 --- a/static/app/components/contentSliderDiff/index.spec.tsx +++ b/static/app/components/contentSliderDiff/index.spec.tsx @@ -1,12 +1,18 @@ import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; -import * as useDimensions from 'sentry/utils/useDimensions'; +import {useDimensions} from 'sentry/utils/useDimensions'; import {ContentSliderDiff} from '.'; +jest.mock('sentry/utils/useDimensions', () => ({ + useDimensions: jest.fn(), +})); + +const mockUseDimensions = jest.mocked(useDimensions); + describe('ContentSliderDiff', () => { it('divider can be dragged', async () => { - jest.spyOn(useDimensions, 'useDimensions').mockReturnValue({width: 300, height: 300}); + mockUseDimensions.mockReturnValue({width: 300, height: 300}); const mockDragHandleMouseDown = jest.fn(); @@ -30,7 +36,7 @@ describe('ContentSliderDiff', () => { }); it('does not render content when dimensions are zero', () => { - jest.spyOn(useDimensions, 'useDimensions').mockReturnValue({width: 0, height: 0}); + mockUseDimensions.mockReturnValue({width: 0, height: 0}); render( + value + .split('\n') + .map(line => line.trim()) + .filter(Boolean) + .join('\n'); // Mock window.matchMedia const mockMatchMedia = (matches: boolean) => ({ @@ -58,14 +64,13 @@ const setupMediaQueries = ( }; describe('rc', () => { - // Emotion appends ';' after each interpolated string value in a css template literal. - // So css`${output}`.styles === output + ';'. - it('returns a simple CSS declaration for a plain string value', () => { const output = rc('color', 'red', theme); - expect(css` - ${output} - `.styles).toBe(output + ';'); + expect( + normalizeCss(css` + ${output} + `.styles) + ).toEqual(normalizeCss(output)); }); it('returns undefined when value is undefined', () => { @@ -74,9 +79,11 @@ describe('rc', () => { it('applies a resolver to a plain value', () => { const output = rc('color', 'primary', theme, value => `resolved-${value}`); - expect(css` - ${output} - `.styles).toBe(output + ';'); + expect( + normalizeCss(css` + ${output} + `.styles) + ).toEqual(normalizeCss(output)); }); it('returns undefined when resolver returns undefined for a plain value', () => { @@ -86,17 +93,21 @@ describe('rc', () => { it('generates media queries for responsive values', () => { // First defined breakpoint gets both min-width and max-width; subsequent get min-width only. const output = rc('color', {xs: 'blue', md: 'green'}, theme); - expect(css` - ${output} - `.styles).toBe(output + ';'); + expect( + normalizeCss(css` + ${output} + `.styles) + ).toEqual(normalizeCss(output)); }); it('skips undefined intermediate breakpoints', () => { // xs and md are defined; 2xs, sm, lg, xl, 2xl are absent from the output. const output = rc('font-size', {xs: 'md', md: 'lg'}, theme); - expect(css` - ${output} - `.styles).toBe(output + ';'); + expect( + normalizeCss(css` + ${output} + `.styles) + ).toEqual(normalizeCss(output)); }); }); diff --git a/static/app/components/events/contexts/contextCard.spec.tsx b/static/app/components/events/contexts/contextCard.spec.tsx index 96f646c7dda298..e4560ebc29bcac 100644 --- a/static/app/components/events/contexts/contextCard.spec.tsx +++ b/static/app/components/events/contexts/contextCard.spec.tsx @@ -7,9 +7,24 @@ import {render, screen} from 'sentry-test/reactTestingLibrary'; import ContextCard from 'sentry/components/events/contexts/contextCard'; import * as iconTools from 'sentry/components/events/contexts/contextIcon'; +jest.mock('sentry/components/events/contexts/contextIcon', () => { + const actual = jest.requireActual('sentry/components/events/contexts/contextIcon'); + return { + ...actual, + getLogoImage: jest.fn(actual.getLogoImage), + }; +}); + +const mockGetLogoImage = jest.mocked(iconTools.getLogoImage); + describe('ContextCard', () => { const group = GroupFixture(); const project = ProjectFixture(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + it('renders the card with formatted context data', () => { const event = EventFixture(); const alias = 'Things in my Vicinity'; @@ -57,9 +72,7 @@ describe('ContextCard', () => { it('renders with icons if able', () => { const event = EventFixture(); - const iconSpy = jest - .spyOn(iconTools, 'getLogoImage') - .mockReturnValue('data:image/firefox'); + const iconSpy = mockGetLogoImage.mockReturnValue('data:image/firefox'); const browserContext = { type: 'browser', diff --git a/static/app/components/featureFeedback/feedbackModal.spec.tsx b/static/app/components/featureFeedback/feedbackModal.spec.tsx index 9f6e26e6b6a79d..84d194f4dfdbea 100644 --- a/static/app/components/featureFeedback/feedbackModal.spec.tsx +++ b/static/app/components/featureFeedback/feedbackModal.spec.tsx @@ -14,6 +14,14 @@ import {openModal} from 'sentry/actionCreators/modal'; import {FeedbackModal} from 'sentry/components/featureFeedback/feedbackModal'; import TextField from 'sentry/components/forms/fields/textField'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addSuccessMessage: jest.fn(), + }; +}); + describe('FeatureFeedback', () => { describe('default', () => { it('submits modal on click', async () => { diff --git a/static/app/components/pageFilters/actions.spec.tsx b/static/app/components/pageFilters/actions.spec.tsx index 9b240f955cfa11..91416d5667b5d5 100644 --- a/static/app/components/pageFilters/actions.spec.tsx +++ b/static/app/components/pageFilters/actions.spec.tsx @@ -20,6 +20,17 @@ import OrganizationStore from 'sentry/stores/organizationStore'; import localStorage from 'sentry/utils/localStorage'; jest.mock('sentry/utils/localStorage'); +jest.mock('sentry/components/pageFilters/persistence', () => { + const actual = jest.requireActual('sentry/components/pageFilters/persistence'); + return { + ...actual, + getPageFilterStorage: jest.fn(actual.getPageFilterStorage), + }; +}); + +const actualGetPageFilterStorage = jest.requireActual< + typeof import('sentry/components/pageFilters/persistence') +>('sentry/components/pageFilters/persistence').getPageFilterStorage; const {organization, projects} = initializeOrg({ projects: [ @@ -33,6 +44,9 @@ describe('PageFilters ActionCreators', () => { jest.spyOn(PageFiltersStore, 'updateProjects'); jest.spyOn(PageFiltersStore, 'onInitializeUrlState').mockImplementation(); jest.clearAllMocks(); + jest + .mocked(PageFilterPersistence.getPageFilterStorage) + .mockImplementation(actualGetPageFilterStorage); OrganizationStore.onUpdate(organization, {replace: true}); ConfigStore.set('user', UserFixture()); }); @@ -326,19 +340,17 @@ describe('PageFilters ActionCreators', () => { it('does not add non-pinned filters to query for pages with new page filters', () => { // Mock storage to have a saved value - const pageFilterStorageMock = jest - .spyOn(PageFilterPersistence, 'getPageFilterStorage') - .mockReturnValueOnce({ - state: { - project: [1], - environment: [], - start: null, - end: null, - period: '14d', - utc: null, - }, - pinnedFilters: new Set(), - }); + jest.mocked(PageFilterPersistence.getPageFilterStorage).mockReturnValueOnce({ + state: { + project: [1], + environment: [], + start: null, + end: null, + period: '14d', + utc: null, + }, + pinnedFilters: new Set(), + }); // Initialize state with a page that shouldn't restore from local storage initializeUrlState({ @@ -351,8 +363,6 @@ describe('PageFilters ActionCreators', () => { // Confirm that query params are not restored from local storage expect(router.replace).not.toHaveBeenCalled(); - - pageFilterStorageMock.mockRestore(); }); it('defaults to all projects when user has no member projects but has accessible projects', () => { @@ -396,19 +406,17 @@ describe('PageFilters ActionCreators', () => { it('uses pinned filters for pages with new page filters', () => { // Mock storage to have a saved/pinned value - const pageFilterStorageMock = jest - .spyOn(PageFilterPersistence, 'getPageFilterStorage') - .mockReturnValueOnce({ - state: { - project: [1], - environment: ['prod'], - start: null, - end: null, - period: '7d', - utc: null, - }, - pinnedFilters: new Set(['environments', 'datetime', 'projects']), - }); + jest.mocked(PageFilterPersistence.getPageFilterStorage).mockReturnValueOnce({ + state: { + project: [1], + environment: ['prod'], + start: null, + end: null, + period: '7d', + utc: null, + }, + pinnedFilters: new Set(['environments', 'datetime', 'projects']), + }); // Initialize state with a page that uses pinned filters initializeUrlState({ @@ -429,8 +437,6 @@ describe('PageFilters ActionCreators', () => { }, }) ); - - pageFilterStorageMock.mockRestore(); }); it('fallbacks to global state with storageNamespace empty', () => { diff --git a/static/app/components/pageFilters/container.spec.tsx b/static/app/components/pageFilters/container.spec.tsx index b2de4bc4d84edb..9d13cbb770aac5 100644 --- a/static/app/components/pageFilters/container.spec.tsx +++ b/static/app/components/pageFilters/container.spec.tsx @@ -13,6 +13,16 @@ import OrganizationStore from 'sentry/stores/organizationStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import localStorage from 'sentry/utils/localStorage'; +jest.mock('sentry/components/pageFilters/actions', () => { + const actual = jest.requireActual('sentry/components/pageFilters/actions'); + return { + ...actual, + updateDateTime: jest.fn(actual.updateDateTime), + updateEnvironments: jest.fn(actual.updateEnvironments), + updateProjects: jest.fn(actual.updateProjects), + }; +}); + describe('PageFiltersContainer', () => { const organization = OrganizationFixture(); const projects = [ @@ -21,12 +31,6 @@ describe('PageFiltersContainer', () => { ProjectFixture({id: '3', slug: 'project-3', environments: ['prod', 'staging']}), ]; - beforeAll(() => { - jest.spyOn(globalActions, 'updateDateTime'); - jest.spyOn(globalActions, 'updateEnvironments'); - jest.spyOn(globalActions, 'updateProjects'); - }); - beforeEach(() => { MockApiClient.clearMockResponses(); ProjectsStore.loadInitialData(projects); diff --git a/static/app/stores/groupingStore.spec.tsx b/static/app/stores/groupingStore.spec.tsx index e5ace757c6de4c..5a0f1963f5dfa9 100644 --- a/static/app/stores/groupingStore.spec.tsx +++ b/static/app/stores/groupingStore.spec.tsx @@ -1,6 +1,14 @@ import * as GroupActionCreators from 'sentry/actionCreators/group'; import GroupingStore from 'sentry/stores/groupingStore'; +jest.mock('sentry/actionCreators/group', () => { + const actual = jest.requireActual('sentry/actionCreators/group'); + return { + ...actual, + mergeGroups: jest.fn(actual.mergeGroups), + }; +}); + describe('Grouping Store', () => { let trigger!: jest.SpyInstance; @@ -102,7 +110,7 @@ describe('Grouping Store', () => { afterEach(() => { MockApiClient.clearMockResponses(); - jest.resetAllMocks(); + jest.clearAllMocks(); jest.restoreAllMocks(); }); @@ -353,7 +361,7 @@ describe('Grouping Store', () => { }); it('disables rows to be merged', async () => { - const mergeMock = jest.spyOn(GroupActionCreators, 'mergeGroups'); + const mergeMock = jest.mocked(GroupActionCreators.mergeGroups); trigger.mockReset(); GroupingStore.onToggleMerge('1'); diff --git a/static/app/utils/__snapshots__/highlightFuseMatches.spec.tsx.snap b/static/app/utils/__snapshots__/highlightFuseMatches.spec.tsx.snap index 4ae88887a19fdf..502c64c3399250 100644 --- a/static/app/utils/__snapshots__/highlightFuseMatches.spec.tsx.snap +++ b/static/app/utils/__snapshots__/highlightFuseMatches.spec.tsx.snap @@ -1,10 +1,10 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`highlightFuseMatches matches whole word 1`] = ` [ - + foo - , + , ] `; @@ -13,21 +13,21 @@ exports[`highlightFuseMatches renders a highlighted string 1`] = ` Auth , - + ent - , + , icati , - + on - , + , , - + to - , + , kens allow you to perform actions , diff --git a/static/app/utils/demoMode/index.spec.tsx b/static/app/utils/demoMode/index.spec.tsx index 2f34f8b1d9875b..2ec0932d63de4f 100644 --- a/static/app/utils/demoMode/index.spec.tsx +++ b/static/app/utils/demoMode/index.spec.tsx @@ -1,4 +1,5 @@ import ConfigStore from 'sentry/stores/configStore'; +import OrganizationStore from 'sentry/stores/organizationStore'; import { extraQueryParameter, @@ -63,22 +64,25 @@ describe('Demo Mode Functions', () => { describe('isDemoModeActive', () => { it('returns true if demoMode is enabled and user is not a superuser', () => { jest.spyOn(ConfigStore, 'get').mockReturnValue(true); - jest - .spyOn(require('sentry/utils/isActiveSuperuser'), 'isActiveSuperuser') - .mockReturnValue(false); + jest.spyOn(OrganizationStore, 'getState').mockReturnValue({ + organization: {access: []}, + } as any); expect(isDemoModeActive()).toBe(true); }); it('returns false if demoMode is enabled but user is a superuser', () => { jest.spyOn(ConfigStore, 'get').mockReturnValue(true); - jest - .spyOn(require('sentry/utils/isActiveSuperuser'), 'isActiveSuperuser') - .mockReturnValue(true); + jest.spyOn(OrganizationStore, 'getState').mockReturnValue({ + organization: {access: ['org:superuser']}, + } as any); expect(isDemoModeActive()).toBe(false); }); it('returns false if demoMode is not enabled', () => { jest.spyOn(ConfigStore, 'get').mockReturnValue(false); + jest.spyOn(OrganizationStore, 'getState').mockReturnValue({ + organization: {access: []}, + } as any); expect(isDemoModeActive()).toBe(false); }); }); diff --git a/static/app/utils/useFeedbackForm.spec.tsx b/static/app/utils/useFeedbackForm.spec.tsx index 0190bf21f15f20..42554c25956e13 100644 --- a/static/app/utils/useFeedbackForm.spec.tsx +++ b/static/app/utils/useFeedbackForm.spec.tsx @@ -7,6 +7,20 @@ import type { import * as useFeedbackSDKIntegration from 'sentry/components/feedbackButton/useFeedbackSDKIntegration'; import {GlobalFeedbackForm, useFeedbackForm} from 'sentry/utils/useFeedbackForm'; +jest.mock('sentry/components/feedbackButton/useFeedbackSDKIntegration', () => { + const actual = jest.requireActual( + 'sentry/components/feedbackButton/useFeedbackSDKIntegration' + ); + return { + ...actual, + useFeedbackSDKIntegration: jest.fn(actual.useFeedbackSDKIntegration), + }; +}); + +const mockUseFeedbackSDKIntegration = jest.mocked( + useFeedbackSDKIntegration.useFeedbackSDKIntegration +); + const mockForm = { appendToDom: jest.fn(), open: jest.fn(), @@ -27,10 +41,11 @@ const defaultOptions: NonNullable = { describe('useFeedbackForm', () => { beforeEach(() => { - jest - .spyOn(useFeedbackSDKIntegration, 'useFeedbackSDKIntegration') - .mockReturnValue({feedback: mockFeedback, defaultOptions}); jest.clearAllMocks(); + mockUseFeedbackSDKIntegration.mockReturnValue({ + feedback: mockFeedback, + defaultOptions, + }); }); it('can open the form using useFeedbackForm', async () => { diff --git a/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx b/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx index 79fbe268e0c887..a974913693f8a2 100644 --- a/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx +++ b/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx @@ -16,8 +16,10 @@ jest.mock('sentry/components/globalDrawer', () => { default: jest.fn(), }; }); +jest.mock('sentry/actionCreators/indicator'); -const mockedUseDrawer = useDrawer as unknown as jest.Mock; +const mockedUseDrawer = jest.mocked(useDrawer); +const mockAddErrorMessage = jest.mocked(indicators.addErrorMessage); describe('AssertionSuggestionsButton', () => { const organization = OrganizationFixture(); @@ -38,7 +40,6 @@ describe('AssertionSuggestionsButton', () => { beforeEach(() => { jest.resetAllMocks(); - jest.spyOn(indicators, 'addErrorMessage'); mockedUseDrawer.mockReturnValue({ openDrawer: mockOpenDrawer, @@ -77,7 +78,7 @@ describe('AssertionSuggestionsButton', () => { ); await waitFor(() => { - expect(indicators.addErrorMessage).toHaveBeenCalledWith('Please enter a URL first'); + expect(mockAddErrorMessage).toHaveBeenCalledWith('Please enter a URL first'); }); expect(mockOpenDrawer).not.toHaveBeenCalled(); }); diff --git a/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx b/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx index c1b5522177abd4..16dda3fe3f3544 100644 --- a/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx +++ b/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx @@ -6,6 +6,15 @@ import * as indicators from 'sentry/actionCreators/indicator'; import {TestUptimeMonitorButton} from 'sentry/views/alerts/rules/uptime/testUptimeMonitorButton'; import {PreviewCheckStatus} from 'sentry/views/alerts/rules/uptime/types'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + addSuccessMessage: jest.fn(), + }; +}); + describe('TestUptimeMonitorButton', () => { const organization = OrganizationFixture(); diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index d7db375199d73b..0b9d244fa36a51 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -35,6 +35,21 @@ import ViewEditDashboard from 'sentry/views/dashboards/view'; import useWidgetBuilderState from 'sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState'; import {OrganizationContext} from 'sentry/views/organizationContext'; +jest.mock('sentry/actionCreators/modal', () => { + const actual = jest.requireActual('sentry/actionCreators/modal'); + return { + ...actual, + openWidgetViewerModal: jest.fn(), + }; +}); +jest.mock('sentry/actionCreators/dashboards', () => { + const actual = jest.requireActual('sentry/actionCreators/dashboards'); + return { + ...actual, + updateDashboard: jest.fn(actual.updateDashboard), + }; +}); + jest.mock('sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState'); jest.mock('sentry/actionCreators/indicator'); @@ -228,7 +243,7 @@ describe('Dashboards > Detail', () => { }); it('opens the widget viewer modal in a prebuilt dashboard using the widget id specified in the url', async () => { - const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); + const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); render(, { router: RouterFixture({ @@ -584,27 +599,25 @@ describe('Dashboards > Detail', () => { expect(mockReleases).toHaveBeenCalledTimes(1); }); - it('hides add widget option', async () => { - const router = RouterFixture({ - location: initialData.router.location, - params: {orgId: 'org-slug', dashboardId: '1'}, - }); - // @ts-expect-error this is assigning to readonly property... - types.MAX_WIDGETS = 1; + it('hides add widget option', () => { + const maxWidgets = Array.from({length: types.MAX_WIDGETS}, (_, index) => + WidgetFixture({id: `${index + 1}`, title: `Widget ${index + 1}`}) + ); + jest.spyOn(console, 'error').mockImplementation(() => {}); render( - - - , + , { - router, - deprecatedRouterMocks: true, + organization: initialData.organization, } ); - // Enter edit mode. - await userEvent.click(await screen.findByRole('button', {name: 'edit-dashboard'})); - expect(screen.queryByRole('button', {name: 'Add widget'})).not.toBeInTheDocument(); + expect(screen.queryByRole('button', {name: 'Add Widget'})).not.toBeInTheDocument(); }); it('renders successfully if more widgets than stored layouts', async () => { @@ -799,7 +812,7 @@ describe('Dashboards > Detail', () => { location: {...initialData.router.location, pathname: '/widget/0/'}, params: {orgId: 'org-slug', dashboardId: '1', widgetId: '0'}, }); - const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); + const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); const widget = WidgetFixture({ queries: [ { @@ -846,7 +859,7 @@ describe('Dashboards > Detail', () => { }, params: {orgId: 'org-slug', dashboardId: '1', widgetId: '123'}, }); - const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); + const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/1/', body: DashboardFixture([], {id: '1', title: 'Custom Errors'}), @@ -975,7 +988,7 @@ describe('Dashboards > Detail', () => { params: {orgId: 'org-slug', dashboardId: '1', widgetId: '1'}, }); - const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); + const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/1/', body: DashboardFixture(widgets, { @@ -1008,7 +1021,7 @@ describe('Dashboards > Detail', () => { params: {orgId: 'org-slug', dashboardId: '1', widgetId: '1'}, }); - const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); + const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/1/', body: DashboardFixture(widgets, { @@ -1995,7 +2008,9 @@ describe('Dashboards > Detail', () => { }); describe('widget builder redesign', () => { - let mockUpdateDashboard!: jest.SpyInstance; + let mockUpdateDashboard!: jest.MockedFunction< + typeof dashboardActions.updateDashboard + >; beforeEach(() => { initialData = initializeOrg({ organization: OrganizationFixture({ @@ -2003,12 +2018,10 @@ describe('Dashboards > Detail', () => { }), }); - // Mock just the updateDashboard function - mockUpdateDashboard = jest - .spyOn(dashboardActions, 'updateDashboard') - .mockResolvedValue({ - ...DashboardFixture([WidgetFixture({id: '1', title: 'Custom Widget'})]), - }); + mockUpdateDashboard = jest.mocked(dashboardActions.updateDashboard); + mockUpdateDashboard.mockResolvedValue({ + ...DashboardFixture([WidgetFixture({id: '1', title: 'Custom Widget'})]), + }); jest.mocked(useWidgetBuilderState).mockReturnValue({ dispatch: jest.fn(), @@ -2017,7 +2030,7 @@ describe('Dashboards > Detail', () => { }); afterEach(() => { - mockUpdateDashboard.mockRestore(); + mockUpdateDashboard.mockReset(); }); it('opens the widget builder slideout when clicking add widget', async () => { diff --git a/static/app/views/dashboards/widgetCard/index.spec.tsx b/static/app/views/dashboards/widgetCard/index.spec.tsx index 9efc92b99976a0..adef70574c1d32 100644 --- a/static/app/views/dashboards/widgetCard/index.spec.tsx +++ b/static/app/views/dashboards/widgetCard/index.spec.tsx @@ -25,6 +25,22 @@ import {TableWidgetVisualization} from 'sentry/views/dashboards/widgets/tableWid import {DashboardsMEPProvider} from './dashboardsMEPContext'; +jest.mock('sentry/actionCreators/modal', () => { + const actual = jest.requireActual('sentry/actionCreators/modal'); + return { + ...actual, + openDashboardWidgetQuerySelectorModal: jest.fn(), + }; +}); + +jest.mock('sentry/components/charts/lineChart', () => { + const actual = jest.requireActual('sentry/components/charts/lineChart'); + return { + ...actual, + LineChart: jest.fn(), + }; +}); + jest.mock('sentry/views/dashboards/widgets/tableWidget/tableWidgetVisualization', () => ({ TableWidgetVisualization: jest.fn(() =>
), })); diff --git a/static/app/views/detectors/edit.spec.tsx b/static/app/views/detectors/edit.spec.tsx index 22ba13a2114292..8f50a1f9087814 100644 --- a/static/app/views/detectors/edit.spec.tsx +++ b/static/app/views/detectors/edit.spec.tsx @@ -444,9 +444,7 @@ describe('DetectorEdit', () => { await screen.findByRole('link', {name: detectorWithOkEqualsHigh.name}) ).toBeInTheDocument(); - expect(screen.getByText('Default').closest('label')).toHaveClass( - 'css-1aktlwe-RadioLineItem' - ); + expect(screen.getByRole('radio', {name: 'Default'})).toBeChecked(); // Switching to Custom should reveal prefilled resolution input with the current OK value await userEvent.click(screen.getByRole('radio', {name: 'Custom'})); diff --git a/static/app/views/discover/homepage.spec.tsx b/static/app/views/discover/homepage.spec.tsx index 6c7522bb844efd..452363e60c922d 100644 --- a/static/app/views/discover/homepage.spec.tsx +++ b/static/app/views/discover/homepage.spec.tsx @@ -18,6 +18,14 @@ import {DEFAULT_EVENT_VIEW} from 'sentry/views/discover/results/data'; import Homepage from './homepage'; +jest.mock('sentry/components/pageFilters/persistence', () => { + const actual = jest.requireActual('sentry/components/pageFilters/persistence'); + return { + ...actual, + getPageFilterStorage: jest.fn(actual.getPageFilterStorage), + }; +}); + describe('Discover > Homepage', () => { const features = ['discover-query']; let organization: ReturnType; @@ -377,7 +385,7 @@ describe('Discover > Homepage', () => { repository: null, }; jest - .spyOn(pageFilterUtils, 'getPageFilterStorage') + .mocked(pageFilterUtils.getPageFilterStorage) .mockReturnValueOnce(PageFiltersStorageFixture({state})); render(, { diff --git a/static/app/views/discover/results.spec.tsx b/static/app/views/discover/results.spec.tsx index 8ee068e2e174c5..bc5b7b0ab42c6d 100644 --- a/static/app/views/discover/results.spec.tsx +++ b/static/app/views/discover/results.spec.tsx @@ -15,6 +15,14 @@ import { getTransactionViews, } from 'sentry/views/discover/results/data'; +jest.mock('sentry/components/pageFilters/persistence', () => { + const actual = jest.requireActual('sentry/components/pageFilters/persistence'); + return { + ...actual, + getPageFilterStorage: jest.fn(), + }; +}); + const FIELDS = [ { field: 'title', diff --git a/static/app/views/explore/logs/content.spec.tsx b/static/app/views/explore/logs/content.spec.tsx index 635d7cc81eb984..de5938e1f8f9d7 100644 --- a/static/app/views/explore/logs/content.spec.tsx +++ b/static/app/views/explore/logs/content.spec.tsx @@ -21,6 +21,23 @@ import type {OurLogsResponseItem} from 'sentry/views/explore/logs/types'; import LogsPage from './content'; +jest.mock('sentry/components/onboarding/useRecentCreatedProject', () => { + const actual = jest.requireActual( + 'sentry/components/onboarding/useRecentCreatedProject' + ); + return { + ...actual, + useRecentCreatedProject: jest.fn(actual.useRecentCreatedProject), + }; +}); + +const actualUseRecentCreatedProject = jest.requireActual< + typeof import('sentry/components/onboarding/useRecentCreatedProject') +>('sentry/components/onboarding/useRecentCreatedProject').useRecentCreatedProject; +const mockUseRecentCreatedProject = jest.mocked( + useRecentCreatedProjectHook.useRecentCreatedProject +); + describe('LogsPage', () => { let organization: Organization; let project: Project; @@ -31,6 +48,8 @@ describe('LogsPage', () => { beforeEach(() => { MockApiClient.clearMockResponses(); + jest.clearAllMocks(); + mockUseRecentCreatedProject.mockImplementation(actualUseRecentCreatedProject); const { organization: _organization, project: _project, @@ -142,14 +161,12 @@ describe('LogsPage', () => { body: [], }); - jest - .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') - .mockImplementation(() => { - return { - project: onboardingProject, - isProjectActive: true, - }; - }); + mockUseRecentCreatedProject.mockImplementation(() => { + return { + project: onboardingProject, + isProjectActive: true, + }; + }); onboardingSetupPageFilters(); diff --git a/static/app/views/explore/savedQueries/exploreParams.spec.tsx b/static/app/views/explore/savedQueries/exploreParams.spec.tsx index 3b824aaca8f277..3df893ff4439b2 100644 --- a/static/app/views/explore/savedQueries/exploreParams.spec.tsx +++ b/static/app/views/explore/savedQueries/exploreParams.spec.tsx @@ -4,6 +4,14 @@ import * as useDimensions from 'sentry/utils/useDimensions'; import {ExploreParams} from './exploreParams'; +jest.mock('sentry/utils/useDimensions', () => { + const actual = jest.requireActual('sentry/utils/useDimensions'); + return { + ...actual, + useDimensions: jest.fn(), + }; +}); + describe('ExploreParams', () => { it('should render', () => { jest.spyOn(useDimensions, 'useDimensions').mockReturnValue({width: 900, height: 100}); diff --git a/static/app/views/explore/spans/spansTab.spec.tsx b/static/app/views/explore/spans/spansTab.spec.tsx index dae29ef96ca299..d593ca339ee217 100644 --- a/static/app/views/explore/spans/spansTab.spec.tsx +++ b/static/app/views/explore/spans/spansTab.spec.tsx @@ -25,6 +25,10 @@ import {SpansQueryParamsProvider} from 'sentry/views/explore/spans/spansQueryPar import {SpansTabContent} from 'sentry/views/explore/spans/spansTab'; import {TraceItemDataset} from 'sentry/views/explore/types'; +const actualUseTraceItemTags = jest.requireActual< + typeof import('sentry/views/explore/contexts/spanTagsContext') +>('sentry/views/explore/contexts/spanTagsContext').useTraceItemTags; + function Wrapper({children}: {children: ReactNode}) { return ( @@ -36,6 +40,13 @@ function Wrapper({children}: {children: ReactNode}) { } jest.mock('sentry/utils/analytics'); +jest.mock('sentry/views/explore/contexts/spanTagsContext', () => { + const actual = jest.requireActual('sentry/views/explore/contexts/spanTagsContext'); + return { + ...actual, + useTraceItemTags: jest.fn(actual.useTraceItemTags), + }; +}); const mockStringTags: TagCollection = { stringTag1: {key: 'stringTag1', kind: FieldKind.TAG, name: 'stringTag1'}, @@ -330,18 +341,16 @@ describe('SpansTabContent', () => { let spies: jest.SpyInstance[]; beforeEach(() => { - const useSpanTagsSpy = jest - .spyOn(spanTagsModule, 'useTraceItemTags') - .mockImplementation(type => { - switch (type) { - case 'number': - return {tags: mockNumberTags, isLoading: false, secondaryAliases: {}}; - case 'string': - return {tags: mockStringTags, isLoading: false, secondaryAliases: {}}; - default: - return {tags: {}, isLoading: false, secondaryAliases: {}}; - } - }); + jest.mocked(spanTagsModule.useTraceItemTags).mockImplementation(type => { + switch (type) { + case 'number': + return {tags: mockNumberTags, isLoading: false, secondaryAliases: {}}; + case 'string': + return {tags: mockStringTags, isLoading: false, secondaryAliases: {}}; + default: + return {tags: {}, isLoading: false, secondaryAliases: {}}; + } + }); // Mock getBoundingClientRect for container const getBoundingClientRectSpy = jest @@ -379,10 +388,14 @@ describe('SpansTabContent', () => { .spyOn(HTMLElement.prototype, 'clientWidth', 'get') .mockReturnValue(1000); - spies = [useSpanTagsSpy, getBoundingClientRectSpy, clientWidthGetSpy]; + spies = [getBoundingClientRectSpy, clientWidthGetSpy]; }); afterEach(() => { + jest + .mocked(spanTagsModule.useTraceItemTags) + .mockImplementation(actualUseTraceItemTags); + jest.mocked(spanTagsModule.useTraceItemTags).mockClear(); spies.forEach(spy => spy.mockRestore()); }); diff --git a/static/app/views/issueDetails/groupEventCarousel.spec.tsx b/static/app/views/issueDetails/groupEventCarousel.spec.tsx index bfff6c3cdc8ebf..9ba36cb23fd7d6 100644 --- a/static/app/views/issueDetails/groupEventCarousel.spec.tsx +++ b/static/app/views/issueDetails/groupEventCarousel.spec.tsx @@ -6,9 +6,20 @@ import {UserFixture} from 'sentry-fixture/user'; import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import ConfigStore from 'sentry/stores/configStore'; -import * as useMedia from 'sentry/utils/useMedia'; +import useMedia from 'sentry/utils/useMedia'; import {GroupEventCarousel} from 'sentry/views/issueDetails/groupEventCarousel'; +jest.mock('sentry/utils/useMedia', () => { + const actual = jest.requireActual('sentry/utils/useMedia'); + return { + __esModule: true, + ...actual, + default: jest.fn(actual.default), + }; +}); + +const mockUseMedia = jest.mocked(useMedia); + describe('GroupEventCarousel', () => { const group = GroupFixture({id: 'group-id'}); const initialRouterConfig = { @@ -41,6 +52,7 @@ describe('GroupEventCarousel', () => { beforeEach(() => { jest.restoreAllMocks(); + jest.spyOn(console, 'error').mockImplementation(() => {}); Object.assign(navigator, { clipboard: { writeText: jest.fn().mockResolvedValue(''), @@ -70,7 +82,7 @@ describe('GroupEventCarousel', () => { }); it('can navigate to the oldest event', async () => { - jest.spyOn(useMedia, 'default').mockReturnValue(true); + mockUseMedia.mockReturnValue(true); const {router} = render(, { initialRouterConfig, @@ -92,7 +104,7 @@ describe('GroupEventCarousel', () => { }); it('can navigate to the latest event', async () => { - jest.spyOn(useMedia, 'default').mockReturnValue(true); + mockUseMedia.mockReturnValue(true); const {router} = render(, { initialRouterConfig, @@ -114,6 +126,8 @@ describe('GroupEventCarousel', () => { }); it('can navigate to the recommended event', async () => { + mockUseMedia.mockReturnValue(true); + const latestRouterConfig = { ...initialRouterConfig, location: { @@ -121,7 +135,6 @@ describe('GroupEventCarousel', () => { pathname: `/organizations/org-slug/issues/${group.id}/events/latest/`, }, }; - jest.spyOn(useMedia, 'default').mockReturnValue(true); const {router} = render(, { initialRouterConfig: latestRouterConfig, @@ -143,7 +156,7 @@ describe('GroupEventCarousel', () => { }); it('will disable the dropdown if there is only one event', async () => { - jest.spyOn(useMedia, 'default').mockReturnValue(true); + mockUseMedia.mockReturnValue(true); render(); @@ -152,7 +165,7 @@ describe('GroupEventCarousel', () => { it('if user default is recommended, it will show it as default', async () => { ConfigStore.loadInitialData(ConfigFixture({user: recommendedUser})); - jest.spyOn(useMedia, 'default').mockReturnValue(true); + mockUseMedia.mockReturnValue(true); render(); @@ -163,7 +176,7 @@ describe('GroupEventCarousel', () => { it('if user default is latest, it will show it as default', async () => { ConfigStore.loadInitialData(ConfigFixture({user: latestUser})); - jest.spyOn(useMedia, 'default').mockReturnValue(true); + mockUseMedia.mockReturnValue(true); render(); @@ -172,7 +185,7 @@ describe('GroupEventCarousel', () => { it('if user default is oldest, it will show it as default', async () => { ConfigStore.loadInitialData(ConfigFixture({user: oldestUser})); - jest.spyOn(useMedia, 'default').mockReturnValue(true); + mockUseMedia.mockReturnValue(true); render(); @@ -232,7 +245,7 @@ describe('GroupEventCarousel', () => { }); await userEvent.click(screen.getByRole('button', {name: /event actions/i})); - await userEvent.click(screen.getByRole('menuitemradio', {name: /copy event link/i})); + await userEvent.click(screen.getByRole('button', {name: /copy link/i})); expect(navigator.clipboard.writeText).toHaveBeenCalledWith( `http://localhost/organizations/org-slug/issues/group-id/events/event-id/` @@ -252,7 +265,7 @@ describe('GroupEventCarousel', () => { }); await userEvent.click(screen.getByRole('button', {name: /event actions/i})); - await userEvent.click(screen.getByRole('menuitemradio', {name: 'JSON (7.0 B)'})); + await userEvent.click(screen.getByRole('button', {name: /view json/i})); expect(window.open).toHaveBeenCalledWith( `https://us.sentry.io/api/0/projects/org-slug/project-slug/events/event-id/json/` diff --git a/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx b/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx index 0b95933b75f7dc..8b3f27fdc02f30 100644 --- a/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx +++ b/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx @@ -1,3 +1,4 @@ +import type {ReactNode} from 'react'; import {EventFixture} from 'sentry-fixture/event'; import {GroupFixture} from 'sentry-fixture/group'; import {OrganizationFixture} from 'sentry-fixture/organization'; @@ -15,11 +16,45 @@ import type {GroupSummaryData} from 'sentry/components/group/groupSummary'; import * as groupSummaryHooks from 'sentry/components/group/groupSummary'; import {EntryType} from 'sentry/types/event'; import * as copyToClipboardModule from 'sentry/utils/useCopyToClipboard'; -import * as useOrganization from 'sentry/utils/useOrganization'; +import * as useHotkeysModule from 'sentry/utils/useHotkeys'; import { issueAndEventToMarkdown, useCopyIssueDetails, } from 'sentry/views/issueDetails/streamline/hooks/useCopyIssueDetails'; +import {OrganizationContext} from 'sentry/views/organizationContext'; + +jest.mock('sentry/components/group/groupSummary', () => { + const actual = jest.requireActual('sentry/components/group/groupSummary'); + return { + ...actual, + useGroupSummaryData: jest.fn(actual.useGroupSummaryData), + }; +}); + +jest.mock('sentry/components/events/autofix/useAutofix', () => { + const actual = jest.requireActual('sentry/components/events/autofix/useAutofix'); + return { + ...actual, + useAutofixData: jest.fn(actual.useAutofixData), + }; +}); + +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(actual.addErrorMessage), + addSuccessMessage: jest.fn(actual.addSuccessMessage), + }; +}); + +jest.mock('sentry/utils/useHotkeys', () => { + const actual = jest.requireActual('sentry/utils/useHotkeys'); + return { + ...actual, + useHotkeys: jest.fn(actual.useHotkeys), + }; +}); jest.mock('sentry/utils/useCopyToClipboard'); @@ -30,6 +65,11 @@ describe('useCopyIssueDetails', () => { id: '123456', dateCreated: '2023-01-01T00:00:00Z', }); + const wrapper = ({children}: {children: ReactNode}) => ( + + {children} + + ); const mockGroupSummaryData: GroupSummaryData = { groupId: group.id, @@ -374,32 +414,31 @@ describe('useCopyIssueDetails', () => { copy: mockCopy, }); - jest.spyOn(groupSummaryHooks, 'useGroupSummaryData').mockReturnValue({ + jest.mocked(groupSummaryHooks.useGroupSummaryData).mockReturnValue({ data: mockGroupSummaryData, isPending: false, }); - jest.spyOn(autofixHooks, 'useAutofixData').mockReturnValue({ + jest.mocked(autofixHooks.useAutofixData).mockReturnValue({ data: mockAutofixData, isPending: false, }); - jest.spyOn(indicators, 'addSuccessMessage').mockImplementation(() => {}); - jest.spyOn(indicators, 'addErrorMessage').mockImplementation(() => {}); - jest.spyOn(useOrganization, 'default').mockReturnValue(organization); + jest.mocked(indicators.addSuccessMessage).mockImplementation(() => {}); + jest.mocked(indicators.addErrorMessage).mockImplementation(() => {}); }); it('calls useCopyToClipboard hook', () => { - renderHook(() => useCopyIssueDetails(group, event)); + renderHook(() => useCopyIssueDetails(group, event), {wrapper}); // Check that the hook was called expect(copyToClipboardModule.default).toHaveBeenCalled(); }); it('sets up hotkeys with the correct callbacks', () => { - const useHotkeysMock = jest.spyOn(require('sentry/utils/useHotkeys'), 'useHotkeys'); + const useHotkeysMock = jest.mocked(useHotkeysModule.useHotkeys); - renderHook(() => useCopyIssueDetails(group, event)); + renderHook(() => useCopyIssueDetails(group, event), {wrapper}); expect(useHotkeysMock).toHaveBeenCalledWith([ { @@ -423,7 +462,7 @@ describe('useCopyIssueDetails', () => { return Promise.resolve(text); }); - renderHook(() => useCopyIssueDetails(group, undefined)); + renderHook(() => useCopyIssueDetails(group, undefined), {wrapper}); // Trigger the keyboard event (command+alt+c) const keyboardEvent = new KeyboardEvent('keydown', { @@ -451,7 +490,7 @@ describe('useCopyIssueDetails', () => { return Promise.resolve(text); }); - renderHook(() => useCopyIssueDetails(group, event)); + renderHook(() => useCopyIssueDetails(group, event), {wrapper}); // Trigger the keyboard event (command+alt+c) const keyboardEvent = new KeyboardEvent('keydown', { diff --git a/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx b/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx index f16b54c1af7310..8a0b703a358fe6 100644 --- a/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx @@ -18,6 +18,14 @@ import type {GroupActivity} from 'sentry/types/group'; import {GroupActivityType} from 'sentry/types/group'; import StreamlinedActivitySection from 'sentry/views/issueDetails/streamline/sidebar/activitySection'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addSuccessMessage: jest.fn(actual.addSuccessMessage), + }; +}); + describe('StreamlinedActivitySection', () => { const project = ProjectFixture(); const user = UserFixture(); @@ -133,7 +141,7 @@ describe('StreamlinedActivitySection', () => { }); it('renders note and allows for edit', async () => { - jest.spyOn(indicators, 'addSuccessMessage'); + const addSuccessMessageMock = jest.mocked(indicators.addSuccessMessage); const editGroup = GroupFixture({ id: '1123', @@ -177,7 +185,7 @@ describe('StreamlinedActivitySection', () => { await userEvent.click(screen.getByRole('button', {name: 'Save comment'})); expect(editMock).toHaveBeenCalledTimes(1); - expect(indicators.addSuccessMessage).toHaveBeenCalledWith('Comment updated'); + expect(addSuccessMessageMock).toHaveBeenCalledWith('Comment updated'); }); it('renders note from a sentry app', async () => { diff --git a/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx b/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx index 61787030c37c99..2995f0dd118ddf 100644 --- a/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx @@ -16,8 +16,21 @@ import { } from 'sentry-test/reactTestingLibrary'; import {EntryType} from 'sentry/types/event'; +import * as issueTypeConfig from 'sentry/utils/issueTypeConfig'; import {SeerDrawer} from 'sentry/views/issueDetails/streamline/sidebar/seerDrawer'; +const actualGetConfigForIssueType = jest.requireActual< + typeof import('sentry/utils/issueTypeConfig') +>('sentry/utils/issueTypeConfig').getConfigForIssueType; + +jest.mock('sentry/utils/issueTypeConfig', () => { + const actual = jest.requireActual('sentry/utils/issueTypeConfig'); + return { + ...actual, + getConfigForIssueType: jest.fn(actual.getConfigForIssueType), + }; +}); + describe('SeerDrawer', () => { const organization = OrganizationFixture({ hideAiFeatures: false, @@ -295,15 +308,12 @@ describe('SeerDrawer', () => { body: {autofix: null}, }); - // Use jest.spyOn instead of jest.mock inside the test - const issueTypeConfigModule = require('sentry/utils/issueTypeConfig'); - const spy = jest - .spyOn(issueTypeConfigModule, 'getConfigForIssueType') - .mockImplementation(() => ({ - autofix: false, - issueSummary: {enabled: true}, - resources: null, - })); + const mockGetConfigForIssueType = jest.mocked(issueTypeConfig.getConfigForIssueType); + mockGetConfigForIssueType.mockImplementation(() => ({ + autofix: false, + issueSummary: {enabled: true}, + resources: null, + })); render(, { organization, @@ -317,8 +327,8 @@ describe('SeerDrawer', () => { expect(screen.getByTestId('seer-button-bar')).toBeInTheDocument(); expect(screen.queryByRole('button', {name: 'Start Over'})).not.toBeInTheDocument(); - // Restore the original implementation - spy.mockRestore(); + mockGetConfigForIssueType.mockImplementation(actualGetConfigForIssueType); + mockGetConfigForIssueType.mockClear(); }); it('shows ButtonBarWrapper with disabled Start Over button when hasAutofix is true but no autofixData', async () => { diff --git a/static/app/views/issueList/actions/index.spec.tsx b/static/app/views/issueList/actions/index.spec.tsx index e4ea9cb05a4ffc..4fcdfd6767ba28 100644 --- a/static/app/views/issueList/actions/index.spec.tsx +++ b/static/app/views/issueList/actions/index.spec.tsx @@ -22,6 +22,14 @@ import { } from 'sentry/views/issueList/issueSelectionContext'; import {DEFAULT_QUERY} from 'sentry/views/issueList/utils'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(), + }; +}); + const organization = OrganizationFixture(); const defaultProps = { diff --git a/static/app/views/onboarding/onboarding.spec.tsx b/static/app/views/onboarding/onboarding.spec.tsx index 454d20989e1c19..5993e2f2dc815b 100644 --- a/static/app/views/onboarding/onboarding.spec.tsx +++ b/static/app/views/onboarding/onboarding.spec.tsx @@ -21,6 +21,22 @@ import {trackAnalytics} from 'sentry/utils/analytics'; import {OnboardingWithoutContext} from 'sentry/views/onboarding/onboarding'; jest.mock('sentry/utils/analytics'); +jest.mock('sentry/components/onboarding/useRecentCreatedProject', () => { + const actual = jest.requireActual( + 'sentry/components/onboarding/useRecentCreatedProject' + ); + return { + ...actual, + useRecentCreatedProject: jest.fn(actual.useRecentCreatedProject), + }; +}); + +const actualUseRecentCreatedProject = jest.requireActual< + typeof import('sentry/components/onboarding/useRecentCreatedProject') +>('sentry/components/onboarding/useRecentCreatedProject').useRecentCreatedProject; +const mockUseRecentCreatedProject = jest.mocked( + useRecentCreatedProjectHook.useRecentCreatedProject +); describe('Onboarding', () => { beforeAll(() => { @@ -30,6 +46,7 @@ describe('Onboarding', () => { MockApiClient.clearMockResponses(); ProjectsStore.reset(); jest.clearAllMocks(); + mockUseRecentCreatedProject.mockImplementation(actualUseRecentCreatedProject); }); it('renders the welcome page', () => { @@ -334,14 +351,12 @@ describe('Onboarding', () => { body: [ProjectKeysFixture()[0]], }); - jest - .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') - .mockImplementation(() => { - return { - project: nextJsProject, - isProjectActive: false, - }; - }); + mockUseRecentCreatedProject.mockImplementation(() => { + return { + project: nextJsProject, + isProjectActive: false, + }; + }); render( { body: [], }); - jest - .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') - .mockImplementation(() => { - return { - project: reactProject, - isProjectActive: true, - }; - }); + mockUseRecentCreatedProject.mockImplementation(() => { + return { + project: reactProject, + isProjectActive: true, + }; + }); render( { body: [], }); - jest - .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') - .mockImplementation(() => { - return { - project: reactProject, - isProjectActive: true, - }; - }); + mockUseRecentCreatedProject.mockImplementation(() => { + return { + project: reactProject, + isProjectActive: true, + }; + }); render( { body: [nextJsProject], }); - // Mock for useRecentCreatedProject hook + mockUseRecentCreatedProject.mockImplementation(() => { + return { + project: nextJsProject, + isProjectActive: true, + }; + }); + MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${nextJsProject.slug}/overview/`, body: [nextJsProject], diff --git a/static/app/views/organizationContext.spec.tsx b/static/app/views/organizationContext.spec.tsx index 3ba5b1debf0348..265225819e2caa 100644 --- a/static/app/views/organizationContext.spec.tsx +++ b/static/app/views/organizationContext.spec.tsx @@ -16,6 +16,14 @@ import useOrganization from 'sentry/utils/useOrganization'; import {OrganizationContextProvider} from './organizationContext'; +jest.mock('sentry/actionCreators/organizations', () => { + const actual = jest.requireActual('sentry/actionCreators/organizations'); + return { + ...actual, + switchOrganization: jest.fn(), + }; +}); + jest.mock('sentry/actionCreators/sudoModal'); describe('OrganizationContext', () => { diff --git a/static/app/views/projectDetail/projectDetail.spec.tsx b/static/app/views/projectDetail/projectDetail.spec.tsx index f4af634f401192..d51c3eb17f04ac 100644 --- a/static/app/views/projectDetail/projectDetail.spec.tsx +++ b/static/app/views/projectDetail/projectDetail.spec.tsx @@ -16,6 +16,14 @@ import ProjectsStore from 'sentry/stores/projectsStore'; import ProjectDetail from './projectDetail'; import ProjectDetailContainer from './'; +jest.mock('sentry/components/pageFilters/actions', () => { + const actual = jest.requireActual('sentry/components/pageFilters/actions'); + return { + ...actual, + updateProjects: jest.fn(), + }; +}); + jest.mock('sentry/actionCreators/organization'); describe('ProjectDetail', () => { diff --git a/static/app/views/projectInstall/createProject.spec.tsx b/static/app/views/projectInstall/createProject.spec.tsx index 6297612878b9e4..af1ad09e5c41fa 100644 --- a/static/app/views/projectInstall/createProject.spec.tsx +++ b/static/app/views/projectInstall/createProject.spec.tsx @@ -19,6 +19,18 @@ import type {Organization} from 'sentry/types/organization'; import {CreateProject} from 'sentry/views/projectInstall/createProject'; import * as useValidateChannelModule from 'sentry/views/projectInstall/useValidateChannel'; +const actualUseValidateChannel = jest.requireActual< + typeof import('sentry/views/projectInstall/useValidateChannel') +>('sentry/views/projectInstall/useValidateChannel').useValidateChannel; + +jest.mock('sentry/views/projectInstall/useValidateChannel', () => { + const actual = jest.requireActual('sentry/views/projectInstall/useValidateChannel'); + return { + ...actual, + useValidateChannel: jest.fn(actual.useValidateChannel), + }; +}); + jest.mock('sentry/actionCreators/indicator'); function renderFrameworkModalMockRequests({ @@ -85,6 +97,10 @@ describe('CreateProject', () => { }); beforeEach(() => { + jest + .mocked(useValidateChannelModule.useValidateChannel) + .mockImplementation(actualUseValidateChannel); + TeamStore.reset(); TeamStore.loadUserTeams([teamNoAccess]); @@ -626,7 +642,7 @@ describe('CreateProject', () => { teamSlug: teamWithAccess.slug, }); - jest.spyOn(useValidateChannelModule, 'useValidateChannel').mockReturnValue({ + jest.mocked(useValidateChannelModule.useValidateChannel).mockReturnValue({ isFetching: true, clear: jest.fn(), error: undefined, diff --git a/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx b/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx index 463e2b1f64ccc6..becfaa7ea75eec 100644 --- a/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx +++ b/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx @@ -8,20 +8,31 @@ import type {IssueAlertNotificationProps} from 'sentry/views/projectInstall/issu import MessagingIntegrationAlertRule from 'sentry/views/projectInstall/messagingIntegrationAlertRule'; import * as useValidateChannelModule from 'sentry/views/projectInstall/useValidateChannel'; +const actualUseValidateChannel = jest.requireActual< + typeof import('sentry/views/projectInstall/useValidateChannel') +>('sentry/views/projectInstall/useValidateChannel').useValidateChannel; + +jest.mock('sentry/views/projectInstall/useValidateChannel', () => { + const actual = jest.requireActual('sentry/views/projectInstall/useValidateChannel'); + return { + ...actual, + useValidateChannel: jest.fn(actual.useValidateChannel), + }; +}); + function setupValidateChannelSpy() { const mockClear = jest.fn(); - const originalUseValidateChannel = useValidateChannelModule.useValidateChannel; - const spy = jest.spyOn(useValidateChannelModule, 'useValidateChannel'); - - spy.mockImplementation((...args) => { - const result = originalUseValidateChannel(...args); - return { - ...result, - clear: mockClear, - }; - }); + jest + .mocked(useValidateChannelModule.useValidateChannel) + .mockImplementation((...args) => { + const result = actualUseValidateChannel(...args); + return { + ...result, + clear: mockClear, + }; + }); - return {mockClear, spy}; + return {mockClear}; } describe('MessagingIntegrationAlertRule', () => { @@ -73,6 +84,10 @@ describe('MessagingIntegrationAlertRule', () => { }; beforeEach(() => { + jest + .mocked(useValidateChannelModule.useValidateChannel) + .mockImplementation(actualUseValidateChannel); + MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/${slackIntegrations[0]!.id}/channels/`, body: { @@ -280,7 +295,7 @@ describe('MessagingIntegrationAlertRule', () => { body: {valid: false, detail: 'Channel not found'}, }); - const {mockClear, spy} = setupValidateChannelSpy(); + const {mockClear} = setupValidateChannelSpy(); render( { await userEvent.click(screen.getByLabelText('Clear choices')); expect(mockSetChannel).toHaveBeenCalledWith(undefined); expect(mockClear).toHaveBeenCalled(); - - spy.mockRestore(); }); it('clears validation error when provider is changed', async () => { @@ -308,7 +321,7 @@ describe('MessagingIntegrationAlertRule', () => { body: {results: []}, }); - const {mockClear, spy} = setupValidateChannelSpy(); + const {mockClear} = setupValidateChannelSpy(); render( { await selectEvent.select(screen.getByText('Slack'), 'Discord'); expect(mockClear).toHaveBeenCalled(); - - spy.mockRestore(); }); it('clears validation error when integration is changed', async () => { @@ -337,7 +348,7 @@ describe('MessagingIntegrationAlertRule', () => { body: {results: []}, }); - const {mockClear, spy} = setupValidateChannelSpy(); + const {mockClear} = setupValidateChannelSpy(); render( { ); expect(mockClear).toHaveBeenCalled(); - - spy.mockRestore(); }); it('displays and sends channel id for microsoft teams', async () => { diff --git a/static/app/views/projectsDashboard/index.spec.tsx b/static/app/views/projectsDashboard/index.spec.tsx index cb2332de3f1e6e..dcc8a13ab21fb4 100644 --- a/static/app/views/projectsDashboard/index.spec.tsx +++ b/static/app/views/projectsDashboard/index.spec.tsx @@ -18,6 +18,14 @@ import TeamStore from 'sentry/stores/teamStore'; import ProjectsDashboard from 'sentry/views/projectsDashboard'; jest.unmock('lodash/debounce'); +jest.mock('sentry/actionCreators/projects', () => { + const actual = jest.requireActual('sentry/actionCreators/projects'); + return { + ...actual, + loadStatsForProject: jest.fn(actual.loadStatsForProject), + }; +}); + jest.mock('lodash/debounce', () => { const debounceMap = new Map(); const mockDebounce = @@ -558,7 +566,7 @@ describe('ProjectsDashboard', () => { ProjectsStatsStore.onStatsLoadSuccess([ {...projects[0]!, stats: [[1517281200, 2]]}, ]); - const loadStatsSpy = jest.spyOn(projectsActions, 'loadStatsForProject'); + const loadStatsSpy = jest.mocked(projectsActions.loadStatsForProject); const mock = MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/projects/`, body: projects.map(project => ({ diff --git a/static/app/views/seerExplorer/explorerPanel.spec.tsx b/static/app/views/seerExplorer/explorerPanel.spec.tsx index 8994b4642050d6..2c72887808cf14 100644 --- a/static/app/views/seerExplorer/explorerPanel.spec.tsx +++ b/static/app/views/seerExplorer/explorerPanel.spec.tsx @@ -14,6 +14,19 @@ import * as useSeerExplorerModule from './hooks/useSeerExplorer'; import ExplorerPanel from './explorerPanel'; // Mock createPortal to render content directly +jest.mock('./hooks/useSeerExplorer', () => { + const actual = jest.requireActual('./hooks/useSeerExplorer'); + return { + ...actual, + useSeerExplorer: jest.fn(actual.useSeerExplorer), + }; +}); + +const actualUseSeerExplorer = jest.requireActual< + typeof import('./hooks/useSeerExplorer') +>('./hooks/useSeerExplorer').useSeerExplorer; +const mockUseSeerExplorer = jest.mocked(useSeerExplorerModule.useSeerExplorer); + jest.mock('react-dom', () => ({ ...jest.requireActual('react-dom'), createPortal: (node: React.ReactNode) => node, @@ -93,6 +106,8 @@ describe('ExplorerPanel', () => { beforeEach(() => { MockApiClient.clearMockResponses(); sessionStorage.clear(); + jest.clearAllMocks(); + mockUseSeerExplorer.mockImplementation(actualUseSeerExplorer); // This matches the real behavior when no run ID is provided to the endpoint. MockApiClient.addMockResponse({ @@ -194,26 +209,24 @@ describe('ExplorerPanel', () => { }); it('shows error when hook returns isError=true', () => { - const useSeerExplorerSpy = jest - .spyOn(useSeerExplorerModule, 'useSeerExplorer') - .mockReturnValue({ - runId: 123, - sessionData: null, // should always be null when isError - sendMessage: jest.fn(), - deleteFromIndex: jest.fn(), - startNewSession: jest.fn(), - isPolling: false, - isError: true, // isError - isPending: false, - deletedFromIndex: null, - interruptRun: jest.fn(), - interruptRequested: false, - wasJustInterrupted: false, - clearWasJustInterrupted: jest.fn(), - switchToRun: jest.fn(), - respondToUserInput: jest.fn(), - createPR: jest.fn(), - }); + mockUseSeerExplorer.mockReturnValue({ + runId: 123, + sessionData: null, // should always be null when isError + sendMessage: jest.fn(), + deleteFromIndex: jest.fn(), + startNewSession: jest.fn(), + isPolling: false, + isError: true, // isError + isPending: false, + deletedFromIndex: null, + interruptRun: jest.fn(), + interruptRequested: false, + wasJustInterrupted: false, + clearWasJustInterrupted: jest.fn(), + switchToRun: jest.fn(), + respondToUserInput: jest.fn(), + createPR: jest.fn(), + }); renderWithPanelContext(, true, {organization}); @@ -223,8 +236,6 @@ describe('ExplorerPanel', () => { expect( screen.queryByText(/Ask Seer anything about your application./) ).not.toBeInTheDocument(); - - useSeerExplorerSpy.mockRestore(); }); }); @@ -257,7 +268,7 @@ describe('ExplorerPanel', () => { }; // Mock the hook to return our test data - jest.spyOn(useSeerExplorerModule, 'useSeerExplorer').mockReturnValue({ + mockUseSeerExplorer.mockReturnValue({ sessionData: mockSessionData as useSeerExplorerModule.SeerExplorerResponse['session'], sendMessage: jest.fn(), @@ -286,9 +297,6 @@ describe('ExplorerPanel', () => { expect( screen.queryByText(/Ask Seer anything about your application./) ).not.toBeInTheDocument(); - - // Restore the mock - jest.restoreAllMocks(); }); }); diff --git a/static/app/views/settings/account/apiTokenDetails.spec.tsx b/static/app/views/settings/account/apiTokenDetails.spec.tsx index 9500a6e383993e..0b391050dcddf2 100644 --- a/static/app/views/settings/account/apiTokenDetails.spec.tsx +++ b/static/app/views/settings/account/apiTokenDetails.spec.tsx @@ -5,6 +5,15 @@ import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrar import * as indicators from 'sentry/actionCreators/indicator'; import ApiTokenDetails from 'sentry/views/settings/account/apiTokenDetails'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + addSuccessMessage: jest.fn(), + }; +}); + describe('ApiNewToken', () => { MockApiClient.clearMockResponses(); diff --git a/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx b/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx index c7164f10006905..82c53697764f3e 100644 --- a/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx +++ b/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx @@ -16,6 +16,14 @@ import OrganizationFeatureFlagsChangeTracking, { type Secret, } from 'sentry/views/settings/featureFlags/changeTracking'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addSuccessMessage: jest.fn(), + }; +}); + describe('OrganizationFeatureFlagsIndex', () => { const SECRETS_ENDPOINT = '/organizations/org-slug/flags/signing-secrets/'; const LOGS_ENDPOINT = '/organizations/org-slug/flags/logs/'; diff --git a/static/app/views/settings/organizationAuthTokens/index.spec.tsx b/static/app/views/settings/organizationAuthTokens/index.spec.tsx index c14fc755b7d2d8..0f1906081a3122 100644 --- a/static/app/views/settings/organizationAuthTokens/index.spec.tsx +++ b/static/app/views/settings/organizationAuthTokens/index.spec.tsx @@ -15,6 +15,15 @@ import OrganizationsStore from 'sentry/stores/organizationsStore'; import type {OrgAuthToken} from 'sentry/types/user'; import {OrganizationAuthTokensIndex} from 'sentry/views/settings/organizationAuthTokens'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + addSuccessMessage: jest.fn(), + }; +}); + describe('OrganizationAuthTokensIndex', () => { const ENDPOINT = '/organizations/org-slug/org-auth-tokens/'; const PROJECTS_ENDPOINT = '/organizations/org-slug/projects/'; diff --git a/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx b/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx index 6562198ad1993e..63223dbc6cdb22 100644 --- a/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx +++ b/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx @@ -9,6 +9,14 @@ import * as indicators from 'sentry/actionCreators/indicator'; import type {OrgAuthToken} from 'sentry/types/user'; import OrganizationAuthTokensNewAuthToken from 'sentry/views/settings/organizationAuthTokens/newAuthToken'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + }; +}); + describe('OrganizationAuthTokensNewAuthToken', () => { const ENDPOINT = '/organizations/org-slug/org-auth-tokens/'; diff --git a/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx b/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx index 5cef01095a0ba2..e0e4cd8b2d120c 100644 --- a/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx +++ b/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx @@ -9,6 +9,15 @@ import OrganizationsStore from 'sentry/stores/organizationsStore'; import ConsoleSDKInvitesSettings from './index'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + addSuccessMessage: jest.fn(), + }; +}); + describe('ConsoleSDKInvitesSettings', () => { const ENDPOINT = '/organizations/org-slug/console-sdk-invites/'; diff --git a/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx b/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx index 6a8b7f3717aee4..53c88c7b95662e 100644 --- a/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx +++ b/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx @@ -20,6 +20,14 @@ import ProjectPerformance, { DetectorConfigCustomer, } from 'sentry/views/settings/projectPerformance/projectPerformance'; +jest.mock('sentry/utils/isActiveSuperuser', () => { + const actual = jest.requireActual('sentry/utils/isActiveSuperuser'); + return { + ...actual, + isActiveSuperuser: jest.fn(), + }; +}); + const manageDetectorData = [ {label: 'N+1 DB Queries Detection', key: 'n_plus_one_db_queries_detection_enabled'}, {label: 'Slow DB Queries Detection', key: 'slow_db_queries_detection_enabled'}, diff --git a/static/app/views/settings/projectPlugins/details.spec.tsx b/static/app/views/settings/projectPlugins/details.spec.tsx index 9d388b2de72e83..f506f3941d8274 100644 --- a/static/app/views/settings/projectPlugins/details.spec.tsx +++ b/static/app/views/settings/projectPlugins/details.spec.tsx @@ -8,6 +8,14 @@ import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrar import * as indicators from 'sentry/actionCreators/indicator'; import ProjectPluginDetails from 'sentry/views/settings/projectPlugins/details'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addSuccessMessage: jest.fn(), + }; +}); + describe('ProjectPluginDetails', () => { const organization = OrganizationFixture(); const project = ProjectFixture(); diff --git a/static/gsAdmin/components/customers/customerOverview.spec.tsx b/static/gsAdmin/components/customers/customerOverview.spec.tsx index 001b7268e421da..ea5ee95016df6a 100644 --- a/static/gsAdmin/components/customers/customerOverview.spec.tsx +++ b/static/gsAdmin/components/customers/customerOverview.spec.tsx @@ -444,27 +444,18 @@ describe('CustomerOverview', () => { }); it('renders admin-only product trials when feature flag is graduated (true)', () => { - // Mock BILLED_DATA_CATEGORY_INFO to simulate a graduated flag (adminOnlyProductTrialFeature: true) - const originalBilledDataCategoryInfo = constants.BILLED_DATA_CATEGORY_INFO; + const sizeAnalysisInfo = + constants.BILLED_DATA_CATEGORY_INFO[DataCategoryExact.SIZE_ANALYSIS]; + const originalAdminOnlyProductTrialFeature = + sizeAnalysisInfo.adminOnlyProductTrialFeature; try { - const mockedBilledDataCategoryInfo = { - ...originalBilledDataCategoryInfo, - [DataCategoryExact.SIZE_ANALYSIS]: { - ...originalBilledDataCategoryInfo[DataCategoryExact.SIZE_ANALYSIS], - adminOnlyProductTrialFeature: true, // Graduated - no feature flag check needed - }, - }; - - // Override the module export for this test - Object.defineProperty(constants, 'BILLED_DATA_CATEGORY_INFO', { - value: mockedBilledDataCategoryInfo, - configurable: true, - }); + ( + sizeAnalysisInfo as {adminOnlyProductTrialFeature: string | true} + ).adminOnlyProductTrialFeature = true; - // Organization has NO feature flags - but graduated flag should still show const organization = OrganizationFixture({ - features: [], // No feature flags! + features: [], }); const subscription = SubscriptionFixture({ organization, @@ -481,17 +472,13 @@ describe('CustomerOverview', () => { ); expect(screen.getByText('Product Trials')).toBeInTheDocument(); - // SIZE_ANALYSIS should appear because the flag is graduated (true), not requiring feature flag expect(screen.getByText('Size Analysis Builds:')).toBeInTheDocument(); - // Regular product trials should still appear expect(screen.getByText('Spans:')).toBeInTheDocument(); expect(screen.getByText('Replays:')).toBeInTheDocument(); } finally { - // Restore the original - always runs even if assertions fail - Object.defineProperty(constants, 'BILLED_DATA_CATEGORY_INFO', { - value: originalBilledDataCategoryInfo, - configurable: true, - }); + ( + sizeAnalysisInfo as {adminOnlyProductTrialFeature: string | true} + ).adminOnlyProductTrialFeature = originalAdminOnlyProductTrialFeature; } }); diff --git a/static/gsAdmin/components/customers/pendingChanges.spec.tsx b/static/gsAdmin/components/customers/pendingChanges.spec.tsx index 5c415eea713e0d..aac07921d93fb3 100644 --- a/static/gsAdmin/components/customers/pendingChanges.spec.tsx +++ b/static/gsAdmin/components/customers/pendingChanges.spec.tsx @@ -18,6 +18,14 @@ import {ANNUAL, RESERVED_BUDGET_QUOTA} from 'getsentry/constants'; import * as usePlanMigrations from 'getsentry/hooks/usePlanMigrations'; import {CohortId, OnDemandBudgetMode} from 'getsentry/types'; +jest.mock('getsentry/hooks/usePlanMigrations', () => { + const actual = jest.requireActual('getsentry/hooks/usePlanMigrations'); + return { + ...actual, + usePlanMigrations: jest.fn(actual.usePlanMigrations), + }; +}); + describe('PendingChanges', () => { it('renders null pendingChanges)', () => { const subscription = SubscriptionFixture({ @@ -284,8 +292,8 @@ describe('PendingChanges', () => { effectiveAt: migrationDate, }); jest - .spyOn(usePlanMigrations, 'usePlanMigrations') - .mockReturnValue({planMigrations: [migration], isLoading: false}); + .mocked(usePlanMigrations.usePlanMigrations) + .mockReturnValueOnce({planMigrations: [migration], isLoading: false}); const {container} = render(); diff --git a/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx b/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx index bd8c33cfb42f0e..f8d9d34e24edf3 100644 --- a/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx +++ b/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx @@ -8,15 +8,33 @@ import { } from 'sentry-test/reactTestingLibrary'; import selectEvent from 'sentry-test/selectEvent'; +import * as indicators from 'sentry/actionCreators/indicator'; +import * as modalActions from 'sentry/actionCreators/modal'; import type {Organization} from 'sentry/types/organization'; import deleteBillingMetricHistory from 'admin/components/deleteBillingMetricHistory'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addSuccessMessage: jest.fn(actual.addSuccessMessage), + addErrorMessage: jest.fn(actual.addErrorMessage), + }; +}); + +jest.mock('sentry/actionCreators/modal', () => { + const actual = jest.requireActual('sentry/actionCreators/modal'); + return { + ...actual, + openModal: jest.fn(actual.openModal), + }; +}); + describe('DeleteBillingMetricHistory', () => { - // Add afterEach to clean up after tests afterEach(() => { MockApiClient.clearMockResponses(); - jest.restoreAllMocks(); + jest.clearAllMocks(); }); const organization = OrganizationFixture({ @@ -131,11 +149,7 @@ describe('DeleteBillingMetricHistory', () => { }, }); - // Mock the success indicator - const successIndicator = jest.spyOn( - require('sentry/actionCreators/indicator'), - 'addSuccessMessage' - ); + const successIndicator = jest.mocked(indicators.addSuccessMessage); // Mock the API endpoint for deleting billing metric history const deleteBillingMetricHistoryMock = MockApiClient.addMockResponse({ @@ -208,11 +222,7 @@ describe('DeleteBillingMetricHistory', () => { }, }); - // Mock the error indicator - const errorIndicator = jest.spyOn( - require('sentry/actionCreators/indicator'), - 'addErrorMessage' - ); + const errorIndicator = jest.mocked(indicators.addErrorMessage); // Mock the API endpoint to return an error const deleteBillingMetricHistoryMock = MockApiClient.addMockResponse({ @@ -352,7 +362,7 @@ describe('deleteBillingMetricHistory export function', () => { it('opens modal with correct props', () => { const organization = OrganizationFixture(); const onSuccess = jest.fn(); - const openModalMock = jest.spyOn(require('sentry/actionCreators/modal'), 'openModal'); + const openModalMock = jest.mocked(modalActions.openModal); deleteBillingMetricHistory({organization, onSuccess}); diff --git a/static/gsAdmin/views/docIntegrations.spec.tsx b/static/gsAdmin/views/docIntegrations.spec.tsx index 9412d8da98741a..1dd5d0033f5603 100644 --- a/static/gsAdmin/views/docIntegrations.spec.tsx +++ b/static/gsAdmin/views/docIntegrations.spec.tsx @@ -12,6 +12,15 @@ import * as indicators from 'sentry/actionCreators/indicator'; import DocIntegrationDetails from 'admin/views/docIntegrationDetails'; import DocIntegrations from 'admin/views/docIntegrations'; +jest.mock('sentry/actionCreators/indicator', () => { + const actual = jest.requireActual('sentry/actionCreators/indicator'); + return { + ...actual, + addErrorMessage: jest.fn(), + addSuccessMessage: jest.fn(), + }; +}); + describe('Doc Integrations', () => { it('renders', () => { MockApiClient.addMockResponse({ diff --git a/static/gsAdmin/views/relocationDetails.spec.tsx b/static/gsAdmin/views/relocationDetails.spec.tsx index a564e438156427..efe93acbe38cd4 100644 --- a/static/gsAdmin/views/relocationDetails.spec.tsx +++ b/static/gsAdmin/views/relocationDetails.spec.tsx @@ -12,6 +12,14 @@ import * as useNavigateModule from 'sentry/utils/useNavigate'; import RelocationDetails from 'admin/views/relocationDetails'; +jest.mock('sentry/utils/useNavigate', () => { + const actual = jest.requireActual('sentry/utils/useNavigate'); + return { + ...actual, + useNavigate: jest.fn(), + }; +}); + jest.mock('sentry/actionCreators/indicator'); describe('Relocation Details', () => { diff --git a/static/gsApp/views/seerAutomation/index.spec.tsx b/static/gsApp/views/seerAutomation/index.spec.tsx index 7bdf3997e723db..046577773a3afe 100644 --- a/static/gsApp/views/seerAutomation/index.spec.tsx +++ b/static/gsApp/views/seerAutomation/index.spec.tsx @@ -72,11 +72,7 @@ describe('SeerAutomation', () => { // Project details populate the project list const projectItem = await screen.findByText(project.slug); expect(projectItem).toBeInTheDocument(); - - // Find the panel item containing the project - const panelItem = projectItem.closest('[class*="PanelItem"]'); - expect(panelItem).toBeInTheDocument(); - expect(panelItem).toHaveTextContent('Off'); + expect(screen.getAllByText('Off').length).toBeGreaterThan(0); // Find the select menu const select = await screen.findByRole('textbox', { diff --git a/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx b/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx index b37600c1584422..20ccd3420166e9 100644 --- a/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx +++ b/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx @@ -6,11 +6,24 @@ import {SubscriptionFixture} from 'getsentry-test/fixtures/subscription'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import {DataCategory} from 'sentry/types/core'; -import * as useMedia from 'sentry/utils/useMedia'; +import useMedia from 'sentry/utils/useMedia'; import SubscriptionStore from 'getsentry/stores/subscriptionStore'; import UsageOverview from 'getsentry/views/subscriptionPage/usageOverview'; +jest.mock('sentry/utils/useMedia', () => { + const actual = jest.requireActual('sentry/utils/useMedia'); + return { + __esModule: true, + default: jest.fn(actual.default), + }; +}); + +const actualUseMedia = jest.requireActual( + 'sentry/utils/useMedia' +).default; +const mockUseMedia = jest.mocked(useMedia); + describe('UsageOverview', () => { const organization = OrganizationFixture(); const subscription = SubscriptionFixture({ @@ -22,7 +35,8 @@ describe('UsageOverview', () => { const usageData = CustomerUsageFixture(); beforeEach(() => { - jest.restoreAllMocks(); + jest.clearAllMocks(); + mockUseMedia.mockImplementation(actualUseMedia); organization.features = ['seer-billing']; organization.access = ['org:billing']; SubscriptionStore.set(organization.slug, subscription); @@ -67,9 +81,7 @@ describe('UsageOverview', () => { }); it('opens panel based with no query params', async () => { - jest - .spyOn(useMedia, 'default') - .mockImplementation(query => query.includes('min-width')); + mockUseMedia.mockImplementation(query => query.includes('min-width')); render( { }); it('opens panel based on query params', async () => { - jest - .spyOn(useMedia, 'default') - .mockImplementation(query => query.includes('min-width')); + mockUseMedia.mockImplementation(query => query.includes('min-width')); render( { }); it('defaults to last selected when query param is invalid', async () => { - jest - .spyOn(useMedia, 'default') - .mockImplementation(query => query.includes('min-width')); + mockUseMedia.mockImplementation(query => query.includes('min-width')); render( { }); it('can switch panel by clicking table rows', async () => { - jest - .spyOn(useMedia, 'default') - .mockImplementation(query => query.includes('min-width')); + mockUseMedia.mockImplementation(query => query.includes('min-width')); render( return fn; }) ); +jest.mock('sentry/utils/performanceForSentry', () => { + const actual = jest.requireActual('sentry/utils/performanceForSentry'); + return { + ...actual, + VisuallyCompleteWithData: jest.fn( + (props: {children: ReactElement}) => props.children + ), + }; +}); jest.mock('sentry/utils/recreateRoute'); jest.mock('sentry/api'); -jest - .spyOn(performanceForSentry, 'VisuallyCompleteWithData') - .mockImplementation(props => props.children as ReactElement); jest.mock('scroll-to-element', () => jest.fn()); jest.mock('@stripe/stripe-js', () => ({ @@ -388,6 +393,19 @@ Object.defineProperty(global.self, 'crypto', { }, }); -if (typeof globalThis.structuredClone === 'undefined') { - globalThis.structuredClone = nodeStructuredClone; -} +const structuredClonePolyfill = + typeof nodeStructuredClone === 'function' + ? nodeStructuredClone + : (value: unknown) => JSON.parse(JSON.stringify(value)); + +Object.defineProperty(globalThis, 'structuredClone', { + value: structuredClonePolyfill, + configurable: true, + writable: true, +}); + +Object.defineProperty(window, 'structuredClone', { + value: structuredClonePolyfill, + configurable: true, + writable: true, +}); From 6ae34de4c2816218e05641c83ba56c6a96a3dd4f Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 09:47:58 -0800 Subject: [PATCH 02/28] test(ui): fix remaining swc mock/spy test init failures --- .../logs/usePersistentLogsPageParameters.spec.tsx | 3 ++- static/app/views/issueDetails/actions/index.spec.tsx | 9 ++++++++- static/app/views/issueList/overview.spec.tsx | 10 +++++++++- static/app/views/onboarding/useConfigureSdk.spec.tsx | 9 ++++++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx b/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx index ef5afc816611ac..ff2a1d9f9aa79a 100644 --- a/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx +++ b/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx @@ -21,7 +21,8 @@ jest.mock('sentry/utils/useNavigate', () => ({ })); jest.mock('sentry/views/explore/contexts/logs/logsPageParams', () => ({ - ...jest.requireActual('sentry/views/explore/contexts/logs/logsPageParams'), + LOGS_CURSOR_KEY: 'logsCursor', + LOGS_FIELDS_KEY: 'logsFields', usePersistedLogsPageParams: jest.fn(), })); diff --git a/static/app/views/issueDetails/actions/index.spec.tsx b/static/app/views/issueDetails/actions/index.spec.tsx index 948b4af3a92052..91e92ed84e2494 100644 --- a/static/app/views/issueDetails/actions/index.spec.tsx +++ b/static/app/views/issueDetails/actions/index.spec.tsx @@ -50,9 +50,16 @@ jest.mock('sentry/views/issueDetails/issueDetailsTour', () => ({ ...jest.requireActual('sentry/views/issueDetails/issueDetailsTour'), useIssueDetailsTour: () => mockTour(), })); +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); describe('GroupActions', () => { - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); beforeEach(() => { ConfigStore.init(); diff --git a/static/app/views/issueList/overview.spec.tsx b/static/app/views/issueList/overview.spec.tsx index 0195bfd30fcc04..8dd661c2725756 100644 --- a/static/app/views/issueList/overview.spec.tsx +++ b/static/app/views/issueList/overview.spec.tsx @@ -26,6 +26,14 @@ import * as parseLinkHeader from 'sentry/utils/parseLinkHeader'; import IssueListOverview from 'sentry/views/issueList/overview'; import {DEFAULT_QUERY} from 'sentry/views/issueList/utils'; +jest.mock('sentry/utils/parseLinkHeader', () => { + const actual = jest.requireActual('sentry/utils/parseLinkHeader'); + return { + __esModule: true, + default: jest.fn(actual.default), + }; +}); + const DEFAULT_LINKS_HEADER = '; rel="previous"; results="false"; cursor="1443575731:0:1", ' + '; rel="next"; results="true"; cursor="1443575000:0:0"'; @@ -68,7 +76,7 @@ describe('IssueList', () => { const group = GroupFixture({project}); const groupStats = GroupStatsFixture(); let fetchMembersRequest: jest.Mock; - const parseLinkHeaderSpy = jest.spyOn(parseLinkHeader, 'default'); + const parseLinkHeaderSpy = jest.mocked(parseLinkHeader.default); beforeEach(() => { Object.defineProperty(Element.prototype, 'clientWidth', {value: 1000}); diff --git a/static/app/views/onboarding/useConfigureSdk.spec.tsx b/static/app/views/onboarding/useConfigureSdk.spec.tsx index 2d439987de32e5..45e2b4382c7c01 100644 --- a/static/app/views/onboarding/useConfigureSdk.spec.tsx +++ b/static/app/views/onboarding/useConfigureSdk.spec.tsx @@ -12,8 +12,15 @@ import {useConfigureSdk} from './useConfigureSdk'; jest.mock('sentry/actionCreators/modal'); jest.mock('sentry/components/onboarding/useCreateProject'); +jest.mock('sentry/components/onboarding/onboardingContext', () => { + const actual = jest.requireActual('sentry/components/onboarding/onboardingContext'); + return { + ...actual, + useOnboardingContext: jest.fn(actual.useOnboardingContext), + }; +}); -const mockUseOnboardingContext = jest.spyOn(OnboardingContext, 'useOnboardingContext'); +const mockUseOnboardingContext = jest.mocked(OnboardingContext.useOnboardingContext); const mockCreateProject = jest.fn(); const mockOpenModal = openModal as jest.Mock; From b85bc513999dfb2838b01c1baf4ddabc073cac26 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 09:51:20 -0800 Subject: [PATCH 03/28] test(ui): fix swc failures in saved query and spans/alerts specs --- .../anomalyDetectionFeedbackBanner.spec.tsx | 10 +++- .../filterResultsStep/spansSearchBar.spec.tsx | 57 +++++++++++++++++++ .../views/discover/savedQuery/index.spec.tsx | 32 ++++++----- 3 files changed, 84 insertions(+), 15 deletions(-) diff --git a/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx b/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx index ce633d6f5ab955..733e02f7749c9f 100644 --- a/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx +++ b/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx @@ -8,6 +8,14 @@ import * as analytics from 'sentry/utils/analytics'; import AnomalyDetectionFeedbackBanner from './anomalyDetectionFeedbackBanner'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + describe('AnomalyDetectionFeedbackBanner', () => { const initialData = initializeOrg({ organization: { @@ -22,7 +30,7 @@ describe('AnomalyDetectionFeedbackBanner', () => { const project = initialData.project; const mockIncident = IncidentFixture({projects: [project.slug]}); const mockIncident2 = IncidentFixture({id: '6702'}); - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); it('submits anomaly detection feedback (yes)', async () => { const {container} = render( diff --git a/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx b/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx index b11e467b2d5fef..98239487499e63 100644 --- a/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx +++ b/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx @@ -9,6 +9,63 @@ import SpansSearchBar from 'sentry/views/dashboards/widgetBuilder/buildSteps/fil import {TraceItemAttributeProvider} from 'sentry/views/explore/contexts/traceItemAttributeContext'; import {TraceItemDataset} from 'sentry/views/explore/types'; +jest.mock('sentry/components/performance/spanSearchQueryBuilder', () => ({ + useSpanSearchQueryBuilderProps: jest.fn( + ({ + initialQuery, + onSearch, + onChange, + }: { + initialQuery: string; + onChange?: (query: string, state: {queryIsValid: boolean}) => void; + onSearch?: (query: string, state: {queryIsValid: boolean}) => void; + }) => ({ + spanSearchQueryBuilderProps: {initialQuery, onSearch, onChange}, + }) + ), +})); + +jest.mock('sentry/views/explore/components/traceItemSearchQueryBuilder', () => { + const React = jest.requireActual('react'); + const {WildcardOperators: Operators} = jest.requireActual( + 'sentry/components/searchSyntax/parser' + ); + + return { + TraceItemSearchQueryBuilder: ({ + initialQuery, + onSearch, + onChange, + }: { + initialQuery?: string; + onChange?: (query: string, state: {queryIsValid: boolean}) => void; + onSearch?: (query: string, state: {queryIsValid: boolean}) => void; + }) => { + const [value, setValue] = React.useState(initialQuery ?? ''); + return ( + setValue(e.target.value)} + onKeyDown={e => { + if (e.key !== 'Enter') { + return; + } + + const [key, rawValue = ''] = value.split(':'); + const submittedQuery = + key && rawValue ? `${key}:${Operators.CONTAINS}${rawValue}` : value; + const state = {queryIsValid: true}; + onSearch?.(submittedQuery, state); + onChange?.(submittedQuery, state); + }} + /> + ); + }, + }; +}); + // The endpoint seems to just return these fields, but the original TagValue type // has extra fields related to user information that we don't seem to need. interface MockedTagValue extends Pick< diff --git a/static/app/views/discover/savedQuery/index.spec.tsx b/static/app/views/discover/savedQuery/index.spec.tsx index ff138394ce9456..f4832c00ab987d 100644 --- a/static/app/views/discover/savedQuery/index.spec.tsx +++ b/static/app/views/discover/savedQuery/index.spec.tsx @@ -12,6 +12,15 @@ import SavedQueryButtonGroup from 'sentry/views/discover/savedQuery'; import * as utils from 'sentry/views/discover/savedQuery/utils'; jest.mock('sentry/actionCreators/modal'); +jest.mock('sentry/views/discover/savedQuery/utils', () => { + const actual = jest.requireActual('sentry/views/discover/savedQuery/utils'); + return { + ...actual, + handleCreateQuery: jest.fn(actual.handleCreateQuery), + handleDeleteQuery: jest.fn(actual.handleDeleteQuery), + handleUpdateQuery: jest.fn(actual.handleUpdateQuery), + }; +}); function mount( location: ReturnType, @@ -87,11 +96,10 @@ describe('Discover > SaveQueryButtonGroup', () => { }); describe('building on a new query', () => { - const mockUtils = jest - .spyOn(utils, 'handleCreateQuery') - .mockImplementation(() => Promise.resolve(savedQuery)); + const mockUtils = jest.mocked(utils.handleCreateQuery); beforeEach(() => { + mockUtils.mockImplementation(() => Promise.resolve(savedQuery)); mockUtils.mockClear(); }); @@ -257,12 +265,10 @@ describe('Discover > SaveQueryButtonGroup', () => { }); describe('viewing a saved query', () => { - let mockUtils: jest.SpyInstance; + const mockUtils = jest.mocked(utils.handleDeleteQuery); beforeEach(() => { - mockUtils = jest - .spyOn(utils, 'handleDeleteQuery') - .mockImplementation(() => Promise.resolve()); + mockUtils.mockImplementation(() => Promise.resolve()); }); afterEach(() => { @@ -340,7 +346,7 @@ describe('Discover > SaveQueryButtonGroup', () => { }); describe('modifying a saved query', () => { - let mockUtils: jest.SpyInstance; + let mockUtils: jest.Mock; it('renders the correct set of buttons', async () => { mount( @@ -362,9 +368,8 @@ describe('Discover > SaveQueryButtonGroup', () => { describe('updates the saved query', () => { beforeEach(() => { - mockUtils = jest - .spyOn(utils, 'handleUpdateQuery') - .mockImplementation(() => Promise.resolve(savedQuery)); + mockUtils = jest.mocked(utils.handleUpdateQuery); + mockUtils.mockImplementation(() => Promise.resolve(savedQuery)); }); afterEach(() => { @@ -402,9 +407,8 @@ describe('Discover > SaveQueryButtonGroup', () => { describe('creates a separate query', () => { beforeEach(() => { - mockUtils = jest - .spyOn(utils, 'handleCreateQuery') - .mockImplementation(() => Promise.resolve(savedQuery)); + mockUtils = jest.mocked(utils.handleCreateQuery); + mockUtils.mockImplementation(() => Promise.resolve(savedQuery)); }); afterEach(() => { From 46d7a456c73e41e08b94a8468e62f9fda6aee768 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 09:53:39 -0800 Subject: [PATCH 04/28] test(ui): convert analytics spies to swc-safe module mocks --- static/app/components/analyticsArea.spec.tsx | 10 +++++++++- static/app/components/archivedBox.spec.tsx | 10 +++++++++- .../highlights/editHighlightsModal.spec.tsx | 10 +++++++++- .../highlights/highlightsDataSection.spec.tsx | 20 +++++++++++++++++-- .../highlightsSettingsForm.spec.tsx | 10 +++++++++- .../banners/stacktraceBanners.spec.tsx | 10 +++++++++- .../interfaces/frame/stacktraceLink.spec.tsx | 10 +++++++++- 7 files changed, 72 insertions(+), 8 deletions(-) diff --git a/static/app/components/analyticsArea.spec.tsx b/static/app/components/analyticsArea.spec.tsx index 72da7d9c493acc..08a29e55148b96 100644 --- a/static/app/components/analyticsArea.spec.tsx +++ b/static/app/components/analyticsArea.spec.tsx @@ -6,6 +6,14 @@ import AnalyticsArea, {useAnalyticsArea} from 'sentry/components/analyticsArea'; import type {Organization} from 'sentry/types/organization'; import * as analytics from 'sentry/utils/analytics'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + function TestButton({org}: {org: Organization}) { const area = useAnalyticsArea(); @@ -24,7 +32,7 @@ function TestButton({org}: {org: Organization}) { describe('AnalyticsAreaProvider', () => { const organization = OrganizationFixture(); - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); it('Appends names when nested', async () => { render( diff --git a/static/app/components/archivedBox.spec.tsx b/static/app/components/archivedBox.spec.tsx index 68b6f694b47c95..1621df8f292b97 100644 --- a/static/app/components/archivedBox.spec.tsx +++ b/static/app/components/archivedBox.spec.tsx @@ -7,9 +7,17 @@ import * as analytics from 'sentry/utils/analytics'; import ArchivedBox from './archivedBox'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + describe('ArchivedBox', () => { const organization = OrganizationFixture(); - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); it('handles ignoreUntil', () => { render( diff --git a/static/app/components/events/highlights/editHighlightsModal.spec.tsx b/static/app/components/events/highlights/editHighlightsModal.spec.tsx index e2af5e5f3b9a35..556e342ed1b8ae 100644 --- a/static/app/components/events/highlights/editHighlightsModal.spec.tsx +++ b/static/app/components/events/highlights/editHighlightsModal.spec.tsx @@ -19,6 +19,14 @@ import * as analytics from 'sentry/utils/analytics'; import {TEST_EVENT_CONTEXTS, TEST_EVENT_TAGS} from './testUtils'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + describe('EditHighlightsModal', () => { const organization = OrganizationFixture(); const project = ProjectFixture(); @@ -52,7 +60,7 @@ describe('EditHighlightsModal', () => { tags: ['presetTag'], }; const closeModal = jest.fn(); - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); function renderModal(editHighlightModalProps?: Partial) { act(() => { diff --git a/static/app/components/events/highlights/highlightsDataSection.spec.tsx b/static/app/components/events/highlights/highlightsDataSection.spec.tsx index 4308b6c9c56cc5..bf1715402105fa 100644 --- a/static/app/components/events/highlights/highlightsDataSection.spec.tsx +++ b/static/app/components/events/highlights/highlightsDataSection.spec.tsx @@ -18,6 +18,22 @@ import * as analytics from 'sentry/utils/analytics'; import {TEST_EVENT_CONTEXTS, TEST_EVENT_TAGS} from './testUtils'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + +jest.mock('sentry/actionCreators/modal', () => { + const actual = jest.requireActual('sentry/actionCreators/modal'); + return { + ...actual, + openModal: jest.fn(actual.openModal), + }; +}); + describe('HighlightsDataSection', () => { const organization = OrganizationFixture(); const project = ProjectFixture(); @@ -35,8 +51,8 @@ describe('HighlightsDataSection', () => { browser: ['name', 'version'], }; const highlightContextTitles = ['User: email', 'Browser: name', 'Browser: version']; - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); - const modalSpy = jest.spyOn(modal, 'openModal'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const modalSpy = jest.mocked(modal.openModal); beforeEach(() => { MockApiClient.clearMockResponses(); diff --git a/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx b/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx index f3f9308d6f7b85..ccd2c6437d71ff 100644 --- a/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx +++ b/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx @@ -6,6 +6,14 @@ import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import HighlightsSettingsForm from 'sentry/components/events/highlights/highlightsSettingsForm'; import * as analytics from 'sentry/utils/analytics'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + describe('HighlightsSettingForm', () => { const organization = OrganizationFixture(); const highlightTags = ['environment', 'handled', 'release', 'url']; @@ -14,7 +22,7 @@ describe('HighlightsSettingForm', () => { browser: ['name', 'version'], }; const project = ProjectFixture({highlightContext, highlightTags}); - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); beforeEach(() => { MockApiClient.addMockResponse({ diff --git a/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx b/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx index 1074defbd455fa..56b876f037fb0c 100644 --- a/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx +++ b/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx @@ -13,6 +13,14 @@ import * as analytics from 'sentry/utils/analytics'; import {StacktraceBanners} from './stacktraceBanners'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + describe('StacktraceBanners', () => { const org = OrganizationFixture({ features: ['codecov-integration'], @@ -29,7 +37,7 @@ describe('StacktraceBanners', () => { }); const stacktrace = eventEntryStacktrace.data as Required; - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); let promptActivity: jest.Mock; let promptsUpdateMock: jest.Mock; diff --git a/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx b/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx index a57db8cc6e143d..0dae819707825f 100644 --- a/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx +++ b/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx @@ -17,6 +17,14 @@ import * as analytics from 'sentry/utils/analytics'; import {StacktraceLink} from './stacktraceLink'; +jest.mock('sentry/utils/analytics', () => { + const actual = jest.requireActual('sentry/utils/analytics'); + return { + ...actual, + trackAnalytics: jest.fn(actual.trackAnalytics), + }; +}); + describe('StacktraceLink', () => { const org = OrganizationFixture(); const platform = 'python'; @@ -32,7 +40,7 @@ describe('StacktraceLink', () => { const frame = {filename: '/sentry/app.py', lineNo: 233, inApp: true} as Frame; const config = RepositoryProjectPathConfigFixture({project, repo, integration}); - const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const analyticsSpy = jest.mocked(analytics.trackAnalytics); beforeEach(() => { jest.clearAllMocks(); From 977f68152f90dbdd8f90b202d9b5a76aba4d5e62 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:06:07 -0800 Subject: [PATCH 05/28] test(ui): minimize swc migration diff using mut-cjs-exports --- jest.config.ts | 1 + knip.config.ts | 4 ++ package.json | 1 + pnpm-lock.yaml | 14 ++++ .../app/actionCreators/organization.spec.tsx | 8 --- static/app/actionCreators/tags.spec.tsx | 8 --- static/app/components/analyticsArea.spec.tsx | 10 +-- static/app/components/archivedBox.spec.tsx | 10 +-- .../commandPalette/ui/content.spec.tsx | 8 --- .../contentSliderDiff/index.spec.tsx | 12 +--- .../events/contexts/contextCard.spec.tsx | 19 +---- .../highlights/editHighlightsModal.spec.tsx | 10 +-- .../highlights/highlightsDataSection.spec.tsx | 20 +----- .../highlightsSettingsForm.spec.tsx | 10 +-- .../banners/stacktraceBanners.spec.tsx | 10 +-- .../interfaces/frame/stacktraceLink.spec.tsx | 10 +-- .../featureFeedback/feedbackModal.spec.tsx | 8 --- .../components/pageFilters/actions.spec.tsx | 66 ++++++++---------- .../components/pageFilters/container.spec.tsx | 16 ++--- static/app/stores/groupingStore.spec.tsx | 12 +--- static/app/utils/demoMode/index.spec.tsx | 16 ++--- static/app/utils/useFeedbackForm.spec.tsx | 21 +----- .../anomalyDetectionFeedbackBanner.spec.tsx | 10 +-- .../assertionSuggestionsButton.spec.tsx | 7 +- .../uptime/testUptimeMonitorButton.spec.tsx | 9 --- static/app/views/dashboards/detail.spec.tsx | 69 ++++++++----------- .../filterResultsStep/spansSearchBar.spec.tsx | 57 --------------- .../dashboards/widgetCard/index.spec.tsx | 16 ----- static/app/views/discover/homepage.spec.tsx | 10 +-- static/app/views/discover/results.spec.tsx | 8 --- .../views/discover/savedQuery/index.spec.tsx | 32 ++++----- .../app/views/explore/logs/content.spec.tsx | 33 +++------ .../usePersistentLogsPageParameters.spec.tsx | 3 +- .../savedQueries/exploreParams.spec.tsx | 8 --- .../app/views/explore/spans/spansTab.spec.tsx | 39 ++++------- .../views/issueDetails/actions/index.spec.tsx | 9 +-- .../issueDetails/groupEventCarousel.spec.tsx | 33 +++------ .../hooks/useCopyIssueDetails.spec.tsx | 61 +++------------- .../sidebar/activitySection.spec.tsx | 12 +--- .../streamline/sidebar/seerDrawer.spec.tsx | 32 +++------ .../views/issueList/actions/index.spec.tsx | 8 --- static/app/views/issueList/overview.spec.tsx | 10 +-- .../app/views/onboarding/onboarding.spec.tsx | 67 +++++++----------- .../views/onboarding/useConfigureSdk.spec.tsx | 9 +-- static/app/views/organizationContext.spec.tsx | 8 --- .../projectDetail/projectDetail.spec.tsx | 8 --- .../projectInstall/createProject.spec.tsx | 18 +---- .../messagingIntegrationAlertRule.spec.tsx | 49 ++++++------- .../views/projectsDashboard/index.spec.tsx | 10 +-- .../views/seerExplorer/explorerPanel.spec.tsx | 60 +++++++--------- .../settings/account/apiTokenDetails.spec.tsx | 9 --- .../changeTracking/index.spec.tsx | 8 --- .../organizationAuthTokens/index.spec.tsx | 9 --- .../newAuthToken.spec.tsx | 8 --- .../index.spec.tsx | 9 --- .../projectPerformance.spec.tsx | 8 --- .../settings/projectPlugins/details.spec.tsx | 8 --- .../customers/customerOverview.spec.tsx | 35 +++++++--- .../customers/pendingChanges.spec.tsx | 12 +--- .../deleteBillingMetricHistory.spec.tsx | 36 ++++------ static/gsAdmin/views/docIntegrations.spec.tsx | 9 --- .../gsAdmin/views/relocationDetails.spec.tsx | 8 --- .../usageOverview/index.spec.tsx | 34 ++++----- tests/js/setup.ts | 32 ++------- 64 files changed, 320 insertions(+), 894 deletions(-) diff --git a/jest.config.ts b/jest.config.ts index 731aeabcdde70d..3bfe5bf204cf73 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -25,6 +25,7 @@ const swcConfig: SwcOptions = { }, experimental: { plugins: [ + ['@swc-contrib/mut-cjs-exports', {}], [ '@swc/plugin-emotion', { diff --git a/knip.config.ts b/knip.config.ts index 64e08bfe825210..bf0f9ecb3266a1 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -80,6 +80,10 @@ const config: KnipConfig = { 'process', // rspack.ProvidePlugin, needs better knip plugin '@types/webpack-env', // needed to make require.context work '@types/gtag.js', // needed for global `gtag` namespace typings + '@babel/preset-env', // Still used in jest + '@babel/preset-react', // Still used in jest + '@babel/preset-typescript', // Still used in jest + '@emotion/babel-plugin', // Still used in jest ], rules: { binaries: 'off', diff --git a/package.json b/package.json index dbabf44ba6d5a0..b228d5407ff20f 100644 --- a/package.json +++ b/package.json @@ -193,6 +193,7 @@ "@sentry/jest-environment": "6.1.0", "@sentry/profiling-node": "10.27.0", "@styled/typescript-styled-plugin": "^1.0.1", + "@swc-contrib/mut-cjs-exports": "^14.6.0", "@swc/core": "^1.15.11", "@swc/jest": "^0.2.39", "@tanstack/eslint-plugin-query": "5.83.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10982139931d8a..a0ee7bdfc1c296 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -565,6 +565,9 @@ importers: '@styled/typescript-styled-plugin': specifier: ^1.0.1 version: 1.0.1 + '@swc-contrib/mut-cjs-exports': + specifier: ^14.6.0 + version: 14.6.0(@swc/core@1.15.11)(@swc/jest@0.2.39(@swc/core@1.15.11)) '@swc/core': specifier: ^1.15.11 version: 1.15.11 @@ -2941,6 +2944,12 @@ packages: '@styled/typescript-styled-plugin@1.0.1': resolution: {integrity: sha512-4n9uYJiui4hqGIEMvs/u7sfjbs1/84shYt2Fxcm0JQbvUGfuFhtsqVG5y1hSvw5kTwdpIe4rbXMMOwVHcuAh1g==} + '@swc-contrib/mut-cjs-exports@14.6.0': + resolution: {integrity: sha512-vIzzDOZKI9GIfekiCxDdezf6nVW1YdMm1ausxkFTH8nxcoQ9eGqAnGBJJLwpKS6fjzfXJJiww4tbARLfhdRZww==} + peerDependencies: + '@swc/core': ^1.10.0 + '@swc/jest': ^0.2.37 + '@swc/core-darwin-arm64@1.15.11': resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} engines: {node: '>=10'} @@ -11812,6 +11821,11 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 + '@swc-contrib/mut-cjs-exports@14.6.0(@swc/core@1.15.11)(@swc/jest@0.2.39(@swc/core@1.15.11))': + dependencies: + '@swc/core': 1.15.11 + '@swc/jest': 0.2.39(@swc/core@1.15.11) + '@swc/core-darwin-arm64@1.15.11': optional: true diff --git a/static/app/actionCreators/organization.spec.tsx b/static/app/actionCreators/organization.spec.tsx index f66b5c0fae04f1..45f6117b26be5b 100644 --- a/static/app/actionCreators/organization.spec.tsx +++ b/static/app/actionCreators/organization.spec.tsx @@ -8,14 +8,6 @@ import OrganizationStore from 'sentry/stores/organizationStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import TeamStore from 'sentry/stores/teamStore'; -jest.mock('sentry/actionCreators/organizations', () => { - const actual = jest.requireActual('sentry/actionCreators/organizations'); - return { - ...actual, - setActiveOrganization: jest.fn(), - }; -}); - describe('OrganizationActionCreator', () => { const org = OrganizationFixture(); diff --git a/static/app/actionCreators/tags.spec.tsx b/static/app/actionCreators/tags.spec.tsx index 3c0533a86d7f9f..6b61b49ad8ac9f 100644 --- a/static/app/actionCreators/tags.spec.tsx +++ b/static/app/actionCreators/tags.spec.tsx @@ -5,14 +5,6 @@ import TagStore from 'sentry/stores/tagStore'; import {loadOrganizationTags} from './tags'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - }; -}); - describe('loadOrganizationTags', () => { const api = new MockApiClient(); const selection = { diff --git a/static/app/components/analyticsArea.spec.tsx b/static/app/components/analyticsArea.spec.tsx index 08a29e55148b96..72da7d9c493acc 100644 --- a/static/app/components/analyticsArea.spec.tsx +++ b/static/app/components/analyticsArea.spec.tsx @@ -6,14 +6,6 @@ import AnalyticsArea, {useAnalyticsArea} from 'sentry/components/analyticsArea'; import type {Organization} from 'sentry/types/organization'; import * as analytics from 'sentry/utils/analytics'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - function TestButton({org}: {org: Organization}) { const area = useAnalyticsArea(); @@ -32,7 +24,7 @@ function TestButton({org}: {org: Organization}) { describe('AnalyticsAreaProvider', () => { const organization = OrganizationFixture(); - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); it('Appends names when nested', async () => { render( diff --git a/static/app/components/archivedBox.spec.tsx b/static/app/components/archivedBox.spec.tsx index 1621df8f292b97..68b6f694b47c95 100644 --- a/static/app/components/archivedBox.spec.tsx +++ b/static/app/components/archivedBox.spec.tsx @@ -7,17 +7,9 @@ import * as analytics from 'sentry/utils/analytics'; import ArchivedBox from './archivedBox'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - describe('ArchivedBox', () => { const organization = OrganizationFixture(); - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); it('handles ignoreUntil', () => { render( diff --git a/static/app/components/commandPalette/ui/content.spec.tsx b/static/app/components/commandPalette/ui/content.spec.tsx index 88fef0ffdb3d96..8a027cccde7bfd 100644 --- a/static/app/components/commandPalette/ui/content.spec.tsx +++ b/static/app/components/commandPalette/ui/content.spec.tsx @@ -6,14 +6,6 @@ import type {CommandPaletteAction} from 'sentry/components/commandPalette/types' import {CommandPaletteContent} from 'sentry/components/commandPalette/ui/content'; import {useCommandPaletteActions} from 'sentry/components/commandPalette/useCommandPaletteActions'; -jest.mock('sentry/actionCreators/modal', () => { - const actual = jest.requireActual('sentry/actionCreators/modal'); - return { - ...actual, - closeModal: jest.fn(), - }; -}); - function RegisterActions({actions}: {actions: CommandPaletteAction[]}) { useCommandPaletteActions(actions); return null; diff --git a/static/app/components/contentSliderDiff/index.spec.tsx b/static/app/components/contentSliderDiff/index.spec.tsx index 2b511ea2c3f368..7cb686b5aa6f04 100644 --- a/static/app/components/contentSliderDiff/index.spec.tsx +++ b/static/app/components/contentSliderDiff/index.spec.tsx @@ -1,18 +1,12 @@ import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; -import {useDimensions} from 'sentry/utils/useDimensions'; +import * as useDimensions from 'sentry/utils/useDimensions'; import {ContentSliderDiff} from '.'; -jest.mock('sentry/utils/useDimensions', () => ({ - useDimensions: jest.fn(), -})); - -const mockUseDimensions = jest.mocked(useDimensions); - describe('ContentSliderDiff', () => { it('divider can be dragged', async () => { - mockUseDimensions.mockReturnValue({width: 300, height: 300}); + jest.spyOn(useDimensions, 'useDimensions').mockReturnValue({width: 300, height: 300}); const mockDragHandleMouseDown = jest.fn(); @@ -36,7 +30,7 @@ describe('ContentSliderDiff', () => { }); it('does not render content when dimensions are zero', () => { - mockUseDimensions.mockReturnValue({width: 0, height: 0}); + jest.spyOn(useDimensions, 'useDimensions').mockReturnValue({width: 0, height: 0}); render( { - const actual = jest.requireActual('sentry/components/events/contexts/contextIcon'); - return { - ...actual, - getLogoImage: jest.fn(actual.getLogoImage), - }; -}); - -const mockGetLogoImage = jest.mocked(iconTools.getLogoImage); - describe('ContextCard', () => { const group = GroupFixture(); const project = ProjectFixture(); - - beforeEach(() => { - jest.clearAllMocks(); - }); - it('renders the card with formatted context data', () => { const event = EventFixture(); const alias = 'Things in my Vicinity'; @@ -72,7 +57,9 @@ describe('ContextCard', () => { it('renders with icons if able', () => { const event = EventFixture(); - const iconSpy = mockGetLogoImage.mockReturnValue('data:image/firefox'); + const iconSpy = jest + .spyOn(iconTools, 'getLogoImage') + .mockReturnValue('data:image/firefox'); const browserContext = { type: 'browser', diff --git a/static/app/components/events/highlights/editHighlightsModal.spec.tsx b/static/app/components/events/highlights/editHighlightsModal.spec.tsx index 556e342ed1b8ae..e2af5e5f3b9a35 100644 --- a/static/app/components/events/highlights/editHighlightsModal.spec.tsx +++ b/static/app/components/events/highlights/editHighlightsModal.spec.tsx @@ -19,14 +19,6 @@ import * as analytics from 'sentry/utils/analytics'; import {TEST_EVENT_CONTEXTS, TEST_EVENT_TAGS} from './testUtils'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - describe('EditHighlightsModal', () => { const organization = OrganizationFixture(); const project = ProjectFixture(); @@ -60,7 +52,7 @@ describe('EditHighlightsModal', () => { tags: ['presetTag'], }; const closeModal = jest.fn(); - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); function renderModal(editHighlightModalProps?: Partial) { act(() => { diff --git a/static/app/components/events/highlights/highlightsDataSection.spec.tsx b/static/app/components/events/highlights/highlightsDataSection.spec.tsx index bf1715402105fa..4308b6c9c56cc5 100644 --- a/static/app/components/events/highlights/highlightsDataSection.spec.tsx +++ b/static/app/components/events/highlights/highlightsDataSection.spec.tsx @@ -18,22 +18,6 @@ import * as analytics from 'sentry/utils/analytics'; import {TEST_EVENT_CONTEXTS, TEST_EVENT_TAGS} from './testUtils'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - -jest.mock('sentry/actionCreators/modal', () => { - const actual = jest.requireActual('sentry/actionCreators/modal'); - return { - ...actual, - openModal: jest.fn(actual.openModal), - }; -}); - describe('HighlightsDataSection', () => { const organization = OrganizationFixture(); const project = ProjectFixture(); @@ -51,8 +35,8 @@ describe('HighlightsDataSection', () => { browser: ['name', 'version'], }; const highlightContextTitles = ['User: email', 'Browser: name', 'Browser: version']; - const analyticsSpy = jest.mocked(analytics.trackAnalytics); - const modalSpy = jest.mocked(modal.openModal); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); + const modalSpy = jest.spyOn(modal, 'openModal'); beforeEach(() => { MockApiClient.clearMockResponses(); diff --git a/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx b/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx index ccd2c6437d71ff..f3f9308d6f7b85 100644 --- a/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx +++ b/static/app/components/events/highlights/highlightsSettingsForm.spec.tsx @@ -6,14 +6,6 @@ import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import HighlightsSettingsForm from 'sentry/components/events/highlights/highlightsSettingsForm'; import * as analytics from 'sentry/utils/analytics'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - describe('HighlightsSettingForm', () => { const organization = OrganizationFixture(); const highlightTags = ['environment', 'handled', 'release', 'url']; @@ -22,7 +14,7 @@ describe('HighlightsSettingForm', () => { browser: ['name', 'version'], }; const project = ProjectFixture({highlightContext, highlightTags}); - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); beforeEach(() => { MockApiClient.addMockResponse({ diff --git a/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx b/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx index 56b876f037fb0c..1074defbd455fa 100644 --- a/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx +++ b/static/app/components/events/interfaces/crashContent/exception/banners/stacktraceBanners.spec.tsx @@ -13,14 +13,6 @@ import * as analytics from 'sentry/utils/analytics'; import {StacktraceBanners} from './stacktraceBanners'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - describe('StacktraceBanners', () => { const org = OrganizationFixture({ features: ['codecov-integration'], @@ -37,7 +29,7 @@ describe('StacktraceBanners', () => { }); const stacktrace = eventEntryStacktrace.data as Required; - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); let promptActivity: jest.Mock; let promptsUpdateMock: jest.Mock; diff --git a/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx b/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx index 0dae819707825f..a57db8cc6e143d 100644 --- a/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx +++ b/static/app/components/events/interfaces/frame/stacktraceLink.spec.tsx @@ -17,14 +17,6 @@ import * as analytics from 'sentry/utils/analytics'; import {StacktraceLink} from './stacktraceLink'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - describe('StacktraceLink', () => { const org = OrganizationFixture(); const platform = 'python'; @@ -40,7 +32,7 @@ describe('StacktraceLink', () => { const frame = {filename: '/sentry/app.py', lineNo: 233, inApp: true} as Frame; const config = RepositoryProjectPathConfigFixture({project, repo, integration}); - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); beforeEach(() => { jest.clearAllMocks(); diff --git a/static/app/components/featureFeedback/feedbackModal.spec.tsx b/static/app/components/featureFeedback/feedbackModal.spec.tsx index 84d194f4dfdbea..9f6e26e6b6a79d 100644 --- a/static/app/components/featureFeedback/feedbackModal.spec.tsx +++ b/static/app/components/featureFeedback/feedbackModal.spec.tsx @@ -14,14 +14,6 @@ import {openModal} from 'sentry/actionCreators/modal'; import {FeedbackModal} from 'sentry/components/featureFeedback/feedbackModal'; import TextField from 'sentry/components/forms/fields/textField'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addSuccessMessage: jest.fn(), - }; -}); - describe('FeatureFeedback', () => { describe('default', () => { it('submits modal on click', async () => { diff --git a/static/app/components/pageFilters/actions.spec.tsx b/static/app/components/pageFilters/actions.spec.tsx index 91416d5667b5d5..9b240f955cfa11 100644 --- a/static/app/components/pageFilters/actions.spec.tsx +++ b/static/app/components/pageFilters/actions.spec.tsx @@ -20,17 +20,6 @@ import OrganizationStore from 'sentry/stores/organizationStore'; import localStorage from 'sentry/utils/localStorage'; jest.mock('sentry/utils/localStorage'); -jest.mock('sentry/components/pageFilters/persistence', () => { - const actual = jest.requireActual('sentry/components/pageFilters/persistence'); - return { - ...actual, - getPageFilterStorage: jest.fn(actual.getPageFilterStorage), - }; -}); - -const actualGetPageFilterStorage = jest.requireActual< - typeof import('sentry/components/pageFilters/persistence') ->('sentry/components/pageFilters/persistence').getPageFilterStorage; const {organization, projects} = initializeOrg({ projects: [ @@ -44,9 +33,6 @@ describe('PageFilters ActionCreators', () => { jest.spyOn(PageFiltersStore, 'updateProjects'); jest.spyOn(PageFiltersStore, 'onInitializeUrlState').mockImplementation(); jest.clearAllMocks(); - jest - .mocked(PageFilterPersistence.getPageFilterStorage) - .mockImplementation(actualGetPageFilterStorage); OrganizationStore.onUpdate(organization, {replace: true}); ConfigStore.set('user', UserFixture()); }); @@ -340,17 +326,19 @@ describe('PageFilters ActionCreators', () => { it('does not add non-pinned filters to query for pages with new page filters', () => { // Mock storage to have a saved value - jest.mocked(PageFilterPersistence.getPageFilterStorage).mockReturnValueOnce({ - state: { - project: [1], - environment: [], - start: null, - end: null, - period: '14d', - utc: null, - }, - pinnedFilters: new Set(), - }); + const pageFilterStorageMock = jest + .spyOn(PageFilterPersistence, 'getPageFilterStorage') + .mockReturnValueOnce({ + state: { + project: [1], + environment: [], + start: null, + end: null, + period: '14d', + utc: null, + }, + pinnedFilters: new Set(), + }); // Initialize state with a page that shouldn't restore from local storage initializeUrlState({ @@ -363,6 +351,8 @@ describe('PageFilters ActionCreators', () => { // Confirm that query params are not restored from local storage expect(router.replace).not.toHaveBeenCalled(); + + pageFilterStorageMock.mockRestore(); }); it('defaults to all projects when user has no member projects but has accessible projects', () => { @@ -406,17 +396,19 @@ describe('PageFilters ActionCreators', () => { it('uses pinned filters for pages with new page filters', () => { // Mock storage to have a saved/pinned value - jest.mocked(PageFilterPersistence.getPageFilterStorage).mockReturnValueOnce({ - state: { - project: [1], - environment: ['prod'], - start: null, - end: null, - period: '7d', - utc: null, - }, - pinnedFilters: new Set(['environments', 'datetime', 'projects']), - }); + const pageFilterStorageMock = jest + .spyOn(PageFilterPersistence, 'getPageFilterStorage') + .mockReturnValueOnce({ + state: { + project: [1], + environment: ['prod'], + start: null, + end: null, + period: '7d', + utc: null, + }, + pinnedFilters: new Set(['environments', 'datetime', 'projects']), + }); // Initialize state with a page that uses pinned filters initializeUrlState({ @@ -437,6 +429,8 @@ describe('PageFilters ActionCreators', () => { }, }) ); + + pageFilterStorageMock.mockRestore(); }); it('fallbacks to global state with storageNamespace empty', () => { diff --git a/static/app/components/pageFilters/container.spec.tsx b/static/app/components/pageFilters/container.spec.tsx index 9d13cbb770aac5..b2de4bc4d84edb 100644 --- a/static/app/components/pageFilters/container.spec.tsx +++ b/static/app/components/pageFilters/container.spec.tsx @@ -13,16 +13,6 @@ import OrganizationStore from 'sentry/stores/organizationStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import localStorage from 'sentry/utils/localStorage'; -jest.mock('sentry/components/pageFilters/actions', () => { - const actual = jest.requireActual('sentry/components/pageFilters/actions'); - return { - ...actual, - updateDateTime: jest.fn(actual.updateDateTime), - updateEnvironments: jest.fn(actual.updateEnvironments), - updateProjects: jest.fn(actual.updateProjects), - }; -}); - describe('PageFiltersContainer', () => { const organization = OrganizationFixture(); const projects = [ @@ -31,6 +21,12 @@ describe('PageFiltersContainer', () => { ProjectFixture({id: '3', slug: 'project-3', environments: ['prod', 'staging']}), ]; + beforeAll(() => { + jest.spyOn(globalActions, 'updateDateTime'); + jest.spyOn(globalActions, 'updateEnvironments'); + jest.spyOn(globalActions, 'updateProjects'); + }); + beforeEach(() => { MockApiClient.clearMockResponses(); ProjectsStore.loadInitialData(projects); diff --git a/static/app/stores/groupingStore.spec.tsx b/static/app/stores/groupingStore.spec.tsx index 5a0f1963f5dfa9..e5ace757c6de4c 100644 --- a/static/app/stores/groupingStore.spec.tsx +++ b/static/app/stores/groupingStore.spec.tsx @@ -1,14 +1,6 @@ import * as GroupActionCreators from 'sentry/actionCreators/group'; import GroupingStore from 'sentry/stores/groupingStore'; -jest.mock('sentry/actionCreators/group', () => { - const actual = jest.requireActual('sentry/actionCreators/group'); - return { - ...actual, - mergeGroups: jest.fn(actual.mergeGroups), - }; -}); - describe('Grouping Store', () => { let trigger!: jest.SpyInstance; @@ -110,7 +102,7 @@ describe('Grouping Store', () => { afterEach(() => { MockApiClient.clearMockResponses(); - jest.clearAllMocks(); + jest.resetAllMocks(); jest.restoreAllMocks(); }); @@ -361,7 +353,7 @@ describe('Grouping Store', () => { }); it('disables rows to be merged', async () => { - const mergeMock = jest.mocked(GroupActionCreators.mergeGroups); + const mergeMock = jest.spyOn(GroupActionCreators, 'mergeGroups'); trigger.mockReset(); GroupingStore.onToggleMerge('1'); diff --git a/static/app/utils/demoMode/index.spec.tsx b/static/app/utils/demoMode/index.spec.tsx index 2ec0932d63de4f..2f34f8b1d9875b 100644 --- a/static/app/utils/demoMode/index.spec.tsx +++ b/static/app/utils/demoMode/index.spec.tsx @@ -1,5 +1,4 @@ import ConfigStore from 'sentry/stores/configStore'; -import OrganizationStore from 'sentry/stores/organizationStore'; import { extraQueryParameter, @@ -64,25 +63,22 @@ describe('Demo Mode Functions', () => { describe('isDemoModeActive', () => { it('returns true if demoMode is enabled and user is not a superuser', () => { jest.spyOn(ConfigStore, 'get').mockReturnValue(true); - jest.spyOn(OrganizationStore, 'getState').mockReturnValue({ - organization: {access: []}, - } as any); + jest + .spyOn(require('sentry/utils/isActiveSuperuser'), 'isActiveSuperuser') + .mockReturnValue(false); expect(isDemoModeActive()).toBe(true); }); it('returns false if demoMode is enabled but user is a superuser', () => { jest.spyOn(ConfigStore, 'get').mockReturnValue(true); - jest.spyOn(OrganizationStore, 'getState').mockReturnValue({ - organization: {access: ['org:superuser']}, - } as any); + jest + .spyOn(require('sentry/utils/isActiveSuperuser'), 'isActiveSuperuser') + .mockReturnValue(true); expect(isDemoModeActive()).toBe(false); }); it('returns false if demoMode is not enabled', () => { jest.spyOn(ConfigStore, 'get').mockReturnValue(false); - jest.spyOn(OrganizationStore, 'getState').mockReturnValue({ - organization: {access: []}, - } as any); expect(isDemoModeActive()).toBe(false); }); }); diff --git a/static/app/utils/useFeedbackForm.spec.tsx b/static/app/utils/useFeedbackForm.spec.tsx index 42554c25956e13..0190bf21f15f20 100644 --- a/static/app/utils/useFeedbackForm.spec.tsx +++ b/static/app/utils/useFeedbackForm.spec.tsx @@ -7,20 +7,6 @@ import type { import * as useFeedbackSDKIntegration from 'sentry/components/feedbackButton/useFeedbackSDKIntegration'; import {GlobalFeedbackForm, useFeedbackForm} from 'sentry/utils/useFeedbackForm'; -jest.mock('sentry/components/feedbackButton/useFeedbackSDKIntegration', () => { - const actual = jest.requireActual( - 'sentry/components/feedbackButton/useFeedbackSDKIntegration' - ); - return { - ...actual, - useFeedbackSDKIntegration: jest.fn(actual.useFeedbackSDKIntegration), - }; -}); - -const mockUseFeedbackSDKIntegration = jest.mocked( - useFeedbackSDKIntegration.useFeedbackSDKIntegration -); - const mockForm = { appendToDom: jest.fn(), open: jest.fn(), @@ -41,11 +27,10 @@ const defaultOptions: NonNullable = { describe('useFeedbackForm', () => { beforeEach(() => { + jest + .spyOn(useFeedbackSDKIntegration, 'useFeedbackSDKIntegration') + .mockReturnValue({feedback: mockFeedback, defaultOptions}); jest.clearAllMocks(); - mockUseFeedbackSDKIntegration.mockReturnValue({ - feedback: mockFeedback, - defaultOptions, - }); }); it('can open the form using useFeedbackForm', async () => { diff --git a/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx b/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx index 733e02f7749c9f..ce633d6f5ab955 100644 --- a/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx +++ b/static/app/views/alerts/rules/metric/details/anomalyDetectionFeedbackBanner.spec.tsx @@ -8,14 +8,6 @@ import * as analytics from 'sentry/utils/analytics'; import AnomalyDetectionFeedbackBanner from './anomalyDetectionFeedbackBanner'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); - describe('AnomalyDetectionFeedbackBanner', () => { const initialData = initializeOrg({ organization: { @@ -30,7 +22,7 @@ describe('AnomalyDetectionFeedbackBanner', () => { const project = initialData.project; const mockIncident = IncidentFixture({projects: [project.slug]}); const mockIncident2 = IncidentFixture({id: '6702'}); - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); it('submits anomaly detection feedback (yes)', async () => { const {container} = render( diff --git a/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx b/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx index a974913693f8a2..79fbe268e0c887 100644 --- a/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx +++ b/static/app/views/alerts/rules/uptime/assertionSuggestionsButton.spec.tsx @@ -16,10 +16,8 @@ jest.mock('sentry/components/globalDrawer', () => { default: jest.fn(), }; }); -jest.mock('sentry/actionCreators/indicator'); -const mockedUseDrawer = jest.mocked(useDrawer); -const mockAddErrorMessage = jest.mocked(indicators.addErrorMessage); +const mockedUseDrawer = useDrawer as unknown as jest.Mock; describe('AssertionSuggestionsButton', () => { const organization = OrganizationFixture(); @@ -40,6 +38,7 @@ describe('AssertionSuggestionsButton', () => { beforeEach(() => { jest.resetAllMocks(); + jest.spyOn(indicators, 'addErrorMessage'); mockedUseDrawer.mockReturnValue({ openDrawer: mockOpenDrawer, @@ -78,7 +77,7 @@ describe('AssertionSuggestionsButton', () => { ); await waitFor(() => { - expect(mockAddErrorMessage).toHaveBeenCalledWith('Please enter a URL first'); + expect(indicators.addErrorMessage).toHaveBeenCalledWith('Please enter a URL first'); }); expect(mockOpenDrawer).not.toHaveBeenCalled(); }); diff --git a/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx b/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx index 16dda3fe3f3544..c1b5522177abd4 100644 --- a/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx +++ b/static/app/views/alerts/rules/uptime/testUptimeMonitorButton.spec.tsx @@ -6,15 +6,6 @@ import * as indicators from 'sentry/actionCreators/indicator'; import {TestUptimeMonitorButton} from 'sentry/views/alerts/rules/uptime/testUptimeMonitorButton'; import {PreviewCheckStatus} from 'sentry/views/alerts/rules/uptime/types'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - addSuccessMessage: jest.fn(), - }; -}); - describe('TestUptimeMonitorButton', () => { const organization = OrganizationFixture(); diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index 0b9d244fa36a51..d7db375199d73b 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -35,21 +35,6 @@ import ViewEditDashboard from 'sentry/views/dashboards/view'; import useWidgetBuilderState from 'sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState'; import {OrganizationContext} from 'sentry/views/organizationContext'; -jest.mock('sentry/actionCreators/modal', () => { - const actual = jest.requireActual('sentry/actionCreators/modal'); - return { - ...actual, - openWidgetViewerModal: jest.fn(), - }; -}); -jest.mock('sentry/actionCreators/dashboards', () => { - const actual = jest.requireActual('sentry/actionCreators/dashboards'); - return { - ...actual, - updateDashboard: jest.fn(actual.updateDashboard), - }; -}); - jest.mock('sentry/views/dashboards/widgetBuilder/hooks/useWidgetBuilderState'); jest.mock('sentry/actionCreators/indicator'); @@ -243,7 +228,7 @@ describe('Dashboards > Detail', () => { }); it('opens the widget viewer modal in a prebuilt dashboard using the widget id specified in the url', async () => { - const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); + const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); render(, { router: RouterFixture({ @@ -599,25 +584,27 @@ describe('Dashboards > Detail', () => { expect(mockReleases).toHaveBeenCalledTimes(1); }); - it('hides add widget option', () => { - const maxWidgets = Array.from({length: types.MAX_WIDGETS}, (_, index) => - WidgetFixture({id: `${index + 1}`, title: `Widget ${index + 1}`}) - ); - jest.spyOn(console, 'error').mockImplementation(() => {}); + it('hides add widget option', async () => { + const router = RouterFixture({ + location: initialData.router.location, + params: {orgId: 'org-slug', dashboardId: '1'}, + }); + // @ts-expect-error this is assigning to readonly property... + types.MAX_WIDGETS = 1; render( - , + + + , { - organization: initialData.organization, + router, + deprecatedRouterMocks: true, } ); - expect(screen.queryByRole('button', {name: 'Add Widget'})).not.toBeInTheDocument(); + // Enter edit mode. + await userEvent.click(await screen.findByRole('button', {name: 'edit-dashboard'})); + expect(screen.queryByRole('button', {name: 'Add widget'})).not.toBeInTheDocument(); }); it('renders successfully if more widgets than stored layouts', async () => { @@ -812,7 +799,7 @@ describe('Dashboards > Detail', () => { location: {...initialData.router.location, pathname: '/widget/0/'}, params: {orgId: 'org-slug', dashboardId: '1', widgetId: '0'}, }); - const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); + const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); const widget = WidgetFixture({ queries: [ { @@ -859,7 +846,7 @@ describe('Dashboards > Detail', () => { }, params: {orgId: 'org-slug', dashboardId: '1', widgetId: '123'}, }); - const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); + const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/1/', body: DashboardFixture([], {id: '1', title: 'Custom Errors'}), @@ -988,7 +975,7 @@ describe('Dashboards > Detail', () => { params: {orgId: 'org-slug', dashboardId: '1', widgetId: '1'}, }); - const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); + const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/1/', body: DashboardFixture(widgets, { @@ -1021,7 +1008,7 @@ describe('Dashboards > Detail', () => { params: {orgId: 'org-slug', dashboardId: '1', widgetId: '1'}, }); - const openWidgetViewerModal = jest.mocked(modals.openWidgetViewerModal); + const openWidgetViewerModal = jest.spyOn(modals, 'openWidgetViewerModal'); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/1/', body: DashboardFixture(widgets, { @@ -2008,9 +1995,7 @@ describe('Dashboards > Detail', () => { }); describe('widget builder redesign', () => { - let mockUpdateDashboard!: jest.MockedFunction< - typeof dashboardActions.updateDashboard - >; + let mockUpdateDashboard!: jest.SpyInstance; beforeEach(() => { initialData = initializeOrg({ organization: OrganizationFixture({ @@ -2018,10 +2003,12 @@ describe('Dashboards > Detail', () => { }), }); - mockUpdateDashboard = jest.mocked(dashboardActions.updateDashboard); - mockUpdateDashboard.mockResolvedValue({ - ...DashboardFixture([WidgetFixture({id: '1', title: 'Custom Widget'})]), - }); + // Mock just the updateDashboard function + mockUpdateDashboard = jest + .spyOn(dashboardActions, 'updateDashboard') + .mockResolvedValue({ + ...DashboardFixture([WidgetFixture({id: '1', title: 'Custom Widget'})]), + }); jest.mocked(useWidgetBuilderState).mockReturnValue({ dispatch: jest.fn(), @@ -2030,7 +2017,7 @@ describe('Dashboards > Detail', () => { }); afterEach(() => { - mockUpdateDashboard.mockReset(); + mockUpdateDashboard.mockRestore(); }); it('opens the widget builder slideout when clicking add widget', async () => { diff --git a/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx b/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx index 98239487499e63..b11e467b2d5fef 100644 --- a/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx +++ b/static/app/views/dashboards/widgetBuilder/buildSteps/filterResultsStep/spansSearchBar.spec.tsx @@ -9,63 +9,6 @@ import SpansSearchBar from 'sentry/views/dashboards/widgetBuilder/buildSteps/fil import {TraceItemAttributeProvider} from 'sentry/views/explore/contexts/traceItemAttributeContext'; import {TraceItemDataset} from 'sentry/views/explore/types'; -jest.mock('sentry/components/performance/spanSearchQueryBuilder', () => ({ - useSpanSearchQueryBuilderProps: jest.fn( - ({ - initialQuery, - onSearch, - onChange, - }: { - initialQuery: string; - onChange?: (query: string, state: {queryIsValid: boolean}) => void; - onSearch?: (query: string, state: {queryIsValid: boolean}) => void; - }) => ({ - spanSearchQueryBuilderProps: {initialQuery, onSearch, onChange}, - }) - ), -})); - -jest.mock('sentry/views/explore/components/traceItemSearchQueryBuilder', () => { - const React = jest.requireActual('react'); - const {WildcardOperators: Operators} = jest.requireActual( - 'sentry/components/searchSyntax/parser' - ); - - return { - TraceItemSearchQueryBuilder: ({ - initialQuery, - onSearch, - onChange, - }: { - initialQuery?: string; - onChange?: (query: string, state: {queryIsValid: boolean}) => void; - onSearch?: (query: string, state: {queryIsValid: boolean}) => void; - }) => { - const [value, setValue] = React.useState(initialQuery ?? ''); - return ( - setValue(e.target.value)} - onKeyDown={e => { - if (e.key !== 'Enter') { - return; - } - - const [key, rawValue = ''] = value.split(':'); - const submittedQuery = - key && rawValue ? `${key}:${Operators.CONTAINS}${rawValue}` : value; - const state = {queryIsValid: true}; - onSearch?.(submittedQuery, state); - onChange?.(submittedQuery, state); - }} - /> - ); - }, - }; -}); - // The endpoint seems to just return these fields, but the original TagValue type // has extra fields related to user information that we don't seem to need. interface MockedTagValue extends Pick< diff --git a/static/app/views/dashboards/widgetCard/index.spec.tsx b/static/app/views/dashboards/widgetCard/index.spec.tsx index adef70574c1d32..9efc92b99976a0 100644 --- a/static/app/views/dashboards/widgetCard/index.spec.tsx +++ b/static/app/views/dashboards/widgetCard/index.spec.tsx @@ -25,22 +25,6 @@ import {TableWidgetVisualization} from 'sentry/views/dashboards/widgets/tableWid import {DashboardsMEPProvider} from './dashboardsMEPContext'; -jest.mock('sentry/actionCreators/modal', () => { - const actual = jest.requireActual('sentry/actionCreators/modal'); - return { - ...actual, - openDashboardWidgetQuerySelectorModal: jest.fn(), - }; -}); - -jest.mock('sentry/components/charts/lineChart', () => { - const actual = jest.requireActual('sentry/components/charts/lineChart'); - return { - ...actual, - LineChart: jest.fn(), - }; -}); - jest.mock('sentry/views/dashboards/widgets/tableWidget/tableWidgetVisualization', () => ({ TableWidgetVisualization: jest.fn(() =>
), })); diff --git a/static/app/views/discover/homepage.spec.tsx b/static/app/views/discover/homepage.spec.tsx index 452363e60c922d..6c7522bb844efd 100644 --- a/static/app/views/discover/homepage.spec.tsx +++ b/static/app/views/discover/homepage.spec.tsx @@ -18,14 +18,6 @@ import {DEFAULT_EVENT_VIEW} from 'sentry/views/discover/results/data'; import Homepage from './homepage'; -jest.mock('sentry/components/pageFilters/persistence', () => { - const actual = jest.requireActual('sentry/components/pageFilters/persistence'); - return { - ...actual, - getPageFilterStorage: jest.fn(actual.getPageFilterStorage), - }; -}); - describe('Discover > Homepage', () => { const features = ['discover-query']; let organization: ReturnType; @@ -385,7 +377,7 @@ describe('Discover > Homepage', () => { repository: null, }; jest - .mocked(pageFilterUtils.getPageFilterStorage) + .spyOn(pageFilterUtils, 'getPageFilterStorage') .mockReturnValueOnce(PageFiltersStorageFixture({state})); render(, { diff --git a/static/app/views/discover/results.spec.tsx b/static/app/views/discover/results.spec.tsx index bc5b7b0ab42c6d..8ee068e2e174c5 100644 --- a/static/app/views/discover/results.spec.tsx +++ b/static/app/views/discover/results.spec.tsx @@ -15,14 +15,6 @@ import { getTransactionViews, } from 'sentry/views/discover/results/data'; -jest.mock('sentry/components/pageFilters/persistence', () => { - const actual = jest.requireActual('sentry/components/pageFilters/persistence'); - return { - ...actual, - getPageFilterStorage: jest.fn(), - }; -}); - const FIELDS = [ { field: 'title', diff --git a/static/app/views/discover/savedQuery/index.spec.tsx b/static/app/views/discover/savedQuery/index.spec.tsx index f4832c00ab987d..ff138394ce9456 100644 --- a/static/app/views/discover/savedQuery/index.spec.tsx +++ b/static/app/views/discover/savedQuery/index.spec.tsx @@ -12,15 +12,6 @@ import SavedQueryButtonGroup from 'sentry/views/discover/savedQuery'; import * as utils from 'sentry/views/discover/savedQuery/utils'; jest.mock('sentry/actionCreators/modal'); -jest.mock('sentry/views/discover/savedQuery/utils', () => { - const actual = jest.requireActual('sentry/views/discover/savedQuery/utils'); - return { - ...actual, - handleCreateQuery: jest.fn(actual.handleCreateQuery), - handleDeleteQuery: jest.fn(actual.handleDeleteQuery), - handleUpdateQuery: jest.fn(actual.handleUpdateQuery), - }; -}); function mount( location: ReturnType, @@ -96,10 +87,11 @@ describe('Discover > SaveQueryButtonGroup', () => { }); describe('building on a new query', () => { - const mockUtils = jest.mocked(utils.handleCreateQuery); + const mockUtils = jest + .spyOn(utils, 'handleCreateQuery') + .mockImplementation(() => Promise.resolve(savedQuery)); beforeEach(() => { - mockUtils.mockImplementation(() => Promise.resolve(savedQuery)); mockUtils.mockClear(); }); @@ -265,10 +257,12 @@ describe('Discover > SaveQueryButtonGroup', () => { }); describe('viewing a saved query', () => { - const mockUtils = jest.mocked(utils.handleDeleteQuery); + let mockUtils: jest.SpyInstance; beforeEach(() => { - mockUtils.mockImplementation(() => Promise.resolve()); + mockUtils = jest + .spyOn(utils, 'handleDeleteQuery') + .mockImplementation(() => Promise.resolve()); }); afterEach(() => { @@ -346,7 +340,7 @@ describe('Discover > SaveQueryButtonGroup', () => { }); describe('modifying a saved query', () => { - let mockUtils: jest.Mock; + let mockUtils: jest.SpyInstance; it('renders the correct set of buttons', async () => { mount( @@ -368,8 +362,9 @@ describe('Discover > SaveQueryButtonGroup', () => { describe('updates the saved query', () => { beforeEach(() => { - mockUtils = jest.mocked(utils.handleUpdateQuery); - mockUtils.mockImplementation(() => Promise.resolve(savedQuery)); + mockUtils = jest + .spyOn(utils, 'handleUpdateQuery') + .mockImplementation(() => Promise.resolve(savedQuery)); }); afterEach(() => { @@ -407,8 +402,9 @@ describe('Discover > SaveQueryButtonGroup', () => { describe('creates a separate query', () => { beforeEach(() => { - mockUtils = jest.mocked(utils.handleCreateQuery); - mockUtils.mockImplementation(() => Promise.resolve(savedQuery)); + mockUtils = jest + .spyOn(utils, 'handleCreateQuery') + .mockImplementation(() => Promise.resolve(savedQuery)); }); afterEach(() => { diff --git a/static/app/views/explore/logs/content.spec.tsx b/static/app/views/explore/logs/content.spec.tsx index de5938e1f8f9d7..635d7cc81eb984 100644 --- a/static/app/views/explore/logs/content.spec.tsx +++ b/static/app/views/explore/logs/content.spec.tsx @@ -21,23 +21,6 @@ import type {OurLogsResponseItem} from 'sentry/views/explore/logs/types'; import LogsPage from './content'; -jest.mock('sentry/components/onboarding/useRecentCreatedProject', () => { - const actual = jest.requireActual( - 'sentry/components/onboarding/useRecentCreatedProject' - ); - return { - ...actual, - useRecentCreatedProject: jest.fn(actual.useRecentCreatedProject), - }; -}); - -const actualUseRecentCreatedProject = jest.requireActual< - typeof import('sentry/components/onboarding/useRecentCreatedProject') ->('sentry/components/onboarding/useRecentCreatedProject').useRecentCreatedProject; -const mockUseRecentCreatedProject = jest.mocked( - useRecentCreatedProjectHook.useRecentCreatedProject -); - describe('LogsPage', () => { let organization: Organization; let project: Project; @@ -48,8 +31,6 @@ describe('LogsPage', () => { beforeEach(() => { MockApiClient.clearMockResponses(); - jest.clearAllMocks(); - mockUseRecentCreatedProject.mockImplementation(actualUseRecentCreatedProject); const { organization: _organization, project: _project, @@ -161,12 +142,14 @@ describe('LogsPage', () => { body: [], }); - mockUseRecentCreatedProject.mockImplementation(() => { - return { - project: onboardingProject, - isProjectActive: true, - }; - }); + jest + .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') + .mockImplementation(() => { + return { + project: onboardingProject, + isProjectActive: true, + }; + }); onboardingSetupPageFilters(); diff --git a/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx b/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx index ff2a1d9f9aa79a..ef5afc816611ac 100644 --- a/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx +++ b/static/app/views/explore/logs/usePersistentLogsPageParameters.spec.tsx @@ -21,8 +21,7 @@ jest.mock('sentry/utils/useNavigate', () => ({ })); jest.mock('sentry/views/explore/contexts/logs/logsPageParams', () => ({ - LOGS_CURSOR_KEY: 'logsCursor', - LOGS_FIELDS_KEY: 'logsFields', + ...jest.requireActual('sentry/views/explore/contexts/logs/logsPageParams'), usePersistedLogsPageParams: jest.fn(), })); diff --git a/static/app/views/explore/savedQueries/exploreParams.spec.tsx b/static/app/views/explore/savedQueries/exploreParams.spec.tsx index 3df893ff4439b2..3b824aaca8f277 100644 --- a/static/app/views/explore/savedQueries/exploreParams.spec.tsx +++ b/static/app/views/explore/savedQueries/exploreParams.spec.tsx @@ -4,14 +4,6 @@ import * as useDimensions from 'sentry/utils/useDimensions'; import {ExploreParams} from './exploreParams'; -jest.mock('sentry/utils/useDimensions', () => { - const actual = jest.requireActual('sentry/utils/useDimensions'); - return { - ...actual, - useDimensions: jest.fn(), - }; -}); - describe('ExploreParams', () => { it('should render', () => { jest.spyOn(useDimensions, 'useDimensions').mockReturnValue({width: 900, height: 100}); diff --git a/static/app/views/explore/spans/spansTab.spec.tsx b/static/app/views/explore/spans/spansTab.spec.tsx index d593ca339ee217..dae29ef96ca299 100644 --- a/static/app/views/explore/spans/spansTab.spec.tsx +++ b/static/app/views/explore/spans/spansTab.spec.tsx @@ -25,10 +25,6 @@ import {SpansQueryParamsProvider} from 'sentry/views/explore/spans/spansQueryPar import {SpansTabContent} from 'sentry/views/explore/spans/spansTab'; import {TraceItemDataset} from 'sentry/views/explore/types'; -const actualUseTraceItemTags = jest.requireActual< - typeof import('sentry/views/explore/contexts/spanTagsContext') ->('sentry/views/explore/contexts/spanTagsContext').useTraceItemTags; - function Wrapper({children}: {children: ReactNode}) { return ( @@ -40,13 +36,6 @@ function Wrapper({children}: {children: ReactNode}) { } jest.mock('sentry/utils/analytics'); -jest.mock('sentry/views/explore/contexts/spanTagsContext', () => { - const actual = jest.requireActual('sentry/views/explore/contexts/spanTagsContext'); - return { - ...actual, - useTraceItemTags: jest.fn(actual.useTraceItemTags), - }; -}); const mockStringTags: TagCollection = { stringTag1: {key: 'stringTag1', kind: FieldKind.TAG, name: 'stringTag1'}, @@ -341,16 +330,18 @@ describe('SpansTabContent', () => { let spies: jest.SpyInstance[]; beforeEach(() => { - jest.mocked(spanTagsModule.useTraceItemTags).mockImplementation(type => { - switch (type) { - case 'number': - return {tags: mockNumberTags, isLoading: false, secondaryAliases: {}}; - case 'string': - return {tags: mockStringTags, isLoading: false, secondaryAliases: {}}; - default: - return {tags: {}, isLoading: false, secondaryAliases: {}}; - } - }); + const useSpanTagsSpy = jest + .spyOn(spanTagsModule, 'useTraceItemTags') + .mockImplementation(type => { + switch (type) { + case 'number': + return {tags: mockNumberTags, isLoading: false, secondaryAliases: {}}; + case 'string': + return {tags: mockStringTags, isLoading: false, secondaryAliases: {}}; + default: + return {tags: {}, isLoading: false, secondaryAliases: {}}; + } + }); // Mock getBoundingClientRect for container const getBoundingClientRectSpy = jest @@ -388,14 +379,10 @@ describe('SpansTabContent', () => { .spyOn(HTMLElement.prototype, 'clientWidth', 'get') .mockReturnValue(1000); - spies = [getBoundingClientRectSpy, clientWidthGetSpy]; + spies = [useSpanTagsSpy, getBoundingClientRectSpy, clientWidthGetSpy]; }); afterEach(() => { - jest - .mocked(spanTagsModule.useTraceItemTags) - .mockImplementation(actualUseTraceItemTags); - jest.mocked(spanTagsModule.useTraceItemTags).mockClear(); spies.forEach(spy => spy.mockRestore()); }); diff --git a/static/app/views/issueDetails/actions/index.spec.tsx b/static/app/views/issueDetails/actions/index.spec.tsx index 91e92ed84e2494..948b4af3a92052 100644 --- a/static/app/views/issueDetails/actions/index.spec.tsx +++ b/static/app/views/issueDetails/actions/index.spec.tsx @@ -50,16 +50,9 @@ jest.mock('sentry/views/issueDetails/issueDetailsTour', () => ({ ...jest.requireActual('sentry/views/issueDetails/issueDetailsTour'), useIssueDetailsTour: () => mockTour(), })); -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(actual.trackAnalytics), - }; -}); describe('GroupActions', () => { - const analyticsSpy = jest.mocked(analytics.trackAnalytics); + const analyticsSpy = jest.spyOn(analytics, 'trackAnalytics'); beforeEach(() => { ConfigStore.init(); diff --git a/static/app/views/issueDetails/groupEventCarousel.spec.tsx b/static/app/views/issueDetails/groupEventCarousel.spec.tsx index 9ba36cb23fd7d6..bfff6c3cdc8ebf 100644 --- a/static/app/views/issueDetails/groupEventCarousel.spec.tsx +++ b/static/app/views/issueDetails/groupEventCarousel.spec.tsx @@ -6,20 +6,9 @@ import {UserFixture} from 'sentry-fixture/user'; import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import ConfigStore from 'sentry/stores/configStore'; -import useMedia from 'sentry/utils/useMedia'; +import * as useMedia from 'sentry/utils/useMedia'; import {GroupEventCarousel} from 'sentry/views/issueDetails/groupEventCarousel'; -jest.mock('sentry/utils/useMedia', () => { - const actual = jest.requireActual('sentry/utils/useMedia'); - return { - __esModule: true, - ...actual, - default: jest.fn(actual.default), - }; -}); - -const mockUseMedia = jest.mocked(useMedia); - describe('GroupEventCarousel', () => { const group = GroupFixture({id: 'group-id'}); const initialRouterConfig = { @@ -52,7 +41,6 @@ describe('GroupEventCarousel', () => { beforeEach(() => { jest.restoreAllMocks(); - jest.spyOn(console, 'error').mockImplementation(() => {}); Object.assign(navigator, { clipboard: { writeText: jest.fn().mockResolvedValue(''), @@ -82,7 +70,7 @@ describe('GroupEventCarousel', () => { }); it('can navigate to the oldest event', async () => { - mockUseMedia.mockReturnValue(true); + jest.spyOn(useMedia, 'default').mockReturnValue(true); const {router} = render(, { initialRouterConfig, @@ -104,7 +92,7 @@ describe('GroupEventCarousel', () => { }); it('can navigate to the latest event', async () => { - mockUseMedia.mockReturnValue(true); + jest.spyOn(useMedia, 'default').mockReturnValue(true); const {router} = render(, { initialRouterConfig, @@ -126,8 +114,6 @@ describe('GroupEventCarousel', () => { }); it('can navigate to the recommended event', async () => { - mockUseMedia.mockReturnValue(true); - const latestRouterConfig = { ...initialRouterConfig, location: { @@ -135,6 +121,7 @@ describe('GroupEventCarousel', () => { pathname: `/organizations/org-slug/issues/${group.id}/events/latest/`, }, }; + jest.spyOn(useMedia, 'default').mockReturnValue(true); const {router} = render(, { initialRouterConfig: latestRouterConfig, @@ -156,7 +143,7 @@ describe('GroupEventCarousel', () => { }); it('will disable the dropdown if there is only one event', async () => { - mockUseMedia.mockReturnValue(true); + jest.spyOn(useMedia, 'default').mockReturnValue(true); render(); @@ -165,7 +152,7 @@ describe('GroupEventCarousel', () => { it('if user default is recommended, it will show it as default', async () => { ConfigStore.loadInitialData(ConfigFixture({user: recommendedUser})); - mockUseMedia.mockReturnValue(true); + jest.spyOn(useMedia, 'default').mockReturnValue(true); render(); @@ -176,7 +163,7 @@ describe('GroupEventCarousel', () => { it('if user default is latest, it will show it as default', async () => { ConfigStore.loadInitialData(ConfigFixture({user: latestUser})); - mockUseMedia.mockReturnValue(true); + jest.spyOn(useMedia, 'default').mockReturnValue(true); render(); @@ -185,7 +172,7 @@ describe('GroupEventCarousel', () => { it('if user default is oldest, it will show it as default', async () => { ConfigStore.loadInitialData(ConfigFixture({user: oldestUser})); - mockUseMedia.mockReturnValue(true); + jest.spyOn(useMedia, 'default').mockReturnValue(true); render(); @@ -245,7 +232,7 @@ describe('GroupEventCarousel', () => { }); await userEvent.click(screen.getByRole('button', {name: /event actions/i})); - await userEvent.click(screen.getByRole('button', {name: /copy link/i})); + await userEvent.click(screen.getByRole('menuitemradio', {name: /copy event link/i})); expect(navigator.clipboard.writeText).toHaveBeenCalledWith( `http://localhost/organizations/org-slug/issues/group-id/events/event-id/` @@ -265,7 +252,7 @@ describe('GroupEventCarousel', () => { }); await userEvent.click(screen.getByRole('button', {name: /event actions/i})); - await userEvent.click(screen.getByRole('button', {name: /view json/i})); + await userEvent.click(screen.getByRole('menuitemradio', {name: 'JSON (7.0 B)'})); expect(window.open).toHaveBeenCalledWith( `https://us.sentry.io/api/0/projects/org-slug/project-slug/events/event-id/json/` diff --git a/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx b/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx index 8b3f27fdc02f30..0b95933b75f7dc 100644 --- a/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx +++ b/static/app/views/issueDetails/streamline/hooks/useCopyIssueDetails.spec.tsx @@ -1,4 +1,3 @@ -import type {ReactNode} from 'react'; import {EventFixture} from 'sentry-fixture/event'; import {GroupFixture} from 'sentry-fixture/group'; import {OrganizationFixture} from 'sentry-fixture/organization'; @@ -16,45 +15,11 @@ import type {GroupSummaryData} from 'sentry/components/group/groupSummary'; import * as groupSummaryHooks from 'sentry/components/group/groupSummary'; import {EntryType} from 'sentry/types/event'; import * as copyToClipboardModule from 'sentry/utils/useCopyToClipboard'; -import * as useHotkeysModule from 'sentry/utils/useHotkeys'; +import * as useOrganization from 'sentry/utils/useOrganization'; import { issueAndEventToMarkdown, useCopyIssueDetails, } from 'sentry/views/issueDetails/streamline/hooks/useCopyIssueDetails'; -import {OrganizationContext} from 'sentry/views/organizationContext'; - -jest.mock('sentry/components/group/groupSummary', () => { - const actual = jest.requireActual('sentry/components/group/groupSummary'); - return { - ...actual, - useGroupSummaryData: jest.fn(actual.useGroupSummaryData), - }; -}); - -jest.mock('sentry/components/events/autofix/useAutofix', () => { - const actual = jest.requireActual('sentry/components/events/autofix/useAutofix'); - return { - ...actual, - useAutofixData: jest.fn(actual.useAutofixData), - }; -}); - -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(actual.addErrorMessage), - addSuccessMessage: jest.fn(actual.addSuccessMessage), - }; -}); - -jest.mock('sentry/utils/useHotkeys', () => { - const actual = jest.requireActual('sentry/utils/useHotkeys'); - return { - ...actual, - useHotkeys: jest.fn(actual.useHotkeys), - }; -}); jest.mock('sentry/utils/useCopyToClipboard'); @@ -65,11 +30,6 @@ describe('useCopyIssueDetails', () => { id: '123456', dateCreated: '2023-01-01T00:00:00Z', }); - const wrapper = ({children}: {children: ReactNode}) => ( - - {children} - - ); const mockGroupSummaryData: GroupSummaryData = { groupId: group.id, @@ -414,31 +374,32 @@ describe('useCopyIssueDetails', () => { copy: mockCopy, }); - jest.mocked(groupSummaryHooks.useGroupSummaryData).mockReturnValue({ + jest.spyOn(groupSummaryHooks, 'useGroupSummaryData').mockReturnValue({ data: mockGroupSummaryData, isPending: false, }); - jest.mocked(autofixHooks.useAutofixData).mockReturnValue({ + jest.spyOn(autofixHooks, 'useAutofixData').mockReturnValue({ data: mockAutofixData, isPending: false, }); - jest.mocked(indicators.addSuccessMessage).mockImplementation(() => {}); - jest.mocked(indicators.addErrorMessage).mockImplementation(() => {}); + jest.spyOn(indicators, 'addSuccessMessage').mockImplementation(() => {}); + jest.spyOn(indicators, 'addErrorMessage').mockImplementation(() => {}); + jest.spyOn(useOrganization, 'default').mockReturnValue(organization); }); it('calls useCopyToClipboard hook', () => { - renderHook(() => useCopyIssueDetails(group, event), {wrapper}); + renderHook(() => useCopyIssueDetails(group, event)); // Check that the hook was called expect(copyToClipboardModule.default).toHaveBeenCalled(); }); it('sets up hotkeys with the correct callbacks', () => { - const useHotkeysMock = jest.mocked(useHotkeysModule.useHotkeys); + const useHotkeysMock = jest.spyOn(require('sentry/utils/useHotkeys'), 'useHotkeys'); - renderHook(() => useCopyIssueDetails(group, event), {wrapper}); + renderHook(() => useCopyIssueDetails(group, event)); expect(useHotkeysMock).toHaveBeenCalledWith([ { @@ -462,7 +423,7 @@ describe('useCopyIssueDetails', () => { return Promise.resolve(text); }); - renderHook(() => useCopyIssueDetails(group, undefined), {wrapper}); + renderHook(() => useCopyIssueDetails(group, undefined)); // Trigger the keyboard event (command+alt+c) const keyboardEvent = new KeyboardEvent('keydown', { @@ -490,7 +451,7 @@ describe('useCopyIssueDetails', () => { return Promise.resolve(text); }); - renderHook(() => useCopyIssueDetails(group, event), {wrapper}); + renderHook(() => useCopyIssueDetails(group, event)); // Trigger the keyboard event (command+alt+c) const keyboardEvent = new KeyboardEvent('keydown', { diff --git a/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx b/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx index 8a0b703a358fe6..f16b54c1af7310 100644 --- a/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/activitySection.spec.tsx @@ -18,14 +18,6 @@ import type {GroupActivity} from 'sentry/types/group'; import {GroupActivityType} from 'sentry/types/group'; import StreamlinedActivitySection from 'sentry/views/issueDetails/streamline/sidebar/activitySection'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addSuccessMessage: jest.fn(actual.addSuccessMessage), - }; -}); - describe('StreamlinedActivitySection', () => { const project = ProjectFixture(); const user = UserFixture(); @@ -141,7 +133,7 @@ describe('StreamlinedActivitySection', () => { }); it('renders note and allows for edit', async () => { - const addSuccessMessageMock = jest.mocked(indicators.addSuccessMessage); + jest.spyOn(indicators, 'addSuccessMessage'); const editGroup = GroupFixture({ id: '1123', @@ -185,7 +177,7 @@ describe('StreamlinedActivitySection', () => { await userEvent.click(screen.getByRole('button', {name: 'Save comment'})); expect(editMock).toHaveBeenCalledTimes(1); - expect(addSuccessMessageMock).toHaveBeenCalledWith('Comment updated'); + expect(indicators.addSuccessMessage).toHaveBeenCalledWith('Comment updated'); }); it('renders note from a sentry app', async () => { diff --git a/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx b/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx index 2995f0dd118ddf..61787030c37c99 100644 --- a/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx +++ b/static/app/views/issueDetails/streamline/sidebar/seerDrawer.spec.tsx @@ -16,21 +16,8 @@ import { } from 'sentry-test/reactTestingLibrary'; import {EntryType} from 'sentry/types/event'; -import * as issueTypeConfig from 'sentry/utils/issueTypeConfig'; import {SeerDrawer} from 'sentry/views/issueDetails/streamline/sidebar/seerDrawer'; -const actualGetConfigForIssueType = jest.requireActual< - typeof import('sentry/utils/issueTypeConfig') ->('sentry/utils/issueTypeConfig').getConfigForIssueType; - -jest.mock('sentry/utils/issueTypeConfig', () => { - const actual = jest.requireActual('sentry/utils/issueTypeConfig'); - return { - ...actual, - getConfigForIssueType: jest.fn(actual.getConfigForIssueType), - }; -}); - describe('SeerDrawer', () => { const organization = OrganizationFixture({ hideAiFeatures: false, @@ -308,12 +295,15 @@ describe('SeerDrawer', () => { body: {autofix: null}, }); - const mockGetConfigForIssueType = jest.mocked(issueTypeConfig.getConfigForIssueType); - mockGetConfigForIssueType.mockImplementation(() => ({ - autofix: false, - issueSummary: {enabled: true}, - resources: null, - })); + // Use jest.spyOn instead of jest.mock inside the test + const issueTypeConfigModule = require('sentry/utils/issueTypeConfig'); + const spy = jest + .spyOn(issueTypeConfigModule, 'getConfigForIssueType') + .mockImplementation(() => ({ + autofix: false, + issueSummary: {enabled: true}, + resources: null, + })); render(, { organization, @@ -327,8 +317,8 @@ describe('SeerDrawer', () => { expect(screen.getByTestId('seer-button-bar')).toBeInTheDocument(); expect(screen.queryByRole('button', {name: 'Start Over'})).not.toBeInTheDocument(); - mockGetConfigForIssueType.mockImplementation(actualGetConfigForIssueType); - mockGetConfigForIssueType.mockClear(); + // Restore the original implementation + spy.mockRestore(); }); it('shows ButtonBarWrapper with disabled Start Over button when hasAutofix is true but no autofixData', async () => { diff --git a/static/app/views/issueList/actions/index.spec.tsx b/static/app/views/issueList/actions/index.spec.tsx index 4fcdfd6767ba28..e4ea9cb05a4ffc 100644 --- a/static/app/views/issueList/actions/index.spec.tsx +++ b/static/app/views/issueList/actions/index.spec.tsx @@ -22,14 +22,6 @@ import { } from 'sentry/views/issueList/issueSelectionContext'; import {DEFAULT_QUERY} from 'sentry/views/issueList/utils'; -jest.mock('sentry/utils/analytics', () => { - const actual = jest.requireActual('sentry/utils/analytics'); - return { - ...actual, - trackAnalytics: jest.fn(), - }; -}); - const organization = OrganizationFixture(); const defaultProps = { diff --git a/static/app/views/issueList/overview.spec.tsx b/static/app/views/issueList/overview.spec.tsx index 8dd661c2725756..0195bfd30fcc04 100644 --- a/static/app/views/issueList/overview.spec.tsx +++ b/static/app/views/issueList/overview.spec.tsx @@ -26,14 +26,6 @@ import * as parseLinkHeader from 'sentry/utils/parseLinkHeader'; import IssueListOverview from 'sentry/views/issueList/overview'; import {DEFAULT_QUERY} from 'sentry/views/issueList/utils'; -jest.mock('sentry/utils/parseLinkHeader', () => { - const actual = jest.requireActual('sentry/utils/parseLinkHeader'); - return { - __esModule: true, - default: jest.fn(actual.default), - }; -}); - const DEFAULT_LINKS_HEADER = '; rel="previous"; results="false"; cursor="1443575731:0:1", ' + '; rel="next"; results="true"; cursor="1443575000:0:0"'; @@ -76,7 +68,7 @@ describe('IssueList', () => { const group = GroupFixture({project}); const groupStats = GroupStatsFixture(); let fetchMembersRequest: jest.Mock; - const parseLinkHeaderSpy = jest.mocked(parseLinkHeader.default); + const parseLinkHeaderSpy = jest.spyOn(parseLinkHeader, 'default'); beforeEach(() => { Object.defineProperty(Element.prototype, 'clientWidth', {value: 1000}); diff --git a/static/app/views/onboarding/onboarding.spec.tsx b/static/app/views/onboarding/onboarding.spec.tsx index 5993e2f2dc815b..454d20989e1c19 100644 --- a/static/app/views/onboarding/onboarding.spec.tsx +++ b/static/app/views/onboarding/onboarding.spec.tsx @@ -21,22 +21,6 @@ import {trackAnalytics} from 'sentry/utils/analytics'; import {OnboardingWithoutContext} from 'sentry/views/onboarding/onboarding'; jest.mock('sentry/utils/analytics'); -jest.mock('sentry/components/onboarding/useRecentCreatedProject', () => { - const actual = jest.requireActual( - 'sentry/components/onboarding/useRecentCreatedProject' - ); - return { - ...actual, - useRecentCreatedProject: jest.fn(actual.useRecentCreatedProject), - }; -}); - -const actualUseRecentCreatedProject = jest.requireActual< - typeof import('sentry/components/onboarding/useRecentCreatedProject') ->('sentry/components/onboarding/useRecentCreatedProject').useRecentCreatedProject; -const mockUseRecentCreatedProject = jest.mocked( - useRecentCreatedProjectHook.useRecentCreatedProject -); describe('Onboarding', () => { beforeAll(() => { @@ -46,7 +30,6 @@ describe('Onboarding', () => { MockApiClient.clearMockResponses(); ProjectsStore.reset(); jest.clearAllMocks(); - mockUseRecentCreatedProject.mockImplementation(actualUseRecentCreatedProject); }); it('renders the welcome page', () => { @@ -351,12 +334,14 @@ describe('Onboarding', () => { body: [ProjectKeysFixture()[0]], }); - mockUseRecentCreatedProject.mockImplementation(() => { - return { - project: nextJsProject, - isProjectActive: false, - }; - }); + jest + .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') + .mockImplementation(() => { + return { + project: nextJsProject, + isProjectActive: false, + }; + }); render( { body: [], }); - mockUseRecentCreatedProject.mockImplementation(() => { - return { - project: reactProject, - isProjectActive: true, - }; - }); + jest + .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') + .mockImplementation(() => { + return { + project: reactProject, + isProjectActive: true, + }; + }); render( { body: [], }); - mockUseRecentCreatedProject.mockImplementation(() => { - return { - project: reactProject, - isProjectActive: true, - }; - }); + jest + .spyOn(useRecentCreatedProjectHook, 'useRecentCreatedProject') + .mockImplementation(() => { + return { + project: reactProject, + isProjectActive: true, + }; + }); render( { body: [nextJsProject], }); - mockUseRecentCreatedProject.mockImplementation(() => { - return { - project: nextJsProject, - isProjectActive: true, - }; - }); - + // Mock for useRecentCreatedProject hook MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${nextJsProject.slug}/overview/`, body: [nextJsProject], diff --git a/static/app/views/onboarding/useConfigureSdk.spec.tsx b/static/app/views/onboarding/useConfigureSdk.spec.tsx index 45e2b4382c7c01..2d439987de32e5 100644 --- a/static/app/views/onboarding/useConfigureSdk.spec.tsx +++ b/static/app/views/onboarding/useConfigureSdk.spec.tsx @@ -12,15 +12,8 @@ import {useConfigureSdk} from './useConfigureSdk'; jest.mock('sentry/actionCreators/modal'); jest.mock('sentry/components/onboarding/useCreateProject'); -jest.mock('sentry/components/onboarding/onboardingContext', () => { - const actual = jest.requireActual('sentry/components/onboarding/onboardingContext'); - return { - ...actual, - useOnboardingContext: jest.fn(actual.useOnboardingContext), - }; -}); -const mockUseOnboardingContext = jest.mocked(OnboardingContext.useOnboardingContext); +const mockUseOnboardingContext = jest.spyOn(OnboardingContext, 'useOnboardingContext'); const mockCreateProject = jest.fn(); const mockOpenModal = openModal as jest.Mock; diff --git a/static/app/views/organizationContext.spec.tsx b/static/app/views/organizationContext.spec.tsx index 265225819e2caa..3ba5b1debf0348 100644 --- a/static/app/views/organizationContext.spec.tsx +++ b/static/app/views/organizationContext.spec.tsx @@ -16,14 +16,6 @@ import useOrganization from 'sentry/utils/useOrganization'; import {OrganizationContextProvider} from './organizationContext'; -jest.mock('sentry/actionCreators/organizations', () => { - const actual = jest.requireActual('sentry/actionCreators/organizations'); - return { - ...actual, - switchOrganization: jest.fn(), - }; -}); - jest.mock('sentry/actionCreators/sudoModal'); describe('OrganizationContext', () => { diff --git a/static/app/views/projectDetail/projectDetail.spec.tsx b/static/app/views/projectDetail/projectDetail.spec.tsx index d51c3eb17f04ac..f4af634f401192 100644 --- a/static/app/views/projectDetail/projectDetail.spec.tsx +++ b/static/app/views/projectDetail/projectDetail.spec.tsx @@ -16,14 +16,6 @@ import ProjectsStore from 'sentry/stores/projectsStore'; import ProjectDetail from './projectDetail'; import ProjectDetailContainer from './'; -jest.mock('sentry/components/pageFilters/actions', () => { - const actual = jest.requireActual('sentry/components/pageFilters/actions'); - return { - ...actual, - updateProjects: jest.fn(), - }; -}); - jest.mock('sentry/actionCreators/organization'); describe('ProjectDetail', () => { diff --git a/static/app/views/projectInstall/createProject.spec.tsx b/static/app/views/projectInstall/createProject.spec.tsx index af1ad09e5c41fa..6297612878b9e4 100644 --- a/static/app/views/projectInstall/createProject.spec.tsx +++ b/static/app/views/projectInstall/createProject.spec.tsx @@ -19,18 +19,6 @@ import type {Organization} from 'sentry/types/organization'; import {CreateProject} from 'sentry/views/projectInstall/createProject'; import * as useValidateChannelModule from 'sentry/views/projectInstall/useValidateChannel'; -const actualUseValidateChannel = jest.requireActual< - typeof import('sentry/views/projectInstall/useValidateChannel') ->('sentry/views/projectInstall/useValidateChannel').useValidateChannel; - -jest.mock('sentry/views/projectInstall/useValidateChannel', () => { - const actual = jest.requireActual('sentry/views/projectInstall/useValidateChannel'); - return { - ...actual, - useValidateChannel: jest.fn(actual.useValidateChannel), - }; -}); - jest.mock('sentry/actionCreators/indicator'); function renderFrameworkModalMockRequests({ @@ -97,10 +85,6 @@ describe('CreateProject', () => { }); beforeEach(() => { - jest - .mocked(useValidateChannelModule.useValidateChannel) - .mockImplementation(actualUseValidateChannel); - TeamStore.reset(); TeamStore.loadUserTeams([teamNoAccess]); @@ -642,7 +626,7 @@ describe('CreateProject', () => { teamSlug: teamWithAccess.slug, }); - jest.mocked(useValidateChannelModule.useValidateChannel).mockReturnValue({ + jest.spyOn(useValidateChannelModule, 'useValidateChannel').mockReturnValue({ isFetching: true, clear: jest.fn(), error: undefined, diff --git a/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx b/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx index becfaa7ea75eec..463e2b1f64ccc6 100644 --- a/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx +++ b/static/app/views/projectInstall/messagingIntegrationAlertRule.spec.tsx @@ -8,31 +8,20 @@ import type {IssueAlertNotificationProps} from 'sentry/views/projectInstall/issu import MessagingIntegrationAlertRule from 'sentry/views/projectInstall/messagingIntegrationAlertRule'; import * as useValidateChannelModule from 'sentry/views/projectInstall/useValidateChannel'; -const actualUseValidateChannel = jest.requireActual< - typeof import('sentry/views/projectInstall/useValidateChannel') ->('sentry/views/projectInstall/useValidateChannel').useValidateChannel; - -jest.mock('sentry/views/projectInstall/useValidateChannel', () => { - const actual = jest.requireActual('sentry/views/projectInstall/useValidateChannel'); - return { - ...actual, - useValidateChannel: jest.fn(actual.useValidateChannel), - }; -}); - function setupValidateChannelSpy() { const mockClear = jest.fn(); - jest - .mocked(useValidateChannelModule.useValidateChannel) - .mockImplementation((...args) => { - const result = actualUseValidateChannel(...args); - return { - ...result, - clear: mockClear, - }; - }); + const originalUseValidateChannel = useValidateChannelModule.useValidateChannel; + const spy = jest.spyOn(useValidateChannelModule, 'useValidateChannel'); + + spy.mockImplementation((...args) => { + const result = originalUseValidateChannel(...args); + return { + ...result, + clear: mockClear, + }; + }); - return {mockClear}; + return {mockClear, spy}; } describe('MessagingIntegrationAlertRule', () => { @@ -84,10 +73,6 @@ describe('MessagingIntegrationAlertRule', () => { }; beforeEach(() => { - jest - .mocked(useValidateChannelModule.useValidateChannel) - .mockImplementation(actualUseValidateChannel); - MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/integrations/${slackIntegrations[0]!.id}/channels/`, body: { @@ -295,7 +280,7 @@ describe('MessagingIntegrationAlertRule', () => { body: {valid: false, detail: 'Channel not found'}, }); - const {mockClear} = setupValidateChannelSpy(); + const {mockClear, spy} = setupValidateChannelSpy(); render( { await userEvent.click(screen.getByLabelText('Clear choices')); expect(mockSetChannel).toHaveBeenCalledWith(undefined); expect(mockClear).toHaveBeenCalled(); + + spy.mockRestore(); }); it('clears validation error when provider is changed', async () => { @@ -321,7 +308,7 @@ describe('MessagingIntegrationAlertRule', () => { body: {results: []}, }); - const {mockClear} = setupValidateChannelSpy(); + const {mockClear, spy} = setupValidateChannelSpy(); render( { await selectEvent.select(screen.getByText('Slack'), 'Discord'); expect(mockClear).toHaveBeenCalled(); + + spy.mockRestore(); }); it('clears validation error when integration is changed', async () => { @@ -348,7 +337,7 @@ describe('MessagingIntegrationAlertRule', () => { body: {results: []}, }); - const {mockClear} = setupValidateChannelSpy(); + const {mockClear, spy} = setupValidateChannelSpy(); render( { ); expect(mockClear).toHaveBeenCalled(); + + spy.mockRestore(); }); it('displays and sends channel id for microsoft teams', async () => { diff --git a/static/app/views/projectsDashboard/index.spec.tsx b/static/app/views/projectsDashboard/index.spec.tsx index dcc8a13ab21fb4..cb2332de3f1e6e 100644 --- a/static/app/views/projectsDashboard/index.spec.tsx +++ b/static/app/views/projectsDashboard/index.spec.tsx @@ -18,14 +18,6 @@ import TeamStore from 'sentry/stores/teamStore'; import ProjectsDashboard from 'sentry/views/projectsDashboard'; jest.unmock('lodash/debounce'); -jest.mock('sentry/actionCreators/projects', () => { - const actual = jest.requireActual('sentry/actionCreators/projects'); - return { - ...actual, - loadStatsForProject: jest.fn(actual.loadStatsForProject), - }; -}); - jest.mock('lodash/debounce', () => { const debounceMap = new Map(); const mockDebounce = @@ -566,7 +558,7 @@ describe('ProjectsDashboard', () => { ProjectsStatsStore.onStatsLoadSuccess([ {...projects[0]!, stats: [[1517281200, 2]]}, ]); - const loadStatsSpy = jest.mocked(projectsActions.loadStatsForProject); + const loadStatsSpy = jest.spyOn(projectsActions, 'loadStatsForProject'); const mock = MockApiClient.addMockResponse({ url: `/organizations/${org.slug}/projects/`, body: projects.map(project => ({ diff --git a/static/app/views/seerExplorer/explorerPanel.spec.tsx b/static/app/views/seerExplorer/explorerPanel.spec.tsx index 2c72887808cf14..8994b4642050d6 100644 --- a/static/app/views/seerExplorer/explorerPanel.spec.tsx +++ b/static/app/views/seerExplorer/explorerPanel.spec.tsx @@ -14,19 +14,6 @@ import * as useSeerExplorerModule from './hooks/useSeerExplorer'; import ExplorerPanel from './explorerPanel'; // Mock createPortal to render content directly -jest.mock('./hooks/useSeerExplorer', () => { - const actual = jest.requireActual('./hooks/useSeerExplorer'); - return { - ...actual, - useSeerExplorer: jest.fn(actual.useSeerExplorer), - }; -}); - -const actualUseSeerExplorer = jest.requireActual< - typeof import('./hooks/useSeerExplorer') ->('./hooks/useSeerExplorer').useSeerExplorer; -const mockUseSeerExplorer = jest.mocked(useSeerExplorerModule.useSeerExplorer); - jest.mock('react-dom', () => ({ ...jest.requireActual('react-dom'), createPortal: (node: React.ReactNode) => node, @@ -106,8 +93,6 @@ describe('ExplorerPanel', () => { beforeEach(() => { MockApiClient.clearMockResponses(); sessionStorage.clear(); - jest.clearAllMocks(); - mockUseSeerExplorer.mockImplementation(actualUseSeerExplorer); // This matches the real behavior when no run ID is provided to the endpoint. MockApiClient.addMockResponse({ @@ -209,24 +194,26 @@ describe('ExplorerPanel', () => { }); it('shows error when hook returns isError=true', () => { - mockUseSeerExplorer.mockReturnValue({ - runId: 123, - sessionData: null, // should always be null when isError - sendMessage: jest.fn(), - deleteFromIndex: jest.fn(), - startNewSession: jest.fn(), - isPolling: false, - isError: true, // isError - isPending: false, - deletedFromIndex: null, - interruptRun: jest.fn(), - interruptRequested: false, - wasJustInterrupted: false, - clearWasJustInterrupted: jest.fn(), - switchToRun: jest.fn(), - respondToUserInput: jest.fn(), - createPR: jest.fn(), - }); + const useSeerExplorerSpy = jest + .spyOn(useSeerExplorerModule, 'useSeerExplorer') + .mockReturnValue({ + runId: 123, + sessionData: null, // should always be null when isError + sendMessage: jest.fn(), + deleteFromIndex: jest.fn(), + startNewSession: jest.fn(), + isPolling: false, + isError: true, // isError + isPending: false, + deletedFromIndex: null, + interruptRun: jest.fn(), + interruptRequested: false, + wasJustInterrupted: false, + clearWasJustInterrupted: jest.fn(), + switchToRun: jest.fn(), + respondToUserInput: jest.fn(), + createPR: jest.fn(), + }); renderWithPanelContext(, true, {organization}); @@ -236,6 +223,8 @@ describe('ExplorerPanel', () => { expect( screen.queryByText(/Ask Seer anything about your application./) ).not.toBeInTheDocument(); + + useSeerExplorerSpy.mockRestore(); }); }); @@ -268,7 +257,7 @@ describe('ExplorerPanel', () => { }; // Mock the hook to return our test data - mockUseSeerExplorer.mockReturnValue({ + jest.spyOn(useSeerExplorerModule, 'useSeerExplorer').mockReturnValue({ sessionData: mockSessionData as useSeerExplorerModule.SeerExplorerResponse['session'], sendMessage: jest.fn(), @@ -297,6 +286,9 @@ describe('ExplorerPanel', () => { expect( screen.queryByText(/Ask Seer anything about your application./) ).not.toBeInTheDocument(); + + // Restore the mock + jest.restoreAllMocks(); }); }); diff --git a/static/app/views/settings/account/apiTokenDetails.spec.tsx b/static/app/views/settings/account/apiTokenDetails.spec.tsx index 0b391050dcddf2..9500a6e383993e 100644 --- a/static/app/views/settings/account/apiTokenDetails.spec.tsx +++ b/static/app/views/settings/account/apiTokenDetails.spec.tsx @@ -5,15 +5,6 @@ import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrar import * as indicators from 'sentry/actionCreators/indicator'; import ApiTokenDetails from 'sentry/views/settings/account/apiTokenDetails'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - addSuccessMessage: jest.fn(), - }; -}); - describe('ApiNewToken', () => { MockApiClient.clearMockResponses(); diff --git a/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx b/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx index 82c53697764f3e..c7164f10006905 100644 --- a/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx +++ b/static/app/views/settings/featureFlags/changeTracking/index.spec.tsx @@ -16,14 +16,6 @@ import OrganizationFeatureFlagsChangeTracking, { type Secret, } from 'sentry/views/settings/featureFlags/changeTracking'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addSuccessMessage: jest.fn(), - }; -}); - describe('OrganizationFeatureFlagsIndex', () => { const SECRETS_ENDPOINT = '/organizations/org-slug/flags/signing-secrets/'; const LOGS_ENDPOINT = '/organizations/org-slug/flags/logs/'; diff --git a/static/app/views/settings/organizationAuthTokens/index.spec.tsx b/static/app/views/settings/organizationAuthTokens/index.spec.tsx index 0f1906081a3122..c14fc755b7d2d8 100644 --- a/static/app/views/settings/organizationAuthTokens/index.spec.tsx +++ b/static/app/views/settings/organizationAuthTokens/index.spec.tsx @@ -15,15 +15,6 @@ import OrganizationsStore from 'sentry/stores/organizationsStore'; import type {OrgAuthToken} from 'sentry/types/user'; import {OrganizationAuthTokensIndex} from 'sentry/views/settings/organizationAuthTokens'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - addSuccessMessage: jest.fn(), - }; -}); - describe('OrganizationAuthTokensIndex', () => { const ENDPOINT = '/organizations/org-slug/org-auth-tokens/'; const PROJECTS_ENDPOINT = '/organizations/org-slug/projects/'; diff --git a/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx b/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx index 63223dbc6cdb22..6562198ad1993e 100644 --- a/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx +++ b/static/app/views/settings/organizationAuthTokens/newAuthToken.spec.tsx @@ -9,14 +9,6 @@ import * as indicators from 'sentry/actionCreators/indicator'; import type {OrgAuthToken} from 'sentry/types/user'; import OrganizationAuthTokensNewAuthToken from 'sentry/views/settings/organizationAuthTokens/newAuthToken'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - }; -}); - describe('OrganizationAuthTokensNewAuthToken', () => { const ENDPOINT = '/organizations/org-slug/org-auth-tokens/'; diff --git a/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx b/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx index e0e4cd8b2d120c..5cef01095a0ba2 100644 --- a/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx +++ b/static/app/views/settings/organizationConsoleSdkInvites/index.spec.tsx @@ -9,15 +9,6 @@ import OrganizationsStore from 'sentry/stores/organizationsStore'; import ConsoleSDKInvitesSettings from './index'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - addSuccessMessage: jest.fn(), - }; -}); - describe('ConsoleSDKInvitesSettings', () => { const ENDPOINT = '/organizations/org-slug/console-sdk-invites/'; diff --git a/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx b/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx index 53c88c7b95662e..6a8b7f3717aee4 100644 --- a/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx +++ b/static/app/views/settings/projectPerformance/projectPerformance.spec.tsx @@ -20,14 +20,6 @@ import ProjectPerformance, { DetectorConfigCustomer, } from 'sentry/views/settings/projectPerformance/projectPerformance'; -jest.mock('sentry/utils/isActiveSuperuser', () => { - const actual = jest.requireActual('sentry/utils/isActiveSuperuser'); - return { - ...actual, - isActiveSuperuser: jest.fn(), - }; -}); - const manageDetectorData = [ {label: 'N+1 DB Queries Detection', key: 'n_plus_one_db_queries_detection_enabled'}, {label: 'Slow DB Queries Detection', key: 'slow_db_queries_detection_enabled'}, diff --git a/static/app/views/settings/projectPlugins/details.spec.tsx b/static/app/views/settings/projectPlugins/details.spec.tsx index f506f3941d8274..9d388b2de72e83 100644 --- a/static/app/views/settings/projectPlugins/details.spec.tsx +++ b/static/app/views/settings/projectPlugins/details.spec.tsx @@ -8,14 +8,6 @@ import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrar import * as indicators from 'sentry/actionCreators/indicator'; import ProjectPluginDetails from 'sentry/views/settings/projectPlugins/details'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addSuccessMessage: jest.fn(), - }; -}); - describe('ProjectPluginDetails', () => { const organization = OrganizationFixture(); const project = ProjectFixture(); diff --git a/static/gsAdmin/components/customers/customerOverview.spec.tsx b/static/gsAdmin/components/customers/customerOverview.spec.tsx index ea5ee95016df6a..001b7268e421da 100644 --- a/static/gsAdmin/components/customers/customerOverview.spec.tsx +++ b/static/gsAdmin/components/customers/customerOverview.spec.tsx @@ -444,18 +444,27 @@ describe('CustomerOverview', () => { }); it('renders admin-only product trials when feature flag is graduated (true)', () => { - const sizeAnalysisInfo = - constants.BILLED_DATA_CATEGORY_INFO[DataCategoryExact.SIZE_ANALYSIS]; - const originalAdminOnlyProductTrialFeature = - sizeAnalysisInfo.adminOnlyProductTrialFeature; + // Mock BILLED_DATA_CATEGORY_INFO to simulate a graduated flag (adminOnlyProductTrialFeature: true) + const originalBilledDataCategoryInfo = constants.BILLED_DATA_CATEGORY_INFO; try { - ( - sizeAnalysisInfo as {adminOnlyProductTrialFeature: string | true} - ).adminOnlyProductTrialFeature = true; + const mockedBilledDataCategoryInfo = { + ...originalBilledDataCategoryInfo, + [DataCategoryExact.SIZE_ANALYSIS]: { + ...originalBilledDataCategoryInfo[DataCategoryExact.SIZE_ANALYSIS], + adminOnlyProductTrialFeature: true, // Graduated - no feature flag check needed + }, + }; + + // Override the module export for this test + Object.defineProperty(constants, 'BILLED_DATA_CATEGORY_INFO', { + value: mockedBilledDataCategoryInfo, + configurable: true, + }); + // Organization has NO feature flags - but graduated flag should still show const organization = OrganizationFixture({ - features: [], + features: [], // No feature flags! }); const subscription = SubscriptionFixture({ organization, @@ -472,13 +481,17 @@ describe('CustomerOverview', () => { ); expect(screen.getByText('Product Trials')).toBeInTheDocument(); + // SIZE_ANALYSIS should appear because the flag is graduated (true), not requiring feature flag expect(screen.getByText('Size Analysis Builds:')).toBeInTheDocument(); + // Regular product trials should still appear expect(screen.getByText('Spans:')).toBeInTheDocument(); expect(screen.getByText('Replays:')).toBeInTheDocument(); } finally { - ( - sizeAnalysisInfo as {adminOnlyProductTrialFeature: string | true} - ).adminOnlyProductTrialFeature = originalAdminOnlyProductTrialFeature; + // Restore the original - always runs even if assertions fail + Object.defineProperty(constants, 'BILLED_DATA_CATEGORY_INFO', { + value: originalBilledDataCategoryInfo, + configurable: true, + }); } }); diff --git a/static/gsAdmin/components/customers/pendingChanges.spec.tsx b/static/gsAdmin/components/customers/pendingChanges.spec.tsx index aac07921d93fb3..5c415eea713e0d 100644 --- a/static/gsAdmin/components/customers/pendingChanges.spec.tsx +++ b/static/gsAdmin/components/customers/pendingChanges.spec.tsx @@ -18,14 +18,6 @@ import {ANNUAL, RESERVED_BUDGET_QUOTA} from 'getsentry/constants'; import * as usePlanMigrations from 'getsentry/hooks/usePlanMigrations'; import {CohortId, OnDemandBudgetMode} from 'getsentry/types'; -jest.mock('getsentry/hooks/usePlanMigrations', () => { - const actual = jest.requireActual('getsentry/hooks/usePlanMigrations'); - return { - ...actual, - usePlanMigrations: jest.fn(actual.usePlanMigrations), - }; -}); - describe('PendingChanges', () => { it('renders null pendingChanges)', () => { const subscription = SubscriptionFixture({ @@ -292,8 +284,8 @@ describe('PendingChanges', () => { effectiveAt: migrationDate, }); jest - .mocked(usePlanMigrations.usePlanMigrations) - .mockReturnValueOnce({planMigrations: [migration], isLoading: false}); + .spyOn(usePlanMigrations, 'usePlanMigrations') + .mockReturnValue({planMigrations: [migration], isLoading: false}); const {container} = render(); diff --git a/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx b/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx index f8d9d34e24edf3..bd8c33cfb42f0e 100644 --- a/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx +++ b/static/gsAdmin/components/deleteBillingMetricHistory.spec.tsx @@ -8,33 +8,15 @@ import { } from 'sentry-test/reactTestingLibrary'; import selectEvent from 'sentry-test/selectEvent'; -import * as indicators from 'sentry/actionCreators/indicator'; -import * as modalActions from 'sentry/actionCreators/modal'; import type {Organization} from 'sentry/types/organization'; import deleteBillingMetricHistory from 'admin/components/deleteBillingMetricHistory'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addSuccessMessage: jest.fn(actual.addSuccessMessage), - addErrorMessage: jest.fn(actual.addErrorMessage), - }; -}); - -jest.mock('sentry/actionCreators/modal', () => { - const actual = jest.requireActual('sentry/actionCreators/modal'); - return { - ...actual, - openModal: jest.fn(actual.openModal), - }; -}); - describe('DeleteBillingMetricHistory', () => { + // Add afterEach to clean up after tests afterEach(() => { MockApiClient.clearMockResponses(); - jest.clearAllMocks(); + jest.restoreAllMocks(); }); const organization = OrganizationFixture({ @@ -149,7 +131,11 @@ describe('DeleteBillingMetricHistory', () => { }, }); - const successIndicator = jest.mocked(indicators.addSuccessMessage); + // Mock the success indicator + const successIndicator = jest.spyOn( + require('sentry/actionCreators/indicator'), + 'addSuccessMessage' + ); // Mock the API endpoint for deleting billing metric history const deleteBillingMetricHistoryMock = MockApiClient.addMockResponse({ @@ -222,7 +208,11 @@ describe('DeleteBillingMetricHistory', () => { }, }); - const errorIndicator = jest.mocked(indicators.addErrorMessage); + // Mock the error indicator + const errorIndicator = jest.spyOn( + require('sentry/actionCreators/indicator'), + 'addErrorMessage' + ); // Mock the API endpoint to return an error const deleteBillingMetricHistoryMock = MockApiClient.addMockResponse({ @@ -362,7 +352,7 @@ describe('deleteBillingMetricHistory export function', () => { it('opens modal with correct props', () => { const organization = OrganizationFixture(); const onSuccess = jest.fn(); - const openModalMock = jest.mocked(modalActions.openModal); + const openModalMock = jest.spyOn(require('sentry/actionCreators/modal'), 'openModal'); deleteBillingMetricHistory({organization, onSuccess}); diff --git a/static/gsAdmin/views/docIntegrations.spec.tsx b/static/gsAdmin/views/docIntegrations.spec.tsx index 1dd5d0033f5603..9412d8da98741a 100644 --- a/static/gsAdmin/views/docIntegrations.spec.tsx +++ b/static/gsAdmin/views/docIntegrations.spec.tsx @@ -12,15 +12,6 @@ import * as indicators from 'sentry/actionCreators/indicator'; import DocIntegrationDetails from 'admin/views/docIntegrationDetails'; import DocIntegrations from 'admin/views/docIntegrations'; -jest.mock('sentry/actionCreators/indicator', () => { - const actual = jest.requireActual('sentry/actionCreators/indicator'); - return { - ...actual, - addErrorMessage: jest.fn(), - addSuccessMessage: jest.fn(), - }; -}); - describe('Doc Integrations', () => { it('renders', () => { MockApiClient.addMockResponse({ diff --git a/static/gsAdmin/views/relocationDetails.spec.tsx b/static/gsAdmin/views/relocationDetails.spec.tsx index efe93acbe38cd4..a564e438156427 100644 --- a/static/gsAdmin/views/relocationDetails.spec.tsx +++ b/static/gsAdmin/views/relocationDetails.spec.tsx @@ -12,14 +12,6 @@ import * as useNavigateModule from 'sentry/utils/useNavigate'; import RelocationDetails from 'admin/views/relocationDetails'; -jest.mock('sentry/utils/useNavigate', () => { - const actual = jest.requireActual('sentry/utils/useNavigate'); - return { - ...actual, - useNavigate: jest.fn(), - }; -}); - jest.mock('sentry/actionCreators/indicator'); describe('Relocation Details', () => { diff --git a/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx b/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx index 20ccd3420166e9..b37600c1584422 100644 --- a/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx +++ b/static/gsApp/views/subscriptionPage/usageOverview/index.spec.tsx @@ -6,24 +6,11 @@ import {SubscriptionFixture} from 'getsentry-test/fixtures/subscription'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import {DataCategory} from 'sentry/types/core'; -import useMedia from 'sentry/utils/useMedia'; +import * as useMedia from 'sentry/utils/useMedia'; import SubscriptionStore from 'getsentry/stores/subscriptionStore'; import UsageOverview from 'getsentry/views/subscriptionPage/usageOverview'; -jest.mock('sentry/utils/useMedia', () => { - const actual = jest.requireActual('sentry/utils/useMedia'); - return { - __esModule: true, - default: jest.fn(actual.default), - }; -}); - -const actualUseMedia = jest.requireActual( - 'sentry/utils/useMedia' -).default; -const mockUseMedia = jest.mocked(useMedia); - describe('UsageOverview', () => { const organization = OrganizationFixture(); const subscription = SubscriptionFixture({ @@ -35,8 +22,7 @@ describe('UsageOverview', () => { const usageData = CustomerUsageFixture(); beforeEach(() => { - jest.clearAllMocks(); - mockUseMedia.mockImplementation(actualUseMedia); + jest.restoreAllMocks(); organization.features = ['seer-billing']; organization.access = ['org:billing']; SubscriptionStore.set(organization.slug, subscription); @@ -81,7 +67,9 @@ describe('UsageOverview', () => { }); it('opens panel based with no query params', async () => { - mockUseMedia.mockImplementation(query => query.includes('min-width')); + jest + .spyOn(useMedia, 'default') + .mockImplementation(query => query.includes('min-width')); render( { }); it('opens panel based on query params', async () => { - mockUseMedia.mockImplementation(query => query.includes('min-width')); + jest + .spyOn(useMedia, 'default') + .mockImplementation(query => query.includes('min-width')); render( { }); it('defaults to last selected when query param is invalid', async () => { - mockUseMedia.mockImplementation(query => query.includes('min-width')); + jest + .spyOn(useMedia, 'default') + .mockImplementation(query => query.includes('min-width')); render( { }); it('can switch panel by clicking table rows', async () => { - mockUseMedia.mockImplementation(query => query.includes('min-width')); + jest + .spyOn(useMedia, 'default') + .mockImplementation(query => query.includes('min-width')); render( return fn; }) ); -jest.mock('sentry/utils/performanceForSentry', () => { - const actual = jest.requireActual('sentry/utils/performanceForSentry'); - return { - ...actual, - VisuallyCompleteWithData: jest.fn( - (props: {children: ReactElement}) => props.children - ), - }; -}); jest.mock('sentry/utils/recreateRoute'); jest.mock('sentry/api'); +jest + .spyOn(performanceForSentry, 'VisuallyCompleteWithData') + .mockImplementation(props => props.children as ReactElement); jest.mock('scroll-to-element', () => jest.fn()); jest.mock('@stripe/stripe-js', () => ({ @@ -393,19 +388,6 @@ Object.defineProperty(global.self, 'crypto', { }, }); -const structuredClonePolyfill = - typeof nodeStructuredClone === 'function' - ? nodeStructuredClone - : (value: unknown) => JSON.parse(JSON.stringify(value)); - -Object.defineProperty(globalThis, 'structuredClone', { - value: structuredClonePolyfill, - configurable: true, - writable: true, -}); - -Object.defineProperty(window, 'structuredClone', { - value: structuredClonePolyfill, - configurable: true, - writable: true, -}); +if (typeof globalThis.structuredClone === 'undefined') { + globalThis.structuredClone = nodeStructuredClone; +} From d2518b137afe4f7dcd7564b51d497534e57e00f7 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:09:02 -0800 Subject: [PATCH 06/28] chore(ui): clean up stale babel references --- knip.config.ts | 6 ++---- scripts/test.js | 1 - static/app/components/charts/baseChartHeightResize.spec.tsx | 2 +- tests/js/setup.ts | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/knip.config.ts b/knip.config.ts index bf0f9ecb3266a1..f02d06882ba08d 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -76,14 +76,12 @@ const config: KnipConfig = { 'jest-environment-jsdom', // used as testEnvironment in jest config 'swc-plugin-component-annotate', // used in rspack config, needs better knip plugin '@swc/plugin-emotion', // used in rspack config, needs better knip plugin + '@swc/jest', // used in jest config, needs better knip plugin + '@swc-contrib/mut-cjs-exports', // used in jest config, needs better knip plugin 'buffer', // rspack.ProvidePlugin, needs better knip plugin 'process', // rspack.ProvidePlugin, needs better knip plugin '@types/webpack-env', // needed to make require.context work '@types/gtag.js', // needed for global `gtag` namespace typings - '@babel/preset-env', // Still used in jest - '@babel/preset-react', // Still used in jest - '@babel/preset-typescript', // Still used in jest - '@emotion/babel-plugin', // Still used in jest ], rules: { binaries: 'off', diff --git a/scripts/test.js b/scripts/test.js index ad877559f925fe..279a7b7519dd5a 100644 --- a/scripts/test.js +++ b/scripts/test.js @@ -1,7 +1,6 @@ 'use strict'; // Do this as the first thing so that any code reading it knows the right env. -// process.env.BABEL_ENV = 'test'; process.env.NODE_ENV = 'test'; process.env.PUBLIC_URL = ''; process.env.TZ = 'America/New_York'; diff --git a/static/app/components/charts/baseChartHeightResize.spec.tsx b/static/app/components/charts/baseChartHeightResize.spec.tsx index 2e9d48b40a0024..89a986810cf6a1 100644 --- a/static/app/components/charts/baseChartHeightResize.spec.tsx +++ b/static/app/components/charts/baseChartHeightResize.spec.tsx @@ -3,7 +3,7 @@ import {render} from 'sentry-test/reactTestingLibrary'; import BaseChart from 'sentry/components/charts/baseChart'; jest.mock('echarts-for-react/lib/core', () => { - // We need to do this because `jest.mock` gets hoisted by babel and `React` is not + // We need to do this because `jest.mock` gets hoisted before imports and `React` is not // guaranteed to be in scope const ReactActual = require('react'); diff --git a/tests/js/setup.ts b/tests/js/setup.ts index 29e2cd430e37f0..58aef10e746790 100644 --- a/tests/js/setup.ts +++ b/tests/js/setup.ts @@ -216,7 +216,7 @@ jest.mock('react-virtualized', function reactVirtualizedMockFactory() { }); jest.mock('echarts-for-react/lib/core', function echartsMockFactory() { - // We need to do this because `jest.mock` gets hoisted by babel and `React` is not + // We need to do this because `jest.mock` gets hoisted before imports and `React` is not // guaranteed to be in scope const ReactActual = require('react'); From f4b843917b01a1a500a00544a547a5e877e40671 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:11:27 -0800 Subject: [PATCH 07/28] esnext --- jest.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.config.ts b/jest.config.ts index 3bfe5bf204cf73..ae570525b64854 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -12,6 +12,7 @@ const swcConfig: SwcOptions = { }, sourceMaps: 'inline', jsc: { + target: 'esnext', parser: { syntax: 'typescript', tsx: true, From 86b0d61d2d24adb95d26ab889b1507984fffffef Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:16:20 -0800 Subject: [PATCH 08/28] remove ignore --- knip.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/knip.config.ts b/knip.config.ts index f02d06882ba08d..8b45d8cde9140e 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -76,7 +76,6 @@ const config: KnipConfig = { 'jest-environment-jsdom', // used as testEnvironment in jest config 'swc-plugin-component-annotate', // used in rspack config, needs better knip plugin '@swc/plugin-emotion', // used in rspack config, needs better knip plugin - '@swc/jest', // used in jest config, needs better knip plugin '@swc-contrib/mut-cjs-exports', // used in jest config, needs better knip plugin 'buffer', // rspack.ProvidePlugin, needs better knip plugin 'process', // rspack.ProvidePlugin, needs better knip plugin From 85fc0af497a1f748aae0d150831971ce003bc98f Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:23:14 -0800 Subject: [PATCH 09/28] test(ui): fix swc regressions for analytics and structuredClone --- static/app/utils/analytics.tsx | 2 +- .../utils/analytics/makeAnalyticsFunction.tsx | 8 ++++-- static/app/views/dashboards/detail.spec.tsx | 27 +++++++++++++++++-- tests/js/setup.ts | 13 ++++----- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/static/app/utils/analytics.tsx b/static/app/utils/analytics.tsx index 8249753380c900..7e4e2fb2c89c6f 100644 --- a/static/app/utils/analytics.tsx +++ b/static/app/utils/analytics.tsx @@ -66,7 +66,7 @@ import type {IssueEventParameters} from './analytics/issueAnalyticsEvents'; import {issueEventMap} from './analytics/issueAnalyticsEvents'; import type {LaravelInsightsEventParameters} from './analytics/laravelInsightsAnalyticsEvents'; import {laravelInsightsEventMap} from './analytics/laravelInsightsAnalyticsEvents'; -import makeAnalyticsFunction from './analytics/makeAnalyticsFunction'; +import {makeAnalyticsFunction} from './analytics/makeAnalyticsFunction'; import type {McpMonitoringEventParameters} from './analytics/mcpMonitoringAnalyticsEvents'; import {mcpMonitoringEventMap} from './analytics/mcpMonitoringAnalyticsEvents'; import type {MonitorsEventParameters} from './analytics/monitorsAnalyticsEvents'; diff --git a/static/app/utils/analytics/makeAnalyticsFunction.tsx b/static/app/utils/analytics/makeAnalyticsFunction.tsx index c910334ef92a61..0b1cc8b0ef7db9 100644 --- a/static/app/utils/analytics/makeAnalyticsFunction.tsx +++ b/static/app/utils/analytics/makeAnalyticsFunction.tsx @@ -1,6 +1,6 @@ +import HookStore from 'sentry/stores/hookStore'; import type {Hooks} from 'sentry/types/hooks'; import type {Organization} from 'sentry/types/organization'; -import {rawTrackAnalyticsEvent} from 'sentry/utils/analytics'; const hasAnalyticsDebug = () => window.localStorage?.getItem('DEBUG_ANALYTICS') === '1'; @@ -8,6 +8,8 @@ type OptionalOrg = { organization: Organization | string | null; }; type Options = Parameters[1]; +const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = (data, options) => + HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); /** * Generates functions used to track an event for analytics. @@ -16,7 +18,7 @@ type Options = Parameters[1]; * Can specifcy default options with the defaultOptions argument as well. * Can make orgnization required with the second generic. */ -export default function makeAnalyticsFunction< +export function makeAnalyticsFunction< EventParameters extends Record>, OrgRequirement extends OptionalOrg = OptionalOrg, >( @@ -55,3 +57,5 @@ export default function makeAnalyticsFunction< } }; } + +export default makeAnalyticsFunction; diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index d7db375199d73b..320b2876a57c3e 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -589,8 +589,31 @@ describe('Dashboards > Detail', () => { location: initialData.router.location, params: {orgId: 'org-slug', dashboardId: '1'}, }); - // @ts-expect-error this is assigning to readonly property... - types.MAX_WIDGETS = 1; + const maxWidgets = Array.from({length: types.MAX_WIDGETS}, (_, index) => + WidgetFixture({ + id: String(index + 1), + title: `Widget ${index + 1}`, + queries: [ + { + name: '', + conditions: 'event.type:error', + fields: ['count()'], + columns: [], + aggregates: ['count()'], + orderby: '-count()', + }, + ], + }) + ); + MockApiClient.addMockResponse({ + url: '/organizations/org-slug/dashboards/1/', + body: DashboardFixture(maxWidgets, { + id: '1', + title: 'Custom Errors', + filters: {}, + createdBy: UserFixture({id: '1'}), + }), + }); render( diff --git a/tests/js/setup.ts b/tests/js/setup.ts index 58aef10e746790..34fef0e65e7693 100644 --- a/tests/js/setup.ts +++ b/tests/js/setup.ts @@ -3,12 +3,7 @@ import '@testing-library/jest-dom'; import {webcrypto} from 'node:crypto'; -import { - // @ts-expect-error structuredClone is available in Node 17+ but types don't like it - structuredClone as nodeStructuredClone, - TextDecoder, - TextEncoder, -} from 'node:util'; +import {TextDecoder, TextEncoder} from 'node:util'; import {type ReactElement} from 'react'; import {configure as configureRtl} from '@testing-library/react'; // eslint-disable-line no-restricted-imports @@ -388,6 +383,8 @@ Object.defineProperty(global.self, 'crypto', { }, }); -if (typeof globalThis.structuredClone === 'undefined') { - globalThis.structuredClone = nodeStructuredClone; +if (typeof globalThis.structuredClone !== 'function') { + const nodeUtil = require('node:util') as typeof import('node:util'); + globalThis.structuredClone = + nodeUtil.structuredClone ?? ((value: unknown) => JSON.parse(JSON.stringify(value))); } From 91102df872b12a1d68239103ad681e55c9638433 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:31:51 -0800 Subject: [PATCH 10/28] remove unused export --- static/app/utils/analytics.tsx | 9 --------- static/app/utils/analytics/makeAnalyticsFunction.tsx | 2 -- static/gsApp/utils/trackGetsentryAnalytics.tsx | 2 +- static/gsApp/utils/trackSpendVisibilityAnalytics.tsx | 2 +- 4 files changed, 2 insertions(+), 13 deletions(-) diff --git a/static/app/utils/analytics.tsx b/static/app/utils/analytics.tsx index 7e4e2fb2c89c6f..65c8d6468b1afe 100644 --- a/static/app/utils/analytics.tsx +++ b/static/app/utils/analytics.tsx @@ -218,15 +218,6 @@ const allEventMap: Record = { */ export const trackAnalytics = makeAnalyticsFunction(allEventMap); -/** - * Should NOT be used directly. Instead, use makeAnalyticsFunction to generate - * an analytics function. - */ -export const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = ( - data, - options -) => HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); - type RecordMetric = Hooks['metrics:event'] & { endSpan: (opts: { /** diff --git a/static/app/utils/analytics/makeAnalyticsFunction.tsx b/static/app/utils/analytics/makeAnalyticsFunction.tsx index 0b1cc8b0ef7db9..3ff89db0570c64 100644 --- a/static/app/utils/analytics/makeAnalyticsFunction.tsx +++ b/static/app/utils/analytics/makeAnalyticsFunction.tsx @@ -57,5 +57,3 @@ export function makeAnalyticsFunction< } }; } - -export default makeAnalyticsFunction; diff --git a/static/gsApp/utils/trackGetsentryAnalytics.tsx b/static/gsApp/utils/trackGetsentryAnalytics.tsx index b101f9b66b0fe9..36078dd99650d8 100644 --- a/static/gsApp/utils/trackGetsentryAnalytics.tsx +++ b/static/gsApp/utils/trackGetsentryAnalytics.tsx @@ -1,7 +1,7 @@ import type {FieldValue} from 'sentry/components/forms/model'; import type {DataCategory} from 'sentry/types/core'; import type {Organization} from 'sentry/types/organization'; -import makeAnalyticsFunction from 'sentry/utils/analytics/makeAnalyticsFunction'; +import {makeAnalyticsFunction} from 'sentry/utils/analytics/makeAnalyticsFunction'; import type {EventType} from 'getsentry/components/addEventsCTA'; import type {AddOnCategory, CheckoutType, Subscription} from 'getsentry/types'; diff --git a/static/gsApp/utils/trackSpendVisibilityAnalytics.tsx b/static/gsApp/utils/trackSpendVisibilityAnalytics.tsx index 8ccb70a817cff5..bc7fa9d8a52b5c 100644 --- a/static/gsApp/utils/trackSpendVisibilityAnalytics.tsx +++ b/static/gsApp/utils/trackSpendVisibilityAnalytics.tsx @@ -1,5 +1,5 @@ import type {Organization} from 'sentry/types/organization'; -import makeAnalyticsFunction from 'sentry/utils/analytics/makeAnalyticsFunction'; +import {makeAnalyticsFunction} from 'sentry/utils/analytics/makeAnalyticsFunction'; import type {Subscription} from 'getsentry/types'; From f8e959f6017f638c3e671b7e248ceeae44a04acb Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Fri, 20 Feb 2026 10:33:17 -0800 Subject: [PATCH 11/28] type errors --- static/app/components/core/layout/styles.spec.tsx | 8 ++++---- tests/js/setup.ts | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/static/app/components/core/layout/styles.spec.tsx b/static/app/components/core/layout/styles.spec.tsx index e5895c52c5f68b..4771f5c706c847 100644 --- a/static/app/components/core/layout/styles.spec.tsx +++ b/static/app/components/core/layout/styles.spec.tsx @@ -65,7 +65,7 @@ const setupMediaQueries = ( describe('rc', () => { it('returns a simple CSS declaration for a plain string value', () => { - const output = rc('color', 'red', theme); + const output = rc('color', 'red', theme)!; expect( normalizeCss(css` ${output} @@ -78,7 +78,7 @@ describe('rc', () => { }); it('applies a resolver to a plain value', () => { - const output = rc('color', 'primary', theme, value => `resolved-${value}`); + const output = rc('color', 'primary', theme, value => `resolved-${value}`)!; expect( normalizeCss(css` ${output} @@ -92,7 +92,7 @@ describe('rc', () => { it('generates media queries for responsive values', () => { // First defined breakpoint gets both min-width and max-width; subsequent get min-width only. - const output = rc('color', {xs: 'blue', md: 'green'}, theme); + const output = rc('color', {xs: 'blue', md: 'green'}, theme)!; expect( normalizeCss(css` ${output} @@ -102,7 +102,7 @@ describe('rc', () => { it('skips undefined intermediate breakpoints', () => { // xs and md are defined; 2xs, sm, lg, xl, 2xl are absent from the output. - const output = rc('font-size', {xs: 'md', md: 'lg'}, theme); + const output = rc('font-size', {xs: 'md', md: 'lg'}, theme)!; expect( normalizeCss(css` ${output} diff --git a/tests/js/setup.ts b/tests/js/setup.ts index 34fef0e65e7693..ffbd5f387e4426 100644 --- a/tests/js/setup.ts +++ b/tests/js/setup.ts @@ -384,7 +384,9 @@ Object.defineProperty(global.self, 'crypto', { }); if (typeof globalThis.structuredClone !== 'function') { - const nodeUtil = require('node:util') as typeof import('node:util'); + const nodeUtil = require('node:util') as { + structuredClone?: typeof globalThis.structuredClone; + }; globalThis.structuredClone = nodeUtil.structuredClone ?? ((value: unknown) => JSON.parse(JSON.stringify(value))); } From 5ce790ae87778ae42cc5b5e13b25f5e8feced5e0 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 17:00:41 -0700 Subject: [PATCH 12/28] reload --- static/app/utils/analytics.tsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/static/app/utils/analytics.tsx b/static/app/utils/analytics.tsx index 6f848dc7bfd171..1b9e2b4133d5a0 100644 --- a/static/app/utils/analytics.tsx +++ b/static/app/utils/analytics.tsx @@ -224,6 +224,15 @@ const allEventMap: Record = { */ export const trackAnalytics = makeAnalyticsFunction(allEventMap); +/** + * Should NOT be used directly. Instead, use makeAnalyticsFunction to generate + * an analytics function. + */ +export const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = ( + data, + options +) => HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); + type RecordMetric = Hooks['metrics:event'] & { endSpan: (opts: { /** From 549f00883caf033fbdc7eb477fe6d42191b47cd1 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 21:47:09 -0700 Subject: [PATCH 13/28] fix import --- static/app/utils/analytics/makeAnalyticsFunction.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/app/utils/analytics/makeAnalyticsFunction.tsx b/static/app/utils/analytics/makeAnalyticsFunction.tsx index 0d781ab77834af..80d68dfe5d686e 100644 --- a/static/app/utils/analytics/makeAnalyticsFunction.tsx +++ b/static/app/utils/analytics/makeAnalyticsFunction.tsx @@ -1,4 +1,4 @@ -import HookStore from 'sentry/stores/hookStore'; +import {HookStore} from 'sentry/stores/hookStore'; import type {Hooks} from 'sentry/types/hooks'; import type {Organization} from 'sentry/types/organization'; From f302e4de48f001e66e8d08b3de5ea380d5f568f0 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 21:47:54 -0700 Subject: [PATCH 14/28] fix test --- static/app/views/dashboards/detail.spec.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index 4ef25432d6d83c..d5a51c801640b0 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -626,10 +626,6 @@ describe('Dashboards > Detail', () => { }); it('hides add widget option', async () => { - const router = RouterFixture({ - location: initialData.router.location, - params: {orgId: 'org-slug', dashboardId: '1'}, - }); const maxWidgets = Array.from({length: types.MAX_WIDGETS}, (_, index) => WidgetFixture({ id: String(index + 1), From d0e287e2915fe43297e1a7d2a98637fcec1e285b Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 21:49:31 -0700 Subject: [PATCH 15/28] what is happening --- static/app/views/dashboards/detail.spec.tsx | 27 ++------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index d5a51c801640b0..c9a862b4e675e6 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -626,31 +626,8 @@ describe('Dashboards > Detail', () => { }); it('hides add widget option', async () => { - const maxWidgets = Array.from({length: types.MAX_WIDGETS}, (_, index) => - WidgetFixture({ - id: String(index + 1), - title: `Widget ${index + 1}`, - queries: [ - { - name: '', - conditions: 'event.type:error', - fields: ['count()'], - columns: [], - aggregates: ['count()'], - orderby: '-count()', - }, - ], - }) - ); - MockApiClient.addMockResponse({ - url: '/organizations/org-slug/dashboards/1/', - body: DashboardFixture(maxWidgets, { - id: '1', - title: 'Custom Errors', - filters: {}, - createdBy: UserFixture({id: '1'}), - }), - }); + // @ts-expect-error this is assigning to readonly property... + types.MAX_WIDGETS = 1; render( From 782d7cafb4f7a9cd0d30f7438a33fc6cf956243c Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:09:58 -0700 Subject: [PATCH 16/28] attempt to cache swc --- .github/workflows/frontend.yml | 11 +++++++++++ jest.config.ts | 1 + static/app/utils/analytics/makeAnalyticsFunction.tsx | 4 +--- static/app/views/detectors/edit.spec.tsx | 4 +++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index cbc6e286673fa0..ee8be1a299c1e0 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -131,6 +131,17 @@ jobs: - uses: ./.github/actions/setup-node-pnpm + - name: jest transform cache + uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 + with: + path: | + .cache/jest + ~/.cache/swc + key: jest-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'jest.config.ts') }}-${{ matrix.instance }} + restore-keys: | + jest-cache-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml', 'jest.config.ts') }}- + jest-cache-${{ runner.os }}- + - name: Download jest-balance.json id: download-artifact uses: dawidd6/action-download-artifact@ac66b43f0e6a346234dd65d4d0c8fbb31cb316e5 # v11 diff --git a/jest.config.ts b/jest.config.ts index 08eea9abc61b91..67bdfaa124ae0a 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -286,6 +286,7 @@ const ESM_NODE_MODULES = [ const config: Config.InitialOptions = { verbose: false, + cacheDirectory: '.cache/jest', collectCoverageFrom: [ 'static/app/**/*.{js,jsx,ts,tsx}', '!static/app/**/*.spec.{js,jsx,ts,tsx}', diff --git a/static/app/utils/analytics/makeAnalyticsFunction.tsx b/static/app/utils/analytics/makeAnalyticsFunction.tsx index 80d68dfe5d686e..213d3c1e21b726 100644 --- a/static/app/utils/analytics/makeAnalyticsFunction.tsx +++ b/static/app/utils/analytics/makeAnalyticsFunction.tsx @@ -1,6 +1,6 @@ -import {HookStore} from 'sentry/stores/hookStore'; import type {Hooks} from 'sentry/types/hooks'; import type {Organization} from 'sentry/types/organization'; +import {rawTrackAnalyticsEvent} from 'sentry/utils/analytics'; const hasAnalyticsDebug = () => window.localStorage?.getItem('DEBUG_ANALYTICS') === '1'; @@ -8,8 +8,6 @@ type OptionalOrg = { organization: Organization | string | null; }; type Options = Parameters[1]; -const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = (data, options) => - HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); /** * Generates functions used to track an event for analytics. diff --git a/static/app/views/detectors/edit.spec.tsx b/static/app/views/detectors/edit.spec.tsx index 9532bf36274caa..692d5f3682b4c2 100644 --- a/static/app/views/detectors/edit.spec.tsx +++ b/static/app/views/detectors/edit.spec.tsx @@ -449,7 +449,9 @@ describe('DetectorEdit', () => { await screen.findByRole('link', {name: detectorWithOkEqualsHigh.name}) ).toBeInTheDocument(); - expect(screen.getByRole('radio', {name: 'Default'})).toBeChecked(); + expect(screen.getByText('Default').closest('label')).toHaveClass( + 'css-1aktlwe-RadioLineItem' + ); // Switching to Custom should reveal prefilled resolution input with the current OK value await userEvent.click(screen.getByRole('radio', {name: 'Custom'})); From 05e6a324bd8f43d5da7bb0f69488c04d650b4366 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:11:50 -0700 Subject: [PATCH 17/28] bump --- package.json | 8 +- pnpm-lock.yaml | 312 ++++++++++++++++++++++++++----------------------- 2 files changed, 171 insertions(+), 149 deletions(-) diff --git a/package.json b/package.json index bfe801a3c47085..051c20b2c56e19 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "@sentry/webpack-plugin": "4.6.1", "@stripe/react-stripe-js": "^3.9.2", "@stripe/stripe-js": "^5.10.0", - "@swc/plugin-emotion": "14.3.0", + "@swc/plugin-emotion": "14.8.0", "@tanstack/query-async-storage-persister": "5.96.0", "@tanstack/react-devtools": "0.9.9", "@tanstack/react-form": "1.28.6", @@ -237,9 +237,9 @@ "@sentry/jest-environment": "6.1.0", "@sentry/profiling-node": "10.41.0-beta.0", "@styled/typescript-styled-plugin": "^1.0.1", - "@swc-contrib/mut-cjs-exports": "^14.6.0", - "@swc/core": "^1.15.11", - "@swc/jest": "^0.2.39", + "@swc-contrib/mut-cjs-exports": "14.8.0", + "@swc/core": "1.15.24", + "@swc/jest": "0.2.39", "@tanstack/eslint-plugin-query": "5.96.0", "@testing-library/dom": "10.4.1", "@testing-library/jest-dom": "6.9.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08e7044816c6fd..65b197c7f4b166 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,7 +50,7 @@ importers: version: 0.0.18 '@mdx-js/loader': specifier: ^3.1.0 - version: 3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) '@popperjs/core': specifier: ^2.11.5 version: 2.11.5 @@ -158,10 +158,10 @@ importers: version: 1.23.2 '@rsdoctor/rspack-plugin': specifier: 1.5.0 - version: 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) '@rspack/cli': specifier: 1.7.6 - version: 1.7.6(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 1.7.6(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) '@rspack/core': specifier: 1.7.6 version: 1.7.6 @@ -206,7 +206,7 @@ importers: version: 1.0.0-beta.16(react@19.2.3) '@sentry/webpack-plugin': specifier: 4.6.1 - version: 4.6.1(encoding@0.1.13)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 4.6.1(encoding@0.1.13)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) '@stripe/react-stripe-js': specifier: ^3.9.2 version: 3.9.2(@stripe/stripe-js@5.10.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -214,8 +214,8 @@ importers: specifier: ^5.10.0 version: 5.10.0 '@swc/plugin-emotion': - specifier: 14.3.0 - version: 14.3.0 + specifier: 14.8.0 + version: 14.8.0 '@tanstack/query-async-storage-persister': specifier: 5.96.0 version: 5.96.0 @@ -323,7 +323,7 @@ importers: version: 5.0.2 compression-webpack-plugin: specifier: 11.1.0 - version: 11.1.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 11.1.0(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) conduit-client: specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -335,7 +335,7 @@ importers: version: 2.50.0 css-loader: specifier: ^7.1.2 - version: 7.1.2(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 7.1.2(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) d3-selection: specifier: ^3.0.0 version: 3.0.0 @@ -377,7 +377,7 @@ importers: version: 3.4.4 html-webpack-plugin: specifier: 5.6.3 - version: 5.6.3(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 5.6.3(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) idb-keyval: specifier: 6.2.2 version: 6.2.2 @@ -404,7 +404,7 @@ importers: version: 4.3.0 less-loader: specifier: ^12.2.0 - version: 12.2.0(@rspack/core@1.7.6)(less@4.3.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 12.2.0(@rspack/core@1.7.6)(less@4.3.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) lodash: specifier: ^4.17.23 version: 4.17.23 @@ -512,7 +512,7 @@ importers: version: 1.0.3 style-loader: specifier: 4.0.0 - version: 4.0.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + version: 4.0.0(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) swc-plugin-component-annotate: specifier: 1.13.0 version: 1.13.0 @@ -561,7 +561,7 @@ importers: version: 2.41.0 '@sentry/jest-environment': specifier: 6.1.0 - version: 6.1.0(@sentry/node@10.41.0-beta.0)(@sentry/profiling-node@10.41.0-beta.0)(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2))) + version: 6.1.0(@sentry/node@10.41.0-beta.0)(@sentry/profiling-node@10.41.0-beta.0)(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2))) '@sentry/profiling-node': specifier: 10.41.0-beta.0 version: 10.41.0-beta.0 @@ -569,14 +569,14 @@ importers: specifier: ^1.0.1 version: 1.0.1 '@swc-contrib/mut-cjs-exports': - specifier: ^14.6.0 - version: 14.6.0(@swc/core@1.15.11)(@swc/jest@0.2.39(@swc/core@1.15.11)) + specifier: 14.8.0 + version: 14.8.0(@swc/core@1.15.24)(@swc/jest@0.2.39(@swc/core@1.15.24)) '@swc/core': - specifier: ^1.15.11 - version: 1.15.11 + specifier: 1.15.24 + version: 1.15.24 '@swc/jest': - specifier: ^0.2.39 - version: 0.2.39(@swc/core@1.15.11) + specifier: 0.2.39 + version: 0.2.39(@swc/core@1.15.24) '@tanstack/eslint-plugin-query': specifier: 5.96.0 version: 5.96.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) @@ -633,7 +633,7 @@ importers: version: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.34.0(jiti@2.6.1)) eslint-plugin-jest: specifier: 29.15.0 - version: 29.15.0(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)))(typescript@6.0.2) + version: 29.15.0(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)))(typescript@6.0.2) eslint-plugin-jest-dom: specifier: ^5.5.0 version: 5.5.0(@testing-library/dom@10.4.1)(eslint@9.34.0(jiti@2.6.1)) @@ -672,7 +672,7 @@ importers: version: 16.3.0 jest: specifier: 30.3.0 - version: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + version: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) jest-canvas-mock: specifier: ^2.5.2 version: 2.5.2 @@ -3121,78 +3121,92 @@ packages: '@styled/typescript-styled-plugin@1.0.1': resolution: {integrity: sha512-4n9uYJiui4hqGIEMvs/u7sfjbs1/84shYt2Fxcm0JQbvUGfuFhtsqVG5y1hSvw5kTwdpIe4rbXMMOwVHcuAh1g==} - '@swc-contrib/mut-cjs-exports@14.6.0': - resolution: {integrity: sha512-vIzzDOZKI9GIfekiCxDdezf6nVW1YdMm1ausxkFTH8nxcoQ9eGqAnGBJJLwpKS6fjzfXJJiww4tbARLfhdRZww==} + '@swc-contrib/mut-cjs-exports@14.8.0': + resolution: {integrity: sha512-iXcbofBNC3WA1QNlIqTXJg/5/dcCBg9dOh7XXvtIsHqrWx+Q1CEPHz5W4ctcq81NbySyTGChuGQZGk9161Fzlg==} peerDependencies: '@swc/core': ^1.10.0 '@swc/jest': ^0.2.37 - '@swc/core-darwin-arm64@1.15.11': - resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} + '@swc/core-darwin-arm64@1.15.24': + resolution: {integrity: sha512-uM5ZGfFXjtvtJ+fe448PVBEbn/CSxS3UAyLj3O9xOqKIWy3S6hPTXSPbszxkSsGDYKi+YFhzAsR4r/eXLxEQ0g==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.11': - resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} + '@swc/core-darwin-x64@1.15.24': + resolution: {integrity: sha512-fMIb/Zfn929pw25VMBhV7Ji2Dl+lCWtUPNdYJQYOke+00E5fcQ9ynxtP8+qhUo/HZc+mYQb1gJxwHM9vty+lXg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.11': - resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} + '@swc/core-linux-arm-gnueabihf@1.15.24': + resolution: {integrity: sha512-vOkjsyjjxnoYx3hMEWcGxQrMgnNrRm6WAegBXrN8foHtDAR+zpdhpGF5a4lj1bNPgXAvmysjui8cM1ov/Clkaw==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.11': - resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} + '@swc/core-linux-arm64-gnu@1.15.24': + resolution: {integrity: sha512-h/oNu+upkXJ6Cicnq7YGVj9PkdfarLCdQa8l/FlHYvfv8CEiMaeeTnpLU7gSBH/rGxosM6Qkfa/J9mThGF9CLA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [glibc] - '@swc/core-linux-arm64-musl@1.15.11': - resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} + '@swc/core-linux-arm64-musl@1.15.24': + resolution: {integrity: sha512-ZpF/pRe1guk6sKzQI9D1jAORtjTdNlyeXn9GDz8ophof/w2WhojRblvSDJaGe7rJjcPN8AaOkhwdRUh7q8oYIg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] libc: [musl] - '@swc/core-linux-x64-gnu@1.15.11': - resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} + '@swc/core-linux-ppc64-gnu@1.15.24': + resolution: {integrity: sha512-QZEsZfisHTSJlmyChgDFNmKPb3W6Lhbfo/O76HhIngfEdnQNmukS38/VSe1feho+xkV5A5hETyCbx3sALBZKAQ==} + engines: {node: '>=10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-s390x-gnu@1.15.24': + resolution: {integrity: sha512-DLdJKVsJgglqQrJBuoUYNmzm3leI7kUZhLbZGHv42onfKsGf6JDS3+bzCUQfte/XOqDjh/tmmn1DR/CF/tCJFw==} + engines: {node: '>=10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-gnu@1.15.24': + resolution: {integrity: sha512-IpLYfposPA/XLxYOKpRfeccl1p5dDa3+okZDHHTchBkXEaVCnq5MADPmIWwIYj1tudt7hORsEHccG5no6IUQRw==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [glibc] - '@swc/core-linux-x64-musl@1.15.11': - resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} + '@swc/core-linux-x64-musl@1.15.24': + resolution: {integrity: sha512-JHy3fMSc0t/EPWgo74+OK5TGr51aElnzqfUPaiRf2qJ/BfX5CUCfMiWVBuhI7qmVMBnk1jTRnL/xZnOSHDPLYg==} engines: {node: '>=10'} cpu: [x64] os: [linux] libc: [musl] - '@swc/core-win32-arm64-msvc@1.15.11': - resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} + '@swc/core-win32-arm64-msvc@1.15.24': + resolution: {integrity: sha512-Txj+qUH1z2bUd1P3JvwByfjKFti3cptlAxhWgmunBUUxy/IW3CXLZ6l6Gk4liANadKkU71nIU1X30Z5vpMT3BA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.11': - resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} + '@swc/core-win32-ia32-msvc@1.15.24': + resolution: {integrity: sha512-15D/nl3XwrhFpMv+MADFOiVwv3FvH9j8c6Rf8EXBT3Q5LoMh8YnDnSgPYqw1JzPnksvsBX6QPXLiPqmcR/Z4qQ==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.11': - resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} + '@swc/core-win32-x64-msvc@1.15.24': + resolution: {integrity: sha512-PR0PlTlPra2JbaDphrOAzm6s0v9rA0F17YzB+XbWD95B4g2cWcZY9LAeTa4xll70VLw9Jr7xBrlohqlQmelMFQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.11': - resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} + '@swc/core@1.15.24': + resolution: {integrity: sha512-5Hj8aNasue7yusUt8LGCUe/AjM7RMAce8ZoyDyiFwx7Al+GbYKL+yE7g4sJk8vEr1dKIkTRARkNIJENc4CjkBQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -3212,11 +3226,11 @@ packages: peerDependencies: '@swc/core': '*' - '@swc/plugin-emotion@14.3.0': - resolution: {integrity: sha512-BGlMPa73k2u01gXJHULC5Pvt0Mgjt+/34ceOxN5IGVGvZu8h4ryG4K6p/+JUpUojfNTEng/hpIcmCWtOHmg7Pw==} + '@swc/plugin-emotion@14.8.0': + resolution: {integrity: sha512-otFM4JfEE9uyH6HxhD5Dmw6WUY773d2Ln44kEobc89HoVbdGkO3DZv9r2h5znFy7wORyl894V3nYd/mhqc4dIQ==} - '@swc/types@0.1.25': - resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} + '@swc/types@0.1.26': + resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} '@tanstack/devtools-client@0.0.6': resolution: {integrity: sha512-f85ZJXJnDIFOoykG/BFIixuAevJovCvJF391LPs6YjBAPhGYC50NWlx1y4iF/UmK5/cCMx+/JqI5SBOz7FanQQ==} @@ -10201,7 +10215,7 @@ snapshots: jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2))': + '@jest/core@30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2))': dependencies: '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 @@ -10216,7 +10230,7 @@ snapshots: exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + jest-config: 30.3.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -10523,12 +10537,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) source-map: 0.7.4 optionalDependencies: - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) transitivePeerDependencies: - acorn - supports-color @@ -11685,13 +11699,13 @@ snapshots: '@rsdoctor/client@1.5.0': {} - '@rsdoctor/core@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rsdoctor/core@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@rsbuild/plugin-check-syntax': 1.6.0 - '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) browserslist-load-config: 1.0.1 enhanced-resolve: 5.12.0 es-toolkit: 1.44.0 @@ -11707,10 +11721,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rsdoctor/graph@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) es-toolkit: 1.44.0 path-browserify: 1.0.1 source-map: 0.7.6 @@ -11718,13 +11732,13 @@ snapshots: - '@rspack/core' - webpack - '@rsdoctor/rspack-plugin@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rsdoctor/rspack-plugin@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: - '@rsdoctor/core': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/core': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/sdk': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) optionalDependencies: '@rspack/core': 1.7.6 transitivePeerDependencies: @@ -11734,12 +11748,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rsdoctor/sdk@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@rsdoctor/client': 1.5.0 - '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) - '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/graph': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + '@rsdoctor/utils': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) safer-buffer: 2.1.2 socket.io: 4.8.1 tapable: 2.2.3 @@ -11750,7 +11764,7 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rsdoctor/types@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 @@ -11758,12 +11772,12 @@ snapshots: source-map: 0.7.6 optionalDependencies: '@rspack/core': 1.7.6 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) - '@rsdoctor/utils@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rsdoctor/utils@1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@babel/code-frame': 7.26.2 - '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rsdoctor/types': 1.5.0(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) '@types/estree': 1.0.5 acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -11826,11 +11840,11 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.7.6 '@rspack/binding-win32-x64-msvc': 1.7.6 - '@rspack/cli@1.7.6(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rspack/cli@1.7.6(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@discoveryjs/json-ext': 0.5.7 '@rspack/core': 1.7.6 - '@rspack/dev-server': 1.1.5(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + '@rspack/dev-server': 1.1.5(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) exit-hook: 4.0.0 webpack-bundle-analyzer: 4.10.2 transitivePeerDependencies: @@ -11848,13 +11862,13 @@ snapshots: '@rspack/binding': 1.7.6 '@rspack/lite-tapable': 1.1.0 - '@rspack/dev-server@1.1.5(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@rspack/dev-server@1.1.5(@rspack/core@1.7.6)(@types/express@4.17.25)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@rspack/core': 1.7.6 chokidar: 3.6.0 http-proxy-middleware: 2.0.9(@types/express@4.17.25) p-retry: 6.2.1 - webpack-dev-server: 5.2.2(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + webpack-dev-server: 5.2.2(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) ws: 8.19.0 transitivePeerDependencies: - '@types/express' @@ -12016,11 +12030,11 @@ snapshots: '@sentry/core@10.41.0-beta.0': {} - '@sentry/jest-environment@6.1.0(@sentry/node@10.41.0-beta.0)(@sentry/profiling-node@10.41.0-beta.0)(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)))': + '@sentry/jest-environment@6.1.0(@sentry/node@10.41.0-beta.0)(@sentry/profiling-node@10.41.0-beta.0)(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)))': dependencies: '@sentry/node': 10.41.0-beta.0 '@sentry/profiling-node': 10.41.0-beta.0 - jest: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + jest: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) '@sentry/node-core@10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: @@ -12111,12 +12125,12 @@ snapshots: dependencies: react: 19.2.3 - '@sentry/webpack-plugin@4.6.1(encoding@0.1.13)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10))': + '@sentry/webpack-plugin@4.6.1(encoding@0.1.13)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: '@sentry/bundler-plugin-core': 4.6.1(encoding@0.1.13) unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) transitivePeerDependencies: - encoding - supports-color @@ -12219,56 +12233,64 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-types: 3.17.5 - '@swc-contrib/mut-cjs-exports@14.6.0(@swc/core@1.15.11)(@swc/jest@0.2.39(@swc/core@1.15.11))': + '@swc-contrib/mut-cjs-exports@14.8.0(@swc/core@1.15.24)(@swc/jest@0.2.39(@swc/core@1.15.24))': dependencies: - '@swc/core': 1.15.11 - '@swc/jest': 0.2.39(@swc/core@1.15.11) + '@swc/core': 1.15.24 + '@swc/jest': 0.2.39(@swc/core@1.15.24) + + '@swc/core-darwin-arm64@1.15.24': + optional: true + + '@swc/core-darwin-x64@1.15.24': + optional: true - '@swc/core-darwin-arm64@1.15.11': + '@swc/core-linux-arm-gnueabihf@1.15.24': optional: true - '@swc/core-darwin-x64@1.15.11': + '@swc/core-linux-arm64-gnu@1.15.24': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.11': + '@swc/core-linux-arm64-musl@1.15.24': optional: true - '@swc/core-linux-arm64-gnu@1.15.11': + '@swc/core-linux-ppc64-gnu@1.15.24': optional: true - '@swc/core-linux-arm64-musl@1.15.11': + '@swc/core-linux-s390x-gnu@1.15.24': optional: true - '@swc/core-linux-x64-gnu@1.15.11': + '@swc/core-linux-x64-gnu@1.15.24': optional: true - '@swc/core-linux-x64-musl@1.15.11': + '@swc/core-linux-x64-musl@1.15.24': optional: true - '@swc/core-win32-arm64-msvc@1.15.11': + '@swc/core-win32-arm64-msvc@1.15.24': optional: true - '@swc/core-win32-ia32-msvc@1.15.11': + '@swc/core-win32-ia32-msvc@1.15.24': optional: true - '@swc/core-win32-x64-msvc@1.15.11': + '@swc/core-win32-x64-msvc@1.15.24': optional: true - '@swc/core@1.15.11': + '@swc/core@1.15.24': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.25 + '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.11 - '@swc/core-darwin-x64': 1.15.11 - '@swc/core-linux-arm-gnueabihf': 1.15.11 - '@swc/core-linux-arm64-gnu': 1.15.11 - '@swc/core-linux-arm64-musl': 1.15.11 - '@swc/core-linux-x64-gnu': 1.15.11 - '@swc/core-linux-x64-musl': 1.15.11 - '@swc/core-win32-arm64-msvc': 1.15.11 - '@swc/core-win32-ia32-msvc': 1.15.11 - '@swc/core-win32-x64-msvc': 1.15.11 + '@swc/core-darwin-arm64': 1.15.24 + '@swc/core-darwin-x64': 1.15.24 + '@swc/core-linux-arm-gnueabihf': 1.15.24 + '@swc/core-linux-arm64-gnu': 1.15.24 + '@swc/core-linux-arm64-musl': 1.15.24 + '@swc/core-linux-ppc64-gnu': 1.15.24 + '@swc/core-linux-s390x-gnu': 1.15.24 + '@swc/core-linux-x64-gnu': 1.15.24 + '@swc/core-linux-x64-musl': 1.15.24 + '@swc/core-win32-arm64-msvc': 1.15.24 + '@swc/core-win32-ia32-msvc': 1.15.24 + '@swc/core-win32-x64-msvc': 1.15.24 '@swc/counter@0.1.3': {} @@ -12276,18 +12298,18 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/jest@0.2.39(@swc/core@1.15.11)': + '@swc/jest@0.2.39(@swc/core@1.15.24)': dependencies: '@jest/create-cache-key-function': 30.2.0 - '@swc/core': 1.15.11 + '@swc/core': 1.15.24 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 - '@swc/plugin-emotion@14.3.0': + '@swc/plugin-emotion@14.8.0': dependencies: '@swc/counter': 0.1.3 - '@swc/types@0.1.25': + '@swc/types@0.1.26': dependencies: '@swc/counter': 0.1.3 @@ -13850,11 +13872,11 @@ snapshots: dependencies: mime-db: 1.54.0 - compression-webpack-plugin@11.1.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + compression-webpack-plugin@11.1.0(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) compression@1.8.1: dependencies: @@ -13960,7 +13982,7 @@ snapshots: css-functions-list@3.2.3: {} - css-loader@7.1.2(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + css-loader@7.1.2(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: icss-utils: 5.1.0(postcss@8.5.3) postcss: 8.5.3 @@ -13972,7 +13994,7 @@ snapshots: semver: 7.7.2 optionalDependencies: '@rspack/core': 1.7.6 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) css-select@4.1.3: dependencies: @@ -14701,13 +14723,13 @@ snapshots: optionalDependencies: '@testing-library/dom': 10.4.1 - eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)))(typescript@6.0.2): + eslint-plugin-jest@29.15.0(@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)))(typescript@6.0.2): dependencies: '@typescript-eslint/utils': 8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) eslint: 9.34.0(jiti@2.6.1) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) - jest: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + jest: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -15582,7 +15604,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + html-webpack-plugin@5.6.3(@rspack/core@1.7.6)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -15591,7 +15613,7 @@ snapshots: tapable: 2.2.1 optionalDependencies: '@rspack/core': 1.7.6 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) htmlparser2@10.0.0: dependencies: @@ -16028,15 +16050,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)): + jest-cli@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)): dependencies: - '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + jest-config: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) jest-util: 30.3.0 jest-validate: 30.3.0 yargs: 17.7.2 @@ -16047,7 +16069,7 @@ snapshots: - supports-color - ts-node - jest-config@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)): + jest-config@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.1.0 @@ -16074,12 +16096,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.15.21 - ts-node: 10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2) + ts-node: 10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.3.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)): + jest-config@30.3.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)): dependencies: '@babel/core': 7.28.0 '@jest/get-type': 30.1.0 @@ -16106,7 +16128,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.19.7 - ts-node: 10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2) + ts-node: 10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -16403,12 +16425,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)): + jest@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)): dependencies: - '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + '@jest/core': 30.3.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2)) + jest-cli: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -16585,12 +16607,12 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.8.3 - less-loader@12.2.0(@rspack/core@1.7.6)(less@4.3.0)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + less-loader@12.2.0(@rspack/core@1.7.6)(less@4.3.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: less: 4.3.0 optionalDependencies: '@rspack/core': 1.7.6 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) less@4.3.0: dependencies: @@ -18781,9 +18803,9 @@ snapshots: strip-json-comments@5.0.3: {} - style-loader@4.0.0(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + style-loader@4.0.0(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) style-to-js@1.1.16: dependencies: @@ -18894,16 +18916,16 @@ snapshots: tapable@2.3.0: {} - terser-webpack-plugin@5.3.16(@swc/core@1.15.11)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.24)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.40.0 - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) optionalDependencies: - '@swc/core': 1.15.11 + '@swc/core': 1.15.24 esbuild: 0.25.10 terser@5.40.0: @@ -19010,7 +19032,7 @@ snapshots: '@ts-morph/common': 0.28.1 code-block-writer: 13.0.3 - ts-node@10.9.2(@swc/core@1.15.11)(@types/node@22.15.21)(typescript@6.0.2): + ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -19028,7 +19050,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.11 + '@swc/core': 1.15.24 optional: true tsconfig-paths@3.15.0: @@ -19461,7 +19483,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@7.4.5(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + webpack-dev-middleware@7.4.5(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: colorette: 2.0.20 memfs: 4.51.1 @@ -19470,9 +19492,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) - webpack-dev-server@5.2.2(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)): + webpack-dev-server@5.2.2(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -19500,10 +19522,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + webpack-dev-middleware: 7.4.5(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) ws: 8.19.0 optionalDependencies: - webpack: 5.99.6(@swc/core@1.15.11)(esbuild@0.25.10) + webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) transitivePeerDependencies: - bufferutil - debug @@ -19514,7 +19536,7 @@ snapshots: webpack-virtual-modules@0.5.0: {} - webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10): + webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -19536,7 +19558,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.11)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.11)(esbuild@0.25.10)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.24)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: From a2811e22c8ebdf078b53ad43d09acb8a72f5963b Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:21:29 -0700 Subject: [PATCH 18/28] fix test --- static/app/views/detectors/edit.spec.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/static/app/views/detectors/edit.spec.tsx b/static/app/views/detectors/edit.spec.tsx index 692d5f3682b4c2..47df2888572b71 100644 --- a/static/app/views/detectors/edit.spec.tsx +++ b/static/app/views/detectors/edit.spec.tsx @@ -449,8 +449,9 @@ describe('DetectorEdit', () => { await screen.findByRole('link', {name: detectorWithOkEqualsHigh.name}) ).toBeInTheDocument(); - expect(screen.getByText('Default').closest('label')).toHaveClass( - 'css-1aktlwe-RadioLineItem' + expect(screen.getByText('Default').closest('label')).toHaveAttribute( + 'aria-checked', + 'true' ); // Switching to Custom should reveal prefilled resolution input with the current OK value From 73c0c2332e1bfbcb53cde2d374ef72c07589571a Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:42:20 -0700 Subject: [PATCH 19/28] avoid circular import, constant mutation --- static/app/utils/analytics.tsx | 11 +++-------- .../app/utils/analytics/makeAnalyticsFunction.tsx | 15 ++++++++++++++- static/app/views/dashboards/detail.spec.tsx | 3 +-- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/static/app/utils/analytics.tsx b/static/app/utils/analytics.tsx index 1b9e2b4133d5a0..ac3e923fcab97b 100644 --- a/static/app/utils/analytics.tsx +++ b/static/app/utils/analytics.tsx @@ -224,14 +224,9 @@ const allEventMap: Record = { */ export const trackAnalytics = makeAnalyticsFunction(allEventMap); -/** - * Should NOT be used directly. Instead, use makeAnalyticsFunction to generate - * an analytics function. - */ -export const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = ( - data, - options -) => HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); +// Re-export from makeAnalyticsFunction to preserve the public API. +// The definition lives there to avoid a circular dependency. +export {rawTrackAnalyticsEvent} from './analytics/makeAnalyticsFunction'; type RecordMetric = Hooks['metrics:event'] & { endSpan: (opts: { diff --git a/static/app/utils/analytics/makeAnalyticsFunction.tsx b/static/app/utils/analytics/makeAnalyticsFunction.tsx index 213d3c1e21b726..6e039a15db44c0 100644 --- a/static/app/utils/analytics/makeAnalyticsFunction.tsx +++ b/static/app/utils/analytics/makeAnalyticsFunction.tsx @@ -1,6 +1,19 @@ +import {HookStore} from 'sentry/stores/hookStore'; import type {Hooks} from 'sentry/types/hooks'; import type {Organization} from 'sentry/types/organization'; -import {rawTrackAnalyticsEvent} from 'sentry/utils/analytics'; + +/** + * Should NOT be used directly. Instead, use makeAnalyticsFunction to generate + * an analytics function. + * + * This lives here (rather than in analytics.tsx) to avoid a circular dependency: + * analytics.tsx imports makeAnalyticsFunction, and makeAnalyticsFunction calls + * rawTrackAnalyticsEvent. + */ +export const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = ( + data, + options +) => HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); const hasAnalyticsDebug = () => window.localStorage?.getItem('DEBUG_ANALYTICS') === '1'; diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index c9a862b4e675e6..24aab53a7c358d 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -626,8 +626,7 @@ describe('Dashboards > Detail', () => { }); it('hides add widget option', async () => { - // @ts-expect-error this is assigning to readonly property... - types.MAX_WIDGETS = 1; + jest.spyOn(types, 'MAX_WIDGETS', 'get').mockReturnValue(1); render( From a52df4c0d04addaec7e5ce77793c5e976c912c5b Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:52:10 -0700 Subject: [PATCH 20/28] can we not compile emotion? --- jest.config.snapshots.ts | 64 +++++++++++++++++++++------------------- jest.config.ts | 13 ++------ 2 files changed, 35 insertions(+), 42 deletions(-) diff --git a/jest.config.snapshots.ts b/jest.config.snapshots.ts index 9cce7ad3fb1318..c98fef27ac680c 100644 --- a/jest.config.snapshots.ts +++ b/jest.config.snapshots.ts @@ -1,43 +1,47 @@ -import type {TransformOptions} from '@babel/core'; import type {Config} from '@jest/types'; +import type {Options as SwcOptions} from '@swc/core'; -const babelConfig: TransformOptions = { - presets: [ - [ - '@babel/preset-react', - { +const swcConfig: SwcOptions = { + isModule: true, + module: { + type: 'commonjs', + }, + sourceMaps: 'inline', + jsc: { + target: 'esnext', + parser: { + syntax: 'typescript', + tsx: true, + dynamicImport: true, + }, + transform: { + react: { runtime: 'automatic', importSource: '@emotion/react', }, - ], - [ - '@babel/preset-env', - { - useBuiltIns: 'usage', - corejs: '3.41', - targets: { - node: 'current', - }, - }, - ], - ['@babel/preset-typescript', {allowDeclareFields: true, onlyRemoveTypeImports: true}], - ], - plugins: [ - [ - '@emotion/babel-plugin', - { - sourceMap: false, - }, - ], - ], + }, + experimental: { + plugins: [ + ['@swc-contrib/mut-cjs-exports', {}], + [ + '@swc/plugin-emotion', + { + sourceMap: false, + autoLabel: 'never', + }, + ], + ], + }, + }, }; /** - * ESM packages that need to be transformed by babel-jest. + * ESM packages that need to be transformed. */ const ESM_NODE_MODULES = ['screenfull', 'cbor2', 'nuqs', 'color']; const config: Config.InitialOptions = { + cacheDirectory: '.cache/jest-snapshots', // testEnvironment and testMatch are the core differences between this and the main config testEnvironment: 'node', testMatch: ['/static/**/*.snapshots.tsx'], @@ -63,9 +67,7 @@ const config: Config.InitialOptions = { }, transform: { - '^.+\\.jsx?$': ['babel-jest', babelConfig as any], - '^.+\\.tsx?$': ['babel-jest', babelConfig as any], - '^.+\\.mjs?$': ['babel-jest', babelConfig as any], + '^.+\\.[mc]?[jt]sx?$': ['@swc/jest', swcConfig as any], }, transformIgnorePatterns: [ ESM_NODE_MODULES.length diff --git a/jest.config.ts b/jest.config.ts index 67bdfaa124ae0a..94ab2ea7a8e5e9 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -6,7 +6,7 @@ import type {Config} from '@jest/types'; import type {Options as SwcOptions} from '@swc/core'; const swcConfig: SwcOptions = { - isModule: 'unknown', + isModule: true, module: { type: 'commonjs', }, @@ -25,16 +25,7 @@ const swcConfig: SwcOptions = { }, }, experimental: { - plugins: [ - ['@swc-contrib/mut-cjs-exports', {}], - [ - '@swc/plugin-emotion', - { - sourceMap: false, - autoLabel: 'never', - }, - ], - ], + plugins: [['@swc-contrib/mut-cjs-exports', {}]], }, }, }; From 0b937b650f7496537ec7808782d87ae041d834b7 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:55:04 -0700 Subject: [PATCH 21/28] knip --- knip.config.ts | 4 ---- static/app/utils/analytics.tsx | 4 ---- static/app/utils/analytics/makeAnalyticsFunction.tsx | 6 ++---- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/knip.config.ts b/knip.config.ts index 2f44be83fb3186..73118ad33093ee 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -81,10 +81,6 @@ const config: KnipConfig = { '@swc/plugin-emotion', // used in rspack config, needs better knip plugin 'buffer', // rspack.ProvidePlugin, needs better knip plugin 'process', // rspack.ProvidePlugin, needs better knip plugin - '@babel/preset-env', // Still used in jest - '@babel/preset-react', // Still used in jest - '@babel/preset-typescript', // Still used in jest - '@emotion/babel-plugin', // Still used in jest 'odiff-bin', // raw binary consumed by Python backend, not a JS import ], rules: { diff --git a/static/app/utils/analytics.tsx b/static/app/utils/analytics.tsx index ac3e923fcab97b..6f848dc7bfd171 100644 --- a/static/app/utils/analytics.tsx +++ b/static/app/utils/analytics.tsx @@ -224,10 +224,6 @@ const allEventMap: Record = { */ export const trackAnalytics = makeAnalyticsFunction(allEventMap); -// Re-export from makeAnalyticsFunction to preserve the public API. -// The definition lives there to avoid a circular dependency. -export {rawTrackAnalyticsEvent} from './analytics/makeAnalyticsFunction'; - type RecordMetric = Hooks['metrics:event'] & { endSpan: (opts: { /** diff --git a/static/app/utils/analytics/makeAnalyticsFunction.tsx b/static/app/utils/analytics/makeAnalyticsFunction.tsx index 6e039a15db44c0..d394c942bbbc95 100644 --- a/static/app/utils/analytics/makeAnalyticsFunction.tsx +++ b/static/app/utils/analytics/makeAnalyticsFunction.tsx @@ -10,10 +10,8 @@ import type {Organization} from 'sentry/types/organization'; * analytics.tsx imports makeAnalyticsFunction, and makeAnalyticsFunction calls * rawTrackAnalyticsEvent. */ -export const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = ( - data, - options -) => HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); +const rawTrackAnalyticsEvent: Hooks['analytics:raw-track-event'] = (data, options) => + HookStore.get('analytics:raw-track-event').forEach(cb => cb(data, options)); const hasAnalyticsDebug = () => window.localStorage?.getItem('DEBUG_ANALYTICS') === '1'; From b5a528ab907536819b3421e2f32a676b2edea545 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 22:58:56 -0700 Subject: [PATCH 22/28] you can do anything --- static/app/views/dashboards/detail.spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/app/views/dashboards/detail.spec.tsx b/static/app/views/dashboards/detail.spec.tsx index 24aab53a7c358d..0c8c30477ebfe1 100644 --- a/static/app/views/dashboards/detail.spec.tsx +++ b/static/app/views/dashboards/detail.spec.tsx @@ -626,7 +626,7 @@ describe('Dashboards > Detail', () => { }); it('hides add widget option', async () => { - jest.spyOn(types, 'MAX_WIDGETS', 'get').mockReturnValue(1); + jest.spyOn(types, 'MAX_WIDGETS', 'get').mockReturnValue(1 as 30); render( From 624fe0fb156b9fa6ddf72e5022e4f91850500c6d Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 23:16:31 -0700 Subject: [PATCH 23/28] knip --- knip.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/knip.config.ts b/knip.config.ts index 73118ad33093ee..4b4241f4d49786 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -82,6 +82,7 @@ const config: KnipConfig = { 'buffer', // rspack.ProvidePlugin, needs better knip plugin 'process', // rspack.ProvidePlugin, needs better knip plugin 'odiff-bin', // raw binary consumed by Python backend, not a JS import + 'swc-contrib/mut-cjs-exports', // used in jest config ], rules: { binaries: 'off', From fdf0452b6c101cab15ea3db73df576d32c2a4627 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Mon, 13 Apr 2026 23:24:59 -0700 Subject: [PATCH 24/28] knip --- knip.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/knip.config.ts b/knip.config.ts index 4b4241f4d49786..87d0e59a21f0ad 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -82,7 +82,7 @@ const config: KnipConfig = { 'buffer', // rspack.ProvidePlugin, needs better knip plugin 'process', // rspack.ProvidePlugin, needs better knip plugin 'odiff-bin', // raw binary consumed by Python backend, not a JS import - 'swc-contrib/mut-cjs-exports', // used in jest config + '@swc-contrib/mut-cjs-exports', // used in jest config ], rules: { binaries: 'off', From a592cf1e491eef1375152b4d5da3fdec5a298253 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Tue, 14 Apr 2026 10:22:41 -0700 Subject: [PATCH 25/28] rebuild from master --- pnpm-lock.yaml | 1078 ++++++++++++++++++++++++++---------------------- 1 file changed, 595 insertions(+), 483 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6fac3b296ef332..7a71d2797eba76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,7 +55,7 @@ importers: version: 0.0.18 '@mdx-js/loader': specifier: ^3.1.0 - version: 3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + version: 3.1.0(acorn@8.16.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) '@popperjs/core': specifier: ^2.11.5 version: 2.11.5 @@ -659,10 +659,10 @@ importers: version: 0.5.3(eslint@9.34.0(jiti@2.6.1)) eslint-plugin-regexp: specifier: ^3.0.0 - version: 3.1.0(eslint@9.34.0(jiti@2.6.1)) + version: 3.0.0(eslint@9.34.0(jiti@2.6.1)) eslint-plugin-testing-library: specifier: ^7.16.0 - version: 7.16.2(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) + version: 7.16.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) eslint-plugin-typescript-sort-keys: specifier: ^3.3.0 version: 3.3.0(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) @@ -692,7 +692,7 @@ importers: version: 16.0.0 knip: specifier: 6.4.1 - version: 6.4.1(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) + version: 6.4.1 odiff-bin: specifier: ^4.3.2 version: 4.3.2 @@ -701,7 +701,7 @@ importers: version: 0.41.0 playwright: specifier: ^1.58.2 - version: 1.59.1 + version: 1.58.2 postcss-styled-syntax: specifier: 0.7.0 version: 0.7.0(postcss@8.5.3) @@ -805,10 +805,6 @@ packages: '@amplitude/ua-parser-js@0.7.33': resolution: {integrity: sha512-wKEtVR4vXuPT9cVEIJkYWnlF++Gx3BdLatPBM+SZ1ztVIvnhdGBZR/mn9x/PzyrMcRlZmyi6L56I2J3doVBnjA==} - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} @@ -820,24 +816,28 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.0': - resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + '@babel/core@7.29.0': + resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} '@babel/helper-create-class-features-plugin@7.27.1': @@ -858,12 +858,12 @@ packages: resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -876,6 +876,10 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.27.1': resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} @@ -894,12 +898,16 @@ packages: resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} '@babel/parser@7.28.0': @@ -907,6 +915,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -999,8 +1012,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1017,16 +1030,16 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.7': - resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} + '@babel/traverse@7.27.4': + resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} '@babel/types@7.27.6': @@ -1037,6 +1050,10 @@ packages: resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1536,8 +1553,8 @@ packages: node-notifier: optional: true - '@jest/create-cache-key-function@30.2.0': - resolution: {integrity: sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==} + '@jest/create-cache-key-function@30.3.0': + resolution: {integrity: sha512-hTupmOWylzeyqbMNeSNi7ZDprpjrcroAOOG+qCEW66st3+Z5RnYHVYkUt+zjIcLmrTUi2lPY79hJz8mB3L2oXQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/diff-sequences@30.0.0': @@ -1639,10 +1656,6 @@ packages: resolution: {integrity: sha512-1Nox8mAL52PKPfEnUQWBvKU/bp8FTT6AiDu76bFDEJj/qsRFSAVSldfCH3XYMqialti2zHXKvD5gN0AaHc0yKA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.2.0': - resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.3.0': resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -1654,6 +1667,9 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1760,11 +1776,8 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-runtime@1.1.3': - resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} - peerDependencies: - '@emnapi/core': ^1.7.1 - '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.1': + resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1825,8 +1838,8 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.6.1': - resolution: {integrity: sha512-XHzhwRNkBpeP8Fs/qjGrAf9r9PRv67wkJQ/7ZPaBQQ68DYlTBBx5MF9LvPx7mhuXcDessKK2b+DcxqwpgkcivQ==} + '@opentelemetry/context-async-hooks@2.5.1': + resolution: {integrity: sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -1837,8 +1850,8 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/core@2.6.1': - resolution: {integrity: sha512-8xHSGWpJP9wBxgBpnqGL0R3PbdWQndL1Qp50qrg71+B28zK5OQmUgcDKLJgzyAAV38t4tOyLMGDD60LneR5W8g==} + '@opentelemetry/core@2.5.1': + resolution: {integrity: sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -1997,14 +2010,14 @@ packages: resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} engines: {node: ^18.19.0 || >=20.6.0} - '@opentelemetry/resources@2.6.1': - resolution: {integrity: sha512-lID/vxSuKWXM55XhAKNoYXu9Cutoq5hFdkbTdI/zDKQktXzcWBVhNsOkiZFTMU9UtEWuGRNe0HUgmsFldIdxVA==} + '@opentelemetry/resources@2.5.1': + resolution: {integrity: sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@2.6.1': - resolution: {integrity: sha512-r86ut4T1e8vNwB35CqCcKd45yzqH6/6Wzvpk2/cZB8PsPLlZFTvrh8yfOS3CYZYcUmAx4hHTZJ8AO8Dj8nrdhw==} + '@opentelemetry/sdk-trace-base@2.5.1': + resolution: {integrity: sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' @@ -3073,39 +3086,39 @@ packages: '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@15.3.2': - resolution: {integrity: sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==} + '@sinonjs/fake-timers@15.1.1': + resolution: {integrity: sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==} '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@solid-primitives/event-listener@2.4.3': - resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + '@solid-primitives/event-listener@2.4.5': + resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyboard@1.3.3': - resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} + '@solid-primitives/keyboard@1.3.5': + resolution: {integrity: sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.1.3': - resolution: {integrity: sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==} + '@solid-primitives/resize-observer@2.1.5': + resolution: {integrity: sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.2': - resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} + '@solid-primitives/rootless@1.5.3': + resolution: {integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.2': - resolution: {integrity: sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==} + '@solid-primitives/static-store@0.1.3': + resolution: {integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/utils@6.3.2': - resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} + '@solid-primitives/utils@6.4.0': + resolution: {integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==} peerDependencies: solid-js: ^1.6.12 @@ -3249,10 +3262,9 @@ packages: resolution: {integrity: sha512-eq+PpuutUyubXu+ycC1GIiVwBs86NF/8yYJJAKSpPcJLWl6R/761F1H4F/9ziX6zKezltFUH1ah3Cz8Ah+KJrw==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.4.3': - resolution: {integrity: sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw==} + '@tanstack/devtools-event-client@0.4.1': + resolution: {integrity: sha512-GRxmPw4OHZ2oZeIEUkEwt/NDvuEqzEYRAjzUVMs+I0pd4C7k1ySOiuJK2CqF+K/yEAR3YZNkW3ExrpDarh9Vwg==} engines: {node: '>=18'} - hasBin: true '@tanstack/devtools-ui@0.4.4': resolution: {integrity: sha512-5xHXFyX3nom0UaNfiOM92o6ziaHjGo3mcSGe2HD5Xs8dWRZNpdZ0Smd0B9ddEhy0oB+gXyMzZgUJb9DmrZV0Mg==} @@ -3449,6 +3461,9 @@ packages: '@tanstack/store@0.8.1': resolution: {integrity: sha512-PtOisLjUZPz5VyPRSCGjNOlwTvabdTBQ2K80DpVL1chGVr35WRxfeavAPdNq6pm/t7F8GhoR2qtmkkqtCEtHYw==} + '@tanstack/store@0.9.1': + resolution: {integrity: sha512-+qcNkOy0N1qSGsP7omVCW0SDrXtaDcycPqBDE726yryiA5eTDFpjBReaYjghVJwNf1pcPMyzIwTGlYjCSQR0Fg==} + '@tanstack/store@0.9.3': resolution: {integrity: sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==} @@ -3571,9 +3586,6 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -3661,6 +3673,9 @@ packages: '@types/node@22.15.21': resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + '@types/node@22.19.2': resolution: {integrity: sha512-LPM2G3Syo1GLzXLGJAKdqoU35XvrWzGJ21/7sgZTUpbkBaOasTj8tjwn6w+hCkqaa1TfJ/w67rJSwYItlJ2mYw==} @@ -3804,6 +3819,12 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.56.1': + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.58.0': resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3820,13 +3841,19 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.56.1': + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.58.0': resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/tsconfig-utils@8.56.1': + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/tsconfig-utils@8.58.0': resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} @@ -3845,12 +3872,12 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@8.58.0': - resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} + '@typescript-eslint/types@8.56.1': + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/types@8.58.0': + resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -3862,6 +3889,12 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.56.1': + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.58.0': resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3874,6 +3907,13 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@8.56.1': + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.58.0': resolution: {integrity: sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3885,12 +3925,12 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@8.58.0': - resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} + '@typescript-eslint/visitor-keys@8.56.1': + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.58.0': + resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260401.1': @@ -4126,6 +4166,10 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} + engines: {node: '>=0.4.0'} + acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -4136,6 +4180,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -4334,8 +4383,9 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.25: - resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + baseline-browser-mapping@2.10.7: + resolution: {integrity: sha512-1ghYO3HnxGec0TCGBXiDLVns4eCSx4zJpxnHrlqFQajmhfKMQBzUGDdkMK7fUW7PTHTeLf+j87aTuKuuwWzMGw==} + engines: {node: '>=6.0.0'} hasBin: true batch@0.6.1: @@ -4374,8 +4424,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - brace-expansion@5.0.5: - resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} + brace-expansion@5.0.3: + resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==} engines: {node: 18 || 20 || >=22} braces@3.0.3: @@ -4393,13 +4443,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.27.0: - resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4507,9 +4557,6 @@ packages: resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} engines: {node: '>=8'} - cjs-module-lexer@2.1.0: - resolution: {integrity: sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==} - cjs-module-lexer@2.2.0: resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} @@ -4624,8 +4671,8 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - comment-parser@1.4.6: - resolution: {integrity: sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==} + comment-parser@1.4.5: + resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} engines: {node: '>= 12.0.0'} compare-versions@6.1.1: @@ -5095,12 +5142,12 @@ packages: electron-to-chromium@1.5.113: resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} - electron-to-chromium@1.5.180: - resolution: {integrity: sha512-ED+GEyEh3kYMwt2faNmgMB0b8O5qtATGgR4RmRsIp4T6p7B8vdMbIedYndnvZfsaXvSzegtpfqRMDNCjjiSduA==} - electron-to-chromium@1.5.245: resolution: {integrity: sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==} + electron-to-chromium@1.5.313: + resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==} + emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -5148,8 +5195,8 @@ packages: resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} entities@2.0.0: @@ -5397,14 +5444,14 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-regexp@3.1.0: - resolution: {integrity: sha512-qGXIC3DIKZHcK1H9A9+Byz9gmndY6TTSRkSMTZpNXdyCw2ObSehRgccJv35n9AdUakEjQp5VFNLas6BMXizCZg==} + eslint-plugin-regexp@3.0.0: + resolution: {integrity: sha512-iW7hgAV8NOG6E2dz+VeKpq67YLQ9jaajOKYpoOSic2/q8y9BMdXBKkSR9gcMtbqEhNQzdW41E3wWzvhp8ExYwQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' - eslint-plugin-testing-library@7.16.2: - resolution: {integrity: sha512-8gleGnQXK2ZA3hHwjCwpYTZvM+9VsrJ+/9kDI8CjqAQGAdMQOdn/rJNu7ZySENuiWlGKQWyZJ4ZjEg2zamaRHw==} + eslint-plugin-testing-library@7.16.0: + resolution: {integrity: sha512-lHZI6/Olb2oZqxd1+s1nOLCtL2PXKrc1ERz6oDbUKS0xZAMFH3Fy6wJo75z3pXTop3BV6+loPi2MSjIYt3vpAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -6633,16 +6680,12 @@ packages: resolution: {integrity: sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdoc-type-pratt-parser@7.2.0: - resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} + jsdoc-type-pratt-parser@7.1.1: + resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==} engines: {node: '>=20.0.0'} jsdom@24.1.3: @@ -7115,8 +7158,8 @@ packages: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.3: + resolution: {integrity: sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==} engines: {node: 18 || 20 || >=22} minimatch@3.1.2: @@ -7251,8 +7294,8 @@ packages: encoding: optional: true - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + node-forge@1.3.3: + resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} engines: {node: '>= 6.13.0'} node-int64@0.4.0: @@ -7572,13 +7615,13 @@ packages: peerDependencies: react: '*' - playwright-core@1.59.1: - resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} + playwright-core@1.58.2: + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} engines: {node: '>=18'} hasBin: true - playwright@1.59.1: - resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} + playwright@1.58.2: + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} engines: {node: '>=18'} hasBin: true @@ -8059,6 +8102,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@2.0.0-next.5: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true @@ -8552,8 +8600,12 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.4.0: + resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8658,6 +8710,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -8866,14 +8924,14 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -9061,6 +9119,10 @@ packages: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} + webpack-sources@3.3.4: + resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} + engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} @@ -9243,8 +9305,8 @@ packages: engines: {node: '>= 14.6'} hasBin: true - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} hasBin: true @@ -9401,11 +9463,6 @@ snapshots: '@amplitude/ua-parser-js@0.7.33': {} - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - '@asamuzakjp/css-color@3.2.0': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) @@ -9426,57 +9483,63 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.0': {} + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.29.0': {} - '@babel/core@7.28.0': + '@babel/core@7.29.0': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.0': + '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.29.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.28.0 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.27.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': + '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.29.0) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -9485,8 +9548,8 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -9497,41 +9560,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/core': 7.29.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-member-expression-to-functions': 7.27.1 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.0 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -9539,109 +9604,115 @@ snapshots: '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': + '@babel/helpers@7.28.6': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 '@babel/parser@7.28.0': dependencies: '@babel/types': 7.28.0 - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.28.0)': + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/core': 7.29.0 + '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.29.0) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.0 + '@babel/helper-plugin-utils': 7.28.6 '@babel/runtime@7.27.6': {} @@ -9650,42 +9721,36 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 - '@babel/traverse@7.27.4': + '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - debug: 4.4.1 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 - '@babel/traverse@7.27.7': + '@babel/traverse@7.27.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.0 '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - debug: 4.4.1 + '@babel/types': 7.29.0 + debug: 4.4.3 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/traverse@7.28.0': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - debug: 4.4.1 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9699,6 +9764,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} '@boundaries/elements@2.0.1(@typescript-eslint/parser@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.34.0(jiti@2.6.1))': @@ -10042,7 +10112,7 @@ snapshots: globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -10087,7 +10157,7 @@ snapshots: '@fastify/otel@0.16.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 minimatch: 10.1.1 @@ -10251,9 +10321,9 @@ snapshots: - supports-color - ts-node - '@jest/create-cache-key-function@30.2.0': + '@jest/create-cache-key-function@30.3.0': dependencies: - '@jest/types': 30.2.0 + '@jest/types': 30.3.0 '@jest/diff-sequences@30.0.0': {} @@ -10274,7 +10344,7 @@ snapshots: dependencies: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 22.19.7 + '@types/node': 22.19.15 jest-mock: 30.3.0 '@jest/expect-utils@30.0.0': @@ -10295,8 +10365,8 @@ snapshots: '@jest/fake-timers@30.3.0': dependencies: '@jest/types': 30.3.0 - '@sinonjs/fake-timers': 15.3.2 - '@types/node': 22.19.7 + '@sinonjs/fake-timers': 15.1.1 + '@types/node': 22.19.15 jest-message-util: 30.3.0 jest-mock: 30.3.0 jest-util: 30.3.0 @@ -10316,12 +10386,12 @@ snapshots: '@jest/pattern@30.0.0': dependencies: - '@types/node': 22.19.7 + '@types/node': 22.19.2 jest-regex-util: 30.0.0 '@jest/pattern@30.0.1': dependencies: - '@types/node': 22.19.7 + '@types/node': 22.19.15 jest-regex-util: 30.0.1 '@jest/reporters@30.3.0': @@ -10389,7 +10459,7 @@ snapshots: '@jest/transform@30.3.0': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 7.0.1 @@ -10412,17 +10482,7 @@ snapshots: '@jest/schemas': 30.0.0 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.7 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@jest/types@30.2.0': - dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.7 + '@types/node': 22.19.2 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10432,7 +10492,7 @@ snapshots: '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.19.7 + '@types/node': 22.19.15 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10447,6 +10507,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -10538,9 +10603,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': + '@mdx-js/loader@3.1.0(acorn@8.16.0)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10))': dependencies: - '@mdx-js/mdx': 3.1.0(acorn@8.15.0) + '@mdx-js/mdx': 3.1.0(acorn@8.16.0) source-map: 0.7.4 optionalDependencies: webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) @@ -10548,9 +10613,9 @@ snapshots: - acorn - supports-color - '@mdx-js/mdx@3.1.0(acorn@8.15.0)': + '@mdx-js/mdx@3.1.0(acorn@8.16.0)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 @@ -10562,7 +10627,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.15.0) + recma-jsx: 1.0.0(acorn@8.16.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.0 @@ -10617,7 +10682,7 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1)': + '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.7.1 '@emnapi/runtime': 1.7.1 @@ -10706,7 +10771,7 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 @@ -10715,7 +10780,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 @@ -10723,7 +10788,7 @@ snapshots: '@opentelemetry/instrumentation-amqplib@0.58.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -10732,7 +10797,7 @@ snapshots: '@opentelemetry/instrumentation-connect@0.54.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@types/connect': 3.4.38 @@ -10749,7 +10814,7 @@ snapshots: '@opentelemetry/instrumentation-express@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -10758,7 +10823,7 @@ snapshots: '@opentelemetry/instrumentation-fs@0.30.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -10780,7 +10845,7 @@ snapshots: '@opentelemetry/instrumentation-hapi@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -10824,7 +10889,7 @@ snapshots: '@opentelemetry/instrumentation-koa@0.59.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -10848,7 +10913,7 @@ snapshots: '@opentelemetry/instrumentation-mongoose@0.57.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -10875,7 +10940,7 @@ snapshots: '@opentelemetry/instrumentation-pg@0.63.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) @@ -10905,7 +10970,7 @@ snapshots: '@opentelemetry/instrumentation-undici@0.21.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 transitivePeerDependencies: @@ -10940,17 +11005,17 @@ snapshots: '@opentelemetry/redis-common@0.38.2': {} - '@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@opentelemetry/semantic-conventions@1.40.0': {} @@ -10958,7 +11023,7 @@ snapshots: '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@oxc-parser/binding-android-arm-eabi@0.121.0': optional: true @@ -11008,12 +11073,9 @@ snapshots: '@oxc-parser/binding-openharmony-arm64@0.121.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1)': + '@oxc-parser/binding-wasm32-wasi@0.121.0': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@napi-rs/wasm-runtime': 1.1.1 optional: true '@oxc-parser/binding-win32-arm64-msvc@0.121.0': @@ -11075,12 +11137,9 @@ snapshots: '@oxc-resolver/binding-openharmony-arm64@11.19.1': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.19.1(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1)': + '@oxc-resolver/binding-wasm32-wasi@11.19.1': dependencies: - '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + '@napi-rs/wasm-runtime': 1.1.1 optional: true '@oxc-resolver/binding-win32-arm64-msvc@11.19.1': @@ -11971,7 +12030,7 @@ snapshots: '@sentry/bundler-plugin-core@4.6.1(encoding@0.1.13)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@sentry/babel-plugin-component-annotate': 4.6.1 '@sentry/cli': 2.58.2(encoding@0.1.13) dotenv: 16.4.5 @@ -12037,26 +12096,26 @@ snapshots: '@sentry/profiling-node': 10.41.0-beta.0 jest: 30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)) - '@sentry/node-core@10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/node-core@10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@sentry/core': 10.41.0-beta.0 - '@sentry/opentelemetry': 10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 2.0.6 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/node@10.41.0-beta.0': dependencies: '@fastify/otel': 0.16.0(@opentelemetry/api@1.9.0) '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.211.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-amqplib': 0.58.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-connect': 0.54.0(@opentelemetry/api@1.9.0) @@ -12080,23 +12139,23 @@ snapshots: '@opentelemetry/instrumentation-redis': 0.59.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-tedious': 0.30.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-undici': 0.21.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@prisma/instrumentation': 7.2.0(@opentelemetry/api@1.9.0) '@sentry/core': 10.41.0-beta.0 - '@sentry/node-core': 10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/node-core': 10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.211.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 2.0.6 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.41.0-beta.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.6.1(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.6.1(@opentelemetry/api@1.9.0) + '@opentelemetry/context-async-hooks': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.5.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.5.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@sentry/core': 10.41.0-beta.0 @@ -12175,43 +12234,43 @@ snapshots: dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@15.3.2': + '@sinonjs/fake-timers@15.1.1': dependencies: '@sinonjs/commons': 3.0.1 '@socket.io/component-emitter@3.1.2': {} - '@solid-primitives/event-listener@2.4.3(solid-js@1.9.11)': + '@solid-primitives/event-listener@2.4.5(solid-js@1.9.11)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.11) solid-js: 1.9.11 - '@solid-primitives/keyboard@1.3.3(solid-js@1.9.11)': + '@solid-primitives/keyboard@1.3.5(solid-js@1.9.11)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.11) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.11) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.11) solid-js: 1.9.11 - '@solid-primitives/resize-observer@2.1.3(solid-js@1.9.11)': + '@solid-primitives/resize-observer@2.1.5(solid-js@1.9.11)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/rootless': 1.5.2(solid-js@1.9.11) - '@solid-primitives/static-store': 0.1.2(solid-js@1.9.11) - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.11) + '@solid-primitives/rootless': 1.5.3(solid-js@1.9.11) + '@solid-primitives/static-store': 0.1.3(solid-js@1.9.11) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.11) solid-js: 1.9.11 - '@solid-primitives/rootless@1.5.2(solid-js@1.9.11)': + '@solid-primitives/rootless@1.5.3(solid-js@1.9.11)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.11) solid-js: 1.9.11 - '@solid-primitives/static-store@0.1.2(solid-js@1.9.11)': + '@solid-primitives/static-store@0.1.3(solid-js@1.9.11)': dependencies: - '@solid-primitives/utils': 6.3.2(solid-js@1.9.11) + '@solid-primitives/utils': 6.4.0(solid-js@1.9.11) solid-js: 1.9.11 - '@solid-primitives/utils@6.3.2(solid-js@1.9.11)': + '@solid-primitives/utils@6.4.0(solid-js@1.9.11)': dependencies: solid-js: 1.9.11 @@ -12301,7 +12360,7 @@ snapshots: '@swc/jest@0.2.39(@swc/core@1.15.24)': dependencies: - '@jest/create-cache-key-function': 30.2.0 + '@jest/create-cache-key-function': 30.3.0 '@swc/core': 1.15.24 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -12316,7 +12375,7 @@ snapshots: '@tanstack/devtools-client@0.0.6': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.1 '@tanstack/devtools-event-bus@0.4.1': dependencies: @@ -12327,7 +12386,7 @@ snapshots: '@tanstack/devtools-event-client@0.3.4': {} - '@tanstack/devtools-event-client@0.4.3': {} + '@tanstack/devtools-event-client@0.4.1': {} '@tanstack/devtools-ui@0.4.4(csstype@3.2.3)(solid-js@1.9.11)': dependencies: @@ -12373,9 +12432,9 @@ snapshots: '@tanstack/devtools@0.10.10(csstype@3.2.3)(solid-js@1.9.11)': dependencies: - '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.11) - '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.11) - '@solid-primitives/resize-observer': 2.1.3(solid-js@1.9.11) + '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.11) + '@solid-primitives/keyboard': 1.3.5(solid-js@1.9.11) + '@solid-primitives/resize-observer': 2.1.5(solid-js@1.9.11) '@tanstack/devtools-client': 0.0.6 '@tanstack/devtools-event-bus': 0.4.1 '@tanstack/devtools-ui': 0.5.0(csstype@3.2.3)(solid-js@1.9.11) @@ -12398,9 +12457,9 @@ snapshots: '@tanstack/form-core@1.28.6': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.1 '@tanstack/pacer-lite': 0.1.1 - '@tanstack/store': 0.9.3 + '@tanstack/store': 0.9.1 '@tanstack/form-devtools@0.2.20(@types/react@19.2.1)(csstype@3.2.3)(react@19.2.3)(solid-js@1.9.11)': dependencies: @@ -12556,14 +12615,16 @@ snapshots: '@tanstack/store@0.8.1': {} + '@tanstack/store@0.9.1': {} + '@tanstack/store@0.9.3': {} '@tanstack/virtual-core@3.13.6': {} '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -12582,7 +12643,7 @@ snapshots: '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.1(@types/react@19.2.1))(@types/react@19.2.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -12636,16 +12697,16 @@ snapshots: '@types/babel__generator@7.6.2': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.29.0 '@types/babel__template@7.0.3': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__traverse@7.0.15': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.29.0 '@types/body-parser@1.19.6': dependencies: @@ -12708,8 +12769,6 @@ snapshots: '@types/estree@1.0.5': {} - '@types/estree@1.0.7': {} - '@types/estree@1.0.8': {} '@types/express-serve-static-core@4.19.7': @@ -12804,6 +12863,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@22.19.15': + dependencies: + undici-types: 6.21.0 + '@types/node@22.19.2': dependencies: undici-types: 6.21.0 @@ -12977,6 +13040,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.56.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.2) + '@typescript-eslint/types': 8.56.1 + debug: 4.4.3 + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.58.0(typescript@6.0.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) @@ -13005,15 +13077,19 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager@8.56.1': + dependencies: + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/scope-manager@8.58.0': dependencies: '@typescript-eslint/types': 8.58.0 '@typescript-eslint/visitor-keys': 8.58.0 - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/tsconfig-utils@8.56.1(typescript@6.0.2)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + typescript: 6.0.2 '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)': dependencies: @@ -13033,15 +13109,15 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@8.58.0': {} + '@typescript-eslint/types@8.56.1': {} - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.58.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@6.0.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.1 + debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 semver: 7.7.3 @@ -13051,6 +13127,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.56.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/project-service': 8.56.1(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@6.0.2) + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/visitor-keys': 8.56.1 + debug: 4.4.3 + minimatch: 10.2.3 + semver: 7.7.3 + tinyglobby: 0.2.16 + ts-api-utils: 2.4.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.58.0(typescript@6.0.2)': dependencies: '@typescript-eslint/project-service': 8.58.0(typescript@6.0.2) @@ -13058,7 +13149,7 @@ snapshots: '@typescript-eslint/types': 8.58.0 '@typescript-eslint/visitor-keys': 8.58.0 debug: 4.4.3 - minimatch: 10.2.5 + minimatch: 10.2.3 semver: 7.7.3 tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@6.0.2) @@ -13068,7 +13159,7 @@ snapshots: '@typescript-eslint/utils@5.62.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.34.0(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 @@ -13076,11 +13167,22 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@6.0.2) eslint: 9.34.0(jiti@2.6.1) eslint-scope: 5.1.1 - semver: 7.7.3 + semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript + '@typescript-eslint/utils@8.56.1(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.34.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/typescript-estree': 8.56.1(typescript@6.0.2) + eslint: 9.34.0(jiti@2.6.1) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.34.0(jiti@2.6.1)) @@ -13097,14 +13199,14 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.58.0': + '@typescript-eslint/visitor-keys@8.56.1': dependencies: - '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/types': 8.56.1 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.58.0': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260401.1': @@ -13323,17 +13425,28 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-walk@8.3.4: dependencies: acorn: 8.15.0 + acorn-walk@8.3.5: + dependencies: + acorn: 8.16.0 + optional: true + acorn@8.14.1: {} acorn@8.15.0: {} + acorn@8.16.0: {} + agent-base@6.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -13511,13 +13624,13 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - babel-jest@30.3.0(@babel/core@7.28.0): + babel-jest@30.3.0(@babel/core@7.29.0): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@jest/transform': 30.3.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 7.0.1 - babel-preset-jest: 30.3.0(@babel/core@7.28.0) + babel-preset-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -13544,30 +13657,30 @@ snapshots: cosmiconfig: 7.0.1 resolve: 1.22.10 - babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - - babel-preset-jest@30.3.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) + + babel-preset-jest@30.3.0(@babel/core@7.29.0): + dependencies: + '@babel/core': 7.29.0 babel-plugin-jest-hoist: 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) bail@2.0.2: {} @@ -13583,7 +13696,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.8.25: {} + baseline-browser-mapping@2.10.7: {} batch@0.6.1: {} @@ -13643,7 +13756,7 @@ snapshots: dependencies: balanced-match: 1.0.0 - brace-expansion@5.0.5: + brace-expansion@5.0.3: dependencies: balanced-match: 4.0.4 @@ -13664,21 +13777,22 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.4) - browserslist@4.25.1: - dependencies: - caniuse-lite: 1.0.30001760 - electron-to-chromium: 1.5.180 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) - browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.25 + baseline-browser-mapping: 2.10.7 caniuse-lite: 1.0.30001760 electron-to-chromium: 1.5.245 node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.7 + caniuse-lite: 1.0.30001760 + electron-to-chromium: 1.5.313 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + bser@2.1.1: dependencies: node-int64: 0.4.0 @@ -13780,8 +13894,6 @@ snapshots: ci-info@4.2.0: {} - cjs-module-lexer@2.1.0: {} - cjs-module-lexer@2.2.0: {} classnames@2.3.1: {} @@ -13865,7 +13977,7 @@ snapshots: commander@8.3.0: {} - comment-parser@1.4.6: {} + comment-parser@1.4.5: {} compare-versions@6.1.1: {} @@ -14212,7 +14324,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.6 csstype: 3.0.8 dom-serializer@1.3.1: @@ -14303,10 +14415,10 @@ snapshots: electron-to-chromium@1.5.113: {} - electron-to-chromium@1.5.180: {} - electron-to-chromium@1.5.245: {} + electron-to-chromium@1.5.313: {} + emittery@0.13.1: {} emmet@2.4.11: @@ -14358,10 +14470,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - enhanced-resolve@5.18.4: + enhanced-resolve@5.20.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.2 entities@2.0.0: {} @@ -14622,7 +14734,7 @@ snapshots: dependencies: debug: 3.2.7 is-core-module: 2.16.1 - resolve: 1.22.10 + resolve: 1.22.11 transitivePeerDependencies: - supports-color @@ -14757,9 +14869,9 @@ snapshots: eslint-plugin-react-hooks@6.1.0(eslint@9.34.0(jiti@2.6.1)): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@babel/parser': 7.28.0 - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.28.0) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.29.0) eslint: 9.34.0(jiti@2.6.1) hermes-parser: 0.25.1 zod: 3.25.76 @@ -14795,21 +14907,21 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-regexp@3.1.0(eslint@9.34.0(jiti@2.6.1)): + eslint-plugin-regexp@3.0.0(eslint@9.34.0(jiti@2.6.1)): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.34.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 - comment-parser: 1.4.6 + comment-parser: 1.4.5 eslint: 9.34.0(jiti@2.6.1) - jsdoc-type-pratt-parser: 7.2.0 + jsdoc-type-pratt-parser: 7.1.1 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-testing-library@7.16.2(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2): + eslint-plugin-testing-library@7.16.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2): dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/utils': 8.58.0(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.56.1 + '@typescript-eslint/utils': 8.56.1(eslint@9.34.0(jiti@2.6.1))(typescript@6.0.2) eslint: 9.34.0(jiti@2.6.1) transitivePeerDependencies: - supports-color @@ -14957,7 +15069,7 @@ snapshots: estree-util-value-to-estree@3.4.0: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-util-visit@2.0.0: dependencies: @@ -15659,7 +15771,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15686,14 +15798,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15966,8 +16078,8 @@ snapshots: istanbul-lib-instrument@6.0.2: dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 7.7.3 @@ -15983,7 +16095,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 - debug: 4.4.1 + debug: 4.4.3 istanbul-lib-coverage: 3.2.0 transitivePeerDependencies: - supports-color @@ -16072,12 +16184,12 @@ snapshots: jest-config@30.3.0(@types/node@22.15.21)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 '@jest/test-sequencer': 30.3.0 '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.28.0) + babel-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 ci-info: 4.2.0 deepmerge: 4.3.1 @@ -16104,12 +16216,12 @@ snapshots: jest-config@30.3.0(@types/node@22.19.7)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.24)(@types/node@22.15.21)(typescript@6.0.2)): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 '@jest/pattern': 30.0.1 '@jest/test-sequencer': 30.3.0 '@jest/types': 30.3.0 - babel-jest: 30.3.0(@babel/core@7.28.0) + babel-jest: 30.3.0(@babel/core@7.29.0) chalk: 4.1.2 ci-info: 4.2.0 deepmerge: 4.3.1 @@ -16246,7 +16358,7 @@ snapshots: jest-message-util@30.3.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 30.3.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -16265,7 +16377,7 @@ snapshots: jest-mock@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 22.19.7 + '@types/node': 22.19.15 jest-util: 30.3.0 jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): @@ -16332,7 +16444,7 @@ snapshots: '@jest/types': 30.3.0 '@types/node': 22.19.7 chalk: 4.1.2 - cjs-module-lexer: 2.1.0 + cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.2 glob: 10.5.0 graceful-fs: 4.2.11 @@ -16350,17 +16462,17 @@ snapshots: jest-snapshot@30.3.0: dependencies: - '@babel/core': 7.28.0 - '@babel/generator': 7.28.0 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.0 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/types': 7.29.0 '@jest/expect-utils': 30.3.0 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) chalk: 4.1.2 expect: 30.3.0 graceful-fs: 4.2.11 @@ -16414,7 +16526,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.7 + '@types/node': 22.19.15 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -16460,15 +16572,11 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@7.2.0: {} + jsdoc-type-pratt-parser@7.1.1: {} jsdom@24.1.3: dependencies: @@ -16580,7 +16688,7 @@ snapshots: kleur@4.1.5: {} - knip@6.4.1(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1): + knip@6.4.1: dependencies: '@nodelib/fs.walk': 1.2.8 fast-glob: 3.3.3 @@ -16588,18 +16696,15 @@ snapshots: get-tsconfig: 4.13.7 jiti: 2.6.1 minimist: 1.2.8 - oxc-parser: 0.121.0(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) - oxc-resolver: 11.19.1(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) + oxc-parser: 0.121.0 + oxc-resolver: 11.19.1 picocolors: 1.1.1 picomatch: 4.0.4 smol-toml: 1.6.1 strip-json-comments: 5.0.3 unbash: 2.2.0 - yaml: 2.8.3 + yaml: 2.8.2 zod: 4.3.5(patch_hash=2bb6d33b2c713a7a2c559c18ad0aa6cfb261f01d935ee1288dfec6c84411aa76) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' known-css-properties@0.34.0: {} @@ -17184,7 +17289,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1 + debug: 4.4.3 decode-named-character-reference: 1.1.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -17232,9 +17337,9 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.1 - minimatch@10.2.5: + minimatch@10.2.3: dependencies: - brace-expansion: 5.0.5 + brace-expansion: 5.0.3 minimatch@3.1.2: dependencies: @@ -17342,7 +17447,7 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-forge@1.3.1: {} + node-forge@1.3.3: {} node-int64@0.4.0: {} @@ -17508,7 +17613,7 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-parser@0.121.0(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1): + oxc-parser@0.121.0: dependencies: '@oxc-project/types': 0.121.0 optionalDependencies: @@ -17528,15 +17633,12 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu': 0.121.0 '@oxc-parser/binding-linux-x64-musl': 0.121.0 '@oxc-parser/binding-openharmony-arm64': 0.121.0 - '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) + '@oxc-parser/binding-wasm32-wasi': 0.121.0 '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 '@oxc-parser/binding-win32-x64-msvc': 0.121.0 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - oxc-resolver@11.19.1(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1): + oxc-resolver@11.19.1: optionalDependencies: '@oxc-resolver/binding-android-arm-eabi': 11.19.1 '@oxc-resolver/binding-android-arm64': 11.19.1 @@ -17554,13 +17656,10 @@ snapshots: '@oxc-resolver/binding-linux-x64-gnu': 11.19.1 '@oxc-resolver/binding-linux-x64-musl': 11.19.1 '@oxc-resolver/binding-openharmony-arm64': 11.19.1 - '@oxc-resolver/binding-wasm32-wasi': 11.19.1(@emnapi/core@1.7.1)(@emnapi/runtime@1.7.1) + '@oxc-resolver/binding-wasm32-wasi': 11.19.1 '@oxc-resolver/binding-win32-arm64-msvc': 11.19.1 '@oxc-resolver/binding-win32-ia32-msvc': 11.19.1 '@oxc-resolver/binding-win32-x64-msvc': 11.19.1 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' oxfmt@0.41.0: dependencies: @@ -17652,7 +17751,7 @@ snapshots: parse-json@8.1.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 index-to-position: 0.1.2 type-fest: 4.37.0 @@ -17734,11 +17833,11 @@ snapshots: '@types/react': 19.2.1 react: 19.2.3 - playwright-core@1.59.1: {} + playwright-core@1.58.2: {} - playwright@1.59.1: + playwright@1.58.2: dependencies: - playwright-core: 1.59.1 + playwright-core: 1.58.2 optionalDependencies: fsevents: 2.3.2 @@ -18112,9 +18211,9 @@ snapshots: estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.15.0): + recma-jsx@1.0.0(acorn@8.16.0): dependencies: - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn-jsx: 5.3.2(acorn@8.16.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -18290,7 +18389,7 @@ snapshots: require-in-the-middle@8.0.1: dependencies: - debug: 4.4.1 + debug: 4.4.3 module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color @@ -18315,6 +18414,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: dependencies: is-core-module: 2.16.1 @@ -18411,7 +18516,7 @@ snapshots: selfsigned@2.4.1: dependencies: '@types/node-forge': 1.3.14 - node-forge: 1.3.1 + node-forge: 1.3.3 semver@5.7.2: optional: true @@ -18652,7 +18757,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.4.1 + debug: 4.4.3 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -18663,7 +18768,7 @@ snapshots: spdy@4.0.2: dependencies: - debug: 4.4.1 + debug: 4.4.3 handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -18915,12 +19020,13 @@ snapshots: tapable@2.3.0: {} - terser-webpack-plugin@5.3.16(@swc/core@1.15.24)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): + tapable@2.3.2: {} + + terser-webpack-plugin@5.4.0(@swc/core@1.15.24)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 terser: 5.40.0 webpack: 5.99.6(@swc/core@1.15.24)(esbuild@0.25.10) optionalDependencies: @@ -19009,6 +19115,10 @@ snapshots: trough@2.2.0: {} + ts-api-utils@2.4.0(typescript@6.0.2): + dependencies: + typescript: 6.0.2 + ts-api-utils@2.5.0(typescript@6.0.2): dependencies: typescript: 6.0.2 @@ -19039,8 +19149,8 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 22.15.21 - acorn: 8.15.0 - acorn-walk: 8.3.4 + acorn: 8.16.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 @@ -19176,7 +19286,7 @@ snapshots: '@types/node': 22.19.2 '@types/unist': 3.0.3 concat-stream: 2.0.0 - debug: 4.4.1 + debug: 4.4.3 extend: 3.0.2 glob: 10.4.5 ignore: 6.0.2 @@ -19190,7 +19300,7 @@ snapshots: vfile-message: 4.0.2 vfile-reporter: 8.1.1 vfile-statistics: 3.0.0 - yaml: 2.8.3 + yaml: 2.8.2 transitivePeerDependencies: - bluebird - supports-color @@ -19225,7 +19335,7 @@ snapshots: unist-util-mdx-define@1.1.2: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 estree-util-is-identifier-name: 3.0.0 @@ -19297,15 +19407,15 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.1.4(browserslist@4.27.0): dependencies: - browserslist: 4.25.1 + browserslist: 4.27.0 escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.4(browserslist@4.27.0): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.27.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -19533,6 +19643,8 @@ snapshots: webpack-sources@3.3.3: {} + webpack-sources@3.3.4: {} + webpack-virtual-modules@0.5.0: {} webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10): @@ -19542,10 +19654,10 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - browserslist: 4.27.0 + acorn: 8.16.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 + enhanced-resolve: 5.20.1 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -19556,10 +19668,10 @@ snapshots: mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(@swc/core@1.15.24)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) + tapable: 2.3.2 + terser-webpack-plugin: 5.4.0(@swc/core@1.15.24)(esbuild@0.25.10)(webpack@5.99.6(@swc/core@1.15.24)(esbuild@0.25.10)) watchpack: 2.5.1 - webpack-sources: 3.3.3 + webpack-sources: 3.3.4 transitivePeerDependencies: - '@swc/core' - esbuild @@ -19710,7 +19822,7 @@ snapshots: yaml@2.8.0: {} - yaml@2.8.3: {} + yaml@2.8.2: {} yargs-parser@21.1.1: {} From 94a1bb3ad1df3998391f8a6bf0382b27a76b73e9 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Tue, 14 Apr 2026 10:33:22 -0700 Subject: [PATCH 26/28] remove more references --- .github/CODEOWNERS | 1 - .github/dependabot.yml | 3 --- .vercelignore | 1 - eslint.config.ts | 2 +- rspack.config.ts | 2 +- 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4d84615ee1f9f1..e9b4d1ffc29cc3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -172,7 +172,6 @@ pyproject.toml @getsentry/owners-pytho vercel.json @getsentry/owners-js-build /.github/workflows/frontend.yml @getsentry/owners-js-build /.github/file-filters.yml @getsentry/owners-js-build -babel.config.* @getsentry/owners-js-build build-utils/ @getsentry/owners-js-build eslint.config.ts @getsentry/owners-js-build jest-balance.json @getsentry/owners-js-build diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8a99de1c6d3d18..8b288c731be7d7 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,9 +15,6 @@ updates: # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups groups: # The name of the group, it will be used in PR titles and branch - babel-dependencies: - patterns: - - '@babel/*' sentry-dependencies: patterns: - '@sentry/core' diff --git a/.vercelignore b/.vercelignore index 9883e731d2c6e7..2f41d0da21982d 100644 --- a/.vercelignore +++ b/.vercelignore @@ -8,7 +8,6 @@ !src/sentry/locale/** !build-utils !build-utils/** -!babel.config.js !jest.config.js !now.json !package.json diff --git a/eslint.config.ts b/eslint.config.ts index 75a30ec8e81b86..436c1052305290 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -757,7 +757,7 @@ export default typescript.config([ plugins: {'@emotion': emotion}, rules: { '@emotion/import-from-emotion': 'off', // Not needed, in v11 we import from @emotion/react - '@emotion/jsx-import': 'off', // Not needed, handled by babel + '@emotion/jsx-import': 'off', // Not needed, handled by swc '@emotion/no-vanilla': 'error', '@emotion/pkg-renaming': 'off', // Not needed, we have migrated to v11 and the old package names cannot be used anymore '@emotion/styled-import': 'error', diff --git a/rspack.config.ts b/rspack.config.ts index 24f35a0950414d..3ebbf0abc1e86d 100644 --- a/rspack.config.ts +++ b/rspack.config.ts @@ -308,7 +308,7 @@ const appConfig: Configuration = { test: /\.(js|jsx|ts|tsx)$/, // core-js: Avoids recompiling core-js based on usage imports // react-select: Ships pre-compiled ESM with emotion's keyframes already - // compiled via Babel. Re-processing with @swc/plugin-emotion causes + // compiled via swc. Re-processing with @swc/plugin-emotion causes // "illegal escape sequence" warnings in dev mode. exclude: /node_modules[\\/](core-js|react-select)/, loader: 'builtin:swc-loader', From 7bd701d80efb8d01aa88ee8128ccf17b8b51dafe Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Tue, 14 Apr 2026 10:35:55 -0700 Subject: [PATCH 27/28] swc group --- .github/dependabot.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8b288c731be7d7..14cf0afa190991 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,6 +15,9 @@ updates: # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#groups groups: # The name of the group, it will be used in PR titles and branch + swc-dependencies: + patterns: + - '@swc/*' sentry-dependencies: patterns: - '@sentry/core' From 6a5856005b28ca5922abcc18b2ee7d5ccb0213d4 Mon Sep 17 00:00:00 2001 From: Scott Cooper Date: Tue, 14 Apr 2026 10:53:00 -0700 Subject: [PATCH 28/28] don't think we need type casting --- jest.config.snapshots.ts | 2 +- jest.config.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jest.config.snapshots.ts b/jest.config.snapshots.ts index c98fef27ac680c..9175ca209126b5 100644 --- a/jest.config.snapshots.ts +++ b/jest.config.snapshots.ts @@ -67,7 +67,7 @@ const config: Config.InitialOptions = { }, transform: { - '^.+\\.[mc]?[jt]sx?$': ['@swc/jest', swcConfig as any], + '^.+\\.[mc]?[jt]sx?$': ['@swc/jest', swcConfig], }, transformIgnorePatterns: [ ESM_NODE_MODULES.length diff --git a/jest.config.ts b/jest.config.ts index 94ab2ea7a8e5e9..e65d44a49c4706 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -328,7 +328,7 @@ const config: Config.InitialOptions = { '/node_modules/reflux', ], transform: { - '^.+\\.[mc]?[jt]sx?$': ['@swc/jest', swcConfig as any], + '^.+\\.[mc]?[jt]sx?$': ['@swc/jest', swcConfig], '^.+\\.pegjs?$': '/tests/js/jest-pegjs-transform.js', }, transformIgnorePatterns: [