vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
197 lines (196 loc) • 7.2 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.assert = assert;
exports.assertUsage = assertUsage;
exports.assertWarning = assertWarning;
exports.assertInfo = assertInfo;
exports.getProjectError = getProjectError;
exports.addOnBeforeLogHook = addOnBeforeLogHook;
exports.getAssertErrMsg = getAssertErrMsg;
exports.overwriteAssertProductionLogger = overwriteAssertProductionLogger;
exports.isBug = isBug;
exports.setAlwaysShowStackTrace = setAlwaysShowStackTrace;
const assertSingleInstance_js_1 = require("./assertSingleInstance.js");
const createErrorWithCleanStackTrace_js_1 = require("./createErrorWithCleanStackTrace.js");
const getGlobalObject_js_1 = require("./getGlobalObject.js");
const isObject_js_1 = require("./isObject.js");
const PROJECT_VERSION_js_1 = require("./PROJECT_VERSION.js");
const picocolors_1 = __importDefault(require("@brillout/picocolors"));
const globalObject = (0, getGlobalObject_js_1.getGlobalObject)('utils/assert.ts', {
alreadyLogged: new Set(),
// Production logger. Overwritten by loggerNotProd.ts in non-production environments.
logger(msg, logType) {
if (logType === 'info') {
console.log(msg);
}
else {
console.warn(msg);
}
},
showStackTraceList: new WeakSet(),
});
(0, assertSingleInstance_js_1.assertSingleInstance_onAssertModuleLoad)();
const projectTag = `[vike]`;
const projectTagWithVersion = `[vike@${PROJECT_VERSION_js_1.PROJECT_VERSION}]`;
const bugTag = 'Bug';
const numberOfStackTraceLinesToRemove = 2;
function assert(condition, debugInfo) {
if (condition)
return;
const debugStr = (() => {
if (!debugInfo) {
return null;
}
const debugInfoSerialized = typeof debugInfo === 'string' ? debugInfo : JSON.stringify(debugInfo);
return picocolors_1.default.dim(`Debug info for Vike maintainers (you can ignore this): ${debugInfoSerialized}`);
})();
const link = picocolors_1.default.underline('https://github.com/vikejs/vike/issues/new?template=bug.yml');
let errMsg = [
`You stumbled upon a Vike bug. Go to ${link} and copy-paste this error. A maintainer will fix the bug (usually within 24 hours).`,
debugStr,
]
.filter(Boolean)
.join(' ');
errMsg = addWhitespace(errMsg);
errMsg = addPrefixAssertType(errMsg, bugTag);
errMsg = addPrefixProjectName(errMsg, true);
const internalError = (0, createErrorWithCleanStackTrace_js_1.createErrorWithCleanStackTrace)(errMsg, numberOfStackTraceLinesToRemove);
globalObject.onBeforeLog?.();
throw internalError;
}
function assertUsage(condition, errMsg, { showStackTrace, exitOnError } = {}) {
if (condition)
return;
showStackTrace = showStackTrace || globalObject.alwaysShowStackTrace;
errMsg = addWhitespace(errMsg);
errMsg = addPrefixAssertType(errMsg, 'Wrong Usage');
errMsg = addPrefixProjectName(errMsg);
const usageError = (0, createErrorWithCleanStackTrace_js_1.createErrorWithCleanStackTrace)(errMsg, numberOfStackTraceLinesToRemove);
if (showStackTrace) {
globalObject.showStackTraceList.add(usageError);
}
globalObject.onBeforeLog?.();
if (!exitOnError) {
throw usageError;
}
else {
console.error(showStackTrace ? usageError : errMsg);
process.exit(1);
}
}
function getProjectError(errMsg) {
errMsg = addWhitespace(errMsg);
errMsg = addPrefixAssertType(errMsg, 'Error');
errMsg = addPrefixProjectName(errMsg);
const projectError = (0, createErrorWithCleanStackTrace_js_1.createErrorWithCleanStackTrace)(errMsg, numberOfStackTraceLinesToRemove);
return projectError;
}
function assertWarning(condition, msg, { onlyOnce, showStackTrace }) {
if (condition)
return;
showStackTrace = showStackTrace || globalObject.alwaysShowStackTrace;
msg = addWhitespace(msg);
msg = addPrefixAssertType(msg, 'Warning');
msg = addPrefixProjectName(msg);
if (onlyOnce) {
const { alreadyLogged } = globalObject;
const key = onlyOnce === true ? msg : onlyOnce;
if (alreadyLogged.has(key))
return;
alreadyLogged.add(key);
}
globalObject.onBeforeLog?.();
if (showStackTrace) {
const err = (0, createErrorWithCleanStackTrace_js_1.createErrorWithCleanStackTrace)(msg, numberOfStackTraceLinesToRemove);
globalObject.showStackTraceList.add(err);
globalObject.logger(err, 'warn');
}
else {
globalObject.logger(msg, 'warn');
}
}
function assertInfo(condition, msg, { onlyOnce }) {
if (condition) {
return;
}
msg = addWhitespace(msg);
msg = addPrefixProjectName(msg);
if (onlyOnce) {
const { alreadyLogged } = globalObject;
const key = msg;
if (alreadyLogged.has(key)) {
return;
}
else {
alreadyLogged.add(key);
}
}
globalObject.onBeforeLog?.();
globalObject.logger(msg, 'info');
}
function addOnBeforeLogHook(onBeforeLog) {
globalObject.onBeforeLog = onBeforeLog;
}
function addPrefixAssertType(msg, tag) {
let prefix = `[${tag}]`;
const color = tag === 'Warning' ? 'yellow' : 'red';
prefix = picocolors_1.default.bold(picocolors_1.default[color](prefix));
return `${prefix}${msg}`;
}
function addWhitespace(msg) {
if (msg.startsWith('[')) {
return msg;
}
else {
return ` ${msg}`;
}
}
function addPrefixProjectName(msg, showProjectVersion = false) {
const prefix = showProjectVersion ? projectTagWithVersion : projectTag;
return `${prefix}${msg}`;
}
function getAssertErrMsg(thing) {
let errMsg;
let errStack;
if (typeof thing === 'string') {
errMsg = thing;
}
else if ((0, isObject_js_1.isObject)(thing) && typeof thing.message === 'string' && typeof thing.stack === 'string') {
errMsg = thing.message;
errStack = thing.stack;
}
else {
return null;
}
for (const tag of [projectTagWithVersion, projectTag]) {
const showVikeVersion = tag === projectTagWithVersion;
const errStackPrefix = `Error: ${tag}`;
if (errStack?.startsWith(errStackPrefix)) {
if (globalObject.showStackTraceList.has(thing) || isBug(thing)) {
const assertMsg = errStack.slice(errStackPrefix.length);
return { assertMsg, showVikeVersion };
}
}
else if (errStack?.includes(tag)) {
throw new Error('Internal Vike error');
}
if (errMsg?.startsWith(tag)) {
const assertMsg = errMsg.slice(tag.length);
return { assertMsg, showVikeVersion };
}
}
return null;
}
function overwriteAssertProductionLogger(logger) {
globalObject.logger = logger;
}
function isBug(err) {
return String(err).includes(`[${bugTag}]`);
}
// Called upon `DEBUG=vike:error`
function setAlwaysShowStackTrace() {
globalObject.alwaysShowStackTrace = true;
}