Files
IOT_WEB/node_modules/nostics/dist/reporters/node.mjs
T
2026-08-21 15:36:24 +08:00

45 lines
1.6 KiB
JavaScript

import { appendFileSync } from "node:fs";
//#region src/reporters/node.ts
const DEFAULT_EXCLUDE_STACK_FRAMES = [/\/node_modules\//i];
function applyExcludeStackFrames(raw, exclude) {
const [header, ...frames] = raw.split("\n");
return [header, ...frames.filter((frame) => !exclude.some((re) => re.test(frame)))].join("\n");
}
/**
* Creates a reporter that appends diagnostics as NDJSON to a local file.
* Each diagnostic is written as a single JSON line. The diagnostic's `stack`
* (if present) is included in the payload; noisy frames can be removed via
* {@link FileReporterOptions.excludeStackFrames}.
*
* @example
* ```ts
* import { defineDiagnostics } from 'nostics'
* import { createFileReporter } from 'nostics/reporters/node'
*
* const diagnostics = defineDiagnostics({
* codes: { ... },
* reporters: [createFileReporter({
* excludeStackFrames: [/\/node_modules\//, /\(node:/],
* })],
* })
* ```
*/
/* @__NO_SIDE_EFFECTS__ */
function createFileReporter(options) {
const logFile = options?.logFile ?? ".nostics.log";
const excludeStackFrames = options?.excludeStackFrames ?? DEFAULT_EXCLUDE_STACK_FRAMES;
return (diagnostic) => {
try {
const d = diagnostic;
const base = typeof d.toJSON === "function" ? d.toJSON() : { ...d };
if (d.stack) base.stack = excludeStackFrames?.length ? applyExcludeStackFrames(d.stack, excludeStackFrames) : d.stack;
appendFileSync(logFile, `${JSON.stringify(base)}\n`);
} catch (err) {
console.error(`[nostics]: Failed to write log to "${logFile}":`, err);
}
};
}
//#endregion
export { createFileReporter };
//# sourceMappingURL=node.mjs.map