svelte
Version:
Cybernetically enhanced web apps
66 lines (50 loc) • 1.28 kB
JavaScript
import { define_property } from './utils.js';
/**
* @param {string} label
* @returns {Error & { stack: string } | null}
*/
export function get_error(label) {
const error = new Error();
const stack = get_stack();
if (stack.length === 0) {
return null;
}
stack.unshift('\n');
define_property(error, 'stack', {
value: stack.join('\n')
});
define_property(error, 'name', {
value: label
});
return /** @type {Error & { stack: string }} */ (error);
}
/**
* @returns {string[]}
*/
export function get_stack() {
// @ts-ignore - doesn't exist everywhere
const limit = Error.stackTraceLimit;
// @ts-ignore - doesn't exist everywhere
Error.stackTraceLimit = Infinity;
const stack = new Error().stack;
// @ts-ignore - doesn't exist everywhere
Error.stackTraceLimit = limit;
if (!stack) return [];
const lines = stack.split('\n');
const new_lines = [];
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
const posixified = line.replaceAll('\\', '/');
if (line.trim() === 'Error') {
continue;
}
if (line.includes('validate_each_keys')) {
return [];
}
if (posixified.includes('svelte/src/internal') || posixified.includes('node_modules/.vite')) {
continue;
}
new_lines.push(line);
}
return new_lines;
}