@tldraw/store 5.2.0-next.a6104dd18d03 → 5.2.0-next.b0c9cf86de67

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.
Files changed (63) hide show
  1. package/README.md +4 -0
  2. package/dist-cjs/index.js +1 -1
  3. package/dist-cjs/lib/ImmutableMap.js +0 -13
  4. package/dist-cjs/lib/ImmutableMap.js.map +2 -2
  5. package/dist-cjs/lib/RecordType.js +1 -1
  6. package/dist-cjs/lib/RecordType.js.map +2 -2
  7. package/dist-cjs/lib/RecordsDiff.js +26 -14
  8. package/dist-cjs/lib/RecordsDiff.js.map +2 -2
  9. package/dist-cjs/lib/Store.js +6 -5
  10. package/dist-cjs/lib/Store.js.map +2 -2
  11. package/dist-cjs/lib/StoreSchema.js +1 -1
  12. package/dist-cjs/lib/StoreSchema.js.map +2 -2
  13. package/dist-cjs/lib/executeQuery.js +1 -1
  14. package/dist-cjs/lib/executeQuery.js.map +2 -2
  15. package/dist-esm/index.mjs +1 -1
  16. package/dist-esm/lib/ImmutableMap.mjs +0 -13
  17. package/dist-esm/lib/ImmutableMap.mjs.map +2 -2
  18. package/dist-esm/lib/RecordType.mjs +1 -1
  19. package/dist-esm/lib/RecordType.mjs.map +2 -2
  20. package/dist-esm/lib/RecordsDiff.mjs +26 -14
  21. package/dist-esm/lib/RecordsDiff.mjs.map +2 -2
  22. package/dist-esm/lib/Store.mjs +7 -6
  23. package/dist-esm/lib/Store.mjs.map +2 -2
  24. package/dist-esm/lib/StoreSchema.mjs +1 -1
  25. package/dist-esm/lib/StoreSchema.mjs.map +2 -2
  26. package/dist-esm/lib/executeQuery.mjs +1 -1
  27. package/dist-esm/lib/executeQuery.mjs.map +2 -2
  28. package/package.json +3 -3
  29. package/src/lib/{test/AtomMap.test.ts → AtomMap.test.ts} +77 -111
  30. package/src/lib/AtomSet.test.ts +116 -0
  31. package/src/lib/BaseRecord.test.ts +10 -22
  32. package/src/lib/ImmutableMap.test.ts +114 -71
  33. package/src/lib/ImmutableMap.ts +1 -0
  34. package/src/lib/IncrementalSetConstructor.test.ts +76 -81
  35. package/src/lib/RecordType.test.ts +216 -0
  36. package/src/lib/RecordType.ts +1 -1
  37. package/src/lib/RecordsDiff.test.ts +112 -106
  38. package/src/lib/RecordsDiff.ts +43 -18
  39. package/src/lib/Store.test.ts +570 -630
  40. package/src/lib/Store.ts +9 -10
  41. package/src/lib/StoreListeners.test.ts +462 -0
  42. package/src/lib/StoreQueries.test.ts +586 -434
  43. package/src/lib/StoreSchema.test.ts +1012 -174
  44. package/src/lib/StoreSchema.ts +1 -1
  45. package/src/lib/StoreSideEffects.test.ts +546 -158
  46. package/src/lib/devFreeze.test.ts +94 -125
  47. package/src/lib/executeQuery.test.ts +77 -31
  48. package/src/lib/executeQuery.ts +3 -1
  49. package/src/lib/migrate.test.ts +273 -296
  50. package/src/lib/setUtils.test.ts +38 -79
  51. package/src/lib/test/createMigrations.test.ts +0 -75
  52. package/src/lib/test/dependsOn.test.ts +0 -166
  53. package/src/lib/test/getMigrationsSince.test.ts +0 -121
  54. package/src/lib/test/migrate.test.ts +0 -118
  55. package/src/lib/test/migratePersistedRecord.test.ts +0 -265
  56. package/src/lib/test/migrationCaching.test.ts +0 -209
  57. package/src/lib/test/recordStore.test.ts +0 -1567
  58. package/src/lib/test/recordStoreQueries.test.ts +0 -814
  59. package/src/lib/test/recordType.test.ts +0 -19
  60. package/src/lib/test/sortMigrations.test.ts +0 -83
  61. package/src/lib/test/upgradeSchema.test.ts +0 -80
  62. package/src/lib/test/validate.test.ts +0 -178
  63. package/src/lib/test/validateMigrations.test.ts +0 -165
package/README.md CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  ## Documentation
8
8
 
9
+ Documentation for the most recent release can be found on [tldraw.dev/docs](https://tldraw.dev/docs), including [reference docs](https://tldraw.dev/reference/editor/Editor). Our release notes can be found [here](https://tldraw.dev/releases).
10
+
11
+ For more agent-friendly docs, see our [LLMs.txt](https://tldraw.dev/llms.txt).
12
+
9
13
  A `DOCS.md` file is included alongside this README in the published package, with detailed API documentation and usage examples.
10
14
 
11
15
  # Usage
package/dist-cjs/index.js CHANGED
@@ -56,7 +56,7 @@ var import_StoreSchema = require("./lib/StoreSchema");
56
56
  var import_StoreSideEffects = require("./lib/StoreSideEffects");
57
57
  (0, import_utils.registerTldrawLibraryVersion)(
58
58
  "@tldraw/store",
59
- "5.2.0-next.a6104dd18d03",
59
+ "5.2.0-next.b0c9cf86de67",
60
60
  "cjs"
61
61
  );
62
62
  //# sourceMappingURL=index.js.map
@@ -188,19 +188,6 @@ class ImmutableMap {
188
188
  }
189
189
  });
190
190
  }
191
- /**
192
- * Gets the value associated with the specified key, with a fallback value.
193
- *
194
- * @param k - The key to look up
195
- * @param notSetValue - The value to return if the key is not found
196
- * @returns The value associated with the key, or the fallback value if not found
197
- * @example
198
- * ```ts
199
- * const map = new ImmutableMap([['key1', 'value1']])
200
- * console.log(map.get('key1', 'default')) // 'value1'
201
- * console.log(map.get('missing', 'default')) // 'default'
202
- * ```
203
- */
204
191
  get(k, notSetValue) {
205
192
  return this._root ? this._root.get(0, void 0, k, notSetValue) : notSetValue;
206
193
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/ImmutableMap.ts"],
4
- "sourcesContent": ["/*!\n * This file was lovingly and delicately extracted from Immutable.js\n * MIT License: https://github.com/immutable-js/immutable-js/blob/main/LICENSE\n * Copyright (c) 2014-present, Lee Byron and other contributors.\n */\nfunction smi(i32: number) {\n\treturn ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff)\n}\n\nconst defaultValueOf = Object.prototype.valueOf\n\nfunction hash(o: any) {\n\tif (o == null) {\n\t\treturn hashNullish(o)\n\t}\n\n\tif (typeof o.hashCode === 'function') {\n\t\t// Drop any high bits from accidentally long hash codes.\n\t\treturn smi(o.hashCode(o))\n\t}\n\n\tconst v = valueOf(o)\n\n\tif (v == null) {\n\t\treturn hashNullish(v)\n\t}\n\n\tswitch (typeof v) {\n\t\tcase 'boolean':\n\t\t\t// The hash values for built-in constants are a 1 value for each 5-byte\n\t\t\t// shift region expect for the first, which encodes the value. This\n\t\t\t// reduces the odds of a hash collision for these common values.\n\t\t\treturn v ? 0x42108421 : 0x42108420\n\t\tcase 'number':\n\t\t\treturn hashNumber(v)\n\t\tcase 'string':\n\t\t\treturn cachedHashString(v)\n\t\tcase 'object':\n\t\tcase 'function':\n\t\t\treturn hashJSObj(v)\n\t\tcase 'symbol':\n\t\t\treturn hashSymbol(v)\n\t\tdefault:\n\t\t\tif (typeof v.toString === 'function') {\n\t\t\t\treturn hashString(v.toString())\n\t\t\t}\n\t\t\tthrow new Error('Value type ' + typeof v + ' cannot be hashed.')\n\t}\n}\n\nfunction hashNullish(nullish: null | undefined) {\n\treturn nullish === null ? 0x42108422 : /* undefined */ 0x42108423\n}\n\n// Compress arbitrarily large numbers into smi hashes.\nfunction hashNumber(n: number) {\n\tif (n !== n || n === Infinity) {\n\t\treturn 0\n\t}\n\tlet hash = n | 0\n\tif (hash !== n) {\n\t\thash ^= n * 0xffffffff\n\t}\n\twhile (n > 0xffffffff) {\n\t\tn /= 0xffffffff\n\t\thash ^= n\n\t}\n\treturn smi(hash)\n}\n\nfunction cachedHashString(string: string) {\n\tlet hashed = stringHashCache[string]\n\tif (hashed === undefined) {\n\t\thashed = hashString(string)\n\t\tif (stringHashCacheCount === STRING_HASH_CACHE_SIZE) {\n\t\t\tstringHashCacheCount = 0\n\t\t\tstringHashCache = {}\n\t\t}\n\t\tstringHashCache[string] = hashed\n\t\tstringHashCacheCount++\n\t}\n\treturn hashed\n}\n\n// http://jsperf.com/hashing-strings\nfunction hashString(string: string) {\n\t// This is the hash from JVM\n\t// The hash code for a string is computed as\n\t// s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n\t// where s[i] is the ith character of the string and n is the length of\n\t// the string. We \"mod\" the result to make it between 0 (inclusive) and 2^31\n\t// (exclusive) by dropping high bits.\n\tlet hashed = 0\n\tfor (let ii = 0; ii < string.length; ii++) {\n\t\thashed = (31 * hashed + string.charCodeAt(ii)) | 0\n\t}\n\treturn smi(hashed)\n}\n\nfunction hashSymbol(sym: symbol) {\n\tlet hashed = symbolMap[sym]\n\tif (hashed !== undefined) {\n\t\treturn hashed\n\t}\n\n\thashed = nextHash()\n\n\tsymbolMap[sym] = hashed\n\n\treturn hashed\n}\n\nfunction hashJSObj(obj: object) {\n\tlet hashed = weakMap.get(obj)\n\tif (hashed !== undefined) {\n\t\treturn hashed\n\t}\n\n\thashed = nextHash()\n\n\tweakMap.set(obj, hashed)\n\n\treturn hashed\n}\n\nfunction valueOf(obj: any) {\n\treturn obj.valueOf !== defaultValueOf && typeof obj.valueOf === 'function'\n\t\t? obj.valueOf(obj)\n\t\t: obj\n}\n\nfunction nextHash() {\n\tconst nextHash = ++_objHashUID\n\tif (_objHashUID & 0x40000000) {\n\t\t_objHashUID = 0\n\t}\n\treturn nextHash\n}\n\n// If possible, use a WeakMap.\nconst weakMap = new WeakMap()\n\nconst symbolMap = Object.create(null)\n\nlet _objHashUID = 0\n\nlet stringHashCache: Record<string, number> = {}\nlet stringHashCacheCount = 0\nconst STRING_HASH_CACHE_SIZE = 24_000\n\n// Constants describing the size of trie nodes.\nconst SHIFT = 5 // Resulted in best performance after ______?\nconst SIZE = 1 << SHIFT\nconst MASK = SIZE - 1\n\n// A consistent shared value representing \"not set\" which equals nothing other\n// than itself, and nothing that could be provided externally.\nconst NOT_SET = {}\n\ninterface Ref {\n\tvalue: boolean\n}\n\n// Boolean references, Rough equivalent of `bool &`.\nfunction MakeRef(): Ref {\n\treturn { value: false }\n}\n\nfunction SetRef(ref?: Ref): void {\n\tif (ref) {\n\t\tref.value = true\n\t}\n}\n\nfunction arrCopy<I>(arr: Array<I>, offset = 0): Array<I> {\n\treturn arr.slice(offset)\n}\n\nclass OwnerID {}\n\n/**\n * A persistent immutable map implementation based on a Hash Array Mapped Trie (HAMT) data structure.\n * Provides efficient operations for creating, reading, updating, and deleting key-value pairs while\n * maintaining structural sharing to minimize memory usage and maximize performance.\n *\n * This implementation is extracted and adapted from Immutable.js, optimized for tldraw's store needs.\n * All operations return new instances rather than modifying existing ones, ensuring immutability.\n *\n * @public\n * @example\n * ```ts\n * // Create a new map\n * const map = new ImmutableMap([\n * ['key1', 'value1'],\n * ['key2', 'value2']\n * ])\n *\n * // Add or update values\n * const updated = map.set('key3', 'value3')\n *\n * // Get values\n * const value = map.get('key1') // 'value1'\n *\n * // Delete values\n * const smaller = map.delete('key1')\n * ```\n */\nexport class ImmutableMap<K, V> {\n\t// @pragma Construction\n\t// @ts-ignore\n\t_root: MapNode<K, V>\n\t// @ts-ignore\n\tsize: number\n\t// @ts-ignore\n\t__ownerID: OwnerID\n\t// @ts-ignore\n\t__hash: number | undefined\n\t// @ts-ignore\n\t__altered: boolean\n\n\t/**\n\t * Creates a new ImmutableMap instance.\n\t *\n\t * @param value - An iterable of key-value pairs to populate the map, or null/undefined for an empty map\n\t * @example\n\t * ```ts\n\t * // Create from array of pairs\n\t * const map1 = new ImmutableMap([['a', 1], ['b', 2]])\n\t *\n\t * // Create empty map\n\t * const map2 = new ImmutableMap()\n\t *\n\t * // Create from another map\n\t * const map3 = new ImmutableMap(map1)\n\t * ```\n\t */\n\tconstructor(value?: Iterable<[K, V]> | null | undefined) {\n\t\t// @ts-ignore\n\t\treturn value === undefined || value === null\n\t\t\t? emptyMap()\n\t\t\t: value instanceof ImmutableMap\n\t\t\t\t? value\n\t\t\t\t: emptyMap().withMutations((map) => {\n\t\t\t\t\t\tfor (const [k, v] of value) {\n\t\t\t\t\t\t\tmap.set(k, v)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t}\n\n\t/**\n\t * Gets the value associated with the specified key.\n\t *\n\t * @param k - The key to look up\n\t * @returns The value associated with the key, or undefined if not found\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['key1', 'value1']])\n\t * console.log(map.get('key1')) // 'value1'\n\t * console.log(map.get('missing')) // undefined\n\t * ```\n\t */\n\tget(k: K): V | undefined\n\t/**\n\t * Gets the value associated with the specified key, with a fallback value.\n\t *\n\t * @param k - The key to look up\n\t * @param notSetValue - The value to return if the key is not found\n\t * @returns The value associated with the key, or the fallback value if not found\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['key1', 'value1']])\n\t * console.log(map.get('key1', 'default')) // 'value1'\n\t * console.log(map.get('missing', 'default')) // 'default'\n\t * ```\n\t */\n\tget(k: K, notSetValue?: V): V {\n\t\treturn this._root ? this._root.get(0, undefined as any, k, notSetValue)! : notSetValue!\n\t}\n\n\t/**\n\t * Returns a new ImmutableMap with the specified key-value pair added or updated.\n\t * If the key already exists, its value is replaced. Otherwise, a new entry is created.\n\t *\n\t * @param k - The key to set\n\t * @param v - The value to associate with the key\n\t * @returns A new ImmutableMap with the key-value pair set\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1]])\n\t * const updated = map.set('b', 2) // New map with both 'a' and 'b'\n\t * const replaced = map.set('a', 10) // New map with 'a' updated to 10\n\t * ```\n\t */\n\tset(k: K, v: V) {\n\t\treturn updateMap(this, k, v)\n\t}\n\n\t/**\n\t * Returns a new ImmutableMap with the specified key removed.\n\t * If the key doesn't exist, returns the same map instance.\n\t *\n\t * @param k - The key to remove\n\t * @returns A new ImmutableMap with the key removed, or the same instance if key not found\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const smaller = map.delete('a') // New map with only 'b'\n\t * const same = map.delete('missing') // Returns original map\n\t * ```\n\t */\n\tdelete(k: K) {\n\t\treturn updateMap(this, k, NOT_SET as any)\n\t}\n\n\t/**\n\t * Returns a new ImmutableMap with all specified keys removed.\n\t * This is more efficient than calling delete() multiple times.\n\t *\n\t * @param keys - An iterable of keys to remove\n\t * @returns A new ImmutableMap with all specified keys removed\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2], ['c', 3]])\n\t * const smaller = map.deleteAll(['a', 'c']) // New map with only 'b'\n\t * ```\n\t */\n\tdeleteAll(keys: Iterable<K>) {\n\t\treturn this.withMutations((map) => {\n\t\t\tfor (const key of keys) {\n\t\t\t\tmap.delete(key)\n\t\t\t}\n\t\t})\n\t}\n\n\t__ensureOwner(ownerID: OwnerID) {\n\t\tif (ownerID === this.__ownerID) {\n\t\t\treturn this\n\t\t}\n\t\tif (!ownerID) {\n\t\t\tif (this.size === 0) {\n\t\t\t\treturn emptyMap()\n\t\t\t}\n\t\t\tthis.__ownerID = ownerID\n\t\t\tthis.__altered = false\n\t\t\treturn this\n\t\t}\n\t\treturn makeMap(this.size, this._root, ownerID, this.__hash)\n\t}\n\n\t/**\n\t * Applies multiple mutations efficiently by creating a mutable copy,\n\t * applying all changes, then returning an immutable result.\n\t * This is more efficient than chaining multiple set/delete operations.\n\t *\n\t * @param fn - Function that receives a mutable copy and applies changes\n\t * @returns A new ImmutableMap with all mutations applied, or the same instance if no changes\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1]])\n\t * const updated = map.withMutations(mutable => {\n\t * mutable.set('b', 2)\n\t * mutable.set('c', 3)\n\t * mutable.delete('a')\n\t * }) // Efficiently applies all changes at once\n\t * ```\n\t */\n\twithMutations(fn: (mutable: this) => void): this {\n\t\tconst mutable = this.asMutable()\n\t\tfn(mutable)\n\t\treturn mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this\n\t}\n\n\t/**\n\t * Checks if this map instance has been altered during a mutation operation.\n\t * This is used internally to optimize mutations.\n\t *\n\t * @returns True if the map was altered, false otherwise\n\t * @internal\n\t */\n\twasAltered() {\n\t\treturn this.__altered\n\t}\n\n\t/**\n\t * Returns a mutable copy of this map that can be efficiently modified.\n\t * Multiple changes to the mutable copy are batched together.\n\t *\n\t * @returns A mutable copy of this map\n\t * @internal\n\t */\n\tasMutable() {\n\t\treturn this.__ownerID ? this : this.__ensureOwner(new OwnerID())\n\t}\n\n\t/**\n\t * Makes the map iterable, yielding key-value pairs.\n\t *\n\t * @returns An iterator over [key, value] pairs\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * for (const [key, value] of map) {\n\t * console.log(key, value) // 'a' 1, then 'b' 2\n\t * }\n\t * ```\n\t */\n\t[Symbol.iterator](): Iterator<[K, V]> {\n\t\treturn this.entries()[Symbol.iterator]()\n\t}\n\n\t/**\n\t * Returns an iterable of key-value pairs.\n\t *\n\t * @returns An iterable over [key, value] pairs\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const entries = Array.from(map.entries()) // [['a', 1], ['b', 2]]\n\t * ```\n\t */\n\tentries(): Iterable<[K, V]> {\n\t\treturn new MapIterator(this, ITERATE_ENTRIES, false)\n\t}\n\n\t/**\n\t * Returns an iterable of keys.\n\t *\n\t * @returns An iterable over keys\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const keys = Array.from(map.keys()) // ['a', 'b']\n\t * ```\n\t */\n\tkeys(): Iterable<K> {\n\t\treturn new MapIterator(this, ITERATE_KEYS, false)\n\t}\n\n\t/**\n\t * Returns an iterable of values.\n\t *\n\t * @returns An iterable over values\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const values = Array.from(map.values()) // [1, 2]\n\t * ```\n\t */\n\tvalues(): Iterable<V> {\n\t\treturn new MapIterator(this, ITERATE_VALUES, false)\n\t}\n}\n\ntype MapNode<K, V> =\n\t| ArrayMapNode<K, V>\n\t| BitmapIndexedNode<K, V>\n\t| HashArrayMapNode<K, V>\n\t| HashCollisionNode<K, V>\n\t| ValueNode<K, V>\n\n// #pragma Trie Nodes\n\nclass ArrayMapNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic entries: Array<[K, V]>\n\t) {}\n\n\tget(_shift: unknown, _keyHash: unknown, key: K, notSetValue?: V) {\n\t\tconst entries = this.entries\n\t\tfor (let ii = 0, len = entries.length; ii < len; ii++) {\n\t\t\tif (Object.is(key, entries[ii][0])) {\n\t\t\t\treturn entries[ii][1]\n\t\t\t}\n\t\t}\n\t\treturn notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\t_shift: unknown,\n\t\t_keyHash: unknown,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t): MapNode<K, V> | undefined {\n\t\tconst removed = value === NOT_SET\n\n\t\tconst entries = this.entries\n\t\tlet idx = 0\n\t\tconst len = entries.length\n\t\tfor (; idx < len; idx++) {\n\t\t\tif (Object.is(key, entries[idx][0])) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tconst exists = idx < len\n\n\t\tif (exists ? entries[idx][1] === value : removed) {\n\t\t\treturn this\n\t\t}\n\n\t\tSetRef(didAlter)\n\t\tif (removed || !exists) SetRef(didChangeSize)\n\n\t\tif (removed && entries.length === 1) {\n\t\t\treturn // undefined\n\t\t}\n\n\t\tif (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {\n\t\t\treturn createNodes(ownerID, entries, key, value)\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newEntries = isEditable ? entries : arrCopy(entries)\n\n\t\tif (exists) {\n\t\t\tif (removed) {\n\t\t\t\tif (idx === len - 1) {\n\t\t\t\t\tnewEntries.pop()\n\t\t\t\t} else {\n\t\t\t\t\tnewEntries[idx] = newEntries.pop()!\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewEntries[idx] = [key, value]\n\t\t\t}\n\t\t} else {\n\t\t\tnewEntries.push([key, value])\n\t\t}\n\n\t\tif (isEditable) {\n\t\t\tthis.entries = newEntries\n\t\t\treturn this\n\t\t}\n\n\t\treturn new ArrayMapNode(ownerID, newEntries)\n\t}\n}\n\nclass BitmapIndexedNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic bitmap: number,\n\t\tpublic nodes: Array<MapNode<K, V>>\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V): V | undefined {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK)\n\t\tconst bitmap = this.bitmap\n\t\treturn (bitmap & bit) === 0\n\t\t\t? notSetValue\n\t\t\t: this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue)\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t): MapNode<K, V> | undefined {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\t\tconst bit = 1 << keyHashFrag\n\t\tconst bitmap = this.bitmap\n\t\tconst exists = (bitmap & bit) !== 0\n\n\t\tif (!exists && value === NOT_SET) {\n\t\t\treturn this\n\t\t}\n\n\t\tconst idx = popCount(bitmap & (bit - 1))\n\t\tconst nodes = this.nodes\n\t\tconst node = exists ? nodes[idx] : undefined\n\t\tconst newNode = updateNode(\n\t\t\tnode,\n\t\t\townerID,\n\t\t\tshift + SHIFT,\n\t\t\tkeyHash,\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tdidChangeSize,\n\t\t\tdidAlter\n\t\t)\n\n\t\tif (newNode === node) {\n\t\t\treturn this\n\t\t}\n\n\t\tif (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {\n\t\t\treturn expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode)\n\t\t}\n\n\t\tif (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) {\n\t\t\treturn nodes[idx ^ 1]\n\t\t}\n\n\t\tif (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {\n\t\t\treturn newNode\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit\n\t\tconst newNodes = exists\n\t\t\t? newNode\n\t\t\t\t? setAt(nodes, idx, newNode, isEditable)\n\t\t\t\t: spliceOut(nodes, idx, isEditable)\n\t\t\t: spliceIn(nodes, idx, newNode, isEditable)\n\n\t\tif (isEditable) {\n\t\t\tthis.bitmap = newBitmap\n\t\t\tthis.nodes = newNodes\n\t\t\treturn this\n\t\t}\n\n\t\treturn new BitmapIndexedNode(ownerID, newBitmap, newNodes)\n\t}\n}\n\nclass HashArrayMapNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic count: number,\n\t\tpublic nodes: Array<MapNode<K, V>>\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V): V | undefined {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\t\tconst node = this.nodes[idx]\n\t\treturn node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t) {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\t\tconst removed = value === NOT_SET\n\t\tconst nodes = this.nodes\n\t\tconst node = nodes[idx]\n\n\t\tif (removed && !node) {\n\t\t\treturn this\n\t\t}\n\n\t\tconst newNode = updateNode(\n\t\t\tnode,\n\t\t\townerID,\n\t\t\tshift + SHIFT,\n\t\t\tkeyHash,\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tdidChangeSize,\n\t\t\tdidAlter\n\t\t)\n\t\tif (newNode === node) {\n\t\t\treturn this\n\t\t}\n\n\t\tlet newCount = this.count\n\t\tif (!node) {\n\t\t\tnewCount++\n\t\t} else if (!newNode) {\n\t\t\tnewCount--\n\t\t\tif (newCount < MIN_HASH_ARRAY_MAP_SIZE) {\n\t\t\t\treturn packNodes(ownerID, nodes, newCount, idx)\n\t\t\t}\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newNodes = setAt(nodes, idx, newNode!, isEditable)\n\n\t\tif (isEditable) {\n\t\t\tthis.count = newCount\n\t\t\tthis.nodes = newNodes\n\t\t\treturn this\n\t\t}\n\n\t\treturn new HashArrayMapNode(ownerID, newCount, newNodes)\n\t}\n}\n\nclass HashCollisionNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic keyHash: number,\n\t\tpublic entries: Array<[K, V]>\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V) {\n\t\tconst entries = this.entries\n\t\tfor (let ii = 0, len = entries.length; ii < len; ii++) {\n\t\t\tif (Object.is(key, entries[ii][0])) {\n\t\t\t\treturn entries[ii][1]\n\t\t\t}\n\t\t}\n\t\treturn notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t): MapNode<K, V> {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\n\t\tconst removed = value === NOT_SET\n\n\t\tif (keyHash !== this.keyHash) {\n\t\t\tif (removed) {\n\t\t\t\treturn this\n\t\t\t}\n\t\t\tSetRef(didAlter)\n\t\t\tSetRef(didChangeSize)\n\t\t\treturn mergeIntoNode(this, ownerID, shift, keyHash, [key, value])\n\t\t}\n\n\t\tconst entries = this.entries\n\t\tlet idx = 0\n\t\tconst len = entries.length\n\t\tfor (; idx < len; idx++) {\n\t\t\tif (Object.is(key, entries[idx][0])) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tconst exists = idx < len\n\n\t\tif (exists ? entries[idx][1] === value : removed) {\n\t\t\treturn this\n\t\t}\n\n\t\tSetRef(didAlter)\n\t\tif (removed || !exists) SetRef(didChangeSize)\n\n\t\tif (removed && len === 2) {\n\t\t\treturn new ValueNode(ownerID, this.keyHash, entries[idx ^ 1])\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newEntries = isEditable ? entries : arrCopy(entries)\n\n\t\tif (exists) {\n\t\t\tif (removed) {\n\t\t\t\tif (idx === len - 1) {\n\t\t\t\t\tnewEntries.pop()\n\t\t\t\t} else {\n\t\t\t\t\tnewEntries[idx] = newEntries.pop()!\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewEntries[idx] = [key, value]\n\t\t\t}\n\t\t} else {\n\t\t\tnewEntries.push([key, value])\n\t\t}\n\n\t\tif (isEditable) {\n\t\t\tthis.entries = newEntries\n\t\t\treturn this\n\t\t}\n\n\t\treturn new HashCollisionNode(ownerID, this.keyHash, newEntries)\n\t}\n}\n\nclass ValueNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic keyHash: number | undefined,\n\t\tpublic entry: [K, V]\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V) {\n\t\treturn Object.is(key, this.entry[0]) ? this.entry[1] : notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number | undefined,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t) {\n\t\tconst removed = value === NOT_SET\n\t\tconst keyMatch = Object.is(key, this.entry[0])\n\t\tif (keyMatch ? value === this.entry[1] : removed) {\n\t\t\treturn this\n\t\t}\n\n\t\tSetRef(didAlter)\n\n\t\tif (removed) {\n\t\t\tSetRef(didChangeSize)\n\t\t\treturn // undefined\n\t\t}\n\n\t\tif (keyMatch) {\n\t\t\tif (ownerID && ownerID === this.ownerID) {\n\t\t\t\tthis.entry[1] = value\n\t\t\t\treturn this\n\t\t\t}\n\t\t\treturn new ValueNode(ownerID, this.keyHash, [key, value])\n\t\t}\n\n\t\tSetRef(didChangeSize)\n\t\treturn mergeIntoNode(this, ownerID, shift, hash(key), [key, value])\n\t}\n}\n\n// #pragma Iterators\n\nclass MapIterator<K, V> implements Iterator<any>, Iterable<any> {\n\t_stack\n\n\tconstructor(\n\t\tmap: ImmutableMap<K, V>,\n\t\tpublic _type: IterationType,\n\t\tpublic _reverse: boolean\n\t) {\n\t\tthis._stack = map._root && mapIteratorFrame<K, V>(map._root)\n\t}\n\n\t[Symbol.iterator](): Iterator<any> {\n\t\treturn this\n\t}\n\n\tnext() {\n\t\tconst type = this._type\n\t\tlet stack = this._stack\n\t\twhile (stack) {\n\t\t\tconst node = stack.node as any\n\t\t\tconst index = stack.index++\n\t\t\tlet maxIndex\n\t\t\tif (node.entry) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn mapIteratorValue(type, node.entry)\n\t\t\t\t}\n\t\t\t} else if ('entries' in node && node.entries) {\n\t\t\t\tmaxIndex = node.entries.length - 1\n\t\t\t\tif (index <= maxIndex) {\n\t\t\t\t\treturn mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index])\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmaxIndex = node.nodes.length - 1\n\t\t\t\tif (index <= maxIndex) {\n\t\t\t\t\tconst subNode = node.nodes[this._reverse ? maxIndex - index : index]\n\t\t\t\t\tif (subNode) {\n\t\t\t\t\t\tif (subNode.entry) {\n\t\t\t\t\t\t\treturn mapIteratorValue(type, subNode.entry)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack = this._stack = mapIteratorFrame(subNode, stack)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tstack = this._stack = this._stack.__prev!\n\t\t}\n\t\treturn iteratorDone() as any\n\t}\n}\n\nfunction mapIteratorValue<K, V>(type: IterationType, entry: [K, V]) {\n\treturn iteratorValue(type, entry[0], entry[1])\n}\n\ninterface IStack {\n\tnode: MapNode<unknown, unknown>\n\tindex: number\n\t__prev?: IStack\n}\n\nfunction mapIteratorFrame<K, V>(\n\tnode: MapNode<K, V>,\n\tprev?: { node: MapNode<K, V>; index: number; __prev?: IStack }\n): IStack {\n\treturn {\n\t\tnode: node,\n\t\tindex: 0,\n\t\t__prev: prev,\n\t}\n}\n\nconst ITERATE_KEYS = 0\nconst ITERATE_VALUES = 1\nconst ITERATE_ENTRIES = 2\n\ntype IterationType = typeof ITERATE_KEYS | typeof ITERATE_VALUES | typeof ITERATE_ENTRIES\n\nfunction iteratorValue<K, V>(\n\ttype: IterationType,\n\tk: K,\n\tv: V,\n\titeratorResult?: IteratorResult<any>\n) {\n\tconst value = type === ITERATE_KEYS ? k : type === ITERATE_VALUES ? v : [k, v]\n\tif (iteratorResult) {\n\t\titeratorResult.value = value\n\t} else {\n\t\titeratorResult = { value, done: false }\n\t}\n\treturn iteratorResult\n}\n\n/**\n * Creates a completed iterator result object indicating iteration is finished.\n * Used internally by map iterators to signal the end of iteration.\n *\n * @returns An IteratorResult object with done set to true and value as undefined\n * @public\n * @example\n * ```ts\n * // Used internally by iterators\n * const result = iteratorDone()\n * console.log(result) // { value: undefined, done: true }\n * ```\n */\nexport function iteratorDone() {\n\treturn { value: undefined, done: true }\n}\n\nfunction makeMap<K, V>(size: number, root?: MapNode<K, V>, ownerID?: OwnerID, hash?: number) {\n\tconst map = Object.create(ImmutableMap.prototype)\n\tmap.size = size\n\tmap._root = root\n\tmap.__ownerID = ownerID\n\tmap.__hash = hash\n\tmap.__altered = false\n\treturn map\n}\n\nlet EMPTY_MAP: ImmutableMap<unknown, unknown>\n/**\n * Returns a singleton empty ImmutableMap instance.\n * This function is optimized to return the same empty map instance for all calls,\n * saving memory when working with many empty maps.\n *\n * @returns An empty ImmutableMap instance\n * @public\n * @example\n * ```ts\n * // Get an empty map\n * const empty = emptyMap<string, number>()\n * console.log(empty.size) // 0\n *\n * // All empty maps are the same instance\n * const empty1 = emptyMap()\n * const empty2 = emptyMap()\n * console.log(empty1 === empty2) // true\n * ```\n */\nexport function emptyMap<K, V>(): ImmutableMap<K, V> {\n\treturn (EMPTY_MAP as any) || (EMPTY_MAP = makeMap(0))\n}\n\nfunction updateMap<K, V>(map: ImmutableMap<K, V>, k: K, v: V) {\n\tlet newRoot\n\tlet newSize\n\tif (!map._root) {\n\t\tif (v === NOT_SET) {\n\t\t\treturn map\n\t\t}\n\t\tnewSize = 1\n\t\tnewRoot = new ArrayMapNode(map.__ownerID, [[k, v]])\n\t} else {\n\t\tconst didChangeSize = MakeRef()\n\t\tconst didAlter = MakeRef()\n\t\tnewRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter)\n\t\tif (!didAlter.value) {\n\t\t\treturn map\n\t\t}\n\t\tnewSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0)\n\t}\n\tif (map.__ownerID) {\n\t\tmap.size = newSize\n\t\tmap._root = newRoot as any\n\t\tmap.__hash = undefined\n\t\tmap.__altered = true\n\t\treturn map\n\t}\n\treturn newRoot ? makeMap(newSize, newRoot) : emptyMap()\n}\n\nfunction updateNode<K, V>(\n\tnode: MapNode<K, V> | undefined,\n\townerID: OwnerID,\n\tshift: number,\n\tkeyHash: number | undefined,\n\tkey: K,\n\tvalue: V,\n\tdidChangeSize?: Ref,\n\tdidAlter?: Ref\n): MapNode<K, V> | undefined {\n\tif (!node) {\n\t\tif (value === NOT_SET) {\n\t\t\treturn node\n\t\t}\n\t\tSetRef(didAlter)\n\t\tSetRef(didChangeSize)\n\t\treturn new ValueNode(ownerID, keyHash, [key, value])\n\t}\n\treturn node.update(ownerID, shift, keyHash!, key, value, didChangeSize, didAlter) as any\n}\n\nfunction isLeafNode(node: MapNode<unknown, unknown>) {\n\treturn node.constructor === ValueNode || node.constructor === HashCollisionNode\n}\n\nfunction mergeIntoNode<K, V>(\n\tnode: any,\n\townerID: OwnerID,\n\tshift: number,\n\tkeyHash: number,\n\tentry: [K, V]\n): MapNode<K, V> {\n\tif (node.keyHash === keyHash) {\n\t\treturn new HashCollisionNode(ownerID, keyHash, [node.entry, entry])\n\t}\n\n\tconst idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK\n\tconst idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\n\tlet newNode\n\tconst nodes =\n\t\tidx1 === idx2\n\t\t\t? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)]\n\t\t\t: ((newNode = new ValueNode(ownerID, keyHash, entry)),\n\t\t\t\tidx1 < idx2 ? [node, newNode] : [newNode, node])\n\n\treturn new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes)\n}\n\nfunction createNodes<K, V>(ownerID: OwnerID, entries: [K, V][], key: K, value: V) {\n\tif (!ownerID) {\n\t\townerID = new OwnerID()\n\t}\n\tlet node: MapNode<K, V> = new ValueNode(ownerID, hash(key), [key, value])\n\tfor (let ii = 0; ii < entries.length; ii++) {\n\t\tconst entry = entries[ii]\n\t\tnode = node.update(ownerID, 0, undefined as any as number, entry[0], entry[1]) as any\n\t}\n\treturn node\n}\n\nfunction packNodes<K, V>(\n\townerID: OwnerID,\n\tnodes: MapNode<K, V>[],\n\tcount: number,\n\texcluding: number\n) {\n\tlet bitmap = 0\n\tlet packedII = 0\n\tconst packedNodes = new Array(count)\n\tfor (let ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {\n\t\tconst node = nodes[ii]\n\t\tif (node !== undefined && ii !== excluding) {\n\t\t\tbitmap |= bit\n\t\t\tpackedNodes[packedII++] = node\n\t\t}\n\t}\n\treturn new BitmapIndexedNode(ownerID, bitmap, packedNodes)\n}\n\nfunction expandNodes<K, V>(\n\townerID: OwnerID,\n\tnodes: MapNode<K, V>[],\n\tbitmap: number,\n\tincluding: number,\n\tnode: MapNode<K, V>\n): MapNode<K, V> {\n\tlet count = 0\n\tconst expandedNodes = new Array(SIZE)\n\tfor (let ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {\n\t\texpandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined\n\t}\n\texpandedNodes[including] = node\n\treturn new HashArrayMapNode(ownerID, count + 1, expandedNodes)\n}\n\nfunction popCount(x: number) {\n\tx -= (x >> 1) & 0x55555555\n\tx = (x & 0x33333333) + ((x >> 2) & 0x33333333)\n\tx = (x + (x >> 4)) & 0x0f0f0f0f\n\tx += x >> 8\n\tx += x >> 16\n\treturn x & 0x7f\n}\n\nfunction setAt<T>(array: T[], idx: number, val: T, canEdit: boolean): T[] {\n\tconst newArray = canEdit ? array : arrCopy(array)\n\tnewArray[idx] = val\n\treturn newArray\n}\n\nfunction spliceIn<T>(array: T[], idx: number, val: T, canEdit: boolean): T[] {\n\tconst newLen = array.length + 1\n\tif (canEdit && idx + 1 === newLen) {\n\t\tarray[idx] = val\n\t\treturn array\n\t}\n\tconst newArray = new Array<T>(newLen)\n\tlet after = 0\n\tfor (let ii = 0; ii < newLen; ii++) {\n\t\tif (ii === idx) {\n\t\t\tnewArray[ii] = val\n\t\t\tafter = -1\n\t\t} else {\n\t\t\tnewArray[ii] = array[ii + after]\n\t\t}\n\t}\n\treturn newArray\n}\n\nfunction spliceOut<T>(array: T[], idx: number, canEdit: boolean) {\n\tconst newLen = array.length - 1\n\tif (canEdit && idx === newLen) {\n\t\tarray.pop()\n\t\treturn array\n\t}\n\tconst newArray = new Array(newLen)\n\tlet after = 0\n\tfor (let ii = 0; ii < newLen; ii++) {\n\t\tif (ii === idx) {\n\t\t\tafter = 1\n\t\t}\n\t\tnewArray[ii] = array[ii + after]\n\t}\n\treturn newArray\n}\n\nconst MAX_ARRAY_MAP_SIZE = SIZE / 4\nconst MAX_BITMAP_INDEXED_SIZE = SIZE / 2\nconst MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*!\n * This file was lovingly and delicately extracted from Immutable.js\n * MIT License: https://github.com/immutable-js/immutable-js/blob/main/LICENSE\n * Copyright (c) 2014-present, Lee Byron and other contributors.\n */\nfunction smi(i32: number) {\n\treturn ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff)\n}\n\nconst defaultValueOf = Object.prototype.valueOf\n\nfunction hash(o: any) {\n\tif (o == null) {\n\t\treturn hashNullish(o)\n\t}\n\n\tif (typeof o.hashCode === 'function') {\n\t\t// Drop any high bits from accidentally long hash codes.\n\t\treturn smi(o.hashCode(o))\n\t}\n\n\tconst v = valueOf(o)\n\n\tif (v == null) {\n\t\treturn hashNullish(v)\n\t}\n\n\tswitch (typeof v) {\n\t\tcase 'boolean':\n\t\t\t// The hash values for built-in constants are a 1 value for each 5-byte\n\t\t\t// shift region expect for the first, which encodes the value. This\n\t\t\t// reduces the odds of a hash collision for these common values.\n\t\t\treturn v ? 0x42108421 : 0x42108420\n\t\tcase 'number':\n\t\t\treturn hashNumber(v)\n\t\tcase 'string':\n\t\t\treturn cachedHashString(v)\n\t\tcase 'object':\n\t\tcase 'function':\n\t\t\treturn hashJSObj(v)\n\t\tcase 'symbol':\n\t\t\treturn hashSymbol(v)\n\t\tdefault:\n\t\t\tif (typeof v.toString === 'function') {\n\t\t\t\treturn hashString(v.toString())\n\t\t\t}\n\t\t\tthrow new Error('Value type ' + typeof v + ' cannot be hashed.')\n\t}\n}\n\nfunction hashNullish(nullish: null | undefined) {\n\treturn nullish === null ? 0x42108422 : /* undefined */ 0x42108423\n}\n\n// Compress arbitrarily large numbers into smi hashes.\nfunction hashNumber(n: number) {\n\tif (n !== n || n === Infinity) {\n\t\treturn 0\n\t}\n\tlet hash = n | 0\n\tif (hash !== n) {\n\t\thash ^= n * 0xffffffff\n\t}\n\twhile (n > 0xffffffff) {\n\t\tn /= 0xffffffff\n\t\thash ^= n\n\t}\n\treturn smi(hash)\n}\n\nfunction cachedHashString(string: string) {\n\tlet hashed = stringHashCache[string]\n\tif (hashed === undefined) {\n\t\thashed = hashString(string)\n\t\tif (stringHashCacheCount === STRING_HASH_CACHE_SIZE) {\n\t\t\tstringHashCacheCount = 0\n\t\t\tstringHashCache = {}\n\t\t}\n\t\tstringHashCache[string] = hashed\n\t\tstringHashCacheCount++\n\t}\n\treturn hashed\n}\n\n// http://jsperf.com/hashing-strings\nfunction hashString(string: string) {\n\t// This is the hash from JVM\n\t// The hash code for a string is computed as\n\t// s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n\t// where s[i] is the ith character of the string and n is the length of\n\t// the string. We \"mod\" the result to make it between 0 (inclusive) and 2^31\n\t// (exclusive) by dropping high bits.\n\tlet hashed = 0\n\tfor (let ii = 0; ii < string.length; ii++) {\n\t\thashed = (31 * hashed + string.charCodeAt(ii)) | 0\n\t}\n\treturn smi(hashed)\n}\n\nfunction hashSymbol(sym: symbol) {\n\tlet hashed = symbolMap[sym]\n\tif (hashed !== undefined) {\n\t\treturn hashed\n\t}\n\n\thashed = nextHash()\n\n\tsymbolMap[sym] = hashed\n\n\treturn hashed\n}\n\nfunction hashJSObj(obj: object) {\n\tlet hashed = weakMap.get(obj)\n\tif (hashed !== undefined) {\n\t\treturn hashed\n\t}\n\n\thashed = nextHash()\n\n\tweakMap.set(obj, hashed)\n\n\treturn hashed\n}\n\nfunction valueOf(obj: any) {\n\treturn obj.valueOf !== defaultValueOf && typeof obj.valueOf === 'function'\n\t\t? obj.valueOf(obj)\n\t\t: obj\n}\n\nfunction nextHash() {\n\tconst nextHash = ++_objHashUID\n\tif (_objHashUID & 0x40000000) {\n\t\t_objHashUID = 0\n\t}\n\treturn nextHash\n}\n\n// If possible, use a WeakMap.\nconst weakMap = new WeakMap()\n\nconst symbolMap = Object.create(null)\n\nlet _objHashUID = 0\n\nlet stringHashCache: Record<string, number> = {}\nlet stringHashCacheCount = 0\nconst STRING_HASH_CACHE_SIZE = 24_000\n\n// Constants describing the size of trie nodes.\nconst SHIFT = 5 // Resulted in best performance after ______?\nconst SIZE = 1 << SHIFT\nconst MASK = SIZE - 1\n\n// A consistent shared value representing \"not set\" which equals nothing other\n// than itself, and nothing that could be provided externally.\nconst NOT_SET = {}\n\ninterface Ref {\n\tvalue: boolean\n}\n\n// Boolean references, Rough equivalent of `bool &`.\nfunction MakeRef(): Ref {\n\treturn { value: false }\n}\n\nfunction SetRef(ref?: Ref): void {\n\tif (ref) {\n\t\tref.value = true\n\t}\n}\n\nfunction arrCopy<I>(arr: Array<I>, offset = 0): Array<I> {\n\treturn arr.slice(offset)\n}\n\nclass OwnerID {}\n\n/**\n * A persistent immutable map implementation based on a Hash Array Mapped Trie (HAMT) data structure.\n * Provides efficient operations for creating, reading, updating, and deleting key-value pairs while\n * maintaining structural sharing to minimize memory usage and maximize performance.\n *\n * This implementation is extracted and adapted from Immutable.js, optimized for tldraw's store needs.\n * All operations return new instances rather than modifying existing ones, ensuring immutability.\n *\n * @public\n * @example\n * ```ts\n * // Create a new map\n * const map = new ImmutableMap([\n * ['key1', 'value1'],\n * ['key2', 'value2']\n * ])\n *\n * // Add or update values\n * const updated = map.set('key3', 'value3')\n *\n * // Get values\n * const value = map.get('key1') // 'value1'\n *\n * // Delete values\n * const smaller = map.delete('key1')\n * ```\n */\nexport class ImmutableMap<K, V> {\n\t// @pragma Construction\n\t// @ts-ignore\n\t_root: MapNode<K, V>\n\t// @ts-ignore\n\tsize: number\n\t// @ts-ignore\n\t__ownerID: OwnerID\n\t// @ts-ignore\n\t__hash: number | undefined\n\t// @ts-ignore\n\t__altered: boolean\n\n\t/**\n\t * Creates a new ImmutableMap instance.\n\t *\n\t * @param value - An iterable of key-value pairs to populate the map, or null/undefined for an empty map\n\t * @example\n\t * ```ts\n\t * // Create from array of pairs\n\t * const map1 = new ImmutableMap([['a', 1], ['b', 2]])\n\t *\n\t * // Create empty map\n\t * const map2 = new ImmutableMap()\n\t *\n\t * // Create from another map\n\t * const map3 = new ImmutableMap(map1)\n\t * ```\n\t */\n\tconstructor(value?: Iterable<[K, V]> | null | undefined) {\n\t\t// @ts-ignore\n\t\treturn value === undefined || value === null\n\t\t\t? emptyMap()\n\t\t\t: value instanceof ImmutableMap\n\t\t\t\t? value\n\t\t\t\t: emptyMap().withMutations((map) => {\n\t\t\t\t\t\tfor (const [k, v] of value) {\n\t\t\t\t\t\t\tmap.set(k, v)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t}\n\n\t/**\n\t * Gets the value associated with the specified key.\n\t *\n\t * @param k - The key to look up\n\t * @returns The value associated with the key, or undefined if not found\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['key1', 'value1']])\n\t * console.log(map.get('key1')) // 'value1'\n\t * console.log(map.get('missing')) // undefined\n\t * ```\n\t */\n\tget(k: K): V | undefined\n\t/**\n\t * Gets the value associated with the specified key, with a fallback value.\n\t *\n\t * @param k - The key to look up\n\t * @param notSetValue - The value to return if the key is not found\n\t * @returns The value associated with the key, or the fallback value if not found\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['key1', 'value1']])\n\t * console.log(map.get('key1', 'default')) // 'value1'\n\t * console.log(map.get('missing', 'default')) // 'default'\n\t * ```\n\t */\n\tget(k: K, notSetValue: V): V\n\tget(k: K, notSetValue?: V): V {\n\t\treturn this._root ? this._root.get(0, undefined as any, k, notSetValue)! : notSetValue!\n\t}\n\n\t/**\n\t * Returns a new ImmutableMap with the specified key-value pair added or updated.\n\t * If the key already exists, its value is replaced. Otherwise, a new entry is created.\n\t *\n\t * @param k - The key to set\n\t * @param v - The value to associate with the key\n\t * @returns A new ImmutableMap with the key-value pair set\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1]])\n\t * const updated = map.set('b', 2) // New map with both 'a' and 'b'\n\t * const replaced = map.set('a', 10) // New map with 'a' updated to 10\n\t * ```\n\t */\n\tset(k: K, v: V) {\n\t\treturn updateMap(this, k, v)\n\t}\n\n\t/**\n\t * Returns a new ImmutableMap with the specified key removed.\n\t * If the key doesn't exist, returns the same map instance.\n\t *\n\t * @param k - The key to remove\n\t * @returns A new ImmutableMap with the key removed, or the same instance if key not found\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const smaller = map.delete('a') // New map with only 'b'\n\t * const same = map.delete('missing') // Returns original map\n\t * ```\n\t */\n\tdelete(k: K) {\n\t\treturn updateMap(this, k, NOT_SET as any)\n\t}\n\n\t/**\n\t * Returns a new ImmutableMap with all specified keys removed.\n\t * This is more efficient than calling delete() multiple times.\n\t *\n\t * @param keys - An iterable of keys to remove\n\t * @returns A new ImmutableMap with all specified keys removed\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2], ['c', 3]])\n\t * const smaller = map.deleteAll(['a', 'c']) // New map with only 'b'\n\t * ```\n\t */\n\tdeleteAll(keys: Iterable<K>) {\n\t\treturn this.withMutations((map) => {\n\t\t\tfor (const key of keys) {\n\t\t\t\tmap.delete(key)\n\t\t\t}\n\t\t})\n\t}\n\n\t__ensureOwner(ownerID: OwnerID) {\n\t\tif (ownerID === this.__ownerID) {\n\t\t\treturn this\n\t\t}\n\t\tif (!ownerID) {\n\t\t\tif (this.size === 0) {\n\t\t\t\treturn emptyMap()\n\t\t\t}\n\t\t\tthis.__ownerID = ownerID\n\t\t\tthis.__altered = false\n\t\t\treturn this\n\t\t}\n\t\treturn makeMap(this.size, this._root, ownerID, this.__hash)\n\t}\n\n\t/**\n\t * Applies multiple mutations efficiently by creating a mutable copy,\n\t * applying all changes, then returning an immutable result.\n\t * This is more efficient than chaining multiple set/delete operations.\n\t *\n\t * @param fn - Function that receives a mutable copy and applies changes\n\t * @returns A new ImmutableMap with all mutations applied, or the same instance if no changes\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1]])\n\t * const updated = map.withMutations(mutable => {\n\t * mutable.set('b', 2)\n\t * mutable.set('c', 3)\n\t * mutable.delete('a')\n\t * }) // Efficiently applies all changes at once\n\t * ```\n\t */\n\twithMutations(fn: (mutable: this) => void): this {\n\t\tconst mutable = this.asMutable()\n\t\tfn(mutable)\n\t\treturn mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this\n\t}\n\n\t/**\n\t * Checks if this map instance has been altered during a mutation operation.\n\t * This is used internally to optimize mutations.\n\t *\n\t * @returns True if the map was altered, false otherwise\n\t * @internal\n\t */\n\twasAltered() {\n\t\treturn this.__altered\n\t}\n\n\t/**\n\t * Returns a mutable copy of this map that can be efficiently modified.\n\t * Multiple changes to the mutable copy are batched together.\n\t *\n\t * @returns A mutable copy of this map\n\t * @internal\n\t */\n\tasMutable() {\n\t\treturn this.__ownerID ? this : this.__ensureOwner(new OwnerID())\n\t}\n\n\t/**\n\t * Makes the map iterable, yielding key-value pairs.\n\t *\n\t * @returns An iterator over [key, value] pairs\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * for (const [key, value] of map) {\n\t * console.log(key, value) // 'a' 1, then 'b' 2\n\t * }\n\t * ```\n\t */\n\t[Symbol.iterator](): Iterator<[K, V]> {\n\t\treturn this.entries()[Symbol.iterator]()\n\t}\n\n\t/**\n\t * Returns an iterable of key-value pairs.\n\t *\n\t * @returns An iterable over [key, value] pairs\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const entries = Array.from(map.entries()) // [['a', 1], ['b', 2]]\n\t * ```\n\t */\n\tentries(): Iterable<[K, V]> {\n\t\treturn new MapIterator(this, ITERATE_ENTRIES, false)\n\t}\n\n\t/**\n\t * Returns an iterable of keys.\n\t *\n\t * @returns An iterable over keys\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const keys = Array.from(map.keys()) // ['a', 'b']\n\t * ```\n\t */\n\tkeys(): Iterable<K> {\n\t\treturn new MapIterator(this, ITERATE_KEYS, false)\n\t}\n\n\t/**\n\t * Returns an iterable of values.\n\t *\n\t * @returns An iterable over values\n\t * @example\n\t * ```ts\n\t * const map = new ImmutableMap([['a', 1], ['b', 2]])\n\t * const values = Array.from(map.values()) // [1, 2]\n\t * ```\n\t */\n\tvalues(): Iterable<V> {\n\t\treturn new MapIterator(this, ITERATE_VALUES, false)\n\t}\n}\n\ntype MapNode<K, V> =\n\t| ArrayMapNode<K, V>\n\t| BitmapIndexedNode<K, V>\n\t| HashArrayMapNode<K, V>\n\t| HashCollisionNode<K, V>\n\t| ValueNode<K, V>\n\n// #pragma Trie Nodes\n\nclass ArrayMapNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic entries: Array<[K, V]>\n\t) {}\n\n\tget(_shift: unknown, _keyHash: unknown, key: K, notSetValue?: V) {\n\t\tconst entries = this.entries\n\t\tfor (let ii = 0, len = entries.length; ii < len; ii++) {\n\t\t\tif (Object.is(key, entries[ii][0])) {\n\t\t\t\treturn entries[ii][1]\n\t\t\t}\n\t\t}\n\t\treturn notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\t_shift: unknown,\n\t\t_keyHash: unknown,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t): MapNode<K, V> | undefined {\n\t\tconst removed = value === NOT_SET\n\n\t\tconst entries = this.entries\n\t\tlet idx = 0\n\t\tconst len = entries.length\n\t\tfor (; idx < len; idx++) {\n\t\t\tif (Object.is(key, entries[idx][0])) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tconst exists = idx < len\n\n\t\tif (exists ? entries[idx][1] === value : removed) {\n\t\t\treturn this\n\t\t}\n\n\t\tSetRef(didAlter)\n\t\tif (removed || !exists) SetRef(didChangeSize)\n\n\t\tif (removed && entries.length === 1) {\n\t\t\treturn // undefined\n\t\t}\n\n\t\tif (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {\n\t\t\treturn createNodes(ownerID, entries, key, value)\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newEntries = isEditable ? entries : arrCopy(entries)\n\n\t\tif (exists) {\n\t\t\tif (removed) {\n\t\t\t\tif (idx === len - 1) {\n\t\t\t\t\tnewEntries.pop()\n\t\t\t\t} else {\n\t\t\t\t\tnewEntries[idx] = newEntries.pop()!\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewEntries[idx] = [key, value]\n\t\t\t}\n\t\t} else {\n\t\t\tnewEntries.push([key, value])\n\t\t}\n\n\t\tif (isEditable) {\n\t\t\tthis.entries = newEntries\n\t\t\treturn this\n\t\t}\n\n\t\treturn new ArrayMapNode(ownerID, newEntries)\n\t}\n}\n\nclass BitmapIndexedNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic bitmap: number,\n\t\tpublic nodes: Array<MapNode<K, V>>\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V): V | undefined {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK)\n\t\tconst bitmap = this.bitmap\n\t\treturn (bitmap & bit) === 0\n\t\t\t? notSetValue\n\t\t\t: this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue)\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t): MapNode<K, V> | undefined {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\t\tconst bit = 1 << keyHashFrag\n\t\tconst bitmap = this.bitmap\n\t\tconst exists = (bitmap & bit) !== 0\n\n\t\tif (!exists && value === NOT_SET) {\n\t\t\treturn this\n\t\t}\n\n\t\tconst idx = popCount(bitmap & (bit - 1))\n\t\tconst nodes = this.nodes\n\t\tconst node = exists ? nodes[idx] : undefined\n\t\tconst newNode = updateNode(\n\t\t\tnode,\n\t\t\townerID,\n\t\t\tshift + SHIFT,\n\t\t\tkeyHash,\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tdidChangeSize,\n\t\t\tdidAlter\n\t\t)\n\n\t\tif (newNode === node) {\n\t\t\treturn this\n\t\t}\n\n\t\tif (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {\n\t\t\treturn expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode)\n\t\t}\n\n\t\tif (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) {\n\t\t\treturn nodes[idx ^ 1]\n\t\t}\n\n\t\tif (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {\n\t\t\treturn newNode\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit\n\t\tconst newNodes = exists\n\t\t\t? newNode\n\t\t\t\t? setAt(nodes, idx, newNode, isEditable)\n\t\t\t\t: spliceOut(nodes, idx, isEditable)\n\t\t\t: spliceIn(nodes, idx, newNode, isEditable)\n\n\t\tif (isEditable) {\n\t\t\tthis.bitmap = newBitmap\n\t\t\tthis.nodes = newNodes\n\t\t\treturn this\n\t\t}\n\n\t\treturn new BitmapIndexedNode(ownerID, newBitmap, newNodes)\n\t}\n}\n\nclass HashArrayMapNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic count: number,\n\t\tpublic nodes: Array<MapNode<K, V>>\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V): V | undefined {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\t\tconst node = this.nodes[idx]\n\t\treturn node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t) {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\t\tconst idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\t\tconst removed = value === NOT_SET\n\t\tconst nodes = this.nodes\n\t\tconst node = nodes[idx]\n\n\t\tif (removed && !node) {\n\t\t\treturn this\n\t\t}\n\n\t\tconst newNode = updateNode(\n\t\t\tnode,\n\t\t\townerID,\n\t\t\tshift + SHIFT,\n\t\t\tkeyHash,\n\t\t\tkey,\n\t\t\tvalue,\n\t\t\tdidChangeSize,\n\t\t\tdidAlter\n\t\t)\n\t\tif (newNode === node) {\n\t\t\treturn this\n\t\t}\n\n\t\tlet newCount = this.count\n\t\tif (!node) {\n\t\t\tnewCount++\n\t\t} else if (!newNode) {\n\t\t\tnewCount--\n\t\t\tif (newCount < MIN_HASH_ARRAY_MAP_SIZE) {\n\t\t\t\treturn packNodes(ownerID, nodes, newCount, idx)\n\t\t\t}\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newNodes = setAt(nodes, idx, newNode!, isEditable)\n\n\t\tif (isEditable) {\n\t\t\tthis.count = newCount\n\t\t\tthis.nodes = newNodes\n\t\t\treturn this\n\t\t}\n\n\t\treturn new HashArrayMapNode(ownerID, newCount, newNodes)\n\t}\n}\n\nclass HashCollisionNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic keyHash: number,\n\t\tpublic entries: Array<[K, V]>\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V) {\n\t\tconst entries = this.entries\n\t\tfor (let ii = 0, len = entries.length; ii < len; ii++) {\n\t\t\tif (Object.is(key, entries[ii][0])) {\n\t\t\t\treturn entries[ii][1]\n\t\t\t}\n\t\t}\n\t\treturn notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t): MapNode<K, V> {\n\t\tif (keyHash === undefined) {\n\t\t\tkeyHash = hash(key)\n\t\t}\n\n\t\tconst removed = value === NOT_SET\n\n\t\tif (keyHash !== this.keyHash) {\n\t\t\tif (removed) {\n\t\t\t\treturn this\n\t\t\t}\n\t\t\tSetRef(didAlter)\n\t\t\tSetRef(didChangeSize)\n\t\t\treturn mergeIntoNode(this, ownerID, shift, keyHash, [key, value])\n\t\t}\n\n\t\tconst entries = this.entries\n\t\tlet idx = 0\n\t\tconst len = entries.length\n\t\tfor (; idx < len; idx++) {\n\t\t\tif (Object.is(key, entries[idx][0])) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tconst exists = idx < len\n\n\t\tif (exists ? entries[idx][1] === value : removed) {\n\t\t\treturn this\n\t\t}\n\n\t\tSetRef(didAlter)\n\t\tif (removed || !exists) SetRef(didChangeSize)\n\n\t\tif (removed && len === 2) {\n\t\t\treturn new ValueNode(ownerID, this.keyHash, entries[idx ^ 1])\n\t\t}\n\n\t\tconst isEditable = ownerID && ownerID === this.ownerID\n\t\tconst newEntries = isEditable ? entries : arrCopy(entries)\n\n\t\tif (exists) {\n\t\t\tif (removed) {\n\t\t\t\tif (idx === len - 1) {\n\t\t\t\t\tnewEntries.pop()\n\t\t\t\t} else {\n\t\t\t\t\tnewEntries[idx] = newEntries.pop()!\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewEntries[idx] = [key, value]\n\t\t\t}\n\t\t} else {\n\t\t\tnewEntries.push([key, value])\n\t\t}\n\n\t\tif (isEditable) {\n\t\t\tthis.entries = newEntries\n\t\t\treturn this\n\t\t}\n\n\t\treturn new HashCollisionNode(ownerID, this.keyHash, newEntries)\n\t}\n}\n\nclass ValueNode<K, V> {\n\tconstructor(\n\t\tpublic ownerID: OwnerID,\n\t\tpublic keyHash: number | undefined,\n\t\tpublic entry: [K, V]\n\t) {}\n\n\tget(shift: number, keyHash: number, key: K, notSetValue?: V) {\n\t\treturn Object.is(key, this.entry[0]) ? this.entry[1] : notSetValue\n\t}\n\n\tupdate(\n\t\townerID: OwnerID,\n\t\tshift: number,\n\t\tkeyHash: number | undefined,\n\t\tkey: K,\n\t\tvalue: V,\n\t\tdidChangeSize?: Ref,\n\t\tdidAlter?: Ref\n\t) {\n\t\tconst removed = value === NOT_SET\n\t\tconst keyMatch = Object.is(key, this.entry[0])\n\t\tif (keyMatch ? value === this.entry[1] : removed) {\n\t\t\treturn this\n\t\t}\n\n\t\tSetRef(didAlter)\n\n\t\tif (removed) {\n\t\t\tSetRef(didChangeSize)\n\t\t\treturn // undefined\n\t\t}\n\n\t\tif (keyMatch) {\n\t\t\tif (ownerID && ownerID === this.ownerID) {\n\t\t\t\tthis.entry[1] = value\n\t\t\t\treturn this\n\t\t\t}\n\t\t\treturn new ValueNode(ownerID, this.keyHash, [key, value])\n\t\t}\n\n\t\tSetRef(didChangeSize)\n\t\treturn mergeIntoNode(this, ownerID, shift, hash(key), [key, value])\n\t}\n}\n\n// #pragma Iterators\n\nclass MapIterator<K, V> implements Iterator<any>, Iterable<any> {\n\t_stack\n\n\tconstructor(\n\t\tmap: ImmutableMap<K, V>,\n\t\tpublic _type: IterationType,\n\t\tpublic _reverse: boolean\n\t) {\n\t\tthis._stack = map._root && mapIteratorFrame<K, V>(map._root)\n\t}\n\n\t[Symbol.iterator](): Iterator<any> {\n\t\treturn this\n\t}\n\n\tnext() {\n\t\tconst type = this._type\n\t\tlet stack = this._stack\n\t\twhile (stack) {\n\t\t\tconst node = stack.node as any\n\t\t\tconst index = stack.index++\n\t\t\tlet maxIndex\n\t\t\tif (node.entry) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn mapIteratorValue(type, node.entry)\n\t\t\t\t}\n\t\t\t} else if ('entries' in node && node.entries) {\n\t\t\t\tmaxIndex = node.entries.length - 1\n\t\t\t\tif (index <= maxIndex) {\n\t\t\t\t\treturn mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index])\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmaxIndex = node.nodes.length - 1\n\t\t\t\tif (index <= maxIndex) {\n\t\t\t\t\tconst subNode = node.nodes[this._reverse ? maxIndex - index : index]\n\t\t\t\t\tif (subNode) {\n\t\t\t\t\t\tif (subNode.entry) {\n\t\t\t\t\t\t\treturn mapIteratorValue(type, subNode.entry)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstack = this._stack = mapIteratorFrame(subNode, stack)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t}\n\t\t\tstack = this._stack = this._stack.__prev!\n\t\t}\n\t\treturn iteratorDone() as any\n\t}\n}\n\nfunction mapIteratorValue<K, V>(type: IterationType, entry: [K, V]) {\n\treturn iteratorValue(type, entry[0], entry[1])\n}\n\ninterface IStack {\n\tnode: MapNode<unknown, unknown>\n\tindex: number\n\t__prev?: IStack\n}\n\nfunction mapIteratorFrame<K, V>(\n\tnode: MapNode<K, V>,\n\tprev?: { node: MapNode<K, V>; index: number; __prev?: IStack }\n): IStack {\n\treturn {\n\t\tnode: node,\n\t\tindex: 0,\n\t\t__prev: prev,\n\t}\n}\n\nconst ITERATE_KEYS = 0\nconst ITERATE_VALUES = 1\nconst ITERATE_ENTRIES = 2\n\ntype IterationType = typeof ITERATE_KEYS | typeof ITERATE_VALUES | typeof ITERATE_ENTRIES\n\nfunction iteratorValue<K, V>(\n\ttype: IterationType,\n\tk: K,\n\tv: V,\n\titeratorResult?: IteratorResult<any>\n) {\n\tconst value = type === ITERATE_KEYS ? k : type === ITERATE_VALUES ? v : [k, v]\n\tif (iteratorResult) {\n\t\titeratorResult.value = value\n\t} else {\n\t\titeratorResult = { value, done: false }\n\t}\n\treturn iteratorResult\n}\n\n/**\n * Creates a completed iterator result object indicating iteration is finished.\n * Used internally by map iterators to signal the end of iteration.\n *\n * @returns An IteratorResult object with done set to true and value as undefined\n * @public\n * @example\n * ```ts\n * // Used internally by iterators\n * const result = iteratorDone()\n * console.log(result) // { value: undefined, done: true }\n * ```\n */\nexport function iteratorDone() {\n\treturn { value: undefined, done: true }\n}\n\nfunction makeMap<K, V>(size: number, root?: MapNode<K, V>, ownerID?: OwnerID, hash?: number) {\n\tconst map = Object.create(ImmutableMap.prototype)\n\tmap.size = size\n\tmap._root = root\n\tmap.__ownerID = ownerID\n\tmap.__hash = hash\n\tmap.__altered = false\n\treturn map\n}\n\nlet EMPTY_MAP: ImmutableMap<unknown, unknown>\n/**\n * Returns a singleton empty ImmutableMap instance.\n * This function is optimized to return the same empty map instance for all calls,\n * saving memory when working with many empty maps.\n *\n * @returns An empty ImmutableMap instance\n * @public\n * @example\n * ```ts\n * // Get an empty map\n * const empty = emptyMap<string, number>()\n * console.log(empty.size) // 0\n *\n * // All empty maps are the same instance\n * const empty1 = emptyMap()\n * const empty2 = emptyMap()\n * console.log(empty1 === empty2) // true\n * ```\n */\nexport function emptyMap<K, V>(): ImmutableMap<K, V> {\n\treturn (EMPTY_MAP as any) || (EMPTY_MAP = makeMap(0))\n}\n\nfunction updateMap<K, V>(map: ImmutableMap<K, V>, k: K, v: V) {\n\tlet newRoot\n\tlet newSize\n\tif (!map._root) {\n\t\tif (v === NOT_SET) {\n\t\t\treturn map\n\t\t}\n\t\tnewSize = 1\n\t\tnewRoot = new ArrayMapNode(map.__ownerID, [[k, v]])\n\t} else {\n\t\tconst didChangeSize = MakeRef()\n\t\tconst didAlter = MakeRef()\n\t\tnewRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter)\n\t\tif (!didAlter.value) {\n\t\t\treturn map\n\t\t}\n\t\tnewSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0)\n\t}\n\tif (map.__ownerID) {\n\t\tmap.size = newSize\n\t\tmap._root = newRoot as any\n\t\tmap.__hash = undefined\n\t\tmap.__altered = true\n\t\treturn map\n\t}\n\treturn newRoot ? makeMap(newSize, newRoot) : emptyMap()\n}\n\nfunction updateNode<K, V>(\n\tnode: MapNode<K, V> | undefined,\n\townerID: OwnerID,\n\tshift: number,\n\tkeyHash: number | undefined,\n\tkey: K,\n\tvalue: V,\n\tdidChangeSize?: Ref,\n\tdidAlter?: Ref\n): MapNode<K, V> | undefined {\n\tif (!node) {\n\t\tif (value === NOT_SET) {\n\t\t\treturn node\n\t\t}\n\t\tSetRef(didAlter)\n\t\tSetRef(didChangeSize)\n\t\treturn new ValueNode(ownerID, keyHash, [key, value])\n\t}\n\treturn node.update(ownerID, shift, keyHash!, key, value, didChangeSize, didAlter) as any\n}\n\nfunction isLeafNode(node: MapNode<unknown, unknown>) {\n\treturn node.constructor === ValueNode || node.constructor === HashCollisionNode\n}\n\nfunction mergeIntoNode<K, V>(\n\tnode: any,\n\townerID: OwnerID,\n\tshift: number,\n\tkeyHash: number,\n\tentry: [K, V]\n): MapNode<K, V> {\n\tif (node.keyHash === keyHash) {\n\t\treturn new HashCollisionNode(ownerID, keyHash, [node.entry, entry])\n\t}\n\n\tconst idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK\n\tconst idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK\n\n\tlet newNode\n\tconst nodes =\n\t\tidx1 === idx2\n\t\t\t? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)]\n\t\t\t: ((newNode = new ValueNode(ownerID, keyHash, entry)),\n\t\t\t\tidx1 < idx2 ? [node, newNode] : [newNode, node])\n\n\treturn new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes)\n}\n\nfunction createNodes<K, V>(ownerID: OwnerID, entries: [K, V][], key: K, value: V) {\n\tif (!ownerID) {\n\t\townerID = new OwnerID()\n\t}\n\tlet node: MapNode<K, V> = new ValueNode(ownerID, hash(key), [key, value])\n\tfor (let ii = 0; ii < entries.length; ii++) {\n\t\tconst entry = entries[ii]\n\t\tnode = node.update(ownerID, 0, undefined as any as number, entry[0], entry[1]) as any\n\t}\n\treturn node\n}\n\nfunction packNodes<K, V>(\n\townerID: OwnerID,\n\tnodes: MapNode<K, V>[],\n\tcount: number,\n\texcluding: number\n) {\n\tlet bitmap = 0\n\tlet packedII = 0\n\tconst packedNodes = new Array(count)\n\tfor (let ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {\n\t\tconst node = nodes[ii]\n\t\tif (node !== undefined && ii !== excluding) {\n\t\t\tbitmap |= bit\n\t\t\tpackedNodes[packedII++] = node\n\t\t}\n\t}\n\treturn new BitmapIndexedNode(ownerID, bitmap, packedNodes)\n}\n\nfunction expandNodes<K, V>(\n\townerID: OwnerID,\n\tnodes: MapNode<K, V>[],\n\tbitmap: number,\n\tincluding: number,\n\tnode: MapNode<K, V>\n): MapNode<K, V> {\n\tlet count = 0\n\tconst expandedNodes = new Array(SIZE)\n\tfor (let ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {\n\t\texpandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined\n\t}\n\texpandedNodes[including] = node\n\treturn new HashArrayMapNode(ownerID, count + 1, expandedNodes)\n}\n\nfunction popCount(x: number) {\n\tx -= (x >> 1) & 0x55555555\n\tx = (x & 0x33333333) + ((x >> 2) & 0x33333333)\n\tx = (x + (x >> 4)) & 0x0f0f0f0f\n\tx += x >> 8\n\tx += x >> 16\n\treturn x & 0x7f\n}\n\nfunction setAt<T>(array: T[], idx: number, val: T, canEdit: boolean): T[] {\n\tconst newArray = canEdit ? array : arrCopy(array)\n\tnewArray[idx] = val\n\treturn newArray\n}\n\nfunction spliceIn<T>(array: T[], idx: number, val: T, canEdit: boolean): T[] {\n\tconst newLen = array.length + 1\n\tif (canEdit && idx + 1 === newLen) {\n\t\tarray[idx] = val\n\t\treturn array\n\t}\n\tconst newArray = new Array<T>(newLen)\n\tlet after = 0\n\tfor (let ii = 0; ii < newLen; ii++) {\n\t\tif (ii === idx) {\n\t\t\tnewArray[ii] = val\n\t\t\tafter = -1\n\t\t} else {\n\t\t\tnewArray[ii] = array[ii + after]\n\t\t}\n\t}\n\treturn newArray\n}\n\nfunction spliceOut<T>(array: T[], idx: number, canEdit: boolean) {\n\tconst newLen = array.length - 1\n\tif (canEdit && idx === newLen) {\n\t\tarray.pop()\n\t\treturn array\n\t}\n\tconst newArray = new Array(newLen)\n\tlet after = 0\n\tfor (let ii = 0; ii < newLen; ii++) {\n\t\tif (ii === idx) {\n\t\t\tafter = 1\n\t\t}\n\t\tnewArray[ii] = array[ii + after]\n\t}\n\treturn newArray\n}\n\nconst MAX_ARRAY_MAP_SIZE = SIZE / 4\nconst MAX_BITMAP_INDEXED_SIZE = SIZE / 2\nconst MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4\n"],
5
+ "mappings": "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",
6
6
  "names": ["hash", "nextHash"]
7
7
  }
@@ -99,7 +99,7 @@ class RecordType {
99
99
  create(properties) {
100
100
  const result = {
101
101
  ...this.createDefaultProperties(),
102
- id: "id" in properties ? properties.id : this.createId()
102
+ id: properties.id ?? this.createId()
103
103
  };
104
104
  for (const [k, v] of Object.entries(properties)) {
105
105
  if (v !== void 0) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/RecordType.ts"],
4
- "sourcesContent": ["import { Expand, objectMapEntries, structuredClone, uniqueId } from '@tldraw/utils'\nimport { IdOf, UnknownRecord } from './BaseRecord'\nimport { StoreValidator } from './Store'\n\n/**\n * Utility type that extracts the record type from a RecordType instance.\n *\n * @example\n * ```ts\n * const Book = createRecordType<BookRecord>('book', { scope: 'document' })\n * type BookFromType = RecordTypeRecord<typeof Book> // BookRecord\n * ```\n *\n * @public\n */\nexport type RecordTypeRecord<R extends RecordType<any, any>> = ReturnType<R['create']>\n\n/**\n * Defines the scope of the record\n *\n * session: The record belongs to a single instance of the store. It should not be synced, and any persistence logic should 'de-instance-ize' the record before persisting it, and apply the reverse when rehydrating.\n * document: The record is persisted and synced. It is available to all store instances.\n * presence: The record belongs to a single instance of the store. It may be synced to other instances, but other instances should not make changes to it. It should not be persisted.\n *\n * @public\n * */\nexport type RecordScope = 'session' | 'document' | 'presence'\n\n/**\n * A record type is a type that can be stored in a record store. It is created with\n * `createRecordType`.\n *\n * @public\n */\nexport class RecordType<\n\tR extends UnknownRecord,\n\tRequiredProperties extends keyof Omit<R, 'id' | 'typeName'>,\n> {\n\t/**\n\t * Factory function that creates default properties for new records.\n\t * @public\n\t */\n\treadonly createDefaultProperties: () => Exclude<Omit<R, 'id' | 'typeName'>, RequiredProperties>\n\n\t/**\n\t * Validator function used to validate records of this type.\n\t * @public\n\t */\n\treadonly validator: StoreValidator<R>\n\n\t/**\n\t * Optional configuration specifying which record properties are ephemeral.\n\t * Ephemeral properties are not included in snapshots or synchronization.\n\t * @public\n\t */\n\treadonly ephemeralKeys?: { readonly [K in Exclude<keyof R, 'id' | 'typeName'>]: boolean }\n\n\t/**\n\t * Set of property names that are marked as ephemeral for efficient lookup.\n\t * @public\n\t */\n\treadonly ephemeralKeySet: ReadonlySet<string>\n\n\t/**\n\t * The scope that determines how records of this type are persisted and synchronized.\n\t * @public\n\t */\n\treadonly scope: RecordScope\n\n\t/**\n\t * Creates a new RecordType instance.\n\t *\n\t * typeName - The unique type name for records created by this RecordType\n\t * config - Configuration object for the RecordType\n\t * - createDefaultProperties - Function that returns default properties for new records\n\t * - validator - Optional validator function for record validation\n\t * - scope - Optional scope determining persistence behavior (defaults to 'document')\n\t * - ephemeralKeys - Optional mapping of property names to ephemeral status\n\t * @public\n\t */\n\tconstructor(\n\t\t/**\n\t\t * The unique type associated with this record.\n\t\t *\n\t\t * @public\n\t\t * @readonly\n\t\t */\n\t\tpublic readonly typeName: R['typeName'],\n\t\tconfig: {\n\t\t\t// eslint-disable-next-line tldraw/method-signature-style\n\t\t\treadonly createDefaultProperties: () => Exclude<\n\t\t\t\tOmit<R, 'id' | 'typeName'>,\n\t\t\t\tRequiredProperties\n\t\t\t>\n\t\t\treadonly validator?: StoreValidator<R>\n\t\t\treadonly scope?: RecordScope\n\t\t\treadonly ephemeralKeys?: { readonly [K in Exclude<keyof R, 'id' | 'typeName'>]: boolean }\n\t\t}\n\t) {\n\t\tthis.createDefaultProperties = config.createDefaultProperties\n\t\tthis.validator = config.validator ?? { validate: (r: unknown) => r as R }\n\t\tthis.scope = config.scope ?? 'document'\n\t\tthis.ephemeralKeys = config.ephemeralKeys\n\n\t\tconst ephemeralKeySet = new Set<string>()\n\t\tif (config.ephemeralKeys) {\n\t\t\tfor (const [key, isEphemeral] of objectMapEntries(config.ephemeralKeys)) {\n\t\t\t\tif (isEphemeral) ephemeralKeySet.add(key as string)\n\t\t\t}\n\t\t}\n\t\tthis.ephemeralKeySet = ephemeralKeySet\n\t}\n\n\t/**\n\t * Creates a new record of this type with the given properties.\n\t *\n\t * Properties are merged with default properties from the RecordType configuration.\n\t * If no id is provided, a unique id will be generated automatically.\n\t *\n\t * @example\n\t * ```ts\n\t * const book = Book.create({\n\t * title: 'The Great Gatsby',\n\t * author: 'F. Scott Fitzgerald'\n\t * })\n\t * // Result: { id: 'book:abc123', typeName: 'book', title: 'The Great Gatsby', author: 'F. Scott Fitzgerald', inStock: true }\n\t * ```\n\t *\n\t * @param properties - The properties for the new record, including both required and optional fields\n\t * @returns The newly created record with generated id and typeName\n\t * @public\n\t */\n\tcreate(\n\t\tproperties: Expand<Pick<R, RequiredProperties> & Omit<Partial<R>, RequiredProperties>>\n\t): R {\n\t\tconst result = {\n\t\t\t...this.createDefaultProperties(),\n\t\t\tid: 'id' in properties ? properties.id : this.createId(),\n\t\t} as any\n\n\t\tfor (const [k, v] of Object.entries(properties)) {\n\t\t\tif (v !== undefined) {\n\t\t\t\tresult[k] = v\n\t\t\t}\n\t\t}\n\n\t\tresult.typeName = this.typeName\n\n\t\treturn result as R\n\t}\n\n\t/**\n\t * Creates a deep copy of an existing record with a new unique id.\n\t *\n\t * This method performs a deep clone of all properties while generating a fresh id,\n\t * making it useful for duplicating records without id conflicts.\n\t *\n\t * @example\n\t * ```ts\n\t * const originalBook = Book.create({ title: '1984', author: 'George Orwell' })\n\t * const duplicatedBook = Book.clone(originalBook)\n\t * // duplicatedBook has same properties but different id\n\t * ```\n\t *\n\t * @param record - The record to clone\n\t * @returns A new record with the same properties but a different id\n\t * @public\n\t */\n\tclone(record: R): R {\n\t\treturn { ...structuredClone(record), id: this.createId() }\n\t}\n\n\t/**\n\t * Create a new ID for this record type.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * const id = recordType.createId()\n\t * ```\n\t *\n\t * @returns The new ID.\n\t * @public\n\t */\n\tcreateId(customUniquePart?: string): IdOf<R> {\n\t\treturn (this.typeName + ':' + (customUniquePart ?? uniqueId())) as IdOf<R>\n\t}\n\n\t/**\n\t * Extracts the unique identifier part from a full record id.\n\t *\n\t * Record ids have the format `typeName:uniquePart`. This method returns just the unique part.\n\t *\n\t * @example\n\t * ```ts\n\t * const bookId = Book.createId() // 'book:abc123'\n\t * const uniquePart = Book.parseId(bookId) // 'abc123'\n\t * ```\n\t *\n\t * @param id - The full record id to parse\n\t * @returns The unique identifier portion after the colon\n\t * @throws Error if the id is not valid for this record type\n\t * @public\n\t */\n\tparseId(id: IdOf<R>): string {\n\t\tif (!this.isId(id)) {\n\t\t\tthrow new Error(`ID \"${id}\" is not a valid ID for type \"${this.typeName}\"`)\n\t\t}\n\n\t\treturn id.slice(this.typeName.length + 1)\n\t}\n\n\t/**\n\t * Type guard that checks whether a record belongs to this RecordType.\n\t *\n\t * This method performs a runtime check by comparing the record's typeName\n\t * against this RecordType's typeName.\n\t *\n\t * @example\n\t * ```ts\n\t * if (Book.isInstance(someRecord)) {\n\t * // someRecord is now typed as a book record\n\t * console.log(someRecord.title)\n\t * }\n\t * ```\n\t *\n\t * @param record - The record to check, may be undefined\n\t * @returns True if the record is an instance of this record type\n\t * @public\n\t */\n\tisInstance(record?: UnknownRecord): record is R {\n\t\treturn record?.typeName === this.typeName\n\t}\n\n\t/**\n\t * Type guard that checks whether an id string belongs to this RecordType.\n\t *\n\t * Validates that the id starts with this RecordType's typeName followed by a colon.\n\t * This is more efficient than parsing the full id when you only need to verify the type.\n\t *\n\t * @example\n\t * ```ts\n\t * if (Book.isId(someId)) {\n\t * // someId is now typed as IdOf<BookRecord>\n\t * const book = store.get(someId)\n\t * }\n\t * ```\n\t *\n\t * @param id - The id string to check, may be undefined\n\t * @returns True if the id belongs to this record type\n\t * @public\n\t */\n\tisId(id?: string): id is IdOf<R> {\n\t\tif (!id) return false\n\t\tfor (let i = 0; i < this.typeName.length; i++) {\n\t\t\tif (id[i] !== this.typeName[i]) return false\n\t\t}\n\n\t\treturn id[this.typeName.length] === ':'\n\t}\n\n\t/**\n\t * Create a new RecordType that has the same type name as this RecordType and includes the given\n\t * default properties.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * const authorType = createRecordType('author', () => ({ living: true }))\n\t * const deadAuthorType = authorType.withDefaultProperties({ living: false })\n\t * ```\n\t *\n\t * @param createDefaultProperties - A function that returns the default properties of the new RecordType.\n\t * @returns The new RecordType.\n\t */\n\twithDefaultProperties<DefaultProps extends Omit<Partial<R>, 'typeName' | 'id'>>(\n\t\tcreateDefaultProperties: () => DefaultProps\n\t): RecordType<R, Exclude<RequiredProperties, keyof DefaultProps>> {\n\t\treturn new RecordType<R, Exclude<RequiredProperties, keyof DefaultProps>>(this.typeName, {\n\t\t\tcreateDefaultProperties: createDefaultProperties as any,\n\t\t\tvalidator: this.validator,\n\t\t\tscope: this.scope,\n\t\t\tephemeralKeys: this.ephemeralKeys,\n\t\t})\n\t}\n\n\t/**\n\t * Validates a record against this RecordType's validator and returns it with proper typing.\n\t *\n\t * This method runs the configured validator function and throws an error if validation fails.\n\t * If a previous version of the record is provided, it may use optimized validation.\n\t *\n\t * @example\n\t * ```ts\n\t * try {\n\t * const validBook = Book.validate(untrustedData)\n\t * // validBook is now properly typed and validated\n\t * } catch (error) {\n\t * console.log('Validation failed:', error.message)\n\t * }\n\t * ```\n\t *\n\t * @param record - The unknown record data to validate\n\t * @param recordBefore - Optional previous version for optimized validation\n\t * @returns The validated and properly typed record\n\t * @throws Error if validation fails\n\t * @public\n\t */\n\tvalidate(record: unknown, recordBefore?: R): R {\n\t\tif (recordBefore && this.validator.validateUsingKnownGoodVersion) {\n\t\t\treturn this.validator.validateUsingKnownGoodVersion(recordBefore, record)\n\t\t}\n\t\treturn this.validator.validate(record)\n\t}\n}\n\n/**\n * Creates a new RecordType with the specified configuration.\n *\n * This factory function creates a RecordType that can be used to create, validate, and manage\n * records of a specific type within a store. The resulting RecordType can be extended with\n * default properties using the withDefaultProperties method.\n *\n * @example\n * ```ts\n * interface BookRecord extends BaseRecord<'book', RecordId<BookRecord>> {\n * title: string\n * author: string\n * inStock: boolean\n * }\n *\n * const Book = createRecordType<BookRecord>('book', {\n * scope: 'document',\n * validator: bookValidator\n * })\n * ```\n *\n * @param typeName - The unique type name for this record type\n * @param config - Configuration object containing validator, scope, and ephemeral keys\n * @returns A new RecordType instance for creating and managing records\n * @public\n */\nexport function createRecordType<R extends UnknownRecord>(\n\ttypeName: R['typeName'],\n\tconfig: {\n\t\tvalidator?: StoreValidator<R>\n\t\tscope: RecordScope\n\t\tephemeralKeys?: { readonly [K in Exclude<keyof R, 'id' | 'typeName'>]: boolean }\n\t}\n): RecordType<R, keyof Omit<R, 'id' | 'typeName'>> {\n\treturn new RecordType<R, keyof Omit<R, 'id' | 'typeName'>>(typeName, {\n\t\tcreateDefaultProperties: () => ({}) as any,\n\t\tvalidator: config.validator,\n\t\tscope: config.scope,\n\t\tephemeralKeys: config.ephemeralKeys,\n\t})\n}\n\n/**\n * Assert whether an id correspond to a record type.\n *\n * @example\n *\n * ```ts\n * assertIdType(myId, \"shape\")\n * ```\n *\n * @param id - The id to check.\n * @param type - The type of the record.\n * @public\n */\nexport function assertIdType<R extends UnknownRecord>(\n\tid: string | undefined,\n\ttype: RecordType<R, any>\n): asserts id is IdOf<R> {\n\tif (!id || !type.isId(id)) {\n\t\tthrow new Error(`string ${JSON.stringify(id)} is not a valid ${type.typeName} id`)\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAoE;AAkC7D,MAAM,WAGX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2CD,YAOiB,UAChB,QAUC;AAXe;AAYhB,SAAK,0BAA0B,OAAO;AACtC,SAAK,YAAY,OAAO,aAAa,EAAE,UAAU,CAAC,MAAe,EAAO;AACxE,SAAK,QAAQ,OAAO,SAAS;AAC7B,SAAK,gBAAgB,OAAO;AAE5B,UAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAI,OAAO,eAAe;AACzB,iBAAW,CAAC,KAAK,WAAW,SAAK,+BAAiB,OAAO,aAAa,GAAG;AACxE,YAAI,YAAa,iBAAgB,IAAI,GAAa;AAAA,MACnD;AAAA,IACD;AACA,SAAK,kBAAkB;AAAA,EACxB;AAAA,EAxBiB;AAAA;AAAA;AAAA;AAAA;AAAA,EA7CR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiET,OACC,YACI;AACJ,UAAM,SAAS;AAAA,MACd,GAAG,KAAK,wBAAwB;AAAA,MAChC,IAAI,QAAQ,aAAa,WAAW,KAAK,KAAK,SAAS;AAAA,IACxD;AAEA,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,UAAU,GAAG;AAChD,UAAI,MAAM,QAAW;AACpB,eAAO,CAAC,IAAI;AAAA,MACb;AAAA,IACD;AAEA,WAAO,WAAW,KAAK;AAEvB,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,QAAc;AACnB,WAAO,EAAE,OAAG,8BAAgB,MAAM,GAAG,IAAI,KAAK,SAAS,EAAE;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS,kBAAoC;AAC5C,WAAQ,KAAK,WAAW,OAAO,wBAAoB,uBAAS;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,QAAQ,IAAqB;AAC5B,QAAI,CAAC,KAAK,KAAK,EAAE,GAAG;AACnB,YAAM,IAAI,MAAM,OAAO,EAAE,iCAAiC,KAAK,QAAQ,GAAG;AAAA,IAC3E;AAEA,WAAO,GAAG,MAAM,KAAK,SAAS,SAAS,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,WAAW,QAAqC;AAC/C,WAAO,QAAQ,aAAa,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,KAAK,IAA4B;AAChC,QAAI,CAAC,GAAI,QAAO;AAChB,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC9C,UAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,EAAG,QAAO;AAAA,IACxC;AAEA,WAAO,GAAG,KAAK,SAAS,MAAM,MAAM;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,sBACC,yBACiE;AACjE,WAAO,IAAI,WAA+D,KAAK,UAAU;AAAA,MACxF;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK;AAAA,IACrB,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,SAAS,QAAiB,cAAqB;AAC9C,QAAI,gBAAgB,KAAK,UAAU,+BAA+B;AACjE,aAAO,KAAK,UAAU,8BAA8B,cAAc,MAAM;AAAA,IACzE;AACA,WAAO,KAAK,UAAU,SAAS,MAAM;AAAA,EACtC;AACD;AA4BO,SAAS,iBACf,UACA,QAKkD;AAClD,SAAO,IAAI,WAAgD,UAAU;AAAA,IACpE,yBAAyB,OAAO,CAAC;AAAA,IACjC,WAAW,OAAO;AAAA,IAClB,OAAO,OAAO;AAAA,IACd,eAAe,OAAO;AAAA,EACvB,CAAC;AACF;AAeO,SAAS,aACf,IACA,MACwB;AACxB,MAAI,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,GAAG;AAC1B,UAAM,IAAI,MAAM,UAAU,KAAK,UAAU,EAAE,CAAC,mBAAmB,KAAK,QAAQ,KAAK;AAAA,EAClF;AACD;",
4
+ "sourcesContent": ["import { Expand, objectMapEntries, structuredClone, uniqueId } from '@tldraw/utils'\nimport { IdOf, UnknownRecord } from './BaseRecord'\nimport { StoreValidator } from './Store'\n\n/**\n * Utility type that extracts the record type from a RecordType instance.\n *\n * @example\n * ```ts\n * const Book = createRecordType<BookRecord>('book', { scope: 'document' })\n * type BookFromType = RecordTypeRecord<typeof Book> // BookRecord\n * ```\n *\n * @public\n */\nexport type RecordTypeRecord<R extends RecordType<any, any>> = ReturnType<R['create']>\n\n/**\n * Defines the scope of the record\n *\n * session: The record belongs to a single instance of the store. It should not be synced, and any persistence logic should 'de-instance-ize' the record before persisting it, and apply the reverse when rehydrating.\n * document: The record is persisted and synced. It is available to all store instances.\n * presence: The record belongs to a single instance of the store. It may be synced to other instances, but other instances should not make changes to it. It should not be persisted.\n *\n * @public\n * */\nexport type RecordScope = 'session' | 'document' | 'presence'\n\n/**\n * A record type is a type that can be stored in a record store. It is created with\n * `createRecordType`.\n *\n * @public\n */\nexport class RecordType<\n\tR extends UnknownRecord,\n\tRequiredProperties extends keyof Omit<R, 'id' | 'typeName'>,\n> {\n\t/**\n\t * Factory function that creates default properties for new records.\n\t * @public\n\t */\n\treadonly createDefaultProperties: () => Exclude<Omit<R, 'id' | 'typeName'>, RequiredProperties>\n\n\t/**\n\t * Validator function used to validate records of this type.\n\t * @public\n\t */\n\treadonly validator: StoreValidator<R>\n\n\t/**\n\t * Optional configuration specifying which record properties are ephemeral.\n\t * Ephemeral properties are not included in snapshots or synchronization.\n\t * @public\n\t */\n\treadonly ephemeralKeys?: { readonly [K in Exclude<keyof R, 'id' | 'typeName'>]: boolean }\n\n\t/**\n\t * Set of property names that are marked as ephemeral for efficient lookup.\n\t * @public\n\t */\n\treadonly ephemeralKeySet: ReadonlySet<string>\n\n\t/**\n\t * The scope that determines how records of this type are persisted and synchronized.\n\t * @public\n\t */\n\treadonly scope: RecordScope\n\n\t/**\n\t * Creates a new RecordType instance.\n\t *\n\t * typeName - The unique type name for records created by this RecordType\n\t * config - Configuration object for the RecordType\n\t * - createDefaultProperties - Function that returns default properties for new records\n\t * - validator - Optional validator function for record validation\n\t * - scope - Optional scope determining persistence behavior (defaults to 'document')\n\t * - ephemeralKeys - Optional mapping of property names to ephemeral status\n\t * @public\n\t */\n\tconstructor(\n\t\t/**\n\t\t * The unique type associated with this record.\n\t\t *\n\t\t * @public\n\t\t * @readonly\n\t\t */\n\t\tpublic readonly typeName: R['typeName'],\n\t\tconfig: {\n\t\t\t// eslint-disable-next-line tldraw/method-signature-style\n\t\t\treadonly createDefaultProperties: () => Exclude<\n\t\t\t\tOmit<R, 'id' | 'typeName'>,\n\t\t\t\tRequiredProperties\n\t\t\t>\n\t\t\treadonly validator?: StoreValidator<R>\n\t\t\treadonly scope?: RecordScope\n\t\t\treadonly ephemeralKeys?: { readonly [K in Exclude<keyof R, 'id' | 'typeName'>]: boolean }\n\t\t}\n\t) {\n\t\tthis.createDefaultProperties = config.createDefaultProperties\n\t\tthis.validator = config.validator ?? { validate: (r: unknown) => r as R }\n\t\tthis.scope = config.scope ?? 'document'\n\t\tthis.ephemeralKeys = config.ephemeralKeys\n\n\t\tconst ephemeralKeySet = new Set<string>()\n\t\tif (config.ephemeralKeys) {\n\t\t\tfor (const [key, isEphemeral] of objectMapEntries(config.ephemeralKeys)) {\n\t\t\t\tif (isEphemeral) ephemeralKeySet.add(key as string)\n\t\t\t}\n\t\t}\n\t\tthis.ephemeralKeySet = ephemeralKeySet\n\t}\n\n\t/**\n\t * Creates a new record of this type with the given properties.\n\t *\n\t * Properties are merged with default properties from the RecordType configuration.\n\t * If no id is provided, a unique id will be generated automatically.\n\t *\n\t * @example\n\t * ```ts\n\t * const book = Book.create({\n\t * title: 'The Great Gatsby',\n\t * author: 'F. Scott Fitzgerald'\n\t * })\n\t * // Result: { id: 'book:abc123', typeName: 'book', title: 'The Great Gatsby', author: 'F. Scott Fitzgerald', inStock: true }\n\t * ```\n\t *\n\t * @param properties - The properties for the new record, including both required and optional fields\n\t * @returns The newly created record with generated id and typeName\n\t * @public\n\t */\n\tcreate(\n\t\tproperties: Expand<Pick<R, RequiredProperties> & Omit<Partial<R>, RequiredProperties>>\n\t): R {\n\t\tconst result = {\n\t\t\t...this.createDefaultProperties(),\n\t\t\tid: (properties as Partial<R>).id ?? this.createId(),\n\t\t} as any\n\n\t\tfor (const [k, v] of Object.entries(properties)) {\n\t\t\tif (v !== undefined) {\n\t\t\t\tresult[k] = v\n\t\t\t}\n\t\t}\n\n\t\tresult.typeName = this.typeName\n\n\t\treturn result as R\n\t}\n\n\t/**\n\t * Creates a deep copy of an existing record with a new unique id.\n\t *\n\t * This method performs a deep clone of all properties while generating a fresh id,\n\t * making it useful for duplicating records without id conflicts.\n\t *\n\t * @example\n\t * ```ts\n\t * const originalBook = Book.create({ title: '1984', author: 'George Orwell' })\n\t * const duplicatedBook = Book.clone(originalBook)\n\t * // duplicatedBook has same properties but different id\n\t * ```\n\t *\n\t * @param record - The record to clone\n\t * @returns A new record with the same properties but a different id\n\t * @public\n\t */\n\tclone(record: R): R {\n\t\treturn { ...structuredClone(record), id: this.createId() }\n\t}\n\n\t/**\n\t * Create a new ID for this record type.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * const id = recordType.createId()\n\t * ```\n\t *\n\t * @returns The new ID.\n\t * @public\n\t */\n\tcreateId(customUniquePart?: string): IdOf<R> {\n\t\treturn (this.typeName + ':' + (customUniquePart ?? uniqueId())) as IdOf<R>\n\t}\n\n\t/**\n\t * Extracts the unique identifier part from a full record id.\n\t *\n\t * Record ids have the format `typeName:uniquePart`. This method returns just the unique part.\n\t *\n\t * @example\n\t * ```ts\n\t * const bookId = Book.createId() // 'book:abc123'\n\t * const uniquePart = Book.parseId(bookId) // 'abc123'\n\t * ```\n\t *\n\t * @param id - The full record id to parse\n\t * @returns The unique identifier portion after the colon\n\t * @throws Error if the id is not valid for this record type\n\t * @public\n\t */\n\tparseId(id: IdOf<R>): string {\n\t\tif (!this.isId(id)) {\n\t\t\tthrow new Error(`ID \"${id}\" is not a valid ID for type \"${this.typeName}\"`)\n\t\t}\n\n\t\treturn id.slice(this.typeName.length + 1)\n\t}\n\n\t/**\n\t * Type guard that checks whether a record belongs to this RecordType.\n\t *\n\t * This method performs a runtime check by comparing the record's typeName\n\t * against this RecordType's typeName.\n\t *\n\t * @example\n\t * ```ts\n\t * if (Book.isInstance(someRecord)) {\n\t * // someRecord is now typed as a book record\n\t * console.log(someRecord.title)\n\t * }\n\t * ```\n\t *\n\t * @param record - The record to check, may be undefined\n\t * @returns True if the record is an instance of this record type\n\t * @public\n\t */\n\tisInstance(record?: UnknownRecord): record is R {\n\t\treturn record?.typeName === this.typeName\n\t}\n\n\t/**\n\t * Type guard that checks whether an id string belongs to this RecordType.\n\t *\n\t * Validates that the id starts with this RecordType's typeName followed by a colon.\n\t * This is more efficient than parsing the full id when you only need to verify the type.\n\t *\n\t * @example\n\t * ```ts\n\t * if (Book.isId(someId)) {\n\t * // someId is now typed as IdOf<BookRecord>\n\t * const book = store.get(someId)\n\t * }\n\t * ```\n\t *\n\t * @param id - The id string to check, may be undefined\n\t * @returns True if the id belongs to this record type\n\t * @public\n\t */\n\tisId(id?: string): id is IdOf<R> {\n\t\tif (!id) return false\n\t\tfor (let i = 0; i < this.typeName.length; i++) {\n\t\t\tif (id[i] !== this.typeName[i]) return false\n\t\t}\n\n\t\treturn id[this.typeName.length] === ':'\n\t}\n\n\t/**\n\t * Create a new RecordType that has the same type name as this RecordType and includes the given\n\t * default properties.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * const authorType = createRecordType('author', () => ({ living: true }))\n\t * const deadAuthorType = authorType.withDefaultProperties({ living: false })\n\t * ```\n\t *\n\t * @param createDefaultProperties - A function that returns the default properties of the new RecordType.\n\t * @returns The new RecordType.\n\t */\n\twithDefaultProperties<DefaultProps extends Omit<Partial<R>, 'typeName' | 'id'>>(\n\t\tcreateDefaultProperties: () => DefaultProps\n\t): RecordType<R, Exclude<RequiredProperties, keyof DefaultProps>> {\n\t\treturn new RecordType<R, Exclude<RequiredProperties, keyof DefaultProps>>(this.typeName, {\n\t\t\tcreateDefaultProperties: createDefaultProperties as any,\n\t\t\tvalidator: this.validator,\n\t\t\tscope: this.scope,\n\t\t\tephemeralKeys: this.ephemeralKeys,\n\t\t})\n\t}\n\n\t/**\n\t * Validates a record against this RecordType's validator and returns it with proper typing.\n\t *\n\t * This method runs the configured validator function and throws an error if validation fails.\n\t * If a previous version of the record is provided, it may use optimized validation.\n\t *\n\t * @example\n\t * ```ts\n\t * try {\n\t * const validBook = Book.validate(untrustedData)\n\t * // validBook is now properly typed and validated\n\t * } catch (error) {\n\t * console.log('Validation failed:', error.message)\n\t * }\n\t * ```\n\t *\n\t * @param record - The unknown record data to validate\n\t * @param recordBefore - Optional previous version for optimized validation\n\t * @returns The validated and properly typed record\n\t * @throws Error if validation fails\n\t * @public\n\t */\n\tvalidate(record: unknown, recordBefore?: R): R {\n\t\tif (recordBefore && this.validator.validateUsingKnownGoodVersion) {\n\t\t\treturn this.validator.validateUsingKnownGoodVersion(recordBefore, record)\n\t\t}\n\t\treturn this.validator.validate(record)\n\t}\n}\n\n/**\n * Creates a new RecordType with the specified configuration.\n *\n * This factory function creates a RecordType that can be used to create, validate, and manage\n * records of a specific type within a store. The resulting RecordType can be extended with\n * default properties using the withDefaultProperties method.\n *\n * @example\n * ```ts\n * interface BookRecord extends BaseRecord<'book', RecordId<BookRecord>> {\n * title: string\n * author: string\n * inStock: boolean\n * }\n *\n * const Book = createRecordType<BookRecord>('book', {\n * scope: 'document',\n * validator: bookValidator\n * })\n * ```\n *\n * @param typeName - The unique type name for this record type\n * @param config - Configuration object containing validator, scope, and ephemeral keys\n * @returns A new RecordType instance for creating and managing records\n * @public\n */\nexport function createRecordType<R extends UnknownRecord>(\n\ttypeName: R['typeName'],\n\tconfig: {\n\t\tvalidator?: StoreValidator<R>\n\t\tscope: RecordScope\n\t\tephemeralKeys?: { readonly [K in Exclude<keyof R, 'id' | 'typeName'>]: boolean }\n\t}\n): RecordType<R, keyof Omit<R, 'id' | 'typeName'>> {\n\treturn new RecordType<R, keyof Omit<R, 'id' | 'typeName'>>(typeName, {\n\t\tcreateDefaultProperties: () => ({}) as any,\n\t\tvalidator: config.validator,\n\t\tscope: config.scope,\n\t\tephemeralKeys: config.ephemeralKeys,\n\t})\n}\n\n/**\n * Assert whether an id correspond to a record type.\n *\n * @example\n *\n * ```ts\n * assertIdType(myId, \"shape\")\n * ```\n *\n * @param id - The id to check.\n * @param type - The type of the record.\n * @public\n */\nexport function assertIdType<R extends UnknownRecord>(\n\tid: string | undefined,\n\ttype: RecordType<R, any>\n): asserts id is IdOf<R> {\n\tif (!id || !type.isId(id)) {\n\t\tthrow new Error(`string ${JSON.stringify(id)} is not a valid ${type.typeName} id`)\n\t}\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -19,13 +19,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var RecordsDiff_exports = {};
20
20
  __export(RecordsDiff_exports, {
21
21
  createEmptyRecordsDiff: () => createEmptyRecordsDiff,
22
+ hasAnyKey: () => hasAnyKey,
22
23
  isRecordsDiffEmpty: () => isRecordsDiffEmpty,
23
24
  reverseRecordsDiff: () => reverseRecordsDiff,
24
25
  squashRecordDiffs: () => squashRecordDiffs,
25
26
  squashRecordDiffsMutable: () => squashRecordDiffsMutable
26
27
  });
27
28
  module.exports = __toCommonJS(RecordsDiff_exports);
28
- var import_utils = require("@tldraw/utils");
29
29
  function createEmptyRecordsDiff() {
30
30
  return { added: {}, updated: {}, removed: {} };
31
31
  }
@@ -37,7 +37,11 @@ function reverseRecordsDiff(diff) {
37
37
  return result;
38
38
  }
39
39
  function isRecordsDiffEmpty(diff) {
40
- return Object.keys(diff.added).length === 0 && Object.keys(diff.updated).length === 0 && Object.keys(diff.removed).length === 0;
40
+ return !hasAnyKey(diff.added) && !hasAnyKey(diff.updated) && !hasAnyKey(diff.removed);
41
+ }
42
+ function hasAnyKey(obj) {
43
+ for (const _ in obj) return true;
44
+ return false;
41
45
  }
42
46
  function squashRecordDiffs(diffs, options) {
43
47
  const result = options?.mutateFirstDiff ? diffs[0] : { added: {}, removed: {}, updated: {} };
@@ -46,8 +50,11 @@ function squashRecordDiffs(diffs, options) {
46
50
  }
47
51
  function squashRecordDiffsMutable(target, diffs) {
48
52
  for (const diff of diffs) {
49
- for (const [id, value] of (0, import_utils.objectMapEntries)(diff.added)) {
50
- if (target.removed[id]) {
53
+ const targetHasRemoved = hasAnyKey(target.removed);
54
+ for (const _id in diff.added) {
55
+ const id = _id;
56
+ const value = diff.added[id];
57
+ if (targetHasRemoved && target.removed[id]) {
51
58
  const original = target.removed[id];
52
59
  delete target.removed[id];
53
60
  if (original !== value) {
@@ -57,29 +64,34 @@ function squashRecordDiffsMutable(target, diffs) {
57
64
  target.added[id] = value;
58
65
  }
59
66
  }
60
- for (const [id, [_from, to]] of (0, import_utils.objectMapEntries)(diff.updated)) {
61
- if (target.added[id]) {
67
+ const targetHasAdded = hasAnyKey(target.added);
68
+ for (const _id in diff.updated) {
69
+ const id = _id;
70
+ const to = diff.updated[id][1];
71
+ if (targetHasAdded && target.added[id]) {
62
72
  target.added[id] = to;
63
73
  delete target.updated[id];
64
- delete target.removed[id];
74
+ if (targetHasRemoved) delete target.removed[id];
65
75
  continue;
66
76
  }
67
- if (target.updated[id]) {
68
- target.updated[id] = [target.updated[id][0], to];
69
- delete target.removed[id];
77
+ const existing = target.updated[id];
78
+ if (existing) {
79
+ existing[1] = to;
80
+ if (targetHasRemoved) delete target.removed[id];
70
81
  continue;
71
82
  }
72
- target.updated[id] = diff.updated[id];
73
- delete target.removed[id];
83
+ target.updated[id] = [diff.updated[id][0], to];
84
+ if (targetHasRemoved) delete target.removed[id];
74
85
  }
75
- for (const [id, value] of (0, import_utils.objectMapEntries)(diff.removed)) {
86
+ for (const _id in diff.removed) {
87
+ const id = _id;
76
88
  if (target.added[id]) {
77
89
  delete target.added[id];
78
90
  } else if (target.updated[id]) {
79
91
  target.removed[id] = target.updated[id][0];
80
92
  delete target.updated[id];
81
93
  } else {
82
- target.removed[id] = value;
94
+ target.removed[id] = diff.removed[id];
83
95
  }
84
96
  }
85
97
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/RecordsDiff.ts"],
4
- "sourcesContent": ["import { objectMapEntries } from '@tldraw/utils'\nimport { IdOf, UnknownRecord } from './BaseRecord'\n\n/**\n * A diff describing the changes to records, containing collections of records that were added,\n * updated, or removed. This is the fundamental data structure used throughout the store system\n * to track and communicate changes.\n *\n * @example\n * ```ts\n * const diff: RecordsDiff<Book> = {\n * added: {\n * 'book:1': { id: 'book:1', typeName: 'book', title: 'New Book' }\n * },\n * updated: {\n * 'book:2': [\n * { id: 'book:2', typeName: 'book', title: 'Old Title' }, // from\n * { id: 'book:2', typeName: 'book', title: 'New Title' } // to\n * ]\n * },\n * removed: {\n * 'book:3': { id: 'book:3', typeName: 'book', title: 'Deleted Book' }\n * }\n * }\n * ```\n *\n * @public\n */\nexport interface RecordsDiff<R extends UnknownRecord> {\n\t/** Records that were created, keyed by their ID */\n\tadded: Record<IdOf<R>, R>\n\t/** Records that were modified, keyed by their ID. Each entry contains [from, to] tuple */\n\tupdated: Record<IdOf<R>, [from: R, to: R]>\n\t/** Records that were deleted, keyed by their ID */\n\tremoved: Record<IdOf<R>, R>\n}\n\n/**\n * Creates an empty RecordsDiff with no added, updated, or removed records.\n * This is useful as a starting point when building diffs programmatically.\n *\n * @returns An empty RecordsDiff with all collections initialized to empty objects\n * @example\n * ```ts\n * const emptyDiff = createEmptyRecordsDiff<Book>()\n * // Result: { added: {}, updated: {}, removed: {} }\n * ```\n *\n * @internal\n */\nexport function createEmptyRecordsDiff<R extends UnknownRecord>(): RecordsDiff<R> {\n\treturn { added: {}, updated: {}, removed: {} } as RecordsDiff<R>\n}\n\n/**\n * Creates the inverse of a RecordsDiff, effectively reversing all changes.\n * Added records become removed, removed records become added, and updated records\n * have their from/to values swapped. This is useful for implementing undo operations.\n *\n * @param diff - The diff to reverse\n * @returns A new RecordsDiff that represents the inverse of the input diff\n * @example\n * ```ts\n * const originalDiff: RecordsDiff<Book> = {\n * added: { 'book:1': newBook },\n * updated: { 'book:2': [oldBook, updatedBook] },\n * removed: { 'book:3': deletedBook }\n * }\n *\n * const reversedDiff = reverseRecordsDiff(originalDiff)\n * // Result: {\n * // added: { 'book:3': deletedBook },\n * // updated: { 'book:2': [updatedBook, oldBook] },\n * // removed: { 'book:1': newBook }\n * // }\n * ```\n *\n * @public\n */\nexport function reverseRecordsDiff(diff: RecordsDiff<any>) {\n\tconst result: RecordsDiff<any> = { added: diff.removed, removed: diff.added, updated: {} }\n\tfor (const [from, to] of Object.values(diff.updated)) {\n\t\tresult.updated[from.id] = [to, from]\n\t}\n\treturn result\n}\n\n/**\n * Checks whether a RecordsDiff contains any changes. A diff is considered empty\n * if it has no added, updated, or removed records.\n *\n * @param diff - The diff to check\n * @returns True if the diff contains no changes, false otherwise\n * @example\n * ```ts\n * const emptyDiff = createEmptyRecordsDiff<Book>()\n * console.log(isRecordsDiffEmpty(emptyDiff)) // true\n *\n * const nonEmptyDiff: RecordsDiff<Book> = {\n * added: { 'book:1': someBook },\n * updated: {},\n * removed: {}\n * }\n * console.log(isRecordsDiffEmpty(nonEmptyDiff)) // false\n * ```\n *\n * @public\n */\nexport function isRecordsDiffEmpty<T extends UnknownRecord>(diff: RecordsDiff<T>) {\n\treturn (\n\t\tObject.keys(diff.added).length === 0 &&\n\t\tObject.keys(diff.updated).length === 0 &&\n\t\tObject.keys(diff.removed).length === 0\n\t)\n}\n\n/**\n * Combines multiple RecordsDiff objects into a single consolidated diff.\n * This function intelligently merges changes, handling cases where the same record\n * is modified multiple times across different diffs. For example, if a record is\n * added in one diff and then updated in another, the result will show it as added\n * with the final state.\n *\n * @param diffs - An array of diffs to combine into a single diff\n * @param options - Configuration options for the squashing operation\n * - mutateFirstDiff - If true, modifies the first diff in place instead of creating a new one\n * @returns A single diff that represents the cumulative effect of all input diffs\n * @example\n * ```ts\n * const diff1: RecordsDiff<Book> = {\n * added: { 'book:1': { id: 'book:1', title: 'New Book' } },\n * updated: {},\n * removed: {}\n * }\n *\n * const diff2: RecordsDiff<Book> = {\n * added: {},\n * updated: { 'book:1': [{ id: 'book:1', title: 'New Book' }, { id: 'book:1', title: 'Updated Title' }] },\n * removed: {}\n * }\n *\n * const squashed = squashRecordDiffs([diff1, diff2])\n * // Result: {\n * // added: { 'book:1': { id: 'book:1', title: 'Updated Title' } },\n * // updated: {},\n * // removed: {}\n * // }\n * ```\n *\n * @public\n */\nexport function squashRecordDiffs<T extends UnknownRecord>(\n\tdiffs: RecordsDiff<T>[],\n\toptions?: {\n\t\tmutateFirstDiff?: boolean\n\t}\n): RecordsDiff<T> {\n\tconst result = options?.mutateFirstDiff\n\t\t? diffs[0]\n\t\t: ({ added: {}, removed: {}, updated: {} } as RecordsDiff<T>)\n\n\tsquashRecordDiffsMutable(result, options?.mutateFirstDiff ? diffs.slice(1) : diffs)\n\treturn result\n}\n\n/**\n * Applies an array of diffs to a target diff by mutating the target in-place.\n * This is the core implementation used by squashRecordDiffs. It handles complex\n * scenarios where records move between added/updated/removed states across multiple diffs.\n *\n * The function processes each diff sequentially, applying the following logic:\n * - Added records: If the record was previously removed, convert to an update; otherwise add it\n * - Updated records: Chain updates together, preserving the original 'from' state\n * - Removed records: If the record was added in this sequence, cancel both operations\n *\n * @param target - The diff to modify in-place (will be mutated)\n * @param diffs - Array of diffs to apply to the target\n * @example\n * ```ts\n * const targetDiff: RecordsDiff<Book> = {\n * added: {},\n * updated: {},\n * removed: { 'book:1': oldBook }\n * }\n *\n * const newDiffs = [{\n * added: { 'book:1': newBook },\n * updated: {},\n * removed: {}\n * }]\n *\n * squashRecordDiffsMutable(targetDiff, newDiffs)\n * // targetDiff is now: {\n * // added: {},\n * // updated: { 'book:1': [oldBook, newBook] },\n * // removed: {}\n * // }\n * ```\n *\n * @internal\n */\nexport function squashRecordDiffsMutable<T extends UnknownRecord>(\n\ttarget: RecordsDiff<T>,\n\tdiffs: RecordsDiff<T>[]\n): void {\n\tfor (const diff of diffs) {\n\t\tfor (const [id, value] of objectMapEntries(diff.added)) {\n\t\t\tif (target.removed[id]) {\n\t\t\t\tconst original = target.removed[id]\n\t\t\t\tdelete target.removed[id]\n\t\t\t\tif (original !== value) {\n\t\t\t\t\ttarget.updated[id] = [original, value]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttarget.added[id] = value\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, [_from, to]] of objectMapEntries(diff.updated)) {\n\t\t\tif (target.added[id]) {\n\t\t\t\ttarget.added[id] = to\n\t\t\t\tdelete target.updated[id]\n\t\t\t\tdelete target.removed[id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (target.updated[id]) {\n\t\t\t\ttarget.updated[id] = [target.updated[id][0], to]\n\t\t\t\tdelete target.removed[id]\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\ttarget.updated[id] = diff.updated[id]\n\t\t\tdelete target.removed[id]\n\t\t}\n\n\t\tfor (const [id, value] of objectMapEntries(diff.removed)) {\n\t\t\t// the same record was added in this diff sequence, just drop it\n\t\t\tif (target.added[id]) {\n\t\t\t\tdelete target.added[id]\n\t\t\t} else if (target.updated[id]) {\n\t\t\t\ttarget.removed[id] = target.updated[id][0]\n\t\t\t\tdelete target.updated[id]\n\t\t\t} else {\n\t\t\t\ttarget.removed[id] = value\n\t\t\t}\n\t\t}\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAiC;AAkD1B,SAAS,yBAAkE;AACjF,SAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAC9C;AA2BO,SAAS,mBAAmB,MAAwB;AAC1D,QAAM,SAA2B,EAAE,OAAO,KAAK,SAAS,SAAS,KAAK,OAAO,SAAS,CAAC,EAAE;AACzF,aAAW,CAAC,MAAM,EAAE,KAAK,OAAO,OAAO,KAAK,OAAO,GAAG;AACrD,WAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI;AAAA,EACpC;AACA,SAAO;AACR;AAuBO,SAAS,mBAA4C,MAAsB;AACjF,SACC,OAAO,KAAK,KAAK,KAAK,EAAE,WAAW,KACnC,OAAO,KAAK,KAAK,OAAO,EAAE,WAAW,KACrC,OAAO,KAAK,KAAK,OAAO,EAAE,WAAW;AAEvC;AAqCO,SAAS,kBACf,OACA,SAGiB;AACjB,QAAM,SAAS,SAAS,kBACrB,MAAM,CAAC,IACN,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAE1C,2BAAyB,QAAQ,SAAS,kBAAkB,MAAM,MAAM,CAAC,IAAI,KAAK;AAClF,SAAO;AACR;AAsCO,SAAS,yBACf,QACA,OACO;AACP,aAAW,QAAQ,OAAO;AACzB,eAAW,CAAC,IAAI,KAAK,SAAK,+BAAiB,KAAK,KAAK,GAAG;AACvD,UAAI,OAAO,QAAQ,EAAE,GAAG;AACvB,cAAM,WAAW,OAAO,QAAQ,EAAE;AAClC,eAAO,OAAO,QAAQ,EAAE;AACxB,YAAI,aAAa,OAAO;AACvB,iBAAO,QAAQ,EAAE,IAAI,CAAC,UAAU,KAAK;AAAA,QACtC;AAAA,MACD,OAAO;AACN,eAAO,MAAM,EAAE,IAAI;AAAA,MACpB;AAAA,IACD;AAEA,eAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,SAAK,+BAAiB,KAAK,OAAO,GAAG;AAC/D,UAAI,OAAO,MAAM,EAAE,GAAG;AACrB,eAAO,MAAM,EAAE,IAAI;AACnB,eAAO,OAAO,QAAQ,EAAE;AACxB,eAAO,OAAO,QAAQ,EAAE;AACxB;AAAA,MACD;AACA,UAAI,OAAO,QAAQ,EAAE,GAAG;AACvB,eAAO,QAAQ,EAAE,IAAI,CAAC,OAAO,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE;AAC/C,eAAO,OAAO,QAAQ,EAAE;AACxB;AAAA,MACD;AAEA,aAAO,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE;AACpC,aAAO,OAAO,QAAQ,EAAE;AAAA,IACzB;AAEA,eAAW,CAAC,IAAI,KAAK,SAAK,+BAAiB,KAAK,OAAO,GAAG;AAEzD,UAAI,OAAO,MAAM,EAAE,GAAG;AACrB,eAAO,OAAO,MAAM,EAAE;AAAA,MACvB,WAAW,OAAO,QAAQ,EAAE,GAAG;AAC9B,eAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,EAAE,EAAE,CAAC;AACzC,eAAO,OAAO,QAAQ,EAAE;AAAA,MACzB,OAAO;AACN,eAAO,QAAQ,EAAE,IAAI;AAAA,MACtB;AAAA,IACD;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["import { IdOf, UnknownRecord } from './BaseRecord'\n\n/**\n * A diff describing the changes to records, containing collections of records that were added,\n * updated, or removed. This is the fundamental data structure used throughout the store system\n * to track and communicate changes.\n *\n * @example\n * ```ts\n * const diff: RecordsDiff<Book> = {\n * added: {\n * 'book:1': { id: 'book:1', typeName: 'book', title: 'New Book' }\n * },\n * updated: {\n * 'book:2': [\n * { id: 'book:2', typeName: 'book', title: 'Old Title' }, // from\n * { id: 'book:2', typeName: 'book', title: 'New Title' } // to\n * ]\n * },\n * removed: {\n * 'book:3': { id: 'book:3', typeName: 'book', title: 'Deleted Book' }\n * }\n * }\n * ```\n *\n * @public\n */\nexport interface RecordsDiff<R extends UnknownRecord> {\n\t/** Records that were created, keyed by their ID */\n\tadded: Record<IdOf<R>, R>\n\t/** Records that were modified, keyed by their ID. Each entry contains [from, to] tuple */\n\tupdated: Record<IdOf<R>, [from: R, to: R]>\n\t/** Records that were deleted, keyed by their ID */\n\tremoved: Record<IdOf<R>, R>\n}\n\n/**\n * Creates an empty RecordsDiff with no added, updated, or removed records.\n * This is useful as a starting point when building diffs programmatically.\n *\n * @returns An empty RecordsDiff with all collections initialized to empty objects\n * @example\n * ```ts\n * const emptyDiff = createEmptyRecordsDiff<Book>()\n * // Result: { added: {}, updated: {}, removed: {} }\n * ```\n *\n * @internal\n */\nexport function createEmptyRecordsDiff<R extends UnknownRecord>(): RecordsDiff<R> {\n\treturn { added: {}, updated: {}, removed: {} } as RecordsDiff<R>\n}\n\n/**\n * Creates the inverse of a RecordsDiff, effectively reversing all changes.\n * Added records become removed, removed records become added, and updated records\n * have their from/to values swapped. This is useful for implementing undo operations.\n *\n * @param diff - The diff to reverse\n * @returns A new RecordsDiff that represents the inverse of the input diff\n * @example\n * ```ts\n * const originalDiff: RecordsDiff<Book> = {\n * added: { 'book:1': newBook },\n * updated: { 'book:2': [oldBook, updatedBook] },\n * removed: { 'book:3': deletedBook }\n * }\n *\n * const reversedDiff = reverseRecordsDiff(originalDiff)\n * // Result: {\n * // added: { 'book:3': deletedBook },\n * // updated: { 'book:2': [updatedBook, oldBook] },\n * // removed: { 'book:1': newBook }\n * // }\n * ```\n *\n * @public\n */\nexport function reverseRecordsDiff(diff: RecordsDiff<any>) {\n\tconst result: RecordsDiff<any> = { added: diff.removed, removed: diff.added, updated: {} }\n\tfor (const [from, to] of Object.values(diff.updated)) {\n\t\tresult.updated[from.id] = [to, from]\n\t}\n\treturn result\n}\n\n/**\n * Checks whether a RecordsDiff contains any changes. A diff is considered empty\n * if it has no added, updated, or removed records.\n *\n * @param diff - The diff to check\n * @returns True if the diff contains no changes, false otherwise\n * @example\n * ```ts\n * const emptyDiff = createEmptyRecordsDiff<Book>()\n * console.log(isRecordsDiffEmpty(emptyDiff)) // true\n *\n * const nonEmptyDiff: RecordsDiff<Book> = {\n * added: { 'book:1': someBook },\n * updated: {},\n * removed: {}\n * }\n * console.log(isRecordsDiffEmpty(nonEmptyDiff)) // false\n * ```\n *\n * @public\n */\nexport function isRecordsDiffEmpty<T extends UnknownRecord>(diff: RecordsDiff<T>) {\n\treturn !hasAnyKey(diff.added) && !hasAnyKey(diff.updated) && !hasAnyKey(diff.removed)\n}\n\n// Cheaper than Object.keys().length, but note that for-in still pays an O(N)\n// key-collection prologue on dictionary-mode objects (which diffs become once keys\n// are deleted from them) \u2014 avoid calling this on large diffs in per-frame hot paths.\n/** @internal */\nexport function hasAnyKey(obj: object) {\n\tfor (const _ in obj) return true\n\treturn false\n}\n\n/**\n * Combines multiple RecordsDiff objects into a single consolidated diff.\n * This function intelligently merges changes, handling cases where the same record\n * is modified multiple times across different diffs. For example, if a record is\n * added in one diff and then updated in another, the result will show it as added\n * with the final state.\n *\n * @param diffs - An array of diffs to combine into a single diff\n * @param options - Configuration options for the squashing operation\n * - mutateFirstDiff - If true, modifies the first diff in place instead of creating a new one\n * @returns A single diff that represents the cumulative effect of all input diffs\n * @example\n * ```ts\n * const diff1: RecordsDiff<Book> = {\n * added: { 'book:1': { id: 'book:1', title: 'New Book' } },\n * updated: {},\n * removed: {}\n * }\n *\n * const diff2: RecordsDiff<Book> = {\n * added: {},\n * updated: { 'book:1': [{ id: 'book:1', title: 'New Book' }, { id: 'book:1', title: 'Updated Title' }] },\n * removed: {}\n * }\n *\n * const squashed = squashRecordDiffs([diff1, diff2])\n * // Result: {\n * // added: { 'book:1': { id: 'book:1', title: 'Updated Title' } },\n * // updated: {},\n * // removed: {}\n * // }\n * ```\n *\n * @public\n */\nexport function squashRecordDiffs<T extends UnknownRecord>(\n\tdiffs: RecordsDiff<T>[],\n\toptions?: {\n\t\tmutateFirstDiff?: boolean\n\t}\n): RecordsDiff<T> {\n\tconst result = options?.mutateFirstDiff\n\t\t? diffs[0]\n\t\t: ({ added: {}, removed: {}, updated: {} } as RecordsDiff<T>)\n\n\tsquashRecordDiffsMutable(result, options?.mutateFirstDiff ? diffs.slice(1) : diffs)\n\treturn result\n}\n\n/**\n * Applies an array of diffs to a target diff by mutating the target in-place.\n * This is the core implementation used by squashRecordDiffs. It handles complex\n * scenarios where records move between added/updated/removed states across multiple diffs.\n *\n * The function processes each diff sequentially, applying the following logic:\n * - Added records: If the record was previously removed, convert to an update; otherwise add it\n * - Updated records: Chain updates together, preserving the original 'from' state\n * - Removed records: If the record was added in this sequence, cancel both operations\n *\n * @param target - The diff to modify in-place (will be mutated)\n * @param diffs - Array of diffs to apply to the target\n * @example\n * ```ts\n * const targetDiff: RecordsDiff<Book> = {\n * added: {},\n * updated: {},\n * removed: { 'book:1': oldBook }\n * }\n *\n * const newDiffs = [{\n * added: { 'book:1': newBook },\n * updated: {},\n * removed: {}\n * }]\n *\n * squashRecordDiffsMutable(targetDiff, newDiffs)\n * // targetDiff is now: {\n * // added: {},\n * // updated: { 'book:1': [oldBook, newBook] },\n * // removed: {}\n * // }\n * ```\n *\n * @internal\n */\nexport function squashRecordDiffsMutable<T extends UnknownRecord>(\n\ttarget: RecordsDiff<T>,\n\tdiffs: RecordsDiff<T>[]\n): void {\n\t// This runs on every history interceptor call \u2014 e.g. once per input tick while\n\t// resizing N shapes, with N entries in diff.updated \u2014 so the updated loop must not\n\t// allocate per entry. We use for-in instead of Object.entries, mutate the target's\n\t// existing [from, to] tuples in place, and skip delete calls against collections we\n\t// know are empty. In-place tuple mutation is safe because the target exclusively\n\t// owns its updated tuples: they are always created here (never shared with a source\n\t// diff), and sources are never mutated.\n\tfor (const diff of diffs) {\n\t\t// target.removed can only lose entries before the removed loop below, so a\n\t\t// stale `true` is harmless (extra no-op deletes).\n\t\tconst targetHasRemoved = hasAnyKey(target.removed)\n\n\t\tfor (const _id in diff.added) {\n\t\t\tconst id = _id as IdOf<T>\n\t\t\tconst value = diff.added[id]\n\t\t\tif (targetHasRemoved && target.removed[id]) {\n\t\t\t\tconst original = target.removed[id]\n\t\t\t\tdelete target.removed[id]\n\t\t\t\tif (original !== value) {\n\t\t\t\t\ttarget.updated[id] = [original, value]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttarget.added[id] = value\n\t\t\t}\n\t\t}\n\n\t\t// the added loop above may have inserted into target.added\n\t\tconst targetHasAdded = hasAnyKey(target.added)\n\n\t\tfor (const _id in diff.updated) {\n\t\t\tconst id = _id as IdOf<T>\n\t\t\tconst to = diff.updated[id][1]\n\t\t\tif (targetHasAdded && target.added[id]) {\n\t\t\t\ttarget.added[id] = to\n\t\t\t\tdelete target.updated[id]\n\t\t\t\tif (targetHasRemoved) delete target.removed[id]\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst existing = target.updated[id]\n\t\t\tif (existing) {\n\t\t\t\texisting[1] = to\n\t\t\t\tif (targetHasRemoved) delete target.removed[id]\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// copy the tuple so the target owns it and can mutate it in place later\n\t\t\ttarget.updated[id] = [diff.updated[id][0], to]\n\t\t\tif (targetHasRemoved) delete target.removed[id]\n\t\t}\n\n\t\tfor (const _id in diff.removed) {\n\t\t\tconst id = _id as IdOf<T>\n\t\t\t// the same record was added in this diff sequence, just drop it\n\t\t\tif (target.added[id]) {\n\t\t\t\tdelete target.added[id]\n\t\t\t} else if (target.updated[id]) {\n\t\t\t\ttarget.removed[id] = target.updated[id][0]\n\t\t\t\tdelete target.updated[id]\n\t\t\t} else {\n\t\t\t\ttarget.removed[id] = diff.removed[id]\n\t\t\t}\n\t\t}\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDO,SAAS,yBAAkE;AACjF,SAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAC9C;AA2BO,SAAS,mBAAmB,MAAwB;AAC1D,QAAM,SAA2B,EAAE,OAAO,KAAK,SAAS,SAAS,KAAK,OAAO,SAAS,CAAC,EAAE;AACzF,aAAW,CAAC,MAAM,EAAE,KAAK,OAAO,OAAO,KAAK,OAAO,GAAG;AACrD,WAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI;AAAA,EACpC;AACA,SAAO;AACR;AAuBO,SAAS,mBAA4C,MAAsB;AACjF,SAAO,CAAC,UAAU,KAAK,KAAK,KAAK,CAAC,UAAU,KAAK,OAAO,KAAK,CAAC,UAAU,KAAK,OAAO;AACrF;AAMO,SAAS,UAAU,KAAa;AACtC,aAAW,KAAK,IAAK,QAAO;AAC5B,SAAO;AACR;AAqCO,SAAS,kBACf,OACA,SAGiB;AACjB,QAAM,SAAS,SAAS,kBACrB,MAAM,CAAC,IACN,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,EAAE;AAE1C,2BAAyB,QAAQ,SAAS,kBAAkB,MAAM,MAAM,CAAC,IAAI,KAAK;AAClF,SAAO;AACR;AAsCO,SAAS,yBACf,QACA,OACO;AAQP,aAAW,QAAQ,OAAO;AAGzB,UAAM,mBAAmB,UAAU,OAAO,OAAO;AAEjD,eAAW,OAAO,KAAK,OAAO;AAC7B,YAAM,KAAK;AACX,YAAM,QAAQ,KAAK,MAAM,EAAE;AAC3B,UAAI,oBAAoB,OAAO,QAAQ,EAAE,GAAG;AAC3C,cAAM,WAAW,OAAO,QAAQ,EAAE;AAClC,eAAO,OAAO,QAAQ,EAAE;AACxB,YAAI,aAAa,OAAO;AACvB,iBAAO,QAAQ,EAAE,IAAI,CAAC,UAAU,KAAK;AAAA,QACtC;AAAA,MACD,OAAO;AACN,eAAO,MAAM,EAAE,IAAI;AAAA,MACpB;AAAA,IACD;AAGA,UAAM,iBAAiB,UAAU,OAAO,KAAK;AAE7C,eAAW,OAAO,KAAK,SAAS;AAC/B,YAAM,KAAK;AACX,YAAM,KAAK,KAAK,QAAQ,EAAE,EAAE,CAAC;AAC7B,UAAI,kBAAkB,OAAO,MAAM,EAAE,GAAG;AACvC,eAAO,MAAM,EAAE,IAAI;AACnB,eAAO,OAAO,QAAQ,EAAE;AACxB,YAAI,iBAAkB,QAAO,OAAO,QAAQ,EAAE;AAC9C;AAAA,MACD;AACA,YAAM,WAAW,OAAO,QAAQ,EAAE;AAClC,UAAI,UAAU;AACb,iBAAS,CAAC,IAAI;AACd,YAAI,iBAAkB,QAAO,OAAO,QAAQ,EAAE;AAC9C;AAAA,MACD;AAGA,aAAO,QAAQ,EAAE,IAAI,CAAC,KAAK,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE;AAC7C,UAAI,iBAAkB,QAAO,OAAO,QAAQ,EAAE;AAAA,IAC/C;AAEA,eAAW,OAAO,KAAK,SAAS;AAC/B,YAAM,KAAK;AAEX,UAAI,OAAO,MAAM,EAAE,GAAG;AACrB,eAAO,OAAO,MAAM,EAAE;AAAA,MACvB,WAAW,OAAO,QAAQ,EAAE,GAAG;AAC9B,eAAO,QAAQ,EAAE,IAAI,OAAO,QAAQ,EAAE,EAAE,CAAC;AACzC,eAAO,OAAO,QAAQ,EAAE;AAAA,MACzB,OAAO;AACN,eAAO,QAAQ,EAAE,IAAI,KAAK,QAAQ,EAAE;AAAA,MACrC;AAAA,IACD;AAAA,EACD;AACD;",
6
6
  "names": []
7
7
  }
@@ -228,7 +228,7 @@ class Store {
228
228
  updated: (0, import_utils.filterEntries)(change.updated, (_, r) => this.scopedTypes[scope].has(r[1].typeName)),
229
229
  removed: (0, import_utils.filterEntries)(change.removed, (_, r) => this.scopedTypes[scope].has(r.typeName))
230
230
  };
231
- if (Object.keys(result.added).length === 0 && Object.keys(result.updated).length === 0 && Object.keys(result.removed).length === 0) {
231
+ if (!(0, import_RecordsDiff.hasAnyKey)(result.added) && !(0, import_RecordsDiff.hasAnyKey)(result.updated) && !(0, import_RecordsDiff.hasAnyKey)(result.removed)) {
232
232
  return null;
233
233
  }
234
234
  return result;
@@ -288,7 +288,7 @@ class Store {
288
288
  initialValue
289
289
  );
290
290
  if (validated === initialValue) continue;
291
- record = (0, import_devFreeze.devFreeze)(record);
291
+ record = (0, import_devFreeze.devFreeze)(validated);
292
292
  this.records.set(record.id, record);
293
293
  didChange = true;
294
294
  updates[record.id] = [initialValue, record];
@@ -490,7 +490,7 @@ class Store {
490
490
  this.clear();
491
491
  this.put(Object.values(migrationResult.value));
492
492
  this.ensureStoreIsUsable();
493
- });
493
+ }, false);
494
494
  } finally {
495
495
  this.sideEffects.setIsEnabled(prevSideEffectsEnabled);
496
496
  }
@@ -806,7 +806,7 @@ class Store {
806
806
  }
807
807
  this.pendingAfterEvents = /* @__PURE__ */ new Map();
808
808
  const prevSideEffectsEnabled = this.sideEffects.isEnabled();
809
- this.sideEffects.setIsEnabled(runCallbacks ?? prevSideEffectsEnabled);
809
+ this.sideEffects.setIsEnabled(runCallbacks && prevSideEffectsEnabled);
810
810
  this._isInAtomicOp = true;
811
811
  if (isMergingRemoteChanges) {
812
812
  this.isMergingRemoteChanges = true;
@@ -848,7 +848,8 @@ function squashHistoryEntries(entries) {
848
848
  return (0, import_devFreeze.devFreeze)(
849
849
  chunked.map((chunk2) => ({
850
850
  source: chunk2[0].source,
851
- changes: (0, import_RecordsDiff.squashRecordDiffs)(chunk2.map((e) => e.changes))
851
+ // a single-entry chunk needs no squashing — skip the O(N) copy of its diff
852
+ changes: chunk2.length === 1 ? chunk2[0].changes : (0, import_RecordsDiff.squashRecordDiffs)(chunk2.map((e) => e.changes))
852
853
  }))
853
854
  );
854
855
  }