@logtape/testing 2.3.0-dev.816 → 2.3.0-dev.818

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/reporter.cjs CHANGED
@@ -30,35 +30,37 @@ function createFailureLogReporter(options = {}) {
30
30
  const mode = options.mode ?? "on-failure";
31
31
  const lowestLevel = options.lowestLevel ?? "info";
32
32
  const outputSink = options.sink ?? (0, __logtape_logtape.getConsoleSink)({ formatter: options.formatter });
33
- return {
34
- wrap(callback) {
35
- return (...args) => this.run(() => callback(...args));
36
- },
37
- async run(callback) {
38
- const records = [];
39
- const bufferSink = (record) => {
40
- records.push(require_snapshot.materializeLogRecord(record));
41
- };
42
- let result;
43
- try {
44
- result = await (0, __logtape_logtape.withConfig)({
45
- sinks: { failureLogReporter: bufferSink },
46
- loggers: [{
47
- category: [],
48
- lowestLevel,
49
- parentSinks: "override",
50
- sinks: ["failureLogReporter"]
51
- }]
52
- }, callback);
53
- } catch (error) {
54
- if (mode !== "never") try {
55
- flushRecords(records, outputSink);
56
- } catch {}
57
- throw error;
58
- }
59
- if (mode === "always") flushRecords(records, outputSink);
60
- return result;
33
+ async function run(callback) {
34
+ const records = [];
35
+ const bufferSink = (record) => {
36
+ records.push(require_snapshot.materializeLogRecord(record));
37
+ };
38
+ let result;
39
+ try {
40
+ result = await (0, __logtape_logtape.withConfig)({
41
+ sinks: { failureLogReporter: bufferSink },
42
+ loggers: [{
43
+ category: [],
44
+ lowestLevel,
45
+ parentSinks: "override",
46
+ sinks: ["failureLogReporter"]
47
+ }]
48
+ }, callback);
49
+ } catch (error) {
50
+ if (mode !== "never") try {
51
+ flushRecords(records, outputSink);
52
+ } catch {}
53
+ throw error;
61
54
  }
55
+ if (mode === "always") flushRecords(records, outputSink);
56
+ return result;
57
+ }
58
+ function wrap(callback) {
59
+ return (...args) => run(() => callback(...args));
60
+ }
61
+ return {
62
+ run,
63
+ wrap
62
64
  };
63
65
  }
64
66
  function flushRecords(records, sink) {
package/dist/reporter.js CHANGED
@@ -29,35 +29,37 @@ function createFailureLogReporter(options = {}) {
29
29
  const mode = options.mode ?? "on-failure";
30
30
  const lowestLevel = options.lowestLevel ?? "info";
31
31
  const outputSink = options.sink ?? getConsoleSink({ formatter: options.formatter });
32
- return {
33
- wrap(callback) {
34
- return (...args) => this.run(() => callback(...args));
35
- },
36
- async run(callback) {
37
- const records = [];
38
- const bufferSink = (record) => {
39
- records.push(materializeLogRecord(record));
40
- };
41
- let result;
42
- try {
43
- result = await withConfig({
44
- sinks: { failureLogReporter: bufferSink },
45
- loggers: [{
46
- category: [],
47
- lowestLevel,
48
- parentSinks: "override",
49
- sinks: ["failureLogReporter"]
50
- }]
51
- }, callback);
52
- } catch (error) {
53
- if (mode !== "never") try {
54
- flushRecords(records, outputSink);
55
- } catch {}
56
- throw error;
57
- }
58
- if (mode === "always") flushRecords(records, outputSink);
59
- return result;
32
+ async function run(callback) {
33
+ const records = [];
34
+ const bufferSink = (record) => {
35
+ records.push(materializeLogRecord(record));
36
+ };
37
+ let result;
38
+ try {
39
+ result = await withConfig({
40
+ sinks: { failureLogReporter: bufferSink },
41
+ loggers: [{
42
+ category: [],
43
+ lowestLevel,
44
+ parentSinks: "override",
45
+ sinks: ["failureLogReporter"]
46
+ }]
47
+ }, callback);
48
+ } catch (error) {
49
+ if (mode !== "never") try {
50
+ flushRecords(records, outputSink);
51
+ } catch {}
52
+ throw error;
60
53
  }
54
+ if (mode === "always") flushRecords(records, outputSink);
55
+ return result;
56
+ }
57
+ function wrap(callback) {
58
+ return (...args) => run(() => callback(...args));
59
+ }
60
+ return {
61
+ run,
62
+ wrap
61
63
  };
62
64
  }
63
65
  function flushRecords(records, sink) {
@@ -1 +1 @@
1
- {"version":3,"file":"reporter.js","names":["options: FailureLogReporterOptions","callback: (...args: TArgs) => TResult","callback: () => TResult","records: LogRecord[]","bufferSink: Sink","record: LogRecord","result: Awaited<TResult>","records: readonly LogRecord[]","sink: Sink"],"sources":["../src/reporter.ts"],"sourcesContent":["import {\n getConsoleSink,\n type LogLevel,\n type LogRecord,\n type Sink,\n type TextFormatter,\n withConfig,\n} from \"@logtape/logtape\";\n\nimport { materializeLogRecord } from \"./snapshot.ts\";\n\n/**\n * Controls when buffered records are reported by a\n * {@link FailureLogReporter}.\n *\n * @since 2.3.0\n */\nexport type FailureLogReportMode = \"on-failure\" | \"always\" | \"never\";\n\n/**\n * Options for {@link createFailureLogReporter}.\n *\n * @since 2.3.0\n */\nexport interface FailureLogReporterOptions {\n /**\n * When to report buffered records. Defaults to `\"on-failure\"`.\n */\n readonly mode?: FailureLogReportMode;\n\n /**\n * The lowest severity level collected by the reporter's scoped\n * configuration. Defaults to `\"info\"`.\n */\n readonly lowestLevel?: LogLevel;\n\n /**\n * The sink that receives buffered records when the reporter flushes.\n * Defaults to a console sink.\n */\n readonly sink?: Sink;\n\n /**\n * The text formatter used by the default console sink.\n */\n readonly formatter?: TextFormatter;\n}\n\n/**\n * A reporter that buffers LogTape records while a test callback runs and\n * reports them depending on the configured mode.\n *\n * @since 2.3.0\n */\nexport interface FailureLogReporter {\n /**\n * Wraps a callback so matching LogTape records are reported according to the\n * configured mode.\n *\n * @param callback The test callback to wrap.\n * @returns An async callback with the same parameters.\n */\n wrap<TArgs extends readonly unknown[], TResult>(\n callback: (...args: TArgs) => TResult,\n ): (...args: TArgs) => Promise<Awaited<TResult>>;\n\n /**\n * Runs a callback and reports matching LogTape records according to the\n * configured mode.\n *\n * @param callback The callback to run.\n * @returns The callback result.\n */\n run<TResult>(callback: () => TResult): Promise<Awaited<TResult>>;\n}\n\n/**\n * Creates a failure log reporter for tests.\n *\n * The reporter uses LogTape's scoped configuration support. The process-wide\n * configuration must already include `Config.contextLocalStorage`, but the\n * reporter does not mutate global logger routing while a wrapped callback\n * runs.\n *\n * @example\n * ```ts\n * import { createFailureLogReporter } from \"@logtape/testing/reporter\";\n *\n * const reporter = createFailureLogReporter({ lowestLevel: \"debug\" });\n *\n * test(\"case\", reporter.wrap(async () => {\n * // Logs emitted here are reported only if this callback throws.\n * }));\n * ```\n *\n * @param options Reporter options.\n * @returns A failure log reporter.\n * @since 2.3.0\n */\nexport function createFailureLogReporter(\n options: FailureLogReporterOptions = {},\n): FailureLogReporter {\n const mode = options.mode ?? \"on-failure\";\n const lowestLevel = options.lowestLevel ?? \"info\";\n const outputSink = options.sink ?? getConsoleSink({\n formatter: options.formatter,\n });\n\n return {\n wrap<TArgs extends readonly unknown[], TResult>(\n callback: (...args: TArgs) => TResult,\n ): (...args: TArgs) => Promise<Awaited<TResult>> {\n return (...args: TArgs) => this.run(() => callback(...args));\n },\n async run<TResult>(callback: () => TResult): Promise<Awaited<TResult>> {\n const records: LogRecord[] = [];\n const bufferSink: Sink = (record: LogRecord): void => {\n records.push(materializeLogRecord(record));\n };\n\n let result: Awaited<TResult>;\n try {\n result = await withConfig({\n sinks: { failureLogReporter: bufferSink },\n loggers: [{\n category: [],\n lowestLevel,\n parentSinks: \"override\",\n sinks: [\"failureLogReporter\"],\n }],\n }, callback);\n } catch (error) {\n if (mode !== \"never\") {\n try {\n flushRecords(records, outputSink);\n } catch {\n // Keep the test runner focused on the original assertion error.\n }\n }\n throw error;\n }\n\n if (mode === \"always\") flushRecords(records, outputSink);\n return result;\n },\n };\n}\n\nfunction flushRecords(\n records: readonly LogRecord[],\n sink: Sink,\n): void {\n for (const record of records) sink(record);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAmGA,SAAgB,yBACdA,UAAqC,CAAE,GACnB;CACpB,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,aAAa,QAAQ,QAAQ,eAAe,EAChD,WAAW,QAAQ,UACpB,EAAC;AAEF,QAAO;EACL,KACEC,UAC+C;AAC/C,UAAO,CAAC,GAAG,SAAgB,KAAK,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC;EAC7D;EACD,MAAM,IAAaC,UAAoD;GACrE,MAAMC,UAAuB,CAAE;GAC/B,MAAMC,aAAmB,CAACC,WAA4B;AACpD,YAAQ,KAAK,qBAAqB,OAAO,CAAC;GAC3C;GAED,IAAIC;AACJ,OAAI;AACF,aAAS,MAAM,WAAW;KACxB,OAAO,EAAE,oBAAoB,WAAY;KACzC,SAAS,CAAC;MACR,UAAU,CAAE;MACZ;MACA,aAAa;MACb,OAAO,CAAC,oBAAqB;KAC9B,CAAC;IACH,GAAE,SAAS;GACb,SAAQ,OAAO;AACd,QAAI,SAAS,QACX,KAAI;AACF,kBAAa,SAAS,WAAW;IAClC,QAAO,CAEP;AAEH,UAAM;GACP;AAED,OAAI,SAAS,SAAU,cAAa,SAAS,WAAW;AACxD,UAAO;EACR;CACF;AACF;AAED,SAAS,aACPC,SACAC,MACM;AACN,MAAK,MAAM,UAAU,QAAS,MAAK,OAAO;AAC3C"}
1
+ {"version":3,"file":"reporter.js","names":["options: FailureLogReporterOptions","callback: () => TResult","records: LogRecord[]","bufferSink: Sink","record: LogRecord","result: Awaited<TResult>","callback: (...args: TArgs) => TResult","records: readonly LogRecord[]","sink: Sink"],"sources":["../src/reporter.ts"],"sourcesContent":["import {\n getConsoleSink,\n type LogLevel,\n type LogRecord,\n type Sink,\n type TextFormatter,\n withConfig,\n} from \"@logtape/logtape\";\n\nimport { materializeLogRecord } from \"./snapshot.ts\";\n\n/**\n * Controls when buffered records are reported by a\n * {@link FailureLogReporter}.\n *\n * @since 2.3.0\n */\nexport type FailureLogReportMode = \"on-failure\" | \"always\" | \"never\";\n\n/**\n * Options for {@link createFailureLogReporter}.\n *\n * @since 2.3.0\n */\nexport interface FailureLogReporterOptions {\n /**\n * When to report buffered records. Defaults to `\"on-failure\"`.\n */\n readonly mode?: FailureLogReportMode;\n\n /**\n * The lowest severity level collected by the reporter's scoped\n * configuration. Defaults to `\"info\"`.\n */\n readonly lowestLevel?: LogLevel;\n\n /**\n * The sink that receives buffered records when the reporter flushes.\n * Defaults to a console sink.\n */\n readonly sink?: Sink;\n\n /**\n * The text formatter used by the default console sink.\n */\n readonly formatter?: TextFormatter;\n}\n\n/**\n * A reporter that buffers LogTape records while a test callback runs and\n * reports them depending on the configured mode.\n *\n * @since 2.3.0\n */\nexport interface FailureLogReporter {\n /**\n * Wraps a callback so matching LogTape records are reported according to the\n * configured mode.\n *\n * @param callback The test callback to wrap.\n * @returns An async callback with the same parameters.\n */\n wrap<TArgs extends readonly unknown[], TResult>(\n callback: (...args: TArgs) => TResult,\n ): (...args: TArgs) => Promise<Awaited<TResult>>;\n\n /**\n * Runs a callback and reports matching LogTape records according to the\n * configured mode.\n *\n * @param callback The callback to run.\n * @returns The callback result.\n */\n run<TResult>(callback: () => TResult): Promise<Awaited<TResult>>;\n}\n\n/**\n * Creates a failure log reporter for tests.\n *\n * The reporter uses LogTape's scoped configuration support. The process-wide\n * configuration must already include `Config.contextLocalStorage`, but the\n * reporter does not mutate global logger routing while a wrapped callback\n * runs.\n *\n * @example\n * ```ts\n * import { createFailureLogReporter } from \"@logtape/testing/reporter\";\n *\n * const reporter = createFailureLogReporter({ lowestLevel: \"debug\" });\n *\n * test(\"case\", reporter.wrap(async () => {\n * // Logs emitted here are reported only if this callback throws.\n * }));\n * ```\n *\n * @param options Reporter options.\n * @returns A failure log reporter.\n * @since 2.3.0\n */\nexport function createFailureLogReporter(\n options: FailureLogReporterOptions = {},\n): FailureLogReporter {\n const mode = options.mode ?? \"on-failure\";\n const lowestLevel = options.lowestLevel ?? \"info\";\n const outputSink = options.sink ?? getConsoleSink({\n formatter: options.formatter,\n });\n\n async function run<TResult>(\n callback: () => TResult,\n ): Promise<Awaited<TResult>> {\n const records: LogRecord[] = [];\n const bufferSink: Sink = (record: LogRecord): void => {\n records.push(materializeLogRecord(record));\n };\n\n let result: Awaited<TResult>;\n try {\n result = await withConfig({\n sinks: { failureLogReporter: bufferSink },\n loggers: [{\n category: [],\n lowestLevel,\n parentSinks: \"override\",\n sinks: [\"failureLogReporter\"],\n }],\n }, callback);\n } catch (error) {\n if (mode !== \"never\") {\n try {\n flushRecords(records, outputSink);\n } catch {\n // Keep the test runner focused on the original assertion error.\n }\n }\n throw error;\n }\n\n if (mode === \"always\") flushRecords(records, outputSink);\n return result;\n }\n\n function wrap<TArgs extends readonly unknown[], TResult>(\n callback: (...args: TArgs) => TResult,\n ): (...args: TArgs) => Promise<Awaited<TResult>> {\n return (...args: TArgs) => run(() => callback(...args));\n }\n\n return {\n run,\n wrap,\n };\n}\n\nfunction flushRecords(\n records: readonly LogRecord[],\n sink: Sink,\n): void {\n for (const record of records) sink(record);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAmGA,SAAgB,yBACdA,UAAqC,CAAE,GACnB;CACpB,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,cAAc,QAAQ,eAAe;CAC3C,MAAM,aAAa,QAAQ,QAAQ,eAAe,EAChD,WAAW,QAAQ,UACpB,EAAC;CAEF,eAAe,IACbC,UAC2B;EAC3B,MAAMC,UAAuB,CAAE;EAC/B,MAAMC,aAAmB,CAACC,WAA4B;AACpD,WAAQ,KAAK,qBAAqB,OAAO,CAAC;EAC3C;EAED,IAAIC;AACJ,MAAI;AACF,YAAS,MAAM,WAAW;IACxB,OAAO,EAAE,oBAAoB,WAAY;IACzC,SAAS,CAAC;KACR,UAAU,CAAE;KACZ;KACA,aAAa;KACb,OAAO,CAAC,oBAAqB;IAC9B,CAAC;GACH,GAAE,SAAS;EACb,SAAQ,OAAO;AACd,OAAI,SAAS,QACX,KAAI;AACF,iBAAa,SAAS,WAAW;GAClC,QAAO,CAEP;AAEH,SAAM;EACP;AAED,MAAI,SAAS,SAAU,cAAa,SAAS,WAAW;AACxD,SAAO;CACR;CAED,SAAS,KACPC,UAC+C;AAC/C,SAAO,CAAC,GAAG,SAAgB,IAAI,MAAM,SAAS,GAAG,KAAK,CAAC;CACxD;AAED,QAAO;EACL;EACA;CACD;AACF;AAED,SAAS,aACPC,SACAC,MACM;AACN,MAAK,MAAM,UAAU,QAAS,MAAK,OAAO;AAC3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logtape/testing",
3
- "version": "2.3.0-dev.816+ea280fdb",
3
+ "version": "2.3.0-dev.818+d457bb3c",
4
4
  "description": "Testing utilities for collecting and asserting LogTape records",
5
5
  "keywords": [
6
6
  "logging",
@@ -64,12 +64,12 @@
64
64
  "dist/"
65
65
  ],
66
66
  "peerDependencies": {
67
- "@logtape/logtape": "^2.3.0-dev.816+ea280fdb"
67
+ "@logtape/logtape": "^2.3.0-dev.818+d457bb3c"
68
68
  },
69
69
  "devDependencies": {
70
70
  "tsdown": "^0.12.7",
71
71
  "typescript": "^5.8.3",
72
- "@logtape/redaction": "^2.3.0-dev.816+ea280fdb"
72
+ "@logtape/redaction": "^2.3.0-dev.818+d457bb3c"
73
73
  },
74
74
  "scripts": {
75
75
  "build": "tsdown",