From 2080f98c40f09ecd9c29ec6d218665e11de651ae Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Fri, 4 Jul 2025 16:53:41 +0200 Subject: [PATCH 1/2] [refactor] Move sourcemapping logic to dedicated file --- package.json | 3 +- .../src/server/dev/hot-reloader-turbopack.ts | 6 +- .../src/server/dev/middleware-turbopack.ts | 67 +---- .../next/src/server/dev/middleware-webpack.ts | 30 +- packages/next/src/server/lib/source-maps.ts | 82 ++++++ .../next/src/server/patch-error-inspect.ts | 81 +----- patches/@types__node@20.17.6.patch | 39 +++ pnpm-lock.yaml | 265 +++++++++--------- 8 files changed, 289 insertions(+), 284 deletions(-) create mode 100644 packages/next/src/server/lib/source-maps.ts create mode 100644 patches/@types__node@20.17.6.patch diff --git a/package.json b/package.json index 954cb70330745..ae4eec181d68c 100644 --- a/package.json +++ b/package.json @@ -305,7 +305,8 @@ "patchedDependencies": { "webpack-sources@3.2.3": "patches/webpack-sources@3.2.3.patch", "stacktrace-parser@0.1.10": "patches/stacktrace-parser@0.1.10.patch", - "@ampproject/toolbox-optimizer@2.8.3": "patches/@ampproject__toolbox-optimizer@2.8.3.patch" + "@ampproject/toolbox-optimizer@2.8.3": "patches/@ampproject__toolbox-optimizer@2.8.3.patch", + "@types/node@20.17.6": "patches/@types__node@20.17.6.patch" } } } diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index dd2ea272507e5..fca837d3836d9 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -77,12 +77,10 @@ import { FAST_REFRESH_RUNTIME_RELOAD } from './messages' import { generateEncryptionKeyBase64 } from '../app-render/encryption-utils-server' import { isAppPageRouteDefinition } from '../route-definitions/app-page-route-definition' import { normalizeAppPath } from '../../shared/lib/router/utils/app-paths' +import type { ModernSourceMapPayload } from '../lib/source-maps' import { getNodeDebugType } from '../lib/utils' import { isMetadataRouteFile } from '../../lib/metadata/is-metadata-route' -import { - setBundlerFindSourceMapImplementation, - type ModernSourceMapPayload, -} from '../patch-error-inspect' +import { setBundlerFindSourceMapImplementation } from '../patch-error-inspect' import { getNextErrorFeedbackMiddleware } from '../../next-devtools/server/get-next-error-feedback-middleware' import { formatIssue, diff --git a/packages/next/src/server/dev/middleware-turbopack.ts b/packages/next/src/server/dev/middleware-turbopack.ts index 88c0d136e3164..594596f2f04b9 100644 --- a/packages/next/src/server/dev/middleware-turbopack.ts +++ b/packages/next/src/server/dev/middleware-turbopack.ts @@ -12,12 +12,15 @@ import { openFileInEditor } from '../../next-devtools/server/launch-editor' import type { StackFrame } from 'next/dist/compiled/stacktrace-parser' import { SourceMapConsumer, - type BasicSourceMapConsumer, type NullableMappedPosition, } from 'next/dist/compiled/source-map08' import type { Project, TurbopackStackFrame } from '../../build/swc/types' +import { + type ModernSourceMapPayload, + findApplicableSourceMapPayload, +} from '../lib/source-maps' import { getSourceMapFromFile } from './get-source-map-from-file' -import { findSourceMap, type SourceMapPayload } from 'node:module' +import { findSourceMap } from 'node:module' import { pathToFileURL } from 'node:url' import { inspect } from 'node:util' @@ -170,61 +173,6 @@ function createStackFrame( } satisfies TurbopackStackFrame } -/** - * https://tc39.es/source-map/#index-map - */ -interface IndexSourceMapSection { - offset: { - line: number - column: number - } - map: ModernRawSourceMap -} - -// TODO(veil): Upstream types -interface IndexSourceMap { - version: number - file: string - sections: IndexSourceMapSection[] -} - -interface ModernRawSourceMap extends SourceMapPayload { - ignoreList?: number[] -} - -type ModernSourceMapPayload = ModernRawSourceMap | IndexSourceMap - -/** - * Finds the sourcemap payload applicable to a given frame. - * Equal to the input unless an Index Source Map is used. - */ -function findApplicableSourceMapPayload( - frame: TurbopackStackFrame, - payload: ModernSourceMapPayload -): ModernRawSourceMap | undefined { - if ('sections' in payload) { - const frameLine = frame.line ?? 0 - const frameColumn = frame.column ?? 0 - // Sections must not overlap and must be sorted: https://tc39.es/source-map/#section-object - // Therefore the last section that has an offset less than or equal to the frame is the applicable one. - // TODO(veil): Binary search - let section: IndexSourceMapSection | undefined = payload.sections[0] - for ( - let i = 0; - i < payload.sections.length && - payload.sections[i].offset.line <= frameLine && - payload.sections[i].offset.column <= frameColumn; - i++ - ) { - section = payload.sections[i] - } - - return section === undefined ? undefined : section.map - } else { - return payload - } -} - /** * @returns 1-based lines and 0-based columns */ @@ -244,7 +192,7 @@ async function nativeTraceSource( } if (sourceMapPayload !== undefined) { - let consumer: BasicSourceMapConsumer + let consumer: SourceMapConsumer try { consumer = await new SourceMapConsumer(sourceMapPayload) } catch (cause) { @@ -282,7 +230,8 @@ async function nativeTraceSource( if (traced !== null) { const { originalPosition, sourceContent } = traced const applicableSourceMap = findApplicableSourceMapPayload( - frame, + frame.line ?? 0, + frame.column ?? 0, sourceMapPayload ) diff --git a/packages/next/src/server/dev/middleware-webpack.ts b/packages/next/src/server/dev/middleware-webpack.ts index 0d33789cb231d..9c26a536cef31 100644 --- a/packages/next/src/server/dev/middleware-webpack.ts +++ b/packages/next/src/server/dev/middleware-webpack.ts @@ -1,12 +1,13 @@ import { findSourceMap, type SourceMap } from 'module' import path from 'path' import { fileURLToPath, pathToFileURL } from 'url' -import { - SourceMapConsumer, - type BasicSourceMapConsumer, -} from 'next/dist/compiled/source-map08' +import { SourceMapConsumer } from 'next/dist/compiled/source-map08' import type { StackFrame } from 'next/dist/compiled/stacktrace-parser' import { getSourceMapFromFile } from './get-source-map-from-file' +import { + sourceMapIgnoreListsEverything, + type ModernSourceMapPayload, +} from '../lib/source-maps' import { openFileInEditor } from '../../next-devtools/server/launch-editor' import { getOriginalCodeFrame, @@ -15,7 +16,6 @@ import { type OriginalStackFramesResponse, } from '../../next-devtools/server/shared' import { middlewareResponse } from '../../next-devtools/server/middleware-response' -export { getSourceMapFromFile } import type { IncomingMessage, ServerResponse } from 'http' import type webpack from 'webpack' @@ -50,13 +50,13 @@ type SourceAttributes = { type Source = | { type: 'file' - sourceMap: RawSourceMap + sourceMap: ModernSourceMapPayload ignoredSources: IgnoredSources moduleURL: string } | { type: 'bundle' - sourceMap: RawSourceMap + sourceMap: ModernSourceMapPayload ignoredSources: IgnoredSources compilation: webpack.Compilation moduleId: string @@ -87,10 +87,10 @@ function getSourcePath(source: string) { * @returns 1-based lines and 0-based columns */ async function findOriginalSourcePositionAndContent( - sourceMap: RawSourceMap, + sourceMap: ModernSourceMapPayload, position: { lineNumber: number | null; column: number | null } ): Promise { - let consumer: BasicSourceMapConsumer + let consumer: SourceMapConsumer try { consumer = await new SourceMapConsumer(sourceMap) } catch (cause) { @@ -309,7 +309,11 @@ async function getSource( return { type: 'file', sourceMap: sourceMapPayload, - ignoredSources: getIgnoredSources(sourceMapPayload), + + ignoredSources: getIgnoredSources( + // @ts-expect-error -- TODO: Support IndexSourceMap + sourceMapPayload + ), moduleURL: sourceURL, } } @@ -411,12 +415,6 @@ function getOriginalStackFrames({ ) } -function sourceMapIgnoreListsEverything( - sourceMap: RawSourceMap & { ignoreList?: number[] } -): boolean { - return sourceMap.sources.length === sourceMap.ignoreList?.length -} - async function getOriginalStackFrame({ isServer, isEdgeServer, diff --git a/packages/next/src/server/lib/source-maps.ts b/packages/next/src/server/lib/source-maps.ts new file mode 100644 index 0000000000000..be7aff624c9fd --- /dev/null +++ b/packages/next/src/server/lib/source-maps.ts @@ -0,0 +1,82 @@ +/** + * https://tc39.es/source-map/#index-map + */ +interface IndexSourceMapSection { + offset: { + line: number + column: number + } + map: BasicSourceMapPayload +} + +// TODO(veil): Upstream types +/** https://tc39.es/ecma426/#sec-index-source-map */ +interface IndexSourceMap { + version: number + file: string + sections: IndexSourceMapSection[] +} + +/** https://tc39.es/ecma426/#sec-source-map-format */ +interface BasicSourceMapPayload { + version: number + // TODO: Move to https://github.com/jridgewell/sourcemaps which is actively maintained + /** WARNING: `file` is optional. */ + file: string + sourceRoot?: string + // TODO: Move to https://github.com/jridgewell/sourcemaps which is actively maintained + /** WARNING: `sources[number]` can be `null`. */ + sources: Array + names: Array + mappings: string + ignoreList?: number[] +} + +export type ModernSourceMapPayload = BasicSourceMapPayload | IndexSourceMap + +// TODO: This should take the BasicSourceMapPayload. Only the relevant section +// needs to ignore list everything making this check effectively O(1) multiplied +// by the complexity of finding the section. +export function sourceMapIgnoreListsEverything( + sourceMap: ModernSourceMapPayload +): boolean { + if ('sections' in sourceMap) { + return sourceMap.sections.every((section) => { + return sourceMapIgnoreListsEverything(section.map) + }) + } + return ( + sourceMap.ignoreList !== undefined && + sourceMap.sources.length === sourceMap.ignoreList.length + ) +} + +/** + * Finds the sourcemap payload applicable to a given frame. + * Equal to the input unless an Index Source Map is used. + */ +export function findApplicableSourceMapPayload( + lineNumber: number, + columnNumber: number, + payload: ModernSourceMapPayload +): BasicSourceMapPayload | undefined { + if ('sections' in payload) { + // Sections must not overlap and must be sorted: https://tc39.es/source-map/#section-object + // Therefore the last section that has an offset less than or equal to the frame is the applicable one. + // TODO(veil): Binary search + let section: IndexSourceMapSection | undefined = payload.sections[0] + for ( + let i = 0; + i < payload.sections.length && + payload.sections[i].offset.line <= lineNumber && + payload.sections[i].offset.column <= columnNumber; + i++ + ) { + section = payload.sections[i] + } + + return section === undefined ? undefined : section.map + } else { + return payload + } +} diff --git a/packages/next/src/server/patch-error-inspect.ts b/packages/next/src/server/patch-error-inspect.ts index f2b4c9345026f..58c60aa9555de 100644 --- a/packages/next/src/server/patch-error-inspect.ts +++ b/packages/next/src/server/patch-error-inspect.ts @@ -1,12 +1,14 @@ -import { - findSourceMap as nativeFindSourceMap, - type SourceMapPayload, -} from 'module' +import { findSourceMap as nativeFindSourceMap } from 'module' import * as path from 'path' import * as url from 'url' import type * as util from 'util' import { SourceMapConsumer as SyncSourceMapConsumer } from 'next/dist/compiled/source-map' import type { StackFrame } from 'next/dist/compiled/stacktrace-parser' +import { + type ModernSourceMapPayload, + findApplicableSourceMapPayload, + sourceMapIgnoreListsEverything, +} from './lib/source-maps' import { parseStack } from './lib/parse-stack' import { getOriginalCodeFrame } from '../next-devtools/server/shared' import { workUnitAsyncStorage } from './app-render/work-unit-async-storage.external' @@ -27,30 +29,6 @@ export function setBundlerFindSourceMapImplementation( bundlerFindSourceMapPayload = findSourceMapImplementation } -/** - * https://tc39.es/source-map/#index-map - */ -interface IndexSourceMapSection { - offset: { - line: number - column: number - } - map: ModernRawSourceMap -} - -// TODO(veil): Upstream types -interface IndexSourceMap { - version: number - file: string - sections: IndexSourceMapSection[] -} - -interface ModernRawSourceMap extends SourceMapPayload { - ignoreList?: number[] -} - -export type ModernSourceMapPayload = ModernRawSourceMap | IndexSourceMap - interface IgnoreableStackFrame extends StackFrame { ignored: boolean } @@ -116,37 +94,6 @@ function shouldIgnoreListOriginalFrame(file: string): boolean { return file.includes('node_modules') } -/** - * Finds the sourcemap payload applicable to a given frame. - * Equal to the input unless an Index Source Map is used. - */ -function findApplicableSourceMapPayload( - frame: StackFrame, - payload: ModernSourceMapPayload -): ModernRawSourceMap | undefined { - if ('sections' in payload) { - const frameLine = frame.lineNumber ?? 0 - const frameColumn = frame.column ?? 0 - // Sections must not overlap and must be sorted: https://tc39.es/source-map/#section-object - // Therefore the last section that has an offset less than or equal to the frame is the applicable one. - // TODO(veil): Binary search - let section: IndexSourceMapSection | undefined = payload.sections[0] - for ( - let i = 0; - i < payload.sections.length && - payload.sections[i].offset.line <= frameLine && - payload.sections[i].offset.column <= frameColumn; - i++ - ) { - section = payload.sections[i] - } - - return section === undefined ? undefined : section.map - } else { - return payload - } -} - interface SourcemappableStackFrame extends StackFrame { file: NonNullable } @@ -173,19 +120,6 @@ function createUnsourcemappedFrame( } } -function sourceMapIgnoreListsEverything( - sourceMap: ModernSourceMapPayload -): boolean { - if ('sections' in sourceMap) { - // If sections are present, the ignoreList is not used. - // This is because sections are used to ignore-list everything. - return sourceMap.sections.every((section) => { - return sourceMapIgnoreListsEverything(section.map) - }) - } - return sourceMap.sources.length === sourceMap.ignoreList?.length -} - /** * @param frame * @param sourceMapCache @@ -290,7 +224,8 @@ function getSourcemappedFrameIfPossible( } const applicableSourceMap = findApplicableSourceMapPayload( - frame, + frame.lineNumber ?? 0, + frame.column ?? 0, sourceMapPayload ) // TODO(veil): Upstream a method to sourcemap consumer that immediately says if a frame is ignored or not. diff --git a/patches/@types__node@20.17.6.patch b/patches/@types__node@20.17.6.patch new file mode 100644 index 0000000000000..a9dce734d07cf --- /dev/null +++ b/patches/@types__node@20.17.6.patch @@ -0,0 +1,39 @@ +diff --git a/module.d.ts b/module.d.ts +index 3b40061a67ccb5a65071d29a3a8d7134d8851158..d733cde7cee76a389379f187f08c455c1b67b1e8 100644 +--- a/module.d.ts ++++ b/module.d.ts +@@ -49,7 +49,25 @@ declare module "module" { + * @return Returns `module.SourceMap` if a source map is found, `undefined` otherwise. + */ + function findSourceMap(path: string, error?: Error): SourceMap; +- interface SourceMapPayload { ++ /** ++ * https://tc39.es/source-map/#index-map ++ */ ++ interface IndexSourceMapSection { ++ offset: { ++ line: number ++ column: number ++ } ++ map: BasicSourceMapPayload ++ } ++ ++ // TODO(veil): Upstream types ++ /** https://tc39.es/ecma426/#sec-index-source-map */ ++ interface IndexSourceMap { ++ version: number ++ file: string ++ sections: IndexSourceMapSection[] ++ } ++ interface BasicSourceMapPayload { + file: string; + version: number; + sources: string[]; +@@ -58,6 +76,7 @@ declare module "module" { + mappings: string; + sourceRoot: string; + } ++ type SourceMapPayload = BasicSourceMapPayload | IndexSourceMap; + interface SourceMapping { + generatedLine: number; + generatedColumn: number; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 867aa3780e5c6..8020804e30b90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ patchedDependencies: '@ampproject/toolbox-optimizer@2.8.3': hash: baeiwbdq3sqmjnnh2lznmpb5bu path: patches/@ampproject__toolbox-optimizer@2.8.3.patch + '@types/node@20.17.6': + hash: rvl3vkomen3tospgr67bzubfyu + path: patches/@types__node@20.17.6.patch stacktrace-parser@0.1.10: hash: misknddihoqkqinipod62zbcj4 path: patches/stacktrace-parser@0.1.10.patch @@ -156,7 +159,7 @@ importers: version: 1.1.0 '@testing-library/jest-dom': specifier: 6.1.2 - version: 6.1.2(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0))(vitest@3.0.4(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2)) + version: 6.1.2(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0))(vitest@3.0.4(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2)) '@testing-library/react': specifier: ^15.0.5 version: 15.0.7(@types/react@19.1.1)(react-dom@19.2.0-canary-73aa744b-20250702(react@19.2.0-canary-73aa744b-20250702))(react@19.2.0-canary-73aa744b-20250702) @@ -189,7 +192,7 @@ importers: version: 29.5.5 '@types/node': specifier: 20.17.6 - version: 20.17.6 + version: 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/node-fetch': specifier: 2.6.1 version: 2.6.1 @@ -291,7 +294,7 @@ importers: version: 2.31.0(@typescript-eslint/parser@8.0.0(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0) eslint-plugin-jest: specifier: 27.6.3 - version: 27.6.3(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0))(typescript@5.8.2) + version: 27.6.3(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0))(typescript@5.8.2) eslint-plugin-jsdoc: specifier: 48.0.4 version: 48.0.4(eslint@9.12.0) @@ -372,7 +375,7 @@ importers: version: 3.0.0(encoding@0.1.13) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-diff: specifier: 29.7.0 version: 29.7.0 @@ -381,7 +384,7 @@ importers: version: 29.7.0 jest-extended: specifier: 4.0.2 - version: 4.0.2(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0)) + version: 4.0.2(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)) jest-junit: specifier: 16.0.0 version: 16.0.0 @@ -783,7 +786,7 @@ importers: version: 6.0.0 '@types/node': specifier: 20.17.6 - version: 20.17.6 + version: 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/prompts': specifier: 2.4.2 version: 2.4.2 @@ -1077,7 +1080,7 @@ importers: version: 8.6.0(storybook@8.6.0(prettier@3.3.3)) '@storybook/test-runner': specifier: 0.21.0 - version: 0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.6)(babel-plugin-macros@3.1.0)(debug@4.1.1)(storybook@8.6.0(prettier@3.3.3)) + version: 0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)(debug@4.1.1)(storybook@8.6.0(prettier@3.3.3)) '@swc/core': specifier: 1.11.24 version: 1.11.24(@swc/helpers@0.5.15) @@ -1757,13 +1760,13 @@ importers: devDependencies: '@types/node': specifier: 20.17.6 - version: 20.17.6 + version: 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) turbopack/crates/turbopack-ecmascript-runtime/js: dependencies: '@types/node': specifier: 20.17.6 - version: 20.17.6 + version: 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) devDependencies: '@next/react-refresh-utils': specifier: workspace:* @@ -1783,7 +1786,7 @@ importers: version: 2.2.8 '@types/node': specifier: 20.17.6 - version: 20.17.6 + version: 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) turbopack/crates/turbopack-tests/tests/execution: dependencies: @@ -1838,7 +1841,7 @@ importers: version: 1.2.5 '@types/node': specifier: 20.17.6 - version: 20.17.6 + version: 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/split2': specifier: ^4.2.0 version: 4.2.3 @@ -18192,7 +18195,7 @@ snapshots: '@datadog/datadog-api-client@1.25.0(encoding@0.1.13)': dependencies: '@types/buffer-from': 1.1.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/pako': 1.0.7 buffer-from: 1.1.2 cross-fetch: 3.1.8(encoding@0.1.13) @@ -19013,7 +19016,7 @@ snapshots: '@inquirer/figures': 1.0.2 '@inquirer/type': 1.3.2 '@types/mute-stream': 0.0.4 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -19057,7 +19060,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -19070,14 +19073,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -19106,14 +19109,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.5.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-mock: 29.7.0 '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -19135,7 +19138,7 @@ snapshots: dependencies: '@jest/types': 29.5.0 '@sinonjs/fake-timers': 10.2.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -19144,7 +19147,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.2.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -19160,7 +19163,7 @@ snapshots: '@jest/pattern@30.0.0-alpha.6': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-regex-util: 30.0.0-alpha.6 '@jest/reporters@29.7.0': @@ -19171,7 +19174,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -19296,7 +19299,7 @@ snapshots: '@jest/schemas': 29.4.3 '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/yargs': 17.0.10 chalk: 4.1.2 @@ -19305,7 +19308,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/yargs': 17.0.10 chalk: 4.1.2 @@ -19315,7 +19318,7 @@ snapshots: '@jest/schemas': 30.0.0-alpha.6 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/yargs': 17.0.10 chalk: 4.1.2 @@ -19926,7 +19929,7 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.27.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) find-up: 4.1.0 fs-extra: 8.1.0 @@ -20404,7 +20407,7 @@ snapshots: '@octokit/types@6.8.3': dependencies: '@octokit/openapi-types': 4.0.2 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@octokit/webhooks-methods@4.0.0': {} @@ -20695,7 +20698,7 @@ snapshots: '@slack/logger@4.0.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@slack/types@2.14.0': {} @@ -20703,7 +20706,7 @@ snapshots: dependencies: '@slack/logger': 4.0.0 '@slack/types': 2.14.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/retry': 0.12.0 axios: 1.9.0 eventemitter3: 5.0.1 @@ -21003,7 +21006,7 @@ snapshots: '@storybook/test': 8.6.0(storybook@8.6.0(prettier@3.3.3)) typescript: 5.8.2 - '@storybook/test-runner@0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.6)(babel-plugin-macros@3.1.0)(debug@4.1.1)(storybook@8.6.0(prettier@3.3.3))': + '@storybook/test-runner@0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)(debug@4.1.1)(storybook@8.6.0(prettier@3.3.3))': dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.27.0 @@ -21014,14 +21017,14 @@ snapshots: '@swc/core': 1.11.24(@swc/helpers@0.5.15) '@swc/jest': 0.2.37(@swc/core@1.11.24(@swc/helpers@0.5.15)) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-junit: 16.0.0 - jest-playwright-preset: 4.0.0(debug@4.1.1)(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0)) + jest-playwright-preset: 4.0.0(debug@4.1.1)(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0)) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)) nyc: 15.1.0 playwright: 1.48.0 storybook: 8.6.0(prettier@3.3.3) @@ -21178,7 +21181,7 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.1.2(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0))(vitest@3.0.4(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2))': + '@testing-library/jest-dom@6.1.2(@jest/globals@29.7.0)(@types/jest@29.5.5)(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0))(vitest@3.0.4(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2))': dependencies: '@adobe/css-tools': 4.3.1 '@babel/runtime': 7.27.0 @@ -21191,8 +21194,8 @@ snapshots: optionalDependencies: '@jest/globals': 29.7.0 '@types/jest': 29.5.5 - jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) - vitest: 3.0.4(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2) + jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) + vitest: 3.0.4(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2) '@testing-library/jest-dom@6.5.0': dependencies: @@ -21230,7 +21233,7 @@ snapshots: '@types/amphtml-validator@1.0.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/aria-query@5.0.1': {} @@ -21284,27 +21287,27 @@ snapshots: '@types/body-parser@1.17.1': dependencies: '@types/connect': 3.4.33 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/bonjour@3.5.13': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/btoa-lite@1.0.0': {} '@types/buffer-from@1.1.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/busboy@1.5.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/bytes@3.1.1': {} '@types/cheerio@0.22.16': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/ci-info@2.0.0': {} @@ -21314,16 +21317,16 @@ snapshots: '@types/concat-stream@2.0.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.17.33 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/connect@3.4.33': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/content-disposition@0.5.4': {} @@ -21335,7 +21338,7 @@ snapshots: '@types/cross-spawn@6.0.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/d3-scale-chromatic@3.0.3': {} @@ -21373,7 +21376,7 @@ snapshots: '@types/express-serve-static-core@4.17.33': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/qs': 6.9.7 '@types/range-parser': 1.2.3 @@ -21396,23 +21399,23 @@ snapshots: '@types/fontkit@2.0.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/fresh@0.5.0': {} '@types/fs-extra@8.1.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/glob@7.1.1': dependencies: '@types/events': 3.0.0 '@types/minimatch': 3.0.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/hast@2.3.1': dependencies: @@ -21426,17 +21429,17 @@ snapshots: '@types/html-validator@5.0.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/http-errors@2.0.4': {} '@types/http-proxy@1.17.16': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/http-proxy@1.17.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/inquirer@8.2.9': dependencies: @@ -21478,7 +21481,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/tough-cookie': 4.0.3 parse5: 7.1.2 @@ -21490,17 +21493,17 @@ snapshots: '@types/jsonwebtoken@9.0.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/junit-report-builder@3.0.2': {} '@types/keyv@3.1.1': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/loader-runner@2.2.8': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/lodash.curry@4.1.6': dependencies: @@ -21530,22 +21533,22 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/node-fetch@2.3.2': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/node-fetch@2.6.1': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) form-data: 3.0.1 '@types/node-forge@1.3.11': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) - '@types/node@20.17.6': + '@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu)': dependencies: undici-types: 6.19.8 @@ -21567,7 +21570,7 @@ snapshots: '@types/prompts@2.4.2': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) kleur: 3.0.3 '@types/q@1.5.2': {} @@ -21592,26 +21595,26 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/resolve@1.20.6': {} '@types/responselike@1.0.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/retry@0.12.0': {} '@types/semver@7.3.1': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/semver@7.5.6': {} '@types/send@0.14.4': dependencies: '@types/mime': 2.0.1 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/serve-index@1.9.4': dependencies: @@ -21625,20 +21628,20 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/send': 0.14.4 '@types/shell-quote@1.7.1': {} '@types/sockjs@0.3.36': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/source-list-map@0.1.2': {} '@types/split2@4.2.3': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/stack-utils@2.0.1': {} @@ -21650,19 +21653,19 @@ snapshots: '@types/tar@6.1.13': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) minipass: 4.2.8 '@types/tar@6.1.5': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) minipass: 4.2.8 '@types/text-table@0.2.1': {} '@types/through@0.0.30': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/tough-cookie@4.0.3': {} @@ -21680,17 +21683,17 @@ snapshots: '@types/wait-on@5.3.4': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/webpack-sources@0.1.5': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/source-list-map': 0.1.2 source-map: 0.6.1 '@types/webpack@5.28.5(@swc/core@1.11.24(@swc/helpers@0.5.15))': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) tapable: 2.2.0 webpack: 5.98.0(@swc/core@1.11.24(@swc/helpers@0.5.15)) transitivePeerDependencies: @@ -21703,11 +21706,11 @@ snapshots: '@types/ws@8.2.0': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/ws@8.5.14': dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/yargs-parser@21.0.0': {} @@ -22031,13 +22034,13 @@ snapshots: tinyrainbow: 2.0.0 optional: true - '@vitest/mocker@3.0.4(vite@6.2.5(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2))': + '@vitest/mocker@3.0.4(vite@6.2.5(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2))': dependencies: '@vitest/spy': 3.0.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.5(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2) + vite: 6.2.5(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2) optional: true '@vitest/pretty-format@2.0.5': @@ -22184,7 +22187,7 @@ snapshots: dependencies: '@types/async-retry': 1.2.1 '@types/lru-cache': 4.1.1 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) async-retry: 1.2.3 lru-cache: 5.1.1 @@ -23804,13 +23807,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -25389,13 +25392,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@27.6.3(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0))(typescript@5.8.2): + eslint-plugin-jest@27.6.3(@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0))(typescript@5.8.2): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@9.12.0)(typescript@5.8.2) eslint: 9.12.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.12.0)(typescript@5.8.2))(eslint@9.12.0)(typescript@5.8.2) - jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) transitivePeerDependencies: - supports-color - typescript @@ -27876,7 +27879,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.5.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -27901,7 +27904,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1(babel-plugin-macros@3.1.0) @@ -27921,16 +27924,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0): + jest-cli@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.0.2 - jest-config: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -27940,7 +27943,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0): + jest-config@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.26.10 '@jest/test-sequencer': 29.7.0 @@ -27965,7 +27968,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -28002,7 +28005,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -28016,16 +28019,16 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-mock: 29.7.0 jest-util: 29.7.0 - jest-extended@4.0.2(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0)): + jest-extended@4.0.2(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)): dependencies: jest-diff: 29.7.0 jest-get-type: 29.6.3 optionalDependencies: - jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-get-type@29.6.3: {} @@ -28035,7 +28038,7 @@ snapshots: dependencies: '@jest/types': 29.5.0 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -28051,7 +28054,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -28066,7 +28069,7 @@ snapshots: jest-haste-map@30.0.0-alpha.6: dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) anymatch: 3.1.3 fb-watchman: 2.0.1 graceful-fs: 4.2.11 @@ -28131,25 +28134,25 @@ snapshots: jest-mock@29.5.0: dependencies: '@jest/types': 29.5.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-util: 29.7.0 jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-util: 29.7.0 jest-mock@30.0.0-alpha.6: dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-util: 30.0.0-alpha.6 - jest-playwright-preset@4.0.0(debug@4.1.1)(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0)): + jest-playwright-preset@4.0.0(debug@4.1.1)(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-process-manager: 0.4.0(debug@4.1.1) @@ -28214,7 +28217,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -28242,7 +28245,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 cjs-module-lexer: 1.2.2 collect-v8-coverage: 1.0.1 @@ -28293,7 +28296,7 @@ snapshots: jest-util@29.5.0: dependencies: '@jest/types': 29.5.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -28302,7 +28305,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -28311,7 +28314,7 @@ snapshots: jest-util@30.0.0-alpha.6: dependencies: '@jest/types': 30.0.0-alpha.6 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) chalk: 4.1.2 ci-info: 4.0.0 graceful-fs: 4.2.11 @@ -28326,11 +28329,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0)): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0)): dependencies: ansi-escapes: 6.2.1 chalk: 5.3.0 - jest: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -28341,7 +28344,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -28350,37 +28353,37 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@30.0.0-alpha.6: dependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@ungap/structured-clone': 1.2.0 jest-util: 30.0.0-alpha.6 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0): + jest@29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/types': 29.6.3 import-local: 3.0.2 - jest-cli: 29.7.0(@types/node@20.17.6)(babel-plugin-macros@3.1.0) + jest-cli: 29.7.0(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -31984,7 +31987,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.1 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) long: 4.0.0 protobufjs@7.2.4: @@ -31999,7 +32002,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) long: 5.2.3 protocols@1.4.7: {} @@ -34569,7 +34572,7 @@ snapshots: '@types/concat-stream': 2.0.3 '@types/debug': 4.1.5 '@types/is-empty': 1.2.3 - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) '@types/unist': 3.0.3 concat-stream: 2.0.0 debug: 4.1.1 @@ -35055,13 +35058,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.4(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2): + vite-node@3.0.4(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.5(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2) + vite: 6.2.5(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2) transitivePeerDependencies: - '@types/node' - jiti @@ -35077,22 +35080,22 @@ snapshots: - yaml optional: true - vite@6.2.5(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2): + vite@6.2.5(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2): dependencies: esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.39.0 optionalDependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) fsevents: 2.3.3 sass: 1.54.0 tsx: 4.19.2 optional: true - vitest@3.0.4(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2): + vitest@3.0.4(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2): dependencies: '@vitest/expect': 3.0.4 - '@vitest/mocker': 3.0.4(vite@6.2.5(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2)) + '@vitest/mocker': 3.0.4(vite@6.2.5(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.0.4 '@vitest/snapshot': 3.0.4 @@ -35108,11 +35111,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.5(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2) - vite-node: 3.0.4(@types/node@20.17.6)(sass@1.54.0)(tsx@4.19.2) + vite: 6.2.5(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2) + vite-node: 3.0.4(@types/node@20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu))(sass@1.54.0)(tsx@4.19.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.17.6 + '@types/node': 20.17.6(patch_hash=rvl3vkomen3tospgr67bzubfyu) transitivePeerDependencies: - jiti - less From 624dd52995dd32993c7a09d44eaf1d9e7f944eaa Mon Sep 17 00:00:00 2001 From: Sebastian Sebbie Silbermann Date: Fri, 4 Jul 2025 20:20:00 +0200 Subject: [PATCH 2/2] fixup! [refactor] Move sourcemapping logic to dedicated file --- .../production/app-dir/browser-chunks/browser-chunks.test.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/production/app-dir/browser-chunks/browser-chunks.test.ts b/test/production/app-dir/browser-chunks/browser-chunks.test.ts index 7c661e528d880..25448d9ddb178 100644 --- a/test/production/app-dir/browser-chunks/browser-chunks.test.ts +++ b/test/production/app-dir/browser-chunks/browser-chunks.test.ts @@ -1,5 +1,4 @@ import { nextTestSetup } from 'e2e-utils' -import { SourceMapPayload } from 'module' describe('browser-chunks', () => { const { next } = nextTestSetup({ @@ -13,9 +12,7 @@ describe('browser-chunks', () => { filename.endsWith('.js.map') ) - sources = sourcemaps.flatMap( - (sourcemap) => (JSON.parse(sourcemap) as SourceMapPayload).sources - ) + sources = sourcemaps.flatMap((sourcemap) => JSON.parse(sourcemap).sources) }) it('must not bundle any server modules into browser chunks', () => { const serverSources = sources.filter(