@tldraw/utils 5.5.0-next.9665a55b2322 → 5.5.0-next.b6a9f7cd7be2

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.
@@ -931,6 +931,7 @@ export declare class LruCache<K, V> {
931
931
  get(key: K): undefined | V;
932
932
  set(key: K, value: V): void;
933
933
  has(key: K): boolean;
934
+ delete(key: K): boolean;
934
935
  get size(): number;
935
936
  }
936
937
 
package/dist-cjs/index.js CHANGED
@@ -174,7 +174,7 @@ var import_version2 = require("./lib/version");
174
174
  var import_warn = require("./lib/warn");
175
175
  (0, import_version.registerTldrawLibraryVersion)(
176
176
  "@tldraw/utils",
177
- "5.5.0-next.9665a55b2322",
177
+ "5.5.0-next.b6a9f7cd7be2",
178
178
  "cjs"
179
179
  );
180
180
  //# sourceMappingURL=index.js.map
@@ -44,6 +44,9 @@ class LruCache {
44
44
  has(key) {
45
45
  return this.map.has(key);
46
46
  }
47
+ delete(key) {
48
+ return this.map.delete(key);
49
+ }
47
50
  // eslint-disable-next-line tldraw/no-setter-getter
48
51
  get size() {
49
52
  return this.map.size;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/LruCache.ts"],
4
- "sourcesContent": ["/** Simple LRU cache backed by a Map's insertion-order iteration. @public */\nexport class LruCache<K, V> {\n\tprivate map = new Map<K, V>()\n\tconstructor(private maxSize: number) {}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.map.has(key)) return undefined\n\t\tconst value = this.map.get(key)!\n\t\t// Move to most-recent position\n\t\tthis.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\treturn value\n\t}\n\n\tset(key: K, value: V): void {\n\t\tif (this.map.has(key)) this.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\tif (this.map.size > this.maxSize) {\n\t\t\t// Evict oldest entry\n\t\t\tthis.map.delete(this.map.keys().next().value!)\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.map.has(key)\n\t}\n\n\t// eslint-disable-next-line tldraw/no-setter-getter\n\tget size(): number {\n\t\treturn this.map.size\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,MAAM,SAAe;AAAA,EAE3B,YAAoB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EADZ,MAAM,oBAAI,IAAU;AAAA,EAG5B,IAAI,KAAuB;AAC1B,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG,EAAG,QAAO;AAC/B,UAAM,QAAQ,KAAK,IAAI,IAAI,GAAG;AAE9B,SAAK,IAAI,OAAO,GAAG;AACnB,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC3B,QAAI,KAAK,IAAI,IAAI,GAAG,EAAG,MAAK,IAAI,OAAO,GAAG;AAC1C,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,QAAI,KAAK,IAAI,OAAO,KAAK,SAAS;AAEjC,WAAK,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,KAAM;AAAA,IAC9C;AAAA,EACD;AAAA,EAEA,IAAI,KAAiB;AACpB,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACxB;AAAA;AAAA,EAGA,IAAI,OAAe;AAClB,WAAO,KAAK,IAAI;AAAA,EACjB;AACD;",
4
+ "sourcesContent": ["/** Simple LRU cache backed by a Map's insertion-order iteration. @public */\nexport class LruCache<K, V> {\n\tprivate map = new Map<K, V>()\n\tconstructor(private maxSize: number) {}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.map.has(key)) return undefined\n\t\tconst value = this.map.get(key)!\n\t\t// Move to most-recent position\n\t\tthis.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\treturn value\n\t}\n\n\tset(key: K, value: V): void {\n\t\tif (this.map.has(key)) this.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\tif (this.map.size > this.maxSize) {\n\t\t\t// Evict oldest entry\n\t\t\tthis.map.delete(this.map.keys().next().value!)\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.map.has(key)\n\t}\n\n\tdelete(key: K): boolean {\n\t\treturn this.map.delete(key)\n\t}\n\n\t// eslint-disable-next-line tldraw/no-setter-getter\n\tget size(): number {\n\t\treturn this.map.size\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,MAAM,SAAe;AAAA,EAE3B,YAAoB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EADZ,MAAM,oBAAI,IAAU;AAAA,EAG5B,IAAI,KAAuB;AAC1B,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG,EAAG,QAAO;AAC/B,UAAM,QAAQ,KAAK,IAAI,IAAI,GAAG;AAE9B,SAAK,IAAI,OAAO,GAAG;AACnB,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC3B,QAAI,KAAK,IAAI,IAAI,GAAG,EAAG,MAAK,IAAI,OAAO,GAAG;AAC1C,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,QAAI,KAAK,IAAI,OAAO,KAAK,SAAS;AAEjC,WAAK,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,KAAM;AAAA,IAC9C;AAAA,EACD;AAAA,EAEA,IAAI,KAAiB;AACpB,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACxB;AAAA,EAEA,OAAO,KAAiB;AACvB,WAAO,KAAK,IAAI,OAAO,GAAG;AAAA,EAC3B;AAAA;AAAA,EAGA,IAAI,OAAe;AAClB,WAAO,KAAK,IAAI;AAAA,EACjB;AACD;",
6
6
  "names": []
7
7
  }
@@ -931,6 +931,7 @@ export declare class LruCache<K, V> {
931
931
  get(key: K): undefined | V;
932
932
  set(key: K, value: V): void;
933
933
  has(key: K): boolean;
934
+ delete(key: K): boolean;
934
935
  get size(): number;
935
936
  }
936
937
 
@@ -103,7 +103,7 @@ import { registerTldrawLibraryVersion as registerTldrawLibraryVersion2 } from ".
103
103
  import { warnDeprecatedGetter, warnOnce } from "./lib/warn.mjs";
104
104
  registerTldrawLibraryVersion(
105
105
  "@tldraw/utils",
106
- "5.5.0-next.9665a55b2322",
106
+ "5.5.0-next.b6a9f7cd7be2",
107
107
  "esm"
108
108
  );
109
109
  export {
@@ -21,6 +21,9 @@ class LruCache {
21
21
  has(key) {
22
22
  return this.map.has(key);
23
23
  }
24
+ delete(key) {
25
+ return this.map.delete(key);
26
+ }
24
27
  // eslint-disable-next-line tldraw/no-setter-getter
25
28
  get size() {
26
29
  return this.map.size;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/lib/LruCache.ts"],
4
- "sourcesContent": ["/** Simple LRU cache backed by a Map's insertion-order iteration. @public */\nexport class LruCache<K, V> {\n\tprivate map = new Map<K, V>()\n\tconstructor(private maxSize: number) {}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.map.has(key)) return undefined\n\t\tconst value = this.map.get(key)!\n\t\t// Move to most-recent position\n\t\tthis.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\treturn value\n\t}\n\n\tset(key: K, value: V): void {\n\t\tif (this.map.has(key)) this.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\tif (this.map.size > this.maxSize) {\n\t\t\t// Evict oldest entry\n\t\t\tthis.map.delete(this.map.keys().next().value!)\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.map.has(key)\n\t}\n\n\t// eslint-disable-next-line tldraw/no-setter-getter\n\tget size(): number {\n\t\treturn this.map.size\n\t}\n}\n"],
5
- "mappings": "AACO,MAAM,SAAe;AAAA,EAE3B,YAAoB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EADZ,MAAM,oBAAI,IAAU;AAAA,EAG5B,IAAI,KAAuB;AAC1B,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG,EAAG,QAAO;AAC/B,UAAM,QAAQ,KAAK,IAAI,IAAI,GAAG;AAE9B,SAAK,IAAI,OAAO,GAAG;AACnB,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC3B,QAAI,KAAK,IAAI,IAAI,GAAG,EAAG,MAAK,IAAI,OAAO,GAAG;AAC1C,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,QAAI,KAAK,IAAI,OAAO,KAAK,SAAS;AAEjC,WAAK,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,KAAM;AAAA,IAC9C;AAAA,EACD;AAAA,EAEA,IAAI,KAAiB;AACpB,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACxB;AAAA;AAAA,EAGA,IAAI,OAAe;AAClB,WAAO,KAAK,IAAI;AAAA,EACjB;AACD;",
4
+ "sourcesContent": ["/** Simple LRU cache backed by a Map's insertion-order iteration. @public */\nexport class LruCache<K, V> {\n\tprivate map = new Map<K, V>()\n\tconstructor(private maxSize: number) {}\n\n\tget(key: K): V | undefined {\n\t\tif (!this.map.has(key)) return undefined\n\t\tconst value = this.map.get(key)!\n\t\t// Move to most-recent position\n\t\tthis.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\treturn value\n\t}\n\n\tset(key: K, value: V): void {\n\t\tif (this.map.has(key)) this.map.delete(key)\n\t\tthis.map.set(key, value)\n\t\tif (this.map.size > this.maxSize) {\n\t\t\t// Evict oldest entry\n\t\t\tthis.map.delete(this.map.keys().next().value!)\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this.map.has(key)\n\t}\n\n\tdelete(key: K): boolean {\n\t\treturn this.map.delete(key)\n\t}\n\n\t// eslint-disable-next-line tldraw/no-setter-getter\n\tget size(): number {\n\t\treturn this.map.size\n\t}\n}\n"],
5
+ "mappings": "AACO,MAAM,SAAe;AAAA,EAE3B,YAAoB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAAlB;AAAA,EADZ,MAAM,oBAAI,IAAU;AAAA,EAG5B,IAAI,KAAuB;AAC1B,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG,EAAG,QAAO;AAC/B,UAAM,QAAQ,KAAK,IAAI,IAAI,GAAG;AAE9B,SAAK,IAAI,OAAO,GAAG;AACnB,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC3B,QAAI,KAAK,IAAI,IAAI,GAAG,EAAG,MAAK,IAAI,OAAO,GAAG;AAC1C,SAAK,IAAI,IAAI,KAAK,KAAK;AACvB,QAAI,KAAK,IAAI,OAAO,KAAK,SAAS;AAEjC,WAAK,IAAI,OAAO,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE,KAAM;AAAA,IAC9C;AAAA,EACD;AAAA,EAEA,IAAI,KAAiB;AACpB,WAAO,KAAK,IAAI,IAAI,GAAG;AAAA,EACxB;AAAA,EAEA,OAAO,KAAiB;AACvB,WAAO,KAAK,IAAI,OAAO,GAAG;AAAA,EAC3B;AAAA;AAAA,EAGA,IAAI,OAAe;AAClB,WAAO,KAAK,IAAI;AAAA,EACjB;AACD;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@tldraw/utils",
3
3
  "description": "tldraw infinite canvas SDK (private utilities).",
4
- "version": "5.5.0-next.9665a55b2322",
4
+ "version": "5.5.0-next.b6a9f7cd7be2",
5
5
  "author": {
6
6
  "name": "tldraw Inc.",
7
7
  "email": "hello@tldraw.com"
8
8
  },
9
9
  "homepage": "https://tldraw.dev",
10
- "license": "SEE LICENSE IN LICENSE.md",
10
+ "license": "MIT",
11
11
  "tldraw_product": {
12
12
  "stableId": "tldraw:sdk-core",
13
13
  "name": "SDK",
@@ -61,7 +61,7 @@
61
61
  "@types/lodash.throttle": "^4.1.9",
62
62
  "@types/lodash.uniq": "^4.5.9",
63
63
  "lazyrepo": "0.0.0-alpha.27",
64
- "vitest": "^4.1.7"
64
+ "vitest": "^5.0.0"
65
65
  },
66
66
  "engines": {
67
67
  "node": ">=22.12.0"
@@ -19,6 +19,18 @@ describe('LruCache', () => {
19
19
  expect(cache.size).toBe(2)
20
20
  })
21
21
 
22
+ it('delete() removes an entry and frees its slot', () => {
23
+ const cache = new LruCache<string, number>(2)
24
+ cache.set('a', 1)
25
+ cache.set('b', 2)
26
+ expect(cache.delete('a')).toBe(true)
27
+ expect(cache.delete('a')).toBe(false)
28
+ expect(cache.has('a')).toBe(false)
29
+ cache.set('c', 3)
30
+ expect(cache.get('b')).toBe(2)
31
+ expect(cache.size).toBe(2)
32
+ })
33
+
22
34
  it('has() checks existence without promoting', () => {
23
35
  const cache = new LruCache<string, number>(2)
24
36
  cache.set('a', 1)
@@ -25,6 +25,10 @@ export class LruCache<K, V> {
25
25
  return this.map.has(key)
26
26
  }
27
27
 
28
+ delete(key: K): boolean {
29
+ return this.map.delete(key)
30
+ }
31
+
28
32
  // eslint-disable-next-line tldraw/no-setter-getter
29
33
  get size(): number {
30
34
  return this.map.size
@@ -13,35 +13,26 @@ import {
13
13
  } from './storage'
14
14
 
15
15
  describe('storage', () => {
16
- // Store original implementations
17
- const originalLocalStorage = global.localStorage
18
- const originalSessionStorage = global.sessionStorage
19
-
20
- beforeEach(() => {
21
- // Mock localStorage
22
- const localStorageMock = {
16
+ // Stub the Window accessors rather than assigning to `global.localStorage`: jsdom defines
17
+ // these as getters that assignment can't overwrite, and each read returns a fresh wrapper,
18
+ // so a spy on one instance wouldn't be seen by the next read.
19
+ function stubStorage(name: 'localStorage' | 'sessionStorage') {
20
+ const mock = {
23
21
  getItem: vi.fn(),
24
22
  setItem: vi.fn(),
25
23
  removeItem: vi.fn(),
26
24
  clear: vi.fn(),
27
25
  }
28
- global.localStorage = localStorageMock as any
26
+ vi.spyOn(window, name, 'get').mockReturnValue(mock as any)
27
+ }
29
28
 
30
- // Mock sessionStorage
31
- const sessionStorageMock = {
32
- getItem: vi.fn(),
33
- setItem: vi.fn(),
34
- removeItem: vi.fn(),
35
- clear: vi.fn(),
36
- }
37
- global.sessionStorage = sessionStorageMock as any
29
+ beforeEach(() => {
30
+ stubStorage('localStorage')
31
+ stubStorage('sessionStorage')
38
32
  })
39
33
 
40
34
  afterEach(() => {
41
- // Restore original implementations
42
- global.localStorage = originalLocalStorage
43
- global.sessionStorage = originalSessionStorage
44
- vi.clearAllMocks()
35
+ vi.restoreAllMocks()
45
36
  })
46
37
 
47
38
  describe('getFromLocalStorage', () => {