vike
Version:
The Framework *You* Control - Next.js & Nuxt alternative for unprecedented flexibility and dependability.
124 lines (123 loc) • 5.05 kB
JavaScript
;
// Purpose of this file:
// - Swallow redundant error messages (Vite is buggy and emits the same error multiple times)
// - Prepend "[request(n)]" tag to Vite logs
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.getHttpRequestAsyncStore = getHttpRequestAsyncStore;
exports.installHttpRequestAsyncStore = installHttpRequestAsyncStore;
const renderPage_js_1 = require("../../runtime/renderPage.js");
const utils_js_1 = require("../utils.js");
const transpileAndExecuteFile_js_1 = require("./resolveVikeConfigInternal/transpileAndExecuteFile.js");
const loggerNotProd_js_1 = require("./loggerNotProd.js");
const errorWithCodeSnippet_js_1 = require("./loggerNotProd/errorWithCodeSnippet.js");
const node_util_1 = require("node:util");
(0, utils_js_1.assertIsNotProductionRuntime)();
let asyncLocalStorage = null;
async function installHttpRequestAsyncStore() {
let mod;
try {
mod = await Promise.resolve().then(() => __importStar(require('node:async_hooks')));
}
catch {
return;
}
asyncLocalStorage = new mod.AsyncLocalStorage();
(0, renderPage_js_1.renderPage_addAsyncHookwrapper)(async (httpRequestId, renderPage) => {
(0, utils_js_1.assert)(asyncLocalStorage);
const loggedErrors = new Set();
const markErrorAsLogged = (err) => {
loggedErrors.add(err);
};
const shouldErrorBeSwallowed = (err) => {
if (loggedErrors.has(err) ||
Array.from(loggedErrors).some((errAlreadyLogged) => isEquivalent(err, errAlreadyLogged))) {
// In principle, some random message can be shown between the non-swallowed error and this logErrorDebugNote() call.
// We take a leap of faith that it happens only seldom and that it's worth the risk.
(0, loggerNotProd_js_1.logErrorDebugNote)();
return true;
}
else {
return false;
}
};
const store = {
httpRequestId,
markErrorAsLogged,
shouldErrorBeSwallowed,
errorDebugNoteAlreadyShown: false,
};
const pageContextReturn = await asyncLocalStorage.run(store, renderPage);
return { pageContextReturn };
});
return;
}
function getHttpRequestAsyncStore() {
if (asyncLocalStorage === null)
return null;
const store = asyncLocalStorage.getStore();
(0, utils_js_1.assert)(store === undefined || (0, utils_js_1.isObject)(store));
return store;
}
function isEquivalent(err1, err2) {
if (err1 === err2)
return true;
if (!(0, utils_js_1.isObject)(err1) || !(0, utils_js_1.isObject)(err2))
return false;
{
const errMsgFormatted1 = (0, transpileAndExecuteFile_js_1.getConfigBuildErrorFormatted)(err1);
const errMsgFormatted2 = (0, transpileAndExecuteFile_js_1.getConfigBuildErrorFormatted)(err2);
if (errMsgFormatted1 && errMsgFormatted1 === errMsgFormatted2)
return true;
}
if ((0, errorWithCodeSnippet_js_1.isEquivalentErrorWithCodeSnippet)(err1, err2))
return true;
if ((0, utils_js_1.unique)([
// error.message and error.stack aren't enumerable and therefore not listed by Object.keys()
'message',
'stack',
...Object.keys(err1),
...Object.keys(err2),
]).every((k) => {
// isDeepStrictEqual() need to compare error.position which is an object.
if ((0, node_util_1.isDeepStrictEqual)(err1[k], err2[k]))
return true;
// console.log('diff', k)
return false;
})) {
return true;
}
return false;
}