UNPKG

next

Version:

The React Framework

167 lines (166 loc) • 7.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { devirtualizeReactServerURL: null, filterStackFrameDEV: null, findApplicableSourceMapPayload: null, ignoreListAnonymousStackFramesIfSandwiched: null, sourceMapIgnoreListsEverything: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { devirtualizeReactServerURL: function() { return devirtualizeReactServerURL; }, filterStackFrameDEV: function() { return filterStackFrameDEV; }, findApplicableSourceMapPayload: function() { return findApplicableSourceMapPayload; }, ignoreListAnonymousStackFramesIfSandwiched: function() { return ignoreListAnonymousStackFramesIfSandwiched; }, sourceMapIgnoreListsEverything: function() { return sourceMapIgnoreListsEverything; } }); var _process_versions_node; function noSourceMap() { return undefined; } // Edge runtime does not implement `module` const nativeFindSourceMap = process.env.NEXT_RUNTIME === 'edge' ? noSourceMap : require('module').findSourceMap; function sourceMapIgnoreListsEverything(sourceMap) { return sourceMap.ignoreList !== undefined && sourceMap.sources.length === sourceMap.ignoreList.length; } function findApplicableSourceMapPayload(line0, column0, payload) { if ('sections' in payload) { if (payload.sections.length === 0) { return undefined; } // 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. const sections = payload.sections; let left = 0; let right = sections.length - 1; let result = null; while(left <= right){ // fast Math.floor const middle = ~~((left + right) / 2); const section = sections[middle]; const offset = section.offset; if (offset.line < line0 || offset.line === line0 && offset.column <= column0) { result = section; left = middle + 1; } else { right = middle - 1; } } return result === null ? undefined : result.map; } else { return payload; } } const didWarnAboutInvalidSourceMapDEV = new Set(); const findSourceMap = process.env.NEXT_RUNTIME === 'nodejs' && ((_process_versions_node = process.versions.node) == null ? void 0 : _process_versions_node.startsWith('18')) ? noSourceMap : nativeFindSourceMap; function filterStackFrameDEV(sourceURL, functionName, line1, column1) { if (sourceURL === '') { // The default implementation filters out <anonymous> stack frames // but we want to retain them because current Server Components and // built-in Components in parent stacks don't have source location. // Filter out frames that show up in Promises to get good names in React's // Server Request track until we come up with a better heuristic. return functionName !== 'new Promise' && functionName !== 'Promise.then' && functionName !== 'Promise.catch' && functionName !== 'Promise.finally' && functionName !== 'Function.withResolvers' && functionName !== 'Function.all' && functionName !== 'Function.allSettled'; } if (sourceURL.startsWith('node:') || sourceURL.includes('node_modules')) { return false; } try { // Node.js loads source maps eagerly so this call is cheap. // TODO: ESM sourcemaps are O(1) but CommonJS sourcemaps are O(Number of CJS modules). // Make sure this doesn't adversely affect performance when CJS is used by Next.js. const sourceMap = findSourceMap(sourceURL); if (sourceMap === undefined) { // No source map assoicated. // TODO: Node.js types should reflect that `findSourceMap` can return `undefined`. return true; } const sourceMapPayload = findApplicableSourceMapPayload(line1 - 1, column1 - 1, sourceMap.payload); if (sourceMapPayload === undefined) { // No source map section applicable to the frame. return true; } return !sourceMapIgnoreListsEverything(sourceMapPayload); } catch (cause) { if (process.env.NODE_ENV !== 'production') { // TODO: Share cache with patch-error-inspect if (!didWarnAboutInvalidSourceMapDEV.has(sourceURL)) { didWarnAboutInvalidSourceMapDEV.add(sourceURL); // We should not log an actual error instance here because that will re-enter // this codepath during error inspection and could lead to infinite recursion. console.error(`${sourceURL}: Invalid source map. Only conformant source maps can be used to filter stack frames. Cause: ${cause}`); } } return true; } } function devirtualizeReactServerURL(sourceURL) { if (sourceURL.startsWith('rsc://React/')) { // rsc://React/Server/file://<filename>?42 => file://<filename> const envIdx = sourceURL.indexOf('/', 'rsc://React/'.length); const suffixIdx = sourceURL.lastIndexOf('?'); if (envIdx > -1 && suffixIdx > -1) { return decodeURI(sourceURL.slice(envIdx + 1, suffixIdx)); } } return sourceURL; } function isAnonymousFrameLikelyJSNative(methodName) { // Anonymous frames can also be produced in React parent stacks either from // host components or Server Components. We don't want to ignore those. // This could hide user-space methods that are named like native JS methods but // should you really do that? return(// e.g. JSON.parse methodName.startsWith('JSON.') || // E.g. Promise.withResolves methodName.startsWith('Function.') || // various JS built-ins methodName.startsWith('Promise.') || methodName.startsWith('Array.') || methodName.startsWith('Set.') || methodName.startsWith('Map.')); } function ignoreListAnonymousStackFramesIfSandwiched(frames, isAnonymousFrame, isIgnoredFrame, getMethodName, /** only passes frames for which `isAnonymousFrame` and their method is a native JS method or `isIgnoredFrame` return true */ ignoreFrame) { for(let i = 1; i < frames.length; i++){ const currentFrame = frames[i]; if (!(isAnonymousFrame(currentFrame) && isAnonymousFrameLikelyJSNative(getMethodName(currentFrame)))) { continue; } const previousFrameIsIgnored = isIgnoredFrame(frames[i - 1]); if (previousFrameIsIgnored && i < frames.length - 1) { let ignoreSandwich = false; let j = i + 1; for(j; j < frames.length; j++){ const nextFrame = frames[j]; const nextFrameIsAnonymous = isAnonymousFrame(nextFrame) && isAnonymousFrameLikelyJSNative(getMethodName(nextFrame)); if (nextFrameIsAnonymous) { continue; } const nextFrameIsIgnored = isIgnoredFrame(nextFrame); if (nextFrameIsIgnored) { ignoreSandwich = true; break; } } if (ignoreSandwich) { for(i; i < j; i++){ ignoreFrame(frames[i]); } } } } } //# sourceMappingURL=source-maps.js.map