UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

55 lines (54 loc) 1.66 kB
import { createHash } from "node:crypto"; import { stringify } from "safe-stable-stringify"; //#region lib/logger/once.ts /** * Get the single frame of this function's callers stack. * * @param omitFn Starting from this function, stack frames will be ignored. * @returns The string containing file name, line number and column name. * * @example getCallSite() // => 'Object.<anonymous> (/path/to/file.js:10:15)' */ function getCallSite(omitFn) { const stackTraceLimitOrig = Error.stackTraceLimit; const prepareStackTraceOrig = Error.prepareStackTrace; let result = null; try { const res = { stack: [] }; Error.stackTraceLimit = 1; Error.prepareStackTrace = (_err, stack) => stack; Error.captureStackTrace(res, omitFn); const [callsite] = res.stack; // v8 ignore else -- TODO: add test #40625 if (callsite) result = callsite.toString(); } catch {} finally { Error.stackTraceLimit = stackTraceLimitOrig; Error.prepareStackTrace = prepareStackTraceOrig; } return result; } const keys = /* @__PURE__ */ new Set(); function once(callback, omitFn = once, p1, p2) { const callsite = getCallSite(omitFn); /* v8 ignore next 3 -- should not happen */ if (!callsite) return; const key = `${callsite}|${hashParams(p1, p2)}`; if (!keys.has(key)) { keys.add(key); callback(); } } /** * Before processing each repository, * all keys are supposed to be reset. */ function reset() { keys.clear(); } function hashParams(p1, p2) { const data = p2 === void 0 ? stringify(p1) : `${stringify(p1)}|${stringify(p2)}`; return createHash("sha256").update(data).digest("hex"); } //#endregion export { once, reset }; //# sourceMappingURL=once.js.map