cross-state 1.9.8 → 1.9.10
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/mutative/register.cjs.map +1 -1
- package/dist/mutative/register.d.cts +1 -1
- package/dist/mutative/register.d.ts +1 -1
- package/dist/mutative/register.js.map +1 -1
- package/dist/patchMethods-BBQDDqwe.cjs.map +1 -1
- package/dist/{patchMethods-R3f7HxTy.d.cts → patchMethods-Bfu4UYG7.d.cts} +2 -2
- package/dist/{patchMethods--ekCkYUF.d.ts → patchMethods-CEUdeSb_.d.ts} +2 -2
- package/dist/patchMethods-D3cdG80W.js.map +1 -1
- package/dist/patches/index.d.cts +1 -1
- package/dist/patches/index.d.ts +1 -1
- package/dist/patches/register.cjs.map +1 -1
- package/dist/patches/register.d.cts +2 -2
- package/dist/patches/register.d.ts +2 -2
- package/dist/patches/register.js.map +1 -1
- package/dist/persist/register.cjs.map +1 -1
- package/dist/persist/register.d.cts +1 -1
- package/dist/persist/register.d.ts +1 -1
- package/dist/persist/register.js.map +1 -1
- package/dist/react/index.d.cts +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/register.cjs.map +1 -1
- package/dist/react/register.d.cts +2 -2
- package/dist/react/register.d.ts +2 -2
- package/dist/react/register.js.map +1 -1
- package/dist/storeMethods-DYgUGHSk.cjs.map +1 -1
- package/dist/{storeMethods-DrMQ7hqX.d.cts → storeMethods-DlScpjKj.d.cts} +2 -2
- package/dist/{storeMethods-CYX3AAnA.d.ts → storeMethods-M7KjCOHg.d.ts} +2 -2
- package/dist/storeMethods-pGlt0zfb.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.cjs","names":["Store","mutativeMethods","autobind"],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.cjs","names":["Store","mutativeMethods","autobind"],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC,uCAAe;AAC9CC,uBAASF,mBAAK"}
|
|
@@ -2,7 +2,7 @@ import { n as mutativeMethods } from "../mutativeMethods-BHPlSHBi.cjs";
|
|
|
2
2
|
|
|
3
3
|
//#region src/mutative/register.d.ts
|
|
4
4
|
type MutativeMethods = typeof mutativeMethods;
|
|
5
|
-
declare module "
|
|
5
|
+
declare module ".." {
|
|
6
6
|
interface Store<T> extends MutativeMethods {}
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=register.d.cts.map
|
|
@@ -2,7 +2,7 @@ import { n as mutativeMethods } from "../mutativeMethods-COQxFB3B.js";
|
|
|
2
2
|
|
|
3
3
|
//#region src/mutative/register.d.ts
|
|
4
4
|
type MutativeMethods = typeof mutativeMethods;
|
|
5
|
-
declare module "
|
|
5
|
+
declare module ".." {
|
|
6
6
|
interface Store<T> extends MutativeMethods {}
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","names":[],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.js","names":[],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAO,MAAM,WAAW,eAAe;AAC9C,SAAS,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchMethods-BBQDDqwe.cjs","names":["remove","set","applyPatches","diff","_applyPatches","toExtendedJson","fromExtendedJson"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"patchMethods-BBQDDqwe.cjs","names":["remove","set","applyPatches","diff","_applyPatches","toExtendedJson","fromExtendedJson"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ interface SyncMessage {
|
|
|
10
10
|
interface HistoryEntry extends SyncMessage {
|
|
11
11
|
reversePatches: Patch[];
|
|
12
12
|
}
|
|
13
|
-
declare module "
|
|
13
|
+
declare module ".." {
|
|
14
14
|
interface Store<T> {
|
|
15
15
|
__patches?: {
|
|
16
16
|
value: T;
|
|
@@ -45,4 +45,4 @@ declare const patchMethods: {
|
|
|
45
45
|
};
|
|
46
46
|
//#endregion
|
|
47
47
|
export { SyncMessage as n, patchMethods as r, SubscribePatchOptions as t };
|
|
48
|
-
//# sourceMappingURL=patchMethods-
|
|
48
|
+
//# sourceMappingURL=patchMethods-Bfu4UYG7.d.cts.map
|
|
@@ -10,7 +10,7 @@ interface SyncMessage {
|
|
|
10
10
|
interface HistoryEntry extends SyncMessage {
|
|
11
11
|
reversePatches: Patch[];
|
|
12
12
|
}
|
|
13
|
-
declare module "
|
|
13
|
+
declare module ".." {
|
|
14
14
|
interface Store<T> {
|
|
15
15
|
__patches?: {
|
|
16
16
|
value: T;
|
|
@@ -45,4 +45,4 @@ declare const patchMethods: {
|
|
|
45
45
|
};
|
|
46
46
|
//#endregion
|
|
47
47
|
export { SyncMessage as n, patchMethods as r, SubscribePatchOptions as t };
|
|
48
|
-
//# sourceMappingURL=patchMethods
|
|
48
|
+
//# sourceMappingURL=patchMethods-CEUdeSb_.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchMethods-D3cdG80W.js","names":["applyPatches","_applyPatches"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"patchMethods-D3cdG80W.js","names":["applyPatches","_applyPatches"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
|
package/dist/patches/index.d.cts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods-
|
|
1
|
+
import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods-Bfu4UYG7.cjs";
|
|
2
2
|
export { type SubscribePatchOptions, type SyncMessage, patchMethods };
|
package/dist/patches/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods
|
|
1
|
+
import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods-CEUdeSb_.js";
|
|
2
2
|
export { type SubscribePatchOptions, type SyncMessage, patchMethods };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.cjs","names":["Store","patchMethods","autobind"],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { patchMethods } from './patchMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.cjs","names":["Store","patchMethods","autobind"],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { patchMethods } from './patchMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC,iCAAY;AAC3CC,uBAASF,mBAAK"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { r as patchMethods } from "../patchMethods-
|
|
1
|
+
import { r as patchMethods } from "../patchMethods-Bfu4UYG7.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/patches/register.d.ts
|
|
4
4
|
type PatchMethods = typeof patchMethods;
|
|
5
|
-
declare module "
|
|
5
|
+
declare module ".." {
|
|
6
6
|
interface Store<T> extends PatchMethods {}
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=register.d.cts.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { r as patchMethods } from "../patchMethods
|
|
1
|
+
import { r as patchMethods } from "../patchMethods-CEUdeSb_.js";
|
|
2
2
|
|
|
3
3
|
//#region src/patches/register.d.ts
|
|
4
4
|
type PatchMethods = typeof patchMethods;
|
|
5
|
-
declare module "
|
|
5
|
+
declare module ".." {
|
|
6
6
|
interface Store<T> extends PatchMethods {}
|
|
7
7
|
}
|
|
8
8
|
//# sourceMappingURL=register.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","names":[],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { patchMethods } from './patchMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.js","names":[],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { patchMethods } from './patchMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAO,MAAM,WAAW,YAAY;AAC3C,SAAS,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.cjs","names":["Store","persist"],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.cjs","names":["Store","persist"],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"mappings":";;;;AAcAA,oBAAM,SAAS,UAAU;CACvB,IAAI,MAAM,QAAQ,SAChB,MAAM,cAAcC,wBAAQ,OAAO,MAAM,QAAQ,OAAO;AAE5D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","names":[],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.js","names":[],"sources":["../../src/persist/register.ts"],"sourcesContent":["import { Store } from '@core';\nimport { persist, type Persist, type PersistOptions } from '@persist/persist';\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface StoreOptions<T> {\n persist?: PersistOptions<T>;\n }\n\n interface Store<T> {\n persistance?: Persist<T>;\n }\n}\n\nStore.addHook((store) => {\n if (store.options.persist) {\n store.persistance = persist(store, store.options.persist);\n }\n});\n"],"mappings":";;;;AAcA,MAAM,SAAS,UAAU;CACvB,IAAI,MAAM,QAAQ,SAChB,MAAM,cAAc,QAAQ,OAAO,MAAM,QAAQ,OAAO;AAE5D,CAAC"}
|
package/dist/react/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as Selector, C as Value, D as Object_, E as WildcardValue, H as Update, K as MaybePromise, L as Duration, O as Constrain, T as WildcardPathAsString, g as Path$1, m as Join, p as GetKeys, r as Store, v as PathAsString, y as SettablePath } from "../store-dThvqc0k.cjs";
|
|
2
|
-
import { a as useScope, c as UseCacheValue, d as useStore, i as ScopeProvider, l as useCache, n as scopeMethods, o as cacheMethods, r as ScopeProps, s as UseCacheArray, t as storeMethods, u as UseStoreOptions } from "../storeMethods-
|
|
2
|
+
import { a as useScope, c as UseCacheValue, d as useStore, i as ScopeProvider, l as useCache, n as scopeMethods, o as cacheMethods, r as ScopeProps, s as UseCacheArray, t as storeMethods, u as UseStoreOptions } from "../storeMethods-DlScpjKj.cjs";
|
|
3
3
|
import { Draft } from "mutative";
|
|
4
4
|
import { Component, ComponentPropsWithoutRef, Context, FormEvent, FunctionComponent, HTMLProps, ReactNode } from "react";
|
|
5
5
|
|
package/dist/react/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { B as Selector, C as Value, D as Object_, E as WildcardValue, H as Update, K as MaybePromise, L as Duration, O as Constrain, T as WildcardPathAsString, g as Path$1, m as Join, p as GetKeys, r as Store, v as PathAsString, y as SettablePath } from "../store-dThvqc0k.js";
|
|
2
|
-
import { a as useScope, c as UseCacheValue, d as useStore, i as ScopeProvider, l as useCache, n as scopeMethods, o as cacheMethods, r as ScopeProps, s as UseCacheArray, t as storeMethods, u as UseStoreOptions } from "../storeMethods-
|
|
2
|
+
import { a as useScope, c as UseCacheValue, d as useStore, i as ScopeProvider, l as useCache, n as scopeMethods, o as cacheMethods, r as ScopeProps, s as UseCacheArray, t as storeMethods, u as UseStoreOptions } from "../storeMethods-M7KjCOHg.js";
|
|
3
3
|
import { Component, ComponentPropsWithoutRef, Context, FormEvent, FunctionComponent, HTMLProps, ReactNode } from "react";
|
|
4
4
|
import { Draft } from "mutative";
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.cjs","names":["Store","storeMethods","autobind","Cache","cacheMethods","Scope","scopeMethods"],"sources":["../../src/react/register.ts"],"sourcesContent":["import { storeMethods } from './storeMethods';\nimport { Cache, Scope, Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { cacheMethods } from '@react/cacheMethods';\nimport { scopeMethods } from '@react/scopeMethods';\n\ntype StoreMethods = typeof storeMethods;\ntype CacheMethods = typeof cacheMethods;\ntype ScopeMethods = typeof scopeMethods;\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.cjs","names":["Store","storeMethods","autobind","Cache","cacheMethods","Scope","scopeMethods"],"sources":["../../src/react/register.ts"],"sourcesContent":["import { storeMethods } from './storeMethods';\nimport { Cache, Scope, Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { cacheMethods } from '@react/cacheMethods';\nimport { scopeMethods } from '@react/scopeMethods';\n\ntype StoreMethods = typeof storeMethods;\ntype CacheMethods = typeof cacheMethods;\ntype ScopeMethods = typeof scopeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends StoreMethods {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Cache<T> extends CacheMethods {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Scope<T> extends ScopeMethods {}\n}\n\nObject.assign(Store.prototype, storeMethods);\nautobind(Store);\n\nObject.assign(Cache.prototype, cacheMethods);\nautobind(Cache);\n\nObject.assign(Scope.prototype, scopeMethods);\nautobind(Scope);\n"],"mappings":";;;;;AAqBA,OAAO,OAAOA,oBAAM,WAAWC,iCAAY;AAC3CC,uBAASF,mBAAK;AAEd,OAAO,OAAOG,oBAAM,WAAWC,iCAAY;AAC3CF,uBAASC,mBAAK;AAEd,OAAO,OAAOE,oBAAM,WAAWC,iCAAY;AAC3CJ,uBAASG,mBAAK"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as scopeMethods, o as cacheMethods, t as storeMethods } from "../storeMethods-
|
|
1
|
+
import { n as scopeMethods, o as cacheMethods, t as storeMethods } from "../storeMethods-DlScpjKj.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/react/register.d.ts
|
|
4
4
|
type StoreMethods = typeof storeMethods;
|
|
5
5
|
type CacheMethods = typeof cacheMethods;
|
|
6
6
|
type ScopeMethods = typeof scopeMethods;
|
|
7
|
-
declare module "
|
|
7
|
+
declare module ".." {
|
|
8
8
|
interface Store<T> extends StoreMethods {}
|
|
9
9
|
interface Cache<T> extends CacheMethods {}
|
|
10
10
|
interface Scope<T> extends ScopeMethods {}
|
package/dist/react/register.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as scopeMethods, o as cacheMethods, t as storeMethods } from "../storeMethods-
|
|
1
|
+
import { n as scopeMethods, o as cacheMethods, t as storeMethods } from "../storeMethods-M7KjCOHg.js";
|
|
2
2
|
|
|
3
3
|
//#region src/react/register.d.ts
|
|
4
4
|
type StoreMethods = typeof storeMethods;
|
|
5
5
|
type CacheMethods = typeof cacheMethods;
|
|
6
6
|
type ScopeMethods = typeof scopeMethods;
|
|
7
|
-
declare module "
|
|
7
|
+
declare module ".." {
|
|
8
8
|
interface Store<T> extends StoreMethods {}
|
|
9
9
|
interface Cache<T> extends CacheMethods {}
|
|
10
10
|
interface Scope<T> extends ScopeMethods {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","names":[],"sources":["../../src/react/register.ts"],"sourcesContent":["import { storeMethods } from './storeMethods';\nimport { Cache, Scope, Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { cacheMethods } from '@react/cacheMethods';\nimport { scopeMethods } from '@react/scopeMethods';\n\ntype StoreMethods = typeof storeMethods;\ntype CacheMethods = typeof cacheMethods;\ntype ScopeMethods = typeof scopeMethods;\n\ndeclare module '
|
|
1
|
+
{"version":3,"file":"register.js","names":[],"sources":["../../src/react/register.ts"],"sourcesContent":["import { storeMethods } from './storeMethods';\nimport { Cache, Scope, Store } from '@core';\nimport { autobind } from '@lib/autobind';\nimport { cacheMethods } from '@react/cacheMethods';\nimport { scopeMethods } from '@react/scopeMethods';\n\ntype StoreMethods = typeof storeMethods;\ntype CacheMethods = typeof cacheMethods;\ntype ScopeMethods = typeof scopeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends StoreMethods {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Cache<T> extends CacheMethods {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Scope<T> extends ScopeMethods {}\n}\n\nObject.assign(Store.prototype, storeMethods);\nautobind(Store);\n\nObject.assign(Cache.prototype, cacheMethods);\nautobind(Cache);\n\nObject.assign(Scope.prototype, scopeMethods);\nautobind(Scope);\n"],"mappings":";;;;;AAqBA,OAAO,OAAO,MAAM,WAAW,YAAY;AAC3C,SAAS,KAAK;AAEd,OAAO,OAAO,MAAM,WAAW,YAAY;AAC3C,SAAS,KAAK;AAEd,OAAO,OAAO,MAAM,WAAW,YAAY;AAC3C,SAAS,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeMethods-DYgUGHSk.cjs","names":["deepEqual","isPlainObject","deepEqual","isAnyPath","makeSelector","deepEqual","strictEqual","createStore","makeSelector","isAnyPath","createStore"],"sources":["../src/lib/trackingProxy.ts","../src/react/lib/useMemoEquals.ts","../src/react/useStore.ts","../src/react/loadingBoundary.tsx","../src/react/useCache.ts","../src/react/cacheMethods.ts","../src/react/lib/useLatestRef.ts","../src/react/lib/useLatestFunction.ts","../src/react/useProp.ts","../src/react/scope.tsx","../src/react/scopeMethods.ts","../src/react/storeMethods.ts"],"sourcesContent":["import { deepEqual } from './equals';\nimport { isPlainObject } from '@lib/helpers';\n\nconst unwrapProxySymbol = /* @__PURE__ */ Symbol('unwrapProxy');\n\nexport type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean, revoke?: () => void];\ntype Object_ = Record<string | symbol, unknown>;\n\nexport function trackingProxy<T>(\n value: T,\n equals: (a: any, b: any) => boolean = deepEqual,\n): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => equals(value, other)];\n }\n\n // Unpack proxies, we don't want to nest them\n value = (value as any)[unwrapProxySymbol] ?? value;\n\n const deps = new Array<TrackingProxy<any>[1]>();\n const revokations = new Array<() => void>();\n let revoked = false;\n\n function trackComplexProp(function_: any, ...args: any[]) {\n const [proxiedValue, equals, revoke] = trackingProxy(function_(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(function_(otherValue, ...args));\n });\n\n if (revoke) {\n revokations.push(revoke);\n }\n\n return proxiedValue;\n }\n\n function trackSimpleProp(function_: any, ...args: any[]) {\n const calculatedValue = function_(value, ...args);\n\n deps.push((otherValue) => {\n return function_(otherValue, ...args) === calculatedValue;\n });\n\n return calculatedValue;\n }\n\n const proxy = new Proxy(value as T & Object_, {\n get(target, p, receiver) {\n if (p === unwrapProxySymbol) {\n return value;\n }\n\n if (revoked) {\n return target[p];\n }\n\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return target[p];\n }\n\n return trackComplexProp(Reflect.get, p, receiver);\n },\n\n getOwnPropertyDescriptor(target, p) {\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return Reflect.getOwnPropertyDescriptor(target, p);\n }\n\n return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);\n },\n\n ownKeys() {\n return trackComplexProp(Reflect.ownKeys);\n },\n\n getPrototypeOf() {\n return trackSimpleProp(Reflect.getPrototypeOf);\n },\n\n has(_target, p) {\n return trackSimpleProp(Reflect.has, p);\n },\n\n isExtensible() {\n return trackSimpleProp(Reflect.isExtensible);\n },\n });\n\n return [\n proxy,\n (other) => !!other && deps.every((equals) => equals(other)),\n () => {\n revoked = true;\n revokations.forEach((revoke) => revoke());\n },\n ];\n}\n","import { deepEqual } from '@lib/equals';\nimport { useEffect, useRef } from 'react';\n\nexport default function useMemoEquals<T>(value: T, equals: (a: T, b: T) => boolean = deepEqual): T {\n const ref = useRef<{ value: T }>(undefined);\n const hasChanged = !ref.current || !equals(ref.current.value, value);\n\n useEffect(() => {\n if (hasChanged) {\n ref.current = { value };\n }\n });\n\n return hasChanged ? value : ref.current!.value;\n}\n","import type { Selector, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual, strictEqual } from '@lib/equals';\nimport { makeSelector } from '@lib/makeSelector';\nimport { isAnyPath, type AnyPath, type Path, type Value } from '@lib/path';\nimport { trackingProxy } from '@lib/trackingProxy';\nimport useMemoEquals from '@react/lib/useMemoEquals';\nimport {\n useCallback,\n useDebugValue,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\nexport interface UseStoreOptions<T> extends Omit<SubscribeOptions, 'runNow' | 'passive'> {\n /**\n * If true, the cache content can be consumed but no fetch will be triggered.\n * @default false\n */\n\n passive?: boolean;\n\n /**\n * (experimental) If true, the a rerender will only be triggered when a property of the returned value changes that was\n * actually accessed during the last render.\n * @default false\n */\n enableTrackingProxy?: boolean;\n\n /**\n * (experimental) If provided, a rerender will be wrapped in a browser view transition.\n */\n withViewTransition?: boolean | ((value: T) => unknown);\n}\n\nexport interface UseStoreOptionsWithSelector<T, S> extends UseStoreOptions<S> {\n /**\n * Equality function to compare the raw store values before reevaluating the selector.\n * Can be used to avoid unnecessary selector evaluations.\n * @default strictEqual\n */\n storeValueEquals?: (newValue: T, oldValue: T) => boolean;\n}\n\nexport function useStore<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptionsWithSelector<T, S>,\n): S;\n\nexport function useStore<T, const P>(\n store: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptionsWithSelector<T, Value<T, P>>,\n): Value<T, P>;\n\nexport function useStore<T>(store: Store<T>, option?: UseStoreOptions<T>): T;\n\nexport function useStore<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S> | AnyPath, UseStoreOptionsWithSelector<T, S>?]\n | [UseStoreOptionsWithSelector<T, S>?]\n): S {\n let selectorRaw: Selector<T, S> | AnyPath | undefined;\n let allOptions: UseStoreOptionsWithSelector<T, S>;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selectorRaw = args[0];\n allOptions = args[1] ?? {};\n } else {\n allOptions = args[0] ?? {};\n }\n\n const selectorMemoized = useMemoEquals(selectorRaw);\n const selector = useMemo(() => makeSelector<T, S>(selectorMemoized), [selectorMemoized]);\n const lastEqualsRef = useRef<(newValue: S) => boolean | undefined>(undefined);\n\n const {\n enableTrackingProxy,\n equals = store.options.equals ?? deepEqual,\n withViewTransition,\n storeValueEquals = strictEqual,\n ...options\n } = allOptions;\n\n const snapshot = useRef<{ storeValue: T; selector: (value: T) => S; selectedValue: S }>(\n undefined,\n );\n\n const get = useCallback(() => {\n const storeValue = store.get();\n\n if (\n snapshot.current &&\n storeValueEquals(storeValue, snapshot.current.storeValue) &&\n selector === snapshot.current.selector\n ) {\n return snapshot.current.selectedValue;\n }\n\n const selectedValue = selector(storeValue);\n if (!(lastEqualsRef.current?.(selectedValue) ?? false)) {\n snapshot.current = { storeValue, selector, selectedValue };\n }\n\n return snapshot.current!.selectedValue;\n }, [store, storeValueEquals, selector]);\n\n const rootStore = store.derivedFrom?.store ?? store;\n const subOptions = useMemoEquals({ ...options, runNow: false });\n\n const subscribe = useCallback(\n (listener: () => void) => {\n let _listener: (value: any) => void = listener;\n let stopped = false;\n\n if (withViewTransition && (document as any).startViewTransition) {\n let lastObservedValue: any;\n\n _listener = (value: any) => {\n const observedValue =\n withViewTransition instanceof Function ? withViewTransition(value) : value;\n\n if (equals(lastObservedValue, observedValue)) {\n listener();\n return;\n }\n\n lastObservedValue = observedValue;\n\n let hasChanges = false;\n const mutationObserver = new MutationObserver(() => {\n hasChanges = true;\n mutationObserver.disconnect();\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n\n (document as any).startViewTransition(() => {\n mutationObserver.disconnect();\n\n if (!stopped) {\n listener();\n }\n\n if (!hasChanges) {\n throw new Error('no change');\n }\n });\n };\n }\n\n const cancel = rootStore.subscribe(_listener, subOptions);\n return () => {\n stopped = true;\n cancel();\n };\n },\n [rootStore, withViewTransition, equals, subOptions],\n );\n\n let value = useSyncExternalStore<S>(subscribe, get, get);\n let lastEquals = (newValue: S) => equals(newValue, value);\n let revoke: (() => void) | undefined;\n\n if (enableTrackingProxy) {\n [value, lastEquals, revoke] = trackingProxy(value, equals);\n }\n\n useLayoutEffect(() => {\n lastEqualsRef.current = lastEquals;\n revoke?.();\n });\n\n useDebugValue(value);\n return value;\n}\n","import { createStore } from '@core';\nimport { useStore } from '@react/useStore';\nimport { createContext, useContext, useLayoutEffect, useMemo, type ReactNode } from 'react';\n\nexport interface LoadingBoundaryEntry {\n label?: ReactNode;\n}\n\nexport interface LoadingBoundaryProps {\n /**\n * Fallback node to render when there are loading components within the boundary.\n */\n fallback?: ReactNode | ((entries: LoadingBoundaryEntry[]) => ReactNode);\n\n /**\n * Child node to render when there are no loading components within the boundary.\n */\n children?: ReactNode;\n\n /**\n * Add a loading state from outside the boundary. Useful for when you want to\n * show a loading state for a component that is not a child of the boundary.\n */\n isLoading?: boolean;\n}\n\nconst LoadingBoundaryContext = createContext(createStore(new Set<LoadingBoundaryEntry>()));\n\nexport function LoadingBoundary({\n fallback,\n children,\n isLoading: isLoadingExternal,\n}: LoadingBoundaryProps): React.JSX.Element {\n const store = useMemo(() => createStore(new Set<LoadingBoundaryEntry>()), []);\n const entries = useStore(store);\n const isLoading = entries.size > 0 || isLoadingExternal;\n\n const fallbackNode = isLoading\n ? typeof fallback === 'function'\n ? fallback([...entries])\n : fallback\n : undefined;\n\n return (\n <LoadingBoundaryContext.Provider value={store}>\n {fallbackNode !== undefined ? (\n <>\n {fallbackNode}\n <div style={{ display: 'none' }}>{children}</div>\n </>\n ) : (\n children\n )}\n </LoadingBoundaryContext.Provider>\n );\n}\n\nexport function useLoadingBoundary(isLoading: boolean | undefined, label?: ReactNode): void {\n const store = useContext(LoadingBoundaryContext);\n\n useLayoutEffect(() => {\n if (!isLoading) {\n return;\n }\n\n const entry = { label };\n store.set((entries) => new Set(entries).add(entry));\n\n return () => {\n store.set((entries) => {\n const newEntries = new Set(entries);\n newEntries.delete(entry);\n return newEntries;\n });\n };\n // oxlint-disable-next-line exhaustive-deps\n }, [store, isLoading]);\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport type { Cache } from '@core';\nimport type { CacheState } from '@lib/cacheState';\nimport { makeSelector } from '@lib/makeSelector';\nimport { useLoadingBoundary } from '@react/loadingBoundary';\nimport { useEffect, useMemo, useRef } from 'react';\n\nexport type UseCacheArray<T> = [\n value: T | undefined,\n error: unknown | undefined,\n isUpdating: boolean,\n isStale: boolean,\n];\n\nexport type UseCacheValue<T> = UseCacheArray<T> & CacheState<T>;\n\nexport interface UseCacheOptions<T> extends UseStoreOptions<UseCacheArray<T> & CacheState<T>> {\n /**\n * If true, will always return undefined as value and no fetch will be triggered.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the cache will be invalidated when the component mounts.\n * @default false\n */\n updateOnMount?: boolean;\n\n /**\n * If true, `useCache` will throw a promise when the cache is pending. This can be used with React Suspense.\n * @see https://react.dev/reference/react/Suspense\n * @default false\n */\n suspense?: boolean;\n\n /**\n * If true, `useCache` will register its loading state with the nearest `LoadingBoundary`.\n * @default false\n */\n loadingBoundary?: boolean;\n}\n\nexport function useCache<T>(\n cache: Cache<T, any>,\n {\n passive,\n disabled,\n updateOnMount,\n withViewTransition,\n suspense,\n loadingBoundary,\n ...options\n }: UseCacheOptions<T> = {},\n): UseCacheValue<T> {\n if (withViewTransition === true) {\n withViewTransition = (state) => state.value;\n }\n\n const { rootCache, selector } = useMemo(() => {\n const rootCache: Cache<any, any> = cache.derivedFromCache?.cache ?? cache;\n let selector = (x: any) => x;\n\n if (cache.derivedFromCache) {\n selector = (value: any) => {\n for (const s of cache.derivedFromCache!.selectors) {\n value = makeSelector(s)(value);\n }\n return value;\n };\n }\n\n return { rootCache, selector };\n }, [cache]);\n\n const hasMounted = useRef(false);\n\n useEffect(() => {\n hasMounted.current = true;\n\n if (updateOnMount) {\n rootCache.invalidate();\n }\n // oxlint-disable-next-line exhaustive-deps\n }, []);\n\n const result = useStore(\n rootCache.state,\n (state) => {\n if (disabled) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, undefined, false, false],\n { status: 'pending', isUpdating: false, isStale: false, isConnected: false },\n );\n }\n\n const isStale = updateOnMount && !hasMounted.current ? true : state.isStale;\n try {\n const value = state.status === 'value' ? selector(state.value) : undefined;\n\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [value, state.error, state.isUpdating, isStale],\n { ...state, value, isStale },\n );\n } catch (error) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, error, state.isUpdating, isStale],\n {\n status: 'error',\n error,\n isUpdating: state.isUpdating,\n isStale: isStale,\n isConnected: state.isConnected,\n },\n );\n }\n },\n { ...options, withViewTransition, passive: passive || disabled },\n );\n\n useEffect(\n () => rootCache.subscribe(() => undefined, { passive: passive || disabled }),\n [rootCache, passive, disabled],\n );\n\n useLoadingBoundary(loadingBoundary && !disabled && result.status === 'pending');\n\n if (suspense && result.status === 'pending') {\n throw rootCache.get();\n }\n\n return result;\n}\n","import type { Cache } from '@core';\nimport { type UseCacheOptions, type UseCacheValue, useCache } from '@react/useCache';\n\nexport const cacheMethods = {\n useCache<T>(this: Cache<T, any>, options?: UseCacheOptions<T>): UseCacheValue<T> {\n return useCache(this, options);\n },\n};\n","import { useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T): { current: T } {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import useLatestRef from '@react/lib/useLatestRef';\nimport { useCallback } from 'react';\n\nexport default function useLatestFunction<Args extends any[], R>(\n fn: (...args: Args) => R,\n): (...args: Args) => R {\n const ref = useLatestRef(fn);\n\n return useCallback(\n (...args: Args) => {\n return ref.current(...args);\n },\n [ref],\n );\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport { type Selector, type Update } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { isAnyPath, type AnyPath, type SettablePath, type Value } from '@lib/path';\nimport useLatestFunction from '@react/lib/useLatestFunction';\n\nexport function useProp<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useProp<T, const P>(\n store: Store<T>,\n selector: Constrain<P, SettablePath<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useProp<T>(\n store: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useProp<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S>, (value: S) => Update<T>, UseStoreOptions<S>?]\n | [AnyPath, UseStoreOptions<Value<T, any>>?]\n | [UseStoreOptions<S>?]\n): [value: S, setValue: Store<S>['set']] {\n let selector: Selector<T, S> | AnyPath | undefined;\n let updater: ((value: S) => Update<T>) | undefined;\n let options: UseStoreOptions<S> | undefined;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selector = args[0];\n if (typeof args[1] === 'function') {\n updater = args[1];\n options = args[2];\n } else {\n options = args[1];\n }\n } else {\n options = args[0];\n }\n\n const value = useStore(store, (selector ?? ((x) => x)) as Selector<T, S>, options);\n\n const update = useLatestFunction((update) => {\n let _store: Store<any> = store;\n if (selector) {\n _store = _store.map(selector as Selector<any, any>, updater);\n }\n\n _store.set(update);\n });\n\n return [value, update];\n}\n","import { useProp } from './useProp';\nimport { useStore, type UseStoreOptions } from './useStore';\nimport type { Scope, Selector, Update } from '@core';\nimport { createStore, type Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { createContext, useContext, useMemo, type Context, type ReactNode } from 'react';\n\nexport type ScopeProps<T> = { scope: Scope<T>; store?: Store<T>; children?: ReactNode };\n\ndeclare module '@core' {\n interface Scope<T> {\n context?: Context<Store<T>>;\n }\n}\n\nfunction getScopeContext<T>(scope: Scope<T>): Context<Store<T>> {\n scope.context ??= createContext<Store<T>>(createStore(scope.defaultValue));\n return scope.context;\n}\n\nexport function ScopeProvider<T>({\n scope,\n store: inputStore,\n children,\n}: ScopeProps<T>): React.JSX.Element {\n const context = getScopeContext(scope);\n const currentStore = useMemo(\n () => inputStore ?? createStore(scope.defaultValue),\n [scope, inputStore],\n );\n\n return <context.Provider value={currentStore}>{children}</context.Provider>;\n}\n\nexport function useScope<T>(scope: Scope<T>): Store<T> {\n const context = getScopeContext(scope);\n return useContext(context);\n}\n\nexport function useScopeStore<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nexport function useScopeStore<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nexport function useScopeStore<T>(scope: Scope<T>, option?: UseStoreOptions<T>): T;\n\nexport function useScopeStore<T>(scope: Scope<T>, ...args: any[]): T {\n const store = useScope(scope);\n return useStore(store, ...args);\n}\n\nexport function useScopeProp<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useScopeProp<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n ...args: any[]\n): [value: T, setValue: Store<T>['set']] {\n const store = useScope(scope);\n return useProp(store, ...args);\n}\n","import type { Scope, Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport {\n ScopeProvider,\n useScope,\n useScopeProp,\n useScopeStore,\n type ScopeProps,\n} from '@react/scope';\nimport type { UseStoreOptions } from '@react/useStore';\n\nfunction boundUseScope<T>(this: Scope<T>): Store<T> {\n return useScope(this);\n}\n\nfunction boundUseScopeStore<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nfunction boundUseScopeStore<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nfunction boundUseScopeStore<T>(this: Scope<T>, option?: UseStoreOptions<T>): T;\n\nfunction boundUseScopeStore(this: Scope<any>, ...args: any[]) {\n return useScopeStore(this, ...args);\n}\n\nfunction boundUseScopeProp<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nfunction boundUseScopeProp<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nfunction boundUseScopeProp<T>(\n this: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nfunction boundUseScopeProp(this: Scope<any>, ...args: any[]) {\n return useScopeProp(this, ...args);\n}\n\nfunction Provider<T>(this: Scope<T>, props: Omit<ScopeProps<T>, 'scope'>): React.JSX.Element {\n return ScopeProvider({ ...props, scope: this });\n}\n\nexport const scopeMethods: {\n useScope: typeof boundUseScope;\n useStore: typeof boundUseScopeStore;\n useProp: typeof boundUseScopeProp;\n Provider: typeof Provider;\n} = {\n useScope: boundUseScope,\n useStore: boundUseScopeStore,\n useProp: boundUseScopeProp,\n Provider,\n};\n","import type { Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { useProp } from '@react/useProp';\nimport { type UseStoreOptions, useStore } from '@react/useStore';\n\nfunction boundUseStore<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\nfunction boundUseStore<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\nfunction boundUseStore<T>(this: Store<T>, option?: UseStoreOptions<T>): T;\nfunction boundUseStore(this: Store<any>, ...args: any[]) {\n return useStore(this, ...args);\n}\n\nfunction boundUseProp<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\nfunction boundUseProp<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\nfunction boundUseProp<T>(\n this: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\nfunction boundUseProp(this: Store<any>, ...args: any[]) {\n return useProp(this, ...args);\n}\n\nexport const storeMethods: {\n useStore: typeof boundUseStore;\n useProp: typeof boundUseProp;\n} = {\n useStore: boundUseStore,\n useProp: boundUseProp,\n};\n"],"mappings":";;;;;;;AAGA,MAAM,oBAAoC,uBAAO,aAAa;AAK9D,SAAgB,cACd,OACA,SAAsCA,8BACpB;CAClB,IAAI,CAACC,iCAAc,KAAK,KAAK,CAAC,MAAM,QAAQ,KAAK,GAC/C,OAAO,CAAC,QAAQ,UAAU,OAAO,OAAO,KAAK,CAAC;CAIhD,QAAS,MAAc,sBAAsB;CAE7C,MAAM,OAAO,IAAI,MAA6B;CAC9C,MAAM,cAAc,IAAI,MAAkB;CAC1C,IAAI,UAAU;CAEd,SAAS,iBAAiB,WAAgB,GAAG,MAAa;EACxD,MAAM,CAAC,cAAc,QAAQ,UAAU,cAAc,UAAU,OAAO,GAAG,IAAI,CAAC;EAE9E,KAAK,MAAM,eAAe;GACxB,IAAI,CAACA,iCAAc,UAAU,KAAK,CAAC,MAAM,QAAQ,UAAU,GACzD,OAAO;GAGT,OAAO,OAAO,UAAU,YAAY,GAAG,IAAI,CAAC;EAC9C,CAAC;EAED,IAAI,QACF,YAAY,KAAK,MAAM;EAGzB,OAAO;CACT;CAEA,SAAS,gBAAgB,WAAgB,GAAG,MAAa;EACvD,MAAM,kBAAkB,UAAU,OAAO,GAAG,IAAI;EAEhD,KAAK,MAAM,eAAe;GACxB,OAAO,UAAU,YAAY,GAAG,IAAI,MAAM;EAC5C,CAAC;EAED,OAAO;CACT;CA8CA,OAAO;EACL,IA7CgB,MAAM,OAAsB;GAC5C,IAAI,QAAQ,GAAG,UAAU;IACvB,IAAI,MAAM,mBACR,OAAO;IAGT,IAAI,SACF,OAAO,OAAO;IAGhB,MAAM,EAAE,UAAU,iBAAiB,OAAO,yBAAyB,QAAQ,CAAC,KAAK,CAAC;IAClF,IAAI,aAAa,SAAS,iBAAiB,OACzC,OAAO,OAAO;IAGhB,OAAO,iBAAiB,QAAQ,KAAK,GAAG,QAAQ;GAClD;GAEA,yBAAyB,QAAQ,GAAG;IAClC,MAAM,EAAE,UAAU,iBAAiB,OAAO,yBAAyB,QAAQ,CAAC,KAAK,CAAC;IAClF,IAAI,aAAa,SAAS,iBAAiB,OACzC,OAAO,QAAQ,yBAAyB,QAAQ,CAAC;IAGnD,OAAO,iBAAiB,QAAQ,0BAA0B,CAAC;GAC7D;GAEA,UAAU;IACR,OAAO,iBAAiB,QAAQ,OAAO;GACzC;GAEA,iBAAiB;IACf,OAAO,gBAAgB,QAAQ,cAAc;GAC/C;GAEA,IAAI,SAAS,GAAG;IACd,OAAO,gBAAgB,QAAQ,KAAK,CAAC;GACvC;GAEA,eAAe;IACb,OAAO,gBAAgB,QAAQ,YAAY;GAC7C;EACF,CAGM;GACH,UAAU,CAAC,CAAC,SAAS,KAAK,OAAO,WAAW,OAAO,KAAK,CAAC;QACpD;GACJ,UAAU;GACV,YAAY,SAAS,WAAW,OAAO,CAAC;EAC1C;CACF;AACF;;;;ACpGA,SAAwB,cAAiB,OAAU,SAAkCC,8BAAc;CACjG,MAAM,wBAA2B,MAAS;CAC1C,MAAM,aAAa,CAAC,IAAI,WAAW,CAAC,OAAO,IAAI,QAAQ,OAAO,KAAK;CAEnE,2BAAgB;EACd,IAAI,YACF,IAAI,UAAU,EAAE,MAAM;CAE1B,CAAC;CAED,OAAO,aAAa,QAAQ,IAAI,QAAS;AAC3C;;;;AC+CA,SAAgB,SACd,OACA,GAAG,MAGA;CACH,IAAI;CACJ,IAAI;CAEJ,IAAI,OAAO,KAAK,OAAO,cAAcC,uBAAU,KAAK,EAAE,GAAG;EACvD,cAAc,KAAK;EACnB,aAAa,KAAK,MAAM,CAAC;CAC3B,OACE,aAAa,KAAK,MAAM,CAAC;CAG3B,MAAM,mBAAmB,cAAc,WAAW;CAClD,MAAM,oCAAyBC,2BAAmB,gBAAgB,GAAG,CAAC,gBAAgB,CAAC;CACvF,MAAM,kCAA6D,MAAS;CAE5E,MAAM,EACJ,qBACA,SAAS,MAAM,QAAQ,UAAUC,8BACjC,oBACA,mBAAmBC,gCACnB,GAAG,YACD;CAEJ,MAAM,6BACJ,MACF;CAEA,MAAM,mCAAwB;EAC5B,MAAM,aAAa,MAAM,IAAI;EAE7B,IACE,SAAS,WACT,iBAAiB,YAAY,SAAS,QAAQ,UAAU,KACxD,aAAa,SAAS,QAAQ,UAE9B,OAAO,SAAS,QAAQ;EAG1B,MAAM,gBAAgB,SAAS,UAAU;EACzC,IAAI,EAAE,cAAc,UAAU,aAAa,KAAK,QAC9C,SAAS,UAAU;GAAE;GAAY;GAAU;EAAc;EAG3D,OAAO,SAAS,QAAS;CAC3B,GAAG;EAAC;EAAO;EAAkB;CAAQ,CAAC;CAEtC,MAAM,YAAY,MAAM,aAAa,SAAS;CAC9C,MAAM,aAAa,cAAc;EAAE,GAAG;EAAS,QAAQ;CAAM,CAAC;CAmD9D,IAAI,gEAhDD,aAAyB;EACxB,IAAI,YAAkC;EACtC,IAAI,UAAU;EAEd,IAAI,sBAAuB,SAAiB,qBAAqB;GAC/D,IAAI;GAEJ,aAAa,UAAe;IAC1B,MAAM,gBACJ,8BAA8B,WAAW,mBAAmB,KAAK,IAAI;IAEvE,IAAI,OAAO,mBAAmB,aAAa,GAAG;KAC5C,SAAS;KACT;IACF;IAEA,oBAAoB;IAEpB,IAAI,aAAa;IACjB,MAAM,mBAAmB,IAAI,uBAAuB;KAClD,aAAa;KACb,iBAAiB,WAAW;IAC9B,CAAC;IACD,iBAAiB,QAAQ,SAAS,MAAM;KAAE,WAAW;KAAM,SAAS;IAAK,CAAC;IAE1E,AAAC,SAAiB,0BAA0B;KAC1C,iBAAiB,WAAW;KAE5B,IAAI,CAAC,SACH,SAAS;KAGX,IAAI,CAAC,YACH,MAAM,IAAI,MAAM,WAAW;IAE/B,CAAC;GACH;EACF;EAEA,MAAM,SAAS,UAAU,UAAU,WAAW,UAAU;EACxD,aAAa;GACX,UAAU;GACV,OAAO;EACT;CACF,GACA;EAAC;EAAW;EAAoB;EAAQ;CAAU,CAGR,GAAG,KAAK,GAAG;CACvD,IAAI,cAAc,aAAgB,OAAO,UAAU,KAAK;CACxD,IAAI;CAEJ,IAAI,qBACF,CAAC,OAAO,YAAY,UAAU,cAAc,OAAO,MAAM;CAG3D,iCAAsB;EACpB,cAAc,UAAU;EACxB,SAAS;CACX,CAAC;CAED,yBAAc,KAAK;CACnB,OAAO;AACT;;;;ACzJA,MAAM,kDAAuCC,0CAAY,IAAI,IAA0B,CAAC,CAAC;AAEzF,SAAgB,gBAAgB,EAC9B,UACA,UACA,WAAW,qBAC+B;CAC1C,MAAM,iCAAsBA,0CAAY,IAAI,IAA0B,CAAC,GAAG,CAAC,CAAC;CAC5E,MAAM,UAAU,SAAS,KAAK;CAG9B,MAAM,eAFY,QAAQ,OAAO,KAAK,oBAGlC,OAAO,aAAa,aAClB,SAAS,CAAC,GAAG,OAAO,CAAC,IACrB,WACF;CAEJ,OACE,2CAAC,uBAAuB,UAAxB;EAAiC,OAAO;YACrC,iBAAiB,SAChB,qFACG,cACD,2CAAC,OAAD;GAAK,OAAO,EAAE,SAAS,OAAO;GAAI;EAAc,EAChD,OAEF;CAE6B;AAErC;AAEA,SAAgB,mBAAmB,WAAgC,OAAyB;CAC1F,MAAM,8BAAmB,sBAAsB;CAE/C,iCAAsB;EACpB,IAAI,CAAC,WACH;EAGF,MAAM,QAAQ,EAAE,MAAM;EACtB,MAAM,KAAK,YAAY,IAAI,IAAI,OAAO,EAAE,IAAI,KAAK,CAAC;EAElD,aAAa;GACX,MAAM,KAAK,YAAY;IACrB,MAAM,aAAa,IAAI,IAAI,OAAO;IAClC,WAAW,OAAO,KAAK;IACvB,OAAO;GACT,CAAC;EACH;CAEF,GAAG,CAAC,OAAO,SAAS,CAAC;AACvB;;;;AClCA,SAAgB,SACd,OACA,EACE,SACA,UACA,eACA,oBACA,UACA,iBACA,GAAG,YACmB,CAAC,GACP;CAClB,IAAI,uBAAuB,MACzB,sBAAsB,UAAU,MAAM;CAGxC,MAAM,EAAE,WAAW,sCAA2B;EAC5C,MAAM,YAA6B,MAAM,kBAAkB,SAAS;EACpE,IAAI,YAAY,MAAW;EAE3B,IAAI,MAAM,kBACR,YAAY,UAAe;GACzB,KAAK,MAAM,KAAK,MAAM,iBAAkB,WACtC,QAAQC,2BAAa,CAAC,EAAE,KAAK;GAE/B,OAAO;EACT;EAGF,OAAO;GAAE;GAAW;EAAS;CAC/B,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,+BAAoB,KAAK;CAE/B,2BAAgB;EACd,WAAW,UAAU;EAErB,IAAI,eACF,UAAU,WAAW;CAGzB,GAAG,CAAC,CAAC;CAEL,MAAM,SAAS,SACb,UAAU,QACT,UAAU;EACT,IAAI,UACF,OAAO,OAAO,OACZ;GAAC;GAAW;GAAW;GAAO;EAAK,GACnC;GAAE,QAAQ;GAAW,YAAY;GAAO,SAAS;GAAO,aAAa;EAAM,CAC7E;EAGF,MAAM,UAAU,iBAAiB,CAAC,WAAW,UAAU,OAAO,MAAM;EACpE,IAAI;GACF,MAAM,QAAQ,MAAM,WAAW,UAAU,SAAS,MAAM,KAAK,IAAI;GAEjE,OAAO,OAAO,OACZ;IAAC;IAAO,MAAM;IAAO,MAAM;IAAY;GAAO,GAC9C;IAAE,GAAG;IAAO;IAAO;GAAQ,CAC7B;EACF,SAAS,OAAO;GACd,OAAO,OAAO,OACZ;IAAC;IAAW;IAAO,MAAM;IAAY;GAAO,GAC5C;IACE,QAAQ;IACR;IACA,YAAY,MAAM;IACT;IACT,aAAa,MAAM;GACrB,CACF;EACF;CACF,GACA;EAAE,GAAG;EAAS;EAAoB,SAAS,WAAW;CAAS,CACjE;CAEA,2BACQ,UAAU,gBAAgB,QAAW,EAAE,SAAS,WAAW,SAAS,CAAC,GAC3E;EAAC;EAAW;EAAS;CAAQ,CAC/B;CAEA,mBAAmB,mBAAmB,CAAC,YAAY,OAAO,WAAW,SAAS;CAE9E,IAAI,YAAY,OAAO,WAAW,WAChC,MAAM,UAAU,IAAI;CAGtB,OAAO;AACT;;;;ACjIA,MAAa,eAAe,EAC1B,SAAiC,SAAgD;CAC/E,OAAO,SAAS,MAAM,OAAO;AAC/B,EACF;;;;ACLA,SAAwB,aAAgB,OAA0B;CAChE,MAAM,wBAAa,KAAK;CACxB,IAAI,UAAU;CACd,OAAO;AACT;;;;ACHA,SAAwB,kBACtB,IACsB;CACtB,MAAM,MAAM,aAAa,EAAE;CAE3B,+BACG,GAAG,SAAe;EACjB,OAAO,IAAI,QAAQ,GAAG,IAAI;CAC5B,GACA,CAAC,GAAG,CACN;AACF;;;;ACWA,SAAgB,QACd,OACA,GAAG,MAIoC;CACvC,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI,OAAO,KAAK,OAAO,cAAcC,uBAAU,KAAK,EAAE,GAAG;EACvD,WAAW,KAAK;EAChB,IAAI,OAAO,KAAK,OAAO,YAAY;GACjC,UAAU,KAAK;GACf,UAAU,KAAK;EACjB,OACE,UAAU,KAAK;CAEnB,OACE,UAAU,KAAK;CAcjB,OAAO,CAXO,SAAS,OAAQ,cAAc,MAAM,IAAuB,OAW9D,GATG,mBAAmB,WAAW;EAC3C,IAAI,SAAqB;EACzB,IAAI,UACF,SAAS,OAAO,IAAI,UAAgC,OAAO;EAG7D,OAAO,IAAI,MAAM;CACnB,CAEoB,CAAC;AACvB;;;;AC5CA,SAAS,gBAAmB,OAAoC;CAC9D,MAAM,qCAAoCC,0BAAY,MAAM,YAAY,CAAC;CACzE,OAAO,MAAM;AACf;AAEA,SAAgB,cAAiB,EAC/B,OACA,OAAO,YACP,YACmC;CACnC,MAAM,UAAU,gBAAgB,KAAK;CACrC,MAAM,wCACE,cAAcA,0BAAY,MAAM,YAAY,GAClD,CAAC,OAAO,UAAU,CACpB;CAEA,OAAO,2CAAC,QAAQ,UAAT;EAAkB,OAAO;EAAe;CAA2B;AAC5E;AAEA,SAAgB,SAAY,OAA2B;CAErD,6BADgB,gBAAgB,KACR,CAAC;AAC3B;AAgBA,SAAgB,cAAiB,OAAiB,GAAG,MAAgB;CAEnE,OAAO,SADO,SAAS,KACH,GAAG,GAAG,IAAI;AAChC;AAoBA,SAAgB,aACd,OACA,GAAG,MACoC;CAEvC,OAAO,QADO,SAAS,KACJ,GAAG,GAAG,IAAI;AAC/B;;;;ACvEA,SAAS,gBAA2C;CAClD,OAAO,SAAS,IAAI;AACtB;AAgBA,SAAS,mBAAqC,GAAG,MAAa;CAC5D,OAAO,cAAc,MAAM,GAAG,IAAI;AACpC;AAoBA,SAAS,kBAAoC,GAAG,MAAa;CAC3D,OAAO,aAAa,MAAM,GAAG,IAAI;AACnC;AAEA,SAAS,SAA4B,OAAwD;CAC3F,OAAO,cAAc;EAAE,GAAG;EAAO,OAAO;CAAK,CAAC;AAChD;AAEA,MAAa,eAKT;CACF,UAAU;CACV,UAAU;CACV,SAAS;CACT;AACF;;;;ACrDA,SAAS,cAAgC,GAAG,MAAa;CACvD,OAAO,SAAS,MAAM,GAAG,IAAI;AAC/B;AAiBA,SAAS,aAA+B,GAAG,MAAa;CACtD,OAAO,QAAQ,MAAM,GAAG,IAAI;AAC9B;AAEA,MAAa,eAGT;CACF,UAAU;CACV,SAAS;AACX"}
|
|
1
|
+
{"version":3,"file":"storeMethods-DYgUGHSk.cjs","names":["deepEqual","isPlainObject","deepEqual","isAnyPath","makeSelector","deepEqual","strictEqual","createStore","makeSelector","isAnyPath","createStore"],"sources":["../src/lib/trackingProxy.ts","../src/react/lib/useMemoEquals.ts","../src/react/useStore.ts","../src/react/loadingBoundary.tsx","../src/react/useCache.ts","../src/react/cacheMethods.ts","../src/react/lib/useLatestRef.ts","../src/react/lib/useLatestFunction.ts","../src/react/useProp.ts","../src/react/scope.tsx","../src/react/scopeMethods.ts","../src/react/storeMethods.ts"],"sourcesContent":["import { deepEqual } from './equals';\nimport { isPlainObject } from '@lib/helpers';\n\nconst unwrapProxySymbol = /* @__PURE__ */ Symbol('unwrapProxy');\n\nexport type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean, revoke?: () => void];\ntype Object_ = Record<string | symbol, unknown>;\n\nexport function trackingProxy<T>(\n value: T,\n equals: (a: any, b: any) => boolean = deepEqual,\n): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => equals(value, other)];\n }\n\n // Unpack proxies, we don't want to nest them\n value = (value as any)[unwrapProxySymbol] ?? value;\n\n const deps = new Array<TrackingProxy<any>[1]>();\n const revokations = new Array<() => void>();\n let revoked = false;\n\n function trackComplexProp(function_: any, ...args: any[]) {\n const [proxiedValue, equals, revoke] = trackingProxy(function_(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(function_(otherValue, ...args));\n });\n\n if (revoke) {\n revokations.push(revoke);\n }\n\n return proxiedValue;\n }\n\n function trackSimpleProp(function_: any, ...args: any[]) {\n const calculatedValue = function_(value, ...args);\n\n deps.push((otherValue) => {\n return function_(otherValue, ...args) === calculatedValue;\n });\n\n return calculatedValue;\n }\n\n const proxy = new Proxy(value as T & Object_, {\n get(target, p, receiver) {\n if (p === unwrapProxySymbol) {\n return value;\n }\n\n if (revoked) {\n return target[p];\n }\n\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return target[p];\n }\n\n return trackComplexProp(Reflect.get, p, receiver);\n },\n\n getOwnPropertyDescriptor(target, p) {\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return Reflect.getOwnPropertyDescriptor(target, p);\n }\n\n return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);\n },\n\n ownKeys() {\n return trackComplexProp(Reflect.ownKeys);\n },\n\n getPrototypeOf() {\n return trackSimpleProp(Reflect.getPrototypeOf);\n },\n\n has(_target, p) {\n return trackSimpleProp(Reflect.has, p);\n },\n\n isExtensible() {\n return trackSimpleProp(Reflect.isExtensible);\n },\n });\n\n return [\n proxy,\n (other) => !!other && deps.every((equals) => equals(other)),\n () => {\n revoked = true;\n revokations.forEach((revoke) => revoke());\n },\n ];\n}\n","import { deepEqual } from '@lib/equals';\nimport { useEffect, useRef } from 'react';\n\nexport default function useMemoEquals<T>(value: T, equals: (a: T, b: T) => boolean = deepEqual): T {\n const ref = useRef<{ value: T }>(undefined);\n const hasChanged = !ref.current || !equals(ref.current.value, value);\n\n useEffect(() => {\n if (hasChanged) {\n ref.current = { value };\n }\n });\n\n return hasChanged ? value : ref.current!.value;\n}\n","import type { Selector, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual, strictEqual } from '@lib/equals';\nimport { makeSelector } from '@lib/makeSelector';\nimport { isAnyPath, type AnyPath, type Path, type Value } from '@lib/path';\nimport { trackingProxy } from '@lib/trackingProxy';\nimport useMemoEquals from '@react/lib/useMemoEquals';\nimport {\n useCallback,\n useDebugValue,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\nexport interface UseStoreOptions<T> extends Omit<SubscribeOptions, 'runNow' | 'passive'> {\n /**\n * If true, the cache content can be consumed but no fetch will be triggered.\n * @default false\n */\n\n passive?: boolean;\n\n /**\n * (experimental) If true, the a rerender will only be triggered when a property of the returned value changes that was\n * actually accessed during the last render.\n * @default false\n */\n enableTrackingProxy?: boolean;\n\n /**\n * (experimental) If provided, a rerender will be wrapped in a browser view transition.\n */\n withViewTransition?: boolean | ((value: T) => unknown);\n}\n\nexport interface UseStoreOptionsWithSelector<T, S> extends UseStoreOptions<S> {\n /**\n * Equality function to compare the raw store values before reevaluating the selector.\n * Can be used to avoid unnecessary selector evaluations.\n * @default strictEqual\n */\n storeValueEquals?: (newValue: T, oldValue: T) => boolean;\n}\n\nexport function useStore<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptionsWithSelector<T, S>,\n): S;\n\nexport function useStore<T, const P>(\n store: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptionsWithSelector<T, Value<T, P>>,\n): Value<T, P>;\n\nexport function useStore<T>(store: Store<T>, option?: UseStoreOptions<T>): T;\n\nexport function useStore<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S> | AnyPath, UseStoreOptionsWithSelector<T, S>?]\n | [UseStoreOptionsWithSelector<T, S>?]\n): S {\n let selectorRaw: Selector<T, S> | AnyPath | undefined;\n let allOptions: UseStoreOptionsWithSelector<T, S>;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selectorRaw = args[0];\n allOptions = args[1] ?? {};\n } else {\n allOptions = args[0] ?? {};\n }\n\n const selectorMemoized = useMemoEquals(selectorRaw);\n const selector = useMemo(() => makeSelector<T, S>(selectorMemoized), [selectorMemoized]);\n const lastEqualsRef = useRef<(newValue: S) => boolean | undefined>(undefined);\n\n const {\n enableTrackingProxy,\n equals = store.options.equals ?? deepEqual,\n withViewTransition,\n storeValueEquals = strictEqual,\n ...options\n } = allOptions;\n\n const snapshot = useRef<{ storeValue: T; selector: (value: T) => S; selectedValue: S }>(\n undefined,\n );\n\n const get = useCallback(() => {\n const storeValue = store.get();\n\n if (\n snapshot.current &&\n storeValueEquals(storeValue, snapshot.current.storeValue) &&\n selector === snapshot.current.selector\n ) {\n return snapshot.current.selectedValue;\n }\n\n const selectedValue = selector(storeValue);\n if (!(lastEqualsRef.current?.(selectedValue) ?? false)) {\n snapshot.current = { storeValue, selector, selectedValue };\n }\n\n return snapshot.current!.selectedValue;\n }, [store, storeValueEquals, selector]);\n\n const rootStore = store.derivedFrom?.store ?? store;\n const subOptions = useMemoEquals({ ...options, runNow: false });\n\n const subscribe = useCallback(\n (listener: () => void) => {\n let _listener: (value: any) => void = listener;\n let stopped = false;\n\n if (withViewTransition && (document as any).startViewTransition) {\n let lastObservedValue: any;\n\n _listener = (value: any) => {\n const observedValue =\n withViewTransition instanceof Function ? withViewTransition(value) : value;\n\n if (equals(lastObservedValue, observedValue)) {\n listener();\n return;\n }\n\n lastObservedValue = observedValue;\n\n let hasChanges = false;\n const mutationObserver = new MutationObserver(() => {\n hasChanges = true;\n mutationObserver.disconnect();\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n\n (document as any).startViewTransition(() => {\n mutationObserver.disconnect();\n\n if (!stopped) {\n listener();\n }\n\n if (!hasChanges) {\n throw new Error('no change');\n }\n });\n };\n }\n\n const cancel = rootStore.subscribe(_listener, subOptions);\n return () => {\n stopped = true;\n cancel();\n };\n },\n [rootStore, withViewTransition, equals, subOptions],\n );\n\n let value = useSyncExternalStore<S>(subscribe, get, get);\n let lastEquals = (newValue: S) => equals(newValue, value);\n let revoke: (() => void) | undefined;\n\n if (enableTrackingProxy) {\n [value, lastEquals, revoke] = trackingProxy(value, equals);\n }\n\n useLayoutEffect(() => {\n lastEqualsRef.current = lastEquals;\n revoke?.();\n });\n\n useDebugValue(value);\n return value;\n}\n","import { createStore } from '@core';\nimport { useStore } from '@react/useStore';\nimport { createContext, useContext, useLayoutEffect, useMemo, type ReactNode } from 'react';\n\nexport interface LoadingBoundaryEntry {\n label?: ReactNode;\n}\n\nexport interface LoadingBoundaryProps {\n /**\n * Fallback node to render when there are loading components within the boundary.\n */\n fallback?: ReactNode | ((entries: LoadingBoundaryEntry[]) => ReactNode);\n\n /**\n * Child node to render when there are no loading components within the boundary.\n */\n children?: ReactNode;\n\n /**\n * Add a loading state from outside the boundary. Useful for when you want to\n * show a loading state for a component that is not a child of the boundary.\n */\n isLoading?: boolean;\n}\n\nconst LoadingBoundaryContext = createContext(createStore(new Set<LoadingBoundaryEntry>()));\n\nexport function LoadingBoundary({\n fallback,\n children,\n isLoading: isLoadingExternal,\n}: LoadingBoundaryProps): React.JSX.Element {\n const store = useMemo(() => createStore(new Set<LoadingBoundaryEntry>()), []);\n const entries = useStore(store);\n const isLoading = entries.size > 0 || isLoadingExternal;\n\n const fallbackNode = isLoading\n ? typeof fallback === 'function'\n ? fallback([...entries])\n : fallback\n : undefined;\n\n return (\n <LoadingBoundaryContext.Provider value={store}>\n {fallbackNode !== undefined ? (\n <>\n {fallbackNode}\n <div style={{ display: 'none' }}>{children}</div>\n </>\n ) : (\n children\n )}\n </LoadingBoundaryContext.Provider>\n );\n}\n\nexport function useLoadingBoundary(isLoading: boolean | undefined, label?: ReactNode): void {\n const store = useContext(LoadingBoundaryContext);\n\n useLayoutEffect(() => {\n if (!isLoading) {\n return;\n }\n\n const entry = { label };\n store.set((entries) => new Set(entries).add(entry));\n\n return () => {\n store.set((entries) => {\n const newEntries = new Set(entries);\n newEntries.delete(entry);\n return newEntries;\n });\n };\n // oxlint-disable-next-line exhaustive-deps\n }, [store, isLoading]);\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport type { Cache } from '@core';\nimport type { CacheState } from '@lib/cacheState';\nimport { makeSelector } from '@lib/makeSelector';\nimport { useLoadingBoundary } from '@react/loadingBoundary';\nimport { useEffect, useMemo, useRef } from 'react';\n\nexport type UseCacheArray<T> = [\n value: T | undefined,\n error: unknown | undefined,\n isUpdating: boolean,\n isStale: boolean,\n];\n\nexport type UseCacheValue<T> = UseCacheArray<T> & CacheState<T>;\n\nexport interface UseCacheOptions<T> extends UseStoreOptions<UseCacheArray<T> & CacheState<T>> {\n /**\n * If true, will always return undefined as value and no fetch will be triggered.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the cache will be invalidated when the component mounts.\n * @default false\n */\n updateOnMount?: boolean;\n\n /**\n * If true, `useCache` will throw a promise when the cache is pending. This can be used with React Suspense.\n * @see https://react.dev/reference/react/Suspense\n * @default false\n */\n suspense?: boolean;\n\n /**\n * If true, `useCache` will register its loading state with the nearest `LoadingBoundary`.\n * @default false\n */\n loadingBoundary?: boolean;\n}\n\nexport function useCache<T>(\n cache: Cache<T, any>,\n {\n passive,\n disabled,\n updateOnMount,\n withViewTransition,\n suspense,\n loadingBoundary,\n ...options\n }: UseCacheOptions<T> = {},\n): UseCacheValue<T> {\n if (withViewTransition === true) {\n withViewTransition = (state) => state.value;\n }\n\n const { rootCache, selector } = useMemo(() => {\n const rootCache: Cache<any, any> = cache.derivedFromCache?.cache ?? cache;\n let selector = (x: any) => x;\n\n if (cache.derivedFromCache) {\n selector = (value: any) => {\n for (const s of cache.derivedFromCache!.selectors) {\n value = makeSelector(s)(value);\n }\n return value;\n };\n }\n\n return { rootCache, selector };\n }, [cache]);\n\n const hasMounted = useRef(false);\n\n useEffect(() => {\n hasMounted.current = true;\n\n if (updateOnMount) {\n rootCache.invalidate();\n }\n // oxlint-disable-next-line exhaustive-deps\n }, []);\n\n const result = useStore(\n rootCache.state,\n (state) => {\n if (disabled) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, undefined, false, false],\n { status: 'pending', isUpdating: false, isStale: false, isConnected: false },\n );\n }\n\n const isStale = updateOnMount && !hasMounted.current ? true : state.isStale;\n try {\n const value = state.status === 'value' ? selector(state.value) : undefined;\n\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [value, state.error, state.isUpdating, isStale],\n { ...state, value, isStale },\n );\n } catch (error) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, error, state.isUpdating, isStale],\n {\n status: 'error',\n error,\n isUpdating: state.isUpdating,\n isStale: isStale,\n isConnected: state.isConnected,\n },\n );\n }\n },\n { ...options, withViewTransition, passive: passive || disabled },\n );\n\n useEffect(\n () => rootCache.subscribe(() => undefined, { passive: passive || disabled }),\n [rootCache, passive, disabled],\n );\n\n useLoadingBoundary(loadingBoundary && !disabled && result.status === 'pending');\n\n if (suspense && result.status === 'pending') {\n throw rootCache.get();\n }\n\n return result;\n}\n","import type { Cache } from '@core';\nimport { type UseCacheOptions, type UseCacheValue, useCache } from '@react/useCache';\n\nexport const cacheMethods = {\n useCache<T>(this: Cache<T, any>, options?: UseCacheOptions<T>): UseCacheValue<T> {\n return useCache(this, options);\n },\n};\n","import { useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T): { current: T } {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import useLatestRef from '@react/lib/useLatestRef';\nimport { useCallback } from 'react';\n\nexport default function useLatestFunction<Args extends any[], R>(\n fn: (...args: Args) => R,\n): (...args: Args) => R {\n const ref = useLatestRef(fn);\n\n return useCallback(\n (...args: Args) => {\n return ref.current(...args);\n },\n [ref],\n );\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport { type Selector, type Update } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { isAnyPath, type AnyPath, type SettablePath, type Value } from '@lib/path';\nimport useLatestFunction from '@react/lib/useLatestFunction';\n\nexport function useProp<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useProp<T, const P>(\n store: Store<T>,\n selector: Constrain<P, SettablePath<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useProp<T>(\n store: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useProp<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S>, (value: S) => Update<T>, UseStoreOptions<S>?]\n | [AnyPath, UseStoreOptions<Value<T, any>>?]\n | [UseStoreOptions<S>?]\n): [value: S, setValue: Store<S>['set']] {\n let selector: Selector<T, S> | AnyPath | undefined;\n let updater: ((value: S) => Update<T>) | undefined;\n let options: UseStoreOptions<S> | undefined;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selector = args[0];\n if (typeof args[1] === 'function') {\n updater = args[1];\n options = args[2];\n } else {\n options = args[1];\n }\n } else {\n options = args[0];\n }\n\n const value = useStore(store, (selector ?? ((x) => x)) as Selector<T, S>, options);\n\n const update = useLatestFunction((update) => {\n let _store: Store<any> = store;\n if (selector) {\n _store = _store.map(selector as Selector<any, any>, updater);\n }\n\n _store.set(update);\n });\n\n return [value, update];\n}\n","import { useProp } from './useProp';\nimport { useStore, type UseStoreOptions } from './useStore';\nimport type { Scope, Selector, Update } from '@core';\nimport { createStore, type Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { createContext, useContext, useMemo, type Context, type ReactNode } from 'react';\n\nexport type ScopeProps<T> = { scope: Scope<T>; store?: Store<T>; children?: ReactNode };\n\ndeclare module '..' {\n interface Scope<T> {\n context?: Context<Store<T>>;\n }\n}\n\nfunction getScopeContext<T>(scope: Scope<T>): Context<Store<T>> {\n scope.context ??= createContext<Store<T>>(createStore(scope.defaultValue));\n return scope.context;\n}\n\nexport function ScopeProvider<T>({\n scope,\n store: inputStore,\n children,\n}: ScopeProps<T>): React.JSX.Element {\n const context = getScopeContext(scope);\n const currentStore = useMemo(\n () => inputStore ?? createStore(scope.defaultValue),\n [scope, inputStore],\n );\n\n return <context.Provider value={currentStore}>{children}</context.Provider>;\n}\n\nexport function useScope<T>(scope: Scope<T>): Store<T> {\n const context = getScopeContext(scope);\n return useContext(context);\n}\n\nexport function useScopeStore<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nexport function useScopeStore<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nexport function useScopeStore<T>(scope: Scope<T>, option?: UseStoreOptions<T>): T;\n\nexport function useScopeStore<T>(scope: Scope<T>, ...args: any[]): T {\n const store = useScope(scope);\n return useStore(store, ...args);\n}\n\nexport function useScopeProp<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useScopeProp<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n ...args: any[]\n): [value: T, setValue: Store<T>['set']] {\n const store = useScope(scope);\n return useProp(store, ...args);\n}\n","import type { Scope, Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport {\n ScopeProvider,\n useScope,\n useScopeProp,\n useScopeStore,\n type ScopeProps,\n} from '@react/scope';\nimport type { UseStoreOptions } from '@react/useStore';\n\nfunction boundUseScope<T>(this: Scope<T>): Store<T> {\n return useScope(this);\n}\n\nfunction boundUseScopeStore<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nfunction boundUseScopeStore<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nfunction boundUseScopeStore<T>(this: Scope<T>, option?: UseStoreOptions<T>): T;\n\nfunction boundUseScopeStore(this: Scope<any>, ...args: any[]) {\n return useScopeStore(this, ...args);\n}\n\nfunction boundUseScopeProp<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nfunction boundUseScopeProp<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nfunction boundUseScopeProp<T>(\n this: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nfunction boundUseScopeProp(this: Scope<any>, ...args: any[]) {\n return useScopeProp(this, ...args);\n}\n\nfunction Provider<T>(this: Scope<T>, props: Omit<ScopeProps<T>, 'scope'>): React.JSX.Element {\n return ScopeProvider({ ...props, scope: this });\n}\n\nexport const scopeMethods: {\n useScope: typeof boundUseScope;\n useStore: typeof boundUseScopeStore;\n useProp: typeof boundUseScopeProp;\n Provider: typeof Provider;\n} = {\n useScope: boundUseScope,\n useStore: boundUseScopeStore,\n useProp: boundUseScopeProp,\n Provider,\n};\n","import type { Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { useProp } from '@react/useProp';\nimport { type UseStoreOptions, useStore } from '@react/useStore';\n\nfunction boundUseStore<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\nfunction boundUseStore<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\nfunction boundUseStore<T>(this: Store<T>, option?: UseStoreOptions<T>): T;\nfunction boundUseStore(this: Store<any>, ...args: any[]) {\n return useStore(this, ...args);\n}\n\nfunction boundUseProp<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\nfunction boundUseProp<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\nfunction boundUseProp<T>(\n this: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\nfunction boundUseProp(this: Store<any>, ...args: any[]) {\n return useProp(this, ...args);\n}\n\nexport const storeMethods: {\n useStore: typeof boundUseStore;\n useProp: typeof boundUseProp;\n} = {\n useStore: boundUseStore,\n useProp: boundUseProp,\n};\n"],"mappings":"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"}
|
|
@@ -79,7 +79,7 @@ type ScopeProps<T> = {
|
|
|
79
79
|
store?: Store<T>;
|
|
80
80
|
children?: ReactNode;
|
|
81
81
|
};
|
|
82
|
-
declare module "
|
|
82
|
+
declare module ".." {
|
|
83
83
|
interface Scope<T> {
|
|
84
84
|
context?: Context<Store<T>>;
|
|
85
85
|
}
|
|
@@ -120,4 +120,4 @@ declare const storeMethods: {
|
|
|
120
120
|
};
|
|
121
121
|
//#endregion
|
|
122
122
|
export { useScope as a, UseCacheValue as c, useStore as d, ScopeProvider as i, useCache as l, scopeMethods as n, cacheMethods as o, ScopeProps as r, UseCacheArray as s, storeMethods as t, UseStoreOptions as u };
|
|
123
|
-
//# sourceMappingURL=storeMethods-
|
|
123
|
+
//# sourceMappingURL=storeMethods-DlScpjKj.d.cts.map
|
|
@@ -79,7 +79,7 @@ type ScopeProps<T> = {
|
|
|
79
79
|
store?: Store<T>;
|
|
80
80
|
children?: ReactNode;
|
|
81
81
|
};
|
|
82
|
-
declare module "
|
|
82
|
+
declare module ".." {
|
|
83
83
|
interface Scope<T> {
|
|
84
84
|
context?: Context<Store<T>>;
|
|
85
85
|
}
|
|
@@ -120,4 +120,4 @@ declare const storeMethods: {
|
|
|
120
120
|
};
|
|
121
121
|
//#endregion
|
|
122
122
|
export { useScope as a, UseCacheValue as c, useStore as d, ScopeProvider as i, useCache as l, scopeMethods as n, cacheMethods as o, ScopeProps as r, UseCacheArray as s, storeMethods as t, UseStoreOptions as u };
|
|
123
|
-
//# sourceMappingURL=storeMethods-
|
|
123
|
+
//# sourceMappingURL=storeMethods-M7KjCOHg.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeMethods-pGlt0zfb.js","names":[],"sources":["../src/lib/trackingProxy.ts","../src/react/lib/useMemoEquals.ts","../src/react/useStore.ts","../src/react/loadingBoundary.tsx","../src/react/useCache.ts","../src/react/cacheMethods.ts","../src/react/lib/useLatestRef.ts","../src/react/lib/useLatestFunction.ts","../src/react/useProp.ts","../src/react/scope.tsx","../src/react/scopeMethods.ts","../src/react/storeMethods.ts"],"sourcesContent":["import { deepEqual } from './equals';\nimport { isPlainObject } from '@lib/helpers';\n\nconst unwrapProxySymbol = /* @__PURE__ */ Symbol('unwrapProxy');\n\nexport type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean, revoke?: () => void];\ntype Object_ = Record<string | symbol, unknown>;\n\nexport function trackingProxy<T>(\n value: T,\n equals: (a: any, b: any) => boolean = deepEqual,\n): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => equals(value, other)];\n }\n\n // Unpack proxies, we don't want to nest them\n value = (value as any)[unwrapProxySymbol] ?? value;\n\n const deps = new Array<TrackingProxy<any>[1]>();\n const revokations = new Array<() => void>();\n let revoked = false;\n\n function trackComplexProp(function_: any, ...args: any[]) {\n const [proxiedValue, equals, revoke] = trackingProxy(function_(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(function_(otherValue, ...args));\n });\n\n if (revoke) {\n revokations.push(revoke);\n }\n\n return proxiedValue;\n }\n\n function trackSimpleProp(function_: any, ...args: any[]) {\n const calculatedValue = function_(value, ...args);\n\n deps.push((otherValue) => {\n return function_(otherValue, ...args) === calculatedValue;\n });\n\n return calculatedValue;\n }\n\n const proxy = new Proxy(value as T & Object_, {\n get(target, p, receiver) {\n if (p === unwrapProxySymbol) {\n return value;\n }\n\n if (revoked) {\n return target[p];\n }\n\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return target[p];\n }\n\n return trackComplexProp(Reflect.get, p, receiver);\n },\n\n getOwnPropertyDescriptor(target, p) {\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return Reflect.getOwnPropertyDescriptor(target, p);\n }\n\n return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);\n },\n\n ownKeys() {\n return trackComplexProp(Reflect.ownKeys);\n },\n\n getPrototypeOf() {\n return trackSimpleProp(Reflect.getPrototypeOf);\n },\n\n has(_target, p) {\n return trackSimpleProp(Reflect.has, p);\n },\n\n isExtensible() {\n return trackSimpleProp(Reflect.isExtensible);\n },\n });\n\n return [\n proxy,\n (other) => !!other && deps.every((equals) => equals(other)),\n () => {\n revoked = true;\n revokations.forEach((revoke) => revoke());\n },\n ];\n}\n","import { deepEqual } from '@lib/equals';\nimport { useEffect, useRef } from 'react';\n\nexport default function useMemoEquals<T>(value: T, equals: (a: T, b: T) => boolean = deepEqual): T {\n const ref = useRef<{ value: T }>(undefined);\n const hasChanged = !ref.current || !equals(ref.current.value, value);\n\n useEffect(() => {\n if (hasChanged) {\n ref.current = { value };\n }\n });\n\n return hasChanged ? value : ref.current!.value;\n}\n","import type { Selector, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual, strictEqual } from '@lib/equals';\nimport { makeSelector } from '@lib/makeSelector';\nimport { isAnyPath, type AnyPath, type Path, type Value } from '@lib/path';\nimport { trackingProxy } from '@lib/trackingProxy';\nimport useMemoEquals from '@react/lib/useMemoEquals';\nimport {\n useCallback,\n useDebugValue,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\nexport interface UseStoreOptions<T> extends Omit<SubscribeOptions, 'runNow' | 'passive'> {\n /**\n * If true, the cache content can be consumed but no fetch will be triggered.\n * @default false\n */\n\n passive?: boolean;\n\n /**\n * (experimental) If true, the a rerender will only be triggered when a property of the returned value changes that was\n * actually accessed during the last render.\n * @default false\n */\n enableTrackingProxy?: boolean;\n\n /**\n * (experimental) If provided, a rerender will be wrapped in a browser view transition.\n */\n withViewTransition?: boolean | ((value: T) => unknown);\n}\n\nexport interface UseStoreOptionsWithSelector<T, S> extends UseStoreOptions<S> {\n /**\n * Equality function to compare the raw store values before reevaluating the selector.\n * Can be used to avoid unnecessary selector evaluations.\n * @default strictEqual\n */\n storeValueEquals?: (newValue: T, oldValue: T) => boolean;\n}\n\nexport function useStore<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptionsWithSelector<T, S>,\n): S;\n\nexport function useStore<T, const P>(\n store: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptionsWithSelector<T, Value<T, P>>,\n): Value<T, P>;\n\nexport function useStore<T>(store: Store<T>, option?: UseStoreOptions<T>): T;\n\nexport function useStore<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S> | AnyPath, UseStoreOptionsWithSelector<T, S>?]\n | [UseStoreOptionsWithSelector<T, S>?]\n): S {\n let selectorRaw: Selector<T, S> | AnyPath | undefined;\n let allOptions: UseStoreOptionsWithSelector<T, S>;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selectorRaw = args[0];\n allOptions = args[1] ?? {};\n } else {\n allOptions = args[0] ?? {};\n }\n\n const selectorMemoized = useMemoEquals(selectorRaw);\n const selector = useMemo(() => makeSelector<T, S>(selectorMemoized), [selectorMemoized]);\n const lastEqualsRef = useRef<(newValue: S) => boolean | undefined>(undefined);\n\n const {\n enableTrackingProxy,\n equals = store.options.equals ?? deepEqual,\n withViewTransition,\n storeValueEquals = strictEqual,\n ...options\n } = allOptions;\n\n const snapshot = useRef<{ storeValue: T; selector: (value: T) => S; selectedValue: S }>(\n undefined,\n );\n\n const get = useCallback(() => {\n const storeValue = store.get();\n\n if (\n snapshot.current &&\n storeValueEquals(storeValue, snapshot.current.storeValue) &&\n selector === snapshot.current.selector\n ) {\n return snapshot.current.selectedValue;\n }\n\n const selectedValue = selector(storeValue);\n if (!(lastEqualsRef.current?.(selectedValue) ?? false)) {\n snapshot.current = { storeValue, selector, selectedValue };\n }\n\n return snapshot.current!.selectedValue;\n }, [store, storeValueEquals, selector]);\n\n const rootStore = store.derivedFrom?.store ?? store;\n const subOptions = useMemoEquals({ ...options, runNow: false });\n\n const subscribe = useCallback(\n (listener: () => void) => {\n let _listener: (value: any) => void = listener;\n let stopped = false;\n\n if (withViewTransition && (document as any).startViewTransition) {\n let lastObservedValue: any;\n\n _listener = (value: any) => {\n const observedValue =\n withViewTransition instanceof Function ? withViewTransition(value) : value;\n\n if (equals(lastObservedValue, observedValue)) {\n listener();\n return;\n }\n\n lastObservedValue = observedValue;\n\n let hasChanges = false;\n const mutationObserver = new MutationObserver(() => {\n hasChanges = true;\n mutationObserver.disconnect();\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n\n (document as any).startViewTransition(() => {\n mutationObserver.disconnect();\n\n if (!stopped) {\n listener();\n }\n\n if (!hasChanges) {\n throw new Error('no change');\n }\n });\n };\n }\n\n const cancel = rootStore.subscribe(_listener, subOptions);\n return () => {\n stopped = true;\n cancel();\n };\n },\n [rootStore, withViewTransition, equals, subOptions],\n );\n\n let value = useSyncExternalStore<S>(subscribe, get, get);\n let lastEquals = (newValue: S) => equals(newValue, value);\n let revoke: (() => void) | undefined;\n\n if (enableTrackingProxy) {\n [value, lastEquals, revoke] = trackingProxy(value, equals);\n }\n\n useLayoutEffect(() => {\n lastEqualsRef.current = lastEquals;\n revoke?.();\n });\n\n useDebugValue(value);\n return value;\n}\n","import { createStore } from '@core';\nimport { useStore } from '@react/useStore';\nimport { createContext, useContext, useLayoutEffect, useMemo, type ReactNode } from 'react';\n\nexport interface LoadingBoundaryEntry {\n label?: ReactNode;\n}\n\nexport interface LoadingBoundaryProps {\n /**\n * Fallback node to render when there are loading components within the boundary.\n */\n fallback?: ReactNode | ((entries: LoadingBoundaryEntry[]) => ReactNode);\n\n /**\n * Child node to render when there are no loading components within the boundary.\n */\n children?: ReactNode;\n\n /**\n * Add a loading state from outside the boundary. Useful for when you want to\n * show a loading state for a component that is not a child of the boundary.\n */\n isLoading?: boolean;\n}\n\nconst LoadingBoundaryContext = createContext(createStore(new Set<LoadingBoundaryEntry>()));\n\nexport function LoadingBoundary({\n fallback,\n children,\n isLoading: isLoadingExternal,\n}: LoadingBoundaryProps): React.JSX.Element {\n const store = useMemo(() => createStore(new Set<LoadingBoundaryEntry>()), []);\n const entries = useStore(store);\n const isLoading = entries.size > 0 || isLoadingExternal;\n\n const fallbackNode = isLoading\n ? typeof fallback === 'function'\n ? fallback([...entries])\n : fallback\n : undefined;\n\n return (\n <LoadingBoundaryContext.Provider value={store}>\n {fallbackNode !== undefined ? (\n <>\n {fallbackNode}\n <div style={{ display: 'none' }}>{children}</div>\n </>\n ) : (\n children\n )}\n </LoadingBoundaryContext.Provider>\n );\n}\n\nexport function useLoadingBoundary(isLoading: boolean | undefined, label?: ReactNode): void {\n const store = useContext(LoadingBoundaryContext);\n\n useLayoutEffect(() => {\n if (!isLoading) {\n return;\n }\n\n const entry = { label };\n store.set((entries) => new Set(entries).add(entry));\n\n return () => {\n store.set((entries) => {\n const newEntries = new Set(entries);\n newEntries.delete(entry);\n return newEntries;\n });\n };\n // oxlint-disable-next-line exhaustive-deps\n }, [store, isLoading]);\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport type { Cache } from '@core';\nimport type { CacheState } from '@lib/cacheState';\nimport { makeSelector } from '@lib/makeSelector';\nimport { useLoadingBoundary } from '@react/loadingBoundary';\nimport { useEffect, useMemo, useRef } from 'react';\n\nexport type UseCacheArray<T> = [\n value: T | undefined,\n error: unknown | undefined,\n isUpdating: boolean,\n isStale: boolean,\n];\n\nexport type UseCacheValue<T> = UseCacheArray<T> & CacheState<T>;\n\nexport interface UseCacheOptions<T> extends UseStoreOptions<UseCacheArray<T> & CacheState<T>> {\n /**\n * If true, will always return undefined as value and no fetch will be triggered.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the cache will be invalidated when the component mounts.\n * @default false\n */\n updateOnMount?: boolean;\n\n /**\n * If true, `useCache` will throw a promise when the cache is pending. This can be used with React Suspense.\n * @see https://react.dev/reference/react/Suspense\n * @default false\n */\n suspense?: boolean;\n\n /**\n * If true, `useCache` will register its loading state with the nearest `LoadingBoundary`.\n * @default false\n */\n loadingBoundary?: boolean;\n}\n\nexport function useCache<T>(\n cache: Cache<T, any>,\n {\n passive,\n disabled,\n updateOnMount,\n withViewTransition,\n suspense,\n loadingBoundary,\n ...options\n }: UseCacheOptions<T> = {},\n): UseCacheValue<T> {\n if (withViewTransition === true) {\n withViewTransition = (state) => state.value;\n }\n\n const { rootCache, selector } = useMemo(() => {\n const rootCache: Cache<any, any> = cache.derivedFromCache?.cache ?? cache;\n let selector = (x: any) => x;\n\n if (cache.derivedFromCache) {\n selector = (value: any) => {\n for (const s of cache.derivedFromCache!.selectors) {\n value = makeSelector(s)(value);\n }\n return value;\n };\n }\n\n return { rootCache, selector };\n }, [cache]);\n\n const hasMounted = useRef(false);\n\n useEffect(() => {\n hasMounted.current = true;\n\n if (updateOnMount) {\n rootCache.invalidate();\n }\n // oxlint-disable-next-line exhaustive-deps\n }, []);\n\n const result = useStore(\n rootCache.state,\n (state) => {\n if (disabled) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, undefined, false, false],\n { status: 'pending', isUpdating: false, isStale: false, isConnected: false },\n );\n }\n\n const isStale = updateOnMount && !hasMounted.current ? true : state.isStale;\n try {\n const value = state.status === 'value' ? selector(state.value) : undefined;\n\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [value, state.error, state.isUpdating, isStale],\n { ...state, value, isStale },\n );\n } catch (error) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, error, state.isUpdating, isStale],\n {\n status: 'error',\n error,\n isUpdating: state.isUpdating,\n isStale: isStale,\n isConnected: state.isConnected,\n },\n );\n }\n },\n { ...options, withViewTransition, passive: passive || disabled },\n );\n\n useEffect(\n () => rootCache.subscribe(() => undefined, { passive: passive || disabled }),\n [rootCache, passive, disabled],\n );\n\n useLoadingBoundary(loadingBoundary && !disabled && result.status === 'pending');\n\n if (suspense && result.status === 'pending') {\n throw rootCache.get();\n }\n\n return result;\n}\n","import type { Cache } from '@core';\nimport { type UseCacheOptions, type UseCacheValue, useCache } from '@react/useCache';\n\nexport const cacheMethods = {\n useCache<T>(this: Cache<T, any>, options?: UseCacheOptions<T>): UseCacheValue<T> {\n return useCache(this, options);\n },\n};\n","import { useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T): { current: T } {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import useLatestRef from '@react/lib/useLatestRef';\nimport { useCallback } from 'react';\n\nexport default function useLatestFunction<Args extends any[], R>(\n fn: (...args: Args) => R,\n): (...args: Args) => R {\n const ref = useLatestRef(fn);\n\n return useCallback(\n (...args: Args) => {\n return ref.current(...args);\n },\n [ref],\n );\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport { type Selector, type Update } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { isAnyPath, type AnyPath, type SettablePath, type Value } from '@lib/path';\nimport useLatestFunction from '@react/lib/useLatestFunction';\n\nexport function useProp<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useProp<T, const P>(\n store: Store<T>,\n selector: Constrain<P, SettablePath<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useProp<T>(\n store: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useProp<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S>, (value: S) => Update<T>, UseStoreOptions<S>?]\n | [AnyPath, UseStoreOptions<Value<T, any>>?]\n | [UseStoreOptions<S>?]\n): [value: S, setValue: Store<S>['set']] {\n let selector: Selector<T, S> | AnyPath | undefined;\n let updater: ((value: S) => Update<T>) | undefined;\n let options: UseStoreOptions<S> | undefined;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selector = args[0];\n if (typeof args[1] === 'function') {\n updater = args[1];\n options = args[2];\n } else {\n options = args[1];\n }\n } else {\n options = args[0];\n }\n\n const value = useStore(store, (selector ?? ((x) => x)) as Selector<T, S>, options);\n\n const update = useLatestFunction((update) => {\n let _store: Store<any> = store;\n if (selector) {\n _store = _store.map(selector as Selector<any, any>, updater);\n }\n\n _store.set(update);\n });\n\n return [value, update];\n}\n","import { useProp } from './useProp';\nimport { useStore, type UseStoreOptions } from './useStore';\nimport type { Scope, Selector, Update } from '@core';\nimport { createStore, type Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { createContext, useContext, useMemo, type Context, type ReactNode } from 'react';\n\nexport type ScopeProps<T> = { scope: Scope<T>; store?: Store<T>; children?: ReactNode };\n\ndeclare module '@core' {\n interface Scope<T> {\n context?: Context<Store<T>>;\n }\n}\n\nfunction getScopeContext<T>(scope: Scope<T>): Context<Store<T>> {\n scope.context ??= createContext<Store<T>>(createStore(scope.defaultValue));\n return scope.context;\n}\n\nexport function ScopeProvider<T>({\n scope,\n store: inputStore,\n children,\n}: ScopeProps<T>): React.JSX.Element {\n const context = getScopeContext(scope);\n const currentStore = useMemo(\n () => inputStore ?? createStore(scope.defaultValue),\n [scope, inputStore],\n );\n\n return <context.Provider value={currentStore}>{children}</context.Provider>;\n}\n\nexport function useScope<T>(scope: Scope<T>): Store<T> {\n const context = getScopeContext(scope);\n return useContext(context);\n}\n\nexport function useScopeStore<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nexport function useScopeStore<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nexport function useScopeStore<T>(scope: Scope<T>, option?: UseStoreOptions<T>): T;\n\nexport function useScopeStore<T>(scope: Scope<T>, ...args: any[]): T {\n const store = useScope(scope);\n return useStore(store, ...args);\n}\n\nexport function useScopeProp<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useScopeProp<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n ...args: any[]\n): [value: T, setValue: Store<T>['set']] {\n const store = useScope(scope);\n return useProp(store, ...args);\n}\n","import type { Scope, Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport {\n ScopeProvider,\n useScope,\n useScopeProp,\n useScopeStore,\n type ScopeProps,\n} from '@react/scope';\nimport type { UseStoreOptions } from '@react/useStore';\n\nfunction boundUseScope<T>(this: Scope<T>): Store<T> {\n return useScope(this);\n}\n\nfunction boundUseScopeStore<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nfunction boundUseScopeStore<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nfunction boundUseScopeStore<T>(this: Scope<T>, option?: UseStoreOptions<T>): T;\n\nfunction boundUseScopeStore(this: Scope<any>, ...args: any[]) {\n return useScopeStore(this, ...args);\n}\n\nfunction boundUseScopeProp<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nfunction boundUseScopeProp<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nfunction boundUseScopeProp<T>(\n this: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nfunction boundUseScopeProp(this: Scope<any>, ...args: any[]) {\n return useScopeProp(this, ...args);\n}\n\nfunction Provider<T>(this: Scope<T>, props: Omit<ScopeProps<T>, 'scope'>): React.JSX.Element {\n return ScopeProvider({ ...props, scope: this });\n}\n\nexport const scopeMethods: {\n useScope: typeof boundUseScope;\n useStore: typeof boundUseScopeStore;\n useProp: typeof boundUseScopeProp;\n Provider: typeof Provider;\n} = {\n useScope: boundUseScope,\n useStore: boundUseScopeStore,\n useProp: boundUseScopeProp,\n Provider,\n};\n","import type { Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { useProp } from '@react/useProp';\nimport { type UseStoreOptions, useStore } from '@react/useStore';\n\nfunction boundUseStore<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\nfunction boundUseStore<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\nfunction boundUseStore<T>(this: Store<T>, option?: UseStoreOptions<T>): T;\nfunction boundUseStore(this: Store<any>, ...args: any[]) {\n return useStore(this, ...args);\n}\n\nfunction boundUseProp<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\nfunction boundUseProp<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\nfunction boundUseProp<T>(\n this: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\nfunction boundUseProp(this: Store<any>, ...args: any[]) {\n return useProp(this, ...args);\n}\n\nexport const storeMethods: {\n useStore: typeof boundUseStore;\n useProp: typeof boundUseProp;\n} = {\n useStore: boundUseStore,\n useProp: boundUseProp,\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storeMethods-pGlt0zfb.js","names":[],"sources":["../src/lib/trackingProxy.ts","../src/react/lib/useMemoEquals.ts","../src/react/useStore.ts","../src/react/loadingBoundary.tsx","../src/react/useCache.ts","../src/react/cacheMethods.ts","../src/react/lib/useLatestRef.ts","../src/react/lib/useLatestFunction.ts","../src/react/useProp.ts","../src/react/scope.tsx","../src/react/scopeMethods.ts","../src/react/storeMethods.ts"],"sourcesContent":["import { deepEqual } from './equals';\nimport { isPlainObject } from '@lib/helpers';\n\nconst unwrapProxySymbol = /* @__PURE__ */ Symbol('unwrapProxy');\n\nexport type TrackingProxy<T> = [value: T, equals: (newValue: T) => boolean, revoke?: () => void];\ntype Object_ = Record<string | symbol, unknown>;\n\nexport function trackingProxy<T>(\n value: T,\n equals: (a: any, b: any) => boolean = deepEqual,\n): TrackingProxy<T> {\n if (!isPlainObject(value) && !Array.isArray(value)) {\n return [value, (other) => equals(value, other)];\n }\n\n // Unpack proxies, we don't want to nest them\n value = (value as any)[unwrapProxySymbol] ?? value;\n\n const deps = new Array<TrackingProxy<any>[1]>();\n const revokations = new Array<() => void>();\n let revoked = false;\n\n function trackComplexProp(function_: any, ...args: any[]) {\n const [proxiedValue, equals, revoke] = trackingProxy(function_(value, ...args));\n\n deps.push((otherValue) => {\n if (!isPlainObject(otherValue) && !Array.isArray(otherValue)) {\n return false;\n }\n\n return equals(function_(otherValue, ...args));\n });\n\n if (revoke) {\n revokations.push(revoke);\n }\n\n return proxiedValue;\n }\n\n function trackSimpleProp(function_: any, ...args: any[]) {\n const calculatedValue = function_(value, ...args);\n\n deps.push((otherValue) => {\n return function_(otherValue, ...args) === calculatedValue;\n });\n\n return calculatedValue;\n }\n\n const proxy = new Proxy(value as T & Object_, {\n get(target, p, receiver) {\n if (p === unwrapProxySymbol) {\n return value;\n }\n\n if (revoked) {\n return target[p];\n }\n\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return target[p];\n }\n\n return trackComplexProp(Reflect.get, p, receiver);\n },\n\n getOwnPropertyDescriptor(target, p) {\n const { writable, configurable } = Object.getOwnPropertyDescriptor(target, p) ?? {};\n if (writable === false && configurable === false) {\n return Reflect.getOwnPropertyDescriptor(target, p);\n }\n\n return trackComplexProp(Reflect.getOwnPropertyDescriptor, p);\n },\n\n ownKeys() {\n return trackComplexProp(Reflect.ownKeys);\n },\n\n getPrototypeOf() {\n return trackSimpleProp(Reflect.getPrototypeOf);\n },\n\n has(_target, p) {\n return trackSimpleProp(Reflect.has, p);\n },\n\n isExtensible() {\n return trackSimpleProp(Reflect.isExtensible);\n },\n });\n\n return [\n proxy,\n (other) => !!other && deps.every((equals) => equals(other)),\n () => {\n revoked = true;\n revokations.forEach((revoke) => revoke());\n },\n ];\n}\n","import { deepEqual } from '@lib/equals';\nimport { useEffect, useRef } from 'react';\n\nexport default function useMemoEquals<T>(value: T, equals: (a: T, b: T) => boolean = deepEqual): T {\n const ref = useRef<{ value: T }>(undefined);\n const hasChanged = !ref.current || !equals(ref.current.value, value);\n\n useEffect(() => {\n if (hasChanged) {\n ref.current = { value };\n }\n });\n\n return hasChanged ? value : ref.current!.value;\n}\n","import type { Selector, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { deepEqual, strictEqual } from '@lib/equals';\nimport { makeSelector } from '@lib/makeSelector';\nimport { isAnyPath, type AnyPath, type Path, type Value } from '@lib/path';\nimport { trackingProxy } from '@lib/trackingProxy';\nimport useMemoEquals from '@react/lib/useMemoEquals';\nimport {\n useCallback,\n useDebugValue,\n useLayoutEffect,\n useMemo,\n useRef,\n useSyncExternalStore,\n} from 'react';\n\nexport interface UseStoreOptions<T> extends Omit<SubscribeOptions, 'runNow' | 'passive'> {\n /**\n * If true, the cache content can be consumed but no fetch will be triggered.\n * @default false\n */\n\n passive?: boolean;\n\n /**\n * (experimental) If true, the a rerender will only be triggered when a property of the returned value changes that was\n * actually accessed during the last render.\n * @default false\n */\n enableTrackingProxy?: boolean;\n\n /**\n * (experimental) If provided, a rerender will be wrapped in a browser view transition.\n */\n withViewTransition?: boolean | ((value: T) => unknown);\n}\n\nexport interface UseStoreOptionsWithSelector<T, S> extends UseStoreOptions<S> {\n /**\n * Equality function to compare the raw store values before reevaluating the selector.\n * Can be used to avoid unnecessary selector evaluations.\n * @default strictEqual\n */\n storeValueEquals?: (newValue: T, oldValue: T) => boolean;\n}\n\nexport function useStore<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptionsWithSelector<T, S>,\n): S;\n\nexport function useStore<T, const P>(\n store: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptionsWithSelector<T, Value<T, P>>,\n): Value<T, P>;\n\nexport function useStore<T>(store: Store<T>, option?: UseStoreOptions<T>): T;\n\nexport function useStore<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S> | AnyPath, UseStoreOptionsWithSelector<T, S>?]\n | [UseStoreOptionsWithSelector<T, S>?]\n): S {\n let selectorRaw: Selector<T, S> | AnyPath | undefined;\n let allOptions: UseStoreOptionsWithSelector<T, S>;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selectorRaw = args[0];\n allOptions = args[1] ?? {};\n } else {\n allOptions = args[0] ?? {};\n }\n\n const selectorMemoized = useMemoEquals(selectorRaw);\n const selector = useMemo(() => makeSelector<T, S>(selectorMemoized), [selectorMemoized]);\n const lastEqualsRef = useRef<(newValue: S) => boolean | undefined>(undefined);\n\n const {\n enableTrackingProxy,\n equals = store.options.equals ?? deepEqual,\n withViewTransition,\n storeValueEquals = strictEqual,\n ...options\n } = allOptions;\n\n const snapshot = useRef<{ storeValue: T; selector: (value: T) => S; selectedValue: S }>(\n undefined,\n );\n\n const get = useCallback(() => {\n const storeValue = store.get();\n\n if (\n snapshot.current &&\n storeValueEquals(storeValue, snapshot.current.storeValue) &&\n selector === snapshot.current.selector\n ) {\n return snapshot.current.selectedValue;\n }\n\n const selectedValue = selector(storeValue);\n if (!(lastEqualsRef.current?.(selectedValue) ?? false)) {\n snapshot.current = { storeValue, selector, selectedValue };\n }\n\n return snapshot.current!.selectedValue;\n }, [store, storeValueEquals, selector]);\n\n const rootStore = store.derivedFrom?.store ?? store;\n const subOptions = useMemoEquals({ ...options, runNow: false });\n\n const subscribe = useCallback(\n (listener: () => void) => {\n let _listener: (value: any) => void = listener;\n let stopped = false;\n\n if (withViewTransition && (document as any).startViewTransition) {\n let lastObservedValue: any;\n\n _listener = (value: any) => {\n const observedValue =\n withViewTransition instanceof Function ? withViewTransition(value) : value;\n\n if (equals(lastObservedValue, observedValue)) {\n listener();\n return;\n }\n\n lastObservedValue = observedValue;\n\n let hasChanges = false;\n const mutationObserver = new MutationObserver(() => {\n hasChanges = true;\n mutationObserver.disconnect();\n });\n mutationObserver.observe(document.body, { childList: true, subtree: true });\n\n (document as any).startViewTransition(() => {\n mutationObserver.disconnect();\n\n if (!stopped) {\n listener();\n }\n\n if (!hasChanges) {\n throw new Error('no change');\n }\n });\n };\n }\n\n const cancel = rootStore.subscribe(_listener, subOptions);\n return () => {\n stopped = true;\n cancel();\n };\n },\n [rootStore, withViewTransition, equals, subOptions],\n );\n\n let value = useSyncExternalStore<S>(subscribe, get, get);\n let lastEquals = (newValue: S) => equals(newValue, value);\n let revoke: (() => void) | undefined;\n\n if (enableTrackingProxy) {\n [value, lastEquals, revoke] = trackingProxy(value, equals);\n }\n\n useLayoutEffect(() => {\n lastEqualsRef.current = lastEquals;\n revoke?.();\n });\n\n useDebugValue(value);\n return value;\n}\n","import { createStore } from '@core';\nimport { useStore } from '@react/useStore';\nimport { createContext, useContext, useLayoutEffect, useMemo, type ReactNode } from 'react';\n\nexport interface LoadingBoundaryEntry {\n label?: ReactNode;\n}\n\nexport interface LoadingBoundaryProps {\n /**\n * Fallback node to render when there are loading components within the boundary.\n */\n fallback?: ReactNode | ((entries: LoadingBoundaryEntry[]) => ReactNode);\n\n /**\n * Child node to render when there are no loading components within the boundary.\n */\n children?: ReactNode;\n\n /**\n * Add a loading state from outside the boundary. Useful for when you want to\n * show a loading state for a component that is not a child of the boundary.\n */\n isLoading?: boolean;\n}\n\nconst LoadingBoundaryContext = createContext(createStore(new Set<LoadingBoundaryEntry>()));\n\nexport function LoadingBoundary({\n fallback,\n children,\n isLoading: isLoadingExternal,\n}: LoadingBoundaryProps): React.JSX.Element {\n const store = useMemo(() => createStore(new Set<LoadingBoundaryEntry>()), []);\n const entries = useStore(store);\n const isLoading = entries.size > 0 || isLoadingExternal;\n\n const fallbackNode = isLoading\n ? typeof fallback === 'function'\n ? fallback([...entries])\n : fallback\n : undefined;\n\n return (\n <LoadingBoundaryContext.Provider value={store}>\n {fallbackNode !== undefined ? (\n <>\n {fallbackNode}\n <div style={{ display: 'none' }}>{children}</div>\n </>\n ) : (\n children\n )}\n </LoadingBoundaryContext.Provider>\n );\n}\n\nexport function useLoadingBoundary(isLoading: boolean | undefined, label?: ReactNode): void {\n const store = useContext(LoadingBoundaryContext);\n\n useLayoutEffect(() => {\n if (!isLoading) {\n return;\n }\n\n const entry = { label };\n store.set((entries) => new Set(entries).add(entry));\n\n return () => {\n store.set((entries) => {\n const newEntries = new Set(entries);\n newEntries.delete(entry);\n return newEntries;\n });\n };\n // oxlint-disable-next-line exhaustive-deps\n }, [store, isLoading]);\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport type { Cache } from '@core';\nimport type { CacheState } from '@lib/cacheState';\nimport { makeSelector } from '@lib/makeSelector';\nimport { useLoadingBoundary } from '@react/loadingBoundary';\nimport { useEffect, useMemo, useRef } from 'react';\n\nexport type UseCacheArray<T> = [\n value: T | undefined,\n error: unknown | undefined,\n isUpdating: boolean,\n isStale: boolean,\n];\n\nexport type UseCacheValue<T> = UseCacheArray<T> & CacheState<T>;\n\nexport interface UseCacheOptions<T> extends UseStoreOptions<UseCacheArray<T> & CacheState<T>> {\n /**\n * If true, will always return undefined as value and no fetch will be triggered.\n * @default false\n */\n disabled?: boolean;\n\n /**\n * If true, the cache will be invalidated when the component mounts.\n * @default false\n */\n updateOnMount?: boolean;\n\n /**\n * If true, `useCache` will throw a promise when the cache is pending. This can be used with React Suspense.\n * @see https://react.dev/reference/react/Suspense\n * @default false\n */\n suspense?: boolean;\n\n /**\n * If true, `useCache` will register its loading state with the nearest `LoadingBoundary`.\n * @default false\n */\n loadingBoundary?: boolean;\n}\n\nexport function useCache<T>(\n cache: Cache<T, any>,\n {\n passive,\n disabled,\n updateOnMount,\n withViewTransition,\n suspense,\n loadingBoundary,\n ...options\n }: UseCacheOptions<T> = {},\n): UseCacheValue<T> {\n if (withViewTransition === true) {\n withViewTransition = (state) => state.value;\n }\n\n const { rootCache, selector } = useMemo(() => {\n const rootCache: Cache<any, any> = cache.derivedFromCache?.cache ?? cache;\n let selector = (x: any) => x;\n\n if (cache.derivedFromCache) {\n selector = (value: any) => {\n for (const s of cache.derivedFromCache!.selectors) {\n value = makeSelector(s)(value);\n }\n return value;\n };\n }\n\n return { rootCache, selector };\n }, [cache]);\n\n const hasMounted = useRef(false);\n\n useEffect(() => {\n hasMounted.current = true;\n\n if (updateOnMount) {\n rootCache.invalidate();\n }\n // oxlint-disable-next-line exhaustive-deps\n }, []);\n\n const result = useStore(\n rootCache.state,\n (state) => {\n if (disabled) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, undefined, false, false],\n { status: 'pending', isUpdating: false, isStale: false, isConnected: false },\n );\n }\n\n const isStale = updateOnMount && !hasMounted.current ? true : state.isStale;\n try {\n const value = state.status === 'value' ? selector(state.value) : undefined;\n\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [value, state.error, state.isUpdating, isStale],\n { ...state, value, isStale },\n );\n } catch (error) {\n return Object.assign<UseCacheArray<T>, CacheState<T>>(\n [undefined, error, state.isUpdating, isStale],\n {\n status: 'error',\n error,\n isUpdating: state.isUpdating,\n isStale: isStale,\n isConnected: state.isConnected,\n },\n );\n }\n },\n { ...options, withViewTransition, passive: passive || disabled },\n );\n\n useEffect(\n () => rootCache.subscribe(() => undefined, { passive: passive || disabled }),\n [rootCache, passive, disabled],\n );\n\n useLoadingBoundary(loadingBoundary && !disabled && result.status === 'pending');\n\n if (suspense && result.status === 'pending') {\n throw rootCache.get();\n }\n\n return result;\n}\n","import type { Cache } from '@core';\nimport { type UseCacheOptions, type UseCacheValue, useCache } from '@react/useCache';\n\nexport const cacheMethods = {\n useCache<T>(this: Cache<T, any>, options?: UseCacheOptions<T>): UseCacheValue<T> {\n return useCache(this, options);\n },\n};\n","import { useRef } from 'react';\n\nexport default function useLatestRef<T>(value: T): { current: T } {\n const ref = useRef(value);\n ref.current = value;\n return ref;\n}\n","import useLatestRef from '@react/lib/useLatestRef';\nimport { useCallback } from 'react';\n\nexport default function useLatestFunction<Args extends any[], R>(\n fn: (...args: Args) => R,\n): (...args: Args) => R {\n const ref = useLatestRef(fn);\n\n return useCallback(\n (...args: Args) => {\n return ref.current(...args);\n },\n [ref],\n );\n}\n","import { useStore, type UseStoreOptions } from './useStore';\nimport { type Selector, type Update } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport { isAnyPath, type AnyPath, type SettablePath, type Value } from '@lib/path';\nimport useLatestFunction from '@react/lib/useLatestFunction';\n\nexport function useProp<T, S>(\n store: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useProp<T, const P>(\n store: Store<T>,\n selector: Constrain<P, SettablePath<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useProp<T>(\n store: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useProp<T, S>(\n store: Store<T>,\n ...args:\n | [Selector<T, S>, (value: S) => Update<T>, UseStoreOptions<S>?]\n | [AnyPath, UseStoreOptions<Value<T, any>>?]\n | [UseStoreOptions<S>?]\n): [value: S, setValue: Store<S>['set']] {\n let selector: Selector<T, S> | AnyPath | undefined;\n let updater: ((value: S) => Update<T>) | undefined;\n let options: UseStoreOptions<S> | undefined;\n\n if (typeof args[0] === 'function' || isAnyPath(args[0])) {\n selector = args[0];\n if (typeof args[1] === 'function') {\n updater = args[1];\n options = args[2];\n } else {\n options = args[1];\n }\n } else {\n options = args[0];\n }\n\n const value = useStore(store, (selector ?? ((x) => x)) as Selector<T, S>, options);\n\n const update = useLatestFunction((update) => {\n let _store: Store<any> = store;\n if (selector) {\n _store = _store.map(selector as Selector<any, any>, updater);\n }\n\n _store.set(update);\n });\n\n return [value, update];\n}\n","import { useProp } from './useProp';\nimport { useStore, type UseStoreOptions } from './useStore';\nimport type { Scope, Selector, Update } from '@core';\nimport { createStore, type Store } from '@core/store';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { createContext, useContext, useMemo, type Context, type ReactNode } from 'react';\n\nexport type ScopeProps<T> = { scope: Scope<T>; store?: Store<T>; children?: ReactNode };\n\ndeclare module '..' {\n interface Scope<T> {\n context?: Context<Store<T>>;\n }\n}\n\nfunction getScopeContext<T>(scope: Scope<T>): Context<Store<T>> {\n scope.context ??= createContext<Store<T>>(createStore(scope.defaultValue));\n return scope.context;\n}\n\nexport function ScopeProvider<T>({\n scope,\n store: inputStore,\n children,\n}: ScopeProps<T>): React.JSX.Element {\n const context = getScopeContext(scope);\n const currentStore = useMemo(\n () => inputStore ?? createStore(scope.defaultValue),\n [scope, inputStore],\n );\n\n return <context.Provider value={currentStore}>{children}</context.Provider>;\n}\n\nexport function useScope<T>(scope: Scope<T>): Store<T> {\n const context = getScopeContext(scope);\n return useContext(context);\n}\n\nexport function useScopeStore<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nexport function useScopeStore<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nexport function useScopeStore<T>(scope: Scope<T>, option?: UseStoreOptions<T>): T;\n\nexport function useScopeStore<T>(scope: Scope<T>, ...args: any[]): T {\n const store = useScope(scope);\n return useStore(store, ...args);\n}\n\nexport function useScopeProp<T, S>(\n scope: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nexport function useScopeProp<T, const P>(\n scope: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nexport function useScopeProp<T>(\n scope: Scope<T>,\n ...args: any[]\n): [value: T, setValue: Store<T>['set']] {\n const store = useScope(scope);\n return useProp(store, ...args);\n}\n","import type { Scope, Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport {\n ScopeProvider,\n useScope,\n useScopeProp,\n useScopeStore,\n type ScopeProps,\n} from '@react/scope';\nimport type { UseStoreOptions } from '@react/useStore';\n\nfunction boundUseScope<T>(this: Scope<T>): Store<T> {\n return useScope(this);\n}\n\nfunction boundUseScopeStore<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\n\nfunction boundUseScopeStore<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\n\nfunction boundUseScopeStore<T>(this: Scope<T>, option?: UseStoreOptions<T>): T;\n\nfunction boundUseScopeStore(this: Scope<any>, ...args: any[]) {\n return useScopeStore(this, ...args);\n}\n\nfunction boundUseScopeProp<T, S>(\n this: Scope<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\n\nfunction boundUseScopeProp<T, const P>(\n this: Scope<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\n\nfunction boundUseScopeProp<T>(\n this: Scope<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\n\nfunction boundUseScopeProp(this: Scope<any>, ...args: any[]) {\n return useScopeProp(this, ...args);\n}\n\nfunction Provider<T>(this: Scope<T>, props: Omit<ScopeProps<T>, 'scope'>): React.JSX.Element {\n return ScopeProvider({ ...props, scope: this });\n}\n\nexport const scopeMethods: {\n useScope: typeof boundUseScope;\n useStore: typeof boundUseScopeStore;\n useProp: typeof boundUseScopeProp;\n Provider: typeof Provider;\n} = {\n useScope: boundUseScope,\n useStore: boundUseScopeStore,\n useProp: boundUseScopeProp,\n Provider,\n};\n","import type { Selector, Store, Update } from '@core';\nimport type { Constrain } from '@lib/constrain';\nimport type { Path, Value } from '@lib/path';\nimport { useProp } from '@react/useProp';\nimport { type UseStoreOptions, useStore } from '@react/useStore';\n\nfunction boundUseStore<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n option?: UseStoreOptions<S>,\n): S;\nfunction boundUseStore<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n option?: UseStoreOptions<Value<T, P>>,\n): Value<T, P>;\nfunction boundUseStore<T>(this: Store<T>, option?: UseStoreOptions<T>): T;\nfunction boundUseStore(this: Store<any>, ...args: any[]) {\n return useStore(this, ...args);\n}\n\nfunction boundUseProp<T, S>(\n this: Store<T>,\n selector: Selector<T, S>,\n updater: (value: S) => Update<T>,\n options?: UseStoreOptions<S>,\n): [value: S, setValue: Store<S>['set']];\nfunction boundUseProp<T, const P>(\n this: Store<T>,\n selector: Constrain<P, Path<T>>,\n options?: UseStoreOptions<Value<T, P>>,\n): [value: Value<T, P>, setValue: Store<Value<T, P>>['set']];\nfunction boundUseProp<T>(\n this: Store<T>,\n options?: UseStoreOptions<T>,\n): [value: T, setValue: Store<T>['set']];\nfunction boundUseProp(this: Store<any>, ...args: any[]) {\n return useProp(this, ...args);\n}\n\nexport const storeMethods: {\n useStore: typeof boundUseStore;\n useProp: typeof boundUseProp;\n} = {\n useStore: boundUseStore,\n useProp: boundUseProp,\n};\n"],"mappings":"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"}
|