@lytjs/store 6.5.0 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,96 @@
1
+ import { Signal } from '@lytjs/reactivity';
2
+
3
+ /**
4
+ * @lytjs/store - Core type definitions
5
+ */
6
+
7
+ type StateTree = Record<string | number | symbol, unknown>;
8
+ type _Method = (...args: unknown[]) => unknown;
9
+ type StoreGetters<G> = {
10
+ readonly [K in keyof G]: G[K] extends (...args: unknown[]) => infer R ? R : never;
11
+ };
12
+ type StoreActions<A> = {
13
+ [K in keyof A]: A[K] extends _Method ? A[K] : never;
14
+ };
15
+ interface DefineStoreOptions<_Id extends string, S extends StateTree, G, A> {
16
+ state?: () => S;
17
+ getters?: G & ThisType<S & StoreGetters<G> & StoreActions<A>>;
18
+ actions?: A & ThisType<S & StoreGetters<G> & StoreActions<A>>;
19
+ }
20
+ interface Store<_Id extends string = string, S extends StateTree = {}, _G = {}, _A = {}> {
21
+ readonly $id: string;
22
+ $state: S;
23
+ $patch(partialState: Partial<S>): void;
24
+ $patch(stateMutator: (state: S) => void): void;
25
+ $reset(): void;
26
+ $subscribe(callback: SubscriptionCallback<S>): () => void;
27
+ $onAction(callback: ActionCallback): () => void;
28
+ $dispose(): void;
29
+ }
30
+ type StoreDefinition<_Id extends string = string, S extends StateTree = {}, _G = {}, _A = {}> = (pinia?: Pinia) => Store<_Id, S, _G, _A>;
31
+ type StoreToRefs<SS> = {
32
+ [K in keyof SS]: SS[K] extends Signal<infer T> ? Signal<T> : SS[K];
33
+ };
34
+ interface Pinia {
35
+ install(app: unknown): void;
36
+ state: {
37
+ value: Record<string, StateTree>;
38
+ };
39
+ use(plugin: PiniaPlugin): void;
40
+ }
41
+ interface PiniaPlugin {
42
+ install?(pinia: Pinia): void;
43
+ }
44
+ type SubscriptionCallback<S> = (mutation: {
45
+ storeId: string;
46
+ type: 'direct' | 'patch object' | 'patch function';
47
+ payload: unknown;
48
+ }, state: S) => void;
49
+ type ActionCallbackContext = {
50
+ store: Record<string, unknown>;
51
+ name: string;
52
+ args: unknown[];
53
+ };
54
+ type ActionCallback = (context: ActionCallbackContext) => void;
55
+
56
+ /**
57
+ * @lytjs/store - defineStore implementation
58
+ *
59
+ * Supports both Options API and Setup Store patterns.
60
+ */
61
+
62
+ declare function defineStore<Id extends string, S extends StateTree, G, A>(id: Id, options: DefineStoreOptions<Id, S, G, A>): StoreDefinition<Id, S, G, A>;
63
+ declare function defineStore<Id extends string, SS>(id: Id, setup: () => SS): () => SS & Store<Id, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>;
64
+ declare function clearStoreCache(): void;
65
+
66
+ /**
67
+ * @lytjs/store - createPinia implementation
68
+ *
69
+ * Global state management and plugin system.
70
+ */
71
+
72
+ /**
73
+ * Get the active pinia instance
74
+ */
75
+ declare function getActivePinia(): Pinia | undefined;
76
+ /**
77
+ * Set the active pinia instance (for SSR/testing)
78
+ */
79
+ declare function setActivePinia(pinia: Pinia | null): void;
80
+ /**
81
+ * Create a Pinia instance
82
+ */
83
+ declare function createPinia(): Pinia;
84
+
85
+ /**
86
+ * @lytjs/store - storeToRefs implementation
87
+ *
88
+ * Extract reactive refs from a store instance.
89
+ */
90
+
91
+ /**
92
+ * Extract reactive refs from a store instance
93
+ */
94
+ declare function storeToRefs<SS extends Record<string, unknown>>(store: SS): StoreToRefs<SS>;
95
+
96
+ export { type ActionCallback, type DefineStoreOptions, type Pinia, type PiniaPlugin, type StateTree, type Store, type StoreActions, type StoreDefinition, type StoreGetters, type StoreToRefs, type SubscriptionCallback, type _Method, clearStoreCache, createPinia, defineStore, getActivePinia, setActivePinia, storeToRefs };
package/dist/index.mjs ADDED
@@ -0,0 +1,428 @@
1
+ import { signal, computedSignal, batch, toRef } from '@lytjs/reactivity';
2
+
3
+ // src/defineStore.ts
4
+ var activePinia = null;
5
+ function getActivePinia() {
6
+ return activePinia || void 0;
7
+ }
8
+ function setActivePinia(pinia) {
9
+ activePinia = pinia;
10
+ }
11
+ function createPinia() {
12
+ const stateSignal = signal({});
13
+ let isInstalled = false;
14
+ const state = {
15
+ get value() {
16
+ return stateSignal();
17
+ },
18
+ set value(newValue) {
19
+ stateSignal.set(newValue);
20
+ }
21
+ };
22
+ const pinia = {
23
+ state,
24
+ install(_app) {
25
+ if (isInstalled) {
26
+ if (__DEV__) {
27
+ console.warn(`[@lytjs/store] Pinia has already been installed.`);
28
+ }
29
+ return;
30
+ }
31
+ isInstalled = true;
32
+ activePinia = pinia;
33
+ if (_app.provide) {
34
+ _app.provide(
35
+ "__lytjs_pinia__",
36
+ pinia
37
+ );
38
+ }
39
+ if (_app.config?.globalProperties) {
40
+ _app.config.globalProperties.$pinia = pinia;
41
+ }
42
+ },
43
+ use(plugin) {
44
+ if (isInstalled) {
45
+ if (__DEV__) {
46
+ console.warn(`[@lytjs/store] Plugins should be added before calling app.use(pinia).`);
47
+ }
48
+ }
49
+ plugin.install?.(pinia);
50
+ return pinia;
51
+ }
52
+ };
53
+ return pinia;
54
+ }
55
+ var __DEV__ = typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
56
+
57
+ // src/defineStore.ts
58
+ var storeCache = /* @__PURE__ */ new Map();
59
+ var subscriptions = /* @__PURE__ */ new Map();
60
+ var actionCallbacks = /* @__PURE__ */ new Map();
61
+ function defineStore(id, optionsOrSetup) {
62
+ if (typeof optionsOrSetup === "function") {
63
+ const setup = optionsOrSetup;
64
+ const cacheKey = `${id}:setup`;
65
+ return function useStore(pinia) {
66
+ if (storeCache.has(cacheKey)) {
67
+ return storeCache.get(cacheKey);
68
+ }
69
+ if (!subscriptions.has(cacheKey)) {
70
+ subscriptions.set(cacheKey, /* @__PURE__ */ new Set());
71
+ }
72
+ if (!actionCallbacks.has(cacheKey)) {
73
+ actionCallbacks.set(cacheKey, /* @__PURE__ */ new Set());
74
+ }
75
+ const subs = subscriptions.get(cacheKey);
76
+ const actionCbs = actionCallbacks.get(cacheKey);
77
+ const storeObj = setup();
78
+ const wrappedStore = { ...storeObj };
79
+ const thisContext = new Proxy(wrappedStore, {
80
+ get(target, prop) {
81
+ if (typeof prop === "string") {
82
+ const value = target[prop];
83
+ if (typeof value === "function") {
84
+ return value.bind(target);
85
+ }
86
+ return value;
87
+ }
88
+ return void 0;
89
+ },
90
+ has(_target, prop) {
91
+ return typeof prop === "string" && prop in wrappedStore;
92
+ }
93
+ });
94
+ for (const [key, value] of Object.entries(storeObj)) {
95
+ if (typeof value === "function" && !key.startsWith("$")) {
96
+ wrappedStore[key] = function(...args) {
97
+ const context = {
98
+ store: wrappedStore,
99
+ name: key,
100
+ args,
101
+ after: void 0,
102
+ onError: void 0
103
+ };
104
+ for (const cb of actionCbs) {
105
+ cb(context);
106
+ }
107
+ try {
108
+ const result = value.apply(thisContext, args);
109
+ const handleResult = (r) => {
110
+ for (const sub of subs) {
111
+ sub(
112
+ { storeId: id, type: "direct", payload: { name: key } },
113
+ wrappedStore.$state
114
+ );
115
+ }
116
+ if (context.after) {
117
+ context.after(r);
118
+ }
119
+ return r;
120
+ };
121
+ if (result instanceof Promise) {
122
+ return result.then(handleResult, (err) => {
123
+ if (context.onError) {
124
+ context.onError(err);
125
+ }
126
+ throw err;
127
+ });
128
+ } else {
129
+ return handleResult(result);
130
+ }
131
+ } catch (err) {
132
+ if (context.onError) {
133
+ context.onError(err);
134
+ }
135
+ throw err;
136
+ }
137
+ };
138
+ }
139
+ }
140
+ const store = wrappedStore;
141
+ store.$id = id;
142
+ store.$state = {};
143
+ for (const [key, value] of Object.entries(storeObj)) {
144
+ if (typeof value !== "function" && !key.startsWith("$")) {
145
+ store.$state[key] = value;
146
+ }
147
+ }
148
+ store.$patch = (partialOrMutator) => {
149
+ if (typeof partialOrMutator === "function") {
150
+ partialOrMutator(store.$state);
151
+ for (const sub of subs) {
152
+ sub(
153
+ { storeId: id, type: "patch function", payload: partialOrMutator },
154
+ store.$state
155
+ );
156
+ }
157
+ } else {
158
+ for (const [key, value] of Object.entries(partialOrMutator)) {
159
+ if (key in store) {
160
+ store[key] = value;
161
+ }
162
+ }
163
+ for (const sub of subs) {
164
+ sub(
165
+ { storeId: id, type: "patch object", payload: partialOrMutator },
166
+ store.$state
167
+ );
168
+ }
169
+ }
170
+ };
171
+ store.$reset = () => {
172
+ console.warn(
173
+ `[@lytjs/store] $reset() is not fully supported for setup stores. Store "${id}" needs to be disposed and recreated.`
174
+ );
175
+ };
176
+ store.$subscribe = (callback) => {
177
+ subs.add(callback);
178
+ return () => {
179
+ subs.delete(callback);
180
+ };
181
+ };
182
+ store.$onAction = (callback) => {
183
+ actionCbs.add(callback);
184
+ return () => {
185
+ actionCbs.delete(callback);
186
+ };
187
+ };
188
+ store.$dispose = () => {
189
+ storeCache.delete(cacheKey);
190
+ subscriptions.delete(cacheKey);
191
+ actionCallbacks.delete(cacheKey);
192
+ };
193
+ if (pinia) {
194
+ const currentState = pinia.state.value;
195
+ pinia.state.value = { ...currentState, [id]: store.$state };
196
+ }
197
+ storeCache.set(cacheKey, store);
198
+ return store;
199
+ };
200
+ } else {
201
+ const options = optionsOrSetup;
202
+ return function useStore(pinia = getActivePinia()) {
203
+ if (storeCache.has(id)) {
204
+ return storeCache.get(id);
205
+ }
206
+ if (!subscriptions.has(id)) {
207
+ subscriptions.set(id, /* @__PURE__ */ new Set());
208
+ }
209
+ if (!actionCallbacks.has(id)) {
210
+ actionCallbacks.set(id, /* @__PURE__ */ new Set());
211
+ }
212
+ const subs = subscriptions.get(id);
213
+ const actions = actionCallbacks.get(id);
214
+ const initialState = options.state ? options.state() : {};
215
+ const stateSignals = /* @__PURE__ */ new Map();
216
+ const state = {};
217
+ for (const key of Object.keys(initialState)) {
218
+ const sig = signal(initialState[key]);
219
+ stateSignals.set(key, sig);
220
+ Object.defineProperty(state, key, {
221
+ get: () => sig(),
222
+ set: (val) => {
223
+ const oldValue = sig();
224
+ sig.set(val);
225
+ if (!Object.is(oldValue, val)) {
226
+ for (const sub of subs) {
227
+ sub(
228
+ { storeId: id, type: "direct", payload: { key, oldValue, newValue: val } },
229
+ state
230
+ );
231
+ }
232
+ }
233
+ },
234
+ enumerable: true,
235
+ configurable: true
236
+ });
237
+ }
238
+ const thisContext = new Proxy(
239
+ {},
240
+ {
241
+ get(_target, prop) {
242
+ if (typeof prop === "string") {
243
+ if (prop in state) return state[prop];
244
+ if (prop in getters) return getters[prop];
245
+ if (prop in actionFns) return actionFns[prop];
246
+ }
247
+ return void 0;
248
+ },
249
+ set(_target, prop, value) {
250
+ if (typeof prop === "string" && prop in state) {
251
+ state[prop] = value;
252
+ return true;
253
+ }
254
+ return false;
255
+ },
256
+ has(_target, prop) {
257
+ return typeof prop === "string" && (prop in state || prop in getters || prop in actionFns);
258
+ }
259
+ }
260
+ );
261
+ const getters = {};
262
+ if (options.getters) {
263
+ for (const [key, fn] of Object.entries(options.getters)) {
264
+ const getterFn = fn;
265
+ const computedSig = computedSignal(() => getterFn.call(thisContext));
266
+ Object.defineProperty(getters, key, {
267
+ get: () => computedSig(),
268
+ enumerable: true,
269
+ configurable: true
270
+ });
271
+ }
272
+ }
273
+ const actionFns = {};
274
+ if (options.actions) {
275
+ for (const [key, fn] of Object.entries(options.actions)) {
276
+ const actionFn = fn;
277
+ actionFns[key] = function(...args) {
278
+ const context = {
279
+ store,
280
+ name: key,
281
+ args,
282
+ after: void 0,
283
+ onError: void 0
284
+ };
285
+ for (const cb of actions) {
286
+ cb(context);
287
+ }
288
+ try {
289
+ const result = actionFn.apply(thisContext, args);
290
+ const handleResult = (r) => {
291
+ if (context.after) {
292
+ context.after(r);
293
+ }
294
+ return r;
295
+ };
296
+ if (result instanceof Promise) {
297
+ return result.then(handleResult, (err) => {
298
+ if (context.onError) {
299
+ context.onError(err);
300
+ }
301
+ throw err;
302
+ });
303
+ } else {
304
+ return handleResult(result);
305
+ }
306
+ } catch (err) {
307
+ if (context.onError) {
308
+ context.onError(err);
309
+ }
310
+ throw err;
311
+ }
312
+ };
313
+ }
314
+ }
315
+ const store = {};
316
+ Object.defineProperty(store, "$id", {
317
+ value: id,
318
+ enumerable: true,
319
+ configurable: true
320
+ });
321
+ Object.defineProperty(store, "$state", {
322
+ get: () => state,
323
+ enumerable: true,
324
+ configurable: true
325
+ });
326
+ Object.defineProperty(store, "$patch", {
327
+ value: function(partialOrMutator) {
328
+ batch(() => {
329
+ if (typeof partialOrMutator === "function") {
330
+ partialOrMutator(state);
331
+ for (const sub of subs) {
332
+ sub(
333
+ { storeId: id, type: "patch function", payload: partialOrMutator },
334
+ state
335
+ );
336
+ }
337
+ } else {
338
+ for (const [key, value] of Object.entries(partialOrMutator)) {
339
+ if (key in state) {
340
+ state[key] = value;
341
+ }
342
+ }
343
+ for (const sub of subs) {
344
+ sub({ storeId: id, type: "patch object", payload: partialOrMutator }, state);
345
+ }
346
+ }
347
+ });
348
+ },
349
+ enumerable: true,
350
+ configurable: true
351
+ });
352
+ Object.defineProperty(store, "$reset", {
353
+ value: function() {
354
+ if (options.state) {
355
+ const newState = options.state();
356
+ for (const key of Object.keys(newState)) {
357
+ if (key in state) {
358
+ state[key] = newState[key];
359
+ }
360
+ }
361
+ }
362
+ },
363
+ enumerable: true,
364
+ configurable: true
365
+ });
366
+ Object.defineProperty(store, "$subscribe", {
367
+ value: function(callback) {
368
+ subs.add(callback);
369
+ return () => {
370
+ subs.delete(callback);
371
+ };
372
+ },
373
+ enumerable: true,
374
+ configurable: true
375
+ });
376
+ Object.defineProperty(store, "$onAction", {
377
+ value: function(callback) {
378
+ actions.add(callback);
379
+ return () => {
380
+ actions.delete(callback);
381
+ };
382
+ },
383
+ enumerable: true,
384
+ configurable: true
385
+ });
386
+ Object.defineProperty(store, "$dispose", {
387
+ value: function() {
388
+ storeCache.delete(id);
389
+ subscriptions.delete(id);
390
+ actionCallbacks.delete(id);
391
+ },
392
+ enumerable: true,
393
+ configurable: true
394
+ });
395
+ Object.defineProperties(store, Object.getOwnPropertyDescriptors(state));
396
+ Object.defineProperties(store, Object.getOwnPropertyDescriptors(getters));
397
+ Object.assign(store, actionFns);
398
+ if (pinia) {
399
+ const currentState = pinia.state.value;
400
+ pinia.state.value = { ...currentState, [id]: state };
401
+ }
402
+ storeCache.set(id, store);
403
+ return store;
404
+ };
405
+ }
406
+ }
407
+ function clearStoreCache() {
408
+ storeCache.clear();
409
+ subscriptions.clear();
410
+ actionCallbacks.clear();
411
+ }
412
+ function storeToRefs(store) {
413
+ const refs = {};
414
+ for (const key in store) {
415
+ if (key.startsWith("$")) continue;
416
+ const value = store[key];
417
+ if (value && typeof value === "object" && "value" in value) {
418
+ refs[key] = value;
419
+ } else {
420
+ refs[key] = toRef(store, key);
421
+ }
422
+ }
423
+ return refs;
424
+ }
425
+
426
+ export { clearStoreCache, createPinia, defineStore, getActivePinia, setActivePinia, storeToRefs };
427
+ //# sourceMappingURL=index.mjs.map
428
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pinia.ts","../src/defineStore.ts","../src/storeToRefs.ts"],"names":["signal","computed"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @lytjs/store - createPinia implementation\n *\n * Global state management and plugin system.\n */\n\nimport type { Pinia, PiniaPlugin, StateTree } from './types';\nimport { signal } from '@lytjs/reactivity';\n\nlet activePinia: Pinia | null = null;\n\n/**\n * Get the active pinia instance\n */\nexport function getActivePinia(): Pinia | undefined {\n return activePinia || undefined;\n}\n\n/**\n * Set the active pinia instance (for SSR/testing)\n */\nexport function setActivePinia(pinia: Pinia | null): void {\n activePinia = pinia;\n}\n\n/**\n * Create a Pinia instance\n */\nexport function createPinia(): Pinia {\n const stateSignal = signal<Record<string, StateTree>>({});\n const plugins: PiniaPlugin[] = [];\n let isInstalled = false;\n\n // Wrap signal with .value getter/setter for compatibility\n const state = {\n get value() {\n return stateSignal();\n },\n set value(newValue: Record<string, StateTree>) {\n stateSignal.set(newValue);\n },\n };\n\n const pinia: Pinia = {\n state,\n\n install(_app: unknown) {\n if (isInstalled) {\n if (__DEV__) {\n console.warn(`[@lytjs/store] Pinia has already been installed.`);\n }\n return;\n }\n isInstalled = true;\n activePinia = pinia;\n\n // Provide the pinia instance\n if ((_app as { provide?: unknown }).provide) {\n (_app as { provide: (key: string, value: unknown) => void }).provide(\n '__lytjs_pinia__',\n pinia,\n );\n }\n\n // Add global properties\n if (\n (_app as { config?: { globalProperties?: Record<string, unknown> } }).config\n ?.globalProperties\n ) {\n (\n _app as { config: { globalProperties: Record<string, unknown> } }\n ).config.globalProperties.$pinia = pinia;\n }\n\n // TODO: DevTools integration\n if (__DEV__) {\n // Setup DevTools hooks\n }\n },\n\n use(plugin: PiniaPlugin) {\n if (isInstalled) {\n if (__DEV__) {\n console.warn(`[@lytjs/store] Plugins should be added before calling app.use(pinia).`);\n }\n }\n plugins.push(plugin);\n plugin.install?.(pinia);\n return pinia;\n },\n };\n\n return pinia;\n}\n\n// DEV flag for development warnings\nconst __DEV__ = typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n","/**\n * @lytjs/store - defineStore implementation\n *\n * Supports both Options API and Setup Store patterns.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n StoreDefinition,\n DefineStoreOptions,\n Store,\n StateTree,\n _Method,\n SubscriptionCallback,\n ActionCallback,\n Pinia,\n} from './types';\nimport { signal, computedSignal as computed, batch } from '@lytjs/reactivity';\nimport { getActivePinia } from './pinia';\n\nconst storeCache = new Map<string, Store>();\nconst subscriptions = new Map<string, Set<SubscriptionCallback<Record<string, unknown>>>>();\nconst actionCallbacks = new Map<string, Set<ActionCallback>>();\n\nexport function defineStore<Id extends string, S extends StateTree, G, A>(\n id: Id,\n options: DefineStoreOptions<Id, S, G, A>,\n): StoreDefinition<Id, S, G, A>;\n\nexport function defineStore<Id extends string, SS>(\n id: Id,\n setup: () => SS,\n): () => SS & Store<Id, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>;\n\nexport function defineStore<Id extends string, S extends StateTree, G, A, SS>(\n id: Id,\n optionsOrSetup: DefineStoreOptions<Id, S, G, A> | (() => SS),\n):\n | StoreDefinition<Id, S, G, A>\n | (() => SS &\n Store<Id, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>) {\n if (typeof optionsOrSetup === 'function') {\n const setup = optionsOrSetup;\n const cacheKey = `${id}:setup`;\n\n return function useStore(\n pinia?: Pinia,\n ): SS & Store<Id, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>> {\n if (storeCache.has(cacheKey)) {\n return storeCache.get(cacheKey) as unknown as SS &\n Store<Id, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>;\n }\n\n if (!subscriptions.has(cacheKey)) {\n subscriptions.set(cacheKey, new Set());\n }\n if (!actionCallbacks.has(cacheKey)) {\n actionCallbacks.set(cacheKey, new Set());\n }\n\n const subs = subscriptions.get(cacheKey)!;\n const actionCbs = actionCallbacks.get(cacheKey)!;\n\n const storeObj = setup();\n\n const wrappedStore: Record<string, unknown> = { ...(storeObj as Record<string, unknown>) };\n\n const thisContext = new Proxy(wrappedStore, {\n get(target, prop: string | symbol) {\n if (typeof prop === 'string') {\n const value = target[prop];\n if (typeof value === 'function') {\n return value.bind(target);\n }\n return value;\n }\n return undefined;\n },\n has(_target, prop) {\n return typeof prop === 'string' && prop in wrappedStore;\n },\n });\n\n for (const [key, value] of Object.entries(storeObj as Record<string, unknown>)) {\n if (typeof value === 'function' && !key.startsWith('$')) {\n wrappedStore[key] = function (...args: unknown[]) {\n const context = {\n store: wrappedStore,\n name: key,\n args,\n after: undefined as ((result: unknown) => void) | undefined,\n onError: undefined as ((error: unknown) => void) | undefined,\n };\n\n for (const cb of actionCbs) {\n (cb as any)(context);\n }\n\n try {\n const result = (value as any).apply(thisContext, args);\n\n const handleResult = (r: unknown) => {\n for (const sub of subs) {\n sub(\n { storeId: id, type: 'direct', payload: { name: key } },\n wrappedStore.$state as Record<string, unknown>,\n );\n }\n if (context.after) {\n context.after(r);\n }\n return r;\n };\n\n if (result instanceof Promise) {\n return result.then(handleResult, (err: unknown) => {\n if (context.onError) {\n context.onError(err);\n }\n throw err;\n });\n } else {\n return handleResult(result);\n }\n } catch (err) {\n if (context.onError) {\n context.onError(err);\n }\n throw err;\n }\n };\n }\n }\n\n const store = wrappedStore as unknown as SS &\n Store<Id, Record<string, unknown>, Record<string, unknown>, Record<string, unknown>>;\n\n (store as any).$id = id;\n\n (store as any).$state = {};\n for (const [key, value] of Object.entries(storeObj as Record<string, unknown>)) {\n if (typeof value !== 'function' && !key.startsWith('$')) {\n (store as any).$state[key] = value;\n }\n }\n\n (store as any).$patch = (\n partialOrMutator:\n | Partial<Record<string, unknown>>\n | ((state: Record<string, unknown>) => void),\n ) => {\n if (typeof partialOrMutator === 'function') {\n partialOrMutator((store as any).$state);\n for (const sub of subs) {\n sub(\n { storeId: id, type: 'patch function', payload: partialOrMutator },\n (store as any).$state,\n );\n }\n } else {\n for (const [key, value] of Object.entries(partialOrMutator)) {\n if (key in store) {\n (store as Record<string, unknown>)[key] = value;\n }\n }\n for (const sub of subs) {\n sub(\n { storeId: id, type: 'patch object', payload: partialOrMutator },\n (store as any).$state,\n );\n }\n }\n };\n\n (store as any).$reset = () => {\n console.warn(\n `[@lytjs/store] $reset() is not fully supported for setup stores. Store \"${id}\" needs to be disposed and recreated.`,\n );\n };\n\n (store as any).$subscribe = (callback: SubscriptionCallback<Record<string, unknown>>) => {\n subs.add(callback);\n return () => {\n subs.delete(callback);\n };\n };\n\n (store as any).$onAction = (callback: ActionCallback) => {\n actionCbs.add(callback);\n return () => {\n actionCbs.delete(callback);\n };\n };\n\n (store as any).$dispose = () => {\n storeCache.delete(cacheKey);\n subscriptions.delete(cacheKey);\n actionCallbacks.delete(cacheKey);\n };\n\n if (pinia) {\n const currentState = pinia.state.value;\n pinia.state.value = { ...currentState, [id]: store.$state };\n }\n\n storeCache.set(cacheKey, store as unknown as Store);\n return store;\n };\n } else {\n const options = optionsOrSetup;\n return function useStore(pinia = getActivePinia()): Store<Id, S, G, A> {\n if (storeCache.has(id)) {\n return storeCache.get(id) as Store<Id, S, G, A>;\n }\n\n if (!subscriptions.has(id)) {\n subscriptions.set(id, new Set());\n }\n if (!actionCallbacks.has(id)) {\n actionCallbacks.set(id, new Set());\n }\n\n const subs = subscriptions.get(id)!;\n const actions = actionCallbacks.get(id)!;\n\n const initialState = options.state ? options.state() : ({} as S);\n const stateSignals = new Map<string, ReturnType<typeof signal>>();\n const state: Record<string, unknown> = {};\n\n for (const key of Object.keys(initialState)) {\n const sig = signal(initialState[key as keyof S]);\n stateSignals.set(key, sig);\n Object.defineProperty(state, key, {\n get: () => sig(),\n set: (val: unknown) => {\n const oldValue = sig();\n sig.set(val as Parameters<typeof sig.set>[0]);\n if (!Object.is(oldValue, val)) {\n for (const sub of subs) {\n sub(\n { storeId: id, type: 'direct', payload: { key, oldValue, newValue: val } },\n state as unknown as S,\n );\n }\n }\n },\n enumerable: true,\n configurable: true,\n });\n }\n\n const thisContext = new Proxy(\n {},\n {\n get(_target, prop: string | symbol) {\n if (typeof prop === 'string') {\n if (prop in state) return (state as Record<string, unknown>)[prop];\n if (prop in getters) return (getters as Record<string, unknown>)[prop];\n if (prop in actionFns) return (actionFns as Record<string, unknown>)[prop];\n }\n return undefined;\n },\n set(_target, prop: string | symbol, value: unknown) {\n if (typeof prop === 'string' && prop in state) {\n (state as Record<string, unknown>)[prop] = value;\n return true;\n }\n return false;\n },\n has(_target, prop) {\n return (\n typeof prop === 'string' && (prop in state || prop in getters || prop in actionFns)\n );\n },\n },\n );\n\n const getters: Record<string, unknown> = {};\n if (options.getters) {\n for (const [key, fn] of Object.entries(options.getters)) {\n const getterFn = fn as (...args: unknown[]) => unknown;\n const computedSig = computed(() => getterFn.call(thisContext));\n Object.defineProperty(getters, key, {\n get: () => computedSig(),\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n const actionFns: Record<string, unknown> = {};\n if (options.actions) {\n for (const [key, fn] of Object.entries(options.actions)) {\n const actionFn = fn as _Method;\n actionFns[key] = function (...args: unknown[]) {\n const context = {\n store: store as any,\n name: key,\n args,\n after: undefined as ((result: unknown) => void) | undefined,\n onError: undefined as ((error: unknown) => void) | undefined,\n };\n\n for (const cb of actions) {\n (cb as any)(context);\n }\n\n try {\n const result = (actionFn as any).apply(thisContext, args);\n\n const handleResult = (r: unknown) => {\n if (context.after) {\n context.after(r);\n }\n return r;\n };\n\n if (result instanceof Promise) {\n return result.then(handleResult, (err: unknown) => {\n if (context.onError) {\n context.onError(err);\n }\n throw err;\n });\n } else {\n return handleResult(result);\n }\n } catch (err) {\n if (context.onError) {\n context.onError(err);\n }\n throw err;\n }\n };\n }\n }\n\n const store = {} as Store<Id, S, G, A>;\n\n Object.defineProperty(store, '$id', {\n value: id,\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(store, '$state', {\n get: () => state as any,\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(store, '$patch', {\n value: function (partialOrMutator: Partial<S> | ((state: S) => void) | any) {\n batch(() => {\n if (typeof partialOrMutator === 'function') {\n partialOrMutator(state as any);\n for (const sub of subs) {\n sub(\n { storeId: id, type: 'patch function', payload: partialOrMutator },\n state as any,\n );\n }\n } else {\n for (const [key, value] of Object.entries(partialOrMutator)) {\n if (key in state) {\n (state as Record<string, unknown>)[key] = value;\n }\n }\n for (const sub of subs) {\n sub({ storeId: id, type: 'patch object', payload: partialOrMutator }, state as any);\n }\n }\n });\n },\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(store, '$reset', {\n value: function () {\n if (options.state) {\n const newState = options.state();\n for (const key of Object.keys(newState)) {\n if (key in state) {\n (state as Record<string, unknown>)[key] = (newState as Record<string, unknown>)[\n key\n ];\n }\n }\n }\n },\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(store, '$subscribe', {\n value: function (callback: SubscriptionCallback<S>) {\n subs.add(callback as any);\n return () => {\n subs.delete(callback as any);\n };\n },\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(store, '$onAction', {\n value: function (callback: ActionCallback) {\n actions.add(callback);\n return () => {\n actions.delete(callback);\n };\n },\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperty(store, '$dispose', {\n value: function () {\n storeCache.delete(id);\n subscriptions.delete(id);\n actionCallbacks.delete(id);\n },\n enumerable: true,\n configurable: true,\n });\n\n Object.defineProperties(store, Object.getOwnPropertyDescriptors(state));\n Object.defineProperties(store, Object.getOwnPropertyDescriptors(getters));\n Object.assign(store, actionFns);\n\n if (pinia) {\n const currentState = pinia.state.value;\n pinia.state.value = { ...currentState, [id]: state as S };\n }\n\n storeCache.set(id, store);\n return store;\n };\n }\n}\n\nexport function clearStoreCache(): void {\n storeCache.clear();\n subscriptions.clear();\n actionCallbacks.clear();\n}\n","/**\n * @lytjs/store - storeToRefs implementation\n *\n * Extract reactive refs from a store instance.\n */\n\nimport type { StoreToRefs } from './types';\nimport { toRef } from '@lytjs/reactivity';\n\n/**\n * Extract reactive refs from a store instance\n */\nexport function storeToRefs<SS extends Record<string, unknown>>(store: SS): StoreToRefs<SS> {\n const refs: Record<string, unknown> = {};\n\n for (const key in store) {\n if (key.startsWith('$')) continue;\n\n const value = store[key];\n\n if (value && typeof value === 'object' && 'value' in value) {\n refs[key] = value;\n } else {\n refs[key] = toRef(store, key);\n }\n }\n\n return refs as StoreToRefs<SS>;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lytjs/store",
3
- "version": "6.5.0",
3
+ "version": "6.7.0",
4
4
  "description": "LytJS Signal-based state management with Option Store and Setup Store patterns",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -19,7 +19,7 @@
19
19
  ],
20
20
  "sideEffects": false,
21
21
  "scripts": {
22
- "build": "echo 'Skipping store build for now'",
22
+ "build": "tsup",
23
23
  "dev": "tsup --watch",
24
24
  "test": "vitest run",
25
25
  "test:watch": "vitest",
@@ -29,10 +29,10 @@
29
29
  "clean": "rm -rf dist"
30
30
  },
31
31
  "dependencies": {
32
- "@lytjs/common-is": "^6.0.0",
33
- "@lytjs/common-object": "^6.0.0",
34
- "@lytjs/reactivity": "^6.1.0",
35
- "@lytjs/component": "^6.1.0"
32
+ "@lytjs/common-is": "^6.7.0",
33
+ "@lytjs/common-object": "^6.7.0",
34
+ "@lytjs/reactivity": "^6.7.0",
35
+ "@lytjs/component": "^6.7.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "tsup": "^8.0.0",