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.
- package/README.md +72 -437
- package/dist/adapters/astro/astro.service.d.ts +103 -15
- package/dist/adapters/astro/astro.service.d.ts.map +1 -1
- package/dist/adapters/astro/astro.service.js +145 -75
- package/dist/adapters/astro/astro.service.js.map +1 -1
- package/dist/adapters/astro/index.d.ts +1 -1
- package/dist/adapters/astro/index.d.ts.map +1 -1
- package/dist/adapters/astro/index.js +1 -1
- package/dist/adapters/astro/index.js.map +1 -1
- package/dist/adapters/astro/rss.service.d.ts +85 -105
- package/dist/adapters/astro/rss.service.d.ts.map +1 -1
- package/dist/adapters/astro/rss.service.js +172 -168
- package/dist/adapters/astro/rss.service.js.map +1 -1
- package/dist/adapters/astro/seo.service.d.ts +10 -0
- package/dist/adapters/astro/seo.service.d.ts.map +1 -0
- package/dist/adapters/astro/seo.service.js +3 -0
- package/dist/adapters/astro/seo.service.js.map +1 -0
- package/dist/adapters/express/app.d.ts +30 -1
- package/dist/adapters/express/app.d.ts.map +1 -1
- package/dist/adapters/express/app.js +31 -3
- package/dist/adapters/express/app.js.map +1 -1
- package/dist/adapters/express/index.d.ts +2 -2
- package/dist/adapters/express/index.d.ts.map +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/express/index.js.map +1 -1
- package/dist/adapters/express/main.js +2 -2
- package/dist/adapters/express/main.js.map +1 -1
- package/dist/adapters/express/products.controller.d.ts +67 -8
- package/dist/adapters/express/products.controller.d.ts.map +1 -1
- package/dist/adapters/express/products.controller.js +105 -49
- package/dist/adapters/express/products.controller.js.map +1 -1
- package/dist/adapters/express/server.d.ts +37 -13
- package/dist/adapters/express/server.d.ts.map +1 -1
- package/dist/adapters/express/server.js +118 -53
- package/dist/adapters/express/server.js.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
- package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.js +34 -10
- package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
- package/dist/adapters/vue/vue.service.d.ts +5 -2
- package/dist/adapters/vue/vue.service.d.ts.map +1 -1
- package/dist/adapters/vue/vue.service.js +41 -7
- package/dist/adapters/vue/vue.service.js.map +1 -1
- package/dist/config/index.d.ts +2 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/seo-meta.types.d.ts +177 -0
- package/dist/config/seo-meta.types.d.ts.map +1 -0
- package/dist/config/seo-meta.types.js +11 -0
- package/dist/config/seo-meta.types.js.map +1 -0
- package/dist/config/seo.service.d.ts +41 -58
- package/dist/config/seo.service.d.ts.map +1 -1
- package/dist/config/seo.service.js +468 -136
- package/dist/config/seo.service.js.map +1 -1
- package/dist/config/site.config.d.ts +10 -50
- package/dist/config/site.config.d.ts.map +1 -1
- package/dist/config/site.config.js +8 -36
- package/dist/config/site.config.js.map +1 -1
- package/dist/core/index.d.ts +1 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/services/dates.service.d.ts +149 -22
- package/dist/core/services/dates.service.d.ts.map +1 -1
- package/dist/core/services/dates.service.js +201 -54
- package/dist/core/services/dates.service.js.map +1 -1
- package/dist/core/services/error.service.d.ts +32 -20
- package/dist/core/services/error.service.d.ts.map +1 -1
- package/dist/core/services/error.service.js +44 -32
- package/dist/core/services/error.service.js.map +1 -1
- package/dist/core/services/formatter.service.d.ts +245 -35
- package/dist/core/services/formatter.service.d.ts.map +1 -1
- package/dist/core/services/formatter.service.js +281 -57
- package/dist/core/services/formatter.service.js.map +1 -1
- package/dist/core/services/generator.service.d.ts +115 -26
- package/dist/core/services/generator.service.d.ts.map +1 -1
- package/dist/core/services/generator.service.js +191 -56
- package/dist/core/services/generator.service.js.map +1 -1
- package/dist/core/services/geometry.service.d.ts +369 -39
- package/dist/core/services/geometry.service.d.ts.map +1 -1
- package/dist/core/services/geometry.service.js +424 -66
- package/dist/core/services/geometry.service.js.map +1 -1
- package/dist/core/services/http.service.d.ts +244 -21
- package/dist/core/services/http.service.d.ts.map +1 -1
- package/dist/core/services/http.service.js +419 -98
- package/dist/core/services/http.service.js.map +1 -1
- package/dist/core/services/logger.service.d.ts +95 -29
- package/dist/core/services/logger.service.d.ts.map +1 -1
- package/dist/core/services/logger.service.js +167 -41
- package/dist/core/services/logger.service.js.map +1 -1
- package/dist/core/services/reactive.service.d.ts +146 -19
- package/dist/core/services/reactive.service.d.ts.map +1 -1
- package/dist/core/services/reactive.service.js +278 -137
- package/dist/core/services/reactive.service.js.map +1 -1
- package/dist/core/services/timing.service.d.ts +142 -20
- package/dist/core/services/timing.service.d.ts.map +1 -1
- package/dist/core/services/timing.service.js +324 -185
- package/dist/core/services/timing.service.js.map +1 -1
- package/dist/core/services/utils.service.d.ts +228 -43
- package/dist/core/services/utils.service.d.ts.map +1 -1
- package/dist/core/services/utils.service.js +305 -125
- package/dist/core/services/utils.service.js.map +1 -1
- package/dist/infrastructure/dom/dom.service.d.ts +307 -44
- package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
- package/dist/infrastructure/dom/dom.service.js +408 -129
- package/dist/infrastructure/dom/dom.service.js.map +1 -1
- package/dist/infrastructure/index.d.ts +0 -3
- package/dist/infrastructure/index.d.ts.map +1 -1
- package/dist/infrastructure/index.js +0 -3
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/infrastructure/observer/observer.service.d.ts +124 -31
- package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
- package/dist/infrastructure/observer/observer.service.js +227 -131
- package/dist/infrastructure/observer/observer.service.js.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
- package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.js +264 -112
- package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
- package/dist/infrastructure/storage/storage.service.d.ts +123 -45
- package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
- package/dist/infrastructure/storage/storage.service.js +236 -66
- package/dist/infrastructure/storage/storage.service.js.map +1 -1
- package/dist/infrastructure/theme/theme.service.d.ts +93 -29
- package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
- package/dist/infrastructure/theme/theme.service.js +198 -96
- package/dist/infrastructure/theme/theme.service.js.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
- package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.js +358 -139
- package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
- package/dist/infrastructure/worker/worker.service.d.ts +84 -38
- package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
- package/dist/infrastructure/worker/worker.service.js +234 -133
- package/dist/infrastructure/worker/worker.service.js.map +1 -1
- package/dist/prisma/index.d.ts +2 -0
- package/dist/prisma/index.d.ts.map +1 -0
- package/dist/prisma/index.js +2 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma/schema.json +11 -33
- package/dist/prisma/use-prisma.d.ts +68 -0
- package/dist/prisma/use-prisma.d.ts.map +1 -0
- package/dist/prisma/use-prisma.js +82 -0
- package/dist/prisma/use-prisma.js.map +1 -0
- package/dist/types/index.d.ts +20 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +124 -125
- package/CHANGELOG.md +0 -101
|
@@ -1,167 +1,308 @@
|
|
|
1
1
|
import { useGetStorage, useSetStorage } from "../../infrastructure/storage/storage.service.js";
|
|
2
|
-
import {
|
|
2
|
+
import { useLogger } from "./logger.service.js";
|
|
3
|
+
// Module-level batching state.
|
|
4
|
+
let isBatching = false;
|
|
5
|
+
const batchQueue = new Set();
|
|
3
6
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
103
|
+
cleanup();
|
|
67
104
|
}
|
|
68
105
|
catch (error) {
|
|
69
|
-
|
|
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
|
-
|
|
109
|
-
if (stored !== null && stored !== undefined) {
|
|
110
|
-
initial = stored;
|
|
111
|
-
}
|
|
110
|
+
cleanup = callback();
|
|
112
111
|
}
|
|
113
112
|
catch (error) {
|
|
114
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
219
|
+
useSetStorage(key, newValue, target);
|
|
150
220
|
}
|
|
151
221
|
catch (error) {
|
|
152
|
-
|
|
222
|
+
useLogger("error", `[createStorageSignal] Error writing to ${target}:`, error);
|
|
153
223
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;
|
|
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
|
-
*
|
|
4
|
-
*
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK5E
|
|
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"}
|