@simplestack/store 0.5.2 → 0.6.1
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 +36 -20
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
# Simple Store
|
|
2
2
|
|
|
3
|
-
A simple, `select`-xcellent state management library
|
|
3
|
+
A simple, `select`-xcellent state management library for React.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The goal: make a storage solution as powerful as Zustand or Redux, without complicated functions to set and select state.
|
|
6
|
+
|
|
7
|
+
Here's an overview of how stores are created, and how you can operate on parts of a store using `.select()`:
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
6
10
|
import { store } from "@simplestack/store";
|
|
11
|
+
import { useStoreValue } from "@simplestack/store/react";
|
|
7
12
|
|
|
8
13
|
// Define your store with an initial state
|
|
9
14
|
const documentStore = store({
|
|
@@ -15,25 +20,34 @@ const documentStore = store({
|
|
|
15
20
|
},
|
|
16
21
|
});
|
|
17
22
|
|
|
18
|
-
//
|
|
19
|
-
documentStore.set((doc) => ({ ...doc, title: "Welcome to simple store!" }));
|
|
20
|
-
console.log(documentStore.get());
|
|
21
|
-
// { title: "Welcome to simple store!", authors: ["Ada", "Ben"], meta: { pages: 3, tags: ["draft", "internal"] } }
|
|
22
|
-
|
|
23
|
-
// Select parts of a store to listen and update individually
|
|
23
|
+
// Select parts of a store to listen to individually
|
|
24
24
|
const titleStore = documentStore.select("title");
|
|
25
25
|
const tagsStore = documentStore.select("meta").select("tags");
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
function Document() {
|
|
28
|
+
// Update your UI with the store's current state
|
|
29
|
+
const { title, tags } = useStoreValue(documentStore);
|
|
30
|
+
return (
|
|
31
|
+
<div>
|
|
32
|
+
{title} {tags.join(", ")}
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function Title() {
|
|
38
|
+
// And scope updates with selected stores for fine-grained control
|
|
39
|
+
const title = useStoreValue(titleStore);
|
|
40
|
+
return (
|
|
41
|
+
<input value={title} onChange={(e) => titleStore.set(e.target.value)} />
|
|
42
|
+
);
|
|
43
|
+
}
|
|
30
44
|
```
|
|
31
45
|
|
|
32
46
|
## API
|
|
33
47
|
|
|
34
48
|
### store(initial)
|
|
35
49
|
|
|
36
|
-
Creates a store with `get`, `set`, `
|
|
50
|
+
Creates a store with `get`, `set`, `subscribe`, and (for objects and arrays) `select`.
|
|
37
51
|
|
|
38
52
|
- Parameters: `initial: number | string | boolean | null | undefined | object`
|
|
39
53
|
- Returns: `Store<T>` where `T` is inferred from `initial` or supplied via generics
|
|
@@ -45,7 +59,7 @@ const counter = store(0);
|
|
|
45
59
|
counter.set((n) => n + 1);
|
|
46
60
|
console.log(counter.get()); // 1
|
|
47
61
|
|
|
48
|
-
// Select
|
|
62
|
+
// Select parts of a store for objects and arrays
|
|
49
63
|
const doc = store({ title: "x" });
|
|
50
64
|
const title = doc.select("title");
|
|
51
65
|
```
|
|
@@ -59,15 +73,17 @@ React hook to subscribe to a store and get its current value.
|
|
|
59
73
|
- Parameters: `store: Store<T> | undefined`
|
|
60
74
|
- Returns: `T | undefined`
|
|
61
75
|
|
|
62
|
-
```
|
|
63
|
-
import { store } from "simplestack
|
|
64
|
-
import { useStoreValue } from "simplestack
|
|
76
|
+
```tsx
|
|
77
|
+
import { store } from "@simplestack/store";
|
|
78
|
+
import { useStoreValue } from "@simplestack/store/react";
|
|
65
79
|
|
|
66
|
-
const
|
|
80
|
+
const counterStore = store(0);
|
|
67
81
|
|
|
68
82
|
function Counter() {
|
|
69
|
-
const
|
|
70
|
-
return
|
|
83
|
+
const counter = useStoreValue(counterStore);
|
|
84
|
+
return (
|
|
85
|
+
<button onClick={() => counterStore.set((n) => n + 1)}>{counter}</button>
|
|
86
|
+
);
|
|
71
87
|
}
|
|
72
88
|
```
|
|
73
89
|
|
|
@@ -81,7 +97,7 @@ These types are exported for TypeScript users.
|
|
|
81
97
|
- Store<T>:
|
|
82
98
|
- `get(): T`
|
|
83
99
|
- `set(setter: Setter<T>): void`
|
|
84
|
-
- `
|
|
100
|
+
- `subscribe(callback: (state: T) => void): () => void`
|
|
85
101
|
- `select(key: K): Store<SelectValue<T, K>>`: present only when `T` is an object or array
|
|
86
102
|
|
|
87
103
|
## Contributing
|
package/dist/index.d.ts
CHANGED
|
@@ -34,7 +34,7 @@ export type Store<T extends StateObject | StatePrimitive> = {
|
|
|
34
34
|
* @returns A function to unsubscribe.
|
|
35
35
|
* @example
|
|
36
36
|
* const countStore = store(0);
|
|
37
|
-
* const unsubscribe = countStore.
|
|
37
|
+
* const unsubscribe = countStore.subscribe((count) => {
|
|
38
38
|
* console.log(count);
|
|
39
39
|
* });
|
|
40
40
|
*
|
|
@@ -42,7 +42,7 @@ export type Store<T extends StateObject | StatePrimitive> = {
|
|
|
42
42
|
* unsubscribe();
|
|
43
43
|
*
|
|
44
44
|
*/
|
|
45
|
-
|
|
45
|
+
subscribe: (callback: (state: T) => void) => () => void;
|
|
46
46
|
/**
|
|
47
47
|
* Select a key from the state of the store.
|
|
48
48
|
* This returns a new store with the selected key as the state.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,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,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAC1D,CAAC,SAAS,WAAW,GAClB,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvD,SAAS,CAAC;AAEd,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI;IAC3D;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC,CAAC;IACb;;;;;;;;OAQG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACjC;;;;;;;;;;;;;;;OAeG;IACH,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,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,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAC1D,CAAC,SAAS,WAAW,GAClB,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvD,SAAS,CAAC;AAEd,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI;IAC3D;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC,CAAC;IACb;;;;;;;;OAQG;IACH,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACjC;;;;;;;;;;;;;;;OAeG;IACH,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACxD;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtD,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AACxD,wBAAgB,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAC3D,OAAO,EAAE,CAAC,GACR,KAAK,CAAC,CAAC,CAAC,CAAC;AAsFZ,wBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,cAmBjE"}
|
package/dist/index.js
CHANGED
|
@@ -6,13 +6,13 @@ export function store(initial) {
|
|
|
6
6
|
return createStoreApi(get, set);
|
|
7
7
|
}
|
|
8
8
|
const createStoreApi = (get, set) => {
|
|
9
|
-
const
|
|
9
|
+
const subscribe = (callback) => {
|
|
10
10
|
return effect(() => {
|
|
11
11
|
callback(get());
|
|
12
12
|
});
|
|
13
13
|
};
|
|
14
14
|
if (isStatePrimitive(get())) {
|
|
15
|
-
return { get, set,
|
|
15
|
+
return { get, set, subscribe, select: undefined };
|
|
16
16
|
}
|
|
17
17
|
function select(key) {
|
|
18
18
|
const getSelected = () => {
|
|
@@ -39,7 +39,7 @@ const createStoreApi = (get, set) => {
|
|
|
39
39
|
};
|
|
40
40
|
return createStoreApi(getSelected, setSelected);
|
|
41
41
|
}
|
|
42
|
-
return { get, set,
|
|
42
|
+
return { get, set, subscribe, select: select };
|
|
43
43
|
};
|
|
44
44
|
const UNEXPECTED_SELECT_ERROR = "Internal: select() was unexpectedly called on a state value that wasn't an object.";
|
|
45
45
|
function isStatePrimitive(state) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAmHzC,MAAM,UAAU,KAAK,CACpB,OAAU;IAEV,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAI,OAAO,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,CAAC,MAAiB,EAAE,EAAE,CACjC,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxE,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,cAAc,GAAG,CACtB,GAAY,EACZ,GAAgC,EACrB,EAAE;IACb,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/react.js
CHANGED
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAmB5C,MAAM,UAAU,aAAa,CAC5B,KAA2B;IAE3B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAmB5C,MAAM,UAAU,aAAa,CAC5B,KAA2B;IAE3B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAChE,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplestack/store",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "A simple storage solution for React",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,6 +23,10 @@
|
|
|
23
23
|
],
|
|
24
24
|
"author": "bholmesdev",
|
|
25
25
|
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/bholmesdev/simplestack-store.git"
|
|
29
|
+
},
|
|
26
30
|
"devDependencies": {
|
|
27
31
|
"@biomejs/biome": "2.2.2",
|
|
28
32
|
"@types/react": "^19.1.12",
|