{"version":3,"file":"diagnoseRouteLoadFailure.js","names":[],"sources":["esm/router/diagnoseRouteLoadFailure.js"],"sourcesContent":["const MAX_MODULES = 500;\nconst TIMEOUT_MS = 5e3;\nfunction collectImports(source, base) {\n  const out = [];\n  const add = (spec) => {\n    if (!/^[./]|^https?:/.test(spec)) return;\n    try {\n      out.push(new URL(spec, base).href);\n    } catch {\n    }\n  };\n  for (const m of source.matchAll(\n    /(?:^|[\\s;}])(?:import|export)[^'\"]{0,300}?from\\s*[\"']([^\"']+)[\"']/g\n  ))\n    add(m[1]);\n  for (const m of source.matchAll(/\\bimport\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g)) add(m[1]);\n  for (const m of source.matchAll(/(?:^|[\\s;}])import\\s*[\"']([^\"']+)[\"']/g)) add(m[1]);\n  return out;\n}\nasync function findRouteLoadFault(entryUrl) {\n  const deadline = Date.now() + TIMEOUT_MS;\n  const importers = /* @__PURE__ */ new Map();\n  const entry = new URL(entryUrl, window.location.href).href;\n  importers.set(entry, null);\n  let frontier = [entry];\n  let visited = 0;\n  while (frontier.length && visited < MAX_MODULES && Date.now() < deadline) {\n    const batch = frontier.slice(0, 32);\n    frontier = frontier.slice(batch.length);\n    visited += batch.length;\n    const results = await Promise.all(\n      batch.map(async (url) => {\n        let res;\n        try {\n          res = await fetch(url);\n        } catch {\n          return { url, fault: \"unreachable\", imports: [] };\n        }\n        if (res.status === 404) return { url, fault: \"missing\", imports: [] };\n        if (!res.ok) return { url, fault: null, imports: [] };\n        const type = res.headers.get(\"content-type\") ?? \"\";\n        if (!type.includes(\"javascript\")) return { url, fault: null, imports: [] };\n        return { url, fault: null, imports: collectImports(await res.text(), url) };\n      })\n    );\n    for (const result of results) {\n      if (result.fault === \"missing\") {\n        const importer = importers.get(result.url) ?? null;\n        if (importer?.includes(\"/node_modules/\")) continue;\n        return { kind: \"missing\", url: result.url, importer };\n      }\n      if (result.fault === \"unreachable\") {\n        const serverAnswers = await fetch(window.location.href, { method: \"HEAD\" }).then(\n          () => true,\n          () => false\n        );\n        return serverAnswers ? { kind: \"blocked\", url: result.url } : null;\n      }\n      for (const next of result.imports) {\n        if (importers.has(next)) continue;\n        importers.set(next, result.url);\n        frontier.push(next);\n      }\n    }\n  }\n  return null;\n}\nasync function diagnoseRouteLoadFailure(routeId, routeUrl) {\n  const fault = await findRouteLoadFault(routeUrl);\n  if (!fault) return null;\n  const toPath = (url) => url.replace(window.location.origin, \"\");\n  const path = toPath(fault.url);\n  if (fault.kind === \"missing\") {\n    return [\n      `Route \"${routeId}\" failed to load because ${path} does not exist (the dev server answered 404).`,\n      ``,\n      fault.importer ? `${toPath(fault.importer)} imports it. Create the file or remove the import.` : `Create the file or remove the import.`\n    ].join(\"\\n\");\n  }\n  return [\n    `Route \"${routeId}\" failed to load because this browser refused to fetch ${path}`,\n    ``,\n    `That request never reached the dev server, so a content blocker or privacy`,\n    `extension is blocking it. In dev the module URL is the source path, and a`,\n    `path containing a word like \"analytics\", \"pageview\" or \"track\" matches the`,\n    `tracking rules those blockers ship.`,\n    ``,\n    `Rename the file or the directory so its path no longer matches, or allow`,\n    `${window.location.origin} in the blocker.`\n  ].join(\"\\n\");\n}\nexport {\n  diagnoseRouteLoadFailure,\n  findRouteLoadFault\n};\n//# sourceMappingURL=diagnoseRouteLoadFailure.js.map\n"],"mappings":";AAAA,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,SAAS,eAAe,QAAQ,MAAM;CACpC,MAAM,MAAM,CAAC;CACb,MAAM,OAAO,SAAS;EACpB,IAAI,CAAC,iBAAiB,KAAK,IAAI,GAAG;EAClC,IAAI;GACF,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,CAAC,IAAI;EACnC,QAAQ,CACR;CACF;CACA,KAAK,MAAM,KAAK,OAAO,SACrB,oEACF,GACE,IAAI,EAAE,EAAE;CACV,KAAK,MAAM,KAAK,OAAO,SAAS,wCAAwC,GAAG,IAAI,EAAE,EAAE;CACnF,KAAK,MAAM,KAAK,OAAO,SAAS,wCAAwC,GAAG,IAAI,EAAE,EAAE;CACnF,OAAO;AACT;AACA,eAAe,mBAAmB,UAAU;CAC1C,MAAM,WAAW,KAAK,IAAI,IAAI;CAC9B,MAAM,4BAA4B,IAAI,IAAI;CAC1C,MAAM,QAAQ,IAAI,IAAI,UAAU,OAAO,SAAS,IAAI,CAAC,CAAC;CACtD,UAAU,IAAI,OAAO,IAAI;CACzB,IAAI,WAAW,CAAC,KAAK;CACrB,IAAI,UAAU;CACd,OAAO,SAAS,UAAU,UAAU,eAAe,KAAK,IAAI,IAAI,UAAU;EACxE,MAAM,QAAQ,SAAS,MAAM,GAAG,EAAE;EAClC,WAAW,SAAS,MAAM,MAAM,MAAM;EACtC,WAAW,MAAM;EACjB,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,IAAI,OAAO,QAAQ;GACvB,IAAI;GACJ,IAAI;IACF,MAAM,MAAM,MAAM,GAAG;GACvB,QAAQ;IACN,OAAO;KAAE;KAAK,OAAO;KAAe,SAAS,CAAC;IAAE;GAClD;GACA,IAAI,IAAI,WAAW,KAAK,OAAO;IAAE;IAAK,OAAO;IAAW,SAAS,CAAC;GAAE;GACpE,IAAI,CAAC,IAAI,IAAI,OAAO;IAAE;IAAK,OAAO;IAAM,SAAS,CAAC;GAAE;GACpD,MAAM,OAAO,IAAI,QAAQ,IAAI,cAAc,KAAK;GAChD,IAAI,CAAC,KAAK,SAAS,YAAY,GAAG,OAAO;IAAE;IAAK,OAAO;IAAM,SAAS,CAAC;GAAE;GACzE,OAAO;IAAE;IAAK,OAAO;IAAM,SAAS,eAAe,MAAM,IAAI,KAAK,GAAG,GAAG;GAAE;EAC5E,CAAC,CACH;EACA,KAAK,MAAM,UAAU,SAAS;GAC5B,IAAI,OAAO,UAAU,WAAW;IAC9B,MAAM,WAAW,UAAU,IAAI,OAAO,GAAG,KAAK;IAC9C,IAAI,UAAU,SAAS,gBAAgB,GAAG;IAC1C,OAAO;KAAE,MAAM;KAAW,KAAK,OAAO;KAAK;IAAS;GACtD;GACA,IAAI,OAAO,UAAU,eAAe;IAClC,MAAM,gBAAgB,MAAM,MAAM,OAAO,SAAS,MAAM,EAAE,QAAQ,OAAO,CAAC,CAAC,CAAC,WACpE,YACA,KACR;IACA,OAAO,gBAAgB;KAAE,MAAM;KAAW,KAAK,OAAO;IAAI,IAAI;GAChE;GACA,KAAK,MAAM,QAAQ,OAAO,SAAS;IACjC,IAAI,UAAU,IAAI,IAAI,GAAG;IACzB,UAAU,IAAI,MAAM,OAAO,GAAG;IAC9B,SAAS,KAAK,IAAI;GACpB;EACF;CACF;CACA,OAAO;AACT;AACA,eAAe,yBAAyB,SAAS,UAAU;CACzD,MAAM,QAAQ,MAAM,mBAAmB,QAAQ;CAC/C,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,UAAU,QAAQ,IAAI,QAAQ,OAAO,SAAS,QAAQ,EAAE;CAC9D,MAAM,OAAO,OAAO,MAAM,GAAG;CAC7B,IAAI,MAAM,SAAS,WAAW;EAC5B,OAAO;GACL,UAAU,QAAQ,2BAA2B,KAAK;GAClD;GACA,MAAM,WAAW,GAAG,OAAO,MAAM,QAAQ,EAAE,sDAAsD;EACnG,CAAC,CAAC,KAAK,IAAI;CACb;CACA,OAAO;EACL,UAAU,QAAQ,yDAAyD;EAC3E;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,OAAO,SAAS,OAAO;CAC5B,CAAC,CAAC,KAAK,IAAI;AACb"}