@zag-js/store 0.59.0 → 0.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/proxy.ts +5 -5
package/dist/index.js
CHANGED
|
@@ -45,7 +45,7 @@ function makeGlobal(key, value) {
|
|
|
45
45
|
|
|
46
46
|
// src/proxy.ts
|
|
47
47
|
var import_proxy_compare = require("proxy-compare");
|
|
48
|
-
var isDev = process.env.NODE_ENV !== "production";
|
|
48
|
+
var isDev = () => process.env.NODE_ENV !== "production";
|
|
49
49
|
var isObject = (x) => typeof x === "object" && x !== null;
|
|
50
50
|
var proxyStateMap = makeGlobal("__zag__proxyStateMap", () => /* @__PURE__ */ new WeakMap());
|
|
51
51
|
var refSet = makeGlobal("__zag__refSet", () => /* @__PURE__ */ new WeakSet());
|
|
@@ -120,7 +120,7 @@ var buildProxyFunction = (objectIs = Object.is, newProxy = (target, handler) =>
|
|
|
120
120
|
};
|
|
121
121
|
const propProxyStates = /* @__PURE__ */ new Map();
|
|
122
122
|
const addPropListener = (prop, propProxyState) => {
|
|
123
|
-
if (isDev && propProxyStates.has(prop)) {
|
|
123
|
+
if (isDev() && propProxyStates.has(prop)) {
|
|
124
124
|
throw new Error("prop listener already exists");
|
|
125
125
|
}
|
|
126
126
|
if (listeners.size) {
|
|
@@ -141,7 +141,7 @@ var buildProxyFunction = (objectIs = Object.is, newProxy = (target, handler) =>
|
|
|
141
141
|
listeners.add(listener);
|
|
142
142
|
if (listeners.size === 1) {
|
|
143
143
|
propProxyStates.forEach(([propProxyState, prevRemove], prop) => {
|
|
144
|
-
if (isDev && prevRemove) {
|
|
144
|
+
if (isDev() && prevRemove) {
|
|
145
145
|
throw new Error("remove already exists");
|
|
146
146
|
}
|
|
147
147
|
const remove = propProxyState[3](createPropListener(prop));
|
|
@@ -241,7 +241,7 @@ function proxy(initialObject = {}) {
|
|
|
241
241
|
}
|
|
242
242
|
function subscribe(proxyObject, callback, notifyInSync) {
|
|
243
243
|
const proxyState = proxyStateMap.get(proxyObject);
|
|
244
|
-
if (isDev && !proxyState) {
|
|
244
|
+
if (isDev() && !proxyState) {
|
|
245
245
|
console.warn("Please use proxy object");
|
|
246
246
|
}
|
|
247
247
|
let promise;
|
|
@@ -272,7 +272,7 @@ function subscribe(proxyObject, callback, notifyInSync) {
|
|
|
272
272
|
}
|
|
273
273
|
function snapshot(proxyObject, handlePromise) {
|
|
274
274
|
const proxyState = proxyStateMap.get(proxyObject);
|
|
275
|
-
if (isDev && !proxyState) {
|
|
275
|
+
if (isDev() && !proxyState) {
|
|
276
276
|
console.warn("Please use proxy object");
|
|
277
277
|
}
|
|
278
278
|
const [target, ensureVersion, createSnapshot] = proxyState;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/global.ts","../src/proxy.ts","../src/proxy-computed.ts"],"sourcesContent":["export { makeGlobal } from \"./global\"\nexport { proxy, ref, snapshot, subscribe, type Ref, type Snapshot } from \"./proxy\"\nexport { proxyWithComputed } from \"./proxy-computed\"\n","function getGlobal(): any {\n if (typeof globalThis !== \"undefined\") return globalThis\n if (typeof self !== \"undefined\") return self\n if (typeof window !== \"undefined\") return window\n if (typeof global !== \"undefined\") return global\n}\n\nexport function makeGlobal<T>(key: string, value: () => T): T {\n const g = getGlobal()\n if (!g) return value()\n g[key] ||= value()\n return g[key]\n}\n","// Credits: https://github.com/pmndrs/valtio\n\nimport { getUntracked, markToTrack } from \"proxy-compare\"\nimport { makeGlobal } from \"./global\"\n\nconst isDev = process.env.NODE_ENV !== \"production\"\nconst isObject = (x: unknown): x is object => typeof x === \"object\" && x !== null\n\ntype AsRef = { $$valtioRef: true }\n\ntype ProxyObject = object\n\ntype Path = (string | symbol)[]\n\ntype Op =\n | [op: \"set\", path: Path, value: unknown, prevValue: unknown]\n | [op: \"delete\", path: Path, prevValue: unknown]\n | [op: \"resolve\", path: Path, value: unknown]\n | [op: \"reject\", path: Path, error: unknown]\n\ntype Listener = (op: Op, nextVersion: number) => void\n\ntype AnyFunction = (...args: any[]) => any\n\nexport type Snapshot<T> = T extends AnyFunction\n ? T\n : T extends AsRef\n ? T\n : T extends Promise<any>\n ? Awaited<T>\n : {\n readonly [K in keyof T]: Snapshot<T[K]>\n }\n\ntype HandlePromise = <P extends Promise<any>>(promise: P) => Awaited<P>\n\ntype CreateSnapshot = <T extends object>(target: T, version: number, handlePromise?: HandlePromise) => T\n\ntype RemoveListener = () => void\ntype AddListener = (listener: Listener) => RemoveListener\n\ntype ProxyState = readonly [\n target: object,\n ensureVersion: (nextCheckVersion?: number) => number,\n createSnapshot: CreateSnapshot,\n addListener: AddListener,\n]\n\n// shared state\nconst proxyStateMap = makeGlobal(\"__zag__proxyStateMap\", () => new WeakMap<ProxyObject, ProxyState>())\nconst refSet = makeGlobal(\"__zag__refSet\", () => new WeakSet())\n\nconst buildProxyFunction = (\n objectIs = Object.is,\n\n newProxy = <T extends object>(target: T, handler: ProxyHandler<T>): T => new Proxy(target, handler),\n\n canProxy = (x: unknown) =>\n isObject(x) &&\n !refSet.has(x) &&\n (Array.isArray(x) || !(Symbol.iterator in x)) &&\n !(x instanceof WeakMap) &&\n !(x instanceof WeakSet) &&\n !(x instanceof Error) &&\n !(x instanceof Number) &&\n !(x instanceof Date) &&\n !(x instanceof String) &&\n !(x instanceof RegExp) &&\n !(x instanceof ArrayBuffer),\n\n defaultHandlePromise = <P extends Promise<any>>(\n promise: P & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\"\n value?: Awaited<P>\n reason?: unknown\n },\n ) => {\n switch (promise.status) {\n case \"fulfilled\":\n return promise.value as Awaited<P>\n case \"rejected\":\n throw promise.reason\n default:\n throw promise\n }\n },\n\n snapCache = new WeakMap<object, [version: number, snap: unknown]>(),\n\n createSnapshot: CreateSnapshot = <T extends object>(\n target: T,\n version: number,\n handlePromise: HandlePromise = defaultHandlePromise,\n ): T => {\n const cache = snapCache.get(target)\n if (cache?.[0] === version) {\n return cache[1] as T\n }\n const snap: any = Array.isArray(target) ? [] : Object.create(Object.getPrototypeOf(target))\n markToTrack(snap, true) // mark to track\n snapCache.set(target, [version, snap])\n Reflect.ownKeys(target).forEach((key) => {\n const value = Reflect.get(target, key)\n if (refSet.has(value as object)) {\n markToTrack(value as object, false) // mark not to track\n snap[key] = value\n } else if (value instanceof Promise) {\n Object.defineProperty(snap, key, {\n get() {\n return handlePromise(value)\n },\n })\n } else if (proxyStateMap.has(value as object)) {\n snap[key] = snapshot(value as object, handlePromise)\n } else {\n snap[key] = value\n }\n })\n return Object.freeze(snap)\n },\n\n proxyCache = new WeakMap<object, ProxyObject>(),\n\n versionHolder = [1, 1] as [number, number],\n\n proxyFunction = <T extends object>(initialObject: T): T => {\n if (!isObject(initialObject)) {\n throw new Error(\"object required\")\n }\n const found = proxyCache.get(initialObject) as T | undefined\n if (found) {\n return found\n }\n let version = versionHolder[0]\n const listeners = new Set<Listener>()\n const notifyUpdate = (op: Op, nextVersion = ++versionHolder[0]) => {\n if (version !== nextVersion) {\n version = nextVersion\n listeners.forEach((listener) => listener(op, nextVersion))\n }\n }\n let checkVersion = versionHolder[1]\n const ensureVersion = (nextCheckVersion = ++versionHolder[1]) => {\n if (checkVersion !== nextCheckVersion && !listeners.size) {\n checkVersion = nextCheckVersion\n propProxyStates.forEach(([propProxyState]) => {\n const propVersion = propProxyState[1](nextCheckVersion)\n if (propVersion > version) {\n version = propVersion\n }\n })\n }\n return version\n }\n const createPropListener =\n (prop: string | symbol): Listener =>\n (op, nextVersion) => {\n const newOp: Op = [...op]\n newOp[1] = [prop, ...(newOp[1] as Path)]\n notifyUpdate(newOp, nextVersion)\n }\n const propProxyStates = new Map<string | symbol, readonly [ProxyState, RemoveListener?]>()\n const addPropListener = (prop: string | symbol, propProxyState: ProxyState) => {\n if (isDev && propProxyStates.has(prop)) {\n throw new Error(\"prop listener already exists\")\n }\n if (listeners.size) {\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n } else {\n propProxyStates.set(prop, [propProxyState])\n }\n }\n const removePropListener = (prop: string | symbol) => {\n const entry = propProxyStates.get(prop)\n if (entry) {\n propProxyStates.delete(prop)\n entry[1]?.()\n }\n }\n const addListener = (listener: Listener) => {\n listeners.add(listener)\n if (listeners.size === 1) {\n propProxyStates.forEach(([propProxyState, prevRemove], prop) => {\n if (isDev && prevRemove) {\n throw new Error(\"remove already exists\")\n }\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n })\n }\n const removeListener = () => {\n listeners.delete(listener)\n if (listeners.size === 0) {\n propProxyStates.forEach(([propProxyState, remove], prop) => {\n if (remove) {\n remove()\n propProxyStates.set(prop, [propProxyState])\n }\n })\n }\n }\n return removeListener\n }\n const baseObject = Array.isArray(initialObject) ? [] : Object.create(Object.getPrototypeOf(initialObject))\n const handler: ProxyHandler<T> = {\n deleteProperty(target: T, prop: string | symbol) {\n const prevValue = Reflect.get(target, prop)\n removePropListener(prop)\n const deleted = Reflect.deleteProperty(target, prop)\n if (deleted) {\n notifyUpdate([\"delete\", [prop], prevValue])\n }\n return deleted\n },\n set(target: T, prop: string | symbol, value: any, receiver: object) {\n const hasPrevValue = Reflect.has(target, prop)\n const prevValue = Reflect.get(target, prop, receiver)\n if (\n hasPrevValue &&\n (objectIs(prevValue, value) || (proxyCache.has(value) && objectIs(prevValue, proxyCache.get(value))))\n ) {\n return true\n }\n removePropListener(prop)\n if (isObject(value)) {\n value = getUntracked(value) || value\n }\n let nextValue = value\n if (Object.getOwnPropertyDescriptor(target, prop)?.set) {\n // do nothing\n } else if (value instanceof Promise) {\n value\n .then((v) => {\n Object.assign(value, { status: \"fulfilled\", value: v })\n notifyUpdate([\"resolve\", [prop], v])\n })\n .catch((e) => {\n Object.assign(value, { status: \"rejected\", reason: e })\n notifyUpdate([\"reject\", [prop], e])\n })\n } else {\n if (!proxyStateMap.has(value) && canProxy(value)) {\n nextValue = proxy(value)\n }\n const childProxyState = !refSet.has(nextValue) && proxyStateMap.get(nextValue)\n if (childProxyState) {\n addPropListener(prop, childProxyState)\n }\n }\n Reflect.set(target, prop, nextValue, receiver)\n notifyUpdate([\"set\", [prop], value, prevValue])\n return true\n },\n }\n const proxyObject = newProxy(baseObject, handler)\n proxyCache.set(initialObject, proxyObject)\n const proxyState: ProxyState = [baseObject, ensureVersion, createSnapshot, addListener]\n proxyStateMap.set(proxyObject, proxyState)\n Reflect.ownKeys(initialObject).forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(initialObject, key) as PropertyDescriptor\n if (desc.get || desc.set) {\n Object.defineProperty(baseObject, key, desc)\n } else {\n proxyObject[key as keyof T] = initialObject[key as keyof T]\n }\n })\n return proxyObject\n },\n) =>\n [\n // public functions\n proxyFunction,\n // shared state\n proxyStateMap,\n refSet,\n // internal things\n objectIs,\n newProxy,\n canProxy,\n defaultHandlePromise,\n snapCache,\n createSnapshot,\n proxyCache,\n versionHolder,\n ] as const\n\nconst [proxyFunction] = buildProxyFunction()\n\nexport function proxy<T extends object>(initialObject: T = {} as T): T {\n return proxyFunction(initialObject)\n}\n\nexport function getVersion(proxyObject: unknown): number | undefined {\n const proxyState = proxyStateMap.get(proxyObject as object)\n return proxyState?.[1]()\n}\n\nexport function subscribe<T extends object>(\n proxyObject: T,\n callback: (ops: Op[]) => void,\n notifyInSync?: boolean,\n): () => void {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n let promise: Promise<void> | undefined\n const ops: Op[] = []\n const addListener = (proxyState as ProxyState)[3]\n let isListenerActive = false\n const listener: Listener = (op) => {\n ops.push(op)\n if (notifyInSync) {\n callback(ops.splice(0))\n return\n }\n if (!promise) {\n promise = Promise.resolve().then(() => {\n promise = undefined\n if (isListenerActive) {\n callback(ops.splice(0))\n }\n })\n }\n }\n const removeListener = addListener(listener)\n isListenerActive = true\n return () => {\n isListenerActive = false\n removeListener()\n }\n}\n\nexport function snapshot<T extends object>(proxyObject: T, handlePromise?: HandlePromise): Snapshot<T> {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n const [target, ensureVersion, createSnapshot] = proxyState as ProxyState\n return createSnapshot(target, ensureVersion(), handlePromise) as Snapshot<T>\n}\n\nexport function ref<T extends object>(obj: T): Ref<T> {\n refSet.add(obj)\n return obj as T & AsRef\n}\n\nexport type Ref<T> = T & AsRef\n","import { proxy, snapshot, type Snapshot } from \"./proxy\"\n\nexport function proxyWithComputed<T extends object, U extends object>(\n initialObject: T,\n computedFns: {\n [K in keyof U]:\n | ((snap: Snapshot<T>) => U[K])\n | {\n get: (snap: Snapshot<T>) => U[K]\n set?: (state: T, newValue: U[K]) => void\n }\n },\n) {\n const keys = Object.keys(computedFns) as (keyof U)[]\n keys.forEach((key) => {\n if (Object.getOwnPropertyDescriptor(initialObject, key)) {\n throw new Error(\"object property already defined\")\n }\n const computedFn = computedFns[key]\n const { get, set } = (typeof computedFn === \"function\" ? { get: computedFn } : computedFn) as {\n get: (snap: Snapshot<T>) => U[typeof key]\n set?: (state: T, newValue: U[typeof key]) => void\n }\n const desc: PropertyDescriptor = {}\n desc.get = () => get(snapshot(proxyObject))\n if (set) {\n desc.set = (newValue) => set(proxyObject, newValue)\n }\n Object.defineProperty(initialObject, key, desc)\n })\n const proxyObject = proxy(initialObject) as T & U\n return proxyObject\n}\n"],"mappings":"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","names":["proxyFunction"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/global.ts","../src/proxy.ts","../src/proxy-computed.ts"],"sourcesContent":["export { makeGlobal } from \"./global\"\nexport { proxy, ref, snapshot, subscribe, type Ref, type Snapshot } from \"./proxy\"\nexport { proxyWithComputed } from \"./proxy-computed\"\n","function getGlobal(): any {\n if (typeof globalThis !== \"undefined\") return globalThis\n if (typeof self !== \"undefined\") return self\n if (typeof window !== \"undefined\") return window\n if (typeof global !== \"undefined\") return global\n}\n\nexport function makeGlobal<T>(key: string, value: () => T): T {\n const g = getGlobal()\n if (!g) return value()\n g[key] ||= value()\n return g[key]\n}\n","// Credits: https://github.com/pmndrs/valtio\n\nimport { getUntracked, markToTrack } from \"proxy-compare\"\nimport { makeGlobal } from \"./global\"\n\nconst isDev = () => process.env.NODE_ENV !== \"production\"\nconst isObject = (x: unknown): x is object => typeof x === \"object\" && x !== null\n\ntype AsRef = { $$valtioRef: true }\n\ntype ProxyObject = object\n\ntype Path = (string | symbol)[]\n\ntype Op =\n | [op: \"set\", path: Path, value: unknown, prevValue: unknown]\n | [op: \"delete\", path: Path, prevValue: unknown]\n | [op: \"resolve\", path: Path, value: unknown]\n | [op: \"reject\", path: Path, error: unknown]\n\ntype Listener = (op: Op, nextVersion: number) => void\n\ntype AnyFunction = (...args: any[]) => any\n\nexport type Snapshot<T> = T extends AnyFunction\n ? T\n : T extends AsRef\n ? T\n : T extends Promise<any>\n ? Awaited<T>\n : {\n readonly [K in keyof T]: Snapshot<T[K]>\n }\n\ntype HandlePromise = <P extends Promise<any>>(promise: P) => Awaited<P>\n\ntype CreateSnapshot = <T extends object>(target: T, version: number, handlePromise?: HandlePromise) => T\n\ntype RemoveListener = () => void\ntype AddListener = (listener: Listener) => RemoveListener\n\ntype ProxyState = readonly [\n target: object,\n ensureVersion: (nextCheckVersion?: number) => number,\n createSnapshot: CreateSnapshot,\n addListener: AddListener,\n]\n\n// shared state\nconst proxyStateMap = makeGlobal(\"__zag__proxyStateMap\", () => new WeakMap<ProxyObject, ProxyState>())\nconst refSet = makeGlobal(\"__zag__refSet\", () => new WeakSet())\n\nconst buildProxyFunction = (\n objectIs = Object.is,\n\n newProxy = <T extends object>(target: T, handler: ProxyHandler<T>): T => new Proxy(target, handler),\n\n canProxy = (x: unknown) =>\n isObject(x) &&\n !refSet.has(x) &&\n (Array.isArray(x) || !(Symbol.iterator in x)) &&\n !(x instanceof WeakMap) &&\n !(x instanceof WeakSet) &&\n !(x instanceof Error) &&\n !(x instanceof Number) &&\n !(x instanceof Date) &&\n !(x instanceof String) &&\n !(x instanceof RegExp) &&\n !(x instanceof ArrayBuffer),\n\n defaultHandlePromise = <P extends Promise<any>>(\n promise: P & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\"\n value?: Awaited<P>\n reason?: unknown\n },\n ) => {\n switch (promise.status) {\n case \"fulfilled\":\n return promise.value as Awaited<P>\n case \"rejected\":\n throw promise.reason\n default:\n throw promise\n }\n },\n\n snapCache = new WeakMap<object, [version: number, snap: unknown]>(),\n\n createSnapshot: CreateSnapshot = <T extends object>(\n target: T,\n version: number,\n handlePromise: HandlePromise = defaultHandlePromise,\n ): T => {\n const cache = snapCache.get(target)\n if (cache?.[0] === version) {\n return cache[1] as T\n }\n const snap: any = Array.isArray(target) ? [] : Object.create(Object.getPrototypeOf(target))\n markToTrack(snap, true) // mark to track\n snapCache.set(target, [version, snap])\n Reflect.ownKeys(target).forEach((key) => {\n const value = Reflect.get(target, key)\n if (refSet.has(value as object)) {\n markToTrack(value as object, false) // mark not to track\n snap[key] = value\n } else if (value instanceof Promise) {\n Object.defineProperty(snap, key, {\n get() {\n return handlePromise(value)\n },\n })\n } else if (proxyStateMap.has(value as object)) {\n snap[key] = snapshot(value as object, handlePromise)\n } else {\n snap[key] = value\n }\n })\n return Object.freeze(snap)\n },\n\n proxyCache = new WeakMap<object, ProxyObject>(),\n\n versionHolder = [1, 1] as [number, number],\n\n proxyFunction = <T extends object>(initialObject: T): T => {\n if (!isObject(initialObject)) {\n throw new Error(\"object required\")\n }\n const found = proxyCache.get(initialObject) as T | undefined\n if (found) {\n return found\n }\n let version = versionHolder[0]\n const listeners = new Set<Listener>()\n const notifyUpdate = (op: Op, nextVersion = ++versionHolder[0]) => {\n if (version !== nextVersion) {\n version = nextVersion\n listeners.forEach((listener) => listener(op, nextVersion))\n }\n }\n let checkVersion = versionHolder[1]\n const ensureVersion = (nextCheckVersion = ++versionHolder[1]) => {\n if (checkVersion !== nextCheckVersion && !listeners.size) {\n checkVersion = nextCheckVersion\n propProxyStates.forEach(([propProxyState]) => {\n const propVersion = propProxyState[1](nextCheckVersion)\n if (propVersion > version) {\n version = propVersion\n }\n })\n }\n return version\n }\n const createPropListener =\n (prop: string | symbol): Listener =>\n (op, nextVersion) => {\n const newOp: Op = [...op]\n newOp[1] = [prop, ...(newOp[1] as Path)]\n notifyUpdate(newOp, nextVersion)\n }\n const propProxyStates = new Map<string | symbol, readonly [ProxyState, RemoveListener?]>()\n const addPropListener = (prop: string | symbol, propProxyState: ProxyState) => {\n if (isDev() && propProxyStates.has(prop)) {\n throw new Error(\"prop listener already exists\")\n }\n if (listeners.size) {\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n } else {\n propProxyStates.set(prop, [propProxyState])\n }\n }\n const removePropListener = (prop: string | symbol) => {\n const entry = propProxyStates.get(prop)\n if (entry) {\n propProxyStates.delete(prop)\n entry[1]?.()\n }\n }\n const addListener = (listener: Listener) => {\n listeners.add(listener)\n if (listeners.size === 1) {\n propProxyStates.forEach(([propProxyState, prevRemove], prop) => {\n if (isDev() && prevRemove) {\n throw new Error(\"remove already exists\")\n }\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n })\n }\n const removeListener = () => {\n listeners.delete(listener)\n if (listeners.size === 0) {\n propProxyStates.forEach(([propProxyState, remove], prop) => {\n if (remove) {\n remove()\n propProxyStates.set(prop, [propProxyState])\n }\n })\n }\n }\n return removeListener\n }\n const baseObject = Array.isArray(initialObject) ? [] : Object.create(Object.getPrototypeOf(initialObject))\n const handler: ProxyHandler<T> = {\n deleteProperty(target: T, prop: string | symbol) {\n const prevValue = Reflect.get(target, prop)\n removePropListener(prop)\n const deleted = Reflect.deleteProperty(target, prop)\n if (deleted) {\n notifyUpdate([\"delete\", [prop], prevValue])\n }\n return deleted\n },\n set(target: T, prop: string | symbol, value: any, receiver: object) {\n const hasPrevValue = Reflect.has(target, prop)\n const prevValue = Reflect.get(target, prop, receiver)\n if (\n hasPrevValue &&\n (objectIs(prevValue, value) || (proxyCache.has(value) && objectIs(prevValue, proxyCache.get(value))))\n ) {\n return true\n }\n removePropListener(prop)\n if (isObject(value)) {\n value = getUntracked(value) || value\n }\n let nextValue = value\n if (Object.getOwnPropertyDescriptor(target, prop)?.set) {\n // do nothing\n } else if (value instanceof Promise) {\n value\n .then((v) => {\n Object.assign(value, { status: \"fulfilled\", value: v })\n notifyUpdate([\"resolve\", [prop], v])\n })\n .catch((e) => {\n Object.assign(value, { status: \"rejected\", reason: e })\n notifyUpdate([\"reject\", [prop], e])\n })\n } else {\n if (!proxyStateMap.has(value) && canProxy(value)) {\n nextValue = proxy(value)\n }\n const childProxyState = !refSet.has(nextValue) && proxyStateMap.get(nextValue)\n if (childProxyState) {\n addPropListener(prop, childProxyState)\n }\n }\n Reflect.set(target, prop, nextValue, receiver)\n notifyUpdate([\"set\", [prop], value, prevValue])\n return true\n },\n }\n const proxyObject = newProxy(baseObject, handler)\n proxyCache.set(initialObject, proxyObject)\n const proxyState: ProxyState = [baseObject, ensureVersion, createSnapshot, addListener]\n proxyStateMap.set(proxyObject, proxyState)\n Reflect.ownKeys(initialObject).forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(initialObject, key) as PropertyDescriptor\n if (desc.get || desc.set) {\n Object.defineProperty(baseObject, key, desc)\n } else {\n proxyObject[key as keyof T] = initialObject[key as keyof T]\n }\n })\n return proxyObject\n },\n) =>\n [\n // public functions\n proxyFunction,\n // shared state\n proxyStateMap,\n refSet,\n // internal things\n objectIs,\n newProxy,\n canProxy,\n defaultHandlePromise,\n snapCache,\n createSnapshot,\n proxyCache,\n versionHolder,\n ] as const\n\nconst [proxyFunction] = buildProxyFunction()\n\nexport function proxy<T extends object>(initialObject: T = {} as T): T {\n return proxyFunction(initialObject)\n}\n\nexport function getVersion(proxyObject: unknown): number | undefined {\n const proxyState = proxyStateMap.get(proxyObject as object)\n return proxyState?.[1]()\n}\n\nexport function subscribe<T extends object>(\n proxyObject: T,\n callback: (ops: Op[]) => void,\n notifyInSync?: boolean,\n): () => void {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev() && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n let promise: Promise<void> | undefined\n const ops: Op[] = []\n const addListener = (proxyState as ProxyState)[3]\n let isListenerActive = false\n const listener: Listener = (op) => {\n ops.push(op)\n if (notifyInSync) {\n callback(ops.splice(0))\n return\n }\n if (!promise) {\n promise = Promise.resolve().then(() => {\n promise = undefined\n if (isListenerActive) {\n callback(ops.splice(0))\n }\n })\n }\n }\n const removeListener = addListener(listener)\n isListenerActive = true\n return () => {\n isListenerActive = false\n removeListener()\n }\n}\n\nexport function snapshot<T extends object>(proxyObject: T, handlePromise?: HandlePromise): Snapshot<T> {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev() && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n const [target, ensureVersion, createSnapshot] = proxyState as ProxyState\n return createSnapshot(target, ensureVersion(), handlePromise) as Snapshot<T>\n}\n\nexport function ref<T extends object>(obj: T): Ref<T> {\n refSet.add(obj)\n return obj as T & AsRef\n}\n\nexport type Ref<T> = T & AsRef\n","import { proxy, snapshot, type Snapshot } from \"./proxy\"\n\nexport function proxyWithComputed<T extends object, U extends object>(\n initialObject: T,\n computedFns: {\n [K in keyof U]:\n | ((snap: Snapshot<T>) => U[K])\n | {\n get: (snap: Snapshot<T>) => U[K]\n set?: (state: T, newValue: U[K]) => void\n }\n },\n) {\n const keys = Object.keys(computedFns) as (keyof U)[]\n keys.forEach((key) => {\n if (Object.getOwnPropertyDescriptor(initialObject, key)) {\n throw new Error(\"object property already defined\")\n }\n const computedFn = computedFns[key]\n const { get, set } = (typeof computedFn === \"function\" ? { get: computedFn } : computedFn) as {\n get: (snap: Snapshot<T>) => U[typeof key]\n set?: (state: T, newValue: U[typeof key]) => void\n }\n const desc: PropertyDescriptor = {}\n desc.get = () => get(snapshot(proxyObject))\n if (set) {\n desc.set = (newValue) => set(proxyObject, newValue)\n }\n Object.defineProperty(initialObject, key, desc)\n })\n const proxyObject = proxy(initialObject) as T & U\n return proxyObject\n}\n"],"mappings":"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","names":["proxyFunction"]}
|
package/dist/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ function makeGlobal(key, value) {
|
|
|
14
14
|
|
|
15
15
|
// src/proxy.ts
|
|
16
16
|
import { getUntracked, markToTrack } from "proxy-compare";
|
|
17
|
-
var isDev = process.env.NODE_ENV !== "production";
|
|
17
|
+
var isDev = () => process.env.NODE_ENV !== "production";
|
|
18
18
|
var isObject = (x) => typeof x === "object" && x !== null;
|
|
19
19
|
var proxyStateMap = makeGlobal("__zag__proxyStateMap", () => /* @__PURE__ */ new WeakMap());
|
|
20
20
|
var refSet = makeGlobal("__zag__refSet", () => /* @__PURE__ */ new WeakSet());
|
|
@@ -89,7 +89,7 @@ var buildProxyFunction = (objectIs = Object.is, newProxy = (target, handler) =>
|
|
|
89
89
|
};
|
|
90
90
|
const propProxyStates = /* @__PURE__ */ new Map();
|
|
91
91
|
const addPropListener = (prop, propProxyState) => {
|
|
92
|
-
if (isDev && propProxyStates.has(prop)) {
|
|
92
|
+
if (isDev() && propProxyStates.has(prop)) {
|
|
93
93
|
throw new Error("prop listener already exists");
|
|
94
94
|
}
|
|
95
95
|
if (listeners.size) {
|
|
@@ -110,7 +110,7 @@ var buildProxyFunction = (objectIs = Object.is, newProxy = (target, handler) =>
|
|
|
110
110
|
listeners.add(listener);
|
|
111
111
|
if (listeners.size === 1) {
|
|
112
112
|
propProxyStates.forEach(([propProxyState, prevRemove], prop) => {
|
|
113
|
-
if (isDev && prevRemove) {
|
|
113
|
+
if (isDev() && prevRemove) {
|
|
114
114
|
throw new Error("remove already exists");
|
|
115
115
|
}
|
|
116
116
|
const remove = propProxyState[3](createPropListener(prop));
|
|
@@ -210,7 +210,7 @@ function proxy(initialObject = {}) {
|
|
|
210
210
|
}
|
|
211
211
|
function subscribe(proxyObject, callback, notifyInSync) {
|
|
212
212
|
const proxyState = proxyStateMap.get(proxyObject);
|
|
213
|
-
if (isDev && !proxyState) {
|
|
213
|
+
if (isDev() && !proxyState) {
|
|
214
214
|
console.warn("Please use proxy object");
|
|
215
215
|
}
|
|
216
216
|
let promise;
|
|
@@ -241,7 +241,7 @@ function subscribe(proxyObject, callback, notifyInSync) {
|
|
|
241
241
|
}
|
|
242
242
|
function snapshot(proxyObject, handlePromise) {
|
|
243
243
|
const proxyState = proxyStateMap.get(proxyObject);
|
|
244
|
-
if (isDev && !proxyState) {
|
|
244
|
+
if (isDev() && !proxyState) {
|
|
245
245
|
console.warn("Please use proxy object");
|
|
246
246
|
}
|
|
247
247
|
const [target, ensureVersion, createSnapshot] = proxyState;
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/global.ts","../src/proxy.ts","../src/proxy-computed.ts"],"sourcesContent":["function getGlobal(): any {\n if (typeof globalThis !== \"undefined\") return globalThis\n if (typeof self !== \"undefined\") return self\n if (typeof window !== \"undefined\") return window\n if (typeof global !== \"undefined\") return global\n}\n\nexport function makeGlobal<T>(key: string, value: () => T): T {\n const g = getGlobal()\n if (!g) return value()\n g[key] ||= value()\n return g[key]\n}\n","// Credits: https://github.com/pmndrs/valtio\n\nimport { getUntracked, markToTrack } from \"proxy-compare\"\nimport { makeGlobal } from \"./global\"\n\nconst isDev = process.env.NODE_ENV !== \"production\"\nconst isObject = (x: unknown): x is object => typeof x === \"object\" && x !== null\n\ntype AsRef = { $$valtioRef: true }\n\ntype ProxyObject = object\n\ntype Path = (string | symbol)[]\n\ntype Op =\n | [op: \"set\", path: Path, value: unknown, prevValue: unknown]\n | [op: \"delete\", path: Path, prevValue: unknown]\n | [op: \"resolve\", path: Path, value: unknown]\n | [op: \"reject\", path: Path, error: unknown]\n\ntype Listener = (op: Op, nextVersion: number) => void\n\ntype AnyFunction = (...args: any[]) => any\n\nexport type Snapshot<T> = T extends AnyFunction\n ? T\n : T extends AsRef\n ? T\n : T extends Promise<any>\n ? Awaited<T>\n : {\n readonly [K in keyof T]: Snapshot<T[K]>\n }\n\ntype HandlePromise = <P extends Promise<any>>(promise: P) => Awaited<P>\n\ntype CreateSnapshot = <T extends object>(target: T, version: number, handlePromise?: HandlePromise) => T\n\ntype RemoveListener = () => void\ntype AddListener = (listener: Listener) => RemoveListener\n\ntype ProxyState = readonly [\n target: object,\n ensureVersion: (nextCheckVersion?: number) => number,\n createSnapshot: CreateSnapshot,\n addListener: AddListener,\n]\n\n// shared state\nconst proxyStateMap = makeGlobal(\"__zag__proxyStateMap\", () => new WeakMap<ProxyObject, ProxyState>())\nconst refSet = makeGlobal(\"__zag__refSet\", () => new WeakSet())\n\nconst buildProxyFunction = (\n objectIs = Object.is,\n\n newProxy = <T extends object>(target: T, handler: ProxyHandler<T>): T => new Proxy(target, handler),\n\n canProxy = (x: unknown) =>\n isObject(x) &&\n !refSet.has(x) &&\n (Array.isArray(x) || !(Symbol.iterator in x)) &&\n !(x instanceof WeakMap) &&\n !(x instanceof WeakSet) &&\n !(x instanceof Error) &&\n !(x instanceof Number) &&\n !(x instanceof Date) &&\n !(x instanceof String) &&\n !(x instanceof RegExp) &&\n !(x instanceof ArrayBuffer),\n\n defaultHandlePromise = <P extends Promise<any>>(\n promise: P & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\"\n value?: Awaited<P>\n reason?: unknown\n },\n ) => {\n switch (promise.status) {\n case \"fulfilled\":\n return promise.value as Awaited<P>\n case \"rejected\":\n throw promise.reason\n default:\n throw promise\n }\n },\n\n snapCache = new WeakMap<object, [version: number, snap: unknown]>(),\n\n createSnapshot: CreateSnapshot = <T extends object>(\n target: T,\n version: number,\n handlePromise: HandlePromise = defaultHandlePromise,\n ): T => {\n const cache = snapCache.get(target)\n if (cache?.[0] === version) {\n return cache[1] as T\n }\n const snap: any = Array.isArray(target) ? [] : Object.create(Object.getPrototypeOf(target))\n markToTrack(snap, true) // mark to track\n snapCache.set(target, [version, snap])\n Reflect.ownKeys(target).forEach((key) => {\n const value = Reflect.get(target, key)\n if (refSet.has(value as object)) {\n markToTrack(value as object, false) // mark not to track\n snap[key] = value\n } else if (value instanceof Promise) {\n Object.defineProperty(snap, key, {\n get() {\n return handlePromise(value)\n },\n })\n } else if (proxyStateMap.has(value as object)) {\n snap[key] = snapshot(value as object, handlePromise)\n } else {\n snap[key] = value\n }\n })\n return Object.freeze(snap)\n },\n\n proxyCache = new WeakMap<object, ProxyObject>(),\n\n versionHolder = [1, 1] as [number, number],\n\n proxyFunction = <T extends object>(initialObject: T): T => {\n if (!isObject(initialObject)) {\n throw new Error(\"object required\")\n }\n const found = proxyCache.get(initialObject) as T | undefined\n if (found) {\n return found\n }\n let version = versionHolder[0]\n const listeners = new Set<Listener>()\n const notifyUpdate = (op: Op, nextVersion = ++versionHolder[0]) => {\n if (version !== nextVersion) {\n version = nextVersion\n listeners.forEach((listener) => listener(op, nextVersion))\n }\n }\n let checkVersion = versionHolder[1]\n const ensureVersion = (nextCheckVersion = ++versionHolder[1]) => {\n if (checkVersion !== nextCheckVersion && !listeners.size) {\n checkVersion = nextCheckVersion\n propProxyStates.forEach(([propProxyState]) => {\n const propVersion = propProxyState[1](nextCheckVersion)\n if (propVersion > version) {\n version = propVersion\n }\n })\n }\n return version\n }\n const createPropListener =\n (prop: string | symbol): Listener =>\n (op, nextVersion) => {\n const newOp: Op = [...op]\n newOp[1] = [prop, ...(newOp[1] as Path)]\n notifyUpdate(newOp, nextVersion)\n }\n const propProxyStates = new Map<string | symbol, readonly [ProxyState, RemoveListener?]>()\n const addPropListener = (prop: string | symbol, propProxyState: ProxyState) => {\n if (isDev && propProxyStates.has(prop)) {\n throw new Error(\"prop listener already exists\")\n }\n if (listeners.size) {\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n } else {\n propProxyStates.set(prop, [propProxyState])\n }\n }\n const removePropListener = (prop: string | symbol) => {\n const entry = propProxyStates.get(prop)\n if (entry) {\n propProxyStates.delete(prop)\n entry[1]?.()\n }\n }\n const addListener = (listener: Listener) => {\n listeners.add(listener)\n if (listeners.size === 1) {\n propProxyStates.forEach(([propProxyState, prevRemove], prop) => {\n if (isDev && prevRemove) {\n throw new Error(\"remove already exists\")\n }\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n })\n }\n const removeListener = () => {\n listeners.delete(listener)\n if (listeners.size === 0) {\n propProxyStates.forEach(([propProxyState, remove], prop) => {\n if (remove) {\n remove()\n propProxyStates.set(prop, [propProxyState])\n }\n })\n }\n }\n return removeListener\n }\n const baseObject = Array.isArray(initialObject) ? [] : Object.create(Object.getPrototypeOf(initialObject))\n const handler: ProxyHandler<T> = {\n deleteProperty(target: T, prop: string | symbol) {\n const prevValue = Reflect.get(target, prop)\n removePropListener(prop)\n const deleted = Reflect.deleteProperty(target, prop)\n if (deleted) {\n notifyUpdate([\"delete\", [prop], prevValue])\n }\n return deleted\n },\n set(target: T, prop: string | symbol, value: any, receiver: object) {\n const hasPrevValue = Reflect.has(target, prop)\n const prevValue = Reflect.get(target, prop, receiver)\n if (\n hasPrevValue &&\n (objectIs(prevValue, value) || (proxyCache.has(value) && objectIs(prevValue, proxyCache.get(value))))\n ) {\n return true\n }\n removePropListener(prop)\n if (isObject(value)) {\n value = getUntracked(value) || value\n }\n let nextValue = value\n if (Object.getOwnPropertyDescriptor(target, prop)?.set) {\n // do nothing\n } else if (value instanceof Promise) {\n value\n .then((v) => {\n Object.assign(value, { status: \"fulfilled\", value: v })\n notifyUpdate([\"resolve\", [prop], v])\n })\n .catch((e) => {\n Object.assign(value, { status: \"rejected\", reason: e })\n notifyUpdate([\"reject\", [prop], e])\n })\n } else {\n if (!proxyStateMap.has(value) && canProxy(value)) {\n nextValue = proxy(value)\n }\n const childProxyState = !refSet.has(nextValue) && proxyStateMap.get(nextValue)\n if (childProxyState) {\n addPropListener(prop, childProxyState)\n }\n }\n Reflect.set(target, prop, nextValue, receiver)\n notifyUpdate([\"set\", [prop], value, prevValue])\n return true\n },\n }\n const proxyObject = newProxy(baseObject, handler)\n proxyCache.set(initialObject, proxyObject)\n const proxyState: ProxyState = [baseObject, ensureVersion, createSnapshot, addListener]\n proxyStateMap.set(proxyObject, proxyState)\n Reflect.ownKeys(initialObject).forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(initialObject, key) as PropertyDescriptor\n if (desc.get || desc.set) {\n Object.defineProperty(baseObject, key, desc)\n } else {\n proxyObject[key as keyof T] = initialObject[key as keyof T]\n }\n })\n return proxyObject\n },\n) =>\n [\n // public functions\n proxyFunction,\n // shared state\n proxyStateMap,\n refSet,\n // internal things\n objectIs,\n newProxy,\n canProxy,\n defaultHandlePromise,\n snapCache,\n createSnapshot,\n proxyCache,\n versionHolder,\n ] as const\n\nconst [proxyFunction] = buildProxyFunction()\n\nexport function proxy<T extends object>(initialObject: T = {} as T): T {\n return proxyFunction(initialObject)\n}\n\nexport function getVersion(proxyObject: unknown): number | undefined {\n const proxyState = proxyStateMap.get(proxyObject as object)\n return proxyState?.[1]()\n}\n\nexport function subscribe<T extends object>(\n proxyObject: T,\n callback: (ops: Op[]) => void,\n notifyInSync?: boolean,\n): () => void {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n let promise: Promise<void> | undefined\n const ops: Op[] = []\n const addListener = (proxyState as ProxyState)[3]\n let isListenerActive = false\n const listener: Listener = (op) => {\n ops.push(op)\n if (notifyInSync) {\n callback(ops.splice(0))\n return\n }\n if (!promise) {\n promise = Promise.resolve().then(() => {\n promise = undefined\n if (isListenerActive) {\n callback(ops.splice(0))\n }\n })\n }\n }\n const removeListener = addListener(listener)\n isListenerActive = true\n return () => {\n isListenerActive = false\n removeListener()\n }\n}\n\nexport function snapshot<T extends object>(proxyObject: T, handlePromise?: HandlePromise): Snapshot<T> {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n const [target, ensureVersion, createSnapshot] = proxyState as ProxyState\n return createSnapshot(target, ensureVersion(), handlePromise) as Snapshot<T>\n}\n\nexport function ref<T extends object>(obj: T): Ref<T> {\n refSet.add(obj)\n return obj as T & AsRef\n}\n\nexport type Ref<T> = T & AsRef\n","import { proxy, snapshot, type Snapshot } from \"./proxy\"\n\nexport function proxyWithComputed<T extends object, U extends object>(\n initialObject: T,\n computedFns: {\n [K in keyof U]:\n | ((snap: Snapshot<T>) => U[K])\n | {\n get: (snap: Snapshot<T>) => U[K]\n set?: (state: T, newValue: U[K]) => void\n }\n },\n) {\n const keys = Object.keys(computedFns) as (keyof U)[]\n keys.forEach((key) => {\n if (Object.getOwnPropertyDescriptor(initialObject, key)) {\n throw new Error(\"object property already defined\")\n }\n const computedFn = computedFns[key]\n const { get, set } = (typeof computedFn === \"function\" ? { get: computedFn } : computedFn) as {\n get: (snap: Snapshot<T>) => U[typeof key]\n set?: (state: T, newValue: U[typeof key]) => void\n }\n const desc: PropertyDescriptor = {}\n desc.get = () => get(snapshot(proxyObject))\n if (set) {\n desc.set = (newValue) => set(proxyObject, newValue)\n }\n Object.defineProperty(initialObject, key, desc)\n })\n const proxyObject = proxy(initialObject) as T & U\n return proxyObject\n}\n"],"mappings":"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","names":["proxyFunction"]}
|
|
1
|
+
{"version":3,"sources":["../src/global.ts","../src/proxy.ts","../src/proxy-computed.ts"],"sourcesContent":["function getGlobal(): any {\n if (typeof globalThis !== \"undefined\") return globalThis\n if (typeof self !== \"undefined\") return self\n if (typeof window !== \"undefined\") return window\n if (typeof global !== \"undefined\") return global\n}\n\nexport function makeGlobal<T>(key: string, value: () => T): T {\n const g = getGlobal()\n if (!g) return value()\n g[key] ||= value()\n return g[key]\n}\n","// Credits: https://github.com/pmndrs/valtio\n\nimport { getUntracked, markToTrack } from \"proxy-compare\"\nimport { makeGlobal } from \"./global\"\n\nconst isDev = () => process.env.NODE_ENV !== \"production\"\nconst isObject = (x: unknown): x is object => typeof x === \"object\" && x !== null\n\ntype AsRef = { $$valtioRef: true }\n\ntype ProxyObject = object\n\ntype Path = (string | symbol)[]\n\ntype Op =\n | [op: \"set\", path: Path, value: unknown, prevValue: unknown]\n | [op: \"delete\", path: Path, prevValue: unknown]\n | [op: \"resolve\", path: Path, value: unknown]\n | [op: \"reject\", path: Path, error: unknown]\n\ntype Listener = (op: Op, nextVersion: number) => void\n\ntype AnyFunction = (...args: any[]) => any\n\nexport type Snapshot<T> = T extends AnyFunction\n ? T\n : T extends AsRef\n ? T\n : T extends Promise<any>\n ? Awaited<T>\n : {\n readonly [K in keyof T]: Snapshot<T[K]>\n }\n\ntype HandlePromise = <P extends Promise<any>>(promise: P) => Awaited<P>\n\ntype CreateSnapshot = <T extends object>(target: T, version: number, handlePromise?: HandlePromise) => T\n\ntype RemoveListener = () => void\ntype AddListener = (listener: Listener) => RemoveListener\n\ntype ProxyState = readonly [\n target: object,\n ensureVersion: (nextCheckVersion?: number) => number,\n createSnapshot: CreateSnapshot,\n addListener: AddListener,\n]\n\n// shared state\nconst proxyStateMap = makeGlobal(\"__zag__proxyStateMap\", () => new WeakMap<ProxyObject, ProxyState>())\nconst refSet = makeGlobal(\"__zag__refSet\", () => new WeakSet())\n\nconst buildProxyFunction = (\n objectIs = Object.is,\n\n newProxy = <T extends object>(target: T, handler: ProxyHandler<T>): T => new Proxy(target, handler),\n\n canProxy = (x: unknown) =>\n isObject(x) &&\n !refSet.has(x) &&\n (Array.isArray(x) || !(Symbol.iterator in x)) &&\n !(x instanceof WeakMap) &&\n !(x instanceof WeakSet) &&\n !(x instanceof Error) &&\n !(x instanceof Number) &&\n !(x instanceof Date) &&\n !(x instanceof String) &&\n !(x instanceof RegExp) &&\n !(x instanceof ArrayBuffer),\n\n defaultHandlePromise = <P extends Promise<any>>(\n promise: P & {\n status?: \"pending\" | \"fulfilled\" | \"rejected\"\n value?: Awaited<P>\n reason?: unknown\n },\n ) => {\n switch (promise.status) {\n case \"fulfilled\":\n return promise.value as Awaited<P>\n case \"rejected\":\n throw promise.reason\n default:\n throw promise\n }\n },\n\n snapCache = new WeakMap<object, [version: number, snap: unknown]>(),\n\n createSnapshot: CreateSnapshot = <T extends object>(\n target: T,\n version: number,\n handlePromise: HandlePromise = defaultHandlePromise,\n ): T => {\n const cache = snapCache.get(target)\n if (cache?.[0] === version) {\n return cache[1] as T\n }\n const snap: any = Array.isArray(target) ? [] : Object.create(Object.getPrototypeOf(target))\n markToTrack(snap, true) // mark to track\n snapCache.set(target, [version, snap])\n Reflect.ownKeys(target).forEach((key) => {\n const value = Reflect.get(target, key)\n if (refSet.has(value as object)) {\n markToTrack(value as object, false) // mark not to track\n snap[key] = value\n } else if (value instanceof Promise) {\n Object.defineProperty(snap, key, {\n get() {\n return handlePromise(value)\n },\n })\n } else if (proxyStateMap.has(value as object)) {\n snap[key] = snapshot(value as object, handlePromise)\n } else {\n snap[key] = value\n }\n })\n return Object.freeze(snap)\n },\n\n proxyCache = new WeakMap<object, ProxyObject>(),\n\n versionHolder = [1, 1] as [number, number],\n\n proxyFunction = <T extends object>(initialObject: T): T => {\n if (!isObject(initialObject)) {\n throw new Error(\"object required\")\n }\n const found = proxyCache.get(initialObject) as T | undefined\n if (found) {\n return found\n }\n let version = versionHolder[0]\n const listeners = new Set<Listener>()\n const notifyUpdate = (op: Op, nextVersion = ++versionHolder[0]) => {\n if (version !== nextVersion) {\n version = nextVersion\n listeners.forEach((listener) => listener(op, nextVersion))\n }\n }\n let checkVersion = versionHolder[1]\n const ensureVersion = (nextCheckVersion = ++versionHolder[1]) => {\n if (checkVersion !== nextCheckVersion && !listeners.size) {\n checkVersion = nextCheckVersion\n propProxyStates.forEach(([propProxyState]) => {\n const propVersion = propProxyState[1](nextCheckVersion)\n if (propVersion > version) {\n version = propVersion\n }\n })\n }\n return version\n }\n const createPropListener =\n (prop: string | symbol): Listener =>\n (op, nextVersion) => {\n const newOp: Op = [...op]\n newOp[1] = [prop, ...(newOp[1] as Path)]\n notifyUpdate(newOp, nextVersion)\n }\n const propProxyStates = new Map<string | symbol, readonly [ProxyState, RemoveListener?]>()\n const addPropListener = (prop: string | symbol, propProxyState: ProxyState) => {\n if (isDev() && propProxyStates.has(prop)) {\n throw new Error(\"prop listener already exists\")\n }\n if (listeners.size) {\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n } else {\n propProxyStates.set(prop, [propProxyState])\n }\n }\n const removePropListener = (prop: string | symbol) => {\n const entry = propProxyStates.get(prop)\n if (entry) {\n propProxyStates.delete(prop)\n entry[1]?.()\n }\n }\n const addListener = (listener: Listener) => {\n listeners.add(listener)\n if (listeners.size === 1) {\n propProxyStates.forEach(([propProxyState, prevRemove], prop) => {\n if (isDev() && prevRemove) {\n throw new Error(\"remove already exists\")\n }\n const remove = propProxyState[3](createPropListener(prop))\n propProxyStates.set(prop, [propProxyState, remove])\n })\n }\n const removeListener = () => {\n listeners.delete(listener)\n if (listeners.size === 0) {\n propProxyStates.forEach(([propProxyState, remove], prop) => {\n if (remove) {\n remove()\n propProxyStates.set(prop, [propProxyState])\n }\n })\n }\n }\n return removeListener\n }\n const baseObject = Array.isArray(initialObject) ? [] : Object.create(Object.getPrototypeOf(initialObject))\n const handler: ProxyHandler<T> = {\n deleteProperty(target: T, prop: string | symbol) {\n const prevValue = Reflect.get(target, prop)\n removePropListener(prop)\n const deleted = Reflect.deleteProperty(target, prop)\n if (deleted) {\n notifyUpdate([\"delete\", [prop], prevValue])\n }\n return deleted\n },\n set(target: T, prop: string | symbol, value: any, receiver: object) {\n const hasPrevValue = Reflect.has(target, prop)\n const prevValue = Reflect.get(target, prop, receiver)\n if (\n hasPrevValue &&\n (objectIs(prevValue, value) || (proxyCache.has(value) && objectIs(prevValue, proxyCache.get(value))))\n ) {\n return true\n }\n removePropListener(prop)\n if (isObject(value)) {\n value = getUntracked(value) || value\n }\n let nextValue = value\n if (Object.getOwnPropertyDescriptor(target, prop)?.set) {\n // do nothing\n } else if (value instanceof Promise) {\n value\n .then((v) => {\n Object.assign(value, { status: \"fulfilled\", value: v })\n notifyUpdate([\"resolve\", [prop], v])\n })\n .catch((e) => {\n Object.assign(value, { status: \"rejected\", reason: e })\n notifyUpdate([\"reject\", [prop], e])\n })\n } else {\n if (!proxyStateMap.has(value) && canProxy(value)) {\n nextValue = proxy(value)\n }\n const childProxyState = !refSet.has(nextValue) && proxyStateMap.get(nextValue)\n if (childProxyState) {\n addPropListener(prop, childProxyState)\n }\n }\n Reflect.set(target, prop, nextValue, receiver)\n notifyUpdate([\"set\", [prop], value, prevValue])\n return true\n },\n }\n const proxyObject = newProxy(baseObject, handler)\n proxyCache.set(initialObject, proxyObject)\n const proxyState: ProxyState = [baseObject, ensureVersion, createSnapshot, addListener]\n proxyStateMap.set(proxyObject, proxyState)\n Reflect.ownKeys(initialObject).forEach((key) => {\n const desc = Object.getOwnPropertyDescriptor(initialObject, key) as PropertyDescriptor\n if (desc.get || desc.set) {\n Object.defineProperty(baseObject, key, desc)\n } else {\n proxyObject[key as keyof T] = initialObject[key as keyof T]\n }\n })\n return proxyObject\n },\n) =>\n [\n // public functions\n proxyFunction,\n // shared state\n proxyStateMap,\n refSet,\n // internal things\n objectIs,\n newProxy,\n canProxy,\n defaultHandlePromise,\n snapCache,\n createSnapshot,\n proxyCache,\n versionHolder,\n ] as const\n\nconst [proxyFunction] = buildProxyFunction()\n\nexport function proxy<T extends object>(initialObject: T = {} as T): T {\n return proxyFunction(initialObject)\n}\n\nexport function getVersion(proxyObject: unknown): number | undefined {\n const proxyState = proxyStateMap.get(proxyObject as object)\n return proxyState?.[1]()\n}\n\nexport function subscribe<T extends object>(\n proxyObject: T,\n callback: (ops: Op[]) => void,\n notifyInSync?: boolean,\n): () => void {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev() && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n let promise: Promise<void> | undefined\n const ops: Op[] = []\n const addListener = (proxyState as ProxyState)[3]\n let isListenerActive = false\n const listener: Listener = (op) => {\n ops.push(op)\n if (notifyInSync) {\n callback(ops.splice(0))\n return\n }\n if (!promise) {\n promise = Promise.resolve().then(() => {\n promise = undefined\n if (isListenerActive) {\n callback(ops.splice(0))\n }\n })\n }\n }\n const removeListener = addListener(listener)\n isListenerActive = true\n return () => {\n isListenerActive = false\n removeListener()\n }\n}\n\nexport function snapshot<T extends object>(proxyObject: T, handlePromise?: HandlePromise): Snapshot<T> {\n const proxyState = proxyStateMap.get(proxyObject as object)\n if (isDev() && !proxyState) {\n console.warn(\"Please use proxy object\")\n }\n const [target, ensureVersion, createSnapshot] = proxyState as ProxyState\n return createSnapshot(target, ensureVersion(), handlePromise) as Snapshot<T>\n}\n\nexport function ref<T extends object>(obj: T): Ref<T> {\n refSet.add(obj)\n return obj as T & AsRef\n}\n\nexport type Ref<T> = T & AsRef\n","import { proxy, snapshot, type Snapshot } from \"./proxy\"\n\nexport function proxyWithComputed<T extends object, U extends object>(\n initialObject: T,\n computedFns: {\n [K in keyof U]:\n | ((snap: Snapshot<T>) => U[K])\n | {\n get: (snap: Snapshot<T>) => U[K]\n set?: (state: T, newValue: U[K]) => void\n }\n },\n) {\n const keys = Object.keys(computedFns) as (keyof U)[]\n keys.forEach((key) => {\n if (Object.getOwnPropertyDescriptor(initialObject, key)) {\n throw new Error(\"object property already defined\")\n }\n const computedFn = computedFns[key]\n const { get, set } = (typeof computedFn === \"function\" ? { get: computedFn } : computedFn) as {\n get: (snap: Snapshot<T>) => U[typeof key]\n set?: (state: T, newValue: U[typeof key]) => void\n }\n const desc: PropertyDescriptor = {}\n desc.get = () => get(snapshot(proxyObject))\n if (set) {\n desc.set = (newValue) => set(proxyObject, newValue)\n }\n Object.defineProperty(initialObject, key, desc)\n })\n const proxyObject = proxy(initialObject) as T & U\n return proxyObject\n}\n"],"mappings":"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","names":["proxyFunction"]}
|
package/package.json
CHANGED
package/src/proxy.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { getUntracked, markToTrack } from "proxy-compare"
|
|
4
4
|
import { makeGlobal } from "./global"
|
|
5
5
|
|
|
6
|
-
const isDev = process.env.NODE_ENV !== "production"
|
|
6
|
+
const isDev = () => process.env.NODE_ENV !== "production"
|
|
7
7
|
const isObject = (x: unknown): x is object => typeof x === "object" && x !== null
|
|
8
8
|
|
|
9
9
|
type AsRef = { $$valtioRef: true }
|
|
@@ -161,7 +161,7 @@ const buildProxyFunction = (
|
|
|
161
161
|
}
|
|
162
162
|
const propProxyStates = new Map<string | symbol, readonly [ProxyState, RemoveListener?]>()
|
|
163
163
|
const addPropListener = (prop: string | symbol, propProxyState: ProxyState) => {
|
|
164
|
-
if (isDev && propProxyStates.has(prop)) {
|
|
164
|
+
if (isDev() && propProxyStates.has(prop)) {
|
|
165
165
|
throw new Error("prop listener already exists")
|
|
166
166
|
}
|
|
167
167
|
if (listeners.size) {
|
|
@@ -182,7 +182,7 @@ const buildProxyFunction = (
|
|
|
182
182
|
listeners.add(listener)
|
|
183
183
|
if (listeners.size === 1) {
|
|
184
184
|
propProxyStates.forEach(([propProxyState, prevRemove], prop) => {
|
|
185
|
-
if (isDev && prevRemove) {
|
|
185
|
+
if (isDev() && prevRemove) {
|
|
186
186
|
throw new Error("remove already exists")
|
|
187
187
|
}
|
|
188
188
|
const remove = propProxyState[3](createPropListener(prop))
|
|
@@ -302,7 +302,7 @@ export function subscribe<T extends object>(
|
|
|
302
302
|
notifyInSync?: boolean,
|
|
303
303
|
): () => void {
|
|
304
304
|
const proxyState = proxyStateMap.get(proxyObject as object)
|
|
305
|
-
if (isDev && !proxyState) {
|
|
305
|
+
if (isDev() && !proxyState) {
|
|
306
306
|
console.warn("Please use proxy object")
|
|
307
307
|
}
|
|
308
308
|
let promise: Promise<void> | undefined
|
|
@@ -334,7 +334,7 @@ export function subscribe<T extends object>(
|
|
|
334
334
|
|
|
335
335
|
export function snapshot<T extends object>(proxyObject: T, handlePromise?: HandlePromise): Snapshot<T> {
|
|
336
336
|
const proxyState = proxyStateMap.get(proxyObject as object)
|
|
337
|
-
if (isDev && !proxyState) {
|
|
337
|
+
if (isDev() && !proxyState) {
|
|
338
338
|
console.warn("Please use proxy object")
|
|
339
339
|
}
|
|
340
340
|
const [target, ensureVersion, createSnapshot] = proxyState as ProxyState
|