@simplysm/core-common 13.0.76 → 13.0.78
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 +64 -21
- package/dist/extensions/arr-ext.d.ts +1 -1
- package/dist/extensions/arr-ext.d.ts.map +1 -1
- package/dist/extensions/arr-ext.helpers.d.ts +8 -0
- package/dist/extensions/arr-ext.helpers.d.ts.map +1 -1
- package/dist/extensions/arr-ext.helpers.js +65 -0
- package/dist/extensions/arr-ext.helpers.js.map +2 -2
- package/dist/extensions/arr-ext.js +16 -124
- package/dist/extensions/arr-ext.js.map +2 -2
- package/dist/extensions/arr-ext.types.d.ts +40 -32
- package/dist/extensions/arr-ext.types.d.ts.map +1 -1
- package/dist/extensions/map-ext.js.map +1 -1
- package/dist/extensions/set-ext.js.map +1 -1
- package/dist/features/event-emitter.d.ts +4 -4
- package/dist/features/event-emitter.d.ts.map +1 -1
- package/dist/features/event-emitter.js.map +1 -1
- package/dist/features/serial-queue.js +2 -2
- package/dist/features/serial-queue.js.map +1 -1
- package/dist/index.d.ts +13 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -13
- package/dist/index.js.map +1 -1
- package/dist/types/date-only.js +2 -2
- package/dist/types/date-only.js.map +1 -1
- package/dist/types/date-time.js +2 -2
- package/dist/types/date-time.js.map +1 -1
- package/dist/types/time.js +2 -2
- package/dist/types/time.js.map +1 -1
- package/dist/types/uuid.d.ts +2 -2
- package/dist/types/uuid.d.ts.map +1 -1
- package/dist/types/uuid.js +1 -1
- package/dist/types/uuid.js.map +1 -1
- package/dist/utils/bytes.d.ts +10 -10
- package/dist/utils/bytes.d.ts.map +1 -1
- package/dist/utils/bytes.js +10 -10
- package/dist/utils/bytes.js.map +1 -1
- package/dist/utils/date-format.d.ts +1 -1
- package/dist/utils/date-format.d.ts.map +1 -1
- package/dist/utils/date-format.js +2 -2
- package/dist/utils/date-format.js.map +1 -1
- package/dist/utils/error.d.ts +1 -1
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.js +2 -2
- package/dist/utils/error.js.map +1 -1
- package/dist/utils/json.d.ts +4 -2
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js +9 -9
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/num.d.ts +10 -10
- package/dist/utils/num.d.ts.map +1 -1
- package/dist/utils/num.js +11 -11
- package/dist/utils/num.js.map +1 -1
- package/dist/utils/obj.d.ts +40 -40
- package/dist/utils/obj.d.ts.map +1 -1
- package/dist/utils/obj.js +102 -99
- package/dist/utils/obj.js.map +1 -1
- package/dist/utils/path.d.ts +3 -3
- package/dist/utils/path.d.ts.map +1 -1
- package/dist/utils/path.js +6 -6
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/primitive.d.ts +1 -1
- package/dist/utils/primitive.d.ts.map +1 -1
- package/dist/utils/primitive.js +2 -2
- package/dist/utils/primitive.js.map +1 -1
- package/dist/utils/str.d.ts +16 -16
- package/dist/utils/str.d.ts.map +1 -1
- package/dist/utils/str.js +16 -16
- package/dist/utils/str.js.map +1 -1
- package/dist/utils/transferable.d.ts +3 -3
- package/dist/utils/transferable.d.ts.map +1 -1
- package/dist/utils/transferable.js +10 -10
- package/dist/utils/transferable.js.map +1 -1
- package/dist/utils/wait.d.ts +2 -2
- package/dist/utils/wait.d.ts.map +1 -1
- package/dist/utils/wait.js +5 -5
- package/dist/utils/wait.js.map +1 -1
- package/dist/utils/xml.d.ts +2 -2
- package/dist/utils/xml.d.ts.map +1 -1
- package/dist/utils/xml.js +4 -4
- package/dist/utils/xml.js.map +1 -1
- package/dist/{zip/sd-zip.d.ts → utils/zip.d.ts} +1 -1
- package/dist/utils/zip.d.ts.map +1 -0
- package/dist/{zip/sd-zip.js → utils/zip.js} +1 -1
- package/dist/{zip/sd-zip.js.map → utils/zip.js.map} +1 -1
- package/package.json +1 -1
- package/src/extensions/arr-ext.helpers.ts +86 -0
- package/src/extensions/arr-ext.ts +22 -170
- package/src/extensions/arr-ext.types.ts +76 -48
- package/src/extensions/map-ext.ts +3 -3
- package/src/extensions/set-ext.ts +2 -2
- package/src/features/event-emitter.ts +6 -6
- package/src/features/serial-queue.ts +2 -2
- package/src/index.ts +16 -16
- package/src/types/date-only.ts +2 -2
- package/src/types/date-time.ts +2 -2
- package/src/types/time.ts +2 -2
- package/src/types/uuid.ts +2 -2
- package/src/utils/bytes.ts +15 -15
- package/src/utils/date-format.ts +1 -1
- package/src/utils/error.ts +1 -1
- package/src/utils/json.ts +9 -7
- package/src/utils/num.ts +15 -15
- package/src/utils/obj.ts +119 -116
- package/src/utils/path.ts +3 -3
- package/src/utils/primitive.ts +1 -1
- package/src/utils/str.ts +16 -16
- package/src/utils/transferable.ts +9 -9
- package/src/utils/wait.ts +3 -3
- package/src/utils/xml.ts +2 -2
- package/tests/extensions/array-extension.spec.ts +7 -5
- package/tests/types/uuid.spec.ts +4 -4
- package/tests/utils/bytes-utils.spec.ts +42 -49
- package/tests/utils/date-format.spec.ts +89 -88
- package/tests/utils/debounce-queue.spec.ts +3 -1
- package/tests/utils/json.spec.ts +61 -68
- package/tests/utils/number.spec.ts +41 -46
- package/tests/utils/object.spec.ts +120 -139
- package/tests/utils/path.spec.ts +19 -19
- package/tests/utils/primitive.spec.ts +12 -12
- package/tests/utils/string.spec.ts +66 -74
- package/tests/utils/transferable.spec.ts +55 -62
- package/tests/utils/wait.spec.ts +10 -10
- package/tests/utils/xml.spec.ts +25 -25
- package/dist/zip/sd-zip.d.ts.map +0 -1
- /package/src/{zip/sd-zip.ts → utils/zip.ts} +0 -0
- /package/tests/{zip/sd-zip.spec.ts → utils/zip.spec.ts} +0 -0
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
transferableEncode as transferEncode,
|
|
4
|
-
transferableDecode as transferDecode,
|
|
5
|
-
DateTime,
|
|
6
|
-
DateOnly,
|
|
7
|
-
Time,
|
|
8
|
-
Uuid,
|
|
9
|
-
} from "@simplysm/core-common";
|
|
2
|
+
import { transfer, DateTime, DateOnly, Time, Uuid } from "@simplysm/core-common";
|
|
10
3
|
|
|
11
4
|
describe("TransferableConvert", () => {
|
|
12
5
|
//#region encode - Special types
|
|
@@ -14,7 +7,7 @@ describe("TransferableConvert", () => {
|
|
|
14
7
|
describe("encode() - Special types", () => {
|
|
15
8
|
it("Encodes DateTime", () => {
|
|
16
9
|
const dt = new DateTime(2025, 1, 6, 15, 30, 45, 123);
|
|
17
|
-
const { result } =
|
|
10
|
+
const { result } = transfer.encode(dt);
|
|
18
11
|
|
|
19
12
|
expect(result).toEqual({
|
|
20
13
|
__type__: "DateTime",
|
|
@@ -24,7 +17,7 @@ describe("TransferableConvert", () => {
|
|
|
24
17
|
|
|
25
18
|
it("Encodes DateOnly", () => {
|
|
26
19
|
const d = new DateOnly(2025, 1, 6);
|
|
27
|
-
const { result } =
|
|
20
|
+
const { result } = transfer.encode(d);
|
|
28
21
|
|
|
29
22
|
expect(result).toEqual({
|
|
30
23
|
__type__: "DateOnly",
|
|
@@ -34,7 +27,7 @@ describe("TransferableConvert", () => {
|
|
|
34
27
|
|
|
35
28
|
it("Encodes Time", () => {
|
|
36
29
|
const t = new Time(15, 30, 45, 123);
|
|
37
|
-
const { result } =
|
|
30
|
+
const { result } = transfer.encode(t);
|
|
38
31
|
|
|
39
32
|
expect(result).toEqual({
|
|
40
33
|
__type__: "Time",
|
|
@@ -43,8 +36,8 @@ describe("TransferableConvert", () => {
|
|
|
43
36
|
});
|
|
44
37
|
|
|
45
38
|
it("Encodes Uuid", () => {
|
|
46
|
-
const uuid = Uuid.
|
|
47
|
-
const { result } =
|
|
39
|
+
const uuid = Uuid.generate();
|
|
40
|
+
const { result } = transfer.encode(uuid);
|
|
48
41
|
|
|
49
42
|
expect(result).toEqual({
|
|
50
43
|
__type__: "Uuid",
|
|
@@ -55,7 +48,7 @@ describe("TransferableConvert", () => {
|
|
|
55
48
|
it("Encodes Error", () => {
|
|
56
49
|
const err = new Error("test error");
|
|
57
50
|
err.stack = "test stack";
|
|
58
|
-
const { result } =
|
|
51
|
+
const { result } = transfer.encode(err);
|
|
59
52
|
|
|
60
53
|
expect(result).toEqual({
|
|
61
54
|
__type__: "Error",
|
|
@@ -70,7 +63,7 @@ describe("TransferableConvert", () => {
|
|
|
70
63
|
it("Recursively encodes Error cause", () => {
|
|
71
64
|
const cause = new Error("cause error");
|
|
72
65
|
const err = new Error("main error", { cause });
|
|
73
|
-
const { result } =
|
|
66
|
+
const { result } = transfer.encode(err);
|
|
74
67
|
|
|
75
68
|
const typedResult = result as {
|
|
76
69
|
__type__: string;
|
|
@@ -100,7 +93,7 @@ describe("TransferableConvert", () => {
|
|
|
100
93
|
it("Encodes Error code property", () => {
|
|
101
94
|
const err = new Error("test error") as Error & { code: string };
|
|
102
95
|
err.code = "ERR_CUSTOM";
|
|
103
|
-
const { result } =
|
|
96
|
+
const { result } = transfer.encode(err);
|
|
104
97
|
|
|
105
98
|
const typedResult = result as {
|
|
106
99
|
__type__: string;
|
|
@@ -117,7 +110,7 @@ describe("TransferableConvert", () => {
|
|
|
117
110
|
it("Encodes Error detail property", () => {
|
|
118
111
|
const err = new Error("test error") as Error & { detail: unknown };
|
|
119
112
|
err.detail = { userId: 123, action: "delete" };
|
|
120
|
-
const { result } =
|
|
113
|
+
const { result } = transfer.encode(err);
|
|
121
114
|
|
|
122
115
|
const typedResult = result as {
|
|
123
116
|
__type__: string;
|
|
@@ -135,7 +128,7 @@ describe("TransferableConvert", () => {
|
|
|
135
128
|
const err = new Error("test error") as Error & { detail: unknown };
|
|
136
129
|
const dt = new DateTime(2025, 1, 6);
|
|
137
130
|
err.detail = { timestamp: dt };
|
|
138
|
-
const { result } =
|
|
131
|
+
const { result } = transfer.encode(err);
|
|
139
132
|
|
|
140
133
|
const typedResult = result as {
|
|
141
134
|
__type__: string;
|
|
@@ -154,7 +147,7 @@ describe("TransferableConvert", () => {
|
|
|
154
147
|
|
|
155
148
|
it("Encodes Uint8Array and adds to transferList", () => {
|
|
156
149
|
const bytes = new TextEncoder().encode("hello");
|
|
157
|
-
const { result, transferList } =
|
|
150
|
+
const { result, transferList } = transfer.encode(bytes);
|
|
158
151
|
|
|
159
152
|
expect(result).toBe(bytes);
|
|
160
153
|
expect(transferList).toContain(bytes.buffer);
|
|
@@ -162,7 +155,7 @@ describe("TransferableConvert", () => {
|
|
|
162
155
|
|
|
163
156
|
it("Encodes Date", () => {
|
|
164
157
|
const date = new Date(2025, 0, 6, 15, 30, 45, 123);
|
|
165
|
-
const { result } =
|
|
158
|
+
const { result } = transfer.encode(date);
|
|
166
159
|
|
|
167
160
|
expect(result).toEqual({
|
|
168
161
|
__type__: "Date",
|
|
@@ -172,7 +165,7 @@ describe("TransferableConvert", () => {
|
|
|
172
165
|
|
|
173
166
|
it("Encodes RegExp", () => {
|
|
174
167
|
const regex = /test\d+/gi;
|
|
175
|
-
const { result } =
|
|
168
|
+
const { result } = transfer.encode(regex);
|
|
176
169
|
|
|
177
170
|
expect(result).toEqual({
|
|
178
171
|
__type__: "RegExp",
|
|
@@ -187,8 +180,8 @@ describe("TransferableConvert", () => {
|
|
|
187
180
|
|
|
188
181
|
describe("encode() - Collections", () => {
|
|
189
182
|
it("Recursively encodes array", () => {
|
|
190
|
-
const arr = [new DateTime(2025, 1, 6), Uuid.
|
|
191
|
-
const { result } =
|
|
183
|
+
const arr = [new DateTime(2025, 1, 6), Uuid.generate(), "string", 123] as const;
|
|
184
|
+
const { result } = transfer.encode(arr);
|
|
192
185
|
|
|
193
186
|
expect(Array.isArray(result)).toBe(true);
|
|
194
187
|
const resultArr = result as unknown[];
|
|
@@ -202,9 +195,9 @@ describe("TransferableConvert", () => {
|
|
|
202
195
|
it("Recursively encodes Map", () => {
|
|
203
196
|
const map = new Map<string, DateTime | Uuid>([
|
|
204
197
|
["key1", new DateTime(2025, 1, 6)],
|
|
205
|
-
["key2", Uuid.
|
|
198
|
+
["key2", Uuid.generate()],
|
|
206
199
|
]);
|
|
207
|
-
const { result } =
|
|
200
|
+
const { result } = transfer.encode(map);
|
|
208
201
|
|
|
209
202
|
expect(result instanceof Map).toBe(true);
|
|
210
203
|
const resultMap = result as Map<string, unknown>;
|
|
@@ -214,8 +207,8 @@ describe("TransferableConvert", () => {
|
|
|
214
207
|
});
|
|
215
208
|
|
|
216
209
|
it("Recursively encodes Set", () => {
|
|
217
|
-
const set = new Set([new DateTime(2025, 1, 6), Uuid.
|
|
218
|
-
const { result } =
|
|
210
|
+
const set = new Set([new DateTime(2025, 1, 6), Uuid.generate()]);
|
|
211
|
+
const { result } = transfer.encode(set);
|
|
219
212
|
|
|
220
213
|
expect(result instanceof Set).toBe(true);
|
|
221
214
|
const resultSet = result as Set<unknown>;
|
|
@@ -229,11 +222,11 @@ describe("TransferableConvert", () => {
|
|
|
229
222
|
const obj = {
|
|
230
223
|
dt: new DateTime(2025, 1, 6),
|
|
231
224
|
nested: {
|
|
232
|
-
uuid: Uuid.
|
|
225
|
+
uuid: Uuid.generate(),
|
|
233
226
|
arr: [new DateOnly(2025, 1, 6)],
|
|
234
227
|
},
|
|
235
228
|
};
|
|
236
|
-
const { result } =
|
|
229
|
+
const { result } = transfer.encode(obj);
|
|
237
230
|
|
|
238
231
|
const typedResult = result as {
|
|
239
232
|
dt: { __type__: string };
|
|
@@ -258,8 +251,8 @@ describe("TransferableConvert", () => {
|
|
|
258
251
|
const obj: Record<string, unknown> = { a: 1 };
|
|
259
252
|
obj["self"] = obj;
|
|
260
253
|
|
|
261
|
-
expect(() =>
|
|
262
|
-
expect(() =>
|
|
254
|
+
expect(() => transfer.encode(obj)).toThrow(TypeError);
|
|
255
|
+
expect(() => transfer.encode(obj)).toThrow("Circular reference detected");
|
|
263
256
|
});
|
|
264
257
|
|
|
265
258
|
it("Detects nested circular references", () => {
|
|
@@ -267,14 +260,14 @@ describe("TransferableConvert", () => {
|
|
|
267
260
|
const b: Record<string, unknown> = { name: "b", ref: a };
|
|
268
261
|
a["ref"] = b;
|
|
269
262
|
|
|
270
|
-
expect(() =>
|
|
263
|
+
expect(() => transfer.encode(a)).toThrow("Circular reference detected");
|
|
271
264
|
});
|
|
272
265
|
|
|
273
266
|
it("Detects circular references in array", () => {
|
|
274
267
|
const arr: unknown[] = [1, 2, 3];
|
|
275
268
|
arr.push(arr);
|
|
276
269
|
|
|
277
|
-
expect(() =>
|
|
270
|
+
expect(() => transfer.encode(arr)).toThrow("Circular reference detected");
|
|
278
271
|
});
|
|
279
272
|
});
|
|
280
273
|
|
|
@@ -286,7 +279,7 @@ describe("TransferableConvert", () => {
|
|
|
286
279
|
it("Encodes without error when same object is referenced from multiple places", () => {
|
|
287
280
|
const shared = { name: "shared" };
|
|
288
281
|
const data = { a: shared, b: shared };
|
|
289
|
-
const { result } =
|
|
282
|
+
const { result } = transfer.encode(data);
|
|
290
283
|
const decoded = result as Record<string, Record<string, string>>;
|
|
291
284
|
expect(decoded["a"]["name"]).toBe("shared");
|
|
292
285
|
expect(decoded["b"]["name"]).toBe("shared");
|
|
@@ -295,7 +288,7 @@ describe("TransferableConvert", () => {
|
|
|
295
288
|
it("Encodes without error when same array is referenced from multiple places", () => {
|
|
296
289
|
const sharedArr = [1, 2, 3];
|
|
297
290
|
const data = { x: sharedArr, y: sharedArr };
|
|
298
|
-
const { result } =
|
|
291
|
+
const { result } = transfer.encode(data);
|
|
299
292
|
const decoded = result as Record<string, number[]>;
|
|
300
293
|
expect(decoded["x"]).toEqual([1, 2, 3]);
|
|
301
294
|
expect(decoded["y"]).toEqual([1, 2, 3]);
|
|
@@ -310,7 +303,7 @@ describe("TransferableConvert", () => {
|
|
|
310
303
|
it("Decodes DateTime", () => {
|
|
311
304
|
const tick = new DateTime(2025, 1, 6, 15, 30, 45, 123).tick;
|
|
312
305
|
const encoded = { __type__: "DateTime", data: tick };
|
|
313
|
-
const decoded =
|
|
306
|
+
const decoded = transfer.decode(encoded);
|
|
314
307
|
|
|
315
308
|
expect(decoded instanceof DateTime).toBe(true);
|
|
316
309
|
const dt = decoded as DateTime;
|
|
@@ -326,7 +319,7 @@ describe("TransferableConvert", () => {
|
|
|
326
319
|
it("Decodes DateOnly", () => {
|
|
327
320
|
const tick = new DateOnly(2025, 1, 6).tick;
|
|
328
321
|
const encoded = { __type__: "DateOnly", data: tick };
|
|
329
|
-
const decoded =
|
|
322
|
+
const decoded = transfer.decode(encoded);
|
|
330
323
|
|
|
331
324
|
expect(decoded instanceof DateOnly).toBe(true);
|
|
332
325
|
const d = decoded as DateOnly;
|
|
@@ -338,7 +331,7 @@ describe("TransferableConvert", () => {
|
|
|
338
331
|
it("Decodes Time", () => {
|
|
339
332
|
const tick = new Time(15, 30, 45, 123).tick;
|
|
340
333
|
const encoded = { __type__: "Time", data: tick };
|
|
341
|
-
const decoded =
|
|
334
|
+
const decoded = transfer.decode(encoded);
|
|
342
335
|
|
|
343
336
|
expect(decoded instanceof Time).toBe(true);
|
|
344
337
|
const t = decoded as Time;
|
|
@@ -349,9 +342,9 @@ describe("TransferableConvert", () => {
|
|
|
349
342
|
});
|
|
350
343
|
|
|
351
344
|
it("Decodes Uuid", () => {
|
|
352
|
-
const uuid = Uuid.
|
|
345
|
+
const uuid = Uuid.generate();
|
|
353
346
|
const encoded = { __type__: "Uuid", data: uuid.toString() };
|
|
354
|
-
const decoded =
|
|
347
|
+
const decoded = transfer.decode(encoded);
|
|
355
348
|
|
|
356
349
|
expect(decoded instanceof Uuid).toBe(true);
|
|
357
350
|
expect((decoded as Uuid).toString()).toBe(uuid.toString());
|
|
@@ -366,7 +359,7 @@ describe("TransferableConvert", () => {
|
|
|
366
359
|
stack: "test stack",
|
|
367
360
|
},
|
|
368
361
|
};
|
|
369
|
-
const decoded =
|
|
362
|
+
const decoded = transfer.decode(encoded);
|
|
370
363
|
|
|
371
364
|
expect(decoded instanceof Error).toBe(true);
|
|
372
365
|
const err = decoded as Error;
|
|
@@ -390,7 +383,7 @@ describe("TransferableConvert", () => {
|
|
|
390
383
|
},
|
|
391
384
|
},
|
|
392
385
|
};
|
|
393
|
-
const decoded =
|
|
386
|
+
const decoded = transfer.decode(encoded);
|
|
394
387
|
|
|
395
388
|
expect(decoded instanceof Error).toBe(true);
|
|
396
389
|
const err = decoded as Error;
|
|
@@ -408,7 +401,7 @@ describe("TransferableConvert", () => {
|
|
|
408
401
|
code: "ERR_CUSTOM",
|
|
409
402
|
},
|
|
410
403
|
};
|
|
411
|
-
const decoded =
|
|
404
|
+
const decoded = transfer.decode(encoded);
|
|
412
405
|
|
|
413
406
|
expect(decoded instanceof Error).toBe(true);
|
|
414
407
|
const err = decoded as Error & { code?: string };
|
|
@@ -424,7 +417,7 @@ describe("TransferableConvert", () => {
|
|
|
424
417
|
detail: { userId: 123, action: "delete" },
|
|
425
418
|
},
|
|
426
419
|
};
|
|
427
|
-
const decoded =
|
|
420
|
+
const decoded = transfer.decode(encoded);
|
|
428
421
|
|
|
429
422
|
expect(decoded instanceof Error).toBe(true);
|
|
430
423
|
const err = decoded as Error & { detail?: unknown };
|
|
@@ -441,7 +434,7 @@ describe("TransferableConvert", () => {
|
|
|
441
434
|
detail: { timestamp: { __type__: "DateTime", data: tick } },
|
|
442
435
|
},
|
|
443
436
|
};
|
|
444
|
-
const decoded =
|
|
437
|
+
const decoded = transfer.decode(encoded);
|
|
445
438
|
|
|
446
439
|
expect(decoded instanceof Error).toBe(true);
|
|
447
440
|
const err = decoded as Error & { detail?: { timestamp: DateTime } };
|
|
@@ -452,7 +445,7 @@ describe("TransferableConvert", () => {
|
|
|
452
445
|
it("Decodes Date", () => {
|
|
453
446
|
const tick = new Date(2025, 0, 6, 15, 30, 45, 123).getTime();
|
|
454
447
|
const encoded = { __type__: "Date", data: tick };
|
|
455
|
-
const decoded =
|
|
448
|
+
const decoded = transfer.decode(encoded);
|
|
456
449
|
|
|
457
450
|
expect(decoded instanceof Date).toBe(true);
|
|
458
451
|
const date = decoded as Date;
|
|
@@ -470,7 +463,7 @@ describe("TransferableConvert", () => {
|
|
|
470
463
|
__type__: "RegExp",
|
|
471
464
|
data: { source: "test\\d+", flags: "gi" },
|
|
472
465
|
};
|
|
473
|
-
const decoded =
|
|
466
|
+
const decoded = transfer.decode(encoded);
|
|
474
467
|
|
|
475
468
|
expect(decoded instanceof RegExp).toBe(true);
|
|
476
469
|
const regex = decoded as RegExp;
|
|
@@ -490,14 +483,14 @@ describe("TransferableConvert", () => {
|
|
|
490
483
|
describe("decode() - Collections", () => {
|
|
491
484
|
it("Recursively decodes array", () => {
|
|
492
485
|
const tick = new DateTime(2025, 1, 6).tick;
|
|
493
|
-
const uuidStr = Uuid.
|
|
486
|
+
const uuidStr = Uuid.generate().toString();
|
|
494
487
|
const encoded = [
|
|
495
488
|
{ __type__: "DateTime", data: tick },
|
|
496
489
|
{ __type__: "Uuid", data: uuidStr },
|
|
497
490
|
"string",
|
|
498
491
|
123,
|
|
499
492
|
];
|
|
500
|
-
const decoded =
|
|
493
|
+
const decoded = transfer.decode(encoded);
|
|
501
494
|
|
|
502
495
|
expect(Array.isArray(decoded)).toBe(true);
|
|
503
496
|
const arr = decoded as unknown[];
|
|
@@ -513,7 +506,7 @@ describe("TransferableConvert", () => {
|
|
|
513
506
|
["key1", { __type__: "DateTime", data: tick }],
|
|
514
507
|
["key2", "value"],
|
|
515
508
|
]);
|
|
516
|
-
const decoded =
|
|
509
|
+
const decoded = transfer.decode(encoded);
|
|
517
510
|
|
|
518
511
|
expect(decoded instanceof Map).toBe(true);
|
|
519
512
|
const map = decoded as Map<string, unknown>;
|
|
@@ -524,7 +517,7 @@ describe("TransferableConvert", () => {
|
|
|
524
517
|
it("Recursively decodes Set", () => {
|
|
525
518
|
const tick = new DateTime(2025, 1, 6).tick;
|
|
526
519
|
const encoded = new Set([{ __type__: "DateTime", data: tick }, "string"]);
|
|
527
|
-
const decoded =
|
|
520
|
+
const decoded = transfer.decode(encoded);
|
|
528
521
|
|
|
529
522
|
expect(decoded instanceof Set).toBe(true);
|
|
530
523
|
const set = decoded as Set<unknown>;
|
|
@@ -535,7 +528,7 @@ describe("TransferableConvert", () => {
|
|
|
535
528
|
|
|
536
529
|
it("Recursively decodes nested object", () => {
|
|
537
530
|
const dtTick = new DateTime(2025, 1, 6).tick;
|
|
538
|
-
const uuidStr = Uuid.
|
|
531
|
+
const uuidStr = Uuid.generate().toString();
|
|
539
532
|
const dTick = new DateOnly(2025, 1, 6).tick;
|
|
540
533
|
const encoded = {
|
|
541
534
|
dt: { __type__: "DateTime", data: dtTick },
|
|
@@ -544,7 +537,7 @@ describe("TransferableConvert", () => {
|
|
|
544
537
|
arr: [{ __type__: "DateOnly", data: dTick }],
|
|
545
538
|
},
|
|
546
539
|
};
|
|
547
|
-
const decoded =
|
|
540
|
+
const decoded = transfer.decode(encoded);
|
|
548
541
|
|
|
549
542
|
const obj = decoded as {
|
|
550
543
|
dt: DateTime;
|
|
@@ -573,7 +566,7 @@ describe("TransferableConvert", () => {
|
|
|
573
566
|
};
|
|
574
567
|
const originalCopy = JSON.stringify(original);
|
|
575
568
|
|
|
576
|
-
|
|
569
|
+
transfer.decode(original);
|
|
577
570
|
|
|
578
571
|
// Verify original is not modified
|
|
579
572
|
expect(JSON.stringify(original)).toBe(originalCopy);
|
|
@@ -585,7 +578,7 @@ describe("TransferableConvert", () => {
|
|
|
585
578
|
const tick = new DateTime(2025, 1, 6).tick;
|
|
586
579
|
const original = [{ __type__: "DateTime", data: tick }];
|
|
587
580
|
|
|
588
|
-
const decoded =
|
|
581
|
+
const decoded = transfer.decode(original);
|
|
589
582
|
|
|
590
583
|
// Result is a new array
|
|
591
584
|
expect(decoded).not.toBe(original);
|
|
@@ -602,8 +595,8 @@ describe("TransferableConvert", () => {
|
|
|
602
595
|
describe("Round-trip conversion (encode → decode)", () => {
|
|
603
596
|
it("Round-trips DateTime", () => {
|
|
604
597
|
const original = new DateTime(2025, 1, 6, 15, 30, 45, 123);
|
|
605
|
-
const { result } =
|
|
606
|
-
const decoded =
|
|
598
|
+
const { result } = transfer.encode(original);
|
|
599
|
+
const decoded = transfer.decode(result) as DateTime;
|
|
607
600
|
|
|
608
601
|
expect(decoded.tick).toBe(original.tick);
|
|
609
602
|
});
|
|
@@ -613,14 +606,14 @@ describe("TransferableConvert", () => {
|
|
|
613
606
|
dt: new DateTime(2025, 1, 6),
|
|
614
607
|
d: new DateOnly(2025, 1, 6),
|
|
615
608
|
t: new Time(15, 30, 45),
|
|
616
|
-
uuid: Uuid.
|
|
609
|
+
uuid: Uuid.generate(),
|
|
617
610
|
arr: [new DateTime(2024, 12, 31)],
|
|
618
611
|
map: new Map([["key", new DateOnly(2025, 1, 1)]]),
|
|
619
612
|
set: new Set([new Time(12, 0, 0)]),
|
|
620
613
|
};
|
|
621
614
|
|
|
622
|
-
const { result } =
|
|
623
|
-
const decoded =
|
|
615
|
+
const { result } = transfer.encode(original);
|
|
616
|
+
const decoded = transfer.decode(result) as typeof original;
|
|
624
617
|
|
|
625
618
|
expect(decoded.dt instanceof DateTime).toBe(true);
|
|
626
619
|
expect(decoded.d instanceof DateOnly).toBe(true);
|
|
@@ -633,8 +626,8 @@ describe("TransferableConvert", () => {
|
|
|
633
626
|
|
|
634
627
|
it("Round-trips RegExp", () => {
|
|
635
628
|
const original = /test\d+/gi;
|
|
636
|
-
const { result } =
|
|
637
|
-
const decoded =
|
|
629
|
+
const { result } = transfer.encode(original);
|
|
630
|
+
const decoded = transfer.decode(result) as RegExp;
|
|
638
631
|
|
|
639
632
|
expect(decoded instanceof RegExp).toBe(true);
|
|
640
633
|
expect(decoded.source).toBe(original.source);
|
package/tests/utils/wait.spec.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import { wait, TimeoutError } from "@simplysm/core-common";
|
|
3
3
|
|
|
4
4
|
describe("Wait", () => {
|
|
5
5
|
//#region time
|
|
@@ -7,7 +7,7 @@ describe("Wait", () => {
|
|
|
7
7
|
describe("time()", () => {
|
|
8
8
|
it("Waits for specified time", async () => {
|
|
9
9
|
const start = Date.now();
|
|
10
|
-
await time(100);
|
|
10
|
+
await wait.time(100);
|
|
11
11
|
const elapsed = Date.now() - start;
|
|
12
12
|
|
|
13
13
|
// 100ms ± tolerance - CI environment load and timer precision considered
|
|
@@ -24,7 +24,7 @@ describe("Wait", () => {
|
|
|
24
24
|
it("Waits until condition becomes true", async () => {
|
|
25
25
|
let count = 0;
|
|
26
26
|
|
|
27
|
-
await until(() => {
|
|
27
|
+
await wait.until(() => {
|
|
28
28
|
count++;
|
|
29
29
|
return count >= 3;
|
|
30
30
|
}, 10);
|
|
@@ -35,8 +35,8 @@ describe("Wait", () => {
|
|
|
35
35
|
it("Supports async condition function", async () => {
|
|
36
36
|
let count = 0;
|
|
37
37
|
|
|
38
|
-
await until(async () => {
|
|
39
|
-
await time(10);
|
|
38
|
+
await wait.until(async () => {
|
|
39
|
+
await wait.time(10);
|
|
40
40
|
count++;
|
|
41
41
|
return count >= 3;
|
|
42
42
|
}, 10);
|
|
@@ -46,7 +46,7 @@ describe("Wait", () => {
|
|
|
46
46
|
|
|
47
47
|
it("Returns immediately if condition already true", async () => {
|
|
48
48
|
const start = Date.now();
|
|
49
|
-
await until(() => true, 100);
|
|
49
|
+
await wait.until(() => true, 100);
|
|
50
50
|
const elapsed = Date.now() - start;
|
|
51
51
|
|
|
52
52
|
expect(elapsed).toBeLessThan(50);
|
|
@@ -56,7 +56,7 @@ describe("Wait", () => {
|
|
|
56
56
|
let count = 0;
|
|
57
57
|
|
|
58
58
|
await expect(async () => {
|
|
59
|
-
await until(
|
|
59
|
+
await wait.until(
|
|
60
60
|
() => {
|
|
61
61
|
count++;
|
|
62
62
|
return false;
|
|
@@ -73,7 +73,7 @@ describe("Wait", () => {
|
|
|
73
73
|
let count = 0;
|
|
74
74
|
|
|
75
75
|
// Unlimited wait but returns when condition true
|
|
76
|
-
await until(
|
|
76
|
+
await wait.until(
|
|
77
77
|
() => {
|
|
78
78
|
count++;
|
|
79
79
|
return count >= 10;
|
|
@@ -89,7 +89,7 @@ describe("Wait", () => {
|
|
|
89
89
|
let count = 0;
|
|
90
90
|
const start = Date.now();
|
|
91
91
|
|
|
92
|
-
await until(() => {
|
|
92
|
+
await wait.until(() => {
|
|
93
93
|
count++;
|
|
94
94
|
return count >= 3;
|
|
95
95
|
});
|
|
@@ -104,7 +104,7 @@ describe("Wait", () => {
|
|
|
104
104
|
let count = 0;
|
|
105
105
|
|
|
106
106
|
await expect(async () => {
|
|
107
|
-
await until(
|
|
107
|
+
await wait.until(
|
|
108
108
|
() => {
|
|
109
109
|
count++;
|
|
110
110
|
return false;
|
package/tests/utils/xml.spec.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import { xml } from "@simplysm/core-common";
|
|
3
3
|
|
|
4
4
|
describe("XmlConvert", () => {
|
|
5
5
|
//#region parse
|
|
6
6
|
|
|
7
7
|
describe("parse()", () => {
|
|
8
8
|
it("Parses basic XML", () => {
|
|
9
|
-
const
|
|
10
|
-
const result = parse(
|
|
9
|
+
const xmlStr = "<root><child>value</child></root>";
|
|
10
|
+
const result = xml.parse(xmlStr) as Record<string, unknown>;
|
|
11
11
|
|
|
12
12
|
expect(result).toHaveProperty("root");
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
it("Parses XML with attributes", () => {
|
|
16
|
-
const
|
|
17
|
-
const result = parse(
|
|
16
|
+
const xmlStr = '<root id="1"><child name="test">value</child></root>';
|
|
17
|
+
const result = xml.parse(xmlStr) as {
|
|
18
18
|
root: {
|
|
19
19
|
$: { id: string };
|
|
20
20
|
child: Array<{ $: { name: string }; _: string }>;
|
|
@@ -26,8 +26,8 @@ describe("XmlConvert", () => {
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
it("Parses nested XML", () => {
|
|
29
|
-
const
|
|
30
|
-
const result = parse(
|
|
29
|
+
const xmlStr = "<root><parent><child>value</child></parent></root>";
|
|
30
|
+
const result = xml.parse(xmlStr) as {
|
|
31
31
|
root: { parent: Array<{ child: string[] }> };
|
|
32
32
|
};
|
|
33
33
|
|
|
@@ -35,8 +35,8 @@ describe("XmlConvert", () => {
|
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
it("Parses text nodes as _ key", () => {
|
|
38
|
-
const
|
|
39
|
-
const result = parse(
|
|
38
|
+
const xmlStr = '<item id="1">text content</item>';
|
|
39
|
+
const result = xml.parse(xmlStr) as {
|
|
40
40
|
item: { $: { id: string }; _: string };
|
|
41
41
|
};
|
|
42
42
|
|
|
@@ -44,8 +44,8 @@ describe("XmlConvert", () => {
|
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
it("Removes namespace prefix (stripTagPrefix: true)", () => {
|
|
47
|
-
const
|
|
48
|
-
const result = parse(
|
|
47
|
+
const xmlStr = "<ns:root><ns:child>value</ns:child></ns:root>";
|
|
48
|
+
const result = xml.parse(xmlStr, { stripTagPrefix: true }) as {
|
|
49
49
|
root: { child: string[] };
|
|
50
50
|
};
|
|
51
51
|
|
|
@@ -54,22 +54,22 @@ describe("XmlConvert", () => {
|
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
it("Preserves namespace prefix (default)", () => {
|
|
57
|
-
const
|
|
58
|
-
const result = parse(
|
|
57
|
+
const xmlStr = "<ns:root><ns:child>value</ns:child></ns:root>";
|
|
58
|
+
const result = xml.parse(xmlStr) as Record<string, unknown>;
|
|
59
59
|
|
|
60
60
|
expect(result).toHaveProperty("ns:root");
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
it("Parses multiple same tags as array", () => {
|
|
64
|
-
const
|
|
65
|
-
const result = parse(
|
|
64
|
+
const xmlStr = "<root><item>1</item><item>2</item><item>3</item></root>";
|
|
65
|
+
const result = xml.parse(xmlStr) as { root: { item: string[] } };
|
|
66
66
|
|
|
67
67
|
expect(result.root.item).toEqual(["1", "2", "3"]);
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
it("Does not remove namespace prefix from attributes", () => {
|
|
71
|
-
const
|
|
72
|
-
const result = parse(
|
|
71
|
+
const xmlStr = '<ns:root xmlns:ns="http://example.com"><ns:child>value</ns:child></ns:root>';
|
|
72
|
+
const result = xml.parse(xmlStr, { stripTagPrefix: true }) as {
|
|
73
73
|
root: { $: Record<string, string>; child: string[] };
|
|
74
74
|
};
|
|
75
75
|
|
|
@@ -84,7 +84,7 @@ describe("XmlConvert", () => {
|
|
|
84
84
|
describe("stringify()", () => {
|
|
85
85
|
it("Serializes object to XML", () => {
|
|
86
86
|
const obj = { root: { child: "value" } };
|
|
87
|
-
const result = stringify(obj);
|
|
87
|
+
const result = xml.stringify(obj);
|
|
88
88
|
|
|
89
89
|
expect(result).toContain("<root>");
|
|
90
90
|
expect(result).toContain("<child>value</child>");
|
|
@@ -93,7 +93,7 @@ describe("XmlConvert", () => {
|
|
|
93
93
|
|
|
94
94
|
it("Serializes object with attributes", () => {
|
|
95
95
|
const obj = { root: { $: { id: "1" }, child: "value" } };
|
|
96
|
-
const result = stringify(obj);
|
|
96
|
+
const result = xml.stringify(obj);
|
|
97
97
|
|
|
98
98
|
expect(result).toContain('id="1"');
|
|
99
99
|
expect(result).toContain("<child>value</child>");
|
|
@@ -101,7 +101,7 @@ describe("XmlConvert", () => {
|
|
|
101
101
|
|
|
102
102
|
it("Serializes array as multiple tags", () => {
|
|
103
103
|
const obj = { root: { item: ["1", "2", "3"] } };
|
|
104
|
-
const result = stringify(obj);
|
|
104
|
+
const result = xml.stringify(obj);
|
|
105
105
|
|
|
106
106
|
expect(result).toContain("<item>1</item>");
|
|
107
107
|
expect(result).toContain("<item>2</item>");
|
|
@@ -110,7 +110,7 @@ describe("XmlConvert", () => {
|
|
|
110
110
|
|
|
111
111
|
it("Serializes text node as _ key", () => {
|
|
112
112
|
const obj = { item: { $: { id: "1" }, _: "text content" } };
|
|
113
|
-
const result = stringify(obj);
|
|
113
|
+
const result = xml.stringify(obj);
|
|
114
114
|
|
|
115
115
|
expect(result).toContain('id="1"');
|
|
116
116
|
expect(result).toContain("text content");
|
|
@@ -118,7 +118,7 @@ describe("XmlConvert", () => {
|
|
|
118
118
|
|
|
119
119
|
it("Serializes nested object", () => {
|
|
120
120
|
const obj = { root: { parent: { child: "value" } } };
|
|
121
|
-
const result = stringify(obj);
|
|
121
|
+
const result = xml.stringify(obj);
|
|
122
122
|
|
|
123
123
|
expect(result).toContain("<parent>");
|
|
124
124
|
expect(result).toContain("<child>value</child>");
|
|
@@ -132,9 +132,9 @@ describe("XmlConvert", () => {
|
|
|
132
132
|
|
|
133
133
|
describe("parse/stringify roundtrip", () => {
|
|
134
134
|
it("Structure preserved after parse then stringify", () => {
|
|
135
|
-
const
|
|
136
|
-
const parsed = parse(
|
|
137
|
-
const result = stringify(parsed);
|
|
135
|
+
const xmlStr = "<root><child>value</child></root>";
|
|
136
|
+
const parsed = xml.parse(xmlStr);
|
|
137
|
+
const result = xml.stringify(parsed);
|
|
138
138
|
|
|
139
139
|
expect(result).toContain("<root>");
|
|
140
140
|
expect(result).toContain("<child>value</child>");
|
package/dist/zip/sd-zip.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sd-zip.d.ts","sourceRoot":"","sources":["../../src/zip/sd-zip.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,CAA6D;IAE9E;;;OAGG;gBACS,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK;YAUjB,WAAW;IAQzB;;;OAGG;IACG,UAAU,CACd,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,GACxD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;IAoD1C;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAwBvD;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3C;;;;;;OAMG;IACG,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAiBhC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7C"}
|
|
File without changes
|
|
File without changes
|