katanakit-js 2.2.1 → 2.12.9

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 (148) hide show
  1. package/README.md +72 -437
  2. package/dist/adapters/astro/astro.service.d.ts +103 -15
  3. package/dist/adapters/astro/astro.service.d.ts.map +1 -1
  4. package/dist/adapters/astro/astro.service.js +145 -75
  5. package/dist/adapters/astro/astro.service.js.map +1 -1
  6. package/dist/adapters/astro/index.d.ts +1 -1
  7. package/dist/adapters/astro/index.d.ts.map +1 -1
  8. package/dist/adapters/astro/index.js +1 -1
  9. package/dist/adapters/astro/index.js.map +1 -1
  10. package/dist/adapters/astro/rss.service.d.ts +85 -105
  11. package/dist/adapters/astro/rss.service.d.ts.map +1 -1
  12. package/dist/adapters/astro/rss.service.js +172 -168
  13. package/dist/adapters/astro/rss.service.js.map +1 -1
  14. package/dist/adapters/astro/seo.service.d.ts +10 -0
  15. package/dist/adapters/astro/seo.service.d.ts.map +1 -0
  16. package/dist/adapters/astro/seo.service.js +3 -0
  17. package/dist/adapters/astro/seo.service.js.map +1 -0
  18. package/dist/adapters/express/app.d.ts +30 -1
  19. package/dist/adapters/express/app.d.ts.map +1 -1
  20. package/dist/adapters/express/app.js +31 -3
  21. package/dist/adapters/express/app.js.map +1 -1
  22. package/dist/adapters/express/index.d.ts +2 -2
  23. package/dist/adapters/express/index.d.ts.map +1 -1
  24. package/dist/adapters/express/index.js +2 -2
  25. package/dist/adapters/express/index.js.map +1 -1
  26. package/dist/adapters/express/main.js +2 -2
  27. package/dist/adapters/express/main.js.map +1 -1
  28. package/dist/adapters/express/products.controller.d.ts +67 -8
  29. package/dist/adapters/express/products.controller.d.ts.map +1 -1
  30. package/dist/adapters/express/products.controller.js +105 -49
  31. package/dist/adapters/express/products.controller.js.map +1 -1
  32. package/dist/adapters/express/server.d.ts +37 -13
  33. package/dist/adapters/express/server.d.ts.map +1 -1
  34. package/dist/adapters/express/server.js +118 -53
  35. package/dist/adapters/express/server.js.map +1 -1
  36. package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
  37. package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
  38. package/dist/adapters/nuxt/nuxt.service.js +34 -10
  39. package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
  40. package/dist/adapters/vue/vue.service.d.ts +5 -2
  41. package/dist/adapters/vue/vue.service.d.ts.map +1 -1
  42. package/dist/adapters/vue/vue.service.js +41 -7
  43. package/dist/adapters/vue/vue.service.js.map +1 -1
  44. package/dist/config/index.d.ts +2 -1
  45. package/dist/config/index.d.ts.map +1 -1
  46. package/dist/config/index.js +1 -1
  47. package/dist/config/index.js.map +1 -1
  48. package/dist/config/seo-meta.types.d.ts +177 -0
  49. package/dist/config/seo-meta.types.d.ts.map +1 -0
  50. package/dist/config/seo-meta.types.js +11 -0
  51. package/dist/config/seo-meta.types.js.map +1 -0
  52. package/dist/config/seo.service.d.ts +41 -58
  53. package/dist/config/seo.service.d.ts.map +1 -1
  54. package/dist/config/seo.service.js +468 -136
  55. package/dist/config/seo.service.js.map +1 -1
  56. package/dist/config/site.config.d.ts +10 -50
  57. package/dist/config/site.config.d.ts.map +1 -1
  58. package/dist/config/site.config.js +8 -36
  59. package/dist/config/site.config.js.map +1 -1
  60. package/dist/core/index.d.ts +1 -3
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +1 -3
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/services/dates.service.d.ts +149 -22
  65. package/dist/core/services/dates.service.d.ts.map +1 -1
  66. package/dist/core/services/dates.service.js +201 -54
  67. package/dist/core/services/dates.service.js.map +1 -1
  68. package/dist/core/services/error.service.d.ts +32 -20
  69. package/dist/core/services/error.service.d.ts.map +1 -1
  70. package/dist/core/services/error.service.js +44 -32
  71. package/dist/core/services/error.service.js.map +1 -1
  72. package/dist/core/services/formatter.service.d.ts +245 -35
  73. package/dist/core/services/formatter.service.d.ts.map +1 -1
  74. package/dist/core/services/formatter.service.js +281 -57
  75. package/dist/core/services/formatter.service.js.map +1 -1
  76. package/dist/core/services/generator.service.d.ts +115 -26
  77. package/dist/core/services/generator.service.d.ts.map +1 -1
  78. package/dist/core/services/generator.service.js +191 -56
  79. package/dist/core/services/generator.service.js.map +1 -1
  80. package/dist/core/services/geometry.service.d.ts +369 -39
  81. package/dist/core/services/geometry.service.d.ts.map +1 -1
  82. package/dist/core/services/geometry.service.js +424 -66
  83. package/dist/core/services/geometry.service.js.map +1 -1
  84. package/dist/core/services/http.service.d.ts +244 -21
  85. package/dist/core/services/http.service.d.ts.map +1 -1
  86. package/dist/core/services/http.service.js +419 -98
  87. package/dist/core/services/http.service.js.map +1 -1
  88. package/dist/core/services/logger.service.d.ts +95 -29
  89. package/dist/core/services/logger.service.d.ts.map +1 -1
  90. package/dist/core/services/logger.service.js +167 -41
  91. package/dist/core/services/logger.service.js.map +1 -1
  92. package/dist/core/services/reactive.service.d.ts +146 -19
  93. package/dist/core/services/reactive.service.d.ts.map +1 -1
  94. package/dist/core/services/reactive.service.js +278 -137
  95. package/dist/core/services/reactive.service.js.map +1 -1
  96. package/dist/core/services/timing.service.d.ts +142 -20
  97. package/dist/core/services/timing.service.d.ts.map +1 -1
  98. package/dist/core/services/timing.service.js +324 -185
  99. package/dist/core/services/timing.service.js.map +1 -1
  100. package/dist/core/services/utils.service.d.ts +228 -43
  101. package/dist/core/services/utils.service.d.ts.map +1 -1
  102. package/dist/core/services/utils.service.js +305 -125
  103. package/dist/core/services/utils.service.js.map +1 -1
  104. package/dist/infrastructure/dom/dom.service.d.ts +307 -44
  105. package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
  106. package/dist/infrastructure/dom/dom.service.js +408 -129
  107. package/dist/infrastructure/dom/dom.service.js.map +1 -1
  108. package/dist/infrastructure/index.d.ts +0 -3
  109. package/dist/infrastructure/index.d.ts.map +1 -1
  110. package/dist/infrastructure/index.js +0 -3
  111. package/dist/infrastructure/index.js.map +1 -1
  112. package/dist/infrastructure/observer/observer.service.d.ts +124 -31
  113. package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
  114. package/dist/infrastructure/observer/observer.service.js +227 -131
  115. package/dist/infrastructure/observer/observer.service.js.map +1 -1
  116. package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
  117. package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
  118. package/dist/infrastructure/sensors/sensors.service.js +264 -112
  119. package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
  120. package/dist/infrastructure/storage/storage.service.d.ts +123 -45
  121. package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
  122. package/dist/infrastructure/storage/storage.service.js +236 -66
  123. package/dist/infrastructure/storage/storage.service.js.map +1 -1
  124. package/dist/infrastructure/theme/theme.service.d.ts +93 -29
  125. package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
  126. package/dist/infrastructure/theme/theme.service.js +198 -96
  127. package/dist/infrastructure/theme/theme.service.js.map +1 -1
  128. package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
  129. package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
  130. package/dist/infrastructure/viewport/viewport.service.js +358 -139
  131. package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
  132. package/dist/infrastructure/worker/worker.service.d.ts +84 -38
  133. package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
  134. package/dist/infrastructure/worker/worker.service.js +234 -133
  135. package/dist/infrastructure/worker/worker.service.js.map +1 -1
  136. package/dist/prisma/index.d.ts +2 -0
  137. package/dist/prisma/index.d.ts.map +1 -0
  138. package/dist/prisma/index.js +2 -0
  139. package/dist/prisma/index.js.map +1 -0
  140. package/dist/prisma/schema.json +11 -33
  141. package/dist/prisma/use-prisma.d.ts +68 -0
  142. package/dist/prisma/use-prisma.d.ts.map +1 -0
  143. package/dist/prisma/use-prisma.js +82 -0
  144. package/dist/prisma/use-prisma.js.map +1 -0
  145. package/dist/types/index.d.ts +20 -12
  146. package/dist/types/index.d.ts.map +1 -1
  147. package/package.json +124 -125
  148. package/CHANGELOG.md +0 -101
@@ -1,167 +1,308 @@
1
1
  import { useGetStorage, useSetStorage } from "../../infrastructure/storage/storage.service.js";
2
- import { useLog } from "./logger.service.js";
2
+ import { useLogger } from "./logger.service.js";
3
+ // Module-level batching state.
4
+ let isBatching = false;
5
+ const batchQueue = new Set();
3
6
  /**
4
- * Minimal reactive kernel (Observer / Publisher-Subscriber) implemented as a
5
- * Facade + Singleton. Signals are closures with explicit dependency tracking.
7
+ * Internal: schedules a notification function. If batching is active the
8
+ * notification is queued; otherwise it executes immediately.
9
+ *
10
+ * @param notifyFn - The callback to schedule.
6
11
  */
7
- export default class ReactiveService {
8
- static instance;
9
- isBatching = false;
10
- batchQueue = new Set();
11
- constructor() { }
12
- static getInstance() {
13
- if (!ReactiveService.instance) {
14
- ReactiveService.instance = new ReactiveService();
15
- }
16
- return ReactiveService.instance;
12
+ function NOTIFY(notifyFn) {
13
+ if (isBatching) {
14
+ batchQueue.add(notifyFn);
17
15
  }
18
- NOTIFY = (notifyFn) => {
19
- if (this.isBatching) {
20
- this.batchQueue.add(notifyFn);
21
- }
22
- else {
23
- notifyFn();
16
+ else {
17
+ notifyFn();
18
+ }
19
+ }
20
+ /**
21
+ * Creates a reactive signal with a getter and setter.
22
+ *
23
+ * The getter is callable and also exposes a `useSubscribe` method for
24
+ * listening to value changes. The setter accepts either a direct value or
25
+ * an updater function.
26
+ *
27
+ * @typeParam T - The signal value type.
28
+ * @param initialValue - The initial value of the signal.
29
+ * @returns A tuple of `[getter, setter]`.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const [count, setCount] = useCreateSignal(0);
34
+ * count(); // 0
35
+ * setCount(1);
36
+ * count(); // 1
37
+ * setCount(prev => prev + 1);
38
+ * count(); // 2
39
+ *
40
+ * const unsub = count.useSubscribe((newVal, oldVal) => {
41
+ * console.log(`${oldVal} -> ${newVal}`);
42
+ * });
43
+ * ```
44
+ */
45
+ export function useCreateSignal(initialValue) {
46
+ let value = initialValue;
47
+ const listeners = new Set();
48
+ const get = (() => value);
49
+ const set = (nextValue) => {
50
+ const oldValue = value;
51
+ value = typeof nextValue === "function" ? nextValue(oldValue) : nextValue;
52
+ if (value !== oldValue) {
53
+ NOTIFY(() => {
54
+ for (const listener of listeners) {
55
+ try {
56
+ listener(value, oldValue);
57
+ }
58
+ catch (error) {
59
+ useLogger("error", "[createSignal] Listener error:", error);
60
+ }
61
+ }
62
+ });
24
63
  }
25
64
  };
26
- useCreateSignal = (initialValue) => {
27
- let value = initialValue;
28
- const listeners = new Set();
29
- const get = (() => value);
30
- const set = (nextValue) => {
31
- const oldValue = value;
32
- value = typeof nextValue === "function" ? nextValue(oldValue) : nextValue;
33
- if (value !== oldValue) {
34
- this.NOTIFY(() => {
35
- for (const listener of listeners) {
36
- try {
37
- listener(value, oldValue);
38
- }
39
- catch (error) {
40
- useLog("error", "[createSignal] Listener error:", error);
41
- }
42
- }
43
- });
44
- }
45
- };
46
- get.useSubscribe = (listener) => {
47
- listeners.add(listener);
48
- return () => {
49
- listeners.delete(listener);
50
- };
65
+ get.useSubscribe = (listener) => {
66
+ listeners.add(listener);
67
+ return () => {
68
+ listeners.delete(listener);
51
69
  };
52
- return [get, set];
53
70
  };
54
- useCreateEffect = (callback, signals) => {
55
- let cleanup;
56
- const execute = () => {
57
- if (typeof cleanup === "function") {
58
- try {
59
- cleanup();
60
- }
61
- catch (error) {
62
- useLog("error", "[createEffect] Previous cleanup error:", error);
63
- }
64
- }
71
+ return [get, set];
72
+ }
73
+ const [counter, updateCounter] = useCreateSignal(0);
74
+ useLogger("log", "Counter values is: ", counter);
75
+ useLogger("log", "Counter updated is: ", updateCounter(1));
76
+ /**
77
+ * Creates a side effect that re-runs whenever any of the provided signals
78
+ * emit a new value. An optional cleanup function returned from the callback
79
+ * is invoked before each re-run and on disposal.
80
+ *
81
+ * @param callback - Effect body. May return a cleanup function.
82
+ * @param signals - Array of subscribable signals to react to.
83
+ * @returns A dispose function that tears down all subscriptions and runs
84
+ * the final cleanup.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const [name, setName] = useCreateSignal("world");
89
+ * const dispose = useCreateEffect(() => {
90
+ * console.log(`Hello, ${name()}!`);
91
+ * return () => console.log("cleaning up");
92
+ * }, [name]);
93
+ *
94
+ * setName("Katana"); // logs "Hello, Katana!"
95
+ * dispose(); // logs "cleaning up"
96
+ * ```
97
+ */
98
+ export function useCreateEffect(callback, signals) {
99
+ let cleanup;
100
+ const execute = () => {
101
+ if (typeof cleanup === "function") {
65
102
  try {
66
- cleanup = callback();
103
+ cleanup();
67
104
  }
68
105
  catch (error) {
69
- useLog("error", "[createEffect] Effect execution error:", error);
70
- }
71
- };
72
- const unsubscribes = signals.map((signal) => {
73
- if (signal && typeof signal.useSubscribe === "function") {
74
- return signal.useSubscribe(execute);
75
- }
76
- return () => { };
77
- });
78
- execute();
79
- return () => {
80
- if (typeof cleanup === "function") {
81
- try {
82
- cleanup();
83
- }
84
- catch (error) {
85
- useLog("error", "[createEffect] Final cleanup error:", error);
86
- }
87
- }
88
- for (const unsub of unsubscribes) {
89
- unsub();
106
+ useLogger("error", "[createEffect] Previous cleanup error:", error);
90
107
  }
91
- };
92
- };
93
- useCreateMemo = (computation, signals) => {
94
- const [get, set] = this.useCreateSignal(computation());
95
- this.useCreateEffect(() => {
96
- set(computation());
97
- }, signals);
98
- return get;
99
- };
100
- useCreateToggle = (initialValue = false) => {
101
- const [get, set] = this.useCreateSignal(initialValue);
102
- const toggle = () => set((prev) => !prev);
103
- return [get, { useSet: set, useToggle: toggle }];
104
- };
105
- useCreateStorageSignal = (key, fallbackValue, target = "localStorage") => {
106
- let initial = fallbackValue;
108
+ }
107
109
  try {
108
- const stored = useGetStorage(key, target);
109
- if (stored !== null && stored !== undefined) {
110
- initial = stored;
111
- }
110
+ cleanup = callback();
112
111
  }
113
112
  catch (error) {
114
- useLog("error", `[createStorageSignal] Error reading from ${target}:`, error);
113
+ useLogger("error", "[createEffect] Effect execution error:", error);
115
114
  }
116
- const [get, set] = this.useCreateSignal(initial);
117
- const setWithStorage = (nextValue) => {
118
- set((prev) => {
119
- const newValue = typeof nextValue === "function" ? nextValue(prev) : nextValue;
120
- try {
121
- useSetStorage(key, newValue, target);
122
- }
123
- catch (error) {
124
- useLog("error", `[createStorageSignal] Error writing to ${target}:`, error);
125
- }
126
- return newValue;
127
- });
128
- };
129
- return [get, setWithStorage];
130
115
  };
131
- useCreateDebouncedSignal = (initialValue, delayMs = 300) => {
132
- const [get, set] = this.useCreateSignal(initialValue);
133
- let timeoutId;
134
- const debouncedSet = (nextValue) => {
135
- if (timeoutId !== undefined) {
136
- clearTimeout(timeoutId);
116
+ const unsubscribes = signals.map((signal) => {
117
+ if (signal && typeof signal.useSubscribe === "function") {
118
+ return signal.useSubscribe(execute);
119
+ }
120
+ return () => { };
121
+ });
122
+ execute();
123
+ return () => {
124
+ if (typeof cleanup === "function") {
125
+ try {
126
+ cleanup();
137
127
  }
138
- timeoutId = setTimeout(() => {
139
- set(nextValue);
140
- timeoutId = undefined;
141
- }, delayMs);
142
- };
143
- return [get, debouncedSet];
128
+ catch (error) {
129
+ useLogger("error", "[createEffect] Final cleanup error:", error);
130
+ }
131
+ }
132
+ for (const unsub of unsubscribes) {
133
+ unsub();
134
+ }
144
135
  };
145
- useCreateBatch = () => {
146
- return (callback) => {
147
- this.isBatching = true;
136
+ }
137
+ /**
138
+ * Creates a memoised signal whose value is derived from a computation.
139
+ * The computation re-runs whenever any of the provided signals change.
140
+ *
141
+ * @typeParam T - The computed value type.
142
+ * @param computation - Pure function that derives the value.
143
+ * @param signals - Signals the computation depends on.
144
+ * @returns A read-only getter for the memoised value.
145
+ *
146
+ * @example
147
+ * ```ts
148
+ * const [a, setA] = useCreateSignal(2);
149
+ * const [b, setB] = useCreateSignal(3);
150
+ * const sum = useCreateMemo(() => a() + b(), [a, b]);
151
+ * sum(); // 5
152
+ * setA(10);
153
+ * sum(); // 13
154
+ * ```
155
+ */
156
+ export function useCreateMemo(computation, signals) {
157
+ const [get, set] = useCreateSignal(computation());
158
+ useCreateEffect(() => {
159
+ set(computation());
160
+ }, signals);
161
+ return get;
162
+ }
163
+ /**
164
+ * Creates a boolean toggle signal.
165
+ *
166
+ * @param initialValue - Starting value (defaults to `false`).
167
+ * @returns A tuple of `[getter, { useSet, useToggle }]`.
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * const [isOpen, { useSet, useToggle }] = useCreateToggle();
172
+ * isOpen(); // false
173
+ * useToggle();
174
+ * isOpen(); // true
175
+ * useSet(false);
176
+ * isOpen(); // false
177
+ * ```
178
+ */
179
+ export function useCreateToggle(initialValue = false) {
180
+ const [get, set] = useCreateSignal(initialValue);
181
+ const toggle = () => set((prev) => !prev);
182
+ return [get, { useSet: set, useToggle: toggle }];
183
+ }
184
+ /**
185
+ * Creates a signal that persists its value to a storage backend
186
+ * (localStorage, sessionStorage, etc.). Reads the initial value from
187
+ * storage on creation.
188
+ *
189
+ * @typeParam T - The signal value type.
190
+ * @param key - Storage key.
191
+ * @param fallbackValue - Value used when the key is not in storage.
192
+ * @param target - Storage backend (defaults to `"localStorage"`).
193
+ * @returns A tuple of `[getter, setter]`. The setter writes through to
194
+ * storage.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * const [theme, setTheme] = useCreateStorageSignal("theme", "dark");
199
+ * theme(); // "dark" (or whatever was stored)
200
+ * setTheme("light"); // persists to localStorage
201
+ * ```
202
+ */
203
+ export function useCreateStorageSignal(key, fallbackValue, target = "localStorage") {
204
+ let initial = fallbackValue;
205
+ try {
206
+ const stored = useGetStorage(key, target);
207
+ if (stored !== null && stored !== undefined) {
208
+ initial = stored;
209
+ }
210
+ }
211
+ catch (error) {
212
+ useLogger("error", `[createStorageSignal] Error reading from ${target}:`, error);
213
+ }
214
+ const [get, set] = useCreateSignal(initial);
215
+ const setWithStorage = (nextValue) => {
216
+ set((prev) => {
217
+ const newValue = typeof nextValue === "function" ? nextValue(prev) : nextValue;
148
218
  try {
149
- callback();
219
+ useSetStorage(key, newValue, target);
150
220
  }
151
221
  catch (error) {
152
- useLog("error", "[createBatch] Batch block error:", error);
222
+ useLogger("error", `[createStorageSignal] Error writing to ${target}:`, error);
153
223
  }
154
- finally {
155
- this.isBatching = false;
156
- const queue = Array.from(this.batchQueue);
157
- this.batchQueue.clear();
224
+ return newValue;
225
+ });
226
+ };
227
+ return [get, setWithStorage];
228
+ }
229
+ /**
230
+ * Creates a signal whose setter debounces writes by `delayMs` milliseconds.
231
+ * Useful for search inputs or any value that triggers expensive work.
232
+ *
233
+ * @typeParam T - The signal value type.
234
+ * @param initialValue - The initial value.
235
+ * @param delayMs - Debounce delay in milliseconds (defaults to `300`).
236
+ * @returns A tuple of `[getter, debouncedSetter]`. The setter exposes a
237
+ * `useCancel()` method to abort a pending write.
238
+ *
239
+ * @example
240
+ * ```ts
241
+ * const [query, setQuery] = useCreateDebouncedSignal("", 250);
242
+ * setQuery("hello"); // won't update until 250ms of quiet
243
+ * setQuery.useCancel(); // abort pending write
244
+ * ```
245
+ */
246
+ export function useCreateDebouncedSignal(initialValue, delayMs = 300) {
247
+ const [get, set] = useCreateSignal(initialValue);
248
+ let timeoutId;
249
+ const debouncedSet = ((nextValue) => {
250
+ if (timeoutId !== undefined) {
251
+ clearTimeout(timeoutId);
252
+ }
253
+ timeoutId = setTimeout(() => {
254
+ set(nextValue);
255
+ timeoutId = undefined;
256
+ }, delayMs);
257
+ });
258
+ debouncedSet.useCancel = () => {
259
+ if (timeoutId !== undefined) {
260
+ clearTimeout(timeoutId);
261
+ timeoutId = undefined;
262
+ }
263
+ };
264
+ return [get, debouncedSet];
265
+ }
266
+ /**
267
+ * Returns a batch function that defers signal notifications until the
268
+ * callback completes. Nested calls are supported -- only the outermost
269
+ * batch flushes the queue.
270
+ *
271
+ * @returns A `batch(callback)` function.
272
+ *
273
+ * @example
274
+ * ```ts
275
+ * const batch = useCreateBatch();
276
+ * const [a, setA] = useCreateSignal(0);
277
+ * const [b, setB] = useCreateSignal(0);
278
+ *
279
+ * batch(() => {
280
+ * setA(1);
281
+ * setB(2);
282
+ * // listeners fire only once here, not twice
283
+ * });
284
+ * ```
285
+ */
286
+ export function useCreateBatch() {
287
+ return (callback) => {
288
+ const wasBatching = isBatching;
289
+ isBatching = true;
290
+ try {
291
+ callback();
292
+ }
293
+ catch (error) {
294
+ useLogger("error", "[createBatch] Batch block error:", error);
295
+ }
296
+ finally {
297
+ if (!wasBatching) {
298
+ isBatching = false;
299
+ const queue = Array.from(batchQueue);
300
+ batchQueue.clear();
158
301
  for (const notify of queue) {
159
302
  notify();
160
303
  }
161
304
  }
162
- };
305
+ }
163
306
  };
164
307
  }
165
- // Singleton instance and destructured exports.
166
- export const { useCreateSignal, useCreateEffect, useCreateMemo, useCreateToggle, useCreateStorageSignal, useCreateDebouncedSignal, useCreateBatch, } = ReactiveService.getInstance();
167
308
  //# sourceMappingURL=reactive.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactive.service.js","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactive.service.js","sourceRoot":"","sources":["../../../src/core/services/reactive.service.ts"],"names":[],"mappings":"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"}
@@ -1,23 +1,145 @@
1
1
  import type { IntervalControl, TimeoutControl } from "../../types/index.js";
2
2
  /**
3
- * Timing utilities: delays, debouncing, throttling and timeouts.
4
- * Implemented as a Singleton facade with factory methods.
5
- */
6
- export default class TimingService {
7
- private static instance;
8
- private constructor();
9
- static getInstance(): TimingService;
10
- useDelay: (ms: number) => Promise<void>;
11
- /** Alias for delay, more semantic for sleep operations. */
12
- useSleep: (ms: number) => Promise<void>;
13
- useSetTimeout: <T>(callback: () => T | Promise<T>, ms: number) => TimeoutControl<T>;
14
- useInterval: (callback: () => void | Promise<void>, ms: number, immediate?: boolean) => IntervalControl;
15
- useDebounce: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => ((...args: Parameters<T>) => void);
16
- useDebounceImmediate: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => ((...args: Parameters<T>) => void);
17
- useThrottle: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => ((...args: Parameters<T>) => void);
18
- useThrottleTrailing: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => ((...args: Parameters<T>) => void);
19
- useRepeat: (callback: (iteration: number) => void | Promise<void>, iterations: number, delayMs?: number) => Promise<void>;
20
- useRace: <T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string) => Promise<T>;
21
- }
22
- export declare const useDelay: (ms: number) => Promise<void>, useSetTimeout: <T>(callback: () => T | Promise<T>, ms: number) => TimeoutControl<T>, useInterval: (callback: () => void | Promise<void>, ms: number, immediate?: boolean) => IntervalControl, useDebounce: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => (...args: Parameters<T>) => void, useDebounceImmediate: <T extends (...args: unknown[]) => unknown>(func: T, delayMs: number) => (...args: Parameters<T>) => void, useThrottle: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => (...args: Parameters<T>) => void, useThrottleTrailing: <T extends (...args: unknown[]) => unknown>(func: T, limitMs: number) => (...args: Parameters<T>) => void, useRepeat: (callback: (iteration: number) => void | Promise<void>, iterations: number, delayMs?: number) => Promise<void>, useRace: <T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string) => Promise<T>;
3
+ * Executes a callback after `ms` milliseconds, returning a cancellable
4
+ * promise that resolves with the callback's result.
5
+ *
6
+ * @typeParam T - The callback's return type.
7
+ * @param callback - Function to execute after the delay.
8
+ * @param ms - Delay in milliseconds.
9
+ * @returns A `TimeoutControl` with `promise` and `cancel()`.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const { promise, cancel } = useSetTimeout(() => 42, 1000);
14
+ * cancel(); // rejects the promise with "Timeout cancelled"
15
+ * ```
16
+ */
17
+ export declare function useSetTimeout<T>(callback: () => T | Promise<T>, ms: number): TimeoutControl<T>;
18
+ /**
19
+ * Repeatedly executes a callback at `ms` intervals with pause/resume/stop
20
+ * controls. Uses recursive `setTimeout` internally to avoid overlap.
21
+ *
22
+ * @param callback - Function executed on each tick.
23
+ * @param ms - Interval in milliseconds.
24
+ * @param immediate - If `true`, fires the callback immediately before the
25
+ * first interval (defaults to `false`).
26
+ * @returns An `IntervalControl` with `pause`, `resume`, `stop`, and
27
+ * `isRunning`.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const timer = useInterval(() => console.log("tick"), 1000);
32
+ * setTimeout(() => timer.pause(), 3000);
33
+ * setTimeout(() => timer.resume(), 5000);
34
+ * setTimeout(() => timer.stop(), 10000);
35
+ * ```
36
+ */
37
+ export declare function useInterval(callback: () => void | Promise<void>, ms: number, immediate?: boolean): IntervalControl;
38
+ /**
39
+ * Returns a debounced version of `func` that delays invocation until
40
+ * `delayMs` milliseconds of quiet.
41
+ *
42
+ * @typeParam T - The wrapped function type.
43
+ * @param func - Function to debounce.
44
+ * @param delayMs - Debounce delay in milliseconds.
45
+ * @returns A debounced function with the same signature.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * const debouncedSearch = useDebounce(fetchResults, 300);
50
+ * input.addEventListener("input", () => debouncedSearch(input.value));
51
+ * ```
52
+ */
53
+ export declare function useDebounce<T extends (...args: unknown[]) => unknown>(func: T, delayMs: number): (...args: Parameters<T>) => void;
54
+ /**
55
+ * Leading-edge debounce: fires immediately on the first call, then ignores
56
+ * calls until `delayMs` of quiet. Additional calls during the wait window
57
+ * schedule a single trailing invocation with the latest arguments.
58
+ *
59
+ * @typeParam T - The wrapped function type.
60
+ * @param func - Function to debounce.
61
+ * @param delayMs - Debounce delay in milliseconds.
62
+ * @returns A debounced function with the same signature.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * const save = useDebounceImmediate(submitForm, 500);
67
+ * save("a"); // fires immediately
68
+ * save("b"); // queued
69
+ * save("c"); // queued (replaces "b")
70
+ * // after 500ms of quiet: fires with "c"
71
+ * ```
72
+ */
73
+ export declare function useDebounceImmediate<T extends (...args: unknown[]) => unknown>(func: T, delayMs: number): (...args: Parameters<T>) => void;
74
+ /**
75
+ * Returns a throttled version of `func` that fires at most once per
76
+ * `limitMs` milliseconds (leading edge).
77
+ *
78
+ * @typeParam T - The wrapped function type.
79
+ * @param func - Function to throttle.
80
+ * @param limitMs - Minimum interval between invocations in milliseconds.
81
+ * @returns A throttled function with the same signature.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * const throttledScroll = useThrottle(onScroll, 100);
86
+ * window.addEventListener("scroll", throttledScroll);
87
+ * ```
88
+ */
89
+ export declare function useThrottle<T extends (...args: unknown[]) => unknown>(func: T, limitMs: number): (...args: Parameters<T>) => void;
90
+ /**
91
+ * Throttle with trailing invocation: fires on the leading edge and also
92
+ * fires once at the end of the throttle window with the latest arguments.
93
+ *
94
+ * @typeParam T - The wrapped function type.
95
+ * @param func - Function to throttle.
96
+ * @param limitMs - Minimum interval between invocations in milliseconds.
97
+ * @returns A throttled function with the same signature.
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * const throttledResize = useThrottleTrailing(onResize, 200);
102
+ * window.addEventListener("resize", throttledResize);
103
+ * ```
104
+ */
105
+ export declare function useThrottleTrailing<T extends (...args: unknown[]) => unknown>(func: T, limitMs: number): (...args: Parameters<T>) => void;
106
+ /**
107
+ * Executes a callback `iterations` times with an optional delay between
108
+ * each iteration.
109
+ *
110
+ * @param callback - Function called on each iteration with the current
111
+ * index (0-based).
112
+ * @param iterations - Number of times to repeat.
113
+ * @param delayMs - Delay between iterations in milliseconds (defaults to
114
+ * `0`).
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * await useRepeat((i) => console.log(`Attempt ${i + 1}`), 3, 1000);
119
+ * // Attempt 1 ... (1s) ... Attempt 2 ... (1s) ... Attempt 3
120
+ * ```
121
+ */
122
+ export declare function useRepeat(callback: (iteration: number) => void | Promise<void>, iterations: number, delayMs?: number): Promise<void>;
123
+ /**
124
+ * Races a promise against a timeout. Clears the timer when the promise
125
+ * wins so the timeout rejection cannot become an unhandled rejection.
126
+ *
127
+ * @typeParam T - The promise's resolved type.
128
+ * @param promise - The promise to race.
129
+ * @param timeoutMs - Timeout in milliseconds.
130
+ * @param errorMessage - Error message on timeout (defaults to
131
+ * `"Operation timed out"`).
132
+ * @returns The resolved value of the promise.
133
+ * @throws {Error} If the timeout fires first.
134
+ *
135
+ * @example
136
+ * ```ts
137
+ * try {
138
+ * const data = await useRace(fetch("/api"), 5000);
139
+ * } catch (e) {
140
+ * console.error(e); // "Operation timed out"
141
+ * }
142
+ * ```
143
+ */
144
+ export declare function useRace<T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string): Promise<T>;
23
145
  //# sourceMappingURL=timing.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timing.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/timing.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timing.service.d.ts","sourceRoot":"","sources":["../../../src/core/services/timing.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK5E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CA6B9F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAC1B,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACpC,EAAE,EAAE,MAAM,EACV,SAAS,UAAQ,GACf,eAAe,CA4DjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACpE,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,GACb,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAiBlC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAC7E,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,GACb,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAmClC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EACpE,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,GACb,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAgBlC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAC5E,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,MAAM,GACb,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CA4BlC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,SAAS,CAC9B,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACrD,UAAU,EAAE,MAAM,EAClB,OAAO,SAAI,GACT,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,OAAO,CAAC,CAAC,EAC9B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,SAAwB,GAClC,OAAO,CAAC,CAAC,CAAC,CAoBZ"}