Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 0 additions & 178 deletions packages/bun-error/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
type SourceLine,
type StackFrame,
} from "./schema";
import { fetchAllMappings, remapPosition, sourceMappings } from "./sourcemap";

export enum JSErrorCode {
Error = 0,
Expand Down Expand Up @@ -1021,188 +1020,11 @@ export function renderFallbackError(fallback: FallbackMessageContainer) {

globalThis[Symbol.for("Bun__renderFallbackError")] = renderFallbackError;

import { parse as getStackTrace } from "./stack-trace-parser";
var runtimeErrorController: AbortController | null = null;
var pending: { stopped: boolean }[] = [];

var onIdle = globalThis.requestIdleCallback || (cb => setTimeout(cb, 32));
function clearSourceMappings() {
sourceMappings.clear();
}
export function renderRuntimeError(error: Error) {
runtimeErrorController = new AbortController();
if (typeof error === "string") {
error = {
name: "Error",
message: error,
};
}

const exception = {
name: String(error.name),
message: String(error.message),
runtime_type: 0,
stack: {
frames: error.stack ? getStackTrace(error.stack) : [],
source_lines: [],
},
};

var lineNumberProperty = "";
var columnNumberProperty = "";
var fileNameProperty = "";

if (error && typeof error === "object") {
// safari
if ("line" in error) {
lineNumberProperty = "line";
// firefox
} else if ("lineNumber" in error) {
lineNumberProperty = "lineNumber";
}

// safari
if ("column" in error) {
columnNumberProperty = "column";
// firefox
} else if ("columnNumber" in error) {
columnNumberProperty = "columnNumber";
}

// safari
if ("sourceURL" in error) {
fileNameProperty = "sourceURL";
// firefox
} else if ("fileName" in error) {
fileNameProperty = "fileName";
}
}

if (Number.isFinite(error[lineNumberProperty])) {
if (exception.stack?.frames.length == 0) {
exception.stack.frames.push({
file: error[fileNameProperty] || "",
position: {
line: +error[lineNumberProperty] || 1,
column: +error[columnNumberProperty] || 1,
},
} as StackFrame);
} else if (exception.stack && exception.stack.frames.length > 0) {
exception.stack.frames[0].position.line = error[lineNumberProperty];

if (Number.isFinite(error[columnNumberProperty])) {
exception.stack.frames[0].position.column = error[columnNumberProperty];
}
}
}
const signal = runtimeErrorController.signal;

const fallback: FallbackMessageContainer = {
message: error.message,

problems: {
build: {
warnings: 0,
errors: 0,
msgs: [],
},
exceptions: [exception],
},
};

var stopThis = { stopped: false };
pending.push(stopThis);

const BunError = () => {
return (
<ErrorGroupContext.Provider value={fallback}>
<OverlayMessageContainer isClient {...fallback} />
</ErrorGroupContext.Provider>
);
};

// Remap the sourcemaps
// But! If we've already fetched the source mappings in this page load before
// Rely on the cached ones
// and don't fetch them again
const framePromises = fetchAllMappings(
exception.stack.frames.map(frame => normalizedFilename(frame.file, thisCwd)),
signal,
)
.map((frame, i) => {
if (stopThis.stopped) return null;
return [frame, i];
})
.map(result => {
if (!result) return;
const [mappings, frameIndex] = result;
if (mappings?.then) {
return mappings.then(mappings => {
if (!mappings || stopThis.stopped) {
return null;
}
var frame = exception.stack.frames[frameIndex];

const { line, column } = frame.position;
const remapped = remapPosition(mappings, line, column);
if (!remapped) return null;
frame.position.line_start = frame.position.line = remapped[0];
frame.position.column_stop =
frame.position.expression_stop =
frame.position.expression_start =
frame.position.column =
remapped[1];
}, console.error);
} else {
if (!mappings) return null;
var frame = exception.stack.frames[frameIndex];
const { line, column } = frame.position;
const remapped = remapPosition(mappings, line, column);
if (!remapped) return null;
frame.position.line_start = frame.position.line = remapped[0];
frame.position.column_stop =
frame.position.expression_stop =
frame.position.expression_start =
frame.position.column =
remapped[1];
}
});

var anyPromises = false;
for (let i = 0; i < framePromises.length; i++) {
if (framePromises[i] && framePromises[i].then) {
anyPromises = true;
break;
}
}

if (anyPromises) {
Promise.allSettled(framePromises).finally(() => {
if (stopThis.stopped || signal.aborted) return;
onIdle(clearSourceMappings);
return renderWithFunc(() => {
return <BunError />;
});
});
} else {
onIdle(clearSourceMappings);
renderWithFunc(() => {
return <BunError />;
});
}
}

export function dismissError() {
if (reactRoot) {
render(null, reactRoot);
const root = document.getElementById("__bun__error-root");
if (root) root.remove();
reactRoot = null;
if (runtimeErrorController) {
runtimeErrorController.abort();
runtimeErrorController = null;
}

while (pending.length > 0) pending.shift().stopped = true;
}
}
2 changes: 1 addition & 1 deletion packages/bun-error/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export interface StackFramePosition {
line: number;
/** 1-based; -1 when the frame has no source position */
column: number;
// Only set on frames built client-side (runtime-error.ts, source-map remapping in index.tsx).
// Only set on frames built client-side (runtime-error.ts).
source_offset?: number;
line_start?: number;
line_stop?: number;
Expand Down
Loading
Loading