ts-data-forge 2.1.2 → 2.1.3
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/array/array-utils.d.mts.map +1 -1
- package/dist/array/array-utils.mjs +1 -5
- package/dist/array/array-utils.mjs.map +1 -1
- package/dist/collections/imap.d.mts.map +1 -1
- package/dist/collections/imap.mjs +4 -4
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset.mjs +2 -3
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/functional/optional.d.mts.map +1 -1
- package/dist/functional/optional.mjs +6 -4
- package/dist/functional/optional.mjs.map +1 -1
- package/dist/functional/result.d.mts.map +1 -1
- package/dist/functional/result.mjs +1 -3
- package/dist/functional/result.mjs.map +1 -1
- package/dist/json/json.d.mts.map +1 -1
- package/dist/json/json.mjs +3 -3
- package/dist/json/json.mjs.map +1 -1
- package/dist/others/unknown-to-string.d.mts +44 -77
- package/dist/others/unknown-to-string.d.mts.map +1 -1
- package/dist/others/unknown-to-string.mjs +51 -85
- package/dist/others/unknown-to-string.mjs.map +1 -1
- package/package.json +1 -1
- package/src/array/array-utils.mts +1 -5
- package/src/collections/imap.mts +4 -10
- package/src/collections/iset.mts +2 -4
- package/src/functional/optional.mts +6 -6
- package/src/functional/result.mts +1 -3
- package/src/json/json.mts +3 -9
- package/src/others/unknown-to-string.mts +52 -87
- package/src/others/unknown-to-string.test.mts +23 -55
package/dist/json/json.mjs
CHANGED
|
@@ -71,7 +71,7 @@ var Json;
|
|
|
71
71
|
}
|
|
72
72
|
catch (error) {
|
|
73
73
|
const errStr = unknownToString(error);
|
|
74
|
-
return Result.err(
|
|
74
|
+
return Result.err(errStr);
|
|
75
75
|
}
|
|
76
76
|
};
|
|
77
77
|
/**
|
|
@@ -120,7 +120,7 @@ var Json;
|
|
|
120
120
|
}
|
|
121
121
|
catch (error) {
|
|
122
122
|
const errStr = unknownToString(error);
|
|
123
|
-
return Result.err(
|
|
123
|
+
return Result.err(errStr);
|
|
124
124
|
}
|
|
125
125
|
};
|
|
126
126
|
/**
|
|
@@ -165,7 +165,7 @@ var Json;
|
|
|
165
165
|
}
|
|
166
166
|
catch (error) {
|
|
167
167
|
const errStr = unknownToString(error);
|
|
168
|
-
return Result.err(
|
|
168
|
+
return Result.err(errStr);
|
|
169
169
|
}
|
|
170
170
|
};
|
|
171
171
|
/**
|
package/dist/json/json.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.mjs","sources":["../../src/json/json.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;AAKA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG,IAAW;AAAjB,CAAA,UAAiB,IAAI,EAAA;AACnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;AACU,IAAA,IAAA,CAAA,KAAK,GAAG,CACnB,IAAY,EACZ,OAAmE,KACtC;AAC7B,QAAA,IAAI;YACF,OAAO,MAAM,CAAC,EAAE,CACd,IAAI,CAAC,KAAK,CACR,IAAI;;YAEJ,OAAkE,CACnE,CACF;QACH;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"json.mjs","sources":["../../src/json/json.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Result } from '../functional/index.mjs';
|
|
2
1
|
/**
|
|
3
2
|
* Converts an unknown value to its string representation in a type-safe manner.
|
|
4
3
|
*
|
|
@@ -18,22 +17,22 @@ import { Result } from '../functional/index.mjs';
|
|
|
18
17
|
* @param value - The unknown value to convert to string
|
|
19
18
|
* @param options - Optional configuration for the conversion
|
|
20
19
|
* @param options.prettyPrintObject - If true, objects are formatted with 2-space indentation
|
|
21
|
-
* @returns
|
|
20
|
+
* @returns The string representation of the value. For circular references or non-serializable objects, returns an error message string
|
|
22
21
|
*
|
|
23
22
|
* @example Basic type conversions
|
|
24
23
|
* ```typescript
|
|
25
24
|
* // Primitive types
|
|
26
|
-
* unknownToString('hello'); //
|
|
27
|
-
* unknownToString(123); //
|
|
28
|
-
* unknownToString(true); //
|
|
29
|
-
* unknownToString(null); //
|
|
30
|
-
* unknownToString(undefined); //
|
|
31
|
-
* unknownToString(Symbol('test')); //
|
|
32
|
-
* unknownToString(123n); //
|
|
25
|
+
* unknownToString('hello'); // 'hello'
|
|
26
|
+
* unknownToString(123); // '123'
|
|
27
|
+
* unknownToString(true); // 'true'
|
|
28
|
+
* unknownToString(null); // 'null'
|
|
29
|
+
* unknownToString(undefined); // 'undefined'
|
|
30
|
+
* unknownToString(Symbol('test')); // 'Symbol(test)'
|
|
31
|
+
* unknownToString(123n); // '123'
|
|
33
32
|
*
|
|
34
33
|
* // Function conversion
|
|
35
34
|
* const fn = () => 'test';
|
|
36
|
-
* unknownToString(fn); //
|
|
35
|
+
* unknownToString(fn); // "() => 'test'"
|
|
37
36
|
* ```
|
|
38
37
|
*
|
|
39
38
|
* @example Object stringification
|
|
@@ -41,24 +40,20 @@ import { Result } from '../functional/index.mjs';
|
|
|
41
40
|
* // Simple object
|
|
42
41
|
* const obj = { a: 1, b: 'hello', c: [1, 2, 3] };
|
|
43
42
|
* const result = unknownToString(obj);
|
|
44
|
-
*
|
|
45
|
-
* console.log(result.value); // '{"a":1,"b":"hello","c":[1,2,3]}'
|
|
46
|
-
* }
|
|
43
|
+
* console.log(result); // '{"a":1,"b":"hello","c":[1,2,3]}'
|
|
47
44
|
*
|
|
48
45
|
* // Pretty printing
|
|
49
46
|
* const prettyResult = unknownToString(obj, { prettyPrintObject: true });
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* // }
|
|
61
|
-
* }
|
|
47
|
+
* console.log(prettyResult);
|
|
48
|
+
* // {
|
|
49
|
+
* // "a": 1,
|
|
50
|
+
* // "b": "hello",
|
|
51
|
+
* // "c": [
|
|
52
|
+
* // 1,
|
|
53
|
+
* // 2,
|
|
54
|
+
* // 3
|
|
55
|
+
* // ]
|
|
56
|
+
* // }
|
|
62
57
|
* ```
|
|
63
58
|
*
|
|
64
59
|
* @example Error handling for circular references
|
|
@@ -68,19 +63,7 @@ import { Result } from '../functional/index.mjs';
|
|
|
68
63
|
* circular.self = circular;
|
|
69
64
|
*
|
|
70
65
|
* const result = unknownToString(circular);
|
|
71
|
-
*
|
|
72
|
-
* console.log(result.value.message);
|
|
73
|
-
* // "Converting circular structure to JSON"
|
|
74
|
-
* }
|
|
75
|
-
*
|
|
76
|
-
* // Handle with custom serialization
|
|
77
|
-
* const safeStringify = (value: unknown): string => {
|
|
78
|
-
* const result = unknownToString(value);
|
|
79
|
-
* return Result.isOk(result)
|
|
80
|
-
* ? result.value
|
|
81
|
-
* : `[Error: ${result.value.message}]`;
|
|
82
|
-
* };
|
|
83
|
-
* ```
|
|
66
|
+
* console.log(result); // "Converting circular structure to JSON"
|
|
84
67
|
*
|
|
85
68
|
* @example Logging and debugging utilities
|
|
86
69
|
* ```typescript
|
|
@@ -90,13 +73,9 @@ import { Result } from '../functional/index.mjs';
|
|
|
90
73
|
* const timestamp = new Date().toISOString();
|
|
91
74
|
* const dataStr = data !== undefined
|
|
92
75
|
* ? unknownToString(data, { prettyPrintObject: true })
|
|
93
|
-
* :
|
|
76
|
+
* : '';
|
|
94
77
|
*
|
|
95
|
-
*
|
|
96
|
-
* console.log(`[${timestamp}] ${message}`, dataStr.value);
|
|
97
|
-
* } else {
|
|
98
|
-
* console.log(`[${timestamp}] ${message} [Unstringifiable data]`);
|
|
99
|
-
* }
|
|
78
|
+
* console.log(`[${timestamp}] ${message}`, dataStr);
|
|
100
79
|
* }
|
|
101
80
|
* }
|
|
102
81
|
*
|
|
@@ -108,19 +87,11 @@ import { Result } from '../functional/index.mjs';
|
|
|
108
87
|
* ```typescript
|
|
109
88
|
* // Safe error response formatting
|
|
110
89
|
* function formatErrorResponse(error: unknown): string {
|
|
111
|
-
* const
|
|
90
|
+
* const errorStr = unknownToString(error, { prettyPrintObject: true });
|
|
112
91
|
*
|
|
113
|
-
* if (Result.isOk(result)) {
|
|
114
|
-
* return JSON.stringify({
|
|
115
|
-
* success: false,
|
|
116
|
-
* error: result.value
|
|
117
|
-
* });
|
|
118
|
-
* }
|
|
119
|
-
*
|
|
120
|
-
* // Fallback for unstringifiable errors
|
|
121
92
|
* return JSON.stringify({
|
|
122
93
|
* success: false,
|
|
123
|
-
* error:
|
|
94
|
+
* error: errorStr
|
|
124
95
|
* });
|
|
125
96
|
* }
|
|
126
97
|
*
|
|
@@ -136,45 +107,41 @@ import { Result } from '../functional/index.mjs';
|
|
|
136
107
|
* ```typescript
|
|
137
108
|
* // Date objects
|
|
138
109
|
* unknownToString(new Date('2023-01-01'));
|
|
139
|
-
* //
|
|
110
|
+
* // '"2023-01-01T00:00:00.000Z"' - JSON stringified
|
|
140
111
|
*
|
|
141
112
|
* // Regular expressions
|
|
142
113
|
* unknownToString(/test/gi);
|
|
143
|
-
* //
|
|
114
|
+
* // '{}' - RegExp has no enumerable properties
|
|
144
115
|
*
|
|
145
116
|
* // Arrays
|
|
146
117
|
* unknownToString([1, 'two', { three: 3 }]);
|
|
147
|
-
* //
|
|
118
|
+
* // '[1,"two",{"three":3}]'
|
|
148
119
|
*
|
|
149
120
|
* // Map and Set (converted to empty objects by JSON.stringify)
|
|
150
|
-
* unknownToString(new Map([['a', 1]])); //
|
|
151
|
-
* unknownToString(new Set([1, 2, 3])); //
|
|
121
|
+
* unknownToString(new Map([['a', 1]])); // '{}'
|
|
122
|
+
* unknownToString(new Set([1, 2, 3])); // '{}'
|
|
152
123
|
* ```
|
|
153
124
|
*
|
|
154
|
-
* @example
|
|
125
|
+
* @example Using with validation
|
|
155
126
|
* ```typescript
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* s.length > 0
|
|
167
|
-
* ? Result.ok(s)
|
|
168
|
-
* : Result.err(new Error('Empty string'))
|
|
169
|
-
* ))
|
|
170
|
-
* .value;
|
|
127
|
+
* // Simple validation helper
|
|
128
|
+
* function validateAndStringify(input: unknown): string {
|
|
129
|
+
* const str = unknownToString(input);
|
|
130
|
+
* const trimmed = str.trim();
|
|
131
|
+
*
|
|
132
|
+
* if (trimmed.length === 0) {
|
|
133
|
+
* throw new Error('Empty string');
|
|
134
|
+
* }
|
|
135
|
+
*
|
|
136
|
+
* return trimmed;
|
|
171
137
|
* }
|
|
172
138
|
* ```
|
|
173
139
|
*
|
|
174
|
-
*
|
|
140
|
+
* **Error Handling:**
|
|
141
|
+
* Circular references and non-serializable objects return descriptive error messages instead of throwing
|
|
175
142
|
* @see JSON.stringify - Underlying serialization for objects
|
|
176
143
|
*/
|
|
177
144
|
export declare const unknownToString: (value: unknown, options?: Partial<Readonly<{
|
|
178
145
|
prettyPrintObject: boolean;
|
|
179
|
-
}>>) =>
|
|
146
|
+
}>>) => string;
|
|
180
147
|
//# sourceMappingURL=unknown-to-string.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unknown-to-string.d.mts","sourceRoot":"","sources":["../../src/others/unknown-to-string.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unknown-to-string.d.mts","sourceRoot":"","sources":["../../src/others/unknown-to-string.mts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8IG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,OAAO,EACd,UAAU,OAAO,CAAC,QAAQ,CAAC;IAAE,iBAAiB,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,KAC1D,MA+BF,CAAC"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { isNonNullish } from '../guard/is-type.mjs';
|
|
2
|
-
import '../functional/optional.mjs';
|
|
3
|
-
import { Result } from '../functional/result.mjs';
|
|
4
2
|
|
|
5
3
|
/**
|
|
6
4
|
* Converts an unknown value to its string representation in a type-safe manner.
|
|
@@ -21,22 +19,22 @@ import { Result } from '../functional/result.mjs';
|
|
|
21
19
|
* @param value - The unknown value to convert to string
|
|
22
20
|
* @param options - Optional configuration for the conversion
|
|
23
21
|
* @param options.prettyPrintObject - If true, objects are formatted with 2-space indentation
|
|
24
|
-
* @returns
|
|
22
|
+
* @returns The string representation of the value. For circular references or non-serializable objects, returns an error message string
|
|
25
23
|
*
|
|
26
24
|
* @example Basic type conversions
|
|
27
25
|
* ```typescript
|
|
28
26
|
* // Primitive types
|
|
29
|
-
* unknownToString('hello'); //
|
|
30
|
-
* unknownToString(123); //
|
|
31
|
-
* unknownToString(true); //
|
|
32
|
-
* unknownToString(null); //
|
|
33
|
-
* unknownToString(undefined); //
|
|
34
|
-
* unknownToString(Symbol('test')); //
|
|
35
|
-
* unknownToString(123n); //
|
|
27
|
+
* unknownToString('hello'); // 'hello'
|
|
28
|
+
* unknownToString(123); // '123'
|
|
29
|
+
* unknownToString(true); // 'true'
|
|
30
|
+
* unknownToString(null); // 'null'
|
|
31
|
+
* unknownToString(undefined); // 'undefined'
|
|
32
|
+
* unknownToString(Symbol('test')); // 'Symbol(test)'
|
|
33
|
+
* unknownToString(123n); // '123'
|
|
36
34
|
*
|
|
37
35
|
* // Function conversion
|
|
38
36
|
* const fn = () => 'test';
|
|
39
|
-
* unknownToString(fn); //
|
|
37
|
+
* unknownToString(fn); // "() => 'test'"
|
|
40
38
|
* ```
|
|
41
39
|
*
|
|
42
40
|
* @example Object stringification
|
|
@@ -44,24 +42,20 @@ import { Result } from '../functional/result.mjs';
|
|
|
44
42
|
* // Simple object
|
|
45
43
|
* const obj = { a: 1, b: 'hello', c: [1, 2, 3] };
|
|
46
44
|
* const result = unknownToString(obj);
|
|
47
|
-
*
|
|
48
|
-
* console.log(result.value); // '{"a":1,"b":"hello","c":[1,2,3]}'
|
|
49
|
-
* }
|
|
45
|
+
* console.log(result); // '{"a":1,"b":"hello","c":[1,2,3]}'
|
|
50
46
|
*
|
|
51
47
|
* // Pretty printing
|
|
52
48
|
* const prettyResult = unknownToString(obj, { prettyPrintObject: true });
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* // }
|
|
64
|
-
* }
|
|
49
|
+
* console.log(prettyResult);
|
|
50
|
+
* // {
|
|
51
|
+
* // "a": 1,
|
|
52
|
+
* // "b": "hello",
|
|
53
|
+
* // "c": [
|
|
54
|
+
* // 1,
|
|
55
|
+
* // 2,
|
|
56
|
+
* // 3
|
|
57
|
+
* // ]
|
|
58
|
+
* // }
|
|
65
59
|
* ```
|
|
66
60
|
*
|
|
67
61
|
* @example Error handling for circular references
|
|
@@ -71,19 +65,7 @@ import { Result } from '../functional/result.mjs';
|
|
|
71
65
|
* circular.self = circular;
|
|
72
66
|
*
|
|
73
67
|
* const result = unknownToString(circular);
|
|
74
|
-
*
|
|
75
|
-
* console.log(result.value.message);
|
|
76
|
-
* // "Converting circular structure to JSON"
|
|
77
|
-
* }
|
|
78
|
-
*
|
|
79
|
-
* // Handle with custom serialization
|
|
80
|
-
* const safeStringify = (value: unknown): string => {
|
|
81
|
-
* const result = unknownToString(value);
|
|
82
|
-
* return Result.isOk(result)
|
|
83
|
-
* ? result.value
|
|
84
|
-
* : `[Error: ${result.value.message}]`;
|
|
85
|
-
* };
|
|
86
|
-
* ```
|
|
68
|
+
* console.log(result); // "Converting circular structure to JSON"
|
|
87
69
|
*
|
|
88
70
|
* @example Logging and debugging utilities
|
|
89
71
|
* ```typescript
|
|
@@ -93,13 +75,9 @@ import { Result } from '../functional/result.mjs';
|
|
|
93
75
|
* const timestamp = new Date().toISOString();
|
|
94
76
|
* const dataStr = data !== undefined
|
|
95
77
|
* ? unknownToString(data, { prettyPrintObject: true })
|
|
96
|
-
* :
|
|
78
|
+
* : '';
|
|
97
79
|
*
|
|
98
|
-
*
|
|
99
|
-
* console.log(`[${timestamp}] ${message}`, dataStr.value);
|
|
100
|
-
* } else {
|
|
101
|
-
* console.log(`[${timestamp}] ${message} [Unstringifiable data]`);
|
|
102
|
-
* }
|
|
80
|
+
* console.log(`[${timestamp}] ${message}`, dataStr);
|
|
103
81
|
* }
|
|
104
82
|
* }
|
|
105
83
|
*
|
|
@@ -111,19 +89,11 @@ import { Result } from '../functional/result.mjs';
|
|
|
111
89
|
* ```typescript
|
|
112
90
|
* // Safe error response formatting
|
|
113
91
|
* function formatErrorResponse(error: unknown): string {
|
|
114
|
-
* const
|
|
92
|
+
* const errorStr = unknownToString(error, { prettyPrintObject: true });
|
|
115
93
|
*
|
|
116
|
-
* if (Result.isOk(result)) {
|
|
117
|
-
* return JSON.stringify({
|
|
118
|
-
* success: false,
|
|
119
|
-
* error: result.value
|
|
120
|
-
* });
|
|
121
|
-
* }
|
|
122
|
-
*
|
|
123
|
-
* // Fallback for unstringifiable errors
|
|
124
94
|
* return JSON.stringify({
|
|
125
95
|
* success: false,
|
|
126
|
-
* error:
|
|
96
|
+
* error: errorStr
|
|
127
97
|
* });
|
|
128
98
|
* }
|
|
129
99
|
*
|
|
@@ -139,71 +109,67 @@ import { Result } from '../functional/result.mjs';
|
|
|
139
109
|
* ```typescript
|
|
140
110
|
* // Date objects
|
|
141
111
|
* unknownToString(new Date('2023-01-01'));
|
|
142
|
-
* //
|
|
112
|
+
* // '"2023-01-01T00:00:00.000Z"' - JSON stringified
|
|
143
113
|
*
|
|
144
114
|
* // Regular expressions
|
|
145
115
|
* unknownToString(/test/gi);
|
|
146
|
-
* //
|
|
116
|
+
* // '{}' - RegExp has no enumerable properties
|
|
147
117
|
*
|
|
148
118
|
* // Arrays
|
|
149
119
|
* unknownToString([1, 'two', { three: 3 }]);
|
|
150
|
-
* //
|
|
120
|
+
* // '[1,"two",{"three":3}]'
|
|
151
121
|
*
|
|
152
122
|
* // Map and Set (converted to empty objects by JSON.stringify)
|
|
153
|
-
* unknownToString(new Map([['a', 1]])); //
|
|
154
|
-
* unknownToString(new Set([1, 2, 3])); //
|
|
123
|
+
* unknownToString(new Map([['a', 1]])); // '{}'
|
|
124
|
+
* unknownToString(new Set([1, 2, 3])); // '{}'
|
|
155
125
|
* ```
|
|
156
126
|
*
|
|
157
|
-
* @example
|
|
127
|
+
* @example Using with validation
|
|
158
128
|
* ```typescript
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
* s.length > 0
|
|
170
|
-
* ? Result.ok(s)
|
|
171
|
-
* : Result.err(new Error('Empty string'))
|
|
172
|
-
* ))
|
|
173
|
-
* .value;
|
|
129
|
+
* // Simple validation helper
|
|
130
|
+
* function validateAndStringify(input: unknown): string {
|
|
131
|
+
* const str = unknownToString(input);
|
|
132
|
+
* const trimmed = str.trim();
|
|
133
|
+
*
|
|
134
|
+
* if (trimmed.length === 0) {
|
|
135
|
+
* throw new Error('Empty string');
|
|
136
|
+
* }
|
|
137
|
+
*
|
|
138
|
+
* return trimmed;
|
|
174
139
|
* }
|
|
175
140
|
* ```
|
|
176
141
|
*
|
|
177
|
-
*
|
|
142
|
+
* **Error Handling:**
|
|
143
|
+
* Circular references and non-serializable objects return descriptive error messages instead of throwing
|
|
178
144
|
* @see JSON.stringify - Underlying serialization for objects
|
|
179
145
|
*/
|
|
180
146
|
const unknownToString = (value, options) => {
|
|
181
147
|
switch (typeof value) {
|
|
182
148
|
case 'string':
|
|
183
|
-
return
|
|
149
|
+
return value;
|
|
184
150
|
case 'number':
|
|
185
151
|
case 'bigint':
|
|
186
152
|
case 'boolean':
|
|
187
153
|
case 'symbol':
|
|
188
154
|
case 'function':
|
|
189
|
-
return
|
|
155
|
+
return value.toString();
|
|
190
156
|
case 'object':
|
|
191
157
|
if (!isNonNullish(value)) {
|
|
192
|
-
return
|
|
158
|
+
return 'null';
|
|
193
159
|
}
|
|
194
160
|
try {
|
|
195
161
|
const stringified = options?.prettyPrintObject === true
|
|
196
162
|
? JSON.stringify(value, undefined, 2)
|
|
197
163
|
: JSON.stringify(value);
|
|
198
|
-
return
|
|
164
|
+
return stringified;
|
|
199
165
|
}
|
|
200
166
|
catch (error) {
|
|
201
|
-
return
|
|
202
|
-
? error
|
|
203
|
-
:
|
|
167
|
+
return error instanceof Error
|
|
168
|
+
? error.message
|
|
169
|
+
: '[Circular or Non-serializable]';
|
|
204
170
|
}
|
|
205
171
|
case 'undefined':
|
|
206
|
-
return
|
|
172
|
+
return 'undefined';
|
|
207
173
|
}
|
|
208
174
|
};
|
|
209
175
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unknown-to-string.mjs","sources":["../../src/others/unknown-to-string.mts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unknown-to-string.mjs","sources":["../../src/others/unknown-to-string.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8IG;MACU,eAAe,GAAG,CAC7B,KAAc,EACd,OAA2D,KACjD;IACV,QAAQ,OAAO,KAAK;AAClB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,KAAK;AAEd,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,SAAS;AACd,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,KAAK,CAAC,QAAQ,EAAE;AAEzB,QAAA,KAAK,QAAQ;AACX,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,OAAO,MAAM;YACf;AACA,YAAA,IAAI;AACF,gBAAA,MAAM,WAAW,GACf,OAAO,EAAE,iBAAiB,KAAK;sBAC3B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;AACpC,sBAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AAC3B,gBAAA,OAAO,WAAW;YACpB;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,KAAK,YAAY;sBACpB,KAAK,CAAC;sBACN,gCAAgC;YACtC;AAEF,QAAA,KAAK,WAAW;AACd,YAAA,OAAO,WAAW;;AAExB;;;;"}
|
package/package.json
CHANGED
|
@@ -3460,11 +3460,7 @@ export namespace Arr {
|
|
|
3460
3460
|
return Result.ok(result);
|
|
3461
3461
|
} catch (error) {
|
|
3462
3462
|
return Result.err(
|
|
3463
|
-
error instanceof Error
|
|
3464
|
-
? error
|
|
3465
|
-
: pipe(unknownToString(error))
|
|
3466
|
-
.map(Result.unwrapOkOr('Failed to join array'))
|
|
3467
|
-
.map((e) => new Error(e)).value,
|
|
3463
|
+
error instanceof Error ? error : new Error(unknownToString(error)),
|
|
3468
3464
|
);
|
|
3469
3465
|
}
|
|
3470
3466
|
};
|
package/src/collections/imap.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Optional
|
|
1
|
+
import { Optional } from '../functional/index.mjs';
|
|
2
2
|
import { asUint32 } from '../number/index.mjs';
|
|
3
3
|
import { tp, unknownToString } from '../others/index.mjs';
|
|
4
4
|
|
|
@@ -487,9 +487,7 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
487
487
|
if (!this.has(key)) {
|
|
488
488
|
if (this.#showNotFoundMessage) {
|
|
489
489
|
const keyStr = unknownToString(key);
|
|
490
|
-
console.warn(
|
|
491
|
-
`IMap.delete: key not found: ${Result.isOk(keyStr) ? keyStr.value : '<error converting key to string>'}`,
|
|
492
|
-
);
|
|
490
|
+
console.warn(`IMap.delete: key not found: ${keyStr}`);
|
|
493
491
|
}
|
|
494
492
|
return this;
|
|
495
493
|
}
|
|
@@ -518,9 +516,7 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
518
516
|
if (Optional.isNone(curr)) {
|
|
519
517
|
if (this.#showNotFoundMessage) {
|
|
520
518
|
const keyStr = unknownToString(key);
|
|
521
|
-
console.warn(
|
|
522
|
-
`IMap.update: key not found: ${Result.isOk(keyStr) ? keyStr.value : '<error converting key to string>'}`,
|
|
523
|
-
);
|
|
519
|
+
console.warn(`IMap.update: key not found: ${keyStr}`);
|
|
524
520
|
}
|
|
525
521
|
return this;
|
|
526
522
|
}
|
|
@@ -560,9 +556,7 @@ class IMapClass<K extends MapSetKeyType, V>
|
|
|
560
556
|
if (!mut_result.has(key) || curr === undefined) {
|
|
561
557
|
if (this.#showNotFoundMessage) {
|
|
562
558
|
const keyStr = unknownToString(key);
|
|
563
|
-
console.warn(
|
|
564
|
-
`IMap.withMutations: key not found: ${Result.isOk(keyStr) ? keyStr.value : '<error converting key to string>'}`,
|
|
565
|
-
);
|
|
559
|
+
console.warn(`IMap.withMutations: key not found: ${keyStr}`);
|
|
566
560
|
}
|
|
567
561
|
break;
|
|
568
562
|
}
|
package/src/collections/iset.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// No imports from functional needed anymore
|
|
2
2
|
import { asUint32 } from '../number/index.mjs';
|
|
3
3
|
import { unknownToString } from '../others/index.mjs';
|
|
4
4
|
|
|
@@ -560,9 +560,7 @@ class ISetClass<K extends MapSetKeyType> implements ISet<K>, Iterable<K> {
|
|
|
560
560
|
if (!this.has(key)) {
|
|
561
561
|
if (this.#showNotFoundMessage) {
|
|
562
562
|
const keyStr = unknownToString(key);
|
|
563
|
-
console.warn(
|
|
564
|
-
`ISet.delete: key not found: ${Result.isOk(keyStr) ? keyStr.value : '<error converting key to string>'}`,
|
|
565
|
-
);
|
|
563
|
+
console.warn(`ISet.delete: key not found: ${keyStr}`);
|
|
566
564
|
}
|
|
567
565
|
return this;
|
|
568
566
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { isRecord } from '../guard/index.mjs';
|
|
2
|
-
import { pipe } from './pipe.mjs';
|
|
3
2
|
|
|
4
3
|
/** @internal String literal tag to identify the 'Some' variant of Optional. */
|
|
5
4
|
const SomeTypeTagName = 'ts-data-forge::Optional.some';
|
|
@@ -451,11 +450,12 @@ export namespace Optional {
|
|
|
451
450
|
switch (args.length) {
|
|
452
451
|
case 2: {
|
|
453
452
|
const [optional, predicate] = args;
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
453
|
+
if (isSome(optional)) {
|
|
454
|
+
const value = unwrap(optional);
|
|
455
|
+
return predicate(value) ? some(value) : none;
|
|
456
|
+
}
|
|
457
|
+
// If the optional is None, return None
|
|
458
|
+
return none;
|
|
459
459
|
}
|
|
460
460
|
|
|
461
461
|
case 1: {
|
package/src/json/json.mts
CHANGED
|
@@ -73,9 +73,7 @@ export namespace Json {
|
|
|
73
73
|
);
|
|
74
74
|
} catch (error: unknown) {
|
|
75
75
|
const errStr = unknownToString(error);
|
|
76
|
-
return Result.err(
|
|
77
|
-
Result.isOk(errStr) ? errStr.value : 'Failed to parse JSON',
|
|
78
|
-
);
|
|
76
|
+
return Result.err(errStr);
|
|
79
77
|
}
|
|
80
78
|
};
|
|
81
79
|
|
|
@@ -128,9 +126,7 @@ export namespace Json {
|
|
|
128
126
|
return Result.ok(JSON.stringify(value, replacer, space));
|
|
129
127
|
} catch (error) {
|
|
130
128
|
const errStr = unknownToString(error);
|
|
131
|
-
return Result.err(
|
|
132
|
-
Result.isOk(errStr) ? errStr.value : 'Failed to stringify JSON',
|
|
133
|
-
);
|
|
129
|
+
return Result.err(errStr);
|
|
134
130
|
}
|
|
135
131
|
};
|
|
136
132
|
|
|
@@ -181,9 +177,7 @@ export namespace Json {
|
|
|
181
177
|
);
|
|
182
178
|
} catch (error) {
|
|
183
179
|
const errStr = unknownToString(error);
|
|
184
|
-
return Result.err(
|
|
185
|
-
Result.isOk(errStr) ? errStr.value : 'Failed to stringify JSON',
|
|
186
|
-
);
|
|
180
|
+
return Result.err(errStr);
|
|
187
181
|
}
|
|
188
182
|
};
|
|
189
183
|
|