@zag-js/store 0.59.0 → 0.61.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 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;
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zag-js/store",
3
- "version": "0.59.0",
3
+ "version": "0.61.0",
4
4
  "description": "The reactive store package for zag machines",
5
5
  "keywords": [
6
6
  "js",
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