one
Version:
One is a React framework for web, iOS, and Android apps.
136 lines (135 loc) • 4.41 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var diagnoseRouteLoadFailure_exports = {};
__export(diagnoseRouteLoadFailure_exports, {
diagnoseRouteLoadFailure: () => diagnoseRouteLoadFailure,
findRouteLoadFault: () => findRouteLoadFault
});
module.exports = __toCommonJS(diagnoseRouteLoadFailure_exports);
const MAX_MODULES = 500;
const TIMEOUT_MS = 5e3;
function collectImports(source, base) {
const out = [];
const add = (spec) => {
if (!/^[./]|^https?:/.test(spec)) return;
try {
out.push(new URL(spec, base).href);
} catch {}
};
for (const m of source.matchAll(/(?:^|[\s;}])(?:import|export)[^'"]{0,300}?from\s*["']([^"']+)["']/g)) add(m[1]);
for (const m of source.matchAll(/\bimport\s*\(\s*["']([^"']+)["']\s*\)/g)) add(m[1]);
for (const m of source.matchAll(/(?:^|[\s;}])import\s*["']([^"']+)["']/g)) add(m[1]);
return out;
}
async function findRouteLoadFault(entryUrl) {
const deadline = Date.now() + TIMEOUT_MS;
const importers = /* @__PURE__ */ new Map();
const entry = new URL(entryUrl, window.location.href).href;
importers.set(entry, null);
let frontier = [entry];
let visited = 0;
while (frontier.length && visited < MAX_MODULES && Date.now() < deadline) {
const batch = frontier.slice(0, 32);
frontier = frontier.slice(batch.length);
visited += batch.length;
const results = await Promise.all(batch.map(async (url) => {
let res;
try {
res = await fetch(url);
} catch {
return {
url,
fault: "unreachable",
imports: []
};
}
if (res.status === 404) return {
url,
fault: "missing",
imports: []
};
if (!res.ok) return {
url,
fault: null,
imports: []
};
const type = res.headers.get("content-type") ?? "";
if (!type.includes("javascript")) return {
url,
fault: null,
imports: []
};
return {
url,
fault: null,
imports: collectImports(await res.text(), url)
};
}));
for (const result of results) {
if (result.fault === "missing") {
const importer = importers.get(result.url) ?? null;
if (importer?.includes("/node_modules/")) continue;
return {
kind: "missing",
url: result.url,
importer
};
}
if (result.fault === "unreachable") {
const serverAnswers = await fetch(window.location.href, { method: "HEAD" }).then(() => true, () => false);
return serverAnswers ? {
kind: "blocked",
url: result.url
} : null;
}
for (const next of result.imports) {
if (importers.has(next)) continue;
importers.set(next, result.url);
frontier.push(next);
}
}
}
return null;
}
async function diagnoseRouteLoadFailure(routeId, routeUrl) {
const fault = await findRouteLoadFault(routeUrl);
if (!fault) return null;
const toPath = (url) => url.replace(window.location.origin, "");
const path = toPath(fault.url);
if (fault.kind === "missing") {
return [
`Route "${routeId}" failed to load because ${path} does not exist (the dev server answered 404).`,
``,
fault.importer ? `${toPath(fault.importer)} imports it. Create the file or remove the import.` : `Create the file or remove the import.`
].join("\n");
}
return [
`Route "${routeId}" failed to load because this browser refused to fetch ${path}`,
``,
`That request never reached the dev server, so a content blocker or privacy`,
`extension is blocking it. In dev the module URL is the source path, and a`,
`path containing a word like "analytics", "pageview" or "track" matches the`,
`tracking rules those blockers ship.`,
``,
`Rename the file or the directory so its path no longer matches, or allow`,
`${window.location.origin} in the blocker.`
].join("\n");
}