{"version":3,"sources":["../../../../src/next-devtools/shared/stack-frame.ts"],"sourcesContent":["import type {\n  OriginalStackFrameResponse,\n  OriginalStackFrameResponseResult,\n  OriginalStackFramesRequest,\n  StackFrame,\n} from '../server/shared'\nimport {\n  isWebpackInternalResource,\n  formatStackFrameFile,\n} from './webpack-module-path'\n\nexport type { StackFrame }\n\ninterface ResolvedOriginalStackFrame extends OriginalStackFrameResponse {\n  error: false\n  reason: null\n  external: boolean\n  ignored: boolean\n  sourceStackFrame: StackFrame\n}\n\ninterface RejectedOriginalStackFrame extends OriginalStackFrameResponse {\n  error: true\n  reason: string\n  external: boolean\n  ignored: boolean\n  sourceStackFrame: StackFrame\n}\n\nexport type OriginalStackFrame =\n  | ResolvedOriginalStackFrame\n  | RejectedOriginalStackFrame\n\nfunction getOriginalStackFrame(\n  source: StackFrame,\n  response: OriginalStackFrameResponseResult\n): Promise<OriginalStackFrame> {\n  async function _getOriginalStackFrame(): Promise<ResolvedOriginalStackFrame> {\n    if (response.status === 'rejected') {\n      throw new Error(response.reason)\n    }\n\n    const body: OriginalStackFrameResponse = response.value\n\n    return {\n      error: false,\n      reason: null,\n      external: false,\n      sourceStackFrame: source,\n      originalStackFrame: body.originalStackFrame,\n      originalCodeFrame: body.originalCodeFrame || null,\n      ignored: body.originalStackFrame?.ignored || false,\n    }\n  }\n\n  // TODO: merge this section into ignoredList handling\n  if (source.file === 'file://' || source.file?.match(/https?:\\/\\//)) {\n    return Promise.resolve({\n      error: false,\n      reason: null,\n      external: true,\n      sourceStackFrame: source,\n      originalStackFrame: null,\n      originalCodeFrame: null,\n      ignored: true,\n    })\n  }\n\n  return _getOriginalStackFrame().catch(\n    (err: Error): RejectedOriginalStackFrame => ({\n      error: true,\n      reason: err?.message ?? err?.toString() ?? 'Unknown Error',\n      external: false,\n      sourceStackFrame: source,\n      originalStackFrame: null,\n      originalCodeFrame: null,\n      ignored: false,\n    })\n  )\n}\n\nexport async function getOriginalStackFrames(\n  frames: readonly StackFrame[],\n  type: 'server' | 'edge-server' | null,\n  isAppDir: boolean\n): Promise<readonly OriginalStackFrame[]> {\n  const req: OriginalStackFramesRequest = {\n    frames,\n    isServer: type === 'server',\n    isEdgeServer: type === 'edge-server',\n    isAppDirectory: isAppDir,\n  }\n\n  let res: Response | undefined = undefined\n  let reason: string | undefined = undefined\n  try {\n    res = await fetch('/__nextjs_original-stack-frames', {\n      method: 'POST',\n      body: JSON.stringify(req),\n    })\n  } catch (e) {\n    reason = e + ''\n  }\n\n  // When fails to fetch the original stack frames, we reject here to be\n  // caught at `_getOriginalStackFrame()` and return the stack frames so\n  // that the error overlay can render.\n  if (res && res.ok && res.status !== 204) {\n    const data = await res.json()\n    return Promise.all(\n      frames.map((frame, index) => getOriginalStackFrame(frame, data[index]))\n    )\n  } else {\n    if (res) {\n      reason = await res.text()\n    }\n  }\n  return Promise.all(\n    frames.map((frame) =>\n      getOriginalStackFrame(frame, {\n        status: 'rejected',\n        reason: `Failed to fetch the original stack frames ${reason ? `: ${reason}` : ''}`,\n      })\n    )\n  )\n}\n\nexport function getStackFrameFile(frame: StackFrame): string {\n  if (!frame.file) return ''\n\n  const isWebpackFrame = isWebpackInternalResource(frame.file)\n\n  let str = ''\n  // Skip URL parsing for webpack internal file paths.\n  if (isWebpackFrame) {\n    str = formatStackFrameFile(frame.file)\n  } else {\n    try {\n      const u = new URL(frame.file)\n\n      let parsedPath = ''\n      // Strip the origin for same-origin scripts.\n      if (globalThis.location?.origin !== u.origin) {\n        // URLs can be valid without an `origin`, so long as they have a\n        // `protocol`. However, `origin` is preferred.\n        if (u.origin === 'null') {\n          parsedPath += u.protocol\n        } else {\n          parsedPath += u.origin\n        }\n      }\n\n      // Strip query string information as it's typically too verbose to be\n      // meaningful.\n      parsedPath += u.pathname\n      str = formatStackFrameFile(parsedPath)\n    } catch {\n      str = formatStackFrameFile(frame.file)\n    }\n  }\n\n  if (!isWebpackInternalResource(frame.file) && frame.line1 != null) {\n    // We don't need line and column numbers for anonymous sources because\n    // there's no entrypoint for the location anyway.\n    if (str && frame.file !== '<anonymous>') {\n      if (frame.column1 != null) {\n        str += ` (${frame.line1}:${frame.column1})`\n      } else {\n        str += ` (${frame.line1})`\n      }\n    }\n  }\n  return str\n}\n"],"names":["isWebpackInternalResource","formatStackFrameFile","getOriginalStackFrame","source","response","_getOriginalStackFrame","status","Error","reason","body","value","error","external","sourceStackFrame","originalStackFrame","originalCodeFrame","ignored","file","match","Promise","resolve","catch","err","message","toString","getOriginalStackFrames","frames","type","isAppDir","req","isServer","isEdgeServer","isAppDirectory","res","undefined","fetch","method","JSON","stringify","e","ok","data","json","all","map","frame","index","text","getStackFrameFile","isWebpackFrame","str","u","URL","parsedPath","globalThis","location","origin","protocol","pathname","line1","column1"],"mappings":"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","ignoreList":[0]}