@fgv/ts-utils 5.0.1-1 → 5.0.1-2

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.
@@ -1114,7 +1114,7 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1114
1114
  /**
1115
1115
  * {@inheritdoc IResult.report}
1116
1116
  */
1117
- report(reporter?: IResultReporter<T, TD>, options?: IResultReportOptions<TD>): this;
1117
+ report(reporter?: IResultReporter<T, unknown>, options?: IResultReportOptions<unknown>): DetailedFailure<T, TD>;
1118
1118
  orThrow(logOrFormat?: IResultLogger<TD> | ErrorFormatter<TD>): never;
1119
1119
  orThrow(cb: ErrorFormatter): never;
1120
1120
  /**
@@ -1206,7 +1206,7 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1206
1206
  /**
1207
1207
  * {@inheritdoc IResult.report}
1208
1208
  */
1209
- report(reporter?: IResultReporter<T, TD>, options?: IResultReportOptions<TD>): this;
1209
+ report(reporter?: IResultReporter<T, unknown>, options?: IResultReportOptions<unknown>): DetailedSuccess<T, TD>;
1210
1210
  /**
1211
1211
  * Creates a {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied value and
1212
1212
  * optional detail.
@@ -1406,7 +1406,7 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1406
1406
  /**
1407
1407
  * {@inheritdoc IResult.report}
1408
1408
  */
1409
- report(reporter?: IResultReporter<T>, options?: IResultReportOptions): this;
1409
+ report(reporter?: IResultReporter<T>, options?: IResultReportOptions<unknown>): Failure<T>;
1410
1410
  /**
1411
1411
  * Get a 'friendly' string representation of this object.
1412
1412
  * @remarks
@@ -1967,6 +1967,16 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1967
1967
  toString(separator?: string): string;
1968
1968
  }
1969
1969
 
1970
+ /**
1971
+ * Details for reporting a message.
1972
+ * @public
1973
+ */
1974
+ export declare interface IMessageReportDetail<TD = unknown> {
1975
+ level?: MessageLogLevel;
1976
+ message?: ErrorFormatter<TD>;
1977
+ detail?: TD;
1978
+ }
1979
+
1970
1980
  /**
1971
1981
  * Infers the type that will be returned by an instantiated converter. Works
1972
1982
  * for complex as well as simple types.
@@ -2345,7 +2355,7 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2345
2355
  * @param reporter - The {@link IResultReporter | reporter} to which the result will be reported.
2346
2356
  * @param options - The {@link IResultReportOptions | options} for reporting the result.
2347
2357
  */
2348
- report(reporter?: IResultReporter<T>, options?: IResultReportOptions): this;
2358
+ report(reporter?: IResultReporter<T>, options?: IResultReportOptions<unknown>): Result<T>;
2349
2359
  }
2350
2360
 
2351
2361
  /**
@@ -2382,7 +2392,7 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2382
2392
  * @public
2383
2393
  */
2384
2394
  export declare interface IResultReporter<T, TD = unknown> {
2385
- reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
2395
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD, message?: ErrorFormatter<TD>): void;
2386
2396
  reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
2387
2397
  }
2388
2398
 
@@ -2394,15 +2404,11 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2394
2404
  /**
2395
2405
  * The level of reporting to be used for failure results. Default is 'error'.
2396
2406
  */
2397
- failure?: MessageLogLevel;
2407
+ failure?: MessageLogLevel | IMessageReportDetail<TD>;
2398
2408
  /**
2399
2409
  * The level of reporting to be used for success results. Default is 'quiet'.
2400
2410
  */
2401
- success?: MessageLogLevel;
2402
- /**
2403
- * The error formatter to be used for reporting an error result.
2404
- */
2405
- message?: ErrorFormatter<TD>;
2411
+ success?: MessageLogLevel | IMessageReportDetail<TD>;
2406
2412
  }
2407
2413
 
2408
2414
  /**
@@ -2681,10 +2687,10 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2681
2687
  */
2682
2688
  declare class LogReporter<T, TD = unknown> implements ILogger, IResultReporter<T, TD> {
2683
2689
  /**
2684
- * The logger to wrap.
2685
- * @internal
2690
+ * Base logger used to by this reporter.
2691
+ * @public
2686
2692
  */
2687
- protected readonly _logger: ILogger;
2693
+ readonly logger: ILogger;
2688
2694
  /**
2689
2695
  * The formatter to use for values.
2690
2696
  * @internal
@@ -2727,11 +2733,17 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2727
2733
  /**
2728
2734
  * {@inheritDoc IResultReporter.reportSuccess}
2729
2735
  */
2730
- reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
2736
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD, message?: ErrorFormatter<TD>): void;
2731
2737
  /**
2732
2738
  * {@inheritDoc IResultReporter.reportFailure}
2733
2739
  */
2734
2740
  reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
2741
+ /**
2742
+ * Creates a new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.
2743
+ * @param valueFormatter - The value formatter to use.
2744
+ * @returns A new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.
2745
+ */
2746
+ withValueFormatter<TN>(valueFormatter: LogValueFormatter<TN, TD>): LogReporter<TN, TD>;
2735
2747
  /**
2736
2748
  * Generic method to try to format an object for logging.
2737
2749
  * @param value - The value to format.
@@ -4232,7 +4244,7 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
4232
4244
  /**
4233
4245
  * {@inheritdoc IResult.report}
4234
4246
  */
4235
- report(reporter?: IResultReporter<T>, options?: IResultReportOptions): this;
4247
+ report(reporter?: IResultReporter<T>, options?: IResultReportOptions<unknown>): Success<T>;
4236
4248
  /**
4237
4249
  * Creates a {@link Success | Success<T>} with the supplied value.
4238
4250
  * @param value - The value to be returned.
@@ -58,6 +58,15 @@ export interface IResultLogger<TD = unknown> {
58
58
  * @public
59
59
  */
60
60
  export type MessageLogLevel = 'quiet' | 'detail' | 'info' | 'warning' | 'error';
61
+ /**
62
+ * Details for reporting a message.
63
+ * @public
64
+ */
65
+ export interface IMessageReportDetail<TD = unknown> {
66
+ level?: MessageLogLevel;
67
+ message?: ErrorFormatter<TD>;
68
+ detail?: TD;
69
+ }
61
70
  /**
62
71
  * Options for reporting a result.
63
72
  * @public
@@ -66,22 +75,18 @@ export interface IResultReportOptions<TD = unknown> {
66
75
  /**
67
76
  * The level of reporting to be used for failure results. Default is 'error'.
68
77
  */
69
- failure?: MessageLogLevel;
78
+ failure?: MessageLogLevel | IMessageReportDetail<TD>;
70
79
  /**
71
80
  * The level of reporting to be used for success results. Default is 'quiet'.
72
81
  */
73
- success?: MessageLogLevel;
74
- /**
75
- * The error formatter to be used for reporting an error result.
76
- */
77
- message?: ErrorFormatter<TD>;
82
+ success?: MessageLogLevel | IMessageReportDetail<TD>;
78
83
  }
79
84
  /**
80
85
  * Interface for reporting a result.
81
86
  * @public
82
87
  */
83
88
  export interface IResultReporter<T, TD = unknown> {
84
- reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
89
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD, message?: ErrorFormatter<TD>): void;
85
90
  reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
86
91
  }
87
92
  /**
@@ -286,7 +291,7 @@ export interface IResult<T> {
286
291
  * @param reporter - The {@link IResultReporter | reporter} to which the result will be reported.
287
292
  * @param options - The {@link IResultReportOptions | options} for reporting the result.
288
293
  */
289
- report(reporter?: IResultReporter<T>, options?: IResultReportOptions): this;
294
+ report(reporter?: IResultReporter<T>, options?: IResultReportOptions<unknown>): Result<T>;
290
295
  }
291
296
  /**
292
297
  * Reports a successful {@link IResult | result} from some operation and the
@@ -376,7 +381,7 @@ export declare class Success<T> implements IResult<T> {
376
381
  /**
377
382
  * {@inheritdoc IResult.report}
378
383
  */
379
- report(reporter?: IResultReporter<T>, options?: IResultReportOptions): this;
384
+ report(reporter?: IResultReporter<T>, options?: IResultReportOptions<unknown>): Success<T>;
380
385
  /**
381
386
  * Creates a {@link Success | Success<T>} with the supplied value.
382
387
  * @param value - The value to be returned.
@@ -472,7 +477,7 @@ export declare class Failure<T> implements IResult<T> {
472
477
  /**
473
478
  * {@inheritdoc IResult.report}
474
479
  */
475
- report(reporter?: IResultReporter<T>, options?: IResultReportOptions): this;
480
+ report(reporter?: IResultReporter<T>, options?: IResultReportOptions<unknown>): Failure<T>;
476
481
  /**
477
482
  * Get a 'friendly' string representation of this object.
478
483
  * @remarks
@@ -598,7 +603,7 @@ export declare class DetailedSuccess<T, TD> extends Success<T> {
598
603
  /**
599
604
  * {@inheritdoc IResult.report}
600
605
  */
601
- report(reporter?: IResultReporter<T, TD>, options?: IResultReportOptions<TD>): this;
606
+ report(reporter?: IResultReporter<T, unknown>, options?: IResultReportOptions<unknown>): DetailedSuccess<T, TD>;
602
607
  /**
603
608
  * Creates a {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied value and
604
609
  * optional detail.
@@ -668,7 +673,7 @@ export declare class DetailedFailure<T, TD> extends Failure<T> {
668
673
  /**
669
674
  * {@inheritdoc IResult.report}
670
675
  */
671
- report(reporter?: IResultReporter<T, TD>, options?: IResultReportOptions<TD>): this;
676
+ report(reporter?: IResultReporter<T, unknown>, options?: IResultReportOptions<unknown>): DetailedFailure<T, TD>;
672
677
  orThrow(logOrFormat?: IResultLogger<TD> | ErrorFormatter<TD>): never;
673
678
  orThrow(cb: ErrorFormatter): never;
674
679
  /**
@@ -145,8 +145,9 @@ class Success {
145
145
  */
146
146
  report(reporter, options) {
147
147
  var _a;
148
- const level = (_a = options === null || options === void 0 ? void 0 : options.success) !== null && _a !== void 0 ? _a : 'quiet';
149
- reporter === null || reporter === void 0 ? void 0 : reporter.reportSuccess(level, this._value);
148
+ const successOptions = typeof (options === null || options === void 0 ? void 0 : options.success) === 'object' ? options.success : { level: options === null || options === void 0 ? void 0 : options.success };
149
+ const level = (_a = successOptions.level) !== null && _a !== void 0 ? _a : 'quiet';
150
+ reporter === null || reporter === void 0 ? void 0 : reporter.reportSuccess(level, this._value, undefined, successOptions.message);
150
151
  return this;
151
152
  }
152
153
  /**
@@ -272,8 +273,9 @@ class Failure {
272
273
  */
273
274
  report(reporter, options) {
274
275
  var _a, _b, _c;
275
- const level = (_a = options === null || options === void 0 ? void 0 : options.failure) !== null && _a !== void 0 ? _a : 'error';
276
- const message = (_c = (_b = options === null || options === void 0 ? void 0 : options.message) === null || _b === void 0 ? void 0 : _b.call(options, this._message)) !== null && _c !== void 0 ? _c : this._message;
276
+ const failureOptions = typeof (options === null || options === void 0 ? void 0 : options.failure) === 'object' ? options.failure : { level: options === null || options === void 0 ? void 0 : options.failure };
277
+ const level = (_a = failureOptions.level) !== null && _a !== void 0 ? _a : 'error';
278
+ const message = (_c = (_b = failureOptions.message) === null || _b === void 0 ? void 0 : _b.call(failureOptions, this._message)) !== null && _c !== void 0 ? _c : this._message;
277
279
  reporter === null || reporter === void 0 ? void 0 : reporter.reportFailure(level, message);
278
280
  return this;
279
281
  }
@@ -411,8 +413,11 @@ class DetailedSuccess extends Success {
411
413
  */
412
414
  report(reporter, options) {
413
415
  var _a;
414
- const level = (_a = options === null || options === void 0 ? void 0 : options.success) !== null && _a !== void 0 ? _a : 'quiet';
415
- reporter === null || reporter === void 0 ? void 0 : reporter.reportSuccess(level, this._value, this._detail);
416
+ const successOptions = typeof (options === null || options === void 0 ? void 0 : options.success) === 'object' ? options.success : { level: options === null || options === void 0 ? void 0 : options.success };
417
+ const level = (_a = successOptions.level) !== null && _a !== void 0 ? _a : 'quiet';
418
+ // Cast reporter to preserve detail type when calling reportSuccess
419
+ const detailedReporter = reporter;
420
+ detailedReporter === null || detailedReporter === void 0 ? void 0 : detailedReporter.reportSuccess(level, this._value, this._detail, successOptions.message);
416
421
  return this;
417
422
  }
418
423
  /**
@@ -503,10 +508,15 @@ class DetailedFailure extends Failure {
503
508
  * {@inheritdoc IResult.report}
504
509
  */
505
510
  report(reporter, options) {
506
- var _a, _b, _c;
507
- const level = (_a = options === null || options === void 0 ? void 0 : options.failure) !== null && _a !== void 0 ? _a : 'error';
508
- const message = (_c = (_b = options === null || options === void 0 ? void 0 : options.message) === null || _b === void 0 ? void 0 : _b.call(options, this._message, this._detail)) !== null && _c !== void 0 ? _c : this._message;
509
- reporter === null || reporter === void 0 ? void 0 : reporter.reportFailure(level, message, this._detail);
511
+ var _a, _b;
512
+ const failureOptions = typeof (options === null || options === void 0 ? void 0 : options.failure) === 'object' ? options.failure : { level: options === null || options === void 0 ? void 0 : options.failure };
513
+ const level = (_a = failureOptions.level) !== null && _a !== void 0 ? _a : 'error';
514
+ // Cast formatter to handle detail type properly
515
+ const formatter = failureOptions.message;
516
+ const message = (_b = formatter === null || formatter === void 0 ? void 0 : formatter(this._message, this._detail)) !== null && _b !== void 0 ? _b : this._message;
517
+ // Cast reporter to preserve detail type when calling reportFailure
518
+ const detailedReporter = reporter;
519
+ detailedReporter === null || detailedReporter === void 0 ? void 0 : detailedReporter.reportFailure(level, message, this._detail);
510
520
  return this;
511
521
  }
512
522
  orThrow(logOrFormat) {
@@ -1,5 +1,5 @@
1
1
  import { ILogger, ReporterLogLevel } from './logger';
2
- import { IResultReporter, MessageLogLevel, Success } from '../base';
2
+ import { ErrorFormatter, IResultReporter, MessageLogLevel, Success } from '../base';
3
3
  /**
4
4
  * A function that formats a value for logging.
5
5
  * @public
@@ -26,10 +26,10 @@ export interface ILogReporterCreateParams<T, TD = unknown> {
26
26
  */
27
27
  export declare class LogReporter<T, TD = unknown> implements ILogger, IResultReporter<T, TD> {
28
28
  /**
29
- * The logger to wrap.
30
- * @internal
29
+ * Base logger used to by this reporter.
30
+ * @public
31
31
  */
32
- protected readonly _logger: ILogger;
32
+ readonly logger: ILogger;
33
33
  /**
34
34
  * The formatter to use for values.
35
35
  * @internal
@@ -72,11 +72,17 @@ export declare class LogReporter<T, TD = unknown> implements ILogger, IResultRep
72
72
  /**
73
73
  * {@inheritDoc IResultReporter.reportSuccess}
74
74
  */
75
- reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
75
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD, message?: ErrorFormatter<TD>): void;
76
76
  /**
77
77
  * {@inheritDoc IResultReporter.reportFailure}
78
78
  */
79
79
  reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
80
+ /**
81
+ * Creates a new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.
82
+ * @param valueFormatter - The value formatter to use.
83
+ * @returns A new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.
84
+ */
85
+ withValueFormatter<TN>(valueFormatter: LogValueFormatter<TN, TD>): LogReporter<TN, TD>;
80
86
  /**
81
87
  * Generic method to try to format an object for logging.
82
88
  * @param value - The value to format.
@@ -37,7 +37,7 @@ class LogReporter {
37
37
  var _a, _b, _c;
38
38
  /* c8 ignore next 1 */
39
39
  params = params !== null && params !== void 0 ? params : {};
40
- this._logger = (_a = params.logger) !== null && _a !== void 0 ? _a : new logger_1.NoOpLogger();
40
+ this.logger = (_a = params.logger) !== null && _a !== void 0 ? _a : new logger_1.NoOpLogger();
41
41
  this._valueFormatter = (_b = params.valueFormatter) !== null && _b !== void 0 ? _b : LogReporter.tryFormatObject;
42
42
  this._messageFormatter = (_c = params.messageFormatter) !== null && _c !== void 0 ? _c : ((message, __detail) => message);
43
43
  }
@@ -45,43 +45,44 @@ class LogReporter {
45
45
  * {@inheritDoc Logging.ILogger.logLevel}
46
46
  */
47
47
  get logLevel() {
48
- return this._logger.logLevel;
48
+ return this.logger.logLevel;
49
49
  }
50
50
  /**
51
51
  * {@inheritDoc Logging.ILogger.detail}
52
52
  */
53
53
  detail(message, ...parameters) {
54
- return this._logger.detail(message, ...parameters);
54
+ return this.logger.detail(message, ...parameters);
55
55
  }
56
56
  /**
57
57
  * {@inheritDoc Logging.ILogger.info}
58
58
  */
59
59
  info(message, ...parameters) {
60
- return this._logger.info(message, ...parameters);
60
+ return this.logger.info(message, ...parameters);
61
61
  }
62
62
  /**
63
63
  * {@inheritDoc Logging.ILogger.warn}
64
64
  */
65
65
  warn(message, ...parameters) {
66
- return this._logger.warn(message, ...parameters);
66
+ return this.logger.warn(message, ...parameters);
67
67
  }
68
68
  /**
69
69
  * {@inheritDoc Logging.ILogger.error}
70
70
  */
71
71
  error(message, ...parameters) {
72
- return this._logger.error(message, ...parameters);
72
+ return this.logger.error(message, ...parameters);
73
73
  }
74
74
  /**
75
75
  * {@inheritDoc Logging.ILogger.log}
76
76
  */
77
77
  log(level, message, ...parameters) {
78
- return this._logger.log(level, message, ...parameters);
78
+ return this.logger.log(level, message, ...parameters);
79
79
  }
80
80
  /**
81
81
  * {@inheritDoc IResultReporter.reportSuccess}
82
82
  */
83
- reportSuccess(level, value, detail) {
84
- const formatted = this._valueFormatter(value, detail);
83
+ reportSuccess(level, value, detail, message) {
84
+ const formattedValue = this._valueFormatter(value, detail);
85
+ const formatted = message ? message(formattedValue, detail) : formattedValue;
85
86
  this.log(level, formatted);
86
87
  }
87
88
  /**
@@ -91,6 +92,18 @@ class LogReporter {
91
92
  const formatted = this._messageFormatter(message, detail);
92
93
  this.log(level, formatted);
93
94
  }
95
+ /**
96
+ * Creates a new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.
97
+ * @param valueFormatter - The value formatter to use.
98
+ * @returns A new {@link Logging.LogReporter | LogReporter} with the same logger but a different value formatter.
99
+ */
100
+ withValueFormatter(valueFormatter) {
101
+ return new LogReporter({
102
+ logger: this.logger,
103
+ valueFormatter,
104
+ messageFormatter: this._messageFormatter
105
+ });
106
+ }
94
107
  /**
95
108
  * Generic method to try to format an object for logging.
96
109
  * @param value - The value to format.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-utils",
3
- "version": "5.0.1-1",
3
+ "version": "5.0.1-2",
4
4
  "description": "Assorted Typescript Utilities",
5
5
  "main": "lib/index.js",
6
6
  "types": "dist/ts-utils.d.ts",