@pstdio/workbench 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +66 -72
  2. package/dist/composition-resolver-types-CWykPyEK.js +241 -0
  3. package/dist/composition-resolver-types-CWykPyEK.js.map +1 -0
  4. package/dist/extensions.d.ts +344 -28
  5. package/dist/extensions.js +1362 -883
  6. package/dist/extensions.js.map +1 -1
  7. package/dist/file-renderer-view-zpunbE4I.js +432 -0
  8. package/dist/file-renderer-view-zpunbE4I.js.map +1 -0
  9. package/dist/file-section-navigation-CfYqVObc.js +30 -0
  10. package/dist/file-section-navigation-CfYqVObc.js.map +1 -0
  11. package/dist/index.d.ts +268 -15
  12. package/dist/index.js +2334 -2082
  13. package/dist/index.js.map +1 -1
  14. package/dist/layout-types-DMoZz38-.js.map +1 -1
  15. package/dist/react.d.ts +141 -13
  16. package/dist/react.js +1969 -1994
  17. package/dist/react.js.map +1 -1
  18. package/dist/storage.js +132 -155
  19. package/dist/storage.js.map +1 -1
  20. package/dist/testing.d.ts +141 -13
  21. package/dist/webview-runtime.js +1 -1
  22. package/dist/webview-runtime.js.map +1 -1
  23. package/dist/workbench-built-ins-BtgeB274.js +1171 -0
  24. package/dist/workbench-built-ins-BtgeB274.js.map +1 -0
  25. package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
  26. package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
  27. package/package.json +3 -3
  28. package/dist/context-key-service-B2K9LAec.js +0 -1034
  29. package/dist/context-key-service-B2K9LAec.js.map +0 -1
  30. package/dist/file-renderer-view-DrrhYnb_.js +0 -171
  31. package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
  32. package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
  33. package/dist/workbench-menu-paths-B_QJzcNU.js.map +0 -1
package/dist/storage.js CHANGED
@@ -1,5 +1,4 @@
1
- import { b as j } from "./layout-types-DMoZz38-.js";
2
- const c = (e, t, o) => `${e}:${t}:${o ?? "global"}`, B = () => {
1
+ const i = (e, t, n) => `${e}:${t}:${n ?? "global"}`, h = () => {
3
2
  const e = /* @__PURE__ */ new Map();
4
3
  return {
5
4
  get length() {
@@ -7,206 +6,184 @@ const c = (e, t, o) => `${e}:${t}:${o ?? "global"}`, B = () => {
7
6
  },
8
7
  getItem: (t) => e.get(t) ?? null,
9
8
  key: (t) => [...e.keys()][t] ?? null,
10
- setItem: (t, o) => {
11
- e.set(t, o);
9
+ setItem: (t, n) => {
10
+ e.set(t, n);
12
11
  },
13
12
  removeItem: (t) => {
14
13
  e.delete(t);
15
14
  }
16
15
  };
17
- }, p = (e) => e || (typeof localStorage < "u" ? localStorage : B()), m = (e, t) => {
18
- const o = e.getItem(t);
19
- if (o)
16
+ }, d = (e) => e || (typeof localStorage < "u" ? localStorage : h()), y = (e, t) => {
17
+ const n = e.getItem(t);
18
+ if (n)
20
19
  try {
21
- return JSON.parse(o);
20
+ return JSON.parse(n);
22
21
  } catch {
23
22
  return;
24
23
  }
25
- }, v = 2, k = 1, W = 50, C = (e) => {
26
- const t = p(e.storage), o = /* @__PURE__ */ new Map(), i = e.debounceMs ?? 250, d = e.eventTarget ?? (typeof window < "u" ? {
24
+ };
25
+ const T = (e) => {
26
+ const t = d(e.storage), n = /* @__PURE__ */ new Map(), c = e.debounceMs ?? 250, g = e.eventTarget ?? (typeof window < "u" ? {
27
27
  addEventListener: (s, r) => window.addEventListener(s, r),
28
28
  removeEventListener: (s, r) => window.removeEventListener(s, r)
29
29
  } : void 0);
30
- let y;
31
- const L = c(e.namespace, "layout-generation", void 0), f = () => {
32
- const s = m(t, L);
30
+ let l;
31
+ const v = i(e.namespace, "layout-generation", void 0), S = () => {
32
+ const s = y(t, v);
33
33
  return typeof s == "object" && s !== null && "version" in s && s.version === 1 && "generation" in s && typeof s.generation == "number" ? s.generation : 0;
34
- }, P = () => {
35
- const s = f() + 1, r = {
34
+ }, O = () => {
35
+ const s = S() + 1, r = {
36
36
  version: 1,
37
37
  generation: s
38
38
  };
39
- return t.setItem(L, JSON.stringify(r)), s;
40
- }, J = (s) => s?.match(/^project\/([^/]+)\/mode\/[^/]+\/resource\//)?.[1], O = (s) => s?.match(/^project\/([^/]+)/)?.[1], M = (s) => {
39
+ return t.setItem(v, JSON.stringify(r)), s;
40
+ }, N = (s) => s?.match(/^project\/([^/]+)\/mode\/[^/]+\/resource\//)?.[1], I = (s) => s?.match(/^project\/([^/]+)/)?.[1], L = (s) => {
41
41
  if (!t.key) return [];
42
- const r = `${e.namespace}:layout:`, n = [];
42
+ const r = `${e.namespace}:layout:`, o = [];
43
43
  for (let a = 0; a < (t.length ?? 0); a += 1) {
44
- const l = t.key(a);
45
- if (!l?.startsWith(r)) continue;
46
- const g = l.slice(r.length);
47
- O(g) === s && n.push(g);
44
+ const m = t.key(a);
45
+ if (!m?.startsWith(r)) continue;
46
+ const u = m.slice(r.length);
47
+ I(u) === s && o.push(u);
48
48
  }
49
- return n;
50
- }, S = (s, r) => {
51
- const n = m(t, c(e.namespace, s, r));
52
- return typeof n == "object" && n !== null && "version" in n && n.version === k && "scopes" in n && Array.isArray(n.scopes) ? n.scopes.filter((a) => typeof a == "string" && t.getItem(c(e.namespace, "layout", a)) !== null) : [];
53
- }, N = (s, r, n) => {
49
+ return o;
50
+ }, f = (s, r) => {
51
+ const o = y(t, i(e.namespace, s, r));
52
+ return typeof o == "object" && o !== null && "version" in o && o.version === 1 && "scopes" in o && Array.isArray(o.scopes) ? o.scopes.filter((a) => typeof a == "string" && t.getItem(i(e.namespace, "layout", a)) !== null) : [];
53
+ }, E = (s, r, o) => {
54
54
  const a = {
55
- version: k,
56
- scopes: n
55
+ version: 1,
56
+ scopes: o
57
57
  };
58
- t.setItem(c(e.namespace, s, r), JSON.stringify(a));
59
- }, T = (s) => {
60
- const r = O(s);
58
+ t.setItem(i(e.namespace, s, r), JSON.stringify(a));
59
+ }, R = (s) => {
60
+ const r = I(s);
61
61
  if (!r || !s) return;
62
- const n = S("layout-scope-index", r).filter((a) => a !== s);
63
- n.push(s), N("layout-scope-index", r, n);
64
- }, K = (s) => {
65
- const r = J(s);
62
+ const o = f("layout-scope-index", r).filter((a) => a !== s);
63
+ o.push(s), E("layout-scope-index", r, o);
64
+ }, _ = (s) => {
65
+ const r = N(s);
66
66
  if (!r || !s) return;
67
- const n = S("layout-resource-index", r).filter((a) => a !== s);
68
- n.push(s);
69
- for (const a of n.splice(0, Math.max(0, n.length - W)))
70
- t.removeItem?.(c(e.namespace, "layout", a)), t.removeItem?.(c(e.namespace, "panels", a));
71
- N("layout-resource-index", r, n);
72
- }, u = () => {
73
- y && clearTimeout(y), y = void 0;
74
- const s = [...o.values()];
75
- o.clear();
76
- const r = f();
77
- for (const n of s)
78
- n.generation === r && (t.setItem(c(e.namespace, "layout", n.scope), n.raw), T(n.scope), K(n.scope), n.legacyPanelsKey && t.removeItem?.(n.legacyPanelsKey));
79
- }, R = () => {
80
- y && clearTimeout(y), y = setTimeout(u, i);
67
+ const o = f("layout-resource-index", r).filter((a) => a !== s);
68
+ o.push(s);
69
+ for (const a of o.splice(0, Math.max(0, o.length - 50)))
70
+ t.removeItem?.(i(e.namespace, "layout", a)), t.removeItem?.(i(e.namespace, "panels", a));
71
+ E("layout-resource-index", r, o);
72
+ }, p = () => {
73
+ l && clearTimeout(l), l = void 0;
74
+ const s = [...n.values()];
75
+ n.clear();
76
+ const r = S();
77
+ for (const o of s)
78
+ o.generation === r && (t.setItem(i(e.namespace, "layout", o.scope), o.raw), R(o.scope), _(o.scope), o.legacyPanelsKey && t.removeItem?.(o.legacyPanelsKey));
79
+ }, P = () => {
80
+ l && clearTimeout(l), l = setTimeout(p, c);
81
81
  };
82
- return d?.addEventListener("pagehide", u), {
82
+ return g?.addEventListener("pagehide", p), {
83
83
  getLayout: (s) => {
84
- const r = c(e.namespace, "layout", s), n = o.get(r), a = n && n.generation === f() ? JSON.parse(n.raw) : m(t, r);
85
- if (a?.version === v) return a.layout;
86
- if (a?.version !== 1) return;
87
- const l = c(e.namespace, "panels", s), g = m(t, l), x = typeof g == "object" && g !== null && "openByRegionId" in g && typeof g.openByRegionId == "object" && g.openByRegionId !== null ? g.openByRegionId : {}, I = {
88
- ...a.layout.regions
89
- };
90
- for (const h of j) {
91
- const w = x[h];
92
- typeof w == "boolean" && I[h] && (I[h] = {
93
- ...I[h],
94
- visible: w
95
- });
96
- }
97
- const b = {
98
- ...a.layout,
99
- regions: I
100
- }, _ = {
101
- version: v,
102
- layout: b
103
- };
104
- return o.set(r, {
105
- generation: f(),
106
- legacyPanelsKey: t.getItem(l) === null ? void 0 : l,
107
- raw: JSON.stringify(_),
108
- scope: s
109
- }), R(), b;
84
+ const r = i(e.namespace, "layout", s), o = n.get(r), a = o && o.generation === S() ? JSON.parse(o.raw) : y(t, r);
85
+ if (a?.version === 3) return a.layout;
110
86
  },
111
87
  setLayout: (s, r) => {
112
- const n = {
113
- version: v,
88
+ const o = {
89
+ version: 3,
114
90
  layout: s
115
- }, a = c(e.namespace, "layout", r), l = c(e.namespace, "panels", r);
116
- o.delete(a), o.set(a, {
117
- generation: f(),
118
- legacyPanelsKey: t.getItem(l) === null ? void 0 : l,
119
- raw: JSON.stringify(n),
91
+ }, a = i(e.namespace, "layout", r), m = i(e.namespace, "panels", r);
92
+ n.delete(a), n.set(a, {
93
+ generation: S(),
94
+ legacyPanelsKey: t.getItem(m) === null ? void 0 : m,
95
+ raw: JSON.stringify(o),
120
96
  scope: r
121
- }), R();
97
+ }), P();
122
98
  },
123
- flush: u,
99
+ flush: p,
124
100
  listScopes(s) {
125
- return [.../* @__PURE__ */ new Set([...S("layout-scope-index", s), ...S("layout-resource-index", s), ...M(s)])];
101
+ return [.../* @__PURE__ */ new Set([...f("layout-scope-index", s), ...f("layout-resource-index", s), ...L(s)])];
126
102
  },
127
103
  transformLayouts(s, r) {
128
- u(), P();
129
- for (const n of this.listScopes?.(s) ?? []) {
130
- const a = c(e.namespace, "layout", n), l = m(t, a);
131
- if (l?.version !== v) continue;
132
- const g = r(l.layout, n);
133
- if (!g) {
104
+ p(), O();
105
+ for (const o of this.listScopes?.(s) ?? []) {
106
+ const a = i(e.namespace, "layout", o), m = y(t, a);
107
+ if (m?.version !== 3) continue;
108
+ const u = r(m.layout, o);
109
+ if (!u) {
134
110
  t.removeItem?.(a);
135
111
  continue;
136
112
  }
137
113
  t.setItem(a, JSON.stringify({
138
- version: v,
139
- layout: g
114
+ version: 3,
115
+ layout: u
140
116
  }));
141
117
  }
142
118
  },
143
- getCompatibilityMarker: (s) => m(t, c(e.namespace, "layout-compatibility", s)),
119
+ getCompatibilityMarker: (s) => y(t, i(e.namespace, "layout-compatibility", s)),
144
120
  setCompatibilityMarker: (s, r) => {
145
- P(), t.setItem(c(e.namespace, "layout-compatibility", s), JSON.stringify(r));
121
+ O(), t.setItem(i(e.namespace, "layout-compatibility", s), JSON.stringify(r));
146
122
  },
147
- advanceWriteGeneration: P,
123
+ advanceWriteGeneration: O,
148
124
  dispose() {
149
- u(), d?.removeEventListener("pagehide", u);
125
+ p(), g?.removeEventListener("pagehide", p);
150
126
  }
151
127
  };
152
- }, H = (e) => {
153
- const t = p(e.storage);
128
+ }, K = (e) => {
129
+ const t = d(e.storage);
154
130
  return {
155
- getHistory: (o) => m(t, c(e.namespace, "history", o)),
156
- setHistory: (o, i) => {
157
- t.setItem(c(e.namespace, "history", i), JSON.stringify(o));
131
+ getHistory: (n) => y(t, i(e.namespace, "history", n)),
132
+ setHistory: (n, c) => {
133
+ t.setItem(i(e.namespace, "history", c), JSON.stringify(n));
158
134
  }
159
135
  };
160
- }, A = (e) => {
161
- const t = p(e.storage);
136
+ }, k = (e) => {
137
+ const t = d(e.storage);
162
138
  return {
163
- getPanelStates: (o) => m(t, c(e.namespace, "panels", o ?? e.scope)),
164
- setPanelStates: (o, i) => {
165
- const d = c(e.namespace, "panels", i ?? e.scope);
166
- t.setItem(d, JSON.stringify(o));
139
+ getPanelStates: (n) => y(t, i(e.namespace, "panels", n ?? e.scope)),
140
+ setPanelStates: (n, c) => {
141
+ const g = i(e.namespace, "panels", c ?? e.scope);
142
+ t.setItem(g, JSON.stringify(n));
167
143
  }
168
144
  };
169
- }, U = (e) => {
170
- const t = p(e.storage), o = c(e.namespace, "tree", e.scope);
145
+ }, w = (e) => {
146
+ const t = d(e.storage), n = i(e.namespace, "tree", e.scope);
171
147
  return {
172
- getTreeStates: () => m(t, o),
173
- setTreeStates: (i) => {
174
- t.setItem(o, JSON.stringify(i));
148
+ getTreeStates: () => y(t, n),
149
+ setTreeStates: (c) => {
150
+ t.setItem(n, JSON.stringify(c));
175
151
  }
176
152
  };
177
- }, $ = (e) => !!e && typeof e.kind == "string" && typeof e.uri == "string", G = (e) => {
178
- const t = p(e.storage), o = c(e.namespace, "last-resource", e.scope);
153
+ }, C = (e) => !!e && typeof e.kind == "string" && typeof e.uri == "string", W = (e) => {
154
+ const t = d(e.storage), n = i(e.namespace, "last-resource", e.scope);
179
155
  return {
180
156
  getLastResource: () => {
181
- const i = m(t, o);
182
- return $(i) ? i : void 0;
157
+ const c = y(t, n);
158
+ return C(c) ? c : void 0;
183
159
  },
184
- setLastResource: (i) => {
185
- if (!i) {
186
- t.removeItem?.(o);
160
+ setLastResource: (c) => {
161
+ if (!c) {
162
+ t.removeItem?.(n);
187
163
  return;
188
164
  }
189
- t.setItem(o, JSON.stringify(i));
165
+ t.setItem(n, JSON.stringify(c));
190
166
  }
191
167
  };
192
- }, E = 1, V = ["attached", "closed", "floating"], Y = (e) => {
193
- const t = p(e.storage), o = c(e.namespace, "side-panel", e.scope);
168
+ };
169
+ const H = ["attached", "closed", "floating"], b = (e) => {
170
+ const t = d(e.storage), n = i(e.namespace, "side-panel", e.scope);
194
171
  return {
195
172
  getMode: () => {
196
- const i = m(t, o);
197
- if (i?.version === E)
198
- return V.includes(i.mode) ? i.mode : void 0;
173
+ const c = y(t, n);
174
+ if (c?.version === 1)
175
+ return H.includes(c.mode) ? c.mode : void 0;
199
176
  },
200
- setMode: (i) => {
201
- const d = {
202
- version: E,
203
- mode: i
177
+ setMode: (c) => {
178
+ const g = {
179
+ version: 1,
180
+ mode: c
204
181
  };
205
- t.setItem(o, JSON.stringify(d));
182
+ t.setItem(n, JSON.stringify(g));
206
183
  }
207
184
  };
208
- }, z = (e) => {
209
- const t = p(e.storage), o = C({
185
+ }, A = (e) => {
186
+ const t = d(e.storage), n = T({
210
187
  debounceMs: e.debounceMs,
211
188
  eventTarget: e.eventTarget,
212
189
  namespace: e.namespace,
@@ -214,37 +191,37 @@ const c = (e, t, o) => `${e}:${t}:${o ?? "global"}`, B = () => {
214
191
  });
215
192
  return {
216
193
  snapshotPersistence: {
217
- getSnapshot: (d) => {
218
- const y = o.getLayout(d);
219
- return y ? {
220
- layout: y
194
+ getSnapshot: (g) => {
195
+ const l = n.getLayout(g);
196
+ return l ? {
197
+ layout: l
221
198
  } : void 0;
222
199
  },
223
- setSnapshot: (d, y) => o.setLayout(d.layout, y),
224
- flush: o.flush,
225
- dispose: o.dispose
200
+ setSnapshot: (g, l) => n.setLayout(g.layout, l),
201
+ flush: n.flush,
202
+ dispose: n.dispose
226
203
  },
227
- historyPersistence: H({
204
+ historyPersistence: K({
228
205
  namespace: e.namespace,
229
206
  storage: t
230
207
  }),
231
- layoutPersistence: o,
232
- panelsPersistence: A({
208
+ layoutPersistence: n,
209
+ panelsPersistence: k({
233
210
  namespace: e.namespace,
234
211
  scope: e.scope ?? "global",
235
212
  storage: t
236
213
  }),
237
- treePersistence: U({
214
+ treePersistence: w({
238
215
  namespace: e.namespace,
239
216
  scope: e.scope,
240
217
  storage: t
241
218
  }),
242
- lastResourcePersistence: G({
219
+ lastResourcePersistence: W({
243
220
  namespace: e.namespace,
244
221
  scope: e.scope,
245
222
  storage: t
246
223
  }),
247
- sidePanelPersistence: Y({
224
+ sidePanelPersistence: b({
248
225
  namespace: e.namespace,
249
226
  scope: e.scope,
250
227
  storage: t
@@ -252,12 +229,12 @@ const c = (e, t, o) => `${e}:${t}:${o ?? "global"}`, B = () => {
252
229
  };
253
230
  };
254
231
  export {
255
- H as createLocalStorageHistoryPersistence,
256
- G as createLocalStorageLastResourcePersistence,
257
- C as createLocalStorageLayoutPersistence,
258
- A as createLocalStoragePanelsPersistence,
259
- U as createLocalStorageTreePersistence,
260
- z as createLocalStorageWorkbenchPersistence,
261
- c as workbenchStoragePersistenceKey
232
+ K as createLocalStorageHistoryPersistence,
233
+ W as createLocalStorageLastResourcePersistence,
234
+ T as createLocalStorageLayoutPersistence,
235
+ k as createLocalStoragePanelsPersistence,
236
+ w as createLocalStorageTreePersistence,
237
+ A as createLocalStorageWorkbenchPersistence,
238
+ i as workbenchStoragePersistenceKey
262
239
  };
263
240
  //# sourceMappingURL=storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sources":["../src/storage/local-storage-persistence-helpers.ts","../src/storage/local-storage-layout-persistence.ts","../src/storage/local-storage-persistence.ts"],"sourcesContent":["export interface WorkbenchStorageLike {\n readonly length?: number;\n getItem(key: string): string | null;\n key?(index: number): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n}\n\nexport type WorkbenchStoragePersistenceKind =\n | \"history\"\n | \"layout\"\n | \"layout-compatibility\"\n | \"layout-generation\"\n | \"layout-resource-index\"\n | \"layout-scope-index\"\n | \"panels\"\n | \"side-panel\"\n | \"tree\"\n | \"last-resource\";\n\nexport interface CreateWorkbenchStoragePersistenceInput {\n debounceMs?: number;\n eventTarget?: {\n addEventListener(type: \"pagehide\", listener: () => void): void;\n removeEventListener(type: \"pagehide\", listener: () => void): void;\n };\n namespace: string;\n storage?: WorkbenchStorageLike;\n}\n\nexport const workbenchStoragePersistenceKey = (\n namespace: string,\n kind: WorkbenchStoragePersistenceKind,\n scope: string | undefined,\n) => `${namespace}:${kind}:${scope ?? \"global\"}`;\n\nconst createMemoryStorage = (): WorkbenchStorageLike => {\n const map = new Map<string, string>();\n return {\n get length() {\n return map.size;\n },\n getItem: (key) => map.get(key) ?? null,\n key: (index) => [...map.keys()][index] ?? null,\n setItem: (key, value) => {\n map.set(key, value);\n },\n removeItem: (key) => {\n map.delete(key);\n },\n };\n};\n\nexport const resolveStorage = (storage?: WorkbenchStorageLike): WorkbenchStorageLike => {\n if (storage) return storage;\n if (typeof localStorage !== \"undefined\") return localStorage;\n return createMemoryStorage();\n};\n\nexport const readJson = <T>(storage: WorkbenchStorageLike, key: string): T | undefined => {\n const raw = storage.getItem(key);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n","import type { LayoutPersistenceAdapter, WorkbenchLayout } from \"../core\";\nimport { workbenchRegions } from \"../core\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\ninterface PersistedWorkbenchLayoutV1 {\n version: 1;\n layout: WorkbenchLayout;\n}\n\ninterface PersistedWorkbenchLayoutV2 {\n version: 2;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV1 | PersistedWorkbenchLayoutV2;\n\nconst WORKBENCH_LAYOUT_VERSION = 2 as const;\nconst WORKBENCH_LAYOUT_INDEX_VERSION = 1 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_LIMIT = 50;\n\ninterface PersistedWorkbenchLayoutScopeIndex {\n version: 1;\n scopes: string[];\n}\n\ninterface PersistedWorkbenchLayoutGeneration {\n version: 1;\n generation: number;\n}\n\nexport const createLocalStorageLayoutPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): LayoutPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const pending = new Map<\n string,\n { generation: number; legacyPanelsKey?: string; raw: string; scope: string | undefined }\n >();\n const debounceMs = input.debounceMs ?? 250;\n const eventTarget =\n input.eventTarget ??\n (typeof window !== \"undefined\"\n ? {\n addEventListener: (type: \"pagehide\", listener: () => void) => window.addEventListener(type, listener),\n removeEventListener: (type: \"pagehide\", listener: () => void) => window.removeEventListener(type, listener),\n }\n : undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const generationKey = workbenchStoragePersistenceKey(input.namespace, \"layout-generation\", undefined);\n const getGeneration = () => {\n const persisted = readJson<unknown>(storage, generationKey);\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === 1 &&\n \"generation\" in persisted &&\n typeof persisted.generation === \"number\"\n ? persisted.generation\n : 0;\n };\n\n const advanceGeneration = () => {\n const generation = getGeneration() + 1;\n const persisted: PersistedWorkbenchLayoutGeneration = { version: 1, generation };\n storage.setItem(generationKey, JSON.stringify(persisted));\n return generation;\n };\n\n const resourceProjectId = (scope: string | undefined) =>\n scope?.match(/^project\\/([^/]+)\\/mode\\/[^/]+\\/resource\\//)?.[1];\n const scopeProjectId = (scope: string | undefined) => scope?.match(/^project\\/([^/]+)/)?.[1];\n\n const storedProjectScopes = (projectId: string) => {\n if (!storage.key) return [];\n const prefix = `${input.namespace}:layout:`;\n const scopes: string[] = [];\n for (let index = 0; index < (storage.length ?? 0); index += 1) {\n const key = storage.key(index);\n if (!key?.startsWith(prefix)) continue;\n const scope = key.slice(prefix.length);\n if (scopeProjectId(scope) === projectId) scopes.push(scope);\n }\n return scopes;\n };\n\n const readScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string) => {\n const persisted = readJson<unknown>(storage, workbenchStoragePersistenceKey(input.namespace, kind, projectId));\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === WORKBENCH_LAYOUT_INDEX_VERSION &&\n \"scopes\" in persisted &&\n Array.isArray(persisted.scopes)\n ? persisted.scopes.filter(\n (scope): scope is string =>\n typeof scope === \"string\" &&\n storage.getItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", scope)) !== null,\n )\n : [];\n };\n\n const writeScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string, scopes: string[]) => {\n const next: PersistedWorkbenchLayoutScopeIndex = { version: WORKBENCH_LAYOUT_INDEX_VERSION, scopes };\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, kind, projectId), JSON.stringify(next));\n };\n\n const touchProjectScope = (scope: string | undefined) => {\n const projectId = scopeProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-scope-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n writeScopes(\"layout-scope-index\", projectId, scopes);\n };\n\n const touchResourceScope = (scope: string | undefined) => {\n const projectId = resourceProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-resource-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n for (const evictedScope of scopes.splice(0, Math.max(0, scopes.length - WORKBENCH_LAYOUT_RESOURCE_LIMIT))) {\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"layout\", evictedScope));\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"panels\", evictedScope));\n }\n writeScopes(\"layout-resource-index\", projectId, scopes);\n };\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n const writes = [...pending.values()];\n pending.clear();\n const generation = getGeneration();\n for (const write of writes) {\n if (write.generation !== generation) continue;\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", write.scope), write.raw);\n touchProjectScope(write.scope);\n touchResourceScope(write.scope);\n if (write.legacyPanelsKey) storage.removeItem?.(write.legacyPanelsKey);\n }\n };\n\n const scheduleFlush = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n };\n\n eventTarget?.addEventListener(\"pagehide\", flush);\n\n return {\n getLayout: (scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const pendingWrite = pending.get(key);\n const persisted =\n pendingWrite && pendingWrite.generation === getGeneration()\n ? (JSON.parse(pendingWrite.raw) as PersistedWorkbenchLayout)\n : readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version === WORKBENCH_LAYOUT_VERSION) return persisted.layout;\n if (persisted?.version !== 1) return undefined;\n\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n const panels = readJson<unknown>(storage, legacyPanelsKey);\n const openByRegionId =\n typeof panels === \"object\" &&\n panels !== null &&\n \"openByRegionId\" in panels &&\n typeof panels.openByRegionId === \"object\" &&\n panels.openByRegionId !== null\n ? panels.openByRegionId\n : {};\n const regions = { ...persisted.layout.regions };\n for (const region of workbenchRegions) {\n const open = (openByRegionId as Record<string, unknown>)[region];\n if (typeof open === \"boolean\" && regions[region]) regions[region] = { ...regions[region], visible: open };\n }\n const layout = { ...persisted.layout, regions };\n const migrated: PersistedWorkbenchLayoutV2 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n pending.set(key, {\n generation: getGeneration(),\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(migrated),\n scope,\n });\n scheduleFlush();\n return layout;\n },\n setLayout: (layout, scope) => {\n const persisted: PersistedWorkbenchLayoutV2 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n pending.delete(key);\n pending.set(key, {\n generation: getGeneration(),\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(persisted),\n scope,\n });\n scheduleFlush();\n },\n flush,\n listScopes(projectId) {\n return [\n ...new Set([\n ...readScopes(\"layout-scope-index\", projectId),\n ...readScopes(\"layout-resource-index\", projectId),\n ...storedProjectScopes(projectId),\n ]),\n ];\n },\n transformLayouts(projectId, transform) {\n flush();\n advanceGeneration();\n for (const scope of this.listScopes?.(projectId) ?? []) {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const persisted = readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version !== WORKBENCH_LAYOUT_VERSION) continue;\n const layout = transform(persisted.layout, scope);\n if (!layout) {\n storage.removeItem?.(key);\n continue;\n }\n storage.setItem(\n key,\n JSON.stringify({ version: WORKBENCH_LAYOUT_VERSION, layout } satisfies PersistedWorkbenchLayoutV2),\n );\n }\n },\n getCompatibilityMarker: (key) =>\n readJson<string>(storage, workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key)),\n setCompatibilityMarker: (key, value) => {\n advanceGeneration();\n storage.setItem(\n workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key),\n JSON.stringify(value),\n );\n },\n advanceWriteGeneration: advanceGeneration,\n dispose() {\n flush();\n eventTarget?.removeEventListener(\"pagehide\", flush);\n },\n };\n};\n","import type {\n LastResourcePersistenceAdapter,\n PersistedTreeRendererStates,\n PersistedWorkbenchHistory,\n PersistedWorkbenchPanels,\n ResourceRef,\n TreeRendererPersistenceAdapter,\n WorkbenchHistoryPersistence,\n WorkbenchPanelsPersistenceAdapter,\n WorkbenchPersistenceAdapter,\n WorkbenchSidePanelMode,\n WorkbenchSidePanelPersistenceAdapter,\n} from \"../core\";\nimport { createLocalStorageLayoutPersistence } from \"./local-storage-layout-persistence\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\nexport type {\n WorkbenchStorageLike,\n WorkbenchStoragePersistenceKind,\n} from \"./local-storage-persistence-helpers\";\nexport { createLocalStorageLayoutPersistence, workbenchStoragePersistenceKey };\n\nexport interface CreateLocalStoragePanelsPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope: string;\n}\n\nexport interface CreateLocalStorageTreePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport interface CreateLocalStorageWorkbenchPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageHistoryPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchHistoryPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n getHistory: (scope) =>\n readJson<PersistedWorkbenchHistory>(storage, workbenchStoragePersistenceKey(input.namespace, \"history\", scope)),\n setHistory: (history, scope) => {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"history\", scope), JSON.stringify(history));\n },\n };\n};\n\nexport const createLocalStoragePanelsPersistence = (\n input: CreateLocalStoragePanelsPersistenceInput,\n): WorkbenchPanelsPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getPanelStates: (scope) =>\n readJson<PersistedWorkbenchPanels>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope),\n ),\n setPanelStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope);\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport const createLocalStorageTreePersistence = (\n input: CreateLocalStorageTreePersistenceInput,\n): TreeRendererPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"tree\", input.scope);\n return {\n getTreeStates: () => readJson<PersistedTreeRendererStates>(storage, key),\n setTreeStates: (state) => {\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport interface CreateLocalStorageLastResourcePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nconst isResourceRef = (value: unknown): value is ResourceRef =>\n Boolean(value) && typeof (value as ResourceRef).kind === \"string\" && typeof (value as ResourceRef).uri === \"string\";\n\nexport const createLocalStorageLastResourcePersistence = (\n input: CreateLocalStorageLastResourcePersistenceInput,\n): LastResourcePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"last-resource\", input.scope);\n return {\n getLastResource: () => {\n const parsed = readJson<unknown>(storage, key);\n return isResourceRef(parsed) ? parsed : undefined;\n },\n setLastResource: (resource) => {\n if (!resource) {\n storage.removeItem?.(key);\n return;\n }\n storage.setItem(key, JSON.stringify(resource));\n },\n };\n};\n\ninterface PersistedWorkbenchSidePanel {\n version: 1;\n mode: WorkbenchSidePanelMode;\n}\n\nconst WORKBENCH_SIDE_PANEL_VERSION = 1 as const;\nconst sidePanelModes: readonly WorkbenchSidePanelMode[] = [\"attached\", \"closed\", \"floating\"];\n\nexport interface CreateLocalStorageSidePanelPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageSidePanelPersistence = (\n input: CreateLocalStorageSidePanelPersistenceInput,\n): WorkbenchSidePanelPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"side-panel\", input.scope);\n return {\n getMode: () => {\n const persisted = readJson<PersistedWorkbenchSidePanel>(storage, key);\n if (persisted?.version !== WORKBENCH_SIDE_PANEL_VERSION) return undefined;\n return sidePanelModes.includes(persisted.mode) ? persisted.mode : undefined;\n },\n setMode: (mode) => {\n const persisted: PersistedWorkbenchSidePanel = { version: WORKBENCH_SIDE_PANEL_VERSION, mode };\n storage.setItem(key, JSON.stringify(persisted));\n },\n };\n};\n\nexport const createLocalStorageWorkbenchPersistence = (input: CreateLocalStorageWorkbenchPersistenceInput) => {\n const storage = resolveStorage(input.storage);\n const layoutPersistence = createLocalStorageLayoutPersistence({\n debounceMs: input.debounceMs,\n eventTarget: input.eventTarget,\n namespace: input.namespace,\n storage,\n });\n const snapshotPersistence: WorkbenchPersistenceAdapter = {\n getSnapshot: (scope) => {\n const layout = layoutPersistence.getLayout(scope);\n return layout ? { layout } : undefined;\n },\n setSnapshot: (snapshot, scope) => layoutPersistence.setLayout(snapshot.layout, scope),\n flush: layoutPersistence.flush,\n dispose: layoutPersistence.dispose,\n };\n\n return {\n snapshotPersistence,\n historyPersistence: createLocalStorageHistoryPersistence({ namespace: input.namespace, storage }),\n layoutPersistence,\n panelsPersistence: createLocalStoragePanelsPersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n treePersistence: createLocalStorageTreePersistence({ namespace: input.namespace, scope: input.scope, storage }),\n lastResourcePersistence: createLocalStorageLastResourcePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n sidePanelPersistence: createLocalStorageSidePanelPersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n };\n};\n"],"names":["workbenchStoragePersistenceKey","namespace","kind","scope","createMemoryStorage","map","Map","length","size","getItem","key","get","index","keys","setItem","value","set","removeItem","delete","resolveStorage","storage","localStorage","readJson","raw","JSON","parse","WORKBENCH_LAYOUT_VERSION","WORKBENCH_LAYOUT_INDEX_VERSION","WORKBENCH_LAYOUT_RESOURCE_LIMIT","createLocalStorageLayoutPersistence","input","pending","debounceMs","eventTarget","window","addEventListener","type","listener","removeEventListener","undefined","timer","generationKey","getGeneration","persisted","version","generation","advanceGeneration","stringify","resourceProjectId","match","scopeProjectId","storedProjectScopes","projectId","prefix","scopes","startsWith","slice","push","readScopes","Array","isArray","filter","writeScopes","next","touchProjectScope","candidate","touchResourceScope","evictedScope","splice","Math","max","flush","writes","values","clear","write","legacyPanelsKey","scheduleFlush","setTimeout","getLayout","pendingWrite","layout","panels","openByRegionId","regions","region","workbenchRegions","open","visible","migrated","setLayout","listScopes","Set","transformLayouts","transform","getCompatibilityMarker","setCompatibilityMarker","advanceWriteGeneration","dispose","createLocalStorageHistoryPersistence","getHistory","setHistory","history","createLocalStoragePanelsPersistence","getPanelStates","setPanelStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","isResourceRef","Boolean","uri","createLocalStorageLastResourcePersistence","getLastResource","parsed","setLastResource","resource","WORKBENCH_SIDE_PANEL_VERSION","sidePanelModes","createLocalStorageSidePanelPersistence","getMode","includes","mode","setMode","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","historyPersistence","panelsPersistence","treePersistence","lastResourcePersistence","sidePanelPersistence"],"mappings":"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"}
1
+ {"version":3,"file":"storage.js","sources":["../src/storage/local-storage-persistence-helpers.ts","../src/storage/local-storage-layout-persistence.ts","../src/storage/local-storage-persistence.ts"],"sourcesContent":["export interface WorkbenchStorageLike {\n readonly length?: number;\n getItem(key: string): string | null;\n key?(index: number): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n}\n\nexport type WorkbenchStoragePersistenceKind =\n | \"history\"\n | \"layout\"\n | \"layout-compatibility\"\n | \"layout-generation\"\n | \"layout-resource-index\"\n | \"layout-scope-index\"\n | \"panels\"\n | \"side-panel\"\n | \"tree\"\n | \"last-resource\";\n\nexport interface CreateWorkbenchStoragePersistenceInput {\n debounceMs?: number;\n eventTarget?: {\n addEventListener(type: \"pagehide\", listener: () => void): void;\n removeEventListener(type: \"pagehide\", listener: () => void): void;\n };\n namespace: string;\n storage?: WorkbenchStorageLike;\n}\n\nexport const workbenchStoragePersistenceKey = (\n namespace: string,\n kind: WorkbenchStoragePersistenceKind,\n scope: string | undefined,\n) => `${namespace}:${kind}:${scope ?? \"global\"}`;\n\nconst createMemoryStorage = (): WorkbenchStorageLike => {\n const map = new Map<string, string>();\n return {\n get length() {\n return map.size;\n },\n getItem: (key) => map.get(key) ?? null,\n key: (index) => [...map.keys()][index] ?? null,\n setItem: (key, value) => {\n map.set(key, value);\n },\n removeItem: (key) => {\n map.delete(key);\n },\n };\n};\n\nexport const resolveStorage = (storage?: WorkbenchStorageLike): WorkbenchStorageLike => {\n if (storage) return storage;\n if (typeof localStorage !== \"undefined\") return localStorage;\n return createMemoryStorage();\n};\n\nexport const readJson = <T>(storage: WorkbenchStorageLike, key: string): T | undefined => {\n const raw = storage.getItem(key);\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n","import type { LayoutPersistenceAdapter, WorkbenchLayout } from \"../core\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\ninterface PersistedWorkbenchLayoutV3 {\n version: 3;\n layout: WorkbenchLayout;\n}\n\ntype PersistedWorkbenchLayout = PersistedWorkbenchLayoutV3;\n\n// Version 3 is the composition-resolver layout model (PS-267). Layouts persisted by\n// earlier versions carry replaced panel roles and bindings, so they are discarded\n// rather than interpreted.\nconst WORKBENCH_LAYOUT_VERSION = 3 as const;\nconst WORKBENCH_LAYOUT_INDEX_VERSION = 1 as const;\nconst WORKBENCH_LAYOUT_RESOURCE_LIMIT = 50;\n\ninterface PersistedWorkbenchLayoutScopeIndex {\n version: 1;\n scopes: string[];\n}\n\ninterface PersistedWorkbenchLayoutGeneration {\n version: 1;\n generation: number;\n}\n\nexport const createLocalStorageLayoutPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): LayoutPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const pending = new Map<\n string,\n { generation: number; legacyPanelsKey?: string; raw: string; scope: string | undefined }\n >();\n const debounceMs = input.debounceMs ?? 250;\n const eventTarget =\n input.eventTarget ??\n (typeof window !== \"undefined\"\n ? {\n addEventListener: (type: \"pagehide\", listener: () => void) => window.addEventListener(type, listener),\n removeEventListener: (type: \"pagehide\", listener: () => void) => window.removeEventListener(type, listener),\n }\n : undefined);\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const generationKey = workbenchStoragePersistenceKey(input.namespace, \"layout-generation\", undefined);\n const getGeneration = () => {\n const persisted = readJson<unknown>(storage, generationKey);\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === 1 &&\n \"generation\" in persisted &&\n typeof persisted.generation === \"number\"\n ? persisted.generation\n : 0;\n };\n\n const advanceGeneration = () => {\n const generation = getGeneration() + 1;\n const persisted: PersistedWorkbenchLayoutGeneration = { version: 1, generation };\n storage.setItem(generationKey, JSON.stringify(persisted));\n return generation;\n };\n\n const resourceProjectId = (scope: string | undefined) =>\n scope?.match(/^project\\/([^/]+)\\/mode\\/[^/]+\\/resource\\//)?.[1];\n const scopeProjectId = (scope: string | undefined) => scope?.match(/^project\\/([^/]+)/)?.[1];\n\n const storedProjectScopes = (projectId: string) => {\n if (!storage.key) return [];\n const prefix = `${input.namespace}:layout:`;\n const scopes: string[] = [];\n for (let index = 0; index < (storage.length ?? 0); index += 1) {\n const key = storage.key(index);\n if (!key?.startsWith(prefix)) continue;\n const scope = key.slice(prefix.length);\n if (scopeProjectId(scope) === projectId) scopes.push(scope);\n }\n return scopes;\n };\n\n const readScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string) => {\n const persisted = readJson<unknown>(storage, workbenchStoragePersistenceKey(input.namespace, kind, projectId));\n return typeof persisted === \"object\" &&\n persisted !== null &&\n \"version\" in persisted &&\n persisted.version === WORKBENCH_LAYOUT_INDEX_VERSION &&\n \"scopes\" in persisted &&\n Array.isArray(persisted.scopes)\n ? persisted.scopes.filter(\n (scope): scope is string =>\n typeof scope === \"string\" &&\n storage.getItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", scope)) !== null,\n )\n : [];\n };\n\n const writeScopes = (kind: \"layout-resource-index\" | \"layout-scope-index\", projectId: string, scopes: string[]) => {\n const next: PersistedWorkbenchLayoutScopeIndex = { version: WORKBENCH_LAYOUT_INDEX_VERSION, scopes };\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, kind, projectId), JSON.stringify(next));\n };\n\n const touchProjectScope = (scope: string | undefined) => {\n const projectId = scopeProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-scope-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n writeScopes(\"layout-scope-index\", projectId, scopes);\n };\n\n const touchResourceScope = (scope: string | undefined) => {\n const projectId = resourceProjectId(scope);\n if (!projectId || !scope) return;\n const scopes = readScopes(\"layout-resource-index\", projectId).filter((candidate) => candidate !== scope);\n scopes.push(scope);\n for (const evictedScope of scopes.splice(0, Math.max(0, scopes.length - WORKBENCH_LAYOUT_RESOURCE_LIMIT))) {\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"layout\", evictedScope));\n storage.removeItem?.(workbenchStoragePersistenceKey(input.namespace, \"panels\", evictedScope));\n }\n writeScopes(\"layout-resource-index\", projectId, scopes);\n };\n\n const flush = () => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n const writes = [...pending.values()];\n pending.clear();\n const generation = getGeneration();\n for (const write of writes) {\n if (write.generation !== generation) continue;\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"layout\", write.scope), write.raw);\n touchProjectScope(write.scope);\n touchResourceScope(write.scope);\n if (write.legacyPanelsKey) storage.removeItem?.(write.legacyPanelsKey);\n }\n };\n\n const scheduleFlush = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n };\n\n eventTarget?.addEventListener(\"pagehide\", flush);\n\n return {\n getLayout: (scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const pendingWrite = pending.get(key);\n const persisted =\n pendingWrite && pendingWrite.generation === getGeneration()\n ? (JSON.parse(pendingWrite.raw) as PersistedWorkbenchLayout)\n : readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version === WORKBENCH_LAYOUT_VERSION) return persisted.layout;\n return undefined;\n },\n setLayout: (layout, scope) => {\n const persisted: PersistedWorkbenchLayoutV3 = { version: WORKBENCH_LAYOUT_VERSION, layout };\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const legacyPanelsKey = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope);\n pending.delete(key);\n pending.set(key, {\n generation: getGeneration(),\n legacyPanelsKey: storage.getItem(legacyPanelsKey) === null ? undefined : legacyPanelsKey,\n raw: JSON.stringify(persisted),\n scope,\n });\n scheduleFlush();\n },\n flush,\n listScopes(projectId) {\n return [\n ...new Set([\n ...readScopes(\"layout-scope-index\", projectId),\n ...readScopes(\"layout-resource-index\", projectId),\n ...storedProjectScopes(projectId),\n ]),\n ];\n },\n transformLayouts(projectId, transform) {\n flush();\n advanceGeneration();\n for (const scope of this.listScopes?.(projectId) ?? []) {\n const key = workbenchStoragePersistenceKey(input.namespace, \"layout\", scope);\n const persisted = readJson<PersistedWorkbenchLayout>(storage, key);\n if (persisted?.version !== WORKBENCH_LAYOUT_VERSION) continue;\n const layout = transform(persisted.layout, scope);\n if (!layout) {\n storage.removeItem?.(key);\n continue;\n }\n storage.setItem(\n key,\n JSON.stringify({ version: WORKBENCH_LAYOUT_VERSION, layout } satisfies PersistedWorkbenchLayoutV3),\n );\n }\n },\n getCompatibilityMarker: (key) =>\n readJson<string>(storage, workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key)),\n setCompatibilityMarker: (key, value) => {\n advanceGeneration();\n storage.setItem(\n workbenchStoragePersistenceKey(input.namespace, \"layout-compatibility\", key),\n JSON.stringify(value),\n );\n },\n advanceWriteGeneration: advanceGeneration,\n dispose() {\n flush();\n eventTarget?.removeEventListener(\"pagehide\", flush);\n },\n };\n};\n","import type {\n LastResourcePersistenceAdapter,\n PersistedTreeRendererStates,\n PersistedWorkbenchHistory,\n PersistedWorkbenchPanels,\n ResourceRef,\n TreeRendererPersistenceAdapter,\n WorkbenchHistoryPersistence,\n WorkbenchPanelsPersistenceAdapter,\n WorkbenchPersistenceAdapter,\n WorkbenchSidePanelMode,\n WorkbenchSidePanelPersistenceAdapter,\n} from \"../core\";\nimport { createLocalStorageLayoutPersistence } from \"./local-storage-layout-persistence\";\nimport {\n type CreateWorkbenchStoragePersistenceInput,\n readJson,\n resolveStorage,\n workbenchStoragePersistenceKey,\n} from \"./local-storage-persistence-helpers\";\n\nexport type {\n WorkbenchStorageLike,\n WorkbenchStoragePersistenceKind,\n} from \"./local-storage-persistence-helpers\";\nexport { createLocalStorageLayoutPersistence, workbenchStoragePersistenceKey };\n\nexport interface CreateLocalStoragePanelsPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope: string;\n}\n\nexport interface CreateLocalStorageTreePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport interface CreateLocalStorageWorkbenchPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageHistoryPersistence = (\n input: CreateWorkbenchStoragePersistenceInput,\n): WorkbenchHistoryPersistence => {\n const storage = resolveStorage(input.storage);\n return {\n getHistory: (scope) =>\n readJson<PersistedWorkbenchHistory>(storage, workbenchStoragePersistenceKey(input.namespace, \"history\", scope)),\n setHistory: (history, scope) => {\n storage.setItem(workbenchStoragePersistenceKey(input.namespace, \"history\", scope), JSON.stringify(history));\n },\n };\n};\n\nexport const createLocalStoragePanelsPersistence = (\n input: CreateLocalStoragePanelsPersistenceInput,\n): WorkbenchPanelsPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n return {\n getPanelStates: (scope) =>\n readJson<PersistedWorkbenchPanels>(\n storage,\n workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope),\n ),\n setPanelStates: (state, scope) => {\n const key = workbenchStoragePersistenceKey(input.namespace, \"panels\", scope ?? input.scope);\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport const createLocalStorageTreePersistence = (\n input: CreateLocalStorageTreePersistenceInput,\n): TreeRendererPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"tree\", input.scope);\n return {\n getTreeStates: () => readJson<PersistedTreeRendererStates>(storage, key),\n setTreeStates: (state) => {\n storage.setItem(key, JSON.stringify(state));\n },\n };\n};\n\nexport interface CreateLocalStorageLastResourcePersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nconst isResourceRef = (value: unknown): value is ResourceRef =>\n Boolean(value) && typeof (value as ResourceRef).kind === \"string\" && typeof (value as ResourceRef).uri === \"string\";\n\nexport const createLocalStorageLastResourcePersistence = (\n input: CreateLocalStorageLastResourcePersistenceInput,\n): LastResourcePersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"last-resource\", input.scope);\n return {\n getLastResource: () => {\n const parsed = readJson<unknown>(storage, key);\n return isResourceRef(parsed) ? parsed : undefined;\n },\n setLastResource: (resource) => {\n if (!resource) {\n storage.removeItem?.(key);\n return;\n }\n storage.setItem(key, JSON.stringify(resource));\n },\n };\n};\n\ninterface PersistedWorkbenchSidePanel {\n version: 1;\n mode: WorkbenchSidePanelMode;\n}\n\nconst WORKBENCH_SIDE_PANEL_VERSION = 1 as const;\nconst sidePanelModes: readonly WorkbenchSidePanelMode[] = [\"attached\", \"closed\", \"floating\"];\n\nexport interface CreateLocalStorageSidePanelPersistenceInput extends CreateWorkbenchStoragePersistenceInput {\n scope?: string;\n}\n\nexport const createLocalStorageSidePanelPersistence = (\n input: CreateLocalStorageSidePanelPersistenceInput,\n): WorkbenchSidePanelPersistenceAdapter => {\n const storage = resolveStorage(input.storage);\n const key = workbenchStoragePersistenceKey(input.namespace, \"side-panel\", input.scope);\n return {\n getMode: () => {\n const persisted = readJson<PersistedWorkbenchSidePanel>(storage, key);\n if (persisted?.version !== WORKBENCH_SIDE_PANEL_VERSION) return undefined;\n return sidePanelModes.includes(persisted.mode) ? persisted.mode : undefined;\n },\n setMode: (mode) => {\n const persisted: PersistedWorkbenchSidePanel = { version: WORKBENCH_SIDE_PANEL_VERSION, mode };\n storage.setItem(key, JSON.stringify(persisted));\n },\n };\n};\n\nexport const createLocalStorageWorkbenchPersistence = (input: CreateLocalStorageWorkbenchPersistenceInput) => {\n const storage = resolveStorage(input.storage);\n const layoutPersistence = createLocalStorageLayoutPersistence({\n debounceMs: input.debounceMs,\n eventTarget: input.eventTarget,\n namespace: input.namespace,\n storage,\n });\n const snapshotPersistence: WorkbenchPersistenceAdapter = {\n getSnapshot: (scope) => {\n const layout = layoutPersistence.getLayout(scope);\n return layout ? { layout } : undefined;\n },\n setSnapshot: (snapshot, scope) => layoutPersistence.setLayout(snapshot.layout, scope),\n flush: layoutPersistence.flush,\n dispose: layoutPersistence.dispose,\n };\n\n return {\n snapshotPersistence,\n historyPersistence: createLocalStorageHistoryPersistence({ namespace: input.namespace, storage }),\n layoutPersistence,\n panelsPersistence: createLocalStoragePanelsPersistence({\n namespace: input.namespace,\n scope: input.scope ?? \"global\",\n storage,\n }),\n treePersistence: createLocalStorageTreePersistence({ namespace: input.namespace, scope: input.scope, storage }),\n lastResourcePersistence: createLocalStorageLastResourcePersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n sidePanelPersistence: createLocalStorageSidePanelPersistence({\n namespace: input.namespace,\n scope: input.scope,\n storage,\n }),\n };\n};\n"],"names":["workbenchStoragePersistenceKey","namespace","kind","scope","createMemoryStorage","map","Map","length","size","getItem","key","get","index","keys","setItem","value","set","removeItem","delete","resolveStorage","storage","localStorage","readJson","raw","JSON","parse","createLocalStorageLayoutPersistence","input","pending","debounceMs","eventTarget","window","addEventListener","type","listener","removeEventListener","undefined","timer","generationKey","getGeneration","persisted","version","generation","advanceGeneration","stringify","resourceProjectId","match","scopeProjectId","storedProjectScopes","projectId","prefix","scopes","startsWith","slice","push","readScopes","WORKBENCH_LAYOUT_INDEX_VERSION","Array","isArray","filter","writeScopes","next","touchProjectScope","candidate","touchResourceScope","evictedScope","splice","Math","max","WORKBENCH_LAYOUT_RESOURCE_LIMIT","flush","writes","values","clear","write","legacyPanelsKey","scheduleFlush","setTimeout","getLayout","pendingWrite","WORKBENCH_LAYOUT_VERSION","layout","setLayout","listScopes","Set","transformLayouts","transform","getCompatibilityMarker","setCompatibilityMarker","advanceWriteGeneration","dispose","createLocalStorageHistoryPersistence","getHistory","setHistory","history","createLocalStoragePanelsPersistence","getPanelStates","setPanelStates","state","createLocalStorageTreePersistence","getTreeStates","setTreeStates","isResourceRef","Boolean","uri","createLocalStorageLastResourcePersistence","getLastResource","parsed","setLastResource","resource","sidePanelModes","createLocalStorageSidePanelPersistence","getMode","WORKBENCH_SIDE_PANEL_VERSION","includes","mode","setMode","createLocalStorageWorkbenchPersistence","layoutPersistence","snapshotPersistence","getSnapshot","setSnapshot","snapshot","historyPersistence","panelsPersistence","treePersistence","lastResourcePersistence","sidePanelPersistence"],"mappings":"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"}