@simplysm/core-common 13.0.69 → 13.0.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/README.md +66 -267
  2. package/dist/common.types.d.ts +14 -14
  3. package/dist/errors/argument-error.d.ts +10 -10
  4. package/dist/errors/argument-error.d.ts.map +1 -1
  5. package/dist/errors/argument-error.js +2 -2
  6. package/dist/errors/argument-error.js.map +1 -1
  7. package/dist/errors/not-implemented-error.d.ts +8 -8
  8. package/dist/errors/not-implemented-error.js +2 -2
  9. package/dist/errors/not-implemented-error.js.map +1 -1
  10. package/dist/errors/sd-error.d.ts +10 -10
  11. package/dist/errors/sd-error.d.ts.map +1 -1
  12. package/dist/errors/timeout-error.d.ts +10 -10
  13. package/dist/errors/timeout-error.js +3 -3
  14. package/dist/errors/timeout-error.js.map +1 -1
  15. package/dist/extensions/arr-ext.d.ts +2 -2
  16. package/dist/extensions/arr-ext.helpers.d.ts +8 -8
  17. package/dist/extensions/arr-ext.helpers.js +1 -1
  18. package/dist/extensions/arr-ext.helpers.js.map +1 -1
  19. package/dist/extensions/arr-ext.js +13 -13
  20. package/dist/extensions/arr-ext.js.map +1 -1
  21. package/dist/extensions/arr-ext.types.d.ts +57 -57
  22. package/dist/extensions/arr-ext.types.d.ts.map +1 -1
  23. package/dist/extensions/map-ext.d.ts +16 -16
  24. package/dist/extensions/set-ext.d.ts +11 -11
  25. package/dist/features/debounce-queue.d.ts +17 -15
  26. package/dist/features/debounce-queue.d.ts.map +1 -1
  27. package/dist/features/debounce-queue.js +6 -6
  28. package/dist/features/debounce-queue.js.map +1 -1
  29. package/dist/features/event-emitter.d.ts +20 -20
  30. package/dist/features/event-emitter.js +17 -17
  31. package/dist/features/serial-queue.d.ts +11 -11
  32. package/dist/features/serial-queue.js +5 -5
  33. package/dist/features/serial-queue.js.map +1 -1
  34. package/dist/globals.d.ts +4 -4
  35. package/dist/types/date-only.d.ts +64 -64
  36. package/dist/types/date-only.d.ts.map +1 -1
  37. package/dist/types/date-only.js +63 -63
  38. package/dist/types/date-time.d.ts +37 -37
  39. package/dist/types/date-time.d.ts.map +1 -1
  40. package/dist/types/date-time.js +54 -37
  41. package/dist/types/date-time.js.map +1 -1
  42. package/dist/types/lazy-gc-map.d.ts +26 -26
  43. package/dist/types/lazy-gc-map.d.ts.map +1 -1
  44. package/dist/types/lazy-gc-map.js +26 -26
  45. package/dist/types/lazy-gc-map.js.map +1 -1
  46. package/dist/types/time.d.ts +25 -25
  47. package/dist/types/time.d.ts.map +1 -1
  48. package/dist/types/time.js +25 -25
  49. package/dist/types/time.js.map +1 -1
  50. package/dist/types/uuid.d.ts +11 -11
  51. package/dist/types/uuid.d.ts.map +1 -1
  52. package/dist/types/uuid.js +12 -12
  53. package/dist/types/uuid.js.map +1 -1
  54. package/dist/utils/bytes.d.ts +17 -17
  55. package/dist/utils/bytes.js +4 -4
  56. package/dist/utils/bytes.js.map +1 -1
  57. package/dist/utils/date-format.d.ts +45 -45
  58. package/dist/utils/date-format.js +1 -1
  59. package/dist/utils/date-format.js.map +1 -1
  60. package/dist/utils/error.d.ts +4 -4
  61. package/dist/utils/json.d.ts +17 -17
  62. package/dist/utils/json.js +3 -3
  63. package/dist/utils/json.js.map +1 -1
  64. package/dist/utils/num.d.ts +23 -23
  65. package/dist/utils/obj.d.ts +111 -111
  66. package/dist/utils/obj.d.ts.map +1 -1
  67. package/dist/utils/obj.js +3 -3
  68. package/dist/utils/obj.js.map +1 -1
  69. package/dist/utils/path.d.ts +10 -10
  70. package/dist/utils/primitive.d.ts +5 -5
  71. package/dist/utils/primitive.js +1 -1
  72. package/dist/utils/primitive.js.map +1 -1
  73. package/dist/utils/str.d.ts +46 -46
  74. package/dist/utils/str.d.ts.map +1 -1
  75. package/dist/utils/str.js +5 -5
  76. package/dist/utils/str.js.map +1 -1
  77. package/dist/utils/template-strings.d.ts +26 -26
  78. package/dist/utils/transferable.d.ts +18 -18
  79. package/dist/utils/transferable.js +1 -1
  80. package/dist/utils/transferable.js.map +1 -1
  81. package/dist/utils/wait.d.ts +9 -9
  82. package/dist/utils/xml.d.ts +13 -13
  83. package/dist/utils/xml.d.ts.map +1 -1
  84. package/dist/utils/xml.js +1 -0
  85. package/dist/utils/xml.js.map +1 -1
  86. package/dist/zip/sd-zip.d.ts +22 -22
  87. package/dist/zip/sd-zip.js +16 -16
  88. package/package.json +4 -4
  89. package/src/common.types.ts +17 -17
  90. package/src/errors/argument-error.ts +15 -15
  91. package/src/errors/not-implemented-error.ts +9 -9
  92. package/src/errors/sd-error.ts +12 -12
  93. package/src/errors/timeout-error.ts +12 -12
  94. package/src/extensions/arr-ext.helpers.ts +10 -10
  95. package/src/extensions/arr-ext.ts +57 -57
  96. package/src/extensions/arr-ext.types.ts +59 -59
  97. package/src/extensions/map-ext.ts +16 -16
  98. package/src/extensions/set-ext.ts +11 -11
  99. package/src/features/debounce-queue.ts +21 -19
  100. package/src/features/event-emitter.ts +25 -25
  101. package/src/features/serial-queue.ts +13 -13
  102. package/src/globals.ts +4 -4
  103. package/src/index.ts +1 -1
  104. package/src/types/date-only.ts +83 -83
  105. package/src/types/date-time.ts +64 -44
  106. package/src/types/lazy-gc-map.ts +45 -45
  107. package/src/types/time.ts +34 -34
  108. package/src/types/uuid.ts +17 -17
  109. package/src/utils/bytes.ts +35 -35
  110. package/src/utils/date-format.ts +65 -65
  111. package/src/utils/error.ts +4 -4
  112. package/src/utils/json.ts +39 -39
  113. package/src/utils/num.ts +23 -23
  114. package/src/utils/obj.ts +138 -138
  115. package/src/utils/path.ts +10 -10
  116. package/src/utils/primitive.ts +6 -6
  117. package/src/utils/str.ts +260 -261
  118. package/src/utils/template-strings.ts +29 -29
  119. package/src/utils/transferable.ts +284 -284
  120. package/src/utils/wait.ts +10 -10
  121. package/src/utils/xml.ts +20 -19
  122. package/src/zip/sd-zip.ts +25 -25
  123. package/tests/errors/errors.spec.ts +80 -0
  124. package/tests/extensions/array-extension.spec.ts +796 -0
  125. package/tests/extensions/map-extension.spec.ts +147 -0
  126. package/tests/extensions/set-extension.spec.ts +74 -0
  127. package/tests/types/date-only.spec.ts +638 -0
  128. package/tests/types/date-time.spec.ts +391 -0
  129. package/tests/types/lazy-gc-map.spec.ts +692 -0
  130. package/tests/types/time.spec.ts +559 -0
  131. package/tests/types/uuid.spec.ts +74 -0
  132. package/tests/utils/bytes-utils.spec.ts +230 -0
  133. package/tests/utils/date-format.spec.ts +373 -0
  134. package/tests/utils/debounce-queue.spec.ts +272 -0
  135. package/tests/utils/json.spec.ts +486 -0
  136. package/tests/utils/number.spec.ts +157 -0
  137. package/tests/utils/object.spec.ts +829 -0
  138. package/tests/utils/path.spec.ts +78 -0
  139. package/tests/utils/primitive.spec.ts +43 -0
  140. package/tests/utils/sd-event-emitter.spec.ts +216 -0
  141. package/tests/utils/serial-queue.spec.ts +365 -0
  142. package/tests/utils/string.spec.ts +281 -0
  143. package/tests/utils/template-strings.spec.ts +57 -0
  144. package/tests/utils/transferable.spec.ts +703 -0
  145. package/tests/utils/wait.spec.ts +145 -0
  146. package/tests/utils/xml.spec.ts +146 -0
  147. package/tests/zip/sd-zip.spec.ts +238 -0
  148. package/docs/extensions.md +0 -503
  149. package/docs/features.md +0 -109
  150. package/docs/types.md +0 -486
  151. package/docs/utils.md +0 -780
@@ -0,0 +1,272 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { DebounceQueue, waitTime as time, SdError } from "@simplysm/core-common";
3
+
4
+ describe("DebounceQueue", () => {
5
+ //#region Debounce behavior
6
+
7
+ describe("Debounce behavior", () => {
8
+ it("Executes only last request", async () => {
9
+ const queue = new DebounceQueue(50);
10
+ const calls: number[] = [];
11
+
12
+ queue.run(() => {
13
+ calls.push(1);
14
+ });
15
+ queue.run(() => {
16
+ calls.push(2);
17
+ });
18
+ queue.run(() => {
19
+ calls.push(3);
20
+ });
21
+
22
+ // Wait for debounce
23
+ await time(100);
24
+
25
+ // Only last request executed
26
+ expect(calls).toEqual([3]);
27
+ });
28
+
29
+ it("Executes after delay", async () => {
30
+ const queue = new DebounceQueue(100);
31
+ const calls: number[] = [];
32
+
33
+ queue.run(() => {
34
+ calls.push(1);
35
+ });
36
+
37
+ // After 50ms not yet executed
38
+ await time(50);
39
+ expect(calls).toEqual([]);
40
+
41
+ // After 100ms executed
42
+ await time(100);
43
+ expect(calls).toEqual([1]);
44
+ });
45
+
46
+ it("Executes immediately if no delay", async () => {
47
+ const queue = new DebounceQueue();
48
+ const calls: number[] = [];
49
+
50
+ queue.run(() => {
51
+ calls.push(1);
52
+ });
53
+
54
+ // Small wait (event loop)
55
+ await time(10);
56
+
57
+ expect(calls).toEqual([1]);
58
+ });
59
+
60
+ it("If new request arrives during execution, executes after completion", async () => {
61
+ const queue = new DebounceQueue(10);
62
+ const calls: number[] = [];
63
+
64
+ queue.run(async () => {
65
+ calls.push(1);
66
+ await time(50); // Wait during execution
67
+ });
68
+
69
+ // Wait for first execution start
70
+ await time(20);
71
+
72
+ // Add new request during execution
73
+ queue.run(() => {
74
+ calls.push(2);
75
+ });
76
+
77
+ // Wait for all work to complete
78
+ await time(100);
79
+
80
+ expect(calls).toEqual([1, 2]);
81
+ });
82
+ });
83
+
84
+ //#endregion
85
+
86
+ //#region Error handling
87
+
88
+ describe("Error handling", () => {
89
+ it("Emits error event on error", async () => {
90
+ const queue = new DebounceQueue(10);
91
+ const errors: SdError[] = [];
92
+
93
+ queue.on("error", (err) => {
94
+ errors.push(err);
95
+ });
96
+
97
+ queue.run(() => {
98
+ throw new Error("test error");
99
+ });
100
+
101
+ await time(50);
102
+
103
+ expect(errors).toHaveLength(1);
104
+ expect(errors[0]).toBeInstanceOf(SdError);
105
+ expect(errors[0].message).toContain("Error occurred while executing task");
106
+ expect(errors[0].message).toContain("test error");
107
+ });
108
+
109
+ it("Next request executes normally even if error occurred", async () => {
110
+ const queue = new DebounceQueue(10);
111
+ const calls: number[] = [];
112
+ const errors: SdError[] = [];
113
+
114
+ // Add error listener to prevent unhandled rejection
115
+ queue.on("error", (err) => {
116
+ errors.push(err);
117
+ });
118
+
119
+ queue.run(() => {
120
+ throw new Error("error");
121
+ });
122
+
123
+ await time(50);
124
+
125
+ queue.run(() => {
126
+ calls.push(1);
127
+ });
128
+
129
+ await time(50);
130
+
131
+ expect(calls).toEqual([1]);
132
+ expect(errors).toHaveLength(1);
133
+ });
134
+
135
+ it("pendingFn executes even if error occurred during execution", async () => {
136
+ const queue = new DebounceQueue(10);
137
+ const calls: number[] = [];
138
+ const errors: SdError[] = [];
139
+
140
+ queue.on("error", (err) => {
141
+ errors.push(err);
142
+ });
143
+
144
+ // First request: error occurs
145
+ queue.run(() => {
146
+ calls.push(1);
147
+ throw new Error("error 1");
148
+ });
149
+
150
+ await time(20);
151
+
152
+ // Add new request during execution
153
+ queue.run(() => {
154
+ calls.push(2);
155
+ });
156
+
157
+ await time(100);
158
+
159
+ expect(calls).toEqual([1, 2]);
160
+ expect(errors).toHaveLength(1);
161
+ });
162
+ });
163
+
164
+ //#endregion
165
+
166
+ //#region dispose
167
+
168
+ describe("dispose()", () => {
169
+ it("Clears pending tasks and timers", async () => {
170
+ const queue = new DebounceQueue(100);
171
+ const calls: number[] = [];
172
+
173
+ queue.run(() => {
174
+ calls.push(1);
175
+ });
176
+
177
+ // Dispose during debounce wait
178
+ await time(50);
179
+ queue.dispose();
180
+
181
+ // After debounce time passes, still not executed
182
+ await time(100);
183
+
184
+ expect(calls).toEqual([]);
185
+ });
186
+
187
+ it("New tasks ignored after dispose", async () => {
188
+ const queue = new DebounceQueue(50);
189
+ const calls: number[] = [];
190
+
191
+ queue.run(() => {
192
+ calls.push(1);
193
+ });
194
+ queue.dispose();
195
+
196
+ // Add new task after dispose - ignored
197
+ queue.run(() => {
198
+ calls.push(2);
199
+ });
200
+
201
+ await time(100);
202
+
203
+ // Tasks after dispose not executed
204
+ expect(calls).toEqual([]);
205
+ });
206
+
207
+ it("Safe to call multiple times", () => {
208
+ const queue = new DebounceQueue(50);
209
+
210
+ // Multiple calls without error
211
+ queue.dispose();
212
+ queue.dispose();
213
+ queue.dispose();
214
+ });
215
+
216
+ it("Auto-disposed with using statement", async () => {
217
+ const calls: number[] = [];
218
+ {
219
+ using queue = new DebounceQueue(100);
220
+ queue.run(() => {
221
+ calls.push(1);
222
+ });
223
+ await time(50);
224
+ } // dispose automatically called at using block end
225
+ await time(100);
226
+ // Disposed during debounce wait, not executed
227
+ expect(calls).toEqual([]);
228
+ });
229
+ });
230
+
231
+ //#endregion
232
+
233
+ //#region Synchronous function support
234
+
235
+ describe("Synchronous function support", () => {
236
+ it("Can execute synchronous function", async () => {
237
+ const queue = new DebounceQueue(10);
238
+ const calls: number[] = [];
239
+
240
+ queue.run(() => {
241
+ calls.push(1);
242
+ });
243
+
244
+ await time(50);
245
+
246
+ expect(calls).toEqual([1]);
247
+ });
248
+
249
+ it("Can mix synchronous and asynchronous functions", async () => {
250
+ const queue = new DebounceQueue(10);
251
+ const calls: number[] = [];
252
+
253
+ queue.run(() => {
254
+ calls.push(1);
255
+ });
256
+ queue.run(async () => {
257
+ await time(10);
258
+ calls.push(2);
259
+ });
260
+ queue.run(() => {
261
+ calls.push(3);
262
+ });
263
+
264
+ await time(100);
265
+
266
+ // Only last request executed
267
+ expect(calls).toEqual([3]);
268
+ });
269
+ });
270
+
271
+ //#endregion
272
+ });