@codebelt/classy-store 0.0.1 → 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.
- package/dist/index.cjs +29 -61
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -66
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +28 -66
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +28 -59
- package/dist/index.mjs.map +1 -1
- package/dist/react/react.cjs +61 -0
- package/dist/react/react.cjs.map +1 -0
- package/dist/react/react.d.cts +26 -0
- package/dist/react/react.d.cts.map +1 -0
- package/dist/react/react.d.mts +26 -0
- package/dist/react/react.d.mts.map +1 -0
- package/dist/react/react.mjs +60 -0
- package/dist/react/react.mjs.map +1 -0
- package/dist/{snapshot-TbHIUjvP.cjs → snapshot-BKVFJLuo.cjs} +27 -50
- package/dist/snapshot-BKVFJLuo.cjs.map +1 -0
- package/dist/{snapshot-fVu34Cr6.mjs → snapshot-P0QPV1ER.mjs} +22 -39
- package/dist/snapshot-P0QPV1ER.mjs.map +1 -0
- package/dist/types-B6RZUB86.d.cts +27 -0
- package/dist/types-B6RZUB86.d.cts.map +1 -0
- package/dist/types-vWYkF3tH.d.mts +27 -0
- package/dist/types-vWYkF3tH.d.mts.map +1 -0
- package/dist/utils/index.cjs +14 -4
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +16 -3
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts +16 -3
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +14 -4
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +30 -6
- package/dist/snapshot-TbHIUjvP.cjs.map +0 -1
- package/dist/snapshot-fVu34Cr6.mjs.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
-
const require_snapshot = require('./snapshot-
|
|
3
|
-
let proxy_compare = require("proxy-compare");
|
|
4
|
-
let react = require("react");
|
|
2
|
+
const require_snapshot = require('./snapshot-BKVFJLuo.cjs');
|
|
5
3
|
|
|
6
|
-
//#region src/collections.ts
|
|
4
|
+
//#region src/collections/collections.ts
|
|
7
5
|
/**
|
|
8
|
-
* A Map-like class backed by a plain array so `
|
|
6
|
+
* A Map-like class backed by a plain array so `createClassyStore()` can proxy mutations.
|
|
9
7
|
*
|
|
10
8
|
* Native `Map` uses internal slots that ES6 Proxy can't intercept, so mutations
|
|
11
9
|
* like `.set()` would be invisible to the store. `ReactiveMap` solves this by
|
|
@@ -13,7 +11,7 @@ let react = require("react");
|
|
|
13
11
|
*
|
|
14
12
|
* Usage:
|
|
15
13
|
* ```ts
|
|
16
|
-
* const myStore =
|
|
14
|
+
* const myStore = createClassyStore({ users: reactiveMap<string, User>() });
|
|
17
15
|
* myStore.users.set('id1', { name: 'Alice' }); // reactive
|
|
18
16
|
* ```
|
|
19
17
|
*/
|
|
@@ -82,7 +80,7 @@ var ReactiveMap = class {
|
|
|
82
80
|
}
|
|
83
81
|
};
|
|
84
82
|
/**
|
|
85
|
-
* A Set-like class backed by a plain array so `
|
|
83
|
+
* A Set-like class backed by a plain array so `createClassyStore()` can proxy mutations.
|
|
86
84
|
*
|
|
87
85
|
* Native `Set` uses internal slots that ES6 Proxy can't intercept, so mutations
|
|
88
86
|
* like `.add()` would be invisible to the store. `ReactiveSet` solves this by
|
|
@@ -90,7 +88,7 @@ var ReactiveMap = class {
|
|
|
90
88
|
*
|
|
91
89
|
* Usage:
|
|
92
90
|
* ```ts
|
|
93
|
-
* const myStore =
|
|
91
|
+
* const myStore = createClassyStore({ tags: reactiveSet<string>(['urgent']) });
|
|
94
92
|
* myStore.tags.add('bug'); // reactive
|
|
95
93
|
* ```
|
|
96
94
|
*/
|
|
@@ -151,7 +149,7 @@ var ReactiveSet = class {
|
|
|
151
149
|
};
|
|
152
150
|
/**
|
|
153
151
|
* Creates a reactive Map-like collection backed by a plain array.
|
|
154
|
-
* Wrap the parent object with `
|
|
152
|
+
* Wrap the parent object with `createClassyStore()` for full reactivity.
|
|
155
153
|
*
|
|
156
154
|
* @param initial - Optional iterable of `[key, value]` pairs.
|
|
157
155
|
*/
|
|
@@ -160,7 +158,7 @@ function reactiveMap(initial) {
|
|
|
160
158
|
}
|
|
161
159
|
/**
|
|
162
160
|
* Creates a reactive Set-like collection backed by a plain array.
|
|
163
|
-
* Wrap the parent object with `
|
|
161
|
+
* Wrap the parent object with `createClassyStore()` for full reactivity.
|
|
164
162
|
*
|
|
165
163
|
* @param initial - Optional iterable of values.
|
|
166
164
|
*/
|
|
@@ -169,66 +167,36 @@ function reactiveSet(initial) {
|
|
|
169
167
|
}
|
|
170
168
|
|
|
171
169
|
//#endregion
|
|
172
|
-
//#region src/
|
|
173
|
-
function useStore(proxyStore, selector, isEqual) {
|
|
174
|
-
require_snapshot.getInternal(proxyStore);
|
|
175
|
-
const subscribe$1 = (0, react.useCallback)((onStoreChange) => require_snapshot.subscribe(proxyStore, onStoreChange), [proxyStore]);
|
|
176
|
-
const snapRef = (0, react.useRef)(void 0);
|
|
177
|
-
const resultRef = (0, react.useRef)(void 0);
|
|
178
|
-
const affected = (0, react.useRef)(/* @__PURE__ */ new WeakMap()).current;
|
|
179
|
-
const proxyCache = (0, react.useRef)(/* @__PURE__ */ new WeakMap()).current;
|
|
180
|
-
const prevSnapRef = (0, react.useRef)(void 0);
|
|
181
|
-
const wrappedRef = (0, react.useRef)(void 0);
|
|
182
|
-
const getSnapshot = () => selector ? getSelectorSnapshot(proxyStore, snapRef, resultRef, selector, isEqual) : getAutoTrackSnapshot(proxyStore, affected, proxyCache, prevSnapRef, wrappedRef);
|
|
183
|
-
return (0, react.useSyncExternalStore)(subscribe$1, getSnapshot, getSnapshot);
|
|
184
|
-
}
|
|
170
|
+
//#region src/utils/equality/equality.ts
|
|
185
171
|
/**
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
* Fast-paths when the snapshot reference hasn't changed (O(1)). Otherwise
|
|
189
|
-
* runs the selector against the new snapshot and compares the result to the
|
|
190
|
-
* previous one via `Object.is` (or a custom `isEqual`). Returns the previous
|
|
191
|
-
* result reference when equal, preventing unnecessary React re-renders.
|
|
172
|
+
* Shallow-equal comparison for objects and arrays.
|
|
173
|
+
* Useful as a custom `isEqual` for `useStore` selectors that return objects/arrays.
|
|
192
174
|
*
|
|
193
|
-
*
|
|
175
|
+
* - Primitives compared with `Object.is`.
|
|
176
|
+
* - Arrays: length + element-wise `Object.is`.
|
|
177
|
+
* - Objects: key count + value-wise `Object.is`.
|
|
194
178
|
*/
|
|
195
|
-
function
|
|
196
|
-
|
|
197
|
-
if (
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
* If the snapshot reference is the same, returns the cached tracking proxy.
|
|
209
|
-
* If the snapshot changed but no tracked property differs (`isChanged` returns
|
|
210
|
-
* false), also returns the cached proxy -- avoiding re-render. Only when a
|
|
211
|
-
* relevant property changed does it create a new `createProxy` wrapper.
|
|
212
|
-
*
|
|
213
|
-
* Pure function -- no hooks, safe to call from `useSyncExternalStore`.
|
|
214
|
-
*/
|
|
215
|
-
function getAutoTrackSnapshot(proxyStore, affected, proxyCache, prevSnapRef, wrappedRef) {
|
|
216
|
-
const nextSnap = require_snapshot.snapshot(proxyStore);
|
|
217
|
-
if (prevSnapRef.current === nextSnap) return wrappedRef.current;
|
|
218
|
-
if (prevSnapRef.current !== void 0 && !(0, proxy_compare.isChanged)(prevSnapRef.current, nextSnap, affected)) return wrappedRef.current;
|
|
219
|
-
prevSnapRef.current = nextSnap;
|
|
220
|
-
const wrapped = (0, proxy_compare.createProxy)(nextSnap, affected, proxyCache);
|
|
221
|
-
wrappedRef.current = wrapped;
|
|
222
|
-
return wrapped;
|
|
179
|
+
function shallowEqual(a, b) {
|
|
180
|
+
if (Object.is(a, b)) return true;
|
|
181
|
+
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) return false;
|
|
182
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
183
|
+
if (a.length !== b.length) return false;
|
|
184
|
+
for (let i = 0; i < a.length; i++) if (!Object.is(a[i], b[i])) return false;
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
const keysA = Object.keys(a);
|
|
188
|
+
const keysB = Object.keys(b);
|
|
189
|
+
if (keysA.length !== keysB.length) return false;
|
|
190
|
+
for (const key of keysA) if (!Object.hasOwn(b, key) || !Object.is(a[key], b[key])) return false;
|
|
191
|
+
return true;
|
|
223
192
|
}
|
|
224
193
|
|
|
225
194
|
//#endregion
|
|
195
|
+
exports.createClassyStore = require_snapshot.createClassyStore;
|
|
226
196
|
exports.getVersion = require_snapshot.getVersion;
|
|
227
197
|
exports.reactiveMap = reactiveMap;
|
|
228
198
|
exports.reactiveSet = reactiveSet;
|
|
229
|
-
exports.shallowEqual =
|
|
199
|
+
exports.shallowEqual = shallowEqual;
|
|
230
200
|
exports.snapshot = require_snapshot.snapshot;
|
|
231
|
-
exports.store = require_snapshot.store;
|
|
232
201
|
exports.subscribe = require_snapshot.subscribe;
|
|
233
|
-
exports.useStore = useStore;
|
|
234
202
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PROXYABLE","subscribe","coreSubscribe","snapshot"],"sources":["../src/collections.ts","../src/useStore.ts"],"sourcesContent":["import {PROXYABLE} from './utils';\n\n// ── ReactiveMap ───────────────────────────────────────────────────────────────\n\n/**\n * A Map-like class backed by a plain array so `store()` can proxy mutations.\n *\n * Native `Map` uses internal slots that ES6 Proxy can't intercept, so mutations\n * like `.set()` would be invisible to the store. `ReactiveMap` solves this by\n * storing entries in a plain array (`_entries`) that the proxy can track.\n *\n * Usage:\n * ```ts\n * const myStore = store({ users: reactiveMap<string, User>() });\n * myStore.users.set('id1', { name: 'Alice' }); // reactive\n * ```\n */\nexport class ReactiveMap<K, V> {\n static [PROXYABLE] = true;\n\n /** @internal Backing storage — proxied by store(). */\n _entries: [K, V][] = [];\n\n /** Deduplicates initial entries by key (last value wins, matching native `Map`). */\n constructor(initial?: Iterable<[K, V]>) {\n if (initial) {\n for (const [k, v] of initial) {\n const index = this._entries.findIndex(([ek]) => Object.is(ek, k));\n if (index !== -1) {\n this._entries[index] = [k, v];\n } else {\n this._entries.push([k, v]);\n }\n }\n }\n }\n\n /** Returns the number of entries. */\n get size(): number {\n return this._entries.length;\n }\n\n /** Returns the value for `key`, or `undefined`. O(n) linear scan. */\n get(key: K): V | undefined {\n const entry = this._entries.find(([k]) => Object.is(k, key));\n return entry ? entry[1] : undefined;\n }\n\n /** Returns `true` if `key` exists. O(n) linear scan. */\n has(key: K): boolean {\n return this._entries.some(([k]) => Object.is(k, key));\n }\n\n /** Sets `key` to `value`. Updates in-place if key exists, appends otherwise. */\n set(key: K, value: V): this {\n const index = this._entries.findIndex(([k]) => Object.is(k, key));\n if (index !== -1) {\n this._entries[index] = [key, value];\n } else {\n this._entries.push([key, value]);\n }\n return this;\n }\n\n /** Removes the entry for `key`. Returns `true` if found. */\n delete(key: K): boolean {\n const index = this._entries.findIndex(([k]) => Object.is(k, key));\n if (index === -1) return false;\n this._entries.splice(index, 1);\n return true;\n }\n\n /** Removes all entries. Uses splice to trigger proxy notification. */\n clear(): void {\n this._entries.splice(0, this._entries.length);\n }\n\n /** Returns an iterator over the keys. */\n keys(): IterableIterator<K> {\n return this._entries.map(([k]) => k)[Symbol.iterator]();\n }\n\n /** Returns an iterator over the values. */\n values(): IterableIterator<V> {\n return this._entries.map(([, v]) => v)[Symbol.iterator]();\n }\n\n /** Returns an iterator over [key, value] pairs. */\n entries(): IterableIterator<[K, V]> {\n return this._entries.map(([k, v]) => [k, v] as [K, V])[Symbol.iterator]();\n }\n\n /** Calls `callback` for each entry, matching the native `Map.forEach` signature. */\n forEach(callback: (value: V, key: K, map: ReactiveMap<K, V>) => void): void {\n for (const [k, v] of this._entries) {\n callback(v, k, this);\n }\n }\n\n /** Enables `for...of` iteration over [key, value] pairs. */\n [Symbol.iterator](): IterableIterator<[K, V]> {\n return this.entries();\n }\n}\n\n// ── ReactiveSet ───────────────────────────────────────────────────────────────\n\n/**\n * A Set-like class backed by a plain array so `store()` can proxy mutations.\n *\n * Native `Set` uses internal slots that ES6 Proxy can't intercept, so mutations\n * like `.add()` would be invisible to the store. `ReactiveSet` solves this by\n * storing items in a plain array (`_items`) that the proxy can track.\n *\n * Usage:\n * ```ts\n * const myStore = store({ tags: reactiveSet<string>(['urgent']) });\n * myStore.tags.add('bug'); // reactive\n * ```\n */\nexport class ReactiveSet<T> {\n static [PROXYABLE] = true;\n\n /** @internal Backing storage — proxied by store(). */\n _items: T[] = [];\n\n /** Deduplicates initial values using `Object.is` comparison. */\n constructor(initial?: Iterable<T>) {\n if (initial) {\n for (const v of initial) {\n if (!this._items.some((item) => Object.is(item, v))) {\n this._items.push(v);\n }\n }\n }\n }\n\n /** Returns the number of unique items. */\n get size(): number {\n return this._items.length;\n }\n\n /** Returns `true` if `value` exists. O(n) linear scan. */\n has(value: T): boolean {\n return this._items.some((item) => Object.is(item, value));\n }\n\n /** Adds `value` if not already present (no-op for duplicates). */\n add(value: T): this {\n if (!this.has(value)) {\n this._items.push(value);\n }\n return this;\n }\n\n /** Removes `value`. Returns `true` if found. */\n delete(value: T): boolean {\n const index = this._items.findIndex((item) => Object.is(item, value));\n if (index === -1) return false;\n this._items.splice(index, 1);\n return true;\n }\n\n /** Removes all items. Uses splice to trigger proxy notification. */\n clear(): void {\n this._items.splice(0, this._items.length);\n }\n\n /** Returns an iterator over the values (same as `values()`, matching Set API). */\n keys(): IterableIterator<T> {\n return this._items[Symbol.iterator]();\n }\n\n /** Returns an iterator over the values. */\n values(): IterableIterator<T> {\n return this._items[Symbol.iterator]();\n }\n\n /** Returns an iterator over [value, value] pairs, matching the native Set API. */\n entries(): IterableIterator<[T, T]> {\n return this._items.map((v) => [v, v] as [T, T])[Symbol.iterator]();\n }\n\n /** Calls `callback` for each item, matching the native `Set.forEach` signature. */\n forEach(callback: (value: T, key: T, set: ReactiveSet<T>) => void): void {\n for (const v of this._items) {\n callback(v, v, this);\n }\n }\n\n /** Enables `for...of` iteration over values. */\n [Symbol.iterator](): IterableIterator<T> {\n return this.values();\n }\n}\n\n// ── Factory functions ─────────────────────────────────────────────────────────\n\n/**\n * Creates a reactive Map-like collection backed by a plain array.\n * Wrap the parent object with `store()` for full reactivity.\n *\n * @param initial - Optional iterable of `[key, value]` pairs.\n */\nexport function reactiveMap<K, V>(\n initial?: Iterable<[K, V]>,\n): ReactiveMap<K, V> {\n return new ReactiveMap(initial);\n}\n\n/**\n * Creates a reactive Set-like collection backed by a plain array.\n * Wrap the parent object with `store()` for full reactivity.\n *\n * @param initial - Optional iterable of values.\n */\nexport function reactiveSet<T>(initial?: Iterable<T>): ReactiveSet<T> {\n return new ReactiveSet(initial);\n}\n","import {createProxy, isChanged} from 'proxy-compare';\nimport {useCallback, useRef, useSyncExternalStore} from 'react';\nimport {subscribe as coreSubscribe, getInternal} from './core';\nimport {snapshot} from './snapshot';\nimport type {Snapshot} from './types';\n\n// ── Overloads ─────────────────────────────────────────────────────────────────\n\n/**\n * Subscribe to a store proxy with an explicit selector.\n *\n * Re-renders only when the selected value changes (compared via `Object.is`\n * by default, or a custom `isEqual`).\n *\n * @param proxyStore - A reactive proxy created by `store()`.\n * @param selector - Picks data from the immutable snapshot.\n * @param isEqual - Optional custom equality function (default: `Object.is`).\n */\nexport function useStore<T extends object, S>(\n proxyStore: T,\n selector: (snap: Snapshot<T>) => S,\n isEqual?: (a: S, b: S) => boolean,\n): S;\n\n/**\n * Subscribe to a store proxy **without** a selector (auto-tracked mode).\n *\n * Returns a `proxy-compare` tracking proxy over the immutable snapshot.\n * The component only re-renders when a property it actually read changes.\n *\n * @param proxyStore - A reactive proxy created by `store()`.\n */\nexport function useStore<T extends object>(proxyStore: T): Snapshot<T>;\n\n// ── Implementation ────────────────────────────────────────────────────────────\n\nexport function useStore<T extends object, S>(\n proxyStore: T,\n selector?: (snap: Snapshot<T>) => S,\n isEqual?: (a: S, b: S) => boolean,\n): Snapshot<T> | S {\n // Validate that the argument is actually a store proxy (throws if not).\n getInternal(proxyStore);\n\n // Stable subscribe function (internal identity never changes for a given store).\n const subscribe = useCallback(\n (onStoreChange: () => void) => coreSubscribe(proxyStore, onStoreChange),\n [proxyStore],\n );\n\n // ── Refs used by both modes (always allocated to satisfy Rules of Hooks) ──\n\n // Selector mode refs\n const snapRef = useRef<Snapshot<T> | undefined>(undefined);\n const resultRef = useRef<S | undefined>(undefined);\n\n // Auto-track mode refs\n const affected = useRef(new WeakMap<object, unknown>()).current;\n const proxyCache = useRef(new WeakMap<object, unknown>()).current;\n const prevSnapRef = useRef<Snapshot<T> | undefined>(undefined);\n const wrappedRef = useRef<Snapshot<T> | undefined>(undefined);\n\n // ── Single getSnapshot for useSyncExternalStore ───────────────────────────\n\n const getSnapshot = (): Snapshot<T> | S =>\n selector\n ? getSelectorSnapshot(proxyStore, snapRef, resultRef, selector, isEqual)\n : getAutoTrackSnapshot(\n proxyStore,\n affected,\n proxyCache,\n prevSnapRef,\n wrappedRef,\n );\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n\n// ── Selector mode logic (pure function, no hooks) ─────────────────────────────\n\n/**\n * `getSnapshot` implementation for selector mode.\n *\n * Fast-paths when the snapshot reference hasn't changed (O(1)). Otherwise\n * runs the selector against the new snapshot and compares the result to the\n * previous one via `Object.is` (or a custom `isEqual`). Returns the previous\n * result reference when equal, preventing unnecessary React re-renders.\n *\n * Pure function -- no hooks, safe to call from `useSyncExternalStore`.\n */\nfunction getSelectorSnapshot<T extends object, S>(\n proxyStore: T,\n snapRef: React.RefObject<Snapshot<T> | undefined>,\n resultRef: React.RefObject<S | undefined>,\n selector: (snap: Snapshot<T>) => S,\n isEqual?: (a: S, b: S) => boolean,\n): S {\n const nextSnap = snapshot(proxyStore);\n\n // Fast path: same snapshot reference → same result.\n if (snapRef.current === nextSnap && resultRef.current !== undefined) {\n return resultRef.current;\n }\n\n const nextResult = selector(nextSnap);\n snapRef.current = nextSnap;\n\n // Check equality with previous result.\n if (\n resultRef.current !== undefined &&\n (isEqual\n ? isEqual(resultRef.current, nextResult)\n : Object.is(resultRef.current, nextResult))\n ) {\n return resultRef.current;\n }\n\n resultRef.current = nextResult;\n return nextResult;\n}\n\n// ── Auto-tracked (selectorless) mode logic (pure function, no hooks) ──────────\n\n/**\n * `getSnapshot` implementation for auto-tracked (selectorless) mode.\n *\n * Uses `proxy-compare` to diff only the properties the component actually read.\n * If the snapshot reference is the same, returns the cached tracking proxy.\n * If the snapshot changed but no tracked property differs (`isChanged` returns\n * false), also returns the cached proxy -- avoiding re-render. Only when a\n * relevant property changed does it create a new `createProxy` wrapper.\n *\n * Pure function -- no hooks, safe to call from `useSyncExternalStore`.\n */\nfunction getAutoTrackSnapshot<T extends object>(\n proxyStore: T,\n affected: WeakMap<object, unknown>,\n proxyCache: WeakMap<object, unknown>,\n prevSnapRef: React.RefObject<Snapshot<T> | undefined>,\n wrappedRef: React.RefObject<Snapshot<T> | undefined>,\n): Snapshot<T> {\n const nextSnap = snapshot(proxyStore);\n\n // If the raw snapshot is the same reference, nothing changed.\n if (prevSnapRef.current === nextSnap) {\n return wrappedRef.current as Snapshot<T>;\n }\n\n // Check if any property the component actually read has changed.\n if (\n prevSnapRef.current !== undefined &&\n !isChanged(prevSnapRef.current, nextSnap, affected)\n ) {\n // No property the component cares about changed → return same wrapped proxy.\n return wrappedRef.current as Snapshot<T>;\n }\n\n // Something relevant changed — create a new tracking proxy.\n prevSnapRef.current = nextSnap;\n const wrapped = createProxy(nextSnap, affected, proxyCache) as Snapshot<T>;\n wrappedRef.current = wrapped;\n return wrapped;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PROXYABLE"],"sources":["../src/collections/collections.ts","../src/utils/equality/equality.ts"],"sourcesContent":["import {PROXYABLE} from '../utils/internal/internal';\n\n// ── ReactiveMap ───────────────────────────────────────────────────────────────\n\n/**\n * A Map-like class backed by a plain array so `createClassyStore()` can proxy mutations.\n *\n * Native `Map` uses internal slots that ES6 Proxy can't intercept, so mutations\n * like `.set()` would be invisible to the store. `ReactiveMap` solves this by\n * storing entries in a plain array (`_entries`) that the proxy can track.\n *\n * Usage:\n * ```ts\n * const myStore = createClassyStore({ users: reactiveMap<string, User>() });\n * myStore.users.set('id1', { name: 'Alice' }); // reactive\n * ```\n */\nexport class ReactiveMap<K, V> {\n static [PROXYABLE] = true;\n\n /** @internal Backing storage — proxied by store(). */\n _entries: [K, V][] = [];\n\n /** Deduplicates initial entries by key (last value wins, matching native `Map`). */\n constructor(initial?: Iterable<[K, V]>) {\n if (initial) {\n for (const [k, v] of initial) {\n const index = this._entries.findIndex(([ek]) => Object.is(ek, k));\n if (index !== -1) {\n this._entries[index] = [k, v];\n } else {\n this._entries.push([k, v]);\n }\n }\n }\n }\n\n /** Returns the number of entries. */\n get size(): number {\n return this._entries.length;\n }\n\n /** Returns the value for `key`, or `undefined`. O(n) linear scan. */\n get(key: K): V | undefined {\n const entry = this._entries.find(([k]) => Object.is(k, key));\n return entry ? entry[1] : undefined;\n }\n\n /** Returns `true` if `key` exists. O(n) linear scan. */\n has(key: K): boolean {\n return this._entries.some(([k]) => Object.is(k, key));\n }\n\n /** Sets `key` to `value`. Updates in-place if key exists, appends otherwise. */\n set(key: K, value: V): this {\n const index = this._entries.findIndex(([k]) => Object.is(k, key));\n if (index !== -1) {\n this._entries[index] = [key, value];\n } else {\n this._entries.push([key, value]);\n }\n return this;\n }\n\n /** Removes the entry for `key`. Returns `true` if found. */\n delete(key: K): boolean {\n const index = this._entries.findIndex(([k]) => Object.is(k, key));\n if (index === -1) return false;\n this._entries.splice(index, 1);\n return true;\n }\n\n /** Removes all entries. Uses splice to trigger proxy notification. */\n clear(): void {\n this._entries.splice(0, this._entries.length);\n }\n\n /** Returns an iterator over the keys. */\n keys(): IterableIterator<K> {\n return this._entries.map(([k]) => k)[Symbol.iterator]();\n }\n\n /** Returns an iterator over the values. */\n values(): IterableIterator<V> {\n return this._entries.map(([, v]) => v)[Symbol.iterator]();\n }\n\n /** Returns an iterator over [key, value] pairs. */\n entries(): IterableIterator<[K, V]> {\n return this._entries.map(([k, v]) => [k, v] as [K, V])[Symbol.iterator]();\n }\n\n /** Calls `callback` for each entry, matching the native `Map.forEach` signature. */\n forEach(callback: (value: V, key: K, map: ReactiveMap<K, V>) => void): void {\n for (const [k, v] of this._entries) {\n callback(v, k, this);\n }\n }\n\n /** Enables `for...of` iteration over [key, value] pairs. */\n [Symbol.iterator](): IterableIterator<[K, V]> {\n return this.entries();\n }\n}\n\n// ── ReactiveSet ───────────────────────────────────────────────────────────────\n\n/**\n * A Set-like class backed by a plain array so `createClassyStore()` can proxy mutations.\n *\n * Native `Set` uses internal slots that ES6 Proxy can't intercept, so mutations\n * like `.add()` would be invisible to the store. `ReactiveSet` solves this by\n * storing items in a plain array (`_items`) that the proxy can track.\n *\n * Usage:\n * ```ts\n * const myStore = createClassyStore({ tags: reactiveSet<string>(['urgent']) });\n * myStore.tags.add('bug'); // reactive\n * ```\n */\nexport class ReactiveSet<T> {\n static [PROXYABLE] = true;\n\n /** @internal Backing storage — proxied by store(). */\n _items: T[] = [];\n\n /** Deduplicates initial values using `Object.is` comparison. */\n constructor(initial?: Iterable<T>) {\n if (initial) {\n for (const v of initial) {\n if (!this._items.some((item) => Object.is(item, v))) {\n this._items.push(v);\n }\n }\n }\n }\n\n /** Returns the number of unique items. */\n get size(): number {\n return this._items.length;\n }\n\n /** Returns `true` if `value` exists. O(n) linear scan. */\n has(value: T): boolean {\n return this._items.some((item) => Object.is(item, value));\n }\n\n /** Adds `value` if not already present (no-op for duplicates). */\n add(value: T): this {\n if (!this.has(value)) {\n this._items.push(value);\n }\n return this;\n }\n\n /** Removes `value`. Returns `true` if found. */\n delete(value: T): boolean {\n const index = this._items.findIndex((item) => Object.is(item, value));\n if (index === -1) return false;\n this._items.splice(index, 1);\n return true;\n }\n\n /** Removes all items. Uses splice to trigger proxy notification. */\n clear(): void {\n this._items.splice(0, this._items.length);\n }\n\n /** Returns an iterator over the values (same as `values()`, matching Set API). */\n keys(): IterableIterator<T> {\n return this._items[Symbol.iterator]();\n }\n\n /** Returns an iterator over the values. */\n values(): IterableIterator<T> {\n return this._items[Symbol.iterator]();\n }\n\n /** Returns an iterator over [value, value] pairs, matching the native Set API. */\n entries(): IterableIterator<[T, T]> {\n return this._items.map((v) => [v, v] as [T, T])[Symbol.iterator]();\n }\n\n /** Calls `callback` for each item, matching the native `Set.forEach` signature. */\n forEach(callback: (value: T, key: T, set: ReactiveSet<T>) => void): void {\n for (const v of this._items) {\n callback(v, v, this);\n }\n }\n\n /** Enables `for...of` iteration over values. */\n [Symbol.iterator](): IterableIterator<T> {\n return this.values();\n }\n}\n\n// ── Factory functions ─────────────────────────────────────────────────────────\n\n/**\n * Creates a reactive Map-like collection backed by a plain array.\n * Wrap the parent object with `createClassyStore()` for full reactivity.\n *\n * @param initial - Optional iterable of `[key, value]` pairs.\n */\nexport function reactiveMap<K, V>(\n initial?: Iterable<[K, V]>,\n): ReactiveMap<K, V> {\n return new ReactiveMap(initial);\n}\n\n/**\n * Creates a reactive Set-like collection backed by a plain array.\n * Wrap the parent object with `createClassyStore()` for full reactivity.\n *\n * @param initial - Optional iterable of values.\n */\nexport function reactiveSet<T>(initial?: Iterable<T>): ReactiveSet<T> {\n return new ReactiveSet(initial);\n}\n","/**\n * Shallow-equal comparison for objects and arrays.\n * Useful as a custom `isEqual` for `useStore` selectors that return objects/arrays.\n *\n * - Primitives compared with `Object.is`.\n * - Arrays: length + element-wise `Object.is`.\n * - Objects: key count + value-wise `Object.is`.\n */\nexport function shallowEqual<T>(a: T, b: T): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== 'object' ||\n a === null ||\n typeof b !== 'object' ||\n b === null\n ) {\n return false;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (\n !Object.hasOwn(b, key) ||\n !Object.is(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n )\n ) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { t as Snapshot } from "./types-B6RZUB86.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/internal/internal.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Symbol that class instances can use to opt-in to deep proxying.
|
|
4
6
|
* Classes with `static [PROXYABLE] = true` will be wrapped by the store proxy
|
|
5
7
|
* just like plain objects, enabling nested reactivity.
|
|
6
8
|
*/
|
|
7
9
|
declare const PROXYABLE: unique symbol;
|
|
8
|
-
/**
|
|
9
|
-
* Shallow-equal comparison for objects and arrays.
|
|
10
|
-
* Useful as a custom `isEqual` for `useStore` selectors that return objects/arrays.
|
|
11
|
-
*
|
|
12
|
-
* - Primitives compared with `Object.is`.
|
|
13
|
-
* - Arrays: length + element-wise `Object.is`.
|
|
14
|
-
* - Objects: key count + value-wise `Object.is`.
|
|
15
|
-
*/
|
|
16
|
-
declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
17
10
|
//#endregion
|
|
18
|
-
//#region src/collections.d.ts
|
|
11
|
+
//#region src/collections/collections.d.ts
|
|
19
12
|
/**
|
|
20
|
-
* A Map-like class backed by a plain array so `
|
|
13
|
+
* A Map-like class backed by a plain array so `createClassyStore()` can proxy mutations.
|
|
21
14
|
*
|
|
22
15
|
* Native `Map` uses internal slots that ES6 Proxy can't intercept, so mutations
|
|
23
16
|
* like `.set()` would be invisible to the store. `ReactiveMap` solves this by
|
|
@@ -25,7 +18,7 @@ declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
|
25
18
|
*
|
|
26
19
|
* Usage:
|
|
27
20
|
* ```ts
|
|
28
|
-
* const myStore =
|
|
21
|
+
* const myStore = createClassyStore({ users: reactiveMap<string, User>() });
|
|
29
22
|
* myStore.users.set('id1', { name: 'Alice' }); // reactive
|
|
30
23
|
* ```
|
|
31
24
|
*/
|
|
@@ -59,7 +52,7 @@ declare class ReactiveMap<K, V> {
|
|
|
59
52
|
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
60
53
|
}
|
|
61
54
|
/**
|
|
62
|
-
* A Set-like class backed by a plain array so `
|
|
55
|
+
* A Set-like class backed by a plain array so `createClassyStore()` can proxy mutations.
|
|
63
56
|
*
|
|
64
57
|
* Native `Set` uses internal slots that ES6 Proxy can't intercept, so mutations
|
|
65
58
|
* like `.add()` would be invisible to the store. `ReactiveSet` solves this by
|
|
@@ -67,7 +60,7 @@ declare class ReactiveMap<K, V> {
|
|
|
67
60
|
*
|
|
68
61
|
* Usage:
|
|
69
62
|
* ```ts
|
|
70
|
-
* const myStore =
|
|
63
|
+
* const myStore = createClassyStore({ tags: reactiveSet<string>(['urgent']) });
|
|
71
64
|
* myStore.tags.add('bug'); // reactive
|
|
72
65
|
* ```
|
|
73
66
|
*/
|
|
@@ -100,45 +93,20 @@ declare class ReactiveSet<T> {
|
|
|
100
93
|
}
|
|
101
94
|
/**
|
|
102
95
|
* Creates a reactive Map-like collection backed by a plain array.
|
|
103
|
-
* Wrap the parent object with `
|
|
96
|
+
* Wrap the parent object with `createClassyStore()` for full reactivity.
|
|
104
97
|
*
|
|
105
98
|
* @param initial - Optional iterable of `[key, value]` pairs.
|
|
106
99
|
*/
|
|
107
100
|
declare function reactiveMap<K, V>(initial?: Iterable<[K, V]>): ReactiveMap<K, V>;
|
|
108
101
|
/**
|
|
109
102
|
* Creates a reactive Set-like collection backed by a plain array.
|
|
110
|
-
* Wrap the parent object with `
|
|
103
|
+
* Wrap the parent object with `createClassyStore()` for full reactivity.
|
|
111
104
|
*
|
|
112
105
|
* @param initial - Optional iterable of values.
|
|
113
106
|
*/
|
|
114
107
|
declare function reactiveSet<T>(initial?: Iterable<T>): ReactiveSet<T>;
|
|
115
108
|
//#endregion
|
|
116
|
-
//#region src/
|
|
117
|
-
/**
|
|
118
|
-
* Primitive types that should not be proxied or snapshot-cloned.
|
|
119
|
-
* Used by `Snapshot<T>` to identify leaf types that pass through unchanged.
|
|
120
|
-
*/
|
|
121
|
-
type Primitive = string | number | boolean | null | undefined | symbol | bigint;
|
|
122
|
-
/**
|
|
123
|
-
* Function type shorthand.
|
|
124
|
-
* Functions are treated as snapshot leaves -- they pass through unchanged
|
|
125
|
-
* because freezing or cloning them would break callable references.
|
|
126
|
-
*/
|
|
127
|
-
type AnyFunction = (...args: unknown[]) => unknown;
|
|
128
|
-
/**
|
|
129
|
-
* Types that `snapshot()` returns as-is (no deep clone or freeze).
|
|
130
|
-
* These are either already immutable-ish (Date, RegExp), use internal slots
|
|
131
|
-
* that proxies can't intercept (Map, Set, WeakMap, WeakSet), or can't be
|
|
132
|
-
* meaningfully frozen (functions, Promises, Errors).
|
|
133
|
-
*/
|
|
134
|
-
type SnapshotLeaf = Primitive | AnyFunction | Date | RegExp | Error | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | Promise<unknown>;
|
|
135
|
-
/**
|
|
136
|
-
* Recursively converts an object type to a deeply readonly version.
|
|
137
|
-
* Leaf types (primitives, Date, Map, etc.) pass through unchanged.
|
|
138
|
-
*/
|
|
139
|
-
type Snapshot<T> = T extends SnapshotLeaf ? T : T extends Array<infer U> ? ReadonlyArray<Snapshot<U>> : T extends object ? { readonly [K in keyof T]: Snapshot<T[K]> } : T;
|
|
140
|
-
//#endregion
|
|
141
|
-
//#region src/core.d.ts
|
|
109
|
+
//#region src/core/core.d.ts
|
|
142
110
|
/**
|
|
143
111
|
* Wraps a class instance in a reactive proxy.
|
|
144
112
|
*
|
|
@@ -150,13 +118,18 @@ type Snapshot<T> = T extends SnapshotLeaf ? T : T extends Array<infer U> ? Reado
|
|
|
150
118
|
*
|
|
151
119
|
* @param instance - A class instance (or plain object) to make reactive.
|
|
152
120
|
* @returns The same object wrapped in a reactive Proxy.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* const myStore = createClassyStore(new MyClass());
|
|
125
|
+
* ```
|
|
153
126
|
*/
|
|
154
|
-
declare function
|
|
127
|
+
declare function createClassyStore<T extends object>(instance: T): T;
|
|
155
128
|
/**
|
|
156
129
|
* Subscribe to store changes. The callback fires once per batched mutation
|
|
157
130
|
* (coalesced via `queueMicrotask`), not once per individual property write.
|
|
158
131
|
*
|
|
159
|
-
* @param proxy - A reactive proxy created by `
|
|
132
|
+
* @param proxy - A reactive proxy created by `createClassyStore()`.
|
|
160
133
|
* @param callback - Invoked after each batched mutation.
|
|
161
134
|
* @returns An unsubscribe function. Call it to stop receiving notifications.
|
|
162
135
|
*/
|
|
@@ -170,7 +143,7 @@ declare function subscribe(proxy: object, callback: () => void): () => void;
|
|
|
170
143
|
*/
|
|
171
144
|
declare function getVersion(proxy: object): number;
|
|
172
145
|
//#endregion
|
|
173
|
-
//#region src/snapshot.d.ts
|
|
146
|
+
//#region src/snapshot/snapshot.d.ts
|
|
174
147
|
/**
|
|
175
148
|
* Creates an immutable, deeply-frozen snapshot of the store proxy's current state.
|
|
176
149
|
*
|
|
@@ -184,32 +157,21 @@ declare function getVersion(proxy: object): number;
|
|
|
184
157
|
* per snapshot and their results are stable across snapshots when dependencies
|
|
185
158
|
* haven't changed (cross-snapshot memoization).
|
|
186
159
|
*
|
|
187
|
-
* @param proxyStore - A reactive proxy created by `
|
|
160
|
+
* @param proxyStore - A reactive proxy created by `createClassyStore()`.
|
|
188
161
|
* @returns A deeply frozen plain-JS object (Snapshot<T>).
|
|
189
162
|
*/
|
|
190
163
|
declare function snapshot<T extends object>(proxyStore: T): Snapshot<T>;
|
|
191
164
|
//#endregion
|
|
192
|
-
//#region src/
|
|
193
|
-
/**
|
|
194
|
-
* Subscribe to a store proxy with an explicit selector.
|
|
195
|
-
*
|
|
196
|
-
* Re-renders only when the selected value changes (compared via `Object.is`
|
|
197
|
-
* by default, or a custom `isEqual`).
|
|
198
|
-
*
|
|
199
|
-
* @param proxyStore - A reactive proxy created by `store()`.
|
|
200
|
-
* @param selector - Picks data from the immutable snapshot.
|
|
201
|
-
* @param isEqual - Optional custom equality function (default: `Object.is`).
|
|
202
|
-
*/
|
|
203
|
-
declare function useStore<T extends object, S>(proxyStore: T, selector: (snap: Snapshot<T>) => S, isEqual?: (a: S, b: S) => boolean): S;
|
|
165
|
+
//#region src/utils/equality/equality.d.ts
|
|
204
166
|
/**
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
* Returns a `proxy-compare` tracking proxy over the immutable snapshot.
|
|
208
|
-
* The component only re-renders when a property it actually read changes.
|
|
167
|
+
* Shallow-equal comparison for objects and arrays.
|
|
168
|
+
* Useful as a custom `isEqual` for `useStore` selectors that return objects/arrays.
|
|
209
169
|
*
|
|
210
|
-
*
|
|
170
|
+
* - Primitives compared with `Object.is`.
|
|
171
|
+
* - Arrays: length + element-wise `Object.is`.
|
|
172
|
+
* - Objects: key count + value-wise `Object.is`.
|
|
211
173
|
*/
|
|
212
|
-
declare function
|
|
174
|
+
declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
213
175
|
//#endregion
|
|
214
|
-
export { type ReactiveMap, type ReactiveSet, type Snapshot, getVersion, reactiveMap, reactiveSet, shallowEqual, snapshot,
|
|
176
|
+
export { type ReactiveMap, type ReactiveSet, type Snapshot, createClassyStore, getVersion, reactiveMap, reactiveSet, shallowEqual, snapshot, subscribe };
|
|
215
177
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/utils.ts","../src/collections
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/utils/internal/internal.ts","../src/collections/collections.ts","../src/core/core.ts","../src/snapshot/snapshot.ts","../src/utils/equality/equality.ts"],"mappings":";;;;;;AAOA;;cAAa,SAAA;;;;;AAAb;;;;;;;;ACUA;;;cAAa,WAAA;EAAA,QACH,SAAA;EAGM;EAAd,QAAA,GAAW,CAAA,EAAG,CAAA;EAGqB;cAAvB,OAAA,GAAU,QAAA,EAAU,CAAA,EAAG,CAAA;EAmB1B;EAAA,IALL,IAAA,CAAA;EAWK;EANT,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,CAAA;EAWM;EALnB,GAAA,CAAI,GAAA,EAAK,CAAA;EA6BgB;EAxBzB,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA;EA6BQ;EAlB3B,MAAA,CAAO,GAAA,EAAK,CAAA;EAuBiB;EAf7B,KAAA,CAAA;EAeW;EAVX,IAAA,CAAA,GAAQ,gBAAA,CAAiB,CAAA;EAeS;EAVlC,MAAA,CAAA,GAAU,gBAAA,CAAiB,CAAA;EAU8B;EALzD,OAAA,CAAA,GAAW,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAYO;EAPvC,OAAA,CAAQ,QAAA,GAAW,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,WAAA,CAAY,CAAA,EAAG,CAAA;EAOpC;EAAA,CAApB,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;AAAA;;;;;;;;;;;;;;cAoB/B,WAAA;EAAA,QACH,SAAA;EA9EJ;EAiFJ,MAAA,EAAQ,CAAA;EA3ER;cA8EY,OAAA,GAAU,QAAA,CAAS,CAAA;EA9E3B;EAAA,IAyFA,IAAA,CAAA;EApFK;EAyFT,GAAA,CAAI,KAAA,EAAO,CAAA;EAzFQ;EA8FnB,GAAA,CAAI,KAAA,EAAO,CAAA;EAnFX;EA2FA,MAAA,CAAO,KAAA,EAAO,CAAA;EA3FP;EAmGP,KAAA,CAAA;EAtFA;EA2FA,IAAA,CAAA,GAAQ,gBAAA,CAAiB,CAAA;EA3FA;EAgGzB,MAAA,CAAA,GAAU,gBAAA,CAAiB,CAAA;EA3FjB;EAgGV,OAAA,CAAA,GAAW,gBAAA,EAAkB,CAAA,EAAG,CAAA;EA3FhC;EAgGA,OAAA,CAAQ,QAAA,GAAW,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,WAAA,CAAY,CAAA;EAhGzB;EAAA,CAuG5B,MAAA,CAAO,QAAA,KAAa,gBAAA,CAAiB,CAAA;AAAA;;;;;;;iBAaxB,WAAA,MAAA,CACd,OAAA,GAAU,QAAA,EAAU,CAAA,EAAG,CAAA,KACtB,WAAA,CAAY,CAAA,EAAG,CAAA;;;;;;;iBAUF,WAAA,GAAA,CAAe,OAAA,GAAU,QAAA,CAAS,CAAA,IAAK,WAAA,CAAY,CAAA;;;;;;;;AAvMnE;;;;;;;;;;;;iBCiRgB,iBAAA,kBAAA,CAAoC,QAAA,EAAU,CAAA,GAAI,CAAA;;;;;;;;;iBAYlD,SAAA,CAAU,KAAA,UAAe,QAAA;;;;;;;;iBAkBzB,UAAA,CAAW,KAAA;;;;;AFzT3B;;;;;;;;ACUA;;;;;;iBEwUgB,QAAA,kBAAA,CAA2B,UAAA,EAAY,CAAA,GAAI,QAAA,CAAS,CAAA;;;;;;AHlVpE;;;;;iBICgB,YAAA,GAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { t as Snapshot } from "./types-vWYkF3tH.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/internal/internal.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Symbol that class instances can use to opt-in to deep proxying.
|
|
4
6
|
* Classes with `static [PROXYABLE] = true` will be wrapped by the store proxy
|
|
5
7
|
* just like plain objects, enabling nested reactivity.
|
|
6
8
|
*/
|
|
7
9
|
declare const PROXYABLE: unique symbol;
|
|
8
|
-
/**
|
|
9
|
-
* Shallow-equal comparison for objects and arrays.
|
|
10
|
-
* Useful as a custom `isEqual` for `useStore` selectors that return objects/arrays.
|
|
11
|
-
*
|
|
12
|
-
* - Primitives compared with `Object.is`.
|
|
13
|
-
* - Arrays: length + element-wise `Object.is`.
|
|
14
|
-
* - Objects: key count + value-wise `Object.is`.
|
|
15
|
-
*/
|
|
16
|
-
declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
17
10
|
//#endregion
|
|
18
|
-
//#region src/collections.d.ts
|
|
11
|
+
//#region src/collections/collections.d.ts
|
|
19
12
|
/**
|
|
20
|
-
* A Map-like class backed by a plain array so `
|
|
13
|
+
* A Map-like class backed by a plain array so `createClassyStore()` can proxy mutations.
|
|
21
14
|
*
|
|
22
15
|
* Native `Map` uses internal slots that ES6 Proxy can't intercept, so mutations
|
|
23
16
|
* like `.set()` would be invisible to the store. `ReactiveMap` solves this by
|
|
@@ -25,7 +18,7 @@ declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
|
25
18
|
*
|
|
26
19
|
* Usage:
|
|
27
20
|
* ```ts
|
|
28
|
-
* const myStore =
|
|
21
|
+
* const myStore = createClassyStore({ users: reactiveMap<string, User>() });
|
|
29
22
|
* myStore.users.set('id1', { name: 'Alice' }); // reactive
|
|
30
23
|
* ```
|
|
31
24
|
*/
|
|
@@ -59,7 +52,7 @@ declare class ReactiveMap<K, V> {
|
|
|
59
52
|
[Symbol.iterator](): IterableIterator<[K, V]>;
|
|
60
53
|
}
|
|
61
54
|
/**
|
|
62
|
-
* A Set-like class backed by a plain array so `
|
|
55
|
+
* A Set-like class backed by a plain array so `createClassyStore()` can proxy mutations.
|
|
63
56
|
*
|
|
64
57
|
* Native `Set` uses internal slots that ES6 Proxy can't intercept, so mutations
|
|
65
58
|
* like `.add()` would be invisible to the store. `ReactiveSet` solves this by
|
|
@@ -67,7 +60,7 @@ declare class ReactiveMap<K, V> {
|
|
|
67
60
|
*
|
|
68
61
|
* Usage:
|
|
69
62
|
* ```ts
|
|
70
|
-
* const myStore =
|
|
63
|
+
* const myStore = createClassyStore({ tags: reactiveSet<string>(['urgent']) });
|
|
71
64
|
* myStore.tags.add('bug'); // reactive
|
|
72
65
|
* ```
|
|
73
66
|
*/
|
|
@@ -100,45 +93,20 @@ declare class ReactiveSet<T> {
|
|
|
100
93
|
}
|
|
101
94
|
/**
|
|
102
95
|
* Creates a reactive Map-like collection backed by a plain array.
|
|
103
|
-
* Wrap the parent object with `
|
|
96
|
+
* Wrap the parent object with `createClassyStore()` for full reactivity.
|
|
104
97
|
*
|
|
105
98
|
* @param initial - Optional iterable of `[key, value]` pairs.
|
|
106
99
|
*/
|
|
107
100
|
declare function reactiveMap<K, V>(initial?: Iterable<[K, V]>): ReactiveMap<K, V>;
|
|
108
101
|
/**
|
|
109
102
|
* Creates a reactive Set-like collection backed by a plain array.
|
|
110
|
-
* Wrap the parent object with `
|
|
103
|
+
* Wrap the parent object with `createClassyStore()` for full reactivity.
|
|
111
104
|
*
|
|
112
105
|
* @param initial - Optional iterable of values.
|
|
113
106
|
*/
|
|
114
107
|
declare function reactiveSet<T>(initial?: Iterable<T>): ReactiveSet<T>;
|
|
115
108
|
//#endregion
|
|
116
|
-
//#region src/
|
|
117
|
-
/**
|
|
118
|
-
* Primitive types that should not be proxied or snapshot-cloned.
|
|
119
|
-
* Used by `Snapshot<T>` to identify leaf types that pass through unchanged.
|
|
120
|
-
*/
|
|
121
|
-
type Primitive = string | number | boolean | null | undefined | symbol | bigint;
|
|
122
|
-
/**
|
|
123
|
-
* Function type shorthand.
|
|
124
|
-
* Functions are treated as snapshot leaves -- they pass through unchanged
|
|
125
|
-
* because freezing or cloning them would break callable references.
|
|
126
|
-
*/
|
|
127
|
-
type AnyFunction = (...args: unknown[]) => unknown;
|
|
128
|
-
/**
|
|
129
|
-
* Types that `snapshot()` returns as-is (no deep clone or freeze).
|
|
130
|
-
* These are either already immutable-ish (Date, RegExp), use internal slots
|
|
131
|
-
* that proxies can't intercept (Map, Set, WeakMap, WeakSet), or can't be
|
|
132
|
-
* meaningfully frozen (functions, Promises, Errors).
|
|
133
|
-
*/
|
|
134
|
-
type SnapshotLeaf = Primitive | AnyFunction | Date | RegExp | Error | Map<unknown, unknown> | Set<unknown> | WeakMap<object, unknown> | WeakSet<object> | Promise<unknown>;
|
|
135
|
-
/**
|
|
136
|
-
* Recursively converts an object type to a deeply readonly version.
|
|
137
|
-
* Leaf types (primitives, Date, Map, etc.) pass through unchanged.
|
|
138
|
-
*/
|
|
139
|
-
type Snapshot<T> = T extends SnapshotLeaf ? T : T extends Array<infer U> ? ReadonlyArray<Snapshot<U>> : T extends object ? { readonly [K in keyof T]: Snapshot<T[K]> } : T;
|
|
140
|
-
//#endregion
|
|
141
|
-
//#region src/core.d.ts
|
|
109
|
+
//#region src/core/core.d.ts
|
|
142
110
|
/**
|
|
143
111
|
* Wraps a class instance in a reactive proxy.
|
|
144
112
|
*
|
|
@@ -150,13 +118,18 @@ type Snapshot<T> = T extends SnapshotLeaf ? T : T extends Array<infer U> ? Reado
|
|
|
150
118
|
*
|
|
151
119
|
* @param instance - A class instance (or plain object) to make reactive.
|
|
152
120
|
* @returns The same object wrapped in a reactive Proxy.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* const myStore = createClassyStore(new MyClass());
|
|
125
|
+
* ```
|
|
153
126
|
*/
|
|
154
|
-
declare function
|
|
127
|
+
declare function createClassyStore<T extends object>(instance: T): T;
|
|
155
128
|
/**
|
|
156
129
|
* Subscribe to store changes. The callback fires once per batched mutation
|
|
157
130
|
* (coalesced via `queueMicrotask`), not once per individual property write.
|
|
158
131
|
*
|
|
159
|
-
* @param proxy - A reactive proxy created by `
|
|
132
|
+
* @param proxy - A reactive proxy created by `createClassyStore()`.
|
|
160
133
|
* @param callback - Invoked after each batched mutation.
|
|
161
134
|
* @returns An unsubscribe function. Call it to stop receiving notifications.
|
|
162
135
|
*/
|
|
@@ -170,7 +143,7 @@ declare function subscribe(proxy: object, callback: () => void): () => void;
|
|
|
170
143
|
*/
|
|
171
144
|
declare function getVersion(proxy: object): number;
|
|
172
145
|
//#endregion
|
|
173
|
-
//#region src/snapshot.d.ts
|
|
146
|
+
//#region src/snapshot/snapshot.d.ts
|
|
174
147
|
/**
|
|
175
148
|
* Creates an immutable, deeply-frozen snapshot of the store proxy's current state.
|
|
176
149
|
*
|
|
@@ -184,32 +157,21 @@ declare function getVersion(proxy: object): number;
|
|
|
184
157
|
* per snapshot and their results are stable across snapshots when dependencies
|
|
185
158
|
* haven't changed (cross-snapshot memoization).
|
|
186
159
|
*
|
|
187
|
-
* @param proxyStore - A reactive proxy created by `
|
|
160
|
+
* @param proxyStore - A reactive proxy created by `createClassyStore()`.
|
|
188
161
|
* @returns A deeply frozen plain-JS object (Snapshot<T>).
|
|
189
162
|
*/
|
|
190
163
|
declare function snapshot<T extends object>(proxyStore: T): Snapshot<T>;
|
|
191
164
|
//#endregion
|
|
192
|
-
//#region src/
|
|
193
|
-
/**
|
|
194
|
-
* Subscribe to a store proxy with an explicit selector.
|
|
195
|
-
*
|
|
196
|
-
* Re-renders only when the selected value changes (compared via `Object.is`
|
|
197
|
-
* by default, or a custom `isEqual`).
|
|
198
|
-
*
|
|
199
|
-
* @param proxyStore - A reactive proxy created by `store()`.
|
|
200
|
-
* @param selector - Picks data from the immutable snapshot.
|
|
201
|
-
* @param isEqual - Optional custom equality function (default: `Object.is`).
|
|
202
|
-
*/
|
|
203
|
-
declare function useStore<T extends object, S>(proxyStore: T, selector: (snap: Snapshot<T>) => S, isEqual?: (a: S, b: S) => boolean): S;
|
|
165
|
+
//#region src/utils/equality/equality.d.ts
|
|
204
166
|
/**
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
* Returns a `proxy-compare` tracking proxy over the immutable snapshot.
|
|
208
|
-
* The component only re-renders when a property it actually read changes.
|
|
167
|
+
* Shallow-equal comparison for objects and arrays.
|
|
168
|
+
* Useful as a custom `isEqual` for `useStore` selectors that return objects/arrays.
|
|
209
169
|
*
|
|
210
|
-
*
|
|
170
|
+
* - Primitives compared with `Object.is`.
|
|
171
|
+
* - Arrays: length + element-wise `Object.is`.
|
|
172
|
+
* - Objects: key count + value-wise `Object.is`.
|
|
211
173
|
*/
|
|
212
|
-
declare function
|
|
174
|
+
declare function shallowEqual<T>(a: T, b: T): boolean;
|
|
213
175
|
//#endregion
|
|
214
|
-
export { type ReactiveMap, type ReactiveSet, type Snapshot, getVersion, reactiveMap, reactiveSet, shallowEqual, snapshot,
|
|
176
|
+
export { type ReactiveMap, type ReactiveSet, type Snapshot, createClassyStore, getVersion, reactiveMap, reactiveSet, shallowEqual, snapshot, subscribe };
|
|
215
177
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/utils.ts","../src/collections
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/utils/internal/internal.ts","../src/collections/collections.ts","../src/core/core.ts","../src/snapshot/snapshot.ts","../src/utils/equality/equality.ts"],"mappings":";;;;;;AAOA;;cAAa,SAAA;;;;;AAAb;;;;;;;;ACUA;;;cAAa,WAAA;EAAA,QACH,SAAA;EAGM;EAAd,QAAA,GAAW,CAAA,EAAG,CAAA;EAGqB;cAAvB,OAAA,GAAU,QAAA,EAAU,CAAA,EAAG,CAAA;EAmB1B;EAAA,IALL,IAAA,CAAA;EAWK;EANT,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,CAAA;EAWM;EALnB,GAAA,CAAI,GAAA,EAAK,CAAA;EA6BgB;EAxBzB,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA;EA6BQ;EAlB3B,MAAA,CAAO,GAAA,EAAK,CAAA;EAuBiB;EAf7B,KAAA,CAAA;EAeW;EAVX,IAAA,CAAA,GAAQ,gBAAA,CAAiB,CAAA;EAeS;EAVlC,MAAA,CAAA,GAAU,gBAAA,CAAiB,CAAA;EAU8B;EALzD,OAAA,CAAA,GAAW,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAYO;EAPvC,OAAA,CAAQ,QAAA,GAAW,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,WAAA,CAAY,CAAA,EAAG,CAAA;EAOpC;EAAA,CAApB,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;AAAA;;;;;;;;;;;;;;cAoB/B,WAAA;EAAA,QACH,SAAA;EA9EJ;EAiFJ,MAAA,EAAQ,CAAA;EA3ER;cA8EY,OAAA,GAAU,QAAA,CAAS,CAAA;EA9E3B;EAAA,IAyFA,IAAA,CAAA;EApFK;EAyFT,GAAA,CAAI,KAAA,EAAO,CAAA;EAzFQ;EA8FnB,GAAA,CAAI,KAAA,EAAO,CAAA;EAnFX;EA2FA,MAAA,CAAO,KAAA,EAAO,CAAA;EA3FP;EAmGP,KAAA,CAAA;EAtFA;EA2FA,IAAA,CAAA,GAAQ,gBAAA,CAAiB,CAAA;EA3FA;EAgGzB,MAAA,CAAA,GAAU,gBAAA,CAAiB,CAAA;EA3FjB;EAgGV,OAAA,CAAA,GAAW,gBAAA,EAAkB,CAAA,EAAG,CAAA;EA3FhC;EAgGA,OAAA,CAAQ,QAAA,GAAW,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,WAAA,CAAY,CAAA;EAhGzB;EAAA,CAuG5B,MAAA,CAAO,QAAA,KAAa,gBAAA,CAAiB,CAAA;AAAA;;;;;;;iBAaxB,WAAA,MAAA,CACd,OAAA,GAAU,QAAA,EAAU,CAAA,EAAG,CAAA,KACtB,WAAA,CAAY,CAAA,EAAG,CAAA;;;;;;;iBAUF,WAAA,GAAA,CAAe,OAAA,GAAU,QAAA,CAAS,CAAA,IAAK,WAAA,CAAY,CAAA;;;;;;;;AAvMnE;;;;;;;;;;;;iBCiRgB,iBAAA,kBAAA,CAAoC,QAAA,EAAU,CAAA,GAAI,CAAA;;;;;;;;;iBAYlD,SAAA,CAAU,KAAA,UAAe,QAAA;;;;;;;;iBAkBzB,UAAA,CAAW,KAAA;;;;;AFzT3B;;;;;;;;ACUA;;;;;;iBEwUgB,QAAA,kBAAA,CAA2B,UAAA,EAAY,CAAA,GAAI,QAAA,CAAS,CAAA;;;;;;AHlVpE;;;;;iBICgB,YAAA,GAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA"}
|