@simplestack/store 0.7.4 → 0.7.5
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/dist/index.d.ts +27 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +67 -21
- package/dist/index.js.map +1 -1
- package/dist/middleware.test.d.ts +2 -0
- package/dist/middleware.test.d.ts.map +1 -0
- package/dist/middleware.test.js +118 -0
- package/dist/middleware.test.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,10 @@ type SelectPath<T> = T extends StateObject ? {
|
|
|
12
12
|
[K in keyof Required<T>]: [K] | (SelectPath<NonNullableState<SelectValue<T, K>>> extends infer P ? P extends readonly any[] ? [K, ...P] : [K] : [K]);
|
|
13
13
|
}[keyof Required<T>] : never;
|
|
14
14
|
type SelectPathValue<T, P extends readonly PropertyKey[]> = T extends null | undefined ? undefined : P extends [infer K, ...infer Rest] ? K extends keyof T ? SelectPathValue<SelectValue<T, K>, Rest extends readonly PropertyKey[] ? Rest : []> : undefined : T;
|
|
15
|
-
export type SelectFn<T extends StateObject | StatePrimitive> = NonNullableState<T> extends StateObject ?
|
|
15
|
+
export type SelectFn<T extends StateObject | StatePrimitive> = NonNullableState<T> extends StateObject ? {
|
|
16
|
+
<P extends SelectPath<NonNullableState<T>>>(...path: P): Store<SelectPathValue<T, P>>;
|
|
17
|
+
<P extends SelectPath<NonNullableState<T>>>(...pathAndOptions: [...P, StoreOptions<SelectPathValue<T, P>>]): Store<SelectPathValue<T, P>>;
|
|
18
|
+
} : undefined;
|
|
16
19
|
export type Store<T extends StateObject | StatePrimitive> = {
|
|
17
20
|
/**
|
|
18
21
|
* Get the current state of the store.
|
|
@@ -71,7 +74,26 @@ export type Store<T extends StateObject | StatePrimitive> = {
|
|
|
71
74
|
* console.log(documentStore.get()); // { title: "New Title" }
|
|
72
75
|
*/
|
|
73
76
|
select: SelectFn<T>;
|
|
77
|
+
/**
|
|
78
|
+
* Optional cleanup for middleware init hooks.
|
|
79
|
+
*/
|
|
80
|
+
destroy: () => void;
|
|
81
|
+
};
|
|
82
|
+
export type StoreMiddleware<T extends StateObject | StatePrimitive> = (store: Store<T>) => {
|
|
83
|
+
set?: (next: Store<T>["set"]) => Store<T>["set"];
|
|
84
|
+
init?: (() => void) | (() => () => void);
|
|
85
|
+
};
|
|
86
|
+
export type StoreOptions<T extends StateObject | StatePrimitive> = {
|
|
87
|
+
middleware?: StoreMiddleware<T>[];
|
|
74
88
|
};
|
|
89
|
+
/**
|
|
90
|
+
* Logs store updates to the console.
|
|
91
|
+
* Use this in the `middleware` array when creating a store.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* const countStore = store(0, { middleware: [loggerMiddleware] });
|
|
95
|
+
*/
|
|
96
|
+
export declare const loggerMiddleware: <T extends StateObject | StatePrimitive>(store: Store<T>) => ReturnType<StoreMiddleware<T>>;
|
|
75
97
|
/**
|
|
76
98
|
* Creates a store with properties for getting, setting, subscribing to, and selecting from the state.
|
|
77
99
|
*
|
|
@@ -97,10 +119,10 @@ export type Store<T extends StateObject | StatePrimitive> = {
|
|
|
97
119
|
* authors: [],
|
|
98
120
|
* });
|
|
99
121
|
*/
|
|
100
|
-
export declare function store(initial: number): Store<number>;
|
|
101
|
-
export declare function store(initial: string): Store<string>;
|
|
102
|
-
export declare function store(initial: boolean): Store<boolean>;
|
|
103
|
-
export declare function store<T extends StateObject | StatePrimitive>(initial: T): Store<T>;
|
|
122
|
+
export declare function store(initial: number, options?: StoreOptions<number>): Store<number>;
|
|
123
|
+
export declare function store(initial: string, options?: StoreOptions<string>): Store<string>;
|
|
124
|
+
export declare function store(initial: boolean, options?: StoreOptions<boolean>): Store<boolean>;
|
|
125
|
+
export declare function store<T extends StateObject | StatePrimitive>(initial: T, options?: StoreOptions<T>): Store<T>;
|
|
104
126
|
export declare function effect(callback: (() => void) | (() => () => void)): () => void;
|
|
105
127
|
export {};
|
|
106
128
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1E;;;;GAIG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IACtD,CAAC,GACD,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAIrB,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC3E,CAAC,GAAG,SAAS,GAEd,MAAM,SAAS,MAAM,CAAC,GACpB,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAChB,MAAM,SAAS,MAAM,CAAC,GACrB,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAChB,CAAC,CAAC,CAAC,CAAC,CAAC;AAGV,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AAElE,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,WAAW,GACvC;KACC,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,GACpB,CAAC,CAAC,CAAC,GACH,CAAC,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAC9D,CAAC,SAAS,SAAS,GAAG,EAAE,GACvB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GACT,CAAC,CAAC,CAAC,GACJ,CAAC,CAAC,CAAC,CAAC;CACT,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC,GACnB,KAAK,CAAC;AAET,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,SAAS,SAAS,WAAW,EAAE,IAAI,CAAC,SAC1D,IAAI,GACJ,SAAS,GACT,SAAS,GACT,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,GACjC,CAAC,SAAS,MAAM,CAAC,GAChB,eAAe,CACf,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACjB,IAAI,SAAS,SAAS,WAAW,EAAE,GAAG,IAAI,GAAG,EAAE,CAC/C,GACA,SAAS,GACV,CAAC,CAAC;AAEN,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAC1D,gBAAgB,CAAC,CAAC,CAAC,SAAS,WAAW,GACpC,CAAC,CAAC,SAAS,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
import { DEV } from "esm-env";
|
|
2
2
|
import { Signal } from "signal-polyfill";
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Logs store updates to the console.
|
|
5
|
+
* Use this in the `middleware` array when creating a store.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const countStore = store(0, { middleware: [loggerMiddleware] });
|
|
9
|
+
*/
|
|
10
|
+
export const loggerMiddleware = (store) => ({
|
|
11
|
+
set: (next) => (setter) => {
|
|
12
|
+
const prev = store.get();
|
|
13
|
+
next(setter);
|
|
14
|
+
const nextValue = store.get();
|
|
15
|
+
console.log("[@simplestack/store]", prev, nextValue);
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
export function store(initial, options) {
|
|
4
19
|
const state = new Signal.State(initial);
|
|
5
20
|
const getInitial = () => initial;
|
|
6
21
|
const get = () => state.get();
|
|
7
22
|
const set = (setter) => state.set(typeof setter === "function" ? setter(state.get()) : setter);
|
|
8
|
-
return createStoreApi(getInitial, get, set
|
|
23
|
+
return createStoreApi(getInitial, get, set, {
|
|
24
|
+
middleware: options?.middleware,
|
|
25
|
+
});
|
|
9
26
|
}
|
|
10
|
-
const createStoreApi = (getInitial, get,
|
|
27
|
+
const createStoreApi = (getInitial, get, baseSet, options) => {
|
|
28
|
+
let set = baseSet;
|
|
11
29
|
const subscribe = (callback) => {
|
|
12
30
|
// Track the previous value to avoid unnecessary updates when effects are triggered.
|
|
13
31
|
// Each subscriber tracks its own previous value to avoid duplicate callbacks
|
|
@@ -38,17 +56,23 @@ const createStoreApi = (getInitial, get, set, options) => {
|
|
|
38
56
|
}
|
|
39
57
|
return current;
|
|
40
58
|
};
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
59
|
+
const storeApi = {
|
|
60
|
+
get,
|
|
61
|
+
getInitial,
|
|
62
|
+
set: (setter) => set(setter),
|
|
63
|
+
subscribe,
|
|
64
|
+
select: undefined,
|
|
65
|
+
destroy: () => { },
|
|
66
|
+
};
|
|
67
|
+
function select(...pathAndOptions) {
|
|
68
|
+
// Since select accepts variadic arguments, we need to check
|
|
69
|
+
// if the last argument matches the StoreOptions signature.
|
|
70
|
+
const maybeOptions = pathAndOptions[pathAndOptions.length - 1];
|
|
71
|
+
const hasOptions = isSelectOptions(maybeOptions);
|
|
72
|
+
const path = (hasOptions ? pathAndOptions.slice(0, -1) : pathAndOptions);
|
|
73
|
+
const selectOptions = hasOptions
|
|
74
|
+
? maybeOptions
|
|
75
|
+
: undefined;
|
|
52
76
|
const getInitialSelected = () => getAtPath(getInitial(), path);
|
|
53
77
|
const getSelected = () => getAtPath(get(), path);
|
|
54
78
|
const setSelected = (setter) => {
|
|
@@ -99,15 +123,37 @@ const createStoreApi = (getInitial, get, set, options) => {
|
|
|
99
123
|
};
|
|
100
124
|
return createStoreApi(getInitialSelected, getSelected, setSelected, {
|
|
101
125
|
selectable: true,
|
|
126
|
+
middleware: selectOptions?.middleware,
|
|
102
127
|
});
|
|
103
128
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
129
|
+
const canSelect = options?.selectable ?? !isStatePrimitive(get());
|
|
130
|
+
if (canSelect) {
|
|
131
|
+
storeApi.select = select;
|
|
132
|
+
}
|
|
133
|
+
if (options?.middleware?.length) {
|
|
134
|
+
const entries = options.middleware.map((middleware) => middleware(storeApi));
|
|
135
|
+
const setWrappers = entries
|
|
136
|
+
.map((entry) => entry.set)
|
|
137
|
+
.filter((entry) => typeof entry === "function");
|
|
138
|
+
if (setWrappers.length) {
|
|
139
|
+
set = setWrappers.reduceRight((next, wrapper) => wrapper(next), set);
|
|
140
|
+
}
|
|
141
|
+
const cleanups = entries
|
|
142
|
+
.map((entry) => entry.init?.())
|
|
143
|
+
.filter((cleanup) => typeof cleanup === "function");
|
|
144
|
+
if (cleanups.length) {
|
|
145
|
+
storeApi.destroy = () => {
|
|
146
|
+
for (const cleanup of cleanups)
|
|
147
|
+
cleanup();
|
|
148
|
+
cleanups.length = 0;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return storeApi;
|
|
153
|
+
};
|
|
154
|
+
const isSelectOptions = (value) => {
|
|
155
|
+
const type = typeof value;
|
|
156
|
+
return type !== "string" && type !== "number" && type !== "symbol";
|
|
111
157
|
};
|
|
112
158
|
function isStatePrimitive(state) {
|
|
113
159
|
return (typeof state === "string" ||
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../src/middleware.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { store } from "./index.js";
|
|
2
|
+
describe("store middleware", () => {
|
|
3
|
+
it("runs init once and can hydrate", () => {
|
|
4
|
+
const initSpy = vi.fn();
|
|
5
|
+
const hydrate = (api) => ({
|
|
6
|
+
init: () => {
|
|
7
|
+
initSpy();
|
|
8
|
+
api.set(5);
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
const countStore = store(0, { middleware: [hydrate] });
|
|
12
|
+
expect(initSpy).toHaveBeenCalledTimes(1);
|
|
13
|
+
expect(countStore.get()).toBe(5);
|
|
14
|
+
});
|
|
15
|
+
it("wraps set to observe prev/next", () => {
|
|
16
|
+
const transitions = [];
|
|
17
|
+
const logger = (api) => ({
|
|
18
|
+
set: (next) => (setter) => {
|
|
19
|
+
const prev = api.get();
|
|
20
|
+
next(setter);
|
|
21
|
+
transitions.push([prev, api.get()]);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const countStore = store(0, { middleware: [logger] });
|
|
25
|
+
countStore.set(1);
|
|
26
|
+
countStore.set((n) => n + 2);
|
|
27
|
+
expect(transitions).toEqual([
|
|
28
|
+
[0, 1],
|
|
29
|
+
[1, 3],
|
|
30
|
+
]);
|
|
31
|
+
});
|
|
32
|
+
it("connects to external service and handles inbound updates", () => {
|
|
33
|
+
const initSpy = vi.fn();
|
|
34
|
+
const sendSpy = vi.fn();
|
|
35
|
+
const connectSpy = vi.fn();
|
|
36
|
+
const unsubscribeSpy = vi.fn();
|
|
37
|
+
let subscriber;
|
|
38
|
+
connectSpy.mockImplementation(() => ({
|
|
39
|
+
init: initSpy,
|
|
40
|
+
send: sendSpy,
|
|
41
|
+
subscribe: (handler) => {
|
|
42
|
+
subscriber = handler;
|
|
43
|
+
return unsubscribeSpy;
|
|
44
|
+
},
|
|
45
|
+
}));
|
|
46
|
+
const devtools = (api) => {
|
|
47
|
+
const connection = connectSpy();
|
|
48
|
+
return {
|
|
49
|
+
init: () => {
|
|
50
|
+
connection.init(api.get());
|
|
51
|
+
return connection.subscribe((message) => {
|
|
52
|
+
if (message.state != null) {
|
|
53
|
+
api.set(Number(message.state));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
set: (next) => (setter) => {
|
|
58
|
+
next(setter);
|
|
59
|
+
connection.send({ type: "set" }, api.get());
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const countStore = store(0, { middleware: [devtools] });
|
|
64
|
+
expect(connectSpy).toHaveBeenCalledTimes(1);
|
|
65
|
+
expect(initSpy).toHaveBeenCalledWith(0);
|
|
66
|
+
countStore.set(2);
|
|
67
|
+
expect(sendSpy).toHaveBeenCalledWith({ type: "set" }, 2);
|
|
68
|
+
subscriber?.({ state: "7" });
|
|
69
|
+
expect(countStore.get()).toBe(7);
|
|
70
|
+
});
|
|
71
|
+
it("can override the setter", () => {
|
|
72
|
+
const incrementer = () => ({
|
|
73
|
+
set: (next) => (setter) => {
|
|
74
|
+
if (typeof setter === "function") {
|
|
75
|
+
next((state) => setter(state) + 1);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
next(() => setter + 1);
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const countStore = store(0, { middleware: [incrementer] });
|
|
82
|
+
countStore.set(1);
|
|
83
|
+
expect(countStore.get()).toBe(2);
|
|
84
|
+
countStore.set((value) => value + 1);
|
|
85
|
+
expect(countStore.get()).toBe(4);
|
|
86
|
+
});
|
|
87
|
+
it("exposes destroy when init returns cleanup", () => {
|
|
88
|
+
const cleanupSpy = vi.fn();
|
|
89
|
+
const middleware = () => ({
|
|
90
|
+
init: () => cleanupSpy,
|
|
91
|
+
});
|
|
92
|
+
const countStore = store(0, { middleware: [middleware] });
|
|
93
|
+
countStore.destroy();
|
|
94
|
+
expect(cleanupSpy).toHaveBeenCalledTimes(1);
|
|
95
|
+
});
|
|
96
|
+
it("runs root middleware for root updates and both for slice updates", () => {
|
|
97
|
+
const calls = [];
|
|
98
|
+
const base = () => ({
|
|
99
|
+
set: (next) => (setter) => {
|
|
100
|
+
calls.push("base");
|
|
101
|
+
next(setter);
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
const slice = () => ({
|
|
105
|
+
set: (next) => (setter) => {
|
|
106
|
+
calls.push("slice");
|
|
107
|
+
next(setter);
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
const rootStore = store({ count: 0 }, { middleware: [base] });
|
|
111
|
+
const countStore = rootStore.select("count", { middleware: [slice] });
|
|
112
|
+
rootStore.set({ count: 1 });
|
|
113
|
+
expect(calls).toEqual(["base"]);
|
|
114
|
+
countStore.set(2);
|
|
115
|
+
expect(calls).toEqual(["base", "slice", "base"]);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=middleware.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../src/middleware.test.ts"],"names":[],"mappings":"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"}
|