@simplestack/store 0.0.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/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +3 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +9 -0
- package/dist/react.js.map +1 -0
- package/package.json +59 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type StateObject = Record<string | number | symbol, any>;
|
|
2
|
+
export type StatePrimitive = string | number | boolean | null | undefined;
|
|
3
|
+
export type Setter<T extends StateObject | StatePrimitive> = T | ((state: T) => T);
|
|
4
|
+
export type Store<T extends StateObject | StatePrimitive> = {
|
|
5
|
+
get: () => T;
|
|
6
|
+
set: (setter: Setter<T>) => void;
|
|
7
|
+
listen: (callback: (state: T) => void) => () => void;
|
|
8
|
+
} & (T extends StateObject ? {
|
|
9
|
+
select: <K extends keyof T>(key: K) => Store<T[K]>;
|
|
10
|
+
} : {});
|
|
11
|
+
export declare function store(initial: number): Store<number>;
|
|
12
|
+
export declare function store(initial: string): Store<string>;
|
|
13
|
+
export declare function store(initial: boolean): Store<boolean>;
|
|
14
|
+
export declare function store<T extends StateObject | StatePrimitive>(initial: T): Store<T>;
|
|
15
|
+
export declare function effect(callback: (() => void) | (() => () => void)): () => void;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEnF,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,IAAI;IACxD,GAAG,EAAE,MAAM,CAAC,CAAC;IACb,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CACxD,GAAG,CAAC,CAAC,SAAS,WAAW,GAAG;IACzB,MAAM,EAAE,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtD,GAAG,EAAE,CAAC,CAAC;AAGR,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,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AA6EpF,wBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC,cAmBjE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Signal } from "signal-polyfill";
|
|
2
|
+
export function store(initial) {
|
|
3
|
+
const state = new Signal.State(initial);
|
|
4
|
+
const get = () => state.get();
|
|
5
|
+
const set = (setter) => state.set(typeof setter === "function" ? setter(state.get()) : setter);
|
|
6
|
+
return createStoreApi(get, set);
|
|
7
|
+
}
|
|
8
|
+
const createStoreApi = (get, set) => {
|
|
9
|
+
const listen = (callback) => {
|
|
10
|
+
return effect(() => {
|
|
11
|
+
callback(get());
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const api = { get, set, listen };
|
|
15
|
+
function select(key) {
|
|
16
|
+
const getSelected = () => {
|
|
17
|
+
const state = get();
|
|
18
|
+
if (!isStateObject(state)) {
|
|
19
|
+
throw new Error(getUnexpectedSelectError(typeof state));
|
|
20
|
+
}
|
|
21
|
+
return state[key];
|
|
22
|
+
};
|
|
23
|
+
const setSelected = (setter) => {
|
|
24
|
+
set((state) => {
|
|
25
|
+
if (!isStateObject(state)) {
|
|
26
|
+
throw new Error(getUnexpectedSelectError(typeof state));
|
|
27
|
+
}
|
|
28
|
+
const prev = state[key];
|
|
29
|
+
const next = typeof setter === "function" ? setter(prev) : setter;
|
|
30
|
+
if (Object.is(prev, next))
|
|
31
|
+
return state;
|
|
32
|
+
return { ...state, [key]: next };
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
return createStoreApi(getSelected, setSelected);
|
|
36
|
+
}
|
|
37
|
+
;
|
|
38
|
+
Object.assign(api, { select });
|
|
39
|
+
return api;
|
|
40
|
+
};
|
|
41
|
+
function getUnexpectedSelectError(objType) {
|
|
42
|
+
let error = `\`.select()\` was unexpectedly called on a state value that wasn't an object. Received type: ${objType}.`;
|
|
43
|
+
if (objType === 'undefined') {
|
|
44
|
+
error += ` It's possible you tried to select a nested value on an object key or an array index. If so, try checking if the key is defined before calling \`.select()\`.`;
|
|
45
|
+
}
|
|
46
|
+
return error;
|
|
47
|
+
}
|
|
48
|
+
function isStateObject(state) {
|
|
49
|
+
return typeof state === "object" && state !== null;
|
|
50
|
+
}
|
|
51
|
+
let needsEnqueue = true;
|
|
52
|
+
const w = new Signal.subtle.Watcher(() => {
|
|
53
|
+
if (needsEnqueue) {
|
|
54
|
+
needsEnqueue = false;
|
|
55
|
+
queueMicrotask(processPending);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
function processPending() {
|
|
59
|
+
needsEnqueue = true;
|
|
60
|
+
for (const s of w.getPending()) {
|
|
61
|
+
s.get();
|
|
62
|
+
}
|
|
63
|
+
w.watch();
|
|
64
|
+
}
|
|
65
|
+
export function effect(callback) {
|
|
66
|
+
let cleanup;
|
|
67
|
+
const computed = new Signal.Computed(() => {
|
|
68
|
+
typeof cleanup === "function" && cleanup();
|
|
69
|
+
const callbackCleanup = callback();
|
|
70
|
+
if (typeof callbackCleanup === "function") {
|
|
71
|
+
cleanup = callbackCleanup;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
w.watch(computed);
|
|
75
|
+
computed.get();
|
|
76
|
+
return () => {
|
|
77
|
+
w.unwatch(computed);
|
|
78
|
+
typeof cleanup === "function" && cleanup();
|
|
79
|
+
cleanup = undefined;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE7E,wBAAgB,QAAQ,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAMlH"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useState, useEffect } from "react";
|
|
2
|
+
export function useStore(store) {
|
|
3
|
+
const [state, setState] = useState(store.get());
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
return store.listen(setState);
|
|
6
|
+
}, [store]);
|
|
7
|
+
return [state, store.set];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,UAAU,QAAQ,CAAyC,KAAe;IAC5E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@simplestack/store",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A simple storage solution for React",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./react": {
|
|
15
|
+
"types": "./dist/react.d.ts",
|
|
16
|
+
"import": "./dist/react.js",
|
|
17
|
+
"default": "./dist/react.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"store",
|
|
22
|
+
"react"
|
|
23
|
+
],
|
|
24
|
+
"author": "bholmesdev",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@types/react": "^19.1.12",
|
|
28
|
+
"react": "^19.0.0",
|
|
29
|
+
"typescript": "^5.9.2"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"signal-polyfill": "^0.2.2"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
|
|
36
|
+
},
|
|
37
|
+
"peerDependenciesMeta": {
|
|
38
|
+
"react": {
|
|
39
|
+
"optional": true
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"typesVersions": {
|
|
43
|
+
"*": {
|
|
44
|
+
"react": [
|
|
45
|
+
"dist/react.d.ts"
|
|
46
|
+
],
|
|
47
|
+
"*": [
|
|
48
|
+
"dist/index.d.ts"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"files": [
|
|
53
|
+
"dist"
|
|
54
|
+
],
|
|
55
|
+
"scripts": {
|
|
56
|
+
"build": "tsc",
|
|
57
|
+
"dev": "tsc -w"
|
|
58
|
+
}
|
|
59
|
+
}
|