{"version":3,"file":"proxy.cjs","sources":["../../src/proxy.ts"],"sourcesContent":["/**\n * A utility for creating a proxy that captures changes to an object\n * and provides a way to retrieve those changes.\n */\n\n/**\n * Simple debug utility that only logs when debug mode is enabled\n * Set DEBUG to true in localStorage to enable debug logging\n */\nfunction debugLog(...args: Array<unknown>): void {\n  // Check if we're in a browser environment\n  const isBrowser =\n    typeof window !== `undefined` && typeof localStorage !== `undefined`\n\n  // In browser, check localStorage for debug flag\n  if (isBrowser && localStorage.getItem(`DEBUG`) === `true`) {\n    console.log(`[proxy]`, ...args)\n  }\n  // In Node.js environment, check for environment variable (though this is primarily for browser)\n  else if (\n    // true\n    !isBrowser &&\n    typeof process !== `undefined` &&\n    process.env.DEBUG === `true`\n  ) {\n    console.log(`[proxy]`, ...args)\n  }\n}\n\n// Add TypedArray interface with proper type\ninterface TypedArray {\n  length: number\n  [index: number]: number\n}\n\n// Update type for ChangeTracker\ninterface ChangeTracker<T extends object> {\n  originalObject: T\n  modified: boolean\n  copy_: T\n  proxyCount: number\n  assigned_: Record<string | symbol, boolean>\n  parent?: {\n    tracker: ChangeTracker<Record<string | symbol, unknown>>\n    prop: string | symbol\n  }\n  target: T\n}\n\n/**\n * Deep clones an object while preserving special types like Date and RegExp\n */\n\nfunction deepClone<T extends unknown>(\n  obj: T,\n  visited = new WeakMap<object, unknown>()\n): T {\n  // Handle null and undefined\n  if (obj === null || obj === undefined) {\n    return obj\n  }\n\n  // Handle primitive types\n  if (typeof obj !== `object`) {\n    return obj\n  }\n\n  // If we've already cloned this object, return the cached clone\n  if (visited.has(obj as object)) {\n    return visited.get(obj as object) as T\n  }\n\n  if (obj instanceof Date) {\n    return new Date(obj.getTime()) as unknown as T\n  }\n\n  if (obj instanceof RegExp) {\n    return new RegExp(obj.source, obj.flags) as unknown as T\n  }\n\n  if (Array.isArray(obj)) {\n    const arrayClone = [] as Array<unknown>\n    visited.set(obj as object, arrayClone)\n    obj.forEach((item, index) => {\n      arrayClone[index] = deepClone(item, visited)\n    })\n    return arrayClone as unknown as T\n  }\n\n  // Handle TypedArrays\n  if (ArrayBuffer.isView(obj) && !(obj instanceof DataView)) {\n    // Get the constructor to create a new instance of the same type\n    const TypedArrayConstructor = Object.getPrototypeOf(obj).constructor\n    const clone = new TypedArrayConstructor(\n      (obj as unknown as TypedArray).length\n    ) as unknown as TypedArray\n    visited.set(obj as object, clone)\n\n    // Copy the values\n    for (let i = 0; i < (obj as unknown as TypedArray).length; i++) {\n      clone[i] = (obj as unknown as TypedArray)[i]!\n    }\n\n    return clone as unknown as T\n  }\n\n  if (obj instanceof Map) {\n    const clone = new Map() as Map<unknown, unknown>\n    visited.set(obj as object, clone)\n    obj.forEach((value, key) => {\n      clone.set(key, deepClone(value, visited))\n    })\n    return clone as unknown as T\n  }\n\n  if (obj instanceof Set) {\n    const clone = new Set()\n    visited.set(obj as object, clone)\n    obj.forEach((value) => {\n      clone.add(deepClone(value, visited))\n    })\n    return clone as unknown as T\n  }\n\n  const clone = {} as Record<string | symbol, unknown>\n  visited.set(obj as object, clone)\n\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      clone[key] = deepClone(\n        (obj as Record<string | symbol, unknown>)[key],\n        visited\n      )\n    }\n  }\n\n  const symbolProps = Object.getOwnPropertySymbols(obj)\n  for (const sym of symbolProps) {\n    clone[sym] = deepClone(\n      (obj as Record<string | symbol, unknown>)[sym],\n      visited\n    )\n  }\n\n  return clone as T\n}\n\n/**\n * Deep equality check that handles special types like Date, RegExp, Map, and Set\n */\nfunction deepEqual<T>(a: T, b: T): boolean {\n  // Handle primitive types\n  if (a === b) return true\n\n  // If either is null or not an object, they're not equal\n  if (\n    a === null ||\n    b === null ||\n    typeof a !== `object` ||\n    typeof b !== `object`\n  ) {\n    return false\n  }\n\n  // Handle Date objects\n  if (a instanceof Date && b instanceof Date) {\n    return a.getTime() === b.getTime()\n  }\n\n  // Handle RegExp objects\n  if (a instanceof RegExp && b instanceof RegExp) {\n    return a.source === b.source && a.flags === b.flags\n  }\n\n  // Handle Map objects\n  if (a instanceof Map && b instanceof Map) {\n    if (a.size !== b.size) return false\n\n    const entries = Array.from(a.entries())\n    for (const [key, val] of entries) {\n      if (!b.has(key) || !deepEqual(val, b.get(key))) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  // Handle Set objects\n  if (a instanceof Set && b instanceof Set) {\n    if (a.size !== b.size) return false\n\n    // Convert to arrays for comparison\n    const aValues = Array.from(a)\n    const bValues = Array.from(b)\n\n    // Simple comparison for primitive values\n    if (aValues.every((val) => typeof val !== `object`)) {\n      return aValues.every((val) => b.has(val))\n    }\n\n    // For objects in sets, we need to do a more complex comparison\n    // This is a simplified approach and may not work for all cases\n    return aValues.length === bValues.length\n  }\n\n  // Handle arrays\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) return false\n\n    for (let i = 0; i < a.length; i++) {\n      if (!deepEqual(a[i], b[i])) return false\n    }\n\n    return true\n  }\n\n  // Handle TypedArrays\n  if (\n    ArrayBuffer.isView(a) &&\n    ArrayBuffer.isView(b) &&\n    !(a instanceof DataView) &&\n    !(b instanceof DataView)\n  ) {\n    const typedA = a as unknown as TypedArray\n    const typedB = b as unknown as TypedArray\n    if (typedA.length !== typedB.length) return false\n\n    for (let i = 0; i < typedA.length; i++) {\n      if (typedA[i] !== typedB[i]) return false\n    }\n\n    return true\n  }\n\n  // Handle plain objects\n  const keysA = Object.keys(a as object)\n  const keysB = Object.keys(b as object)\n\n  if (keysA.length !== keysB.length) return false\n\n  return keysA.every(\n    (key) =>\n      Object.prototype.hasOwnProperty.call(b, key) &&\n      deepEqual((a as any)[key], (b as any)[key])\n  )\n}\n\nlet count = 0\nfunction getProxyCount() {\n  count += 1\n  return count\n}\n\n/**\n * Creates a proxy that tracks changes to the target object\n *\n * @param target The object to proxy\n * @param parent Optional parent information\n * @returns An object containing the proxy and a function to get the changes\n */\nexport function createChangeProxy<\n  T extends Record<string | symbol, any | undefined>,\n>(\n  target: T,\n  parent?: {\n    tracker: ChangeTracker<Record<string | symbol, unknown>>\n    prop: string | symbol\n  }\n): {\n  proxy: T\n\n  getChanges: () => Record<string | symbol, any>\n} {\n  const changeProxyCache = new Map<object, object>()\n\n  function memoizedCreateChangeProxy<\n    TInner extends Record<string | symbol, any | undefined>,\n  >(\n    innerTarget: TInner,\n    innerParent?: {\n      tracker: ChangeTracker<Record<string | symbol, unknown>>\n      prop: string | symbol\n    }\n  ): {\n    proxy: TInner\n    getChanges: () => Record<string | symbol, any>\n  } {\n    debugLog(`Object ID:`, innerTarget.constructor.name)\n    if (changeProxyCache.has(innerTarget)) {\n      return changeProxyCache.get(innerTarget) as {\n        proxy: TInner\n        getChanges: () => Record<string | symbol, any>\n      }\n    } else {\n      const changeProxy = createChangeProxy(innerTarget, innerParent)\n      changeProxyCache.set(innerTarget, changeProxy)\n      return changeProxy\n    }\n  }\n  // Create a WeakMap to cache proxies for nested objects\n  // This prevents creating multiple proxies for the same object\n  // and handles circular references\n  const proxyCache = new Map<object, object>()\n\n  // Create a change tracker to track changes to the object\n  const changeTracker: ChangeTracker<T> = {\n    copy_: deepClone(target),\n    originalObject: deepClone(target),\n    proxyCount: getProxyCount(),\n    modified: false,\n    assigned_: {},\n    parent,\n    target, // Store reference to the target object\n  }\n\n  debugLog(\n    `createChangeProxy called for target`,\n    target,\n    changeTracker.proxyCount\n  )\n  // Mark this object and all its ancestors as modified\n  // Also propagate the actual changes up the chain\n  function markChanged(state: ChangeTracker<object>) {\n    if (!state.modified) {\n      state.modified = true\n    }\n\n    // Propagate the change up the parent chain\n    if (state.parent) {\n      debugLog(`propagating change to parent`)\n\n      // Update parent's copy with this object's current state\n      state.parent.tracker.copy_[state.parent.prop] = state.copy_\n      state.parent.tracker.assigned_[state.parent.prop] = true\n\n      // Mark parent as changed\n      markChanged(state.parent.tracker)\n    }\n  }\n\n  // Check if all properties in the current state have reverted to original values\n  function checkIfReverted(\n    state: ChangeTracker<Record<string | symbol, unknown>>\n  ): boolean {\n    debugLog(\n      `checkIfReverted called with assigned keys:`,\n      Object.keys(state.assigned_)\n    )\n\n    // If there are no assigned properties, object is unchanged\n    if (\n      Object.keys(state.assigned_).length === 0 &&\n      Object.getOwnPropertySymbols(state.assigned_).length === 0\n    ) {\n      debugLog(`No assigned properties, returning true`)\n      return true\n    }\n\n    // Check each assigned regular property\n    for (const prop in state.assigned_) {\n      // If this property is marked as assigned\n      if (state.assigned_[prop] === true) {\n        const currentValue = state.copy_[prop]\n        const originalValue = (state.originalObject as any)[prop]\n\n        debugLog(\n          `Checking property ${String(prop)}, current:`,\n          currentValue,\n          `original:`,\n          originalValue\n        )\n\n        // If the value is not equal to original, something is still changed\n        if (!deepEqual(currentValue, originalValue)) {\n          debugLog(`Property ${String(prop)} is different, returning false`)\n          return false\n        }\n      } else if (state.assigned_[prop] === false) {\n        // Property was deleted, so it's different from original\n        debugLog(`Property ${String(prop)} was deleted, returning false`)\n        return false\n      }\n    }\n\n    // Check each assigned symbol property\n    const symbolProps = Object.getOwnPropertySymbols(state.assigned_)\n    for (const sym of symbolProps) {\n      if (state.assigned_[sym] === true) {\n        const currentValue = (state.copy_ as any)[sym]\n        const originalValue = (state.originalObject as any)[sym]\n\n        // If the value is not equal to original, something is still changed\n        if (!deepEqual(currentValue, originalValue)) {\n          debugLog(`Symbol property is different, returning false`)\n          return false\n        }\n      } else if (state.assigned_[sym] === false) {\n        // Property was deleted, so it's different from original\n        debugLog(`Symbol property was deleted, returning false`)\n        return false\n      }\n    }\n\n    debugLog(`All properties match original values, returning true`)\n    // All assigned properties match their original values\n    return true\n  }\n\n  // Update parent status based on child changes\n  function checkParentStatus(\n    parentState: ChangeTracker<Record<string | symbol, unknown>>,\n    childProp: string | symbol\n  ) {\n    debugLog(`checkParentStatus called for child prop:`, childProp)\n\n    // Check if all properties of the parent are reverted\n    const isReverted = checkIfReverted(parentState)\n    debugLog(`Parent checkIfReverted returned:`, isReverted)\n\n    if (isReverted) {\n      debugLog(`Parent is fully reverted, clearing tracking`)\n      // If everything is reverted, clear the tracking\n      parentState.modified = false\n      parentState.assigned_ = {}\n\n      // Continue up the chain\n      if (parentState.parent) {\n        debugLog(`Continuing up the parent chain`)\n        checkParentStatus(parentState.parent.tracker, parentState.parent.prop)\n      }\n    }\n  }\n\n  // Create a proxy for the target object\n  function createObjectProxy<TObj extends object>(obj: TObj): TObj {\n    debugLog(`createObjectProxy`, obj)\n    // If we've already created a proxy for this object, return it\n    if (proxyCache.has(obj)) {\n      debugLog(`proxyCache found match`)\n      return proxyCache.get(obj) as TObj\n    }\n\n    // Create a proxy for the object\n    const proxy = new Proxy(obj, {\n      get(ptarget, prop) {\n        debugLog(`get`, ptarget, prop)\n        const value =\n          changeTracker.copy_[prop as keyof T] ??\n          changeTracker.originalObject[prop as keyof T]\n\n        const originalValue = changeTracker.originalObject[prop as keyof T]\n\n        debugLog(`value (at top of proxy get)`, value)\n\n        // If it's a getter, return the value directly\n        const desc = Object.getOwnPropertyDescriptor(ptarget, prop)\n        if (desc?.get) {\n          return value\n        }\n\n        // If the value is a function, bind it to the ptarget\n        if (typeof value === `function`) {\n          // For Map and Set methods that modify the collection\n          if (ptarget instanceof Map || ptarget instanceof Set) {\n            const methodName = prop.toString()\n            const modifyingMethods = new Set([\n              `set`,\n              `delete`,\n              `clear`,\n              `add`,\n              `pop`,\n              `push`,\n              `shift`,\n              `unshift`,\n              `splice`,\n              `sort`,\n              `reverse`,\n            ])\n\n            if (modifyingMethods.has(methodName)) {\n              return function (...args: Array<unknown>) {\n                const result = value.apply(changeTracker.copy_, args)\n                markChanged(changeTracker)\n                return result\n              }\n            }\n\n            // Handle iterator methods for Map and Set\n            const iteratorMethods = new Set([\n              `entries`,\n              `keys`,\n              `values`,\n              `forEach`,\n              Symbol.iterator,\n            ])\n\n            if (iteratorMethods.has(methodName) || prop === Symbol.iterator) {\n              return function (this: unknown, ...args: Array<unknown>) {\n                const result = value.apply(changeTracker.copy_, args)\n\n                // For forEach, we need to wrap the callback to track changes\n                if (methodName === `forEach`) {\n                  const callback = args[0]\n                  if (typeof callback === `function`) {\n                    // Replace the original callback with our wrapped version\n                    const wrappedCallback = function (\n                      // eslint-disable-next-line\n                      this: unknown,\n                      // eslint-disable-next-line\n                      value: unknown,\n                      key: unknown,\n                      collection: unknown\n                    ) {\n                      // Call the original callback\n                      const cbresult = callback.call(\n                        this,\n                        value,\n                        key,\n                        collection\n                      )\n                      // Mark as changed since the callback might have modified the value\n                      markChanged(changeTracker)\n                      return cbresult\n                    }\n                    // Call forEach with our wrapped callback\n                    return value.apply(ptarget, [\n                      wrappedCallback,\n                      ...args.slice(1),\n                    ])\n                  }\n                }\n\n                // For iterators (entries, keys, values, Symbol.iterator)\n                if (\n                  methodName === `entries` ||\n                  methodName === `values` ||\n                  methodName === Symbol.iterator.toString() ||\n                  prop === Symbol.iterator\n                ) {\n                  // If it's an iterator, we need to wrap the returned iterator\n                  // to track changes when the values are accessed and potentially modified\n                  const originalIterator = result\n\n                  // Create a proxy for the iterator that will mark changes when next() is called\n                  return {\n                    next() {\n                      const nextResult = originalIterator.next()\n\n                      // If we have a value and it's an object, we need to track it\n                      if (\n                        !nextResult.done &&\n                        nextResult.value &&\n                        typeof nextResult.value === `object`\n                      ) {\n                        // For entries, the value is a [key, value] pair\n                        if (\n                          methodName === `entries` &&\n                          Array.isArray(nextResult.value) &&\n                          nextResult.value.length === 2\n                        ) {\n                          // The value is at index 1 in the [key, value] pair\n                          if (\n                            nextResult.value[1] &&\n                            typeof nextResult.value[1] === `object`\n                          ) {\n                            // Create a proxy for the value and replace it in the result\n                            const { proxy: valueProxy } =\n                              memoizedCreateChangeProxy(nextResult.value[1], {\n                                tracker: changeTracker,\n                                prop:\n                                  typeof nextResult.value[0] === `symbol`\n                                    ? nextResult.value[0]\n                                    : String(nextResult.value[0]),\n                              })\n                            nextResult.value[1] = valueProxy\n                          }\n                        } else if (\n                          methodName === `values` ||\n                          methodName === Symbol.iterator.toString() ||\n                          prop === Symbol.iterator\n                        ) {\n                          // If the value is an object, create a proxy for it\n                          if (\n                            typeof nextResult.value === `object` &&\n                            nextResult.value !== null\n                          ) {\n                            // For Set, we need to track the whole object\n                            // For Map, we would need the key, but we don't have it here\n                            // So we'll use a symbol as a placeholder\n                            const tempKey = Symbol(`iterator-value`)\n                            const { proxy: valueProxy } =\n                              memoizedCreateChangeProxy(nextResult.value, {\n                                tracker: changeTracker,\n                                prop: tempKey,\n                              })\n                            nextResult.value = valueProxy\n                          }\n                        }\n                      }\n\n                      return nextResult\n                    },\n                    [Symbol.iterator]() {\n                      return this\n                    },\n                  }\n                }\n\n                return result\n              }\n            }\n          }\n          return value.bind(ptarget)\n        }\n\n        // If the value is an object, create a proxy for it\n        if (\n          value &&\n          typeof value === `object` &&\n          !((value as any) instanceof Date) &&\n          !((value as any) instanceof RegExp)\n        ) {\n          // Create a parent reference for the nested object\n          const nestedParent = {\n            tracker: changeTracker,\n            prop: String(prop),\n          }\n\n          // Create a proxy for the nested object\n          const { proxy: nestedProxy } = memoizedCreateChangeProxy(\n            originalValue,\n            nestedParent\n          )\n\n          // Cache the proxy\n          proxyCache.set(value, nestedProxy)\n\n          return nestedProxy\n        }\n\n        return value\n      },\n\n      set(_sobj, prop, value) {\n        const currentValue = changeTracker.copy_[prop as keyof T]\n        debugLog(\n          `set called for property ${String(prop)}, current:`,\n          currentValue,\n          `new:`,\n          value\n        )\n\n        // Only track the change if the value is actually different\n        if (!deepEqual(currentValue, value)) {\n          // Check if the new value is equal to the original value\n          // Important: Use the originalObject to get the true original value\n          const originalValue = changeTracker.originalObject[prop as keyof T]\n          const isRevertToOriginal = deepEqual(value, originalValue)\n          debugLog(\n            `value:`,\n            value,\n            `original:`,\n            originalValue,\n            `isRevertToOriginal:`,\n            isRevertToOriginal\n          )\n\n          if (isRevertToOriginal) {\n            debugLog(`Reverting property ${String(prop)} to original value`)\n            // If the value is reverted to its original state, remove it from changes\n            delete changeTracker.assigned_[prop.toString()]\n\n            // Make sure the copy is updated with the original value\n            debugLog(`Updating copy with original value for ${String(prop)}`)\n            changeTracker.copy_[prop as keyof T] = deepClone(originalValue)\n\n            // Check if all properties in this object have been reverted\n            debugLog(`Checking if all properties reverted`)\n            const allReverted = checkIfReverted(changeTracker)\n            debugLog(`All reverted:`, allReverted)\n\n            if (allReverted) {\n              debugLog(`All properties reverted, clearing tracking`)\n              // If all have been reverted, clear tracking\n              changeTracker.modified = false\n              changeTracker.assigned_ = {}\n\n              // If we're a nested object, check if the parent needs updating\n              if (parent) {\n                debugLog(`Updating parent for property:`, parent.prop)\n                checkParentStatus(parent.tracker, parent.prop)\n              }\n            } else {\n              // Some properties are still changed\n              debugLog(`Some properties still changed, keeping modified flag`)\n              changeTracker.modified = true\n            }\n          } else {\n            debugLog(`Setting new value for property ${String(prop)}`)\n\n            // Set the value on the copy\n            changeTracker.copy_[prop as keyof T] = value\n\n            // Track that this property was assigned - store using the actual property (symbol or string)\n            changeTracker.assigned_[prop.toString()] = true\n\n            // Mark this object and its ancestors as modified\n            debugLog(`Marking object and ancestors as modified`, changeTracker)\n            markChanged(changeTracker)\n          }\n        } else {\n          debugLog(`Value unchanged, not tracking`)\n        }\n\n        return true\n      },\n\n      defineProperty(_ptarget, prop, descriptor) {\n        // const result = Reflect.defineProperty(\n        //   changeTracker.copy_,\n        //   prop,\n        //   descriptor\n        // )\n        // if (result) {\n        if (`value` in descriptor) {\n          changeTracker.copy_[prop as keyof T] = deepClone(descriptor.value)\n          changeTracker.assigned_[prop.toString()] = true\n          markChanged(changeTracker)\n        }\n        // }\n        // return result\n        return true\n      },\n\n      deleteProperty(dobj, prop) {\n        debugLog(`deleteProperty`, dobj, prop)\n        const stringProp = typeof prop === `symbol` ? prop.toString() : prop\n\n        if (stringProp in dobj) {\n          // Check if the property exists in the original object\n          const hadPropertyInOriginal =\n            stringProp in changeTracker.originalObject\n\n          // Delete the property from the copy\n          // Use type assertion to tell TypeScript this is allowed\n          delete (changeTracker.copy_ as Record<string | symbol, unknown>)[prop]\n\n          // If the property didn't exist in the original object, removing it\n          // should revert to the original state\n          if (!hadPropertyInOriginal) {\n            delete changeTracker.copy_[stringProp]\n            delete changeTracker.assigned_[stringProp]\n\n            // If this is the last change and we're not a nested object,\n            // mark the object as unmodified\n            if (\n              Object.keys(changeTracker.assigned_).length === 0 &&\n              Object.getOwnPropertySymbols(changeTracker.assigned_).length === 0\n            ) {\n              changeTracker.modified = false\n            } else {\n              // We still have changes, keep as modified\n              changeTracker.modified = true\n            }\n          } else {\n            // Mark this property as deleted\n            changeTracker.assigned_[stringProp] = false\n            changeTracker.copy_[stringProp as keyof T] = undefined as T[keyof T]\n            markChanged(changeTracker)\n          }\n        }\n\n        return true\n      },\n    })\n\n    // Cache the proxy\n    proxyCache.set(obj, proxy)\n\n    return proxy\n  }\n\n  // Create a proxy for the target object\n  const proxy = createObjectProxy(target)\n\n  // Return the proxy and a function to get the changes\n  return {\n    proxy,\n    getChanges: () => {\n      debugLog(`getChanges called, modified:`, changeTracker.modified)\n      debugLog(changeTracker)\n\n      // First, check if the object is still considered modified\n      if (!changeTracker.modified) {\n        debugLog(`Object not modified, returning empty object`)\n        return {}\n      }\n\n      // If we have a copy, return it directly\n      // Check if valueObj is actually an object\n      if (\n        typeof changeTracker.copy_ !== `object` ||\n        Array.isArray(changeTracker.copy_)\n      ) {\n        return changeTracker.copy_\n      }\n\n      if (Object.keys(changeTracker.assigned_).length === 0) {\n        return changeTracker.copy_\n      }\n\n      const result: Record<string, any | undefined> = {}\n\n      // Iterate through keys in keyObj\n      for (const key in changeTracker.copy_) {\n        // If the key's value is true and the key exists in valueObj\n        if (\n          changeTracker.assigned_[key] === true &&\n          key in changeTracker.copy_\n        ) {\n          result[key] = changeTracker.copy_[key]\n        }\n      }\n      debugLog(`Returning copy:`, result)\n      return result as unknown as Record<string | symbol, unknown>\n    },\n  }\n}\n\n/**\n * Creates proxies for an array of objects and tracks changes to each\n *\n * @param targets Array of objects to proxy\n * @returns An object containing the array of proxies and a function to get all changes\n */\nexport function createArrayChangeProxy<T extends object>(\n  targets: Array<T>\n): {\n  proxies: Array<T>\n  getChanges: () => Array<Record<string | symbol, unknown>>\n} {\n  const proxiesWithChanges = targets.map((target) => createChangeProxy(target))\n\n  return {\n    proxies: proxiesWithChanges.map((p) => p.proxy),\n    getChanges: () => proxiesWithChanges.map((p) => p.getChanges()),\n  }\n}\n\n/**\n * Creates a proxy for an object, passes it to a callback function,\n * and returns the changes made by the callback\n *\n * @param target The object to proxy\n * @param callback Function that receives the proxy and can make changes to it\n * @returns The changes made to the object\n */\nexport function withChangeTracking<T extends object>(\n  target: T,\n  callback: (proxy: T) => void\n): Record<string | symbol, unknown> {\n  const { proxy, getChanges } = createChangeProxy(target)\n\n  callback(proxy)\n\n  return getChanges()\n}\n\n/**\n * Creates proxies for an array of objects, passes them to a callback function,\n * and returns the changes made by the callback for each object\n *\n * @param targets Array of objects to proxy\n * @param callback Function that receives the proxies and can make changes to them\n * @returns Array of changes made to each object\n */\nexport function withArrayChangeTracking<T extends object>(\n  targets: Array<T>,\n  callback: (proxies: Array<T>) => void\n): Array<Record<string | symbol, unknown>> {\n  const { proxies, getChanges } = createArrayChangeProxy(targets)\n\n  callback(proxies)\n\n  return getChanges()\n}\n"],"names":["clone","proxy","value"],"mappings":"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"}