@likec4/log 1.18.0 → 1.19.1
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/browser.cjs +1465 -9
- package/dist/browser.mjs +1465 -10
- package/dist/chunks/prompt.cjs +201 -132
- package/dist/chunks/prompt.mjs +199 -130
- package/dist/index.cjs +2 -1
- package/dist/index.d.cts +357 -12
- package/dist/index.d.mts +357 -12
- package/dist/index.d.ts +357 -12
- package/dist/index.mjs +1 -1
- package/dist/shared/log.BjyNw23f.mjs +2823 -0
- package/dist/shared/log.DQnPBfHC.cjs +2846 -0
- package/package.json +10 -11
- package/src/browser.ts +16 -0
- package/src/format.ts +60 -0
- package/src/index.ts +36 -0
- package/dist/shared/log.BEan6jB3.cjs +0 -1366
- package/dist/shared/log.BMY8Anc1.mjs +0 -1343
package/dist/browser.cjs
CHANGED
|
@@ -69,11 +69,25 @@ const LogTypes = {
|
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
-
function
|
|
73
|
-
|
|
72
|
+
function isPlainObject$1(value) {
|
|
73
|
+
if (value === null || typeof value !== "object") {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const prototype = Object.getPrototypeOf(value);
|
|
77
|
+
if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (Symbol.iterator in value) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (Symbol.toStringTag in value) {
|
|
84
|
+
return Object.prototype.toString.call(value) === "[object Module]";
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
74
87
|
}
|
|
88
|
+
|
|
75
89
|
function _defu(baseObject, defaults, namespace = ".", merger) {
|
|
76
|
-
if (!
|
|
90
|
+
if (!isPlainObject$1(defaults)) {
|
|
77
91
|
return _defu(baseObject, {}, namespace);
|
|
78
92
|
}
|
|
79
93
|
const object = Object.assign({}, defaults);
|
|
@@ -87,7 +101,7 @@ function _defu(baseObject, defaults, namespace = ".", merger) {
|
|
|
87
101
|
}
|
|
88
102
|
if (Array.isArray(value) && Array.isArray(object[key])) {
|
|
89
103
|
object[key] = [...value, ...object[key]];
|
|
90
|
-
} else if (
|
|
104
|
+
} else if (isPlainObject$1(value) && isPlainObject$1(object[key])) {
|
|
91
105
|
object[key] = _defu(
|
|
92
106
|
value,
|
|
93
107
|
object[key],
|
|
@@ -106,11 +120,11 @@ function createDefu(merger) {
|
|
|
106
120
|
}
|
|
107
121
|
const defu = createDefu();
|
|
108
122
|
|
|
109
|
-
function isPlainObject(obj) {
|
|
123
|
+
function isPlainObject$2(obj) {
|
|
110
124
|
return Object.prototype.toString.call(obj) === "[object Object]";
|
|
111
125
|
}
|
|
112
126
|
function isLogObj(arg) {
|
|
113
|
-
if (!isPlainObject(arg)) {
|
|
127
|
+
if (!isPlainObject$2(arg)) {
|
|
114
128
|
return false;
|
|
115
129
|
}
|
|
116
130
|
if (!arg.message && !arg.args) {
|
|
@@ -125,6 +139,14 @@ function isLogObj(arg) {
|
|
|
125
139
|
let paused = false;
|
|
126
140
|
const queue = [];
|
|
127
141
|
class Consola {
|
|
142
|
+
options;
|
|
143
|
+
_lastLog;
|
|
144
|
+
_mockFn;
|
|
145
|
+
/**
|
|
146
|
+
* Creates an instance of Consola with specified options or defaults.
|
|
147
|
+
*
|
|
148
|
+
* @param {Partial<ConsolaOptions>} [options={}] - Configuration options for the Consola instance.
|
|
149
|
+
*/
|
|
128
150
|
constructor(options = {}) {
|
|
129
151
|
const types = options.types || LogTypes;
|
|
130
152
|
this.options = defu(
|
|
@@ -162,9 +184,19 @@ class Consola {
|
|
|
162
184
|
}
|
|
163
185
|
this._lastLog = {};
|
|
164
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets the current log level of the Consola instance.
|
|
189
|
+
*
|
|
190
|
+
* @returns {number} The current log level.
|
|
191
|
+
*/
|
|
165
192
|
get level() {
|
|
166
193
|
return this.options.level;
|
|
167
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Sets the minimum log level that will be output by the instance.
|
|
197
|
+
*
|
|
198
|
+
* @param {number} level - The new log level to set.
|
|
199
|
+
*/
|
|
168
200
|
set level(level) {
|
|
169
201
|
this.options.level = _normalizeLogLevel(
|
|
170
202
|
level,
|
|
@@ -172,12 +204,27 @@ class Consola {
|
|
|
172
204
|
this.options.level
|
|
173
205
|
);
|
|
174
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* Displays a prompt to the user and returns the response.
|
|
209
|
+
* Throw an error if `prompt` is not supported by the current configuration.
|
|
210
|
+
*
|
|
211
|
+
* @template T
|
|
212
|
+
* @param {string} message - The message to display in the prompt.
|
|
213
|
+
* @param {T} [opts] - Optional options for the prompt. See {@link PromptOptions}.
|
|
214
|
+
* @returns {promise<T>} A promise that infer with the prompt options. See {@link PromptOptions}.
|
|
215
|
+
*/
|
|
175
216
|
prompt(message, opts) {
|
|
176
217
|
if (!this.options.prompt) {
|
|
177
218
|
throw new Error("prompt is not supported!");
|
|
178
219
|
}
|
|
179
220
|
return this.options.prompt(message, opts);
|
|
180
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Creates a new instance of Consola, inheriting options from the current instance, with possible overrides.
|
|
224
|
+
*
|
|
225
|
+
* @param {Partial<ConsolaOptions>} options - Optional overrides for the new instance. See {@link ConsolaOptions}.
|
|
226
|
+
* @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.
|
|
227
|
+
*/
|
|
181
228
|
create(options) {
|
|
182
229
|
const instance = new Consola({
|
|
183
230
|
...this.options,
|
|
@@ -188,6 +235,12 @@ class Consola {
|
|
|
188
235
|
}
|
|
189
236
|
return instance;
|
|
190
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* Creates a new Consola instance with the specified default log object properties.
|
|
240
|
+
*
|
|
241
|
+
* @param {InputLogObject} defaults - Default properties to include in any log from the new instance. See {@link InputLogObject}.
|
|
242
|
+
* @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.
|
|
243
|
+
*/
|
|
191
244
|
withDefaults(defaults) {
|
|
192
245
|
return this.create({
|
|
193
246
|
...this.options,
|
|
@@ -197,19 +250,39 @@ class Consola {
|
|
|
197
250
|
}
|
|
198
251
|
});
|
|
199
252
|
}
|
|
253
|
+
/**
|
|
254
|
+
* Creates a new Consola instance with a specified tag, which will be included in every log.
|
|
255
|
+
*
|
|
256
|
+
* @param {string} tag - The tag to include in each log of the new instance.
|
|
257
|
+
* @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.
|
|
258
|
+
*/
|
|
200
259
|
withTag(tag) {
|
|
201
260
|
return this.withDefaults({
|
|
202
261
|
tag: this.options.defaults.tag ? this.options.defaults.tag + ":" + tag : tag
|
|
203
262
|
});
|
|
204
263
|
}
|
|
264
|
+
/**
|
|
265
|
+
* Adds a custom reporter to the Consola instance.
|
|
266
|
+
* Reporters will be called for each log message, depending on their implementation and log level.
|
|
267
|
+
*
|
|
268
|
+
* @param {ConsolaReporter} reporter - The reporter to add. See {@link ConsolaReporter}.
|
|
269
|
+
* @returns {Consola} The current Consola instance.
|
|
270
|
+
*/
|
|
205
271
|
addReporter(reporter) {
|
|
206
272
|
this.options.reporters.push(reporter);
|
|
207
273
|
return this;
|
|
208
274
|
}
|
|
275
|
+
/**
|
|
276
|
+
* Removes a custom reporter from the Consola instance.
|
|
277
|
+
* If no reporter is specified, all reporters will be removed.
|
|
278
|
+
*
|
|
279
|
+
* @param {ConsolaReporter} reporter - The reporter to remove. See {@link ConsolaReporter}.
|
|
280
|
+
* @returns {Consola} The current Consola instance.
|
|
281
|
+
*/
|
|
209
282
|
removeReporter(reporter) {
|
|
210
283
|
if (reporter) {
|
|
211
284
|
const i = this.options.reporters.indexOf(reporter);
|
|
212
|
-
if (i
|
|
285
|
+
if (i !== -1) {
|
|
213
286
|
return this.options.reporters.splice(i, 1);
|
|
214
287
|
}
|
|
215
288
|
} else {
|
|
@@ -217,6 +290,12 @@ class Consola {
|
|
|
217
290
|
}
|
|
218
291
|
return this;
|
|
219
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* Replaces all reporters of the Consola instance with the specified array of reporters.
|
|
295
|
+
*
|
|
296
|
+
* @param {ConsolaReporter[]} reporters - The new reporters to set. See {@link ConsolaReporter}.
|
|
297
|
+
* @returns {Consola} The current Consola instance.
|
|
298
|
+
*/
|
|
220
299
|
setReporters(reporters) {
|
|
221
300
|
this.options.reporters = Array.isArray(reporters) ? reporters : [reporters];
|
|
222
301
|
return this;
|
|
@@ -229,6 +308,9 @@ class Consola {
|
|
|
229
308
|
this.restoreConsole();
|
|
230
309
|
this.restoreStd();
|
|
231
310
|
}
|
|
311
|
+
/**
|
|
312
|
+
* Overrides console methods with Consola logging methods for consistent logging.
|
|
313
|
+
*/
|
|
232
314
|
wrapConsole() {
|
|
233
315
|
for (const type in this.options.types) {
|
|
234
316
|
if (!console["__" + type]) {
|
|
@@ -237,6 +319,9 @@ class Consola {
|
|
|
237
319
|
console[type] = this[type].raw;
|
|
238
320
|
}
|
|
239
321
|
}
|
|
322
|
+
/**
|
|
323
|
+
* Restores the original console methods, removing Consola overrides.
|
|
324
|
+
*/
|
|
240
325
|
restoreConsole() {
|
|
241
326
|
for (const type in this.options.types) {
|
|
242
327
|
if (console["__" + type]) {
|
|
@@ -245,6 +330,9 @@ class Consola {
|
|
|
245
330
|
}
|
|
246
331
|
}
|
|
247
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* Overrides standard output and error streams to redirect them through Consola.
|
|
335
|
+
*/
|
|
248
336
|
wrapStd() {
|
|
249
337
|
this._wrapStream(this.options.stdout, "log");
|
|
250
338
|
this._wrapStream(this.options.stderr, "log");
|
|
@@ -260,6 +348,9 @@ class Consola {
|
|
|
260
348
|
this[type].raw(String(data).trim());
|
|
261
349
|
};
|
|
262
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* Restores the original standard output and error streams, removing the Consola redirection.
|
|
353
|
+
*/
|
|
263
354
|
restoreStd() {
|
|
264
355
|
this._restoreStream(this.options.stdout);
|
|
265
356
|
this._restoreStream(this.options.stderr);
|
|
@@ -273,9 +364,15 @@ class Consola {
|
|
|
273
364
|
delete stream.__write;
|
|
274
365
|
}
|
|
275
366
|
}
|
|
367
|
+
/**
|
|
368
|
+
* Pauses logging, queues incoming logs until resumed.
|
|
369
|
+
*/
|
|
276
370
|
pauseLogs() {
|
|
277
371
|
paused = true;
|
|
278
372
|
}
|
|
373
|
+
/**
|
|
374
|
+
* Resumes logging, processing any queued logs.
|
|
375
|
+
*/
|
|
279
376
|
resumeLogs() {
|
|
280
377
|
paused = false;
|
|
281
378
|
const _queue = queue.splice(0);
|
|
@@ -283,6 +380,11 @@ class Consola {
|
|
|
283
380
|
item[0]._logFn(item[1], item[2]);
|
|
284
381
|
}
|
|
285
382
|
}
|
|
383
|
+
/**
|
|
384
|
+
* Replaces logging methods with mocks if a mock function is provided.
|
|
385
|
+
*
|
|
386
|
+
* @param {ConsolaOptions["mockFn"]} mockFn - The function to use for mocking logging methods. See {@link ConsolaOptions["mockFn"]}.
|
|
387
|
+
*/
|
|
286
388
|
mockTypes(mockFn) {
|
|
287
389
|
const _mockFn = mockFn || this.options.mockFn;
|
|
288
390
|
this._mockFn = _mockFn;
|
|
@@ -405,6 +507,10 @@ function createConsola$1(options = {}) {
|
|
|
405
507
|
}
|
|
406
508
|
|
|
407
509
|
class BrowserReporter {
|
|
510
|
+
options;
|
|
511
|
+
defaultColor;
|
|
512
|
+
levelColorMap;
|
|
513
|
+
typeColorMap;
|
|
408
514
|
constructor(options) {
|
|
409
515
|
this.options = { ...options };
|
|
410
516
|
this.defaultColor = "#7f8c8d";
|
|
@@ -472,11 +578,1361 @@ function createConsola(options = {}) {
|
|
|
472
578
|
}
|
|
473
579
|
createConsola();
|
|
474
580
|
|
|
475
|
-
const
|
|
476
|
-
|
|
581
|
+
const normalizeDescriptors=(error)=>{
|
|
582
|
+
CORE_ERROR_PROPS.forEach((propName)=>{
|
|
583
|
+
normalizeDescriptor$1(error,propName);
|
|
584
|
+
});
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
const CORE_ERROR_PROPS=["name","message","stack","cause","errors"];
|
|
588
|
+
|
|
589
|
+
const normalizeDescriptor$1=(error,propName)=>{
|
|
590
|
+
const descriptor=getDescriptor(error,propName);
|
|
591
|
+
|
|
592
|
+
if(descriptor===undefined){
|
|
593
|
+
return
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if(isReadonlyGetter(descriptor)){
|
|
597
|
+
setErrorProperty$1(error,propName,error[propName]);
|
|
598
|
+
return
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
if(isInvalidDescriptor(descriptor)){
|
|
602
|
+
setErrorDescriptor(error,propName,descriptor);
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
const getDescriptor=(value,propName)=>{
|
|
608
|
+
const descriptor=Object.getOwnPropertyDescriptor(value,propName);
|
|
609
|
+
|
|
610
|
+
if(descriptor!==undefined){
|
|
611
|
+
return descriptor
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
const prototype=Object.getPrototypeOf(value);
|
|
615
|
+
return prototype===null?undefined:getDescriptor(prototype,propName)
|
|
616
|
+
};
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
const isReadonlyGetter=({get,set})=>
|
|
620
|
+
get!==undefined&&set===undefined;
|
|
621
|
+
|
|
622
|
+
const isInvalidDescriptor=({enumerable,writable})=>
|
|
623
|
+
enumerable||!writable;
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
const setErrorProperty$1=(error,propName,value)=>{
|
|
627
|
+
setErrorDescriptor(error,propName,{value});
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
const setErrorDescriptor=(error,propName,descriptor)=>{
|
|
632
|
+
|
|
633
|
+
Object.defineProperty(error,propName,{
|
|
634
|
+
...descriptor,
|
|
635
|
+
...("get"in descriptor||"set"in descriptor?{}:{writable:true}),
|
|
636
|
+
enumerable:false,
|
|
637
|
+
configurable:true
|
|
638
|
+
});
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
const normalizeAggregate=(error,recurse)=>{
|
|
642
|
+
if(Array.isArray(error.errors)){
|
|
643
|
+
const aggregateErrors=error.errors.
|
|
644
|
+
filter(isDefined).
|
|
645
|
+
map(recurse).
|
|
646
|
+
filter(Boolean);
|
|
647
|
+
setErrorProperty$1(error,"errors",aggregateErrors);
|
|
648
|
+
}else if(isAggregateError(error)){
|
|
649
|
+
setErrorProperty$1(error,"errors",[]);
|
|
650
|
+
}else if(error.errors!==undefined){
|
|
651
|
+
deleteAggregateErrors(error);
|
|
652
|
+
}
|
|
653
|
+
};
|
|
654
|
+
|
|
655
|
+
const isDefined=(error)=>error!==undefined;
|
|
656
|
+
|
|
657
|
+
const isAggregateError=(error)=>
|
|
658
|
+
"AggregateError"in globalThis&&(
|
|
659
|
+
error.name==="AggregateError"||error instanceof AggregateError);
|
|
660
|
+
|
|
661
|
+
const deleteAggregateErrors=(error)=>{
|
|
662
|
+
|
|
663
|
+
delete error.errors;
|
|
664
|
+
|
|
665
|
+
if(error.errors!==undefined){
|
|
666
|
+
setErrorProperty$1(error,"errors",[]);
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
|
|
670
|
+
const normalizeCause=(error,recurse)=>{
|
|
671
|
+
if(!("cause"in error)){
|
|
672
|
+
return
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
const cause=error.cause===undefined?error.cause:recurse(error.cause);
|
|
676
|
+
|
|
677
|
+
if(cause===undefined){
|
|
678
|
+
|
|
679
|
+
delete error.cause;
|
|
680
|
+
}else {
|
|
681
|
+
setErrorProperty$1(error,"cause",cause);
|
|
682
|
+
}
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
const isErrorInstance$1=(value)=>
|
|
686
|
+
isInstanceOfError$1(value)||hasErrorTag$1(value);
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
const isInstanceOfError$1=(value)=>{
|
|
691
|
+
try{
|
|
692
|
+
return value instanceof Error
|
|
693
|
+
}catch{
|
|
694
|
+
return false
|
|
695
|
+
}
|
|
696
|
+
};
|
|
697
|
+
|
|
698
|
+
const hasErrorTag$1=(value)=>{
|
|
699
|
+
try{
|
|
700
|
+
return ERROR_TAGS$1.has(Object.prototype.toString.call(value))
|
|
701
|
+
}catch{
|
|
702
|
+
return false
|
|
703
|
+
}
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
const ERROR_TAGS$1=new Set([
|
|
707
|
+
|
|
708
|
+
"[object Error]",
|
|
709
|
+
|
|
710
|
+
"[object DOMException]",
|
|
711
|
+
|
|
712
|
+
"[object DOMError]",
|
|
713
|
+
|
|
714
|
+
"[object Exception]"]
|
|
715
|
+
);
|
|
716
|
+
|
|
717
|
+
function isPlainObject(value) {
|
|
718
|
+
if (typeof value !== 'object' || value === null) {
|
|
719
|
+
return false;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
const prototype = Object.getPrototypeOf(value);
|
|
723
|
+
return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in value) && !(Symbol.iterator in value);
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
const isNonModifiableError=(error)=>
|
|
727
|
+
!Object.isExtensible(error)||
|
|
728
|
+
CORE_ERROR_PROPS.some(
|
|
729
|
+
(propName)=>
|
|
730
|
+
isNonConfigurableProp(error,propName)||isThrowingProp(error,propName)
|
|
731
|
+
);
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
const isNonConfigurableProp=(error,propName)=>{
|
|
736
|
+
const descriptor=Object.getOwnPropertyDescriptor(error,propName);
|
|
737
|
+
return descriptor!==undefined&&!descriptor.configurable
|
|
738
|
+
};
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
const isThrowingProp=(error,propName)=>{
|
|
742
|
+
try{
|
|
743
|
+
|
|
744
|
+
error[propName];
|
|
745
|
+
return false
|
|
746
|
+
}catch{
|
|
747
|
+
return true
|
|
748
|
+
}
|
|
749
|
+
};
|
|
750
|
+
|
|
751
|
+
const setStack=(error)=>{
|
|
752
|
+
const stack=getStack$3(error.message,error.name);
|
|
753
|
+
setErrorProperty$1(error,"stack",stack);
|
|
754
|
+
};
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
const getStack$3=(message="",name="Error")=>{
|
|
763
|
+
const StackError=getErrorClass(name);
|
|
764
|
+
const{stack}=new StackError(message);
|
|
765
|
+
return typeof stack==="string"&&stack!==""?
|
|
766
|
+
stack:
|
|
767
|
+
`${name}: ${message}`
|
|
768
|
+
};
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
const getErrorClass=(name)=>{
|
|
775
|
+
const descriptor={
|
|
776
|
+
value:name,
|
|
777
|
+
enumerable:false,
|
|
778
|
+
writable:true,
|
|
779
|
+
configurable:true
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
const StackError=Object.defineProperty(
|
|
783
|
+
class extends Error{},
|
|
784
|
+
"name",
|
|
785
|
+
descriptor
|
|
786
|
+
);
|
|
787
|
+
|
|
788
|
+
Object.defineProperty(StackError.prototype,"name",descriptor);
|
|
789
|
+
return StackError
|
|
790
|
+
};
|
|
791
|
+
|
|
792
|
+
const copyObject=(object)=>{
|
|
793
|
+
const objectCopy={};
|
|
794
|
+
|
|
795
|
+
|
|
796
|
+
for(const propName of getPropsToCopy(object)){
|
|
797
|
+
|
|
798
|
+
try{
|
|
799
|
+
const value=object[propName];
|
|
800
|
+
const{
|
|
801
|
+
enumerable,
|
|
802
|
+
configurable,
|
|
803
|
+
writable=true
|
|
804
|
+
}=getDescriptor(object,propName);
|
|
805
|
+
|
|
806
|
+
Object.defineProperty(objectCopy,propName,{
|
|
807
|
+
value,
|
|
808
|
+
enumerable,
|
|
809
|
+
configurable,
|
|
810
|
+
writable
|
|
811
|
+
});
|
|
812
|
+
}catch{}
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
return objectCopy
|
|
816
|
+
};
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
|
|
822
|
+
const getPropsToCopy=(object)=>{
|
|
823
|
+
const propNames=getOwnKeys(object);
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
for(const propName of CORE_ERROR_PROPS){
|
|
827
|
+
|
|
828
|
+
if(isInheritedProp(object,propName)){
|
|
829
|
+
|
|
830
|
+
propNames.push(propName);
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
return propNames
|
|
835
|
+
};
|
|
836
|
+
|
|
837
|
+
|
|
838
|
+
const getOwnKeys=(object)=>{
|
|
839
|
+
try{
|
|
840
|
+
return Reflect.ownKeys(object)
|
|
841
|
+
}catch{
|
|
842
|
+
return []
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
const isInheritedProp=(object,propName)=>{
|
|
848
|
+
try{
|
|
849
|
+
return propName in object&&!Object.hasOwn(object,propName)
|
|
850
|
+
}catch{
|
|
851
|
+
return false
|
|
852
|
+
}
|
|
853
|
+
};
|
|
854
|
+
|
|
855
|
+
const objectifyError=(object)=>{
|
|
856
|
+
const{name,message,stack,cause,errors,...objectA}=copyObject(object);
|
|
857
|
+
const messageA=getMessage$1(message,objectA);
|
|
858
|
+
const error=newError(name,messageA);
|
|
859
|
+
|
|
860
|
+
if(message===messageA){
|
|
861
|
+
assignObjectProps(error,objectA);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
Object.entries({name,stack,cause,errors}).forEach(
|
|
865
|
+
([propName,propValue])=>{
|
|
866
|
+
setNewErrorProperty(error,propName,propValue);
|
|
867
|
+
}
|
|
868
|
+
);
|
|
869
|
+
|
|
870
|
+
if(stack===undefined){
|
|
871
|
+
setStack(error);
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
return error
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
|
|
878
|
+
const getMessage$1=(message,object)=>
|
|
879
|
+
typeof message==="string"&&message!==""?
|
|
880
|
+
message:
|
|
881
|
+
truncateMessage(safeJsonStringify(object));
|
|
882
|
+
|
|
883
|
+
const safeJsonStringify=(object)=>{
|
|
884
|
+
try{
|
|
885
|
+
return JSON.stringify(object)
|
|
886
|
+
}catch{
|
|
887
|
+
return safeStringify$1(object)
|
|
888
|
+
}
|
|
889
|
+
};
|
|
890
|
+
|
|
891
|
+
const safeStringify$1=(object)=>{
|
|
892
|
+
try{
|
|
893
|
+
return String(object)
|
|
894
|
+
}catch{
|
|
895
|
+
return "Invalid error"
|
|
896
|
+
}
|
|
897
|
+
};
|
|
898
|
+
|
|
899
|
+
const truncateMessage=(message)=>
|
|
900
|
+
message.length<MESSAGE_MAX_SIZE?
|
|
901
|
+
message:
|
|
902
|
+
`${message.slice(0,MESSAGE_MAX_SIZE)}...`;
|
|
903
|
+
|
|
904
|
+
const MESSAGE_MAX_SIZE=1e3;
|
|
905
|
+
|
|
906
|
+
const newError=(name,message)=>{
|
|
907
|
+
if(name==="AggregateError"&&"AggregateError"in globalThis){
|
|
908
|
+
return new AggregateError([],message)
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
if(name in NATIVE_ERRORS){
|
|
912
|
+
return new NATIVE_ERRORS[name](message)
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
return new Error(message)
|
|
916
|
+
};
|
|
917
|
+
|
|
918
|
+
const NATIVE_ERRORS={
|
|
919
|
+
Error,
|
|
920
|
+
ReferenceError,
|
|
921
|
+
TypeError,
|
|
922
|
+
SyntaxError,
|
|
923
|
+
RangeError,
|
|
924
|
+
URIError,
|
|
925
|
+
EvalError
|
|
926
|
+
};
|
|
927
|
+
|
|
928
|
+
|
|
929
|
+
const assignObjectProps=(error,object)=>{
|
|
930
|
+
|
|
931
|
+
for(const propName in object){
|
|
932
|
+
|
|
933
|
+
if(!(propName in error)){
|
|
934
|
+
error[propName]=object[propName];
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
};
|
|
938
|
+
|
|
939
|
+
const setNewErrorProperty=(error,propName,propValue)=>{
|
|
940
|
+
if(propValue!==undefined){
|
|
941
|
+
setErrorProperty$1(error,propName,propValue);
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
|
|
945
|
+
const stringifyError=(value)=>{
|
|
946
|
+
try{
|
|
947
|
+
const error=new Error(String(value));
|
|
948
|
+
setStack(error);
|
|
949
|
+
return error
|
|
950
|
+
}catch(error_){
|
|
951
|
+
return error_
|
|
952
|
+
}
|
|
953
|
+
};
|
|
954
|
+
|
|
955
|
+
const{toString:objectToString}=Object.prototype;
|
|
956
|
+
|
|
957
|
+
|
|
958
|
+
const createError=(value)=>{
|
|
959
|
+
if(isErrorPlainObj(value)){
|
|
960
|
+
return objectifyError(value)
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
if(!isErrorInstance$1(value)){
|
|
964
|
+
return stringifyError(value)
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
if(isInvalidError(value)){
|
|
968
|
+
return objectifyError(value)
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
return value
|
|
972
|
+
};
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
const isErrorPlainObj=(value)=>{
|
|
976
|
+
try{
|
|
977
|
+
return isPlainObject(value)
|
|
978
|
+
}catch{
|
|
979
|
+
return false
|
|
980
|
+
}
|
|
981
|
+
};
|
|
982
|
+
|
|
983
|
+
const isInvalidError=(value)=>
|
|
984
|
+
isProxy(value)||isNonModifiableError(value)||hasInvalidConstructor(value);
|
|
985
|
+
|
|
986
|
+
|
|
987
|
+
|
|
988
|
+
|
|
989
|
+
const isProxy=(value)=>{
|
|
990
|
+
try{
|
|
991
|
+
return objectToString.call(value)==="[object Object]"
|
|
992
|
+
}catch{
|
|
993
|
+
return true
|
|
994
|
+
}
|
|
995
|
+
};
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
|
|
999
|
+
const hasInvalidConstructor=(error)=>
|
|
1000
|
+
typeof error.constructor!=="function"||
|
|
1001
|
+
typeof error.constructor.name!=="string"||
|
|
1002
|
+
error.constructor.name===""||
|
|
1003
|
+
error.constructor.prototype!==Object.getPrototypeOf(error);
|
|
1004
|
+
|
|
1005
|
+
const normalizeException=(error,{shallow=false}={})=>
|
|
1006
|
+
recurseException(error,[],shallow);
|
|
1007
|
+
|
|
1008
|
+
const recurseException=(error,parents,shallow)=>{
|
|
1009
|
+
if(parents.includes(error)){
|
|
1010
|
+
return
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
const recurse=shallow?
|
|
1014
|
+
identity:
|
|
1015
|
+
(innerError)=>recurseException(innerError,[...parents,error],shallow);
|
|
1016
|
+
|
|
1017
|
+
const errorA=createError(error);
|
|
1018
|
+
normalizeProps(errorA,recurse);
|
|
1019
|
+
return errorA
|
|
1020
|
+
};
|
|
1021
|
+
|
|
1022
|
+
const identity=(error)=>error;
|
|
1023
|
+
|
|
1024
|
+
const normalizeProps=(error,recurse)=>{
|
|
1025
|
+
normalizeName(error);
|
|
1026
|
+
normalizeMessage(error);
|
|
1027
|
+
normalizeStack(error);
|
|
1028
|
+
normalizeCause(error,recurse);
|
|
1029
|
+
normalizeAggregate(error,recurse);
|
|
1030
|
+
normalizeDescriptors(error);
|
|
1031
|
+
};
|
|
1032
|
+
|
|
1033
|
+
|
|
1034
|
+
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
|
|
1038
|
+
const normalizeName=(error)=>{
|
|
1039
|
+
if(isDefinedString$1(error.name)){
|
|
1040
|
+
return
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
const prototypeName=Object.getPrototypeOf(error).name;
|
|
1044
|
+
const name=isDefinedString$1(prototypeName)?
|
|
1045
|
+
prototypeName:
|
|
1046
|
+
error.constructor.name;
|
|
1047
|
+
setErrorProperty$1(error,"name",name);
|
|
1048
|
+
};
|
|
1049
|
+
|
|
1050
|
+
|
|
1051
|
+
const normalizeMessage=(error)=>{
|
|
1052
|
+
if(!isDefinedString$1(error.message)){
|
|
1053
|
+
setErrorProperty$1(error,"message","");
|
|
1054
|
+
}
|
|
1055
|
+
};
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
const normalizeStack=(error)=>{
|
|
1059
|
+
if(!isDefinedString$1(error.stack)){
|
|
1060
|
+
setStack(error);
|
|
1061
|
+
}
|
|
1062
|
+
};
|
|
1063
|
+
|
|
1064
|
+
const isDefinedString$1=(value)=>typeof value==="string"&&value!=="";
|
|
1065
|
+
|
|
1066
|
+
const normalizeArgs$1=(error,ErrorClass,currentName=error.name)=>{
|
|
1067
|
+
validateErrorClass(ErrorClass);
|
|
1068
|
+
|
|
1069
|
+
if(typeof currentName!=="string"){
|
|
1070
|
+
throw new TypeError(`currentName must be a string: ${currentName}`)
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
return currentName
|
|
1074
|
+
};
|
|
1075
|
+
|
|
1076
|
+
const validateErrorClass=(ErrorClass)=>{
|
|
1077
|
+
if(!isClass(ErrorClass)){
|
|
1078
|
+
throw new TypeError(`ErrorClass must be a class: ${ErrorClass}`)
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
if(!isErrorClass(ErrorClass.prototype)){
|
|
1082
|
+
throw new TypeError(`ErrorClass must inherit from Error: ${ErrorClass}`)
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
if(!hasConstructor(ErrorClass)){
|
|
1086
|
+
throw new TypeError(
|
|
1087
|
+
`ErrorClass must be have a valid constructor: ${ErrorClass}`
|
|
1088
|
+
)
|
|
1089
|
+
}
|
|
1090
|
+
};
|
|
1091
|
+
|
|
1092
|
+
const isClass=(ErrorClass)=>
|
|
1093
|
+
typeof ErrorClass==="function"&&
|
|
1094
|
+
typeof ErrorClass.prototype==="object"&&
|
|
1095
|
+
ErrorClass.prototype!==null;
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
const isErrorClass=(prototype)=>
|
|
1099
|
+
prototype!==null&&(
|
|
1100
|
+
prototype.name==="Error"||isErrorClass(Object.getPrototypeOf(prototype)));
|
|
1101
|
+
|
|
1102
|
+
const hasConstructor=(ErrorClass)=>
|
|
1103
|
+
typeof ErrorClass.prototype.constructor==="function";
|
|
1104
|
+
|
|
1105
|
+
const setNonEnumProp$1=(error,propName,value)=>{
|
|
1106
|
+
|
|
1107
|
+
Object.defineProperty(error,propName,{
|
|
1108
|
+
value,
|
|
1109
|
+
enumerable:false,
|
|
1110
|
+
writable:true,
|
|
1111
|
+
configurable:true
|
|
477
1112
|
});
|
|
1113
|
+
};
|
|
1114
|
+
|
|
1115
|
+
const updatePrototype=(error,ErrorClass)=>{
|
|
1116
|
+
if(Object.getPrototypeOf(error)===ErrorClass.prototype){
|
|
1117
|
+
return
|
|
1118
|
+
}
|
|
1119
|
+
|
|
1120
|
+
setPrototype(error,ErrorClass);
|
|
1121
|
+
deleteOwnProperty(error,"constructor");
|
|
1122
|
+
fixName(error,ErrorClass);
|
|
1123
|
+
};
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
const setPrototype=(error,ErrorClass)=>{
|
|
1130
|
+
|
|
1131
|
+
Object.setPrototypeOf(error,ErrorClass.prototype);
|
|
1132
|
+
};
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
|
|
1143
|
+
const fixName=(error,ErrorClass)=>{
|
|
1144
|
+
deleteOwnProperty(error,"name");
|
|
1145
|
+
|
|
1146
|
+
const prototypeName=getClassName(ErrorClass.prototype);
|
|
1147
|
+
|
|
1148
|
+
if(error.name!==prototypeName){
|
|
1149
|
+
setNonEnumProp$1(error,"name",prototypeName);
|
|
1150
|
+
}
|
|
1151
|
+
};
|
|
1152
|
+
|
|
1153
|
+
const getClassName=(prototype)=>
|
|
1154
|
+
getPrototypeName(prototype)??
|
|
1155
|
+
getConstructorName(prototype)??
|
|
1156
|
+
getClassName(Object.getPrototypeOf(prototype));
|
|
1157
|
+
|
|
1158
|
+
const getPrototypeName=(prototype)=>
|
|
1159
|
+
Object.hasOwn(prototype,"name")&&isDefinedString(prototype.name)?
|
|
1160
|
+
prototype.name:
|
|
1161
|
+
undefined;
|
|
1162
|
+
|
|
1163
|
+
const getConstructorName=(prototype)=>
|
|
1164
|
+
typeof prototype.constructor==="function"&&
|
|
1165
|
+
isDefinedString(prototype.constructor.name)?
|
|
1166
|
+
prototype.constructor.name:
|
|
1167
|
+
undefined;
|
|
1168
|
+
|
|
1169
|
+
const isDefinedString=(value)=>typeof value==="string"&&value!=="";
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
const deleteOwnProperty=(error,propName)=>{
|
|
1174
|
+
if(Object.hasOwn(error,propName)){
|
|
1175
|
+
|
|
1176
|
+
delete error[propName];
|
|
1177
|
+
}
|
|
1178
|
+
};
|
|
1179
|
+
|
|
1180
|
+
const updateStack$1=(error,currentName)=>{
|
|
1181
|
+
if(!shouldUpdateStack(error,currentName)){
|
|
1182
|
+
return
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
const stack=getStack$2(error,currentName);
|
|
1186
|
+
setNonEnumProp$1(error,"stack",stack);
|
|
1187
|
+
};
|
|
1188
|
+
|
|
1189
|
+
const shouldUpdateStack=(error,currentName)=>
|
|
1190
|
+
currentName!==error.name&&
|
|
1191
|
+
currentName!==""&&
|
|
1192
|
+
error.stack.includes(currentName)&&
|
|
1193
|
+
stackIncludesName();
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
const stackIncludesName=()=>{
|
|
1197
|
+
|
|
1198
|
+
class StackError extends Error{}
|
|
1199
|
+
const descriptor={
|
|
1200
|
+
value:EXAMPLE_NAME,
|
|
1201
|
+
enumerable:false,
|
|
1202
|
+
writable:true,
|
|
1203
|
+
configurable:true
|
|
1204
|
+
};
|
|
1205
|
+
|
|
1206
|
+
Object.defineProperty(StackError,"name",descriptor);
|
|
1207
|
+
|
|
1208
|
+
Object.defineProperty(StackError.prototype,"name",descriptor);
|
|
1209
|
+
const{stack}=new StackError("");
|
|
1210
|
+
return typeof stack==="string"&&stack.includes(EXAMPLE_NAME)
|
|
1211
|
+
};
|
|
1212
|
+
|
|
1213
|
+
const EXAMPLE_NAME="SetErrorClassError";
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
const getStack$2=({name,stack},currentName)=>{
|
|
1223
|
+
if(stack.startsWith(`${currentName}: `)){
|
|
1224
|
+
return stack.replace(currentName,name)
|
|
1225
|
+
}
|
|
1226
|
+
|
|
1227
|
+
const replacers=getReplacers$1(currentName,name);
|
|
1228
|
+
const[fromA,to]=replacers.find(([from])=>stack.includes(from));
|
|
1229
|
+
return stack.replace(fromA,to)
|
|
1230
|
+
};
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
const getReplacers$1=(currentName,newName)=>[
|
|
1235
|
+
[`\n${currentName}: `,`\n${newName}: `],
|
|
1236
|
+
[`${currentName}: `,`${newName}: `],
|
|
1237
|
+
[`${currentName} `,`${newName} `],
|
|
1238
|
+
[currentName,newName]];
|
|
1239
|
+
|
|
1240
|
+
const setErrorClass=(error,ErrorClass,currentName)=>{
|
|
1241
|
+
const errorA=normalizeException(error);
|
|
1242
|
+
const currentNameA=normalizeArgs$1(errorA,ErrorClass,currentName);
|
|
1243
|
+
updatePrototype(errorA,ErrorClass);
|
|
1244
|
+
updateStack$1(errorA,currentNameA);
|
|
1245
|
+
return errorA
|
|
1246
|
+
};
|
|
1247
|
+
|
|
1248
|
+
const mergeDescriptors=(newDescriptor,currentDescriptor)=>
|
|
1249
|
+
currentDescriptor.configurable===false?
|
|
1250
|
+
mergeNonConfig(newDescriptor,currentDescriptor):
|
|
1251
|
+
mergeConfig(newDescriptor,currentDescriptor);
|
|
1252
|
+
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
const mergeNonConfig=(newDescriptor,currentDescriptor)=>({
|
|
1257
|
+
...currentDescriptor,
|
|
1258
|
+
...getNonConfigWritable(newDescriptor,currentDescriptor),
|
|
1259
|
+
...getNonConfigValue(newDescriptor,currentDescriptor)
|
|
1260
|
+
});
|
|
1261
|
+
|
|
1262
|
+
const getNonConfigWritable=(newDescriptor,currentDescriptor)=>
|
|
1263
|
+
currentDescriptor.writable===true&&newDescriptor.writable===false?
|
|
1264
|
+
{writable:false}:
|
|
1265
|
+
{};
|
|
1266
|
+
|
|
1267
|
+
const getNonConfigValue=(newDescriptor,currentDescriptor)=>
|
|
1268
|
+
newDescriptor.hasValue&&
|
|
1269
|
+
"value"in currentDescriptor&&
|
|
1270
|
+
currentDescriptor.writable===true?
|
|
1271
|
+
{value:newDescriptor.value}:
|
|
1272
|
+
{};
|
|
1273
|
+
|
|
1274
|
+
const mergeConfig=(newDescriptor,currentDescriptor)=>{
|
|
1275
|
+
const enumerable=mergeDescriptor(
|
|
1276
|
+
newDescriptor.enumerable,
|
|
1277
|
+
currentDescriptor.enumerable,
|
|
1278
|
+
true
|
|
1279
|
+
);
|
|
1280
|
+
const writable=mergeDescriptor(
|
|
1281
|
+
newDescriptor.writable,
|
|
1282
|
+
currentDescriptor.writable,
|
|
1283
|
+
true
|
|
1284
|
+
);
|
|
1285
|
+
const configurable=mergeDescriptor(
|
|
1286
|
+
newDescriptor.configurable,
|
|
1287
|
+
currentDescriptor.configurable,
|
|
1288
|
+
true
|
|
1289
|
+
);
|
|
1290
|
+
const valueProps=mergeValue(newDescriptor,currentDescriptor,writable);
|
|
1291
|
+
return {...valueProps,enumerable,configurable}
|
|
1292
|
+
};
|
|
1293
|
+
|
|
1294
|
+
const mergeValue=(newDescriptor,currentDescriptor,writable)=>{
|
|
1295
|
+
if(newDescriptor.hasValue){
|
|
1296
|
+
return {value:newDescriptor.value,writable}
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
if(!hasGetSet(newDescriptor)&&!hasGetSet(currentDescriptor)){
|
|
1300
|
+
return {value:currentDescriptor.value,writable}
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
return {
|
|
1304
|
+
get:mergeDescriptor(newDescriptor.get,currentDescriptor.get),
|
|
1305
|
+
set:mergeDescriptor(newDescriptor.set,currentDescriptor.set)
|
|
1306
|
+
}
|
|
1307
|
+
};
|
|
1308
|
+
|
|
1309
|
+
const hasGetSet=({get,set})=>get!==undefined||set!==undefined;
|
|
1310
|
+
|
|
1311
|
+
const mergeDescriptor=(newValue,currentValue,defaultValue)=>
|
|
1312
|
+
newValue??currentValue??defaultValue;
|
|
1313
|
+
|
|
1314
|
+
const normalizeInput=(input,key,newDescriptor)=>{
|
|
1315
|
+
if(!isAnyObj(input)){
|
|
1316
|
+
throw new TypeError(`Argument must be an object: ${input}`)
|
|
1317
|
+
}
|
|
1318
|
+
|
|
1319
|
+
if(!isValidKey(key)){
|
|
1320
|
+
throw new TypeError(
|
|
1321
|
+
`Property key must be a string, a symbol or an integer: ${key}`
|
|
1322
|
+
)
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
return normalizeDescriptor(newDescriptor)
|
|
1326
|
+
};
|
|
1327
|
+
|
|
1328
|
+
const isAnyObj=(value)=>typeof value==="object"&&value!==null;
|
|
1329
|
+
|
|
1330
|
+
const isValidKey=(key)=>{
|
|
1331
|
+
const type=typeof key;
|
|
1332
|
+
return type==="string"||type==="symbol"||type==="number"
|
|
1333
|
+
};
|
|
1334
|
+
|
|
1335
|
+
const normalizeDescriptor=(newDescriptor)=>{
|
|
1336
|
+
if(!isPlainObject(newDescriptor)){
|
|
1337
|
+
throw new TypeError(`Descriptor must be a plain object: ${newDescriptor}`)
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
const{
|
|
1341
|
+
enumerable,
|
|
1342
|
+
writable,
|
|
1343
|
+
configurable,
|
|
1344
|
+
value,
|
|
1345
|
+
get,
|
|
1346
|
+
set,
|
|
1347
|
+
...unknownProps
|
|
1348
|
+
}=newDescriptor;
|
|
1349
|
+
const hasValue=("value"in newDescriptor);
|
|
1350
|
+
validateDescriptor({
|
|
1351
|
+
enumerable,
|
|
1352
|
+
writable,
|
|
1353
|
+
configurable,
|
|
1354
|
+
get,
|
|
1355
|
+
set,
|
|
1356
|
+
unknownProps,
|
|
1357
|
+
hasValue
|
|
1358
|
+
});
|
|
1359
|
+
return {enumerable,writable,configurable,value,get,set,hasValue}
|
|
1360
|
+
};
|
|
1361
|
+
|
|
1362
|
+
const validateDescriptor=({
|
|
1363
|
+
enumerable,
|
|
1364
|
+
writable,
|
|
1365
|
+
configurable,
|
|
1366
|
+
get,
|
|
1367
|
+
set,
|
|
1368
|
+
unknownProps,
|
|
1369
|
+
hasValue
|
|
1370
|
+
})=>{
|
|
1371
|
+
validateGetSet(hasValue,get,"get");
|
|
1372
|
+
validateGetSet(hasValue,set,"set");
|
|
1373
|
+
validateBoolean(enumerable,"enumerable");
|
|
1374
|
+
validateBoolean(writable,"writable");
|
|
1375
|
+
validateBoolean(configurable,"configurable");
|
|
1376
|
+
validateUnknownProps(unknownProps);
|
|
1377
|
+
};
|
|
1378
|
+
|
|
1379
|
+
const validateGetSet=(hasValue,getSet,propName)=>{
|
|
1380
|
+
validateFunction(getSet,propName);
|
|
1381
|
+
|
|
1382
|
+
if(hasValue&&getSet!==undefined){
|
|
1383
|
+
throw new TypeError(
|
|
1384
|
+
`Descriptor property "value" and "${propName}" must not both be defined: ${getSet}`
|
|
1385
|
+
)
|
|
1386
|
+
}
|
|
1387
|
+
};
|
|
1388
|
+
|
|
1389
|
+
const validateFunction=(propValue,propName)=>{
|
|
1390
|
+
if(propValue!==undefined&&typeof propValue!=="function"){
|
|
1391
|
+
throw new TypeError(
|
|
1392
|
+
`Descriptor property "${propName}" must be a function: ${propValue}`
|
|
1393
|
+
)
|
|
1394
|
+
}
|
|
1395
|
+
};
|
|
1396
|
+
|
|
1397
|
+
const validateBoolean=(propValue,propName)=>{
|
|
1398
|
+
if(propValue!==undefined&&typeof propValue!=="boolean"){
|
|
1399
|
+
throw new TypeError(
|
|
1400
|
+
`Descriptor property "${propName}" must be a boolean: ${propValue}`
|
|
1401
|
+
)
|
|
1402
|
+
}
|
|
1403
|
+
};
|
|
1404
|
+
|
|
1405
|
+
const validateUnknownProps=(unknownProps)=>{
|
|
1406
|
+
const[unknownProp]=Object.keys(unknownProps);
|
|
1407
|
+
|
|
1408
|
+
if(unknownProp!==undefined){
|
|
1409
|
+
throw new TypeError(
|
|
1410
|
+
`Unknown descriptor property "${unknownProp}": ${unknownProps[unknownProp]}`
|
|
1411
|
+
)
|
|
1412
|
+
}
|
|
1413
|
+
};
|
|
1414
|
+
|
|
1415
|
+
const redefineProperty=(input,key,newDescriptor)=>{
|
|
1416
|
+
const newDescriptorA=normalizeInput(input,key,newDescriptor);
|
|
1417
|
+
const currentDescriptor=getCurrentDescriptor(input,key);
|
|
1418
|
+
const finalDescriptor=mergeDescriptors(newDescriptorA,currentDescriptor);
|
|
1419
|
+
setProperty(input,key,finalDescriptor);
|
|
1420
|
+
return input
|
|
1421
|
+
};
|
|
1422
|
+
|
|
1423
|
+
|
|
1424
|
+
const getCurrentDescriptor=(input,key)=>{
|
|
1425
|
+
const descriptor=Object.getOwnPropertyDescriptor(input,key);
|
|
1426
|
+
|
|
1427
|
+
if(descriptor!==undefined){
|
|
1428
|
+
return descriptor
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
const prototype=Object.getPrototypeOf(input);
|
|
1432
|
+
return prototype===null?{}:getCurrentDescriptor(prototype,key)
|
|
1433
|
+
};
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
const setProperty=(input,key,finalDescriptor)=>{
|
|
1437
|
+
try{
|
|
1438
|
+
|
|
1439
|
+
Object.defineProperty(input,key,finalDescriptor);
|
|
1440
|
+
}catch{}
|
|
1441
|
+
};
|
|
1442
|
+
|
|
1443
|
+
const assignProp=(error,propName,propValue)=>{
|
|
1444
|
+
if(propValue!==undefined){
|
|
1445
|
+
return setProp(error,propName,propValue)
|
|
1446
|
+
}
|
|
1447
|
+
|
|
1448
|
+
try{
|
|
1449
|
+
|
|
1450
|
+
delete error[propName];
|
|
1451
|
+
}catch{}
|
|
1452
|
+
|
|
1453
|
+
if(error[propName]!==undefined){
|
|
1454
|
+
return setProp(error,propName)
|
|
1455
|
+
}
|
|
1456
|
+
};
|
|
1457
|
+
|
|
1458
|
+
const setProp=(error,propName,propValue)=>{
|
|
1459
|
+
const nonEnum=getNonEnum(propName);
|
|
1460
|
+
redefineProperty(error,propName,{value:propValue,...nonEnum});
|
|
1461
|
+
};
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
const getNonEnum=(propName)=>
|
|
1465
|
+
typeof propName==="string"&&propName.startsWith("_")?
|
|
1466
|
+
{enumerable:false}:
|
|
1467
|
+
{};
|
|
1468
|
+
|
|
1469
|
+
const isErrorInstance=(value)=>
|
|
1470
|
+
isInstanceOfError(value)||hasErrorTag(value);
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
const isInstanceOfError=(value)=>{
|
|
1475
|
+
try{
|
|
1476
|
+
return value instanceof Error
|
|
1477
|
+
}catch{
|
|
1478
|
+
return false
|
|
1479
|
+
}
|
|
1480
|
+
};
|
|
1481
|
+
|
|
1482
|
+
const hasErrorTag=(value)=>{
|
|
1483
|
+
try{
|
|
1484
|
+
return ERROR_TAGS.has(Object.prototype.toString.call(value))
|
|
1485
|
+
}catch{
|
|
1486
|
+
return false
|
|
1487
|
+
}
|
|
1488
|
+
};
|
|
1489
|
+
|
|
1490
|
+
const ERROR_TAGS=new Set([
|
|
1491
|
+
|
|
1492
|
+
"[object Error]",
|
|
1493
|
+
|
|
1494
|
+
"[object DOMException]",
|
|
1495
|
+
|
|
1496
|
+
"[object DOMError]",
|
|
1497
|
+
|
|
1498
|
+
"[object Exception]"]
|
|
1499
|
+
);
|
|
1500
|
+
|
|
1501
|
+
const normalizeOptions=(error,props,opts={})=>{
|
|
1502
|
+
validateErrorOrObject(error,"First argument");
|
|
1503
|
+
validateErrorOrObject(props,"Second argument");
|
|
1504
|
+
|
|
1505
|
+
if(!isPlainObject(opts)){
|
|
1506
|
+
throw new TypeError(`Options must be a plain object: ${opts}`)
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
const{soft=false}=opts;
|
|
1510
|
+
|
|
1511
|
+
if(typeof soft!=="boolean"){
|
|
1512
|
+
throw new TypeError(`Option "soft" must be a boolean: ${soft}`)
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
return {soft}
|
|
1516
|
+
};
|
|
1517
|
+
|
|
1518
|
+
const validateErrorOrObject=(value,prefix)=>{
|
|
1519
|
+
if(value===undefined){
|
|
1520
|
+
throw new TypeError(`${prefix} is required.`)
|
|
1521
|
+
}
|
|
1522
|
+
|
|
1523
|
+
if(!isErrorOrObject(value)){
|
|
1524
|
+
throw new TypeError(
|
|
1525
|
+
`${prefix} must be a plain object or an error: ${value}`
|
|
1526
|
+
)
|
|
1527
|
+
}
|
|
1528
|
+
};
|
|
1529
|
+
|
|
1530
|
+
const isErrorOrObject=(value)=>isPlainObject(value)||isErrorInstance(value);
|
|
1531
|
+
|
|
1532
|
+
const shouldSkipProp=({error,props,propName,soft})=>
|
|
1533
|
+
isIgnoredPropName(propName)||
|
|
1534
|
+
!isEnum.call(props,propName)||
|
|
1535
|
+
soft&&error[propName]!==undefined;
|
|
1536
|
+
|
|
1537
|
+
const isIgnoredPropName=(propName)=>
|
|
1538
|
+
propName in CHECK_ERROR||IGNORED_PROPS.has(propName);
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
const CHECK_ERROR=new Error("check");
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
const IGNORED_PROPS=new Set(["prototype","errors","cause"]);
|
|
1548
|
+
|
|
1549
|
+
const{propertyIsEnumerable:isEnum}=Object.prototype;
|
|
1550
|
+
|
|
1551
|
+
const setErrorProps=(error,props,opts)=>{
|
|
1552
|
+
const{soft}=normalizeOptions(error,props,opts);
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
for(const propName of Reflect.ownKeys(props)){
|
|
1556
|
+
setErrorProp({error,props,propName,soft});
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1559
|
+
return error
|
|
1560
|
+
};
|
|
1561
|
+
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
const setErrorProp=({error,props,propName,soft})=>{
|
|
1567
|
+
if(!shouldSkipProp({error,props,propName,soft})){
|
|
1568
|
+
assignProp(error,propName,props[propName]);
|
|
1569
|
+
}
|
|
1570
|
+
};
|
|
1571
|
+
|
|
1572
|
+
const setErrorProperty=(error,propName,value)=>{
|
|
1573
|
+
|
|
1574
|
+
Object.defineProperty(error,propName,{
|
|
1575
|
+
value,
|
|
1576
|
+
writable:true,
|
|
1577
|
+
enumerable:false,
|
|
1578
|
+
configurable:true
|
|
1579
|
+
});
|
|
1580
|
+
};
|
|
1581
|
+
|
|
1582
|
+
const mergeAggregateCauses=(parent,recurse)=>{
|
|
1583
|
+
if(parent.errors===undefined){
|
|
1584
|
+
return
|
|
1585
|
+
}
|
|
1586
|
+
|
|
1587
|
+
const errors=parent.errors.
|
|
1588
|
+
map((error)=>recurse(error).error).
|
|
1589
|
+
filter(Boolean);
|
|
1590
|
+
setErrorProperty(parent,"errors",errors);
|
|
1591
|
+
};
|
|
1592
|
+
|
|
1593
|
+
const mergeAggregateErrors=({target,source,parent,child})=>{
|
|
1594
|
+
if(!hasErrors(target)){
|
|
1595
|
+
mergeSourceErrors(target,source);
|
|
1596
|
+
return
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
if(hasErrors(source)){
|
|
1600
|
+
setErrorProperty(target,"errors",[...child.errors,...parent.errors]);
|
|
1601
|
+
}
|
|
1602
|
+
};
|
|
1603
|
+
|
|
1604
|
+
const mergeSourceErrors=(target,source)=>{
|
|
1605
|
+
if(source.errors!==undefined){
|
|
1606
|
+
setErrorProperty(target,"errors",source.errors);
|
|
1607
|
+
}
|
|
1608
|
+
};
|
|
1609
|
+
|
|
1610
|
+
const hasErrors=(targetOrSource)=>
|
|
1611
|
+
targetOrSource.errors!==undefined&&targetOrSource.errors.length!==0;
|
|
1612
|
+
|
|
1613
|
+
const normalizeArgs=(
|
|
1614
|
+
error,
|
|
1615
|
+
newMessage,
|
|
1616
|
+
currentMessage=error.message)=>
|
|
1617
|
+
{
|
|
1618
|
+
if(typeof newMessage!=="string"){
|
|
1619
|
+
throw new TypeError(`newMessage must be a string: ${newMessage}`)
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
if(typeof currentMessage!=="string"){
|
|
1623
|
+
throw new TypeError(`currentMessage must be a string: ${currentMessage}`)
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
return currentMessage
|
|
1627
|
+
};
|
|
1628
|
+
|
|
1629
|
+
const getStack$1=({name,stack},newMessage,currentMessage)=>
|
|
1630
|
+
currentMessage!==""&&stack.includes(currentMessage)?
|
|
1631
|
+
replaceMessage({name,stack,newMessage,currentMessage}):
|
|
1632
|
+
insertMessage(name,stack,newMessage);
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
const replaceMessage=({name,stack,newMessage,currentMessage})=>{
|
|
1637
|
+
const replacers=getReplacers(name,newMessage,currentMessage);
|
|
1638
|
+
const[fromA,to]=replacers.find(([from])=>stack.includes(from));
|
|
1639
|
+
return stack.replace(fromA,to)
|
|
1640
|
+
};
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
const getReplacers=(name,newMessage,currentMessage)=>[
|
|
1645
|
+
[`${name}: ${currentMessage}`,`${name}: ${newMessage}`],
|
|
1646
|
+
[`: ${currentMessage}`,`: ${newMessage}`],
|
|
1647
|
+
[`\n${currentMessage}`,`\n${newMessage}`],
|
|
1648
|
+
[` ${currentMessage}`,` ${newMessage}`],
|
|
1649
|
+
[currentMessage,newMessage]];
|
|
1650
|
+
|
|
1651
|
+
|
|
1652
|
+
const insertMessage=(name,stack,newMessage)=>{
|
|
1653
|
+
const nameAndColon=`${name}: `;
|
|
1654
|
+
const newMessageA=newMessage.trimEnd();
|
|
1655
|
+
|
|
1656
|
+
if(stack===name||stack.startsWith(`${name}\n`)){
|
|
1657
|
+
return stack.replace(name,`${nameAndColon}${newMessageA}`)
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
return stack.startsWith(nameAndColon)?
|
|
1661
|
+
stack.replace(nameAndColon,`${nameAndColon}${newMessageA}\n`):
|
|
1662
|
+
`${nameAndColon}${newMessageA}\n${stack}`
|
|
1663
|
+
};
|
|
1664
|
+
|
|
1665
|
+
const setErrorMessage=(error,newMessage,currentMessage)=>{
|
|
1666
|
+
const errorA=normalizeException(error);
|
|
1667
|
+
const currentMessageA=normalizeArgs(errorA,newMessage,currentMessage);
|
|
1668
|
+
setNonEnumProp(errorA,"message",newMessage);
|
|
1669
|
+
updateStack(errorA,newMessage,currentMessageA);
|
|
1670
|
+
return errorA
|
|
1671
|
+
};
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
const updateStack=(error,newMessage,currentMessage)=>{
|
|
1676
|
+
if(newMessage===currentMessage||!stackIncludesMessage()){
|
|
1677
|
+
return
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
const stack=getStack$1(error,newMessage,currentMessage);
|
|
1681
|
+
setNonEnumProp(error,"stack",stack);
|
|
1682
|
+
};
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
const stackIncludesMessage=()=>{
|
|
1686
|
+
const{stack}=new Error(EXAMPLE_MESSAGE);
|
|
1687
|
+
return typeof stack==="string"&&stack.includes(EXAMPLE_MESSAGE)
|
|
1688
|
+
};
|
|
1689
|
+
|
|
1690
|
+
const EXAMPLE_MESSAGE="set-error-message test message";
|
|
1691
|
+
|
|
1692
|
+
const setNonEnumProp=(error,propName,value)=>{
|
|
1693
|
+
|
|
1694
|
+
Object.defineProperty(error,propName,{
|
|
1695
|
+
value,
|
|
1696
|
+
enumerable:false,
|
|
1697
|
+
writable:true,
|
|
1698
|
+
configurable:true
|
|
1699
|
+
});
|
|
1700
|
+
};
|
|
1701
|
+
|
|
1702
|
+
const wrapErrorMessage=(error,newMessage,oldMessage)=>{
|
|
1703
|
+
if(typeof newMessage!=="string"){
|
|
1704
|
+
throw new TypeError(
|
|
1705
|
+
`Second argument must be a message string: ${newMessage}`
|
|
1706
|
+
)
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
const errorA=normalizeException(error);
|
|
1710
|
+
const message=getMessage(newMessage,errorA.message);
|
|
1711
|
+
return setErrorMessage(errorA,message,oldMessage)
|
|
1712
|
+
};
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
|
|
1721
|
+
|
|
1722
|
+
const getMessage=(rawNewMessage,rawCurrentMessage)=>{
|
|
1723
|
+
const newMessage=rawNewMessage.trim();
|
|
1724
|
+
const currentMessage=rawCurrentMessage.trim();
|
|
1725
|
+
|
|
1726
|
+
if(newMessage===""){
|
|
1727
|
+
return currentMessage
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
if(currentMessage===""){
|
|
1731
|
+
return newMessage
|
|
1732
|
+
}
|
|
1733
|
+
|
|
1734
|
+
return concatMessages(newMessage,currentMessage,rawNewMessage)
|
|
1735
|
+
};
|
|
1736
|
+
|
|
1737
|
+
const concatMessages=(newMessage,currentMessage,rawNewMessage)=>{
|
|
1738
|
+
if(!newMessage.endsWith(PREPEND_CHAR)){
|
|
1739
|
+
return `${currentMessage}\n${newMessage}`
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
return rawNewMessage.endsWith(PREPEND_NEWLINE_CHAR)?
|
|
1743
|
+
`${newMessage}\n${currentMessage}`:
|
|
1744
|
+
`${newMessage} ${currentMessage}`
|
|
1745
|
+
};
|
|
1746
|
+
|
|
1747
|
+
const PREPEND_CHAR=":";
|
|
1748
|
+
const PREPEND_NEWLINE_CHAR="\n";
|
|
1749
|
+
|
|
1750
|
+
const mergeMessage=({parent,child,target,stackError})=>{
|
|
1751
|
+
const parentMessage=parent.message;
|
|
1752
|
+
|
|
1753
|
+
target.message=child.message;
|
|
1754
|
+
return wrapErrorMessage(target,parentMessage,stackError.message)
|
|
1755
|
+
};
|
|
1756
|
+
|
|
1757
|
+
const hasStack=(error,stack)=>getStack(error)===stack;
|
|
1758
|
+
|
|
1759
|
+
|
|
1760
|
+
|
|
1761
|
+
|
|
1762
|
+
const getStack=(error)=>
|
|
1763
|
+
typeof error==="object"&&error!==null?error.stack:undefined;
|
|
1764
|
+
|
|
1765
|
+
|
|
1766
|
+
|
|
1767
|
+
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
const mergeStack=({wrap,target,source,childHasStack})=>{
|
|
1775
|
+
if(wrap===childHasStack){
|
|
1776
|
+
return target
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
setErrorProperty(target,"stack",source.stack);
|
|
1780
|
+
return source
|
|
1781
|
+
};
|
|
1782
|
+
|
|
1783
|
+
const getWrap=(parent)=>{
|
|
1784
|
+
const{wrap,name}=parent;
|
|
1785
|
+
|
|
1786
|
+
if(typeof wrap!=="boolean"){
|
|
1787
|
+
return name==="Error"
|
|
1788
|
+
}
|
|
1789
|
+
|
|
1790
|
+
if(Object.hasOwn(parent,"wrap")){
|
|
1791
|
+
|
|
1792
|
+
delete parent.wrap;
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
return wrap
|
|
1796
|
+
};
|
|
1797
|
+
|
|
1798
|
+
const mergeErrorCause=(error)=>mergeError(error,[]).error;
|
|
1799
|
+
|
|
1800
|
+
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
const mergeError=(error,parents)=>{
|
|
1806
|
+
if(parents.includes(error)){
|
|
1807
|
+
return {}
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
const recurse=(innerError)=>mergeError(innerError,[...parents,error]);
|
|
1811
|
+
const stack=getStack(error);
|
|
1812
|
+
const errorA=normalizeException(error,{shallow:true});
|
|
1813
|
+
const parentHasStack=hasStack(errorA,stack);
|
|
1814
|
+
|
|
1815
|
+
mergeAggregateCauses(errorA,recurse);
|
|
1816
|
+
const{parent:errorB,childHasStack}=mergeCause(errorA,recurse);
|
|
1817
|
+
const errorHasStack=parentHasStack||childHasStack;
|
|
1818
|
+
return {error:errorB,errorHasStack}
|
|
1819
|
+
};
|
|
1820
|
+
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
const mergeCause=(parent,recurse)=>{
|
|
1824
|
+
const wrap=getWrap(parent);
|
|
1825
|
+
|
|
1826
|
+
if(parent.cause===undefined){
|
|
1827
|
+
return {parent,childHasStack:false}
|
|
1828
|
+
}
|
|
1829
|
+
|
|
1830
|
+
const{error:child,errorHasStack:childHasStack}=recurse(parent.cause);
|
|
1831
|
+
|
|
1832
|
+
delete parent.cause;
|
|
1833
|
+
const parentA=mergeChild({parent,child,childHasStack,wrap});
|
|
1834
|
+
return {parent:parentA,childHasStack}
|
|
1835
|
+
};
|
|
1836
|
+
|
|
1837
|
+
const mergeChild=({parent,child,childHasStack,wrap})=>{
|
|
1838
|
+
if(child===undefined){
|
|
1839
|
+
return parent
|
|
1840
|
+
}
|
|
1841
|
+
|
|
1842
|
+
const[target,source]=wrap?[child,parent]:[parent,child];
|
|
1843
|
+
const stackError=mergeStack({wrap,target,source,childHasStack});
|
|
1844
|
+
const targetA=setErrorClass(target,target.constructor,stackError.name);
|
|
1845
|
+
const targetB=mergeMessage({parent,child,target:targetA,stackError});
|
|
1846
|
+
mergeAggregateErrors({target:targetB,source,parent,child});
|
|
1847
|
+
const targetC=setErrorProps(targetB,source,{soft:!wrap});
|
|
1848
|
+
return targetC
|
|
1849
|
+
};
|
|
1850
|
+
|
|
1851
|
+
function safeStringifyReplacer(seen) {
|
|
1852
|
+
return function (key, value) {
|
|
1853
|
+
// Handle objects with a custom `.toJSON()` method.
|
|
1854
|
+
if (typeof value?.toJSON === 'function') {
|
|
1855
|
+
value = value.toJSON();
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
if (!(value !== null && typeof value === 'object')) {
|
|
1859
|
+
return value;
|
|
1860
|
+
}
|
|
1861
|
+
|
|
1862
|
+
if (seen.has(value)) {
|
|
1863
|
+
return '[Circular]';
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1866
|
+
seen.add(value);
|
|
1867
|
+
|
|
1868
|
+
const newValue = Array.isArray(value) ? [] : {};
|
|
1869
|
+
|
|
1870
|
+
for (const [key2, value2] of Object.entries(value)) {
|
|
1871
|
+
newValue[key2] = safeStringifyReplacer(seen)(key2, value2);
|
|
1872
|
+
}
|
|
1873
|
+
|
|
1874
|
+
seen.delete(value);
|
|
1875
|
+
|
|
1876
|
+
return newValue;
|
|
1877
|
+
};
|
|
1878
|
+
}
|
|
1879
|
+
|
|
1880
|
+
function safeStringify(object, {indentation} = {}) {
|
|
1881
|
+
const seen = new WeakSet();
|
|
1882
|
+
return JSON.stringify(object, safeStringifyReplacer(seen), indentation);
|
|
1883
|
+
}
|
|
1884
|
+
|
|
1885
|
+
const defaultParseStack = (stack) => {
|
|
1886
|
+
const lines = stack.split("\n").map((l) => l.trim().replace("file://", ""));
|
|
1887
|
+
return lines;
|
|
1888
|
+
};
|
|
1889
|
+
function formattedLogObj(logObj, parseStack = defaultParseStack) {
|
|
1890
|
+
const result = {
|
|
1891
|
+
message: ""
|
|
1892
|
+
};
|
|
1893
|
+
const error = logObj.args.find((a) => a instanceof Error);
|
|
1894
|
+
if (!error) {
|
|
1895
|
+
result.message = logObj.args.map((arg) => typeof arg === "string" ? arg : safeStringify(arg)).join("; ");
|
|
1896
|
+
if (typeof logObj.tag === "string" && logObj.tag.length > 0) {
|
|
1897
|
+
result.message = `[${logObj.tag}] ${result.message}`;
|
|
1898
|
+
}
|
|
1899
|
+
return result;
|
|
1900
|
+
}
|
|
1901
|
+
const mergedErr = logObj.args.reduce(
|
|
1902
|
+
(acc, arg) => {
|
|
1903
|
+
if (arg === error) {
|
|
1904
|
+
return acc;
|
|
1905
|
+
}
|
|
1906
|
+
const msg = typeof arg === "string" ? arg : safeStringify(arg);
|
|
1907
|
+
return wrapErrorMessage(acc, msg);
|
|
1908
|
+
},
|
|
1909
|
+
mergeErrorCause(error)
|
|
1910
|
+
);
|
|
1911
|
+
result.message = mergedErr.message;
|
|
1912
|
+
result.error = {
|
|
1913
|
+
message: mergedErr.message,
|
|
1914
|
+
name: mergedErr.name
|
|
1915
|
+
};
|
|
1916
|
+
if (mergedErr.stack) {
|
|
1917
|
+
const stack = parseStack(mergedErr.stack);
|
|
1918
|
+
result.error.stack = stack.join("\n");
|
|
1919
|
+
result.message += "\n" + stack.slice(1).map((l) => " " + l).join("\n");
|
|
1920
|
+
}
|
|
1921
|
+
if (typeof logObj.tag === "string" && logObj.tag.length > 0) {
|
|
1922
|
+
result.message = `[${logObj.tag}] ${result.message}`;
|
|
1923
|
+
}
|
|
1924
|
+
return result;
|
|
1925
|
+
}
|
|
1926
|
+
|
|
1927
|
+
const consola = createConsola({
|
|
1928
|
+
level: LogLevels.debug
|
|
1929
|
+
});
|
|
1930
|
+
function formatLogObj(logObj) {
|
|
1931
|
+
return formattedLogObj(logObj);
|
|
1932
|
+
}
|
|
478
1933
|
|
|
479
1934
|
exports.LogLevels = LogLevels;
|
|
480
1935
|
exports.consola = consola;
|
|
1936
|
+
exports.formatLogObj = formatLogObj;
|
|
481
1937
|
exports.logger = consola;
|
|
482
1938
|
exports.rootLogger = consola;
|