nusm 0.1.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/dist/adapters/indexDbAdapter.d.ts +3 -0
  4. package/dist/adapters/indexDbAdapter.d.ts.map +1 -0
  5. package/dist/adapters/indexDbAdapter.js +53 -0
  6. package/dist/adapters/indexDbAdapter.js.map +1 -0
  7. package/dist/adapters/localStorageAdapter.d.ts +3 -0
  8. package/dist/adapters/localStorageAdapter.d.ts.map +1 -0
  9. package/dist/adapters/localStorageAdapter.js +6 -0
  10. package/dist/adapters/localStorageAdapter.js.map +1 -0
  11. package/dist/adapters/sessionStorageAdapter.d.ts +3 -0
  12. package/dist/adapters/sessionStorageAdapter.d.ts.map +1 -0
  13. package/dist/adapters/sessionStorageAdapter.js +6 -0
  14. package/dist/adapters/sessionStorageAdapter.js.map +1 -0
  15. package/dist/adapters/storageAdapter.d.ts +3 -0
  16. package/dist/adapters/storageAdapter.d.ts.map +1 -0
  17. package/dist/adapters/storageAdapter.js +62 -0
  18. package/dist/adapters/storageAdapter.js.map +1 -0
  19. package/dist/core/createNusmStore.d.ts +3 -0
  20. package/dist/core/createNusmStore.d.ts.map +1 -0
  21. package/dist/core/createNusmStore.js +491 -0
  22. package/dist/core/createNusmStore.js.map +1 -0
  23. package/dist/devtools/client.d.ts +15 -0
  24. package/dist/devtools/client.d.ts.map +1 -0
  25. package/dist/devtools/client.js +21 -0
  26. package/dist/devtools/client.js.map +1 -0
  27. package/dist/devtools/plugin.d.ts +3 -0
  28. package/dist/devtools/plugin.d.ts.map +1 -0
  29. package/dist/devtools/plugin.js +57 -0
  30. package/dist/devtools/plugin.js.map +1 -0
  31. package/dist/index.d.ts +7 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +6 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/react/index.d.ts +11 -0
  36. package/dist/react/index.d.ts.map +1 -0
  37. package/dist/react/index.js +32 -0
  38. package/dist/react/index.js.map +1 -0
  39. package/dist/types.d.ts +112 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils.d.ts +5 -0
  44. package/dist/utils.d.ts.map +1 -0
  45. package/dist/utils.js +30 -0
  46. package/dist/utils.js.map +1 -0
  47. package/package.json +96 -0
@@ -0,0 +1,11 @@
1
+ import type { Derived, Store } from "@tanstack/store";
2
+ export * from "@tanstack/store";
3
+ export type NoInfer<T> = [T][T extends unknown ? 0 : never];
4
+ type EqualityFn<T> = (objA: T, objB: T) => boolean;
5
+ interface UseStoreOptions<T> {
6
+ equal?: EqualityFn<T>;
7
+ }
8
+ export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Store<TState>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): TSelected;
9
+ export declare function useStore<TState, TSelected = NoInfer<TState>>(store: Derived<TState>, selector?: (state: NoInfer<TState>) => TSelected, options?: UseStoreOptions<TSelected>): TSelected;
10
+ export declare function shallow<T>(objA: T, objB: T): boolean;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtD,cAAc,iBAAiB,CAAC;AAEhC,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;AAE5D,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;AAEnD,UAAU,eAAe,CAAC,CAAC;IACzB,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACvB;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,EAC1D,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAChD,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GACnC,SAAS,CAAC;AACb,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,EAC1D,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAChD,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GACnC,SAAS,CAAC;AAiBb,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,WA4B1C"}
@@ -0,0 +1,32 @@
1
+ import { useSyncExternalStoreWithSelector } from "use-sync-external-store/shim/with-selector.js";
2
+ export * from "@tanstack/store";
3
+ export function useStore(store, selector = (d) => d, options = {}) {
4
+ const equal = options.equal ?? shallow;
5
+ return useSyncExternalStoreWithSelector(store.subscribe, () => store.state, () => store.state, selector, equal);
6
+ }
7
+ export function shallow(objA, objB) {
8
+ if (Object.is(objA, objB)) {
9
+ return true;
10
+ }
11
+ if (typeof objA !== "object" ||
12
+ objA === null ||
13
+ typeof objB !== "object" ||
14
+ objB === null) {
15
+ return false;
16
+ }
17
+ const keysA = getOwnKeys(objA);
18
+ const keysB = getOwnKeys(objB);
19
+ if (keysA.length !== keysB.length) {
20
+ return false;
21
+ }
22
+ for (const key of keysA) {
23
+ if (!(Object.hasOwn(objB, key) && Object.is(objA[key], objB[key]))) {
24
+ return false;
25
+ }
26
+ }
27
+ return true;
28
+ }
29
+ function getOwnKeys(obj) {
30
+ return [...Object.keys(obj), ...Object.getOwnPropertySymbols(obj)];
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,+CAA+C,CAAC;AAGjG,cAAc,iBAAiB,CAAC;AAoBhC,MAAM,UAAU,QAAQ,CACtB,KAAsC,EACtC,WAAkD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAc,EACvE,UAAsC,EAAE;IAExC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;IAEvC,OAAO,gCAAgC,CACrC,KAAK,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EACjB,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EACjB,QAAQ,EACR,KAAK,CACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,IAAO,EAAE,IAAO;IACzC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IACE,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI,EACb,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAc,CAAC,EAAE,IAAI,CAAC,GAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,112 @@
1
+ import type { Store } from '@tanstack/store';
2
+ export type NusmPacerConfig = false | {
3
+ wait?: number;
4
+ maxWait?: number;
5
+ leading?: boolean;
6
+ trailing?: boolean;
7
+ };
8
+ export type AdapterEventType = 'set' | 'remove' | 'clear';
9
+ export interface AdapterEvent {
10
+ type: AdapterEventType;
11
+ key?: string;
12
+ }
13
+ export interface NusmAdapter {
14
+ name: string;
15
+ getItem(key: string): unknown | null | Promise<unknown | null>;
16
+ setItem(key: string, value: unknown): void | Promise<void>;
17
+ removeItem(key: string): void | Promise<void>;
18
+ getAllKeys?(): string[] | Promise<string[]>;
19
+ clear?(): void | Promise<void>;
20
+ subscribe?(listener: (event: AdapterEvent) => void): () => void;
21
+ resolveKey?(params: {
22
+ storeId: string;
23
+ sliceKey?: string;
24
+ kind: 'entire' | 'slice';
25
+ }): string;
26
+ pacer?: NusmPacerConfig;
27
+ }
28
+ export interface PersistSlice<TState> {
29
+ key: string;
30
+ select: (state: TState) => unknown;
31
+ apply: (state: TState, sliceValue: unknown) => TState;
32
+ }
33
+ export interface HydrateConfig<TState> {
34
+ validate?: ((persisted: unknown) => boolean) | ((persisted: unknown) => {
35
+ ok: boolean;
36
+ value?: unknown;
37
+ });
38
+ merge?: (params: {
39
+ initial: TState;
40
+ persisted: unknown;
41
+ }) => TState;
42
+ discardPersisted?: boolean | (() => boolean);
43
+ }
44
+ export interface CreateNusmStoreOptions<TState> {
45
+ adapter?: NusmAdapter;
46
+ persist?: {
47
+ strategy: 'entire' | 'slices';
48
+ slices?: Array<PersistSlice<TState>>;
49
+ hydrate?: HydrateConfig<TState>;
50
+ };
51
+ devtools?: boolean | {
52
+ name?: string;
53
+ eventLogCap?: number;
54
+ };
55
+ onError?: (error: unknown) => void;
56
+ storeId?: string;
57
+ }
58
+ export type HydrationState = 'not_configured' | 'pending' | 'hydrated' | 'discarded' | 'error';
59
+ export interface HydrationStatus {
60
+ overall: HydrationState;
61
+ byKey: Record<string, HydrationState>;
62
+ }
63
+ export type NusmEventType = 'hydrate_start' | 'hydrate_discarded' | 'hydrate_applied' | 'hydrate_error' | 'persist_scheduled' | 'persist_flush_start' | 'persist_flush_ok' | 'persist_flush_error' | 'adapter_external_event';
64
+ export interface NusmEvent {
65
+ ts: number;
66
+ type: NusmEventType;
67
+ storeId: string;
68
+ key?: string;
69
+ sliceKey?: string;
70
+ detail?: unknown;
71
+ }
72
+ export interface NusmDevtoolsSnapshot {
73
+ storeId: string;
74
+ memory: unknown;
75
+ persisted?: unknown;
76
+ hydration: HydrationStatus;
77
+ isReady: boolean;
78
+ pendingKeys?: string[];
79
+ lastFlushAt?: number;
80
+ }
81
+ export interface NusmStore<TState> {
82
+ store: Store<TState>;
83
+ isReady: boolean;
84
+ ready: Promise<void>;
85
+ getPersistedSnapshot?: () => Promise<unknown>;
86
+ getHydrationStatus?: () => HydrationStatus;
87
+ getEventLog?: () => readonly NusmEvent[];
88
+ }
89
+ export interface StorageAdapterOptions {
90
+ storage?: StorageLike;
91
+ prefix?: string;
92
+ serialize?: (value: unknown) => string;
93
+ deserialize?: (raw: string) => unknown;
94
+ pacer?: NusmPacerConfig;
95
+ }
96
+ export interface StorageLike {
97
+ getItem(key: string): string | null;
98
+ setItem(key: string, value: string): void;
99
+ removeItem(key: string): void;
100
+ clear?(): void;
101
+ key?(index: number): string | null;
102
+ readonly length?: number;
103
+ }
104
+ export interface IndexDbAdapterOptions {
105
+ dbName?: string;
106
+ storeName?: string;
107
+ version?: number;
108
+ serialize?: (value: unknown) => string;
109
+ deserialize?: (raw: string) => unknown;
110
+ pacer?: NusmPacerConfig;
111
+ }
112
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ declare const isPlainObject: (value: unknown) => value is Record<string, unknown>;
2
+ declare const deepMerge: <TState>(initial: TState, persisted: unknown) => TState;
3
+ declare const sleep: (ms: number) => Promise<unknown>;
4
+ export { deepMerge, isPlainObject, sleep };
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAItE,CAAA;AAED,QAAA,MAAM,SAAS,GAAI,MAAM,EAAE,SAAS,MAAM,EAAE,WAAW,OAAO,KAAG,MAsBhE,CAAA;AAED,QAAA,MAAM,KAAK,GAAI,IAAI,MAAM,qBAAsD,CAAA;AAE/E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA"}
package/dist/utils.js ADDED
@@ -0,0 +1,30 @@
1
+ const isPlainObject = (value) => {
2
+ if (!value || typeof value !== 'object')
3
+ return false;
4
+ const proto = Object.getPrototypeOf(value);
5
+ return proto === Object.prototype || proto === null;
6
+ };
7
+ const deepMerge = (initial, persisted) => {
8
+ if (Array.isArray(persisted)) {
9
+ return persisted;
10
+ }
11
+ if (!isPlainObject(persisted)) {
12
+ return persisted;
13
+ }
14
+ if (!isPlainObject(initial)) {
15
+ return persisted;
16
+ }
17
+ const result = { ...initial };
18
+ for (const [key, value] of Object.entries(persisted)) {
19
+ if (isPlainObject(value) && isPlainObject(result[key])) {
20
+ result[key] = deepMerge(result[key], value);
21
+ }
22
+ else {
23
+ result[key] = value;
24
+ }
25
+ }
26
+ return result;
27
+ };
28
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
29
+ export { deepMerge, isPlainObject, sleep };
30
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,CAAC,KAAc,EAAoC,EAAE;IACzE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC1C,OAAO,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAS,OAAe,EAAE,SAAkB,EAAU,EAAE;IACxE,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAmB,CAAA;IAC5B,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAmB,CAAA;IAC5B,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAmB,CAAA;IAC5B,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,GAAG,OAAO,EAAE,CAAA;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAgB,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAE/E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA"}
package/package.json ADDED
@@ -0,0 +1,96 @@
1
+ {
2
+ "dependencies": {
3
+ "@fastify/deepmerge": "^3.1.0",
4
+ "@tanstack/devtools-event-client": "^0.4.0",
5
+ "@tanstack/pacer": "^0.17.3",
6
+ "@tanstack/store": "^0.8.0",
7
+ "fast-equals": "^6.0.0",
8
+ "superjson": "^2.2.1"
9
+ },
10
+ "description": "Non Uniform State Manager nusm (pronounced \"noose em\") built on @tanstack/store with optional persisted adapters.",
11
+ "devDependencies": {
12
+ "@bun-security-scanner/osv": "^1.0.0",
13
+ "@commitlint/cli": "^20.3.1",
14
+ "@commitlint/config-conventional": "^20.3.1",
15
+ "@happy-dom/global-registrator": "^20.3.0",
16
+ "@release-it/conventional-changelog": "^10.0.4",
17
+ "@testing-library/dom": "^10.4.1",
18
+ "@testing-library/jest-dom": "^6.9.1",
19
+ "@testing-library/react": "^16.3.1",
20
+ "@types/bun": "latest",
21
+ "@types/react": "^19.2.8",
22
+ "@types/react-dom": "^19.2.3",
23
+ "conventional-changelog-conventionalcommits": "^9.1.0",
24
+ "fake-indexeddb": "^6.2.5",
25
+ "husky": "^9.1.7",
26
+ "lint-staged": "^16.2.7",
27
+ "release-it": "^19.2.3",
28
+ "typescript": "^5"
29
+ },
30
+ "exports": {
31
+ ".": {
32
+ "default": "./dist/index.js",
33
+ "types": "./dist/index.d.ts"
34
+ },
35
+ "./react": {
36
+ "default": "./dist/react/index.js",
37
+ "types": "./dist/react/index.d.ts"
38
+ }
39
+ },
40
+ "files": [
41
+ "dist",
42
+ "README.md",
43
+ "LICENSE"
44
+ ],
45
+ "license": "MIT",
46
+ "lint-staged": {
47
+ "*": [
48
+ "bunx --bun biome lint --no-errors-on-unmatched --files-ignore-unknown=true"
49
+ ]
50
+ },
51
+ "main": "dist/index.js",
52
+ "module": "dist/index.js",
53
+ "name": "nusm",
54
+ "peerDependencies": {
55
+ "@tanstack/devtools": "^0.10.3",
56
+ "react": "^19.2.0",
57
+ "typescript": "^5"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "@tanstack/devtools": {
61
+ "optional": true
62
+ },
63
+ "react": {
64
+ "optional": true
65
+ }
66
+ },
67
+ "release-it": {
68
+ "git": {
69
+ "commitMessage": "chore: release v${version}",
70
+ "pushRepo": "origin",
71
+ "requireBranch": "main",
72
+ "requireCommits": true
73
+ },
74
+ "github": {
75
+ "release": true
76
+ },
77
+ "npm": {
78
+ "publish": true
79
+ },
80
+ "plugins": {
81
+ "@release-it/conventional-changelog": {
82
+ "header": "# Changelog",
83
+ "infile": "CHANGELOG.md",
84
+ "preset": "angular"
85
+ }
86
+ }
87
+ },
88
+ "scripts": {
89
+ "build": "tsc -p tsconfig.build.json",
90
+ "prepare": "husky",
91
+ "test": "bun test"
92
+ },
93
+ "type": "module",
94
+ "types": "dist/index.d.ts",
95
+ "version": "0.1.0"
96
+ }