@fgv/ts-utils 5.0.0-22 → 5.0.0-23

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.
Files changed (80) hide show
  1. package/dist/ts-utils.d.ts +307 -33
  2. package/lib/index.d.ts +2 -1
  3. package/lib/index.js +3 -1
  4. package/lib/packlets/base/index.d.ts +0 -2
  5. package/lib/packlets/base/index.js +1 -25
  6. package/lib/packlets/base/result.d.ts +49 -0
  7. package/lib/packlets/base/result.js +36 -0
  8. package/lib/packlets/collections/collector.d.ts +9 -0
  9. package/lib/packlets/collections/collector.js +6 -0
  10. package/lib/packlets/collections/validatingCollector.d.ts +5 -1
  11. package/lib/packlets/hash/hashingNormalizer.js +4 -3
  12. package/lib/packlets/logging/index.d.ts +3 -0
  13. package/{src/packlets/hash/index.ts → lib/packlets/logging/index.js} +19 -3
  14. package/lib/packlets/logging/logReporter.d.ts +69 -0
  15. package/lib/packlets/logging/logReporter.js +72 -0
  16. package/lib/packlets/logging/logger.d.ts +183 -0
  17. package/lib/packlets/logging/logger.js +237 -0
  18. package/lib/test/unit/consoleLogger.test.d.ts +2 -0
  19. package/lib/test/unit/hashingNormalizerCollisions.test.d.ts +2 -0
  20. package/package.json +1 -1
  21. package/lib/packlets/base/logger.d.ts +0 -52
  22. package/lib/packlets/base/logger.js +0 -128
  23. package/src/index.ts +0 -63
  24. package/src/packlets/base/brand.ts +0 -28
  25. package/src/packlets/base/index.ts +0 -31
  26. package/src/packlets/base/logger.ts +0 -156
  27. package/src/packlets/base/mapResults.ts +0 -302
  28. package/src/packlets/base/messageAggregator.ts +0 -120
  29. package/src/packlets/base/normalize.ts +0 -144
  30. package/src/packlets/base/result.ts +0 -961
  31. package/src/packlets/base/utils.ts +0 -236
  32. package/src/packlets/collections/collectible.ts +0 -238
  33. package/src/packlets/collections/collector.ts +0 -273
  34. package/src/packlets/collections/collectorValidator.ts +0 -178
  35. package/src/packlets/collections/common.ts +0 -27
  36. package/src/packlets/collections/convertingCollector.ts +0 -223
  37. package/src/packlets/collections/convertingCollectorValidator.ts +0 -164
  38. package/src/packlets/collections/index.ts +0 -39
  39. package/src/packlets/collections/keyValueConverters.ts +0 -142
  40. package/src/packlets/collections/readonlyResultMap.ts +0 -99
  41. package/src/packlets/collections/resultMap.ts +0 -322
  42. package/src/packlets/collections/resultMapValidator.ts +0 -188
  43. package/src/packlets/collections/utils.ts +0 -33
  44. package/src/packlets/collections/validatingCollector.ts +0 -123
  45. package/src/packlets/collections/validatingConvertingCollector.ts +0 -113
  46. package/src/packlets/collections/validatingResultMap.ts +0 -94
  47. package/src/packlets/conversion/baseConverter.ts +0 -330
  48. package/src/packlets/conversion/converter.ts +0 -260
  49. package/src/packlets/conversion/converters.ts +0 -1039
  50. package/src/packlets/conversion/defaultingConverter.ts +0 -188
  51. package/src/packlets/conversion/index.ts +0 -30
  52. package/src/packlets/conversion/objectConverter.ts +0 -259
  53. package/src/packlets/conversion/stringConverter.ts +0 -165
  54. package/src/packlets/file-tree/directoryItem.ts +0 -84
  55. package/src/packlets/file-tree/fileItem.ts +0 -119
  56. package/src/packlets/file-tree/fileTree.ts +0 -152
  57. package/src/packlets/file-tree/fileTreeAccessors.ts +0 -176
  58. package/src/packlets/file-tree/fsTree.ts +0 -118
  59. package/src/packlets/file-tree/in-memory/inMemoryTree.ts +0 -171
  60. package/src/packlets/file-tree/in-memory/index.ts +0 -23
  61. package/src/packlets/file-tree/in-memory/treeBuilder.ts +0 -203
  62. package/src/packlets/file-tree/index.ts +0 -31
  63. package/src/packlets/hash/crcNormalizer.ts +0 -81
  64. package/src/packlets/hash/hashingNormalizer.ts +0 -102
  65. package/src/packlets/validation/array.ts +0 -84
  66. package/src/packlets/validation/boolean.ts +0 -63
  67. package/src/packlets/validation/classes.ts +0 -38
  68. package/src/packlets/validation/common.ts +0 -28
  69. package/src/packlets/validation/field.ts +0 -99
  70. package/src/packlets/validation/genericValidator.ts +0 -204
  71. package/src/packlets/validation/index.ts +0 -31
  72. package/src/packlets/validation/number.ts +0 -66
  73. package/src/packlets/validation/object.ts +0 -208
  74. package/src/packlets/validation/oneOf.ts +0 -78
  75. package/src/packlets/validation/string.ts +0 -66
  76. package/src/packlets/validation/traits.ts +0 -113
  77. package/src/packlets/validation/typeGuard.ts +0 -83
  78. package/src/packlets/validation/validator.ts +0 -157
  79. package/src/packlets/validation/validatorBase.ts +0 -66
  80. package/src/packlets/validation/validators.ts +0 -254
@@ -490,6 +490,10 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
490
490
  * {@inheritdoc Collections.ResultMap.values}
491
491
  */
492
492
  values(): IterableIterator<TITEM>;
493
+ /**
494
+ * {@inheritdoc Collections.IReadOnlyCollector.valuesByIndex}
495
+ */
496
+ valuesByIndex(): ReadonlyArray<TITEM>;
493
497
  /**
494
498
  * Gets a read-only version of this collector.
495
499
  */
@@ -559,6 +563,22 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
559
563
  protected _convertValue(value: unknown): DetailedResult<TITEM, CollectorResultDetail>;
560
564
  }
561
565
 
566
+ /**
567
+ * A console logger that outputs messages to the console.
568
+ * @public
569
+ */
570
+ declare class ConsoleLogger extends LoggerBase {
571
+ /**
572
+ * Creates a new console logger.
573
+ * @param logLevel - The level of logging to be used.
574
+ */
575
+ constructor(logLevel?: ReporterLogLevel);
576
+ /**
577
+ * {@inheritDoc Logging.LoggerBase._log}
578
+ */
579
+ protected _log(message: string, level: MessageLogLevel): Success<string | undefined>;
580
+ }
581
+
562
582
  /**
563
583
  * A {@link Validation.Constraint | Constraint<T>} function returns
564
584
  * `true` if the supplied value meets the constraint. Can return
@@ -1080,6 +1100,10 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1080
1100
  * {@inheritdoc IResult.withErrorFormat}
1081
1101
  */
1082
1102
  withErrorFormat(cb: ErrorFormatter<TD>): DetailedResult<T, TD>;
1103
+ /**
1104
+ * {@inheritdoc IResult.report}
1105
+ */
1106
+ report(reporter: IResultReporter<T, TD>, options?: IResultReportOptions): this;
1083
1107
  orThrow(logOrFormat?: IResultLogger<TD> | ErrorFormatter<TD>): never;
1084
1108
  orThrow(cb: ErrorFormatter): never;
1085
1109
  /**
@@ -1168,6 +1192,10 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1168
1192
  * {@inheritdoc Success.withErrorFormat}
1169
1193
  */
1170
1194
  withErrorFormat(cb: ErrorFormatter): DetailedResult<T, TD>;
1195
+ /**
1196
+ * {@inheritdoc IResult.report}
1197
+ */
1198
+ report(reporter: IResultReporter<T, TD>, options?: IResultReportOptions): this;
1171
1199
  /**
1172
1200
  * Creates a {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied value and
1173
1201
  * optional detail.
@@ -1409,6 +1437,10 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
1409
1437
  * {@inheritdoc IResult.aggregateError}
1410
1438
  */
1411
1439
  aggregateError(errors: IMessageAggregator): this;
1440
+ /**
1441
+ * {@inheritdoc IResult.report}
1442
+ */
1443
+ report(reporter: IResultReporter<T>, options?: IResultReportOptions): this;
1412
1444
  /**
1413
1445
  * Get a 'friendly' string representation of this object.
1414
1446
  * @remarks
@@ -2204,6 +2236,68 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2204
2236
  value: Validator<TV, unknown> | Converter<TV, unknown> | ConverterFunc<TV, unknown>;
2205
2237
  }
2206
2238
 
2239
+ /**
2240
+ * Generic Result-aware logger interface with multiple levels of logging.
2241
+ * @public
2242
+ */
2243
+ declare interface ILogger {
2244
+ /**
2245
+ * The level of logging to be used.
2246
+ */
2247
+ readonly logLevel: ReporterLogLevel;
2248
+ /**
2249
+ * Logs a message at the given level.
2250
+ * @param level - The level of the message.
2251
+ * @param message - The message to log.
2252
+ * @param parameters - The parameters to log.
2253
+ * @returns `Success` with the logged message if the level is enabled, or
2254
+ * `Success` with `undefined` if the message is suppressed.
2255
+ */
2256
+ log(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2257
+ /**
2258
+ * Logs a detail message.
2259
+ * @param message - The message to log.
2260
+ * @param parameters - The parameters to log.
2261
+ * @returns `Success` with the logged message if the level is enabled, or
2262
+ * `Success` with `undefined` if the message is suppressed.
2263
+ */
2264
+ detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2265
+ /**
2266
+ * Logs an info message.
2267
+ * @param message - The message to log.
2268
+ * @param parameters - The parameters to log.
2269
+ * @returns `Success` with the logged message if the level is enabled, or
2270
+ * `Success` with `undefined` if the message is suppressed.
2271
+ */
2272
+ info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2273
+ /**
2274
+ * Logs a warning message.
2275
+ * @param message - The message to log.
2276
+ * @param parameters - The parameters to log.
2277
+ * @returns `Success` with the logged message if the level is enabled, or
2278
+ * `Success` with `undefined` if the message is suppressed.
2279
+ */
2280
+ warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2281
+ /**
2282
+ * Logs an error message.
2283
+ * @param message - The message to log.
2284
+ * @param parameters - The parameters to log.
2285
+ * @returns `Success` with the logged message if the level is enabled, or
2286
+ * `Success` with `undefined` if the message is suppressed.
2287
+ */
2288
+ error(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2289
+ }
2290
+
2291
+ /**
2292
+ * Parameters for creating a {@link Logging.LogReporter | LogReporter}.
2293
+ * @public
2294
+ */
2295
+ declare interface ILogReporterCreateParams<T, TD = unknown> {
2296
+ logger: ILogger;
2297
+ valueFormatter?: LogValueFormatter<T, TD>;
2298
+ messageFormatter?: LogMessageFormatter<TD>;
2299
+ }
2300
+
2207
2301
  /**
2208
2302
  * Simple error aggregator to simplify collecting all errors in
2209
2303
  * a flow.
@@ -2263,17 +2357,47 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2263
2357
  declare function inMemory(files: IInMemoryFile[], prefix?: string): Result<FileTree_2>;
2264
2358
 
2265
2359
  /**
2360
+ * An in-memory logger that stores logged and suppressed messages.
2266
2361
  * @public
2267
2362
  */
2268
2363
  declare class InMemoryLogger extends LoggerBase {
2269
- protected _messages: string[];
2270
- protected _silent: string[];
2271
- constructor(logLevel?: LogLevel);
2272
- get messages(): string[];
2273
- get silent(): string[];
2364
+ /**
2365
+ * The messages that have been logged.
2366
+ */
2367
+ protected _logged: string[];
2368
+ /**
2369
+ * The messages that have been suppressed.
2370
+ */
2371
+ protected _suppressed: string[];
2372
+ /**
2373
+ * Creates a new in-memory logger.
2374
+ * @param logLevel - The level of logging to be used.
2375
+ */
2376
+ constructor(logLevel?: ReporterLogLevel);
2377
+ /**
2378
+ * The messages that have been logged.
2379
+ */
2380
+ get logged(): string[];
2381
+ /**
2382
+ * The messages that have been suppressed.
2383
+ */
2384
+ get suppressed(): string[];
2385
+ /**
2386
+ * Clears the logged and suppressed messages.
2387
+ */
2274
2388
  clear(): void;
2275
- protected _innerLog(message: string): Success<string | undefined>;
2276
- protected _innerSilent(message: string): Success<string | undefined>;
2389
+ /**
2390
+ * {@inheritDoc Logging.LoggerBase._log}
2391
+ */
2392
+ protected _log(message: string, __level: MessageLogLevel): Success<string | undefined>;
2393
+ /**
2394
+ * {@inheritDoc Logging.LoggerBase._suppressLog}
2395
+ * @param level - The level of the message.
2396
+ * @param message - The message to suppress.
2397
+ * @param parameters - The parameters to suppress.
2398
+ * @returns `Success` with `undefined` if the message is suppressed.
2399
+ */
2400
+ protected _suppressLog(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<undefined>;
2277
2401
  }
2278
2402
 
2279
2403
  /**
@@ -2344,6 +2468,11 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2344
2468
  * with an error if the index is out of range.
2345
2469
  */
2346
2470
  getAt(index: number): Result<TITEM>;
2471
+ /**
2472
+ * Gets all items in the collection, ordered by index.
2473
+ * @returns An array of items in the collection, ordered by index.
2474
+ */
2475
+ valuesByIndex(): ReadonlyArray<TITEM>;
2347
2476
  }
2348
2477
 
2349
2478
  /**
@@ -2444,7 +2573,11 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2444
2573
  /**
2445
2574
  * {@inheritdoc Collections.IReadOnlyValidatingCollector.getAt}
2446
2575
  */
2447
- readonly getAt: (index: number) => Result<TITEM>;
2576
+ getAt(index: number): Result<TITEM>;
2577
+ /**
2578
+ * {@inheritdoc Collections.IReadOnlyCollector.valuesByIndex}
2579
+ */
2580
+ valuesByIndex(): ReadonlyArray<TITEM>;
2448
2581
  }
2449
2582
 
2450
2583
  /**
@@ -2634,6 +2767,12 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2634
2767
  * errors will be aggregated.
2635
2768
  */
2636
2769
  aggregateError(errors: IMessageAggregator): this;
2770
+ /**
2771
+ * Reports the result to the supplied reporter
2772
+ * @param reporter - The {@link IResultReporter | reporter} to which the result will be reported.
2773
+ * @param options - The {@link IResultReportOptions | options} for reporting the result.
2774
+ */
2775
+ report(reporter: IResultReporter<T>, options?: IResultReportOptions): this;
2637
2776
  }
2638
2777
 
2639
2778
  /**
@@ -2665,6 +2804,30 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2665
2804
  converters: KeyValueConverters<TK, TV>;
2666
2805
  }
2667
2806
 
2807
+ /**
2808
+ * Interface for reporting a result.
2809
+ * @public
2810
+ */
2811
+ export declare interface IResultReporter<T, TD = unknown> {
2812
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
2813
+ reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
2814
+ }
2815
+
2816
+ /**
2817
+ * Options for reporting a result.
2818
+ * @public
2819
+ */
2820
+ export declare interface IResultReportOptions {
2821
+ /**
2822
+ * The level of reporting to be used for failure results. Default is 'error'.
2823
+ */
2824
+ failure?: MessageLogLevel;
2825
+ /**
2826
+ * The level of reporting to be used for success results. Default is 'quiet'.
2827
+ */
2828
+ success?: MessageLogLevel;
2829
+ }
2830
+
2668
2831
  /**
2669
2832
  * Helper function to create a {@link Converter | Converter} from a supplied type guard function.
2670
2833
  * @param description - a description of the thing to be validated for use in error messages
@@ -2850,49 +3013,126 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
2850
3013
  declare function literal_2<T extends string | number | boolean | symbol | null | undefined>(value: T): Validator<T>;
2851
3014
 
2852
3015
  /**
3016
+ * Abstract base class which implements {@link Logging.ILogger | ILogger}.
2853
3017
  * @public
2854
3018
  */
2855
- declare interface Logger {
2856
- log(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2857
- detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2858
- info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2859
- warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2860
- warnAndFail<T>(message?: unknown, ...parameters: unknown[]): Failure<T>;
2861
- error<T>(message?: unknown, ...parameters: unknown[]): Failure<T>;
2862
- }
2863
-
2864
- /**
2865
- * @public
2866
- */
2867
- declare abstract class LoggerBase {
2868
- logLevel: LogLevel;
2869
- constructor(logLevel?: LogLevel);
3019
+ declare abstract class LoggerBase implements ILogger {
3020
+ /**
3021
+ * {@inheritDoc Logging.ILogger.logLevel}
3022
+ */
3023
+ logLevel: ReporterLogLevel;
3024
+ protected constructor(logLevel?: ReporterLogLevel);
3025
+ /**
3026
+ * {@inheritDoc Logging.ILogger.detail}
3027
+ */
2870
3028
  detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3029
+ /**
3030
+ * {@inheritDoc Logging.ILogger.info}
3031
+ */
2871
3032
  info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3033
+ /**
3034
+ * {@inheritDoc Logging.ILogger.warn}
3035
+ */
2872
3036
  warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
2873
- warnAndFail<T>(message?: unknown, ...parameters: unknown[]): Failure<T>;
2874
- error<T>(message?: unknown, ...parameters: unknown[]): Failure<T>;
2875
- log(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3037
+ /**
3038
+ * {@inheritDoc Logging.ILogger.error}
3039
+ */
3040
+ error(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3041
+ /**
3042
+ * {@inheritDoc Logging.ILogger.log}
3043
+ */
3044
+ log(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3045
+ /**
3046
+ * Formats a message and parameters into a string.
3047
+ * @param message - The message to format.
3048
+ * @param parameters - The parameters to format.
3049
+ * @returns The formatted message.
3050
+ * @public
3051
+ */
2876
3052
  protected _format(message?: unknown, ...parameters: unknown[]): string;
2877
- protected _innerSilent(__message: string): Success<string | undefined>;
2878
- protected abstract _innerLog(message: string): Success<string | undefined>;
3053
+ /**
3054
+ * Inner method called for suppressed log messages.
3055
+ */
3056
+ protected _suppressLog(__level: MessageLogLevel, __message?: unknown, ...__parameters: unknown[]): Success<undefined>;
3057
+ protected abstract _log(message: string, level: MessageLogLevel): Success<string | undefined>;
2879
3058
  }
2880
3059
 
2881
3060
  declare namespace Logging {
2882
3061
  export {
2883
- LogLevel,
2884
- Logger,
3062
+ shouldLog,
3063
+ ReporterLogLevel,
3064
+ ILogger,
2885
3065
  LoggerBase,
2886
3066
  InMemoryLogger,
2887
- NoOpLogger
3067
+ ConsoleLogger,
3068
+ NoOpLogger,
3069
+ LogValueFormatter,
3070
+ LogMessageFormatter,
3071
+ ILogReporterCreateParams,
3072
+ LogReporter
2888
3073
  }
2889
3074
  }
2890
3075
  export { Logging }
2891
3076
 
2892
3077
  /**
3078
+ * A function that formats a message for logging.
3079
+ * @public
3080
+ */
3081
+ declare type LogMessageFormatter<TD = unknown> = (message: string, detail?: TD) => string;
3082
+
3083
+ /**
3084
+ * Abstract base class which wraps an existing {@link Logging.ILogger | ILogger} to implement
3085
+ * both {@link Logging.ILogger | ILogger} and {@link IResultReporter | IResultReporter}.
3086
+ * @public
3087
+ */
3088
+ declare class LogReporter<T, TD = unknown> implements ILogger, IResultReporter<T, TD> {
3089
+ protected readonly _logger: ILogger;
3090
+ protected readonly _valueFormatter: LogValueFormatter<T, TD>;
3091
+ protected readonly _messageFormatter: LogMessageFormatter<TD>;
3092
+ /**
3093
+ * Creates a new {@link Logging.LogReporter | LogReporter}.
3094
+ * @param params - The parameters for creating the {@link Logging.LogReporter | LogReporter}.
3095
+ */
3096
+ constructor(params: ILogReporterCreateParams<T, TD>);
3097
+ /**
3098
+ * {@inheritDoc Logging.ILogger.logLevel}
3099
+ */
3100
+ get logLevel(): ReporterLogLevel;
3101
+ /**
3102
+ * {@inheritDoc Logging.ILogger.detail}
3103
+ */
3104
+ detail(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3105
+ /**
3106
+ * {@inheritDoc Logging.ILogger.info}
3107
+ */
3108
+ info(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3109
+ /**
3110
+ * {@inheritDoc Logging.ILogger.warn}
3111
+ */
3112
+ warn(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3113
+ /**
3114
+ * {@inheritDoc Logging.ILogger.error}
3115
+ */
3116
+ error(message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3117
+ /**
3118
+ * {@inheritDoc Logging.ILogger.log}
3119
+ */
3120
+ log(level: MessageLogLevel, message?: unknown, ...parameters: unknown[]): Success<string | undefined>;
3121
+ /**
3122
+ * {@inheritDoc IResultReporter.reportSuccess}
3123
+ */
3124
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
3125
+ /**
3126
+ * {@inheritDoc IResultReporter.reportFailure}
3127
+ */
3128
+ reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
3129
+ }
3130
+
3131
+ /**
3132
+ * A function that formats a value for logging.
2893
3133
  * @public
2894
3134
  */
2895
- declare type LogLevel = 'detail' | 'info' | 'warning' | 'error' | 'silent';
3135
+ declare type LogValueFormatter<T, TD = unknown> = (value: T, detail?: TD) => string;
2896
3136
 
2897
3137
  /**
2898
3138
  * Aggregates successful results from a collection of {@link DetailedResult | DetailedResult<T, TD>},
@@ -3078,10 +3318,25 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
3078
3318
  }
3079
3319
 
3080
3320
  /**
3321
+ * The severity level at which a message should be logged.
3322
+ * @public
3323
+ */
3324
+ export declare type MessageLogLevel = 'quiet' | 'detail' | 'info' | 'warning' | 'error';
3325
+
3326
+ /**
3327
+ * A no-op {@link Logging.LoggerBase | LoggerBase} that does not log anything.
3081
3328
  * @public
3082
3329
  */
3083
3330
  declare class NoOpLogger extends LoggerBase {
3084
- protected _innerLog(message: string): Success<string | undefined>;
3331
+ /**
3332
+ * Creates a new no-op logger.
3333
+ * @param logLevel - The level of logging to be used.
3334
+ */
3335
+ constructor(logLevel?: ReporterLogLevel);
3336
+ /**
3337
+ * {@inheritDoc Logging.LoggerBase._log}
3338
+ */
3339
+ protected _log(message: string, __level: MessageLogLevel): Success<string | undefined>;
3085
3340
  }
3086
3341
 
3087
3342
  /**
@@ -3781,6 +4036,12 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
3781
4036
  */
3782
4037
  export declare function recordToMap<TS, TD, TK extends string = string>(src: Record<TK, TS>, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD>>;
3783
4038
 
4039
+ /**
4040
+ * The level of logging to be used.
4041
+ * @public
4042
+ */
4043
+ declare type ReporterLogLevel = 'all' | 'detail' | 'info' | 'warning' | 'error' | 'silent';
4044
+
3784
4045
  /**
3785
4046
  * Represents the {@link IResult | result} of some operation or sequence of operations.
3786
4047
  * @remarks
@@ -4041,6 +4302,15 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
4041
4302
  */
4042
4303
  export declare type ResultValueType<T> = T extends Result<infer TV> ? TV : never;
4043
4304
 
4305
+ /**
4306
+ * Compares two log levels.
4307
+ * @param message - The first log level.
4308
+ * @param reporter - The second log level.
4309
+ * @returns `true` if the message should be logged, `false` if it should be suppressed.
4310
+ * @public
4311
+ */
4312
+ declare function shouldLog(message: MessageLogLevel, reporter: ReporterLogLevel): boolean;
4313
+
4044
4314
  /**
4045
4315
  * Helper function to create a {@link Conversion.ObjectConverter | ObjectConverter} which converts an object
4046
4316
  * without changing shape, a {@link Conversion.FieldConverters | FieldConverters<T, TC>} and an optional
@@ -4336,6 +4606,10 @@ declare class Collectible<TKEY extends string = string, TINDEX extends number =
4336
4606
  * {@inheritdoc IResult.aggregateError}
4337
4607
  */
4338
4608
  aggregateError(__errors: IMessageAggregator): this;
4609
+ /**
4610
+ * {@inheritdoc IResult.report}
4611
+ */
4612
+ report(reporter: IResultReporter<T>, options?: IResultReportOptions): this;
4339
4613
  /**
4340
4614
  * Creates a {@link Success | Success<T>} with the supplied value.
4341
4615
  * @param value - The value to be returned.
package/lib/index.d.ts CHANGED
@@ -2,10 +2,11 @@ import * as Collections from './packlets/collections';
2
2
  import * as Conversion from './packlets/conversion';
3
3
  import * as Hash from './packlets/hash';
4
4
  import * as FileTree from './packlets/file-tree';
5
+ import * as Logging from './packlets/logging';
5
6
  import * as Validation from './packlets/validation';
6
7
  import { Collector, ICollectible, ConvertingCollector, IReadOnlyResultMap, ResultMap, ValidatingCollector, ValidatingConvertingCollector, ValidatingResultMap } from './packlets/collections';
7
8
  import { Converter, Converters, ObjectConverter, StringConverter } from './packlets/conversion';
8
9
  import { Validator, Validators } from './packlets/validation';
9
10
  export * from './packlets/base';
10
- export { Collections, Collector, ConvertingCollector, Conversion, Converter, Converters, FileTree, Hash, ICollectible, IReadOnlyResultMap, ObjectConverter, ResultMap, StringConverter, ValidatingCollector, ValidatingConvertingCollector, ValidatingResultMap, Validation, Validator, Validators };
11
+ export { Collections, Collector, ConvertingCollector, Conversion, Converter, Converters, FileTree, Hash, ICollectible, IReadOnlyResultMap, Logging, ObjectConverter, ResultMap, StringConverter, ValidatingCollector, ValidatingConvertingCollector, ValidatingResultMap, Validation, Validator, Validators };
11
12
  //# sourceMappingURL=index.d.ts.map
package/lib/index.js CHANGED
@@ -57,7 +57,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
57
57
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
58
58
  };
59
59
  Object.defineProperty(exports, "__esModule", { value: true });
60
- exports.Validators = exports.Validation = exports.ValidatingResultMap = exports.ValidatingConvertingCollector = exports.ValidatingCollector = exports.StringConverter = exports.ResultMap = exports.ObjectConverter = exports.Hash = exports.FileTree = exports.Converters = exports.Conversion = exports.ConvertingCollector = exports.Collector = exports.Collections = void 0;
60
+ exports.Validators = exports.Validation = exports.ValidatingResultMap = exports.ValidatingConvertingCollector = exports.ValidatingCollector = exports.StringConverter = exports.ResultMap = exports.ObjectConverter = exports.Logging = exports.Hash = exports.FileTree = exports.Converters = exports.Conversion = exports.ConvertingCollector = exports.Collector = exports.Collections = void 0;
61
61
  const Collections = __importStar(require("./packlets/collections"));
62
62
  exports.Collections = Collections;
63
63
  const Conversion = __importStar(require("./packlets/conversion"));
@@ -66,6 +66,8 @@ const Hash = __importStar(require("./packlets/hash"));
66
66
  exports.Hash = Hash;
67
67
  const FileTree = __importStar(require("./packlets/file-tree"));
68
68
  exports.FileTree = FileTree;
69
+ const Logging = __importStar(require("./packlets/logging"));
70
+ exports.Logging = Logging;
69
71
  const Validation = __importStar(require("./packlets/validation"));
70
72
  exports.Validation = Validation;
71
73
  const collections_1 = require("./packlets/collections");
@@ -1,9 +1,7 @@
1
- import * as Logging from './logger';
2
1
  export * from './brand';
3
2
  export * from './mapResults';
4
3
  export * from './messageAggregator';
5
4
  export { Normalizer } from './normalize';
6
5
  export * from './result';
7
6
  export * from './utils';
8
- export { Logging };
9
7
  //# sourceMappingURL=index.d.ts.map
@@ -31,35 +31,11 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
31
31
  if (k2 === undefined) k2 = k;
32
32
  o[k2] = m[k];
33
33
  }));
34
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
- Object.defineProperty(o, "default", { enumerable: true, value: v });
36
- }) : function(o, v) {
37
- o["default"] = v;
38
- });
39
- var __importStar = (this && this.__importStar) || (function () {
40
- var ownKeys = function(o) {
41
- ownKeys = Object.getOwnPropertyNames || function (o) {
42
- var ar = [];
43
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
44
- return ar;
45
- };
46
- return ownKeys(o);
47
- };
48
- return function (mod) {
49
- if (mod && mod.__esModule) return mod;
50
- var result = {};
51
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
52
- __setModuleDefault(result, mod);
53
- return result;
54
- };
55
- })();
56
34
  var __exportStar = (this && this.__exportStar) || function(m, exports) {
57
35
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
58
36
  };
59
37
  Object.defineProperty(exports, "__esModule", { value: true });
60
- exports.Logging = exports.Normalizer = void 0;
61
- const Logging = __importStar(require("./logger"));
62
- exports.Logging = Logging;
38
+ exports.Normalizer = void 0;
63
39
  __exportStar(require("./brand"), exports);
64
40
  __exportStar(require("./mapResults"), exports);
65
41
  __exportStar(require("./messageAggregator"), exports);
@@ -41,6 +41,33 @@ export interface IResultLogger<TD = unknown> {
41
41
  */
42
42
  error(message: string, detail?: TD): void;
43
43
  }
44
+ /**
45
+ * The severity level at which a message should be logged.
46
+ * @public
47
+ */
48
+ export type MessageLogLevel = 'quiet' | 'detail' | 'info' | 'warning' | 'error';
49
+ /**
50
+ * Options for reporting a result.
51
+ * @public
52
+ */
53
+ export interface IResultReportOptions {
54
+ /**
55
+ * The level of reporting to be used for failure results. Default is 'error'.
56
+ */
57
+ failure?: MessageLogLevel;
58
+ /**
59
+ * The level of reporting to be used for success results. Default is 'quiet'.
60
+ */
61
+ success?: MessageLogLevel;
62
+ }
63
+ /**
64
+ * Interface for reporting a result.
65
+ * @public
66
+ */
67
+ export interface IResultReporter<T, TD = unknown> {
68
+ reportSuccess(level: MessageLogLevel, value: T, detail?: TD): void;
69
+ reportFailure(level: MessageLogLevel, message: string, detail?: TD): void;
70
+ }
44
71
  /**
45
72
  * Simple error aggregator to simplify collecting all errors in
46
73
  * a flow.
@@ -237,6 +264,12 @@ export interface IResult<T> {
237
264
  * errors will be aggregated.
238
265
  */
239
266
  aggregateError(errors: IMessageAggregator): this;
267
+ /**
268
+ * Reports the result to the supplied reporter
269
+ * @param reporter - The {@link IResultReporter | reporter} to which the result will be reported.
270
+ * @param options - The {@link IResultReportOptions | options} for reporting the result.
271
+ */
272
+ report(reporter: IResultReporter<T>, options?: IResultReportOptions): this;
240
273
  }
241
274
  /**
242
275
  * Reports a successful {@link IResult | result} from some operation and the
@@ -323,6 +356,10 @@ export declare class Success<T> implements IResult<T> {
323
356
  * {@inheritdoc IResult.aggregateError}
324
357
  */
325
358
  aggregateError(__errors: IMessageAggregator): this;
359
+ /**
360
+ * {@inheritdoc IResult.report}
361
+ */
362
+ report(reporter: IResultReporter<T>, options?: IResultReportOptions): this;
326
363
  /**
327
364
  * Creates a {@link Success | Success<T>} with the supplied value.
328
365
  * @param value - The value to be returned.
@@ -415,6 +452,10 @@ export declare class Failure<T> implements IResult<T> {
415
452
  * {@inheritdoc IResult.aggregateError}
416
453
  */
417
454
  aggregateError(errors: IMessageAggregator): this;
455
+ /**
456
+ * {@inheritdoc IResult.report}
457
+ */
458
+ report(reporter: IResultReporter<T>, options?: IResultReportOptions): this;
418
459
  /**
419
460
  * Get a 'friendly' string representation of this object.
420
461
  * @remarks
@@ -537,6 +578,10 @@ export declare class DetailedSuccess<T, TD> extends Success<T> {
537
578
  * {@inheritdoc Success.withErrorFormat}
538
579
  */
539
580
  withErrorFormat(cb: ErrorFormatter): DetailedResult<T, TD>;
581
+ /**
582
+ * {@inheritdoc IResult.report}
583
+ */
584
+ report(reporter: IResultReporter<T, TD>, options?: IResultReportOptions): this;
540
585
  /**
541
586
  * Creates a {@link DetailedSuccess | DetailedSuccess<T, TD>} with the supplied value and
542
587
  * optional detail.
@@ -599,6 +644,10 @@ export declare class DetailedFailure<T, TD> extends Failure<T> {
599
644
  * {@inheritdoc IResult.withErrorFormat}
600
645
  */
601
646
  withErrorFormat(cb: ErrorFormatter<TD>): DetailedResult<T, TD>;
647
+ /**
648
+ * {@inheritdoc IResult.report}
649
+ */
650
+ report(reporter: IResultReporter<T, TD>, options?: IResultReportOptions): this;
602
651
  orThrow(logOrFormat?: IResultLogger<TD> | ErrorFormatter<TD>): never;
603
652
  orThrow(cb: ErrorFormatter): never;
604
653
  /**