Add coexistence checks to all enqueue methods to prevent loading both React and Grid.js assets simultaneously. Changes: - ReactAdmin.php: Only enqueue React assets when ?react=1 - Init.php: Skip Grid.js when React active on admin pages - Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0 - Customer.php, Product.php, License.php: Add coexistence checks Now the toggle between Classic and React versions works correctly. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 line
17 KiB
Plaintext
1 line
17 KiB
Plaintext
{"version":3,"file":"index.modern.mjs","sources":["../src/index.ts"],"sourcesContent":["// symbols\nconst OWN_KEYS_SYMBOL = Symbol();\nconst TRACK_MEMO_SYMBOL = Symbol();\nconst GET_ORIGINAL_SYMBOL = Symbol();\n\n// properties\nconst AFFECTED_PROPERTY = 'a';\nconst FROZEN_PROPERTY = 'f';\nconst PROXY_PROPERTY = 'p';\nconst PROXY_CACHE_PROPERTY = 'c';\nconst NEXT_OBJECT_PROPERTY = 'n';\nconst CHANGED_PROPERTY = 'g';\n\n// function to create a new bare proxy\nlet newProxy = <T extends object>(\n target: T,\n handler: ProxyHandler<T>,\n) => new Proxy(target, handler);\n\n// get object prototype\nconst getProto = Object.getPrototypeOf;\n\nconst objectsToTrack = new WeakMap<object, boolean>();\n\n// check if obj is a plain object or an array\nconst isObjectToTrack = <T>(obj: T): obj is T extends object ? T : never => (\n obj && (objectsToTrack.has(obj as unknown as object)\n ? objectsToTrack.get(obj as unknown as object) as boolean\n : (getProto(obj) === Object.prototype || getProto(obj) === Array.prototype)\n )\n);\n\n// check if it is object\nconst isObject = (x: unknown): x is object => (\n typeof x === 'object' && x !== null\n);\n\n// check if frozen\nconst isFrozen = (obj: object) => (\n Object.isFrozen(obj) || (\n // Object.isFrozen() doesn't detect non-writable properties\n // See: https://github.com/dai-shi/proxy-compare/pull/8\n Object.values(Object.getOwnPropertyDescriptors(obj)).some(\n (descriptor) => !descriptor.writable,\n )\n )\n);\n\n// copy frozen object\nconst unfrozenCache = new WeakMap<object, object>();\nconst unfreeze = <T extends object>(obj: T): T => {\n let unfrozen = unfrozenCache.get(obj);\n if (!unfrozen) {\n if (Array.isArray(obj)) {\n // Arrays need a special way to copy\n unfrozen = Array.from(obj);\n } else {\n // For non-array objects, we create a new object keeping the prototype\n // with changing all configurable options (otherwise, proxies will complain)\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n Object.values(descriptors).forEach((desc) => { desc.configurable = true; });\n unfrozen = Object.create(getProto(obj), descriptors);\n }\n unfrozenCache.set(obj, unfrozen as object);\n }\n return unfrozen as T;\n};\n\ntype Affected = WeakMap<object, Set<string | symbol>>;\ntype ProxyHandlerState<T extends object> = {\n readonly [FROZEN_PROPERTY]: boolean;\n [PROXY_PROPERTY]?: T;\n [PROXY_CACHE_PROPERTY]?: ProxyCache<object> | undefined;\n [AFFECTED_PROPERTY]?: Affected;\n}\ntype ProxyCache<T extends object> = WeakMap<\n object,\n readonly [ProxyHandler<T>, ProxyHandlerState<T>]\n>;\n\nconst createProxyHandler = <T extends object>(origObj: T, frozen: boolean) => {\n const state: ProxyHandlerState<T> = {\n [FROZEN_PROPERTY]: frozen,\n };\n let trackObject = false; // for trackMemo\n const recordUsage = (key: string | symbol, skipWithOwnKeys?: boolean) => {\n if (!trackObject) {\n let used = (state[AFFECTED_PROPERTY] as Affected).get(origObj);\n if (!used) {\n used = new Set();\n (state[AFFECTED_PROPERTY] as Affected).set(origObj, used);\n }\n if (!skipWithOwnKeys || !used.has(OWN_KEYS_SYMBOL)) {\n used.add(key);\n }\n }\n };\n const recordObjectAsUsed = () => {\n trackObject = true;\n (state[AFFECTED_PROPERTY] as Affected).delete(origObj);\n };\n const handler: ProxyHandler<T> = {\n get(target, key) {\n if (key === GET_ORIGINAL_SYMBOL) {\n return origObj;\n }\n recordUsage(key);\n return createProxy(\n (target as any)[key],\n (state[AFFECTED_PROPERTY] as Affected),\n state[PROXY_CACHE_PROPERTY],\n );\n },\n has(target, key) {\n if (key === TRACK_MEMO_SYMBOL) {\n recordObjectAsUsed();\n return true;\n }\n // LIMITATION: We simply record the same as `get`.\n // This means { a: {} } and { a: {} } is detected as changed,\n // if `'a' in obj` is handled.\n recordUsage(key);\n return key in target;\n },\n getOwnPropertyDescriptor(target, key) {\n // LIMITATION: We simply record the same as `get`.\n // This means { a: {} } and { a: {} } is detected as changed,\n // if `obj.getOwnPropertyDescriptor('a'))` is handled.\n recordUsage(key, true);\n return Object.getOwnPropertyDescriptor(target, key);\n },\n ownKeys(target) {\n recordUsage(OWN_KEYS_SYMBOL);\n return Reflect.ownKeys(target);\n },\n };\n if (frozen) {\n handler.set = handler.deleteProperty = () => false;\n }\n return [handler, state] as const;\n};\n\nconst getOriginalObject = <T extends object>(obj: T) => (\n // unwrap proxy\n (obj as { [GET_ORIGINAL_SYMBOL]?: typeof obj })[GET_ORIGINAL_SYMBOL]\n // otherwise\n || obj\n);\n\n/**\n * Create a proxy.\n *\n * This function will create a proxy at top level and proxy nested objects as you access them,\n * in order to keep track of which properties were accessed via get/has proxy handlers:\n *\n * NOTE: Printing of WeakMap is hard to inspect and not very readable\n * for this purpose you can use the `affectedToPathList` helper.\n *\n * @param {object} obj - Object that will be wrapped on the proxy.\n * @param {WeakMap<object, unknown>} affected -\n * WeakMap that will hold the tracking of which properties in the proxied object were accessed.\n * @param {WeakMap<object, unknown>} [proxyCache] -\n * WeakMap that will help keep referential identity for proxies.\n * @returns {Proxy<object>} - Object wrapped in a proxy.\n *\n * @example\n * import { createProxy } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n * const proxy = createProxy(original, affected);\n *\n * proxy.a // Will mark as used and track its value.\n * // This will update the affected WeakMap with original as key\n * // and a Set with \"a\"\n *\n * proxy.d // Will mark \"d\" as accessed to track and proxy itself ({ e: \"3\" }).\n * // This will update the affected WeakMap with original as key\n * // and a Set with \"d\"\n */\nexport const createProxy = <T>(\n obj: T,\n affected: WeakMap<object, unknown>,\n proxyCache?: WeakMap<object, unknown>,\n): T => {\n if (!isObjectToTrack(obj)) return obj;\n const target = getOriginalObject(obj);\n const frozen = isFrozen(target);\n let handlerAndState = (\n proxyCache && (proxyCache as ProxyCache<typeof target>).get(target)\n );\n if (!handlerAndState || handlerAndState[1][FROZEN_PROPERTY] !== frozen) {\n handlerAndState = createProxyHandler<typeof target>(target, frozen);\n handlerAndState[1][PROXY_PROPERTY] = newProxy(\n frozen ? unfreeze(target) : target,\n handlerAndState[0],\n );\n if (proxyCache) {\n proxyCache.set(target, handlerAndState);\n }\n }\n handlerAndState[1][AFFECTED_PROPERTY] = affected as Affected;\n handlerAndState[1][PROXY_CACHE_PROPERTY] = proxyCache as ProxyCache<object> | undefined;\n return handlerAndState[1][PROXY_PROPERTY] as typeof target;\n};\n\nconst isOwnKeysChanged = (prevObj: object, nextObj: object) => {\n const prevKeys = Reflect.ownKeys(prevObj);\n const nextKeys = Reflect.ownKeys(nextObj);\n return prevKeys.length !== nextKeys.length\n || prevKeys.some((k, i) => k !== nextKeys[i]);\n};\n\ntype ChangedCache = WeakMap<object, {\n [NEXT_OBJECT_PROPERTY]: object;\n [CHANGED_PROPERTY]: boolean;\n}>;\n\n/**\n * Compare changes on objects.\n *\n * This will compare the affected properties on tracked objects inside the proxy\n * to check if there were any changes made to it,\n * by default if no property was accessed on the proxy it will attempt to do a\n * reference equality check for the objects provided (Object.is(a, b)). If you access a property\n * on the proxy, then isChanged will only compare the affected properties.\n *\n * @param {object} prevObj - The previous object to compare.\n * @param {object} nextObj - Object to compare with the previous one.\n * @param {WeakMap<object, unknown>} affected -\n * WeakMap that holds the tracking of which properties in the proxied object were accessed.\n * @param {WeakMap<object, unknown>} [cache] -\n * WeakMap that holds a cache of the comparisons for better performance with repetitive comparisons,\n * and to avoid infinite loop with circular structures.\n * @returns {boolean} - Boolean indicating if the affected property on the object has changed.\n *\n * @example\n * import { createProxy, isChanged } from 'proxy-compare';\n *\n * const obj = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(obj, affected);\n *\n * proxy.a\n *\n * isChanged(obj, { a: \"1\" }, affected) // false\n *\n * proxy.a = \"2\"\n *\n * isChanged(obj, { a: \"1\" }, affected) // true\n */\n\nexport const isChanged = (\n prevObj: unknown,\n nextObj: unknown,\n affected: WeakMap<object, unknown>,\n cache?: WeakMap<object, unknown>,\n): boolean => {\n if (Object.is(prevObj, nextObj)) {\n return false;\n }\n if (!isObject(prevObj) || !isObject(nextObj)) return true;\n const used = (affected as Affected).get(getOriginalObject(prevObj));\n if (!used) return true;\n if (cache) {\n const hit = (cache as ChangedCache).get(prevObj);\n if (hit && hit[NEXT_OBJECT_PROPERTY] === nextObj) {\n return hit[CHANGED_PROPERTY];\n }\n // for object with cycles\n (cache as ChangedCache).set(prevObj, {\n [NEXT_OBJECT_PROPERTY]: nextObj,\n [CHANGED_PROPERTY]: false,\n });\n }\n let changed: boolean | null = null;\n // eslint-disable-next-line no-restricted-syntax\n for (const key of used) {\n const c = key === OWN_KEYS_SYMBOL ? isOwnKeysChanged(prevObj, nextObj)\n : isChanged(\n (prevObj as any)[key],\n (nextObj as any)[key],\n affected,\n cache,\n );\n if (c === true || c === false) changed = c;\n if (changed) break;\n }\n if (changed === null) changed = true;\n if (cache) {\n cache.set(prevObj, {\n [NEXT_OBJECT_PROPERTY]: nextObj,\n [CHANGED_PROPERTY]: changed,\n });\n }\n return changed;\n};\n\n// explicitly track object with memo\nexport const trackMemo = (obj: unknown) => {\n if (isObjectToTrack(obj)) {\n return TRACK_MEMO_SYMBOL in obj;\n }\n return false;\n};\n\n/**\n * Unwrap proxy to get the original object.\n *\n * Used to retrieve the original object used to create the proxy instance with `createProxy`.\n *\n * @param {Proxy<object>} obj - The proxy wrapper of the originial object.\n * @returns {object | null} - Return either the unwrapped object if exists.\n *\n * @example\n * import { createProxy, getUntracked } from 'proxy-compare';\n *\n * const original = { a: \"1\", c: \"2\", d: { e: \"3\" } };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n * const originalFromProxy = getUntracked(proxy)\n *\n * Object.is(original, originalFromProxy) // true\n * isChanged(original, originalFromProxy, affected) // false\n */\nexport const getUntracked = <T>(obj: T): T | null => {\n if (isObjectToTrack(obj)) {\n return (obj as { [GET_ORIGINAL_SYMBOL]?: T })[GET_ORIGINAL_SYMBOL] || null;\n }\n return null;\n};\n\n/**\n * Mark object to be tracked.\n *\n * This function marks an object that will be passed into `createProxy`\n * as marked to track or not. By default only Array and Object are marked to track,\n * so this is useful for example to mark a class instance to track or to mark a object\n * to be untracked when creating your proxy.\n *\n * @param obj - Object to mark as tracked or not.\n * @param mark - Boolean indicating whether you want to track this object or not.\n * @returns No return.\n *\n * @example\n * import { createProxy, markToTrack, isChanged } from 'proxy-compare';\n *\n * const nested = { e: \"3\" }\n *\n * markToTrack(nested, false)\n *\n * const original = { a: \"1\", c: \"2\", d: nested };\n * const affected = new WeakMap();\n *\n * const proxy = createProxy(original, affected);\n *\n * proxy.d.e\n *\n * isChanged(original, { d: { e: \"3\" } }, affected) // true\n */\nexport const markToTrack = (obj: object, mark = true) => {\n objectsToTrack.set(obj, mark);\n};\n\n// convert affected to path list\nexport const affectedToPathList = (\n obj: unknown,\n affected: WeakMap<object, unknown>,\n) => {\n const list: (string | symbol)[][] = [];\n const seen = new WeakSet();\n const walk = (x: unknown, path?: (string | symbol)[]) => {\n if (seen.has(x as object)) {\n // for object with cycles\n return;\n }\n if (isObject(x)) {\n seen.add(x);\n }\n const used = isObject(x) && (affected as Affected).get(getOriginalObject(x));\n if (used) {\n used.forEach((key) => {\n walk((x as any)[key], path ? [...path, key] : [key]);\n });\n } else if (path) {\n list.push(path);\n }\n };\n walk(obj);\n return list;\n};\n\n/**\n * replace newProxy function.\n *\n * This can be used if you want to use proxy-polyfill.\n * Note that proxy-polyfill can't polyfill everything.\n * Use it at your own risk.\n */\nexport const replaceNewProxy = (fn: typeof newProxy) => {\n newProxy = fn;\n};\n"],"names":["OWN_KEYS_SYMBOL","Symbol","TRACK_MEMO_SYMBOL","GET_ORIGINAL_SYMBOL","newProxy","target","handler","Proxy","getProto","Object","getPrototypeOf","objectsToTrack","WeakMap","isObjectToTrack","obj","has","get","prototype","Array","isObject","x","unfrozenCache","getOriginalObject","affected","proxyCache","frozen","isFrozen","values","getOwnPropertyDescriptors","some","descriptor","writable","handlerAndState","origObj","state","f","recordUsage","key","skipWithOwnKeys","trackObject","used","Set","set","add","createProxy","delete","getOwnPropertyDescriptor","ownKeys","Reflect","deleteProperty","createProxyHandler","unfrozen","isArray","from","descriptors","forEach","desc","configurable","create","unfreeze","isOwnKeysChanged","prevObj","nextObj","prevKeys","nextKeys","length","k","i","isChanged","cache","is","hit","n","g","changed","c","getUntracked","markToTrack","mark","affectedToPathList","list","seen","WeakSet","walk","path","push","replaceNewProxy","fn"],"mappings":"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"} |