@ls-stack/utils 1.0.0
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/README.md +1 -0
- package/dist/arrayUtils.d.ts +50 -0
- package/dist/arrayUtils.js +13 -0
- package/dist/arrayUtils.js.map +1 -0
- package/dist/assertions.d.ts +17 -0
- package/dist/assertions.js +25 -0
- package/dist/assertions.js.map +1 -0
- package/dist/castValues.d.ts +4 -0
- package/dist/castValues.js +16 -0
- package/dist/castValues.js.map +1 -0
- package/dist/chunk-4DRNU53E.js +70 -0
- package/dist/chunk-4DRNU53E.js.map +1 -0
- package/dist/chunk-5FQYH3ZJ.js +106 -0
- package/dist/chunk-5FQYH3ZJ.js.map +1 -0
- package/dist/chunk-5SB253CL.js +54 -0
- package/dist/chunk-5SB253CL.js.map +1 -0
- package/dist/chunk-HLFWWIDK.js +9 -0
- package/dist/chunk-HLFWWIDK.js.map +1 -0
- package/dist/chunk-HYFUWQ2E.js +218 -0
- package/dist/chunk-HYFUWQ2E.js.map +1 -0
- package/dist/chunk-J66LUDLH.js +13 -0
- package/dist/chunk-J66LUDLH.js.map +1 -0
- package/dist/chunk-JT3EBBCA.js +69 -0
- package/dist/chunk-JT3EBBCA.js.map +1 -0
- package/dist/chunk-JZUOIOMU.js +75 -0
- package/dist/chunk-JZUOIOMU.js.map +1 -0
- package/dist/chunk-MMKMF4GG.js +21 -0
- package/dist/chunk-MMKMF4GG.js.map +1 -0
- package/dist/chunk-SNAAKCTH.js +40 -0
- package/dist/chunk-SNAAKCTH.js.map +1 -0
- package/dist/consoleFmt.d.ts +48 -0
- package/dist/consoleFmt.js +60 -0
- package/dist/consoleFmt.js.map +1 -0
- package/dist/conversions.d.ts +3 -0
- package/dist/conversions.js +7 -0
- package/dist/conversions.js.map +1 -0
- package/dist/createThrottleController.d.ts +16 -0
- package/dist/createThrottleController.js +66 -0
- package/dist/createThrottleController.js.map +1 -0
- package/dist/dedent.d.ts +4 -0
- package/dist/dedent.js +33 -0
- package/dist/dedent.js.map +1 -0
- package/dist/deepEqual.d.ts +4 -0
- package/dist/deepEqual.js +7 -0
- package/dist/deepEqual.js.map +1 -0
- package/dist/enhancedMap.d.ts +22 -0
- package/dist/enhancedMap.js +10 -0
- package/dist/enhancedMap.js.map +1 -0
- package/dist/exhaustiveMatch.d.ts +5 -0
- package/dist/exhaustiveMatch.js +27 -0
- package/dist/exhaustiveMatch.js.map +1 -0
- package/dist/main.d.ts +25 -0
- package/dist/main.js +3 -0
- package/dist/main.js.map +1 -0
- package/dist/mathUtils.d.ts +4 -0
- package/dist/mathUtils.js +9 -0
- package/dist/mathUtils.js.map +1 -0
- package/dist/objUtils.d.ts +7 -0
- package/dist/objUtils.js +15 -0
- package/dist/objUtils.js.map +1 -0
- package/dist/parallelAsyncResultCalls.d.ts +76 -0
- package/dist/parallelAsyncResultCalls.js +126 -0
- package/dist/parallelAsyncResultCalls.js.map +1 -0
- package/dist/promiseUtils.d.ts +8 -0
- package/dist/promiseUtils.js +14 -0
- package/dist/promiseUtils.js.map +1 -0
- package/dist/rsResult.d.ts +118 -0
- package/dist/rsResult.js +21 -0
- package/dist/rsResult.js.map +1 -0
- package/dist/runShellCmd.d.ts +15 -0
- package/dist/runShellCmd.js +71 -0
- package/dist/runShellCmd.js.map +1 -0
- package/dist/shallowEqual.d.ts +4 -0
- package/dist/shallowEqual.js +74 -0
- package/dist/shallowEqual.js.map +1 -0
- package/dist/sleep.d.ts +3 -0
- package/dist/sleep.js +7 -0
- package/dist/sleep.js.map +1 -0
- package/dist/stringUtils.d.ts +18 -0
- package/dist/stringUtils.js +17 -0
- package/dist/stringUtils.js.map +1 -0
- package/dist/testUtils.d.ts +24 -0
- package/dist/testUtils.js +171 -0
- package/dist/testUtils.js.map +1 -0
- package/dist/typingFnUtils.d.ts +5 -0
- package/dist/typingFnUtils.js +8 -0
- package/dist/typingFnUtils.js.map +1 -0
- package/dist/typingTestUtils.d.ts +12 -0
- package/dist/typingTestUtils.js +19 -0
- package/dist/typingTestUtils.js.map +1 -0
- package/dist/typingUtils.d.ts +11 -0
- package/dist/typingUtils.js +1 -0
- package/dist/typingUtils.js.map +1 -0
- package/dist/yamlStringify.d.ts +8 -0
- package/dist/yamlStringify.js +292 -0
- package/dist/yamlStringify.js.map +1 -0
- package/package.json +235 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type Arg = string | false | undefined | null;
|
|
2
|
+
/**
|
|
3
|
+
* A util to create more legible conditional concatenated strings
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* joinStrings('a', 'b', 'c') // 'abc'
|
|
7
|
+
* joinStrings('a', false, 'c') // 'ac'
|
|
8
|
+
* joinStrings('a', addBString ? 'b' : null, 'c') // 'ac' if addBString is false, 'abc' if addBString is true
|
|
9
|
+
*/
|
|
10
|
+
declare function joinStrings(...args: (Arg | Arg[])[]): string;
|
|
11
|
+
declare function dedent(strings: string): string;
|
|
12
|
+
declare function dedent(strings: TemplateStringsArray, ...values: string[]): string;
|
|
13
|
+
declare function formatNum(num: number): string;
|
|
14
|
+
declare function isSnakeCase(str: string): boolean;
|
|
15
|
+
declare function convertToSnakeCase(str: string): string;
|
|
16
|
+
declare function truncateString(str: string, length: number, ellipsis?: string): string;
|
|
17
|
+
|
|
18
|
+
export { convertToSnakeCase, dedent, formatNum, isSnakeCase, joinStrings, truncateString };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
convertToSnakeCase,
|
|
3
|
+
dedent,
|
|
4
|
+
formatNum,
|
|
5
|
+
isSnakeCase,
|
|
6
|
+
joinStrings,
|
|
7
|
+
truncateString
|
|
8
|
+
} from "./chunk-4DRNU53E.js";
|
|
9
|
+
export {
|
|
10
|
+
convertToSnakeCase,
|
|
11
|
+
dedent,
|
|
12
|
+
formatNum,
|
|
13
|
+
isSnakeCase,
|
|
14
|
+
joinStrings,
|
|
15
|
+
truncateString
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=stringUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
declare function createLoggerStore({ filterKeys: defaultFilterKeys, rejectKeys: defaultRejectKeys, }?: {
|
|
2
|
+
filterKeys?: string[];
|
|
3
|
+
rejectKeys?: string[];
|
|
4
|
+
}): {
|
|
5
|
+
add: (render: Record<string, unknown> | readonly Record<string, unknown>[]) => void;
|
|
6
|
+
reset: (keepLastRender?: boolean) => void;
|
|
7
|
+
getSnapshot: ({ arrays, changesOnly, filterKeys, rejectKeys, includeLastSnapshotEndMark, }?: {
|
|
8
|
+
arrays?: 'all' | 'firstAndLast' | 'length' | {
|
|
9
|
+
firstNItems: number;
|
|
10
|
+
};
|
|
11
|
+
changesOnly?: boolean;
|
|
12
|
+
filterKeys?: string[];
|
|
13
|
+
rejectKeys?: string[];
|
|
14
|
+
includeLastSnapshotEndMark?: boolean;
|
|
15
|
+
}) => string;
|
|
16
|
+
waitNextLog: (timeout?: number) => Promise<void>;
|
|
17
|
+
readonly changesSnapshot: string;
|
|
18
|
+
readonly snapshot: string;
|
|
19
|
+
logsCount: () => number;
|
|
20
|
+
readonly rendersTime: number[];
|
|
21
|
+
addMark: (label: string) => void;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { createLoggerStore };
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clampMin
|
|
3
|
+
} from "./chunk-J66LUDLH.js";
|
|
4
|
+
import {
|
|
5
|
+
omit,
|
|
6
|
+
pick
|
|
7
|
+
} from "./chunk-SNAAKCTH.js";
|
|
8
|
+
import {
|
|
9
|
+
arrayWithPrevAndIndex,
|
|
10
|
+
filterAndMap
|
|
11
|
+
} from "./chunk-5SB253CL.js";
|
|
12
|
+
import {
|
|
13
|
+
isObject
|
|
14
|
+
} from "./chunk-JT3EBBCA.js";
|
|
15
|
+
import {
|
|
16
|
+
deepEqual
|
|
17
|
+
} from "./chunk-JZUOIOMU.js";
|
|
18
|
+
|
|
19
|
+
// src/testUtils.ts
|
|
20
|
+
function createLoggerStore({
|
|
21
|
+
filterKeys: defaultFilterKeys,
|
|
22
|
+
rejectKeys: defaultRejectKeys
|
|
23
|
+
} = {}) {
|
|
24
|
+
let logs = [];
|
|
25
|
+
let logsTime = [];
|
|
26
|
+
let startTime = Date.now();
|
|
27
|
+
let onNextLog = () => {
|
|
28
|
+
};
|
|
29
|
+
function reset(keepLastRender = false) {
|
|
30
|
+
logs = keepLastRender ? [logs.at(-1)] : [];
|
|
31
|
+
logsTime = [];
|
|
32
|
+
startTime = Date.now();
|
|
33
|
+
}
|
|
34
|
+
function add(render) {
|
|
35
|
+
if (!isObject(render)) {
|
|
36
|
+
for (const [i, r] of render.entries()) {
|
|
37
|
+
logs.push({
|
|
38
|
+
i: i + 1,
|
|
39
|
+
...r
|
|
40
|
+
});
|
|
41
|
+
logsTime.push(Date.now() - startTime);
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
logs.push(render);
|
|
45
|
+
logsTime.push(Date.now() - startTime);
|
|
46
|
+
}
|
|
47
|
+
onNextLog();
|
|
48
|
+
if (logs.length > 100) {
|
|
49
|
+
throw new Error("Too many logs");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function logsCount() {
|
|
53
|
+
return logs.filter((item) => !item._lastSnapshotMark).length;
|
|
54
|
+
}
|
|
55
|
+
async function waitNextLog(timeout = 50) {
|
|
56
|
+
return new Promise((resolve) => {
|
|
57
|
+
const timeoutId = setTimeout(() => {
|
|
58
|
+
throw new Error("Timeout");
|
|
59
|
+
}, timeout);
|
|
60
|
+
onNextLog = () => {
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
resolve();
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function getSnapshot({
|
|
67
|
+
arrays = { firstNItems: 1 },
|
|
68
|
+
changesOnly = true,
|
|
69
|
+
filterKeys = defaultFilterKeys,
|
|
70
|
+
rejectKeys = defaultRejectKeys,
|
|
71
|
+
includeLastSnapshotEndMark = true
|
|
72
|
+
} = {}) {
|
|
73
|
+
let rendersToUse = logs;
|
|
74
|
+
if (changesOnly || filterKeys || rejectKeys) {
|
|
75
|
+
rendersToUse = [];
|
|
76
|
+
for (let { item, prev } of arrayWithPrevAndIndex(logs)) {
|
|
77
|
+
if (item._lastSnapshotMark || item._mark) {
|
|
78
|
+
rendersToUse.push(item);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (filterKeys) {
|
|
82
|
+
prev = prev && pick(prev, filterKeys);
|
|
83
|
+
item = pick(item, filterKeys);
|
|
84
|
+
}
|
|
85
|
+
if (rejectKeys) {
|
|
86
|
+
prev = prev && omit(prev, rejectKeys);
|
|
87
|
+
item = omit(item, rejectKeys);
|
|
88
|
+
}
|
|
89
|
+
if (!deepEqual(prev, item)) {
|
|
90
|
+
rendersToUse.push(item);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
logs.push({ _lastSnapshotMark: true });
|
|
95
|
+
return `
|
|
96
|
+
${filterAndMap(rendersToUse, (render, i) => {
|
|
97
|
+
if (render._lastSnapshotMark) {
|
|
98
|
+
if (includeLastSnapshotEndMark && i !== rendersToUse.length - 1) {
|
|
99
|
+
return "---";
|
|
100
|
+
} else {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (render._mark) {
|
|
105
|
+
let mark = `
|
|
106
|
+
>>> ${String(render._mark)}`;
|
|
107
|
+
const nextRender = rendersToUse[i + 1];
|
|
108
|
+
if (nextRender && !nextRender._mark && !nextRender._lastSnapshotMark) {
|
|
109
|
+
mark = `${mark}
|
|
110
|
+
`;
|
|
111
|
+
}
|
|
112
|
+
return mark;
|
|
113
|
+
}
|
|
114
|
+
let line = "";
|
|
115
|
+
for (const [key, _value] of Object.entries(render)) {
|
|
116
|
+
let value = _value;
|
|
117
|
+
if (Array.isArray(value)) {
|
|
118
|
+
if (arrays === "length") {
|
|
119
|
+
value = `Array(${value.length})`;
|
|
120
|
+
} else if (arrays === "firstAndLast" && value.length > 2) {
|
|
121
|
+
const intermediateSize = clampMin(value.length - 2, 0);
|
|
122
|
+
value = [
|
|
123
|
+
value[0],
|
|
124
|
+
`...(${intermediateSize} between)`,
|
|
125
|
+
value.at(-1)
|
|
126
|
+
];
|
|
127
|
+
} else if (typeof arrays === "object" && value.length > 2) {
|
|
128
|
+
value = [
|
|
129
|
+
...value.slice(0, arrays.firstNItems),
|
|
130
|
+
`...(${value.length - arrays.firstNItems} more)`
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (value === "") {
|
|
135
|
+
value = `''`;
|
|
136
|
+
}
|
|
137
|
+
if (typeof value === "object" && value !== null) {
|
|
138
|
+
value = JSON.stringify(value).replace(/"/g, "").replace(/,/g, ", ");
|
|
139
|
+
}
|
|
140
|
+
line += `${key}: ${value} -- `;
|
|
141
|
+
}
|
|
142
|
+
line = line.slice(0, -4);
|
|
143
|
+
return line;
|
|
144
|
+
}).join("\n")}
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
147
|
+
function addMark(label) {
|
|
148
|
+
add({ _mark: label });
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
add,
|
|
152
|
+
reset,
|
|
153
|
+
getSnapshot,
|
|
154
|
+
waitNextLog,
|
|
155
|
+
get changesSnapshot() {
|
|
156
|
+
return getSnapshot({ changesOnly: true });
|
|
157
|
+
},
|
|
158
|
+
get snapshot() {
|
|
159
|
+
return getSnapshot({ changesOnly: false });
|
|
160
|
+
},
|
|
161
|
+
logsCount,
|
|
162
|
+
get rendersTime() {
|
|
163
|
+
return logsTime;
|
|
164
|
+
},
|
|
165
|
+
addMark
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export {
|
|
169
|
+
createLoggerStore
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=testUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testUtils.ts"],"sourcesContent":["import { arrayWithPrevAndIndex, filterAndMap } from './arrayUtils';\nimport { isObject } from './assertions';\nimport { deepEqual } from './deepEqual';\nimport { clampMin } from './mathUtils';\nimport { omit, pick } from './objUtils';\n\nexport function createLoggerStore({\n filterKeys: defaultFilterKeys,\n rejectKeys: defaultRejectKeys,\n}: {\n filterKeys?: string[];\n rejectKeys?: string[];\n} = {}) {\n let logs: Record<string, unknown>[] = [];\n let logsTime: number[] = [];\n let startTime = Date.now();\n let onNextLog: () => void = () => {};\n\n function reset(keepLastRender = false) {\n logs = keepLastRender ? [logs.at(-1)!] : [];\n logsTime = [];\n startTime = Date.now();\n }\n\n function add(\n render: Record<string, unknown> | readonly Record<string, unknown>[],\n ) {\n if (!isObject(render)) {\n for (const [i, r] of render.entries()) {\n logs.push({\n i: i + 1,\n ...r,\n });\n logsTime.push(Date.now() - startTime);\n }\n } else {\n logs.push(render);\n logsTime.push(Date.now() - startTime);\n }\n\n onNextLog();\n\n if (logs.length > 100) {\n throw new Error('Too many logs');\n }\n }\n\n function logsCount() {\n return logs.filter((item) => !item._lastSnapshotMark).length;\n }\n\n async function waitNextLog(timeout = 50) {\n return new Promise<void>((resolve) => {\n const timeoutId = setTimeout(() => {\n throw new Error('Timeout');\n }, timeout);\n\n onNextLog = () => {\n clearTimeout(timeoutId);\n resolve();\n };\n });\n }\n\n function getSnapshot({\n arrays = { firstNItems: 1 },\n changesOnly = true,\n filterKeys = defaultFilterKeys,\n rejectKeys = defaultRejectKeys,\n includeLastSnapshotEndMark = true,\n }: {\n arrays?: 'all' | 'firstAndLast' | 'length' | { firstNItems: number };\n changesOnly?: boolean;\n filterKeys?: string[];\n rejectKeys?: string[];\n includeLastSnapshotEndMark?: boolean;\n } = {}) {\n let rendersToUse = logs;\n\n if (changesOnly || filterKeys || rejectKeys) {\n rendersToUse = [];\n\n for (let { item, prev } of arrayWithPrevAndIndex(logs)) {\n if (item._lastSnapshotMark || item._mark) {\n rendersToUse.push(item);\n continue;\n }\n\n if (filterKeys) {\n prev = prev && pick(prev, filterKeys);\n item = pick(item, filterKeys);\n }\n\n if (rejectKeys) {\n prev = prev && omit(prev, rejectKeys);\n item = omit(item, rejectKeys);\n }\n\n if (!deepEqual(prev, item)) {\n rendersToUse.push(item);\n }\n }\n }\n\n logs.push({ _lastSnapshotMark: true });\n\n return `\\n${filterAndMap(rendersToUse, (render, i) => {\n if (render._lastSnapshotMark) {\n if (includeLastSnapshotEndMark && i !== rendersToUse.length - 1) {\n return '---';\n } else {\n return false;\n }\n }\n\n if (render._mark) {\n let mark = `\\n>>> ${String(render._mark)}`;\n\n const nextRender = rendersToUse[i + 1];\n\n if (nextRender && !nextRender._mark && !nextRender._lastSnapshotMark) {\n mark = `${mark}\\n`;\n }\n\n return mark;\n }\n\n let line = '';\n\n for (const [key, _value] of Object.entries(render)) {\n let value = _value;\n\n if (Array.isArray(value)) {\n if (arrays === 'length') {\n value = `Array(${value.length})`;\n } else if (arrays === 'firstAndLast' && value.length > 2) {\n const intermediateSize = clampMin(value.length - 2, 0);\n\n value = [\n value[0],\n `...(${intermediateSize} between)`,\n value.at(-1),\n ];\n } else if (typeof arrays === 'object' && value.length > 2) {\n value = [\n ...value.slice(0, arrays.firstNItems),\n `...(${value.length - arrays.firstNItems} more)`,\n ];\n }\n }\n\n if (value === '') {\n value = `''`;\n }\n\n if (typeof value === 'object' && value !== null) {\n value = JSON.stringify(value).replace(/\"/g, '').replace(/,/g, ', ');\n }\n\n line += `${key}: ${value} -- `;\n }\n\n line = line.slice(0, -4);\n return line;\n }).join('\\n')}\\n`;\n }\n\n function addMark(label: string) {\n add({ _mark: label });\n }\n\n return {\n add,\n reset,\n getSnapshot,\n waitNextLog,\n get changesSnapshot() {\n return getSnapshot({ changesOnly: true });\n },\n get snapshot() {\n return getSnapshot({ changesOnly: false });\n },\n logsCount,\n get rendersTime() {\n return logsTime;\n },\n addMark,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/typingFnUtils.ts"],"sourcesContent":["import { NonPartial } from './typingUtils';\n\nexport function asNonPartial<T extends Record<string, unknown>>(\n obj: T,\n): NonPartial<T> {\n return obj;\n}\n"],"mappings":";AAEO,SAAS,aACd,KACe;AACf,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type TestTypeIsEqual<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false;
|
|
2
|
+
type TestTypeNotEqual<X, Y> = true extends TestTypeIsEqual<X, Y> ? false : true;
|
|
3
|
+
declare function test(title: string, func: () => any): void;
|
|
4
|
+
declare function describe(title: string, func: () => any): void;
|
|
5
|
+
declare function expectType<T extends true>(): T;
|
|
6
|
+
declare const typingTest: {
|
|
7
|
+
test: typeof test;
|
|
8
|
+
describe: typeof describe;
|
|
9
|
+
expectType: typeof expectType;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { type TestTypeIsEqual, type TestTypeNotEqual, typingTest };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// src/typingTestUtils.ts
|
|
2
|
+
function test(title, func) {
|
|
3
|
+
func();
|
|
4
|
+
}
|
|
5
|
+
function describe(title, func) {
|
|
6
|
+
func();
|
|
7
|
+
}
|
|
8
|
+
function expectType() {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
var typingTest = {
|
|
12
|
+
test,
|
|
13
|
+
describe,
|
|
14
|
+
expectType
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
typingTest
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=typingTestUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/typingTestUtils.ts"],"sourcesContent":["export type TestTypeIsEqual<X, Y> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true\n : false;\nexport type TestTypeNotEqual<X, Y> =\n true extends TestTypeIsEqual<X, Y> ? false : true;\n\nfunction test(title: string, func: () => any) {\n func();\n}\n\nfunction describe(title: string, func: () => any) {\n func();\n}\n\nfunction expectType<T extends true>() {\n return {} as T;\n}\n\nexport const typingTest = {\n test,\n describe,\n expectType,\n};\n"],"mappings":";AAMA,SAAS,KAAK,OAAe,MAAiB;AAC5C,OAAK;AACP;AAEA,SAAS,SAAS,OAAe,MAAiB;AAChD,OAAK;AACP;AAEA,SAAS,aAA6B;AACpC,SAAO,CAAC;AACV;AAEO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type PartialRecord<K extends keyof any, T> = {
|
|
2
|
+
[P in K]?: T;
|
|
3
|
+
};
|
|
4
|
+
type NonPartial<T> = {
|
|
5
|
+
[K in keyof Required<T>]: T[K];
|
|
6
|
+
};
|
|
7
|
+
type ObjKeysWithValuesOfType<Obj extends Record<PropertyKey, unknown>, ValueType> = {
|
|
8
|
+
[K in keyof Obj]: Obj[K] extends ValueType ? K : never;
|
|
9
|
+
}[keyof Obj];
|
|
10
|
+
|
|
11
|
+
export type { NonPartial, ObjKeysWithValuesOfType, PartialRecord };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=typingUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare function yamlStringify(obj: unknown, { maxLineLength, showUndefined, maxDepth, addRootObjSpaces, }?: {
|
|
2
|
+
maxLineLength?: number;
|
|
3
|
+
showUndefined?: boolean;
|
|
4
|
+
maxDepth?: number;
|
|
5
|
+
addRootObjSpaces?: 'before' | 'after' | 'beforeAndAfter' | false;
|
|
6
|
+
}): string;
|
|
7
|
+
|
|
8
|
+
export { yamlStringify };
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import {
|
|
2
|
+
truncateString
|
|
3
|
+
} from "./chunk-4DRNU53E.js";
|
|
4
|
+
import {
|
|
5
|
+
bytesToHumanReadable
|
|
6
|
+
} from "./chunk-MMKMF4GG.js";
|
|
7
|
+
import {
|
|
8
|
+
isObject,
|
|
9
|
+
isPlainObject
|
|
10
|
+
} from "./chunk-JT3EBBCA.js";
|
|
11
|
+
|
|
12
|
+
// src/yamlStringify.ts
|
|
13
|
+
function yamlStringify(obj, {
|
|
14
|
+
maxLineLength = 100,
|
|
15
|
+
showUndefined,
|
|
16
|
+
maxDepth = 50,
|
|
17
|
+
addRootObjSpaces = "beforeAndAfter"
|
|
18
|
+
} = {}) {
|
|
19
|
+
if (isObject(obj) || Array.isArray(obj) || typeof obj === "function") {
|
|
20
|
+
return `${stringifyValue(obj, "", maxLineLength, !!showUndefined, maxDepth, 0, addRootObjSpaces)}
|
|
21
|
+
`;
|
|
22
|
+
}
|
|
23
|
+
return JSON.stringify(obj) || "undefined";
|
|
24
|
+
}
|
|
25
|
+
function stringifyValue(value, indent, maxLineLength, showUndefined, maxDepth, depth, addObjSpaces) {
|
|
26
|
+
let result = "";
|
|
27
|
+
const childIndent = `${indent} `;
|
|
28
|
+
if (isPlainObject(value)) {
|
|
29
|
+
if (Object.keys(value).length === 0) {
|
|
30
|
+
return "{}";
|
|
31
|
+
}
|
|
32
|
+
let prevValue;
|
|
33
|
+
let afterSpaceWasAdded = false;
|
|
34
|
+
for (let [key, objVal] of Object.entries(value)) {
|
|
35
|
+
if (objVal === void 0 && !showUndefined) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (depth > maxDepth) {
|
|
39
|
+
objVal = `{max depth reached}`;
|
|
40
|
+
}
|
|
41
|
+
const normalizedValue2 = normalizeValue(objVal);
|
|
42
|
+
if (normalizedValue2 !== null) {
|
|
43
|
+
objVal = normalizedValue2[1];
|
|
44
|
+
key = `${key}{${normalizedValue2[0]}}`;
|
|
45
|
+
}
|
|
46
|
+
const valueString = stringifyValue(
|
|
47
|
+
objVal,
|
|
48
|
+
childIndent,
|
|
49
|
+
maxLineLength,
|
|
50
|
+
showUndefined,
|
|
51
|
+
maxDepth,
|
|
52
|
+
depth + 1,
|
|
53
|
+
addObjSpaces
|
|
54
|
+
);
|
|
55
|
+
if (!afterSpaceWasAdded && indent === "" && isObject(objVal) && prevValue && (addObjSpaces === "before" || addObjSpaces === "beforeAndAfter")) {
|
|
56
|
+
result += "\n";
|
|
57
|
+
}
|
|
58
|
+
if (Array.isArray(objVal)) {
|
|
59
|
+
const arrayIsSingleLine = valueString.split("\n").length === 1;
|
|
60
|
+
if (arrayIsSingleLine && !valueString.trim().startsWith("-")) {
|
|
61
|
+
result += `${indent}${key}: `;
|
|
62
|
+
} else {
|
|
63
|
+
result += `${indent}${key}:
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
66
|
+
} else if (isObject(objVal)) {
|
|
67
|
+
if (Object.keys(objVal).length === 0) {
|
|
68
|
+
result += `${indent}${key}: `;
|
|
69
|
+
} else {
|
|
70
|
+
result += `${indent}${key}:
|
|
71
|
+
`;
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
result += `${indent}${key}: `;
|
|
75
|
+
}
|
|
76
|
+
result += valueString;
|
|
77
|
+
result += "\n";
|
|
78
|
+
if (indent === "") {
|
|
79
|
+
if (isObject(objVal)) {
|
|
80
|
+
if (addObjSpaces === "after" || addObjSpaces === "beforeAndAfter") {
|
|
81
|
+
result += "\n";
|
|
82
|
+
afterSpaceWasAdded = true;
|
|
83
|
+
} else {
|
|
84
|
+
afterSpaceWasAdded = false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
prevValue = objVal;
|
|
89
|
+
}
|
|
90
|
+
return result.trimEnd();
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(value)) {
|
|
93
|
+
let arrayWasAdded = false;
|
|
94
|
+
if (value.length === 0 || value.every(
|
|
95
|
+
(item) => typeof item === "string" || typeof item === "number" || typeof item === "boolean" || item === null || item === void 0
|
|
96
|
+
)) {
|
|
97
|
+
let line = "";
|
|
98
|
+
line += `[`;
|
|
99
|
+
line += value.map((item) => {
|
|
100
|
+
let valueToUse = item;
|
|
101
|
+
if (depth > maxDepth) {
|
|
102
|
+
valueToUse = `{max depth reached}`;
|
|
103
|
+
}
|
|
104
|
+
if (typeof valueToUse === "string" && valueToUse.includes("\n")) {
|
|
105
|
+
valueToUse = valueToUse.replace(/\n/g, "\\n");
|
|
106
|
+
}
|
|
107
|
+
return stringifyValue(
|
|
108
|
+
valueToUse,
|
|
109
|
+
"",
|
|
110
|
+
maxLineLength,
|
|
111
|
+
showUndefined,
|
|
112
|
+
maxDepth,
|
|
113
|
+
depth + 1,
|
|
114
|
+
addObjSpaces
|
|
115
|
+
);
|
|
116
|
+
}).join(", ");
|
|
117
|
+
line += "]";
|
|
118
|
+
if (line.length <= maxLineLength) {
|
|
119
|
+
result += line;
|
|
120
|
+
arrayWasAdded = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (!arrayWasAdded) {
|
|
124
|
+
for (let item of value) {
|
|
125
|
+
if (depth > maxDepth) {
|
|
126
|
+
item = `{max depth reached}`;
|
|
127
|
+
}
|
|
128
|
+
result += `${indent}- `;
|
|
129
|
+
if (Array.isArray(item) || isObject(item)) {
|
|
130
|
+
let arrayString = stringifyValue(
|
|
131
|
+
item,
|
|
132
|
+
childIndent,
|
|
133
|
+
maxLineLength,
|
|
134
|
+
showUndefined,
|
|
135
|
+
maxDepth,
|
|
136
|
+
depth + 1,
|
|
137
|
+
addObjSpaces
|
|
138
|
+
);
|
|
139
|
+
arrayString = arrayString.trimStart();
|
|
140
|
+
result += arrayString;
|
|
141
|
+
} else {
|
|
142
|
+
result += stringifyValue(
|
|
143
|
+
item,
|
|
144
|
+
childIndent,
|
|
145
|
+
maxLineLength,
|
|
146
|
+
showUndefined,
|
|
147
|
+
maxDepth,
|
|
148
|
+
depth + 1,
|
|
149
|
+
addObjSpaces
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
result += "\n";
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result.trimEnd();
|
|
156
|
+
}
|
|
157
|
+
if (typeof value === "string") {
|
|
158
|
+
if (value.includes("\n")) {
|
|
159
|
+
const lines = value.split("\n");
|
|
160
|
+
for (const [i, line] of lines.entries()) {
|
|
161
|
+
if (i === 0) {
|
|
162
|
+
if (value.endsWith("\n")) {
|
|
163
|
+
result += `|`;
|
|
164
|
+
} else {
|
|
165
|
+
result += `|-`;
|
|
166
|
+
}
|
|
167
|
+
result += `
|
|
168
|
+
${indent}${line}
|
|
169
|
+
`;
|
|
170
|
+
} else {
|
|
171
|
+
result += `${indent}${line}
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
if (value.includes("'")) {
|
|
177
|
+
result += `"${value}"`;
|
|
178
|
+
} else {
|
|
179
|
+
result += `'${value}'`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return result.trimEnd();
|
|
183
|
+
}
|
|
184
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null || value === void 0) {
|
|
185
|
+
return String(value).trimEnd();
|
|
186
|
+
}
|
|
187
|
+
const normalizedValue = normalizeValue(value);
|
|
188
|
+
if (normalizedValue !== null) {
|
|
189
|
+
return stringifyValue(
|
|
190
|
+
{
|
|
191
|
+
[`${normalizedValue[0]}#`]: normalizedValue[1]
|
|
192
|
+
},
|
|
193
|
+
indent,
|
|
194
|
+
maxLineLength,
|
|
195
|
+
showUndefined,
|
|
196
|
+
maxDepth,
|
|
197
|
+
depth + 1,
|
|
198
|
+
addObjSpaces
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
return JSON.stringify(value);
|
|
202
|
+
}
|
|
203
|
+
function normalizeValue(value) {
|
|
204
|
+
if (value === null || isPlainObject(value) || Array.isArray(value)) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
if (value instanceof Map) {
|
|
208
|
+
const mapEntries = Array.from(value.entries());
|
|
209
|
+
let mapValue;
|
|
210
|
+
if (mapEntries.every(([key]) => typeof key === "string")) {
|
|
211
|
+
const mapObjValue = {};
|
|
212
|
+
for (const [key, val] of mapEntries) {
|
|
213
|
+
mapObjValue[key] = val;
|
|
214
|
+
}
|
|
215
|
+
mapValue = mapObjValue;
|
|
216
|
+
} else {
|
|
217
|
+
mapValue = mapEntries.map(([key, val]) => ({
|
|
218
|
+
key,
|
|
219
|
+
value: val
|
|
220
|
+
}));
|
|
221
|
+
}
|
|
222
|
+
return ["Map", mapValue];
|
|
223
|
+
}
|
|
224
|
+
if (value instanceof Set) {
|
|
225
|
+
const setValue = Array.from(value);
|
|
226
|
+
return ["Set", setValue];
|
|
227
|
+
}
|
|
228
|
+
if (value instanceof Date) {
|
|
229
|
+
return ["Date", value.toISOString()];
|
|
230
|
+
}
|
|
231
|
+
if (value instanceof RegExp) {
|
|
232
|
+
return ["RegExp", value.toString()];
|
|
233
|
+
}
|
|
234
|
+
if (value instanceof Error) {
|
|
235
|
+
return [
|
|
236
|
+
"Error",
|
|
237
|
+
{
|
|
238
|
+
message: value.message,
|
|
239
|
+
name: value.name,
|
|
240
|
+
stack: value.stack
|
|
241
|
+
}
|
|
242
|
+
];
|
|
243
|
+
}
|
|
244
|
+
if (value instanceof File) {
|
|
245
|
+
return [
|
|
246
|
+
"File",
|
|
247
|
+
{
|
|
248
|
+
name: value.name,
|
|
249
|
+
type: value.type,
|
|
250
|
+
lastModified: new Date(value.lastModified).toISOString(),
|
|
251
|
+
size: bytesToHumanReadable(value.size)
|
|
252
|
+
}
|
|
253
|
+
];
|
|
254
|
+
}
|
|
255
|
+
if (typeof value === "object") {
|
|
256
|
+
if ("toJSON" in value && typeof value.toJSON === "function") {
|
|
257
|
+
return [value.constructor.name, value.toJSON()];
|
|
258
|
+
}
|
|
259
|
+
if ("toString" in value && typeof value.toString === "function") {
|
|
260
|
+
const stringValue = value.toString();
|
|
261
|
+
if (stringValue.toString() !== "[object Object]") {
|
|
262
|
+
return [value.constructor.name, stringValue];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const objectValue = { ...value };
|
|
266
|
+
const displayValue = {};
|
|
267
|
+
let addedKeys = 0;
|
|
268
|
+
for (const [key, item] of Object.entries(objectValue)) {
|
|
269
|
+
if (addedKeys > 4) {
|
|
270
|
+
displayValue["...and more properties"] = Object.keys(objectValue).length - 4;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
if (typeof item === "string" || typeof item === "number" || typeof item === "boolean" || item === null || item === void 0) {
|
|
274
|
+
displayValue[key] = item;
|
|
275
|
+
addedKeys++;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return [String(value.constructor.name), displayValue];
|
|
279
|
+
}
|
|
280
|
+
if (typeof value === "function") {
|
|
281
|
+
const functionString = value.toString();
|
|
282
|
+
return [
|
|
283
|
+
`Function`,
|
|
284
|
+
functionString.includes("\n") ? truncateString(functionString.split("\n").join(""), 40) : functionString
|
|
285
|
+
];
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
export {
|
|
290
|
+
yamlStringify
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=yamlStringify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/yamlStringify.ts"],"sourcesContent":["import { isObject, isPlainObject } from './assertions';\nimport { bytesToHumanReadable } from './conversions';\nimport { truncateString } from './stringUtils';\n\nexport function yamlStringify(\n obj: unknown,\n {\n maxLineLength = 100,\n showUndefined,\n maxDepth = 50,\n addRootObjSpaces = 'beforeAndAfter',\n }: {\n maxLineLength?: number;\n showUndefined?: boolean;\n maxDepth?: number;\n addRootObjSpaces?: 'before' | 'after' | 'beforeAndAfter' | false;\n } = {},\n): string {\n if (isObject(obj) || Array.isArray(obj) || typeof obj === 'function') {\n return `${stringifyValue(obj, '', maxLineLength, !!showUndefined, maxDepth, 0, addRootObjSpaces)}\\n`;\n }\n\n return JSON.stringify(obj) || 'undefined';\n}\n\nfunction stringifyValue(\n value: unknown,\n indent: string,\n maxLineLength: number,\n showUndefined: boolean,\n maxDepth: number,\n depth: number,\n addObjSpaces: 'before' | 'after' | 'beforeAndAfter' | false,\n): string {\n let result = '';\n const childIndent = `${indent} `;\n\n if (isPlainObject(value)) {\n if (Object.keys(value).length === 0) {\n return '{}';\n }\n\n let prevValue: unknown;\n let afterSpaceWasAdded = false;\n\n for (let [key, objVal] of Object.entries(value)) {\n if (objVal === undefined && !showUndefined) {\n continue;\n }\n\n if (depth > maxDepth) {\n objVal = `{max depth reached}`;\n }\n\n const normalizedValue = normalizeValue(objVal);\n\n if (normalizedValue !== null) {\n objVal = normalizedValue[1];\n key = `${key}{${normalizedValue[0]}}`;\n }\n\n const valueString = stringifyValue(\n objVal,\n childIndent,\n maxLineLength,\n showUndefined,\n maxDepth,\n depth + 1,\n addObjSpaces,\n );\n\n if (\n !afterSpaceWasAdded &&\n indent === '' &&\n isObject(objVal) &&\n prevValue &&\n (addObjSpaces === 'before' || addObjSpaces === 'beforeAndAfter')\n ) {\n result += '\\n';\n }\n\n if (Array.isArray(objVal)) {\n const arrayIsSingleLine = valueString.split('\\n').length === 1;\n\n if (arrayIsSingleLine && !valueString.trim().startsWith('-')) {\n result += `${indent}${key}: `;\n } else {\n result += `${indent}${key}:\\n`;\n }\n } else if (isObject(objVal)) {\n if (Object.keys(objVal).length === 0) {\n result += `${indent}${key}: `;\n } else {\n result += `${indent}${key}:\\n`;\n }\n } else {\n result += `${indent}${key}: `;\n }\n\n result += valueString;\n result += '\\n';\n\n if (indent === '') {\n if (isObject(objVal)) {\n if (addObjSpaces === 'after' || addObjSpaces === 'beforeAndAfter') {\n result += '\\n';\n afterSpaceWasAdded = true;\n } else {\n afterSpaceWasAdded = false;\n }\n }\n }\n\n prevValue = objVal;\n }\n\n return result.trimEnd();\n }\n\n if (Array.isArray(value)) {\n let arrayWasAdded = false;\n\n if (\n value.length === 0 ||\n value.every(\n (item) =>\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n item === null ||\n item === undefined,\n )\n ) {\n let line = '';\n\n line += `[`;\n\n line += value\n .map((item) => {\n let valueToUse = item;\n\n if (depth > maxDepth) {\n valueToUse = `{max depth reached}`;\n }\n\n if (typeof valueToUse === 'string' && valueToUse.includes('\\n')) {\n valueToUse = valueToUse.replace(/\\n/g, '\\\\n');\n }\n\n return stringifyValue(\n valueToUse,\n '',\n maxLineLength,\n showUndefined,\n maxDepth,\n depth + 1,\n addObjSpaces,\n );\n })\n .join(', ');\n\n line += ']';\n\n if (line.length <= maxLineLength) {\n result += line;\n arrayWasAdded = true;\n }\n }\n\n if (!arrayWasAdded) {\n for (let item of value) {\n if (depth > maxDepth) {\n item = `{max depth reached}`;\n }\n\n result += `${indent}- `;\n\n if (Array.isArray(item) || isObject(item)) {\n let arrayString = stringifyValue(\n item,\n childIndent,\n maxLineLength,\n showUndefined,\n maxDepth,\n depth + 1,\n addObjSpaces,\n );\n\n arrayString = arrayString.trimStart();\n\n result += arrayString;\n } else {\n result += stringifyValue(\n item,\n childIndent,\n maxLineLength,\n showUndefined,\n maxDepth,\n depth + 1,\n addObjSpaces,\n );\n }\n\n result += '\\n';\n }\n }\n\n return result.trimEnd();\n }\n\n if (typeof value === 'string') {\n if (value.includes('\\n')) {\n const lines = value.split('\\n');\n\n for (const [i, line] of lines.entries()) {\n if (i === 0) {\n if (value.endsWith('\\n')) {\n result += `|`;\n } else {\n result += `|-`;\n }\n\n result += `\\n${indent}${line}\\n`;\n } else {\n result += `${indent}${line}\\n`;\n }\n }\n } else {\n if (value.includes(\"'\")) {\n result += `\"${value}\"`;\n } else {\n result += `'${value}'`;\n }\n }\n\n return result.trimEnd();\n }\n\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null ||\n value === undefined\n ) {\n return String(value).trimEnd();\n }\n\n const normalizedValue = normalizeValue(value);\n\n if (normalizedValue !== null) {\n return stringifyValue(\n {\n [`${normalizedValue[0]}#`]: normalizedValue[1],\n },\n indent,\n maxLineLength,\n showUndefined,\n maxDepth,\n depth + 1,\n addObjSpaces,\n );\n }\n\n return JSON.stringify(value);\n}\n\nfunction normalizeValue(value: unknown): [string, unknown] | null {\n if (value === null || isPlainObject(value) || Array.isArray(value)) {\n return null;\n }\n\n if (value instanceof Map) {\n const mapEntries = Array.from(value.entries());\n\n let mapValue: unknown;\n\n if (mapEntries.every(([key]) => typeof key === 'string')) {\n const mapObjValue: Record<string, unknown> = {};\n\n for (const [key, val] of mapEntries) {\n mapObjValue[key] = val;\n }\n\n mapValue = mapObjValue;\n } else {\n mapValue = mapEntries.map(([key, val]) => ({\n key,\n value: val,\n }));\n }\n\n return ['Map', mapValue];\n }\n\n if (value instanceof Set) {\n const setValue = Array.from(value);\n\n return ['Set', setValue];\n }\n\n if (value instanceof Date) {\n return ['Date', value.toISOString()];\n }\n\n if (value instanceof RegExp) {\n return ['RegExp', value.toString()];\n }\n\n if (value instanceof Error) {\n return [\n 'Error',\n {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n ];\n }\n\n if (value instanceof File) {\n return [\n 'File',\n {\n name: value.name,\n type: value.type,\n lastModified: new Date(value.lastModified).toISOString(),\n size: bytesToHumanReadable(value.size),\n },\n ];\n }\n\n if (typeof value === 'object') {\n if ('toJSON' in value && typeof value.toJSON === 'function') {\n return [value.constructor.name, value.toJSON()];\n }\n\n if ('toString' in value && typeof value.toString === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n const stringValue = value.toString();\n\n if (stringValue.toString() !== '[object Object]') {\n return [value.constructor.name, stringValue];\n }\n }\n\n const objectValue = { ...value };\n\n const displayValue: Record<string, unknown> = {};\n let addedKeys = 0;\n\n for (const [key, item] of Object.entries(objectValue)) {\n if (addedKeys > 4) {\n displayValue['...and more properties'] =\n Object.keys(objectValue).length - 4;\n break;\n }\n\n if (\n typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean' ||\n item === null ||\n item === undefined\n ) {\n displayValue[key] = item;\n addedKeys++;\n }\n }\n\n return [String(value.constructor.name), displayValue];\n }\n\n if (typeof value === 'function') {\n const functionString = value.toString();\n\n return [\n `Function`,\n functionString.includes('\\n') ?\n truncateString(functionString.split('\\n').join(''), 40)\n : functionString,\n ];\n }\n\n return null;\n}\n"],"mappings":"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","names":["normalizedValue"]}
|