@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.
- package/README.md +66 -72
- package/dist/composition-resolver-types-CWykPyEK.js +241 -0
- package/dist/composition-resolver-types-CWykPyEK.js.map +1 -0
- package/dist/extensions.d.ts +344 -28
- package/dist/extensions.js +1362 -883
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-zpunbE4I.js +432 -0
- package/dist/file-renderer-view-zpunbE4I.js.map +1 -0
- package/dist/file-section-navigation-CfYqVObc.js +30 -0
- package/dist/file-section-navigation-CfYqVObc.js.map +1 -0
- package/dist/index.d.ts +268 -15
- package/dist/index.js +2334 -2082
- package/dist/index.js.map +1 -1
- package/dist/layout-types-DMoZz38-.js.map +1 -1
- package/dist/react.d.ts +141 -13
- package/dist/react.js +1969 -1994
- package/dist/react.js.map +1 -1
- package/dist/storage.js +132 -155
- package/dist/storage.js.map +1 -1
- package/dist/testing.d.ts +141 -13
- package/dist/webview-runtime.js +1 -1
- package/dist/webview-runtime.js.map +1 -1
- package/dist/workbench-built-ins-BtgeB274.js +1171 -0
- package/dist/workbench-built-ins-BtgeB274.js.map +1 -0
- package/dist/workbench-menu-paths-Bb0ICxeG.js +20 -0
- package/dist/workbench-menu-paths-Bb0ICxeG.js.map +1 -0
- package/package.json +3 -3
- package/dist/context-key-service-B2K9LAec.js +0 -1034
- package/dist/context-key-service-B2K9LAec.js.map +0 -1
- package/dist/file-renderer-view-DrrhYnb_.js +0 -171
- package/dist/file-renderer-view-DrrhYnb_.js.map +0 -1
- package/dist/workbench-menu-paths-B_QJzcNU.js +0 -12
- package/dist/workbench-menu-paths-B_QJzcNU.js.map +0 -1
package/dist/storage.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
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,
|
|
11
|
-
e.set(t,
|
|
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
|
-
},
|
|
18
|
-
const
|
|
19
|
-
if (
|
|
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(
|
|
20
|
+
return JSON.parse(n);
|
|
22
21
|
} catch {
|
|
23
22
|
return;
|
|
24
23
|
}
|
|
25
|
-
}
|
|
26
|
-
|
|
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
|
|
31
|
-
const
|
|
32
|
-
const s =
|
|
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
|
-
},
|
|
35
|
-
const s =
|
|
34
|
+
}, O = () => {
|
|
35
|
+
const s = S() + 1, r = {
|
|
36
36
|
version: 1,
|
|
37
37
|
generation: s
|
|
38
38
|
};
|
|
39
|
-
return t.setItem(
|
|
40
|
-
},
|
|
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:`,
|
|
42
|
+
const r = `${e.namespace}:layout:`, o = [];
|
|
43
43
|
for (let a = 0; a < (t.length ?? 0); a += 1) {
|
|
44
|
-
const
|
|
45
|
-
if (!
|
|
46
|
-
const
|
|
47
|
-
|
|
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
|
|
50
|
-
},
|
|
51
|
-
const
|
|
52
|
-
return typeof
|
|
53
|
-
},
|
|
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:
|
|
56
|
-
scopes:
|
|
55
|
+
version: 1,
|
|
56
|
+
scopes: o
|
|
57
57
|
};
|
|
58
|
-
t.setItem(
|
|
59
|
-
},
|
|
60
|
-
const r =
|
|
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
|
|
63
|
-
|
|
64
|
-
},
|
|
65
|
-
const r =
|
|
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
|
|
68
|
-
|
|
69
|
-
for (const a of
|
|
70
|
-
t.removeItem?.(
|
|
71
|
-
|
|
72
|
-
},
|
|
73
|
-
|
|
74
|
-
const s = [...
|
|
75
|
-
|
|
76
|
-
const r =
|
|
77
|
-
for (const
|
|
78
|
-
|
|
79
|
-
},
|
|
80
|
-
|
|
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
|
|
82
|
+
return g?.addEventListener("pagehide", p), {
|
|
83
83
|
getLayout: (s) => {
|
|
84
|
-
const r =
|
|
85
|
-
if (a?.version ===
|
|
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
|
|
113
|
-
version:
|
|
88
|
+
const o = {
|
|
89
|
+
version: 3,
|
|
114
90
|
layout: s
|
|
115
|
-
}, a =
|
|
116
|
-
|
|
117
|
-
generation:
|
|
118
|
-
legacyPanelsKey: t.getItem(
|
|
119
|
-
raw: JSON.stringify(
|
|
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
|
-
}),
|
|
97
|
+
}), P();
|
|
122
98
|
},
|
|
123
|
-
flush:
|
|
99
|
+
flush: p,
|
|
124
100
|
listScopes(s) {
|
|
125
|
-
return [.../* @__PURE__ */ new Set([...
|
|
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
|
-
|
|
129
|
-
for (const
|
|
130
|
-
const a =
|
|
131
|
-
if (
|
|
132
|
-
const
|
|
133
|
-
if (!
|
|
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:
|
|
139
|
-
layout:
|
|
114
|
+
version: 3,
|
|
115
|
+
layout: u
|
|
140
116
|
}));
|
|
141
117
|
}
|
|
142
118
|
},
|
|
143
|
-
getCompatibilityMarker: (s) =>
|
|
119
|
+
getCompatibilityMarker: (s) => y(t, i(e.namespace, "layout-compatibility", s)),
|
|
144
120
|
setCompatibilityMarker: (s, r) => {
|
|
145
|
-
|
|
121
|
+
O(), t.setItem(i(e.namespace, "layout-compatibility", s), JSON.stringify(r));
|
|
146
122
|
},
|
|
147
|
-
advanceWriteGeneration:
|
|
123
|
+
advanceWriteGeneration: O,
|
|
148
124
|
dispose() {
|
|
149
|
-
|
|
125
|
+
p(), g?.removeEventListener("pagehide", p);
|
|
150
126
|
}
|
|
151
127
|
};
|
|
152
|
-
},
|
|
153
|
-
const t =
|
|
128
|
+
}, K = (e) => {
|
|
129
|
+
const t = d(e.storage);
|
|
154
130
|
return {
|
|
155
|
-
getHistory: (
|
|
156
|
-
setHistory: (
|
|
157
|
-
t.setItem(
|
|
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
|
-
},
|
|
161
|
-
const t =
|
|
136
|
+
}, k = (e) => {
|
|
137
|
+
const t = d(e.storage);
|
|
162
138
|
return {
|
|
163
|
-
getPanelStates: (
|
|
164
|
-
setPanelStates: (
|
|
165
|
-
const
|
|
166
|
-
t.setItem(
|
|
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
|
-
},
|
|
170
|
-
const t =
|
|
145
|
+
}, w = (e) => {
|
|
146
|
+
const t = d(e.storage), n = i(e.namespace, "tree", e.scope);
|
|
171
147
|
return {
|
|
172
|
-
getTreeStates: () =>
|
|
173
|
-
setTreeStates: (
|
|
174
|
-
t.setItem(
|
|
148
|
+
getTreeStates: () => y(t, n),
|
|
149
|
+
setTreeStates: (c) => {
|
|
150
|
+
t.setItem(n, JSON.stringify(c));
|
|
175
151
|
}
|
|
176
152
|
};
|
|
177
|
-
},
|
|
178
|
-
const t =
|
|
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
|
|
182
|
-
return
|
|
157
|
+
const c = y(t, n);
|
|
158
|
+
return C(c) ? c : void 0;
|
|
183
159
|
},
|
|
184
|
-
setLastResource: (
|
|
185
|
-
if (!
|
|
186
|
-
t.removeItem?.(
|
|
160
|
+
setLastResource: (c) => {
|
|
161
|
+
if (!c) {
|
|
162
|
+
t.removeItem?.(n);
|
|
187
163
|
return;
|
|
188
164
|
}
|
|
189
|
-
t.setItem(
|
|
165
|
+
t.setItem(n, JSON.stringify(c));
|
|
190
166
|
}
|
|
191
167
|
};
|
|
192
|
-
}
|
|
193
|
-
|
|
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
|
|
197
|
-
if (
|
|
198
|
-
return
|
|
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: (
|
|
201
|
-
const
|
|
202
|
-
version:
|
|
203
|
-
mode:
|
|
177
|
+
setMode: (c) => {
|
|
178
|
+
const g = {
|
|
179
|
+
version: 1,
|
|
180
|
+
mode: c
|
|
204
181
|
};
|
|
205
|
-
t.setItem(
|
|
182
|
+
t.setItem(n, JSON.stringify(g));
|
|
206
183
|
}
|
|
207
184
|
};
|
|
208
|
-
},
|
|
209
|
-
const t =
|
|
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: (
|
|
218
|
-
const
|
|
219
|
-
return
|
|
220
|
-
layout:
|
|
194
|
+
getSnapshot: (g) => {
|
|
195
|
+
const l = n.getLayout(g);
|
|
196
|
+
return l ? {
|
|
197
|
+
layout: l
|
|
221
198
|
} : void 0;
|
|
222
199
|
},
|
|
223
|
-
setSnapshot: (
|
|
224
|
-
flush:
|
|
225
|
-
dispose:
|
|
200
|
+
setSnapshot: (g, l) => n.setLayout(g.layout, l),
|
|
201
|
+
flush: n.flush,
|
|
202
|
+
dispose: n.dispose
|
|
226
203
|
},
|
|
227
|
-
historyPersistence:
|
|
204
|
+
historyPersistence: K({
|
|
228
205
|
namespace: e.namespace,
|
|
229
206
|
storage: t
|
|
230
207
|
}),
|
|
231
|
-
layoutPersistence:
|
|
232
|
-
panelsPersistence:
|
|
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:
|
|
214
|
+
treePersistence: w({
|
|
238
215
|
namespace: e.namespace,
|
|
239
216
|
scope: e.scope,
|
|
240
217
|
storage: t
|
|
241
218
|
}),
|
|
242
|
-
lastResourcePersistence:
|
|
219
|
+
lastResourcePersistence: W({
|
|
243
220
|
namespace: e.namespace,
|
|
244
221
|
scope: e.scope,
|
|
245
222
|
storage: t
|
|
246
223
|
}),
|
|
247
|
-
sidePanelPersistence:
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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
|
package/dist/storage.js.map
CHANGED
|
@@ -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":"AA8BO,MAAMA,IAAiCA,CAC5CC,GACAC,GACAC,MACG,GAAGF,CAAS,IAAIC,CAAI,IAAIC,KAAS,QAAQ,IAExCC,IAAsBA,MAA4B;AACtD,QAAMC,wBAAUC,IAAAA;AAChB,SAAO;AAAA,IACL,IAAIC,SAAS;AACX,aAAOF,EAAIG;AAAAA,IACb;AAAA,IACAC,SAAUC,CAAAA,MAAQL,EAAIM,IAAID,CAAG,KAAK;AAAA,IAClCA,KAAME,OAAU,CAAC,GAAGP,EAAIQ,MAAM,EAAED,CAAK,KAAK;AAAA,IAC1CE,SAASA,CAACJ,GAAKK,MAAU;AACvBV,MAAAA,EAAIW,IAAIN,GAAKK,CAAK;AAAA,IACpB;AAAA,IACAE,YAAaP,CAAAA,MAAQ;AACnBL,MAAAA,EAAIa,OAAOR,CAAG;AAAA,IAChB;AAAA,EAAA;AAEJ,GAEaS,IAAiBA,CAACC,MACzBA,MACA,OAAOC,eAAiB,MAAoBA,eACzCjB,EAAAA,IAGIkB,IAAW,CAAIF,GAA+BV,MAA+B;AACxF,QAAMa,IAAMH,EAAQX,QAAQC,CAAG;AAC/B,MAAKa;AACL,QAAI;AACF,aAAOC,KAAKC,MAAMF,CAAG;AAAA,IACvB,QAAQ;AACN;AAAA,IACF;AACF;ACnCO,MAAMG,IAAsCA,CACjDC,MAC6B;AAC7B,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCQ,wBAActB,IAAAA,GAIduB,IAAaF,EAAME,cAAc,KACjCC,IACJH,EAAMG,gBACL,OAAOC,SAAW,MACf;AAAA,IACEC,kBAAkBA,CAACC,GAAkBC,MAAyBH,OAAOC,iBAAiBC,GAAMC,CAAQ;AAAA,IACpGC,qBAAqBA,CAACF,GAAkBC,MAAyBH,OAAOI,oBAAoBF,GAAMC,CAAQ;AAAA,EAAA,IAE5GE;AACN,MAAIC;AAEJ,QAAMC,IAAgBtC,EAA+B2B,EAAM1B,WAAW,qBAAqBmC,MAAS,GAC9FG,IAAgBA,MAAM;AAC1B,UAAMC,IAAYlB,EAAkBF,GAASkB,CAAa;AAC1D,WAAO,OAAOE,KAAc,YAC1BA,MAAc,QACd,aAAaA,KACbA,EAAUC,YAAY,KACtB,gBAAgBD,KAChB,OAAOA,EAAUE,cAAe,WAC9BF,EAAUE,aACV;AAAA,EACN,GAEMC,IAAoBA,MAAM;AAC9B,UAAMD,IAAaH,MAAkB,GAC/BC,IAAgD;AAAA,MAAEC,SAAS;AAAA,MAAGC,YAAAA;AAAAA,IAAAA;AACpEtB,WAAAA,EAAQN,QAAQwB,GAAed,KAAKoB,UAAUJ,CAAS,CAAC,GACjDE;AAAAA,EACT,GAEMG,IAAoBA,CAAC1C,MACzBA,GAAO2C,MAAM,4CAA4C,IAAI,CAAC,GAC1DC,IAAiBA,CAAC5C,MAA8BA,GAAO2C,MAAM,mBAAmB,IAAI,CAAC,GAErFE,IAAsBA,CAACC,MAAsB;AACjD,QAAI,CAAC7B,EAAQV,IAAK,QAAO,CAAA;AACzB,UAAMwC,IAAS,GAAGvB,EAAM1B,SAAS,YAC3BkD,IAAmB,CAAA;AACzB,aAASvC,IAAQ,GAAGA,KAASQ,EAAQb,UAAU,IAAIK,KAAS,GAAG;AAC7D,YAAMF,IAAMU,EAAQV,IAAIE,CAAK;AAC7B,UAAI,CAACF,GAAK0C,WAAWF,CAAM,EAAG;AAC9B,YAAM/C,IAAQO,EAAI2C,MAAMH,EAAO3C,MAAM;AACrC,MAAIwC,EAAe5C,CAAK,MAAM8C,KAAWE,EAAOG,KAAKnD,CAAK;AAAA,IAC5D;AACA,WAAOgD;AAAAA,EACT,GAEMI,IAAaA,CAACrD,GAAsD+C,MAAsB;AAC9F,UAAMT,IAAYlB,EAAkBF,GAASpB,EAA+B2B,EAAM1B,WAAWC,GAAM+C,CAAS,CAAC;AAC7G,WAAO,OAAOT,KAAc,YAC1BA,MAAc,QACd,aAAaA,KACbA,EAAUC,YAAYe,KACtB,YAAYhB,KACZiB,MAAMC,QAAQlB,EAAUW,MAAM,IAC5BX,EAAUW,OAAOQ,OACf,CAACxD,MACC,OAAOA,KAAU,YACjBiB,EAAQX,QAAQT,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,CAAC,MAAM,IAC1F,IACA,CAAA;AAAA,EACN,GAEMyD,IAAcA,CAAC1D,GAAsD+C,GAAmBE,MAAqB;AACjH,UAAMU,IAA2C;AAAA,MAAEpB,SAASe;AAAAA,MAAgCL,QAAAA;AAAAA,IAAAA;AAC5F/B,IAAAA,EAAQN,QAAQd,EAA+B2B,EAAM1B,WAAWC,GAAM+C,CAAS,GAAGzB,KAAKoB,UAAUiB,CAAI,CAAC;AAAA,EACxG,GAEMC,IAAoBA,CAAC3D,MAA8B;AACvD,UAAM8C,IAAYF,EAAe5C,CAAK;AACtC,QAAI,CAAC8C,KAAa,CAAC9C,EAAO;AAC1B,UAAMgD,IAASI,EAAW,sBAAsBN,CAAS,EAAEU,OAAQI,CAAAA,MAAcA,MAAc5D,CAAK;AACpGgD,IAAAA,EAAOG,KAAKnD,CAAK,GACjByD,EAAY,sBAAsBX,GAAWE,CAAM;AAAA,EACrD,GAEMa,IAAqBA,CAAC7D,MAA8B;AACxD,UAAM8C,IAAYJ,EAAkB1C,CAAK;AACzC,QAAI,CAAC8C,KAAa,CAAC9C,EAAO;AAC1B,UAAMgD,IAASI,EAAW,yBAAyBN,CAAS,EAAEU,OAAQI,CAAAA,MAAcA,MAAc5D,CAAK;AACvGgD,IAAAA,EAAOG,KAAKnD,CAAK;AACjB,eAAW8D,KAAgBd,EAAOe,OAAO,GAAGC,KAAKC,IAAI,GAAGjB,EAAO5C,SAAS8D,EAA+B,CAAC;AACtGjD,MAAAA,EAAQH,aAAajB,EAA+B2B,EAAM1B,WAAW,UAAUgE,CAAY,CAAC,GAC5F7C,EAAQH,aAAajB,EAA+B2B,EAAM1B,WAAW,UAAUgE,CAAY,CAAC;AAE9FL,IAAAA,EAAY,yBAAyBX,GAAWE,CAAM;AAAA,EACxD,GAEMmB,IAAQA,MAAM;AAClB,IAAIjC,kBAAoBA,CAAK,GAC7BA,IAAQD;AACR,UAAMmC,IAAS,CAAC,GAAG3C,EAAQ4C,QAAQ;AACnC5C,IAAAA,EAAQ6C,MAAAA;AACR,UAAM/B,IAAaH,EAAAA;AACnB,eAAWmC,KAASH;AAClB,MAAIG,EAAMhC,eAAeA,MACzBtB,EAAQN,QAAQd,EAA+B2B,EAAM1B,WAAW,UAAUyE,EAAMvE,KAAK,GAAGuE,EAAMnD,GAAG,GACjGuC,EAAkBY,EAAMvE,KAAK,GAC7B6D,EAAmBU,EAAMvE,KAAK,GAC1BuE,EAAMC,mBAAiBvD,EAAQH,aAAayD,EAAMC,eAAe;AAAA,EAEzE,GAEMC,IAAgBA,MAAM;AAC1B,IAAIvC,kBAAoBA,CAAK,GAC7BA,IAAQwC,WAAWP,GAAOzC,CAAU;AAAA,EACtC;AAEAC,SAAAA,GAAaE,iBAAiB,YAAYsC,CAAK,GAExC;AAAA,IACLQ,WAAY3E,CAAAA,MAAU;AACpB,YAAMO,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,GACrE4E,IAAenD,EAAQjB,IAAID,CAAG,GAC9B8B,IACJuC,KAAgBA,EAAarC,eAAeH,EAAAA,IACvCf,KAAKC,MAAMsD,EAAaxD,GAAG,IAC5BD,EAAmCF,GAASV,CAAG;AACrD,UAAI8B,GAAWC,YAAYuC,EAA0B,QAAOxC,EAAUyC;AAAAA,IAExE;AAAA,IACAC,WAAWA,CAACD,GAAQ9E,MAAU;AAC5B,YAAMqC,IAAwC;AAAA,QAAEC,SAASuC;AAAAA,QAA0BC,QAAAA;AAAAA,MAAAA,GAC7EvE,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,GACrEwE,IAAkB3E,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK;AACvFyB,MAAAA,EAAQV,OAAOR,CAAG,GAClBkB,EAAQZ,IAAIN,GAAK;AAAA,QACfgC,YAAYH,EAAAA;AAAAA,QACZoC,iBAAiBvD,EAAQX,QAAQkE,CAAe,MAAM,OAAOvC,SAAYuC;AAAAA,QACzEpD,KAAKC,KAAKoB,UAAUJ,CAAS;AAAA,QAC7BrC,OAAAA;AAAAA,MAAAA,CACD,GACDyE,EAAAA;AAAAA,IACF;AAAA,IACAN,OAAAA;AAAAA,IACAa,WAAWlC,GAAW;AACpB,aAAO,CACL,GAAG,oBAAImC,IAAI,CACT,GAAG7B,EAAW,sBAAsBN,CAAS,GAC7C,GAAGM,EAAW,yBAAyBN,CAAS,GAChD,GAAGD,EAAoBC,CAAS,CAAC,CAClC,CAAC;AAAA,IAEN;AAAA,IACAoC,iBAAiBpC,GAAWqC,GAAW;AACrChB,MAAAA,EAAAA,GACA3B,EAAAA;AACA,iBAAWxC,KAAS,KAAKgF,aAAalC,CAAS,KAAK,CAAA,GAAI;AACtD,cAAMvC,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,CAAK,GACrEqC,IAAYlB,EAAmCF,GAASV,CAAG;AACjE,YAAI8B,GAAWC,YAAYuC,EAA0B;AACrD,cAAMC,IAASK,EAAU9C,EAAUyC,QAAQ9E,CAAK;AAChD,YAAI,CAAC8E,GAAQ;AACX7D,UAAAA,EAAQH,aAAaP,CAAG;AACxB;AAAA,QACF;AACAU,QAAAA,EAAQN,QACNJ,GACAc,KAAKoB,UAAU;AAAA,UAAEH,SAASuC;AAAAA,UAA0BC,QAAAA;AAAAA,QAAAA,CAA6C,CACnG;AAAA,MACF;AAAA,IACF;AAAA,IACAM,wBAAyB7E,OACvBY,EAAiBF,GAASpB,EAA+B2B,EAAM1B,WAAW,wBAAwBS,CAAG,CAAC;AAAA,IACxG8E,wBAAwBA,CAAC9E,GAAKK,MAAU;AACtC4B,MAAAA,EAAAA,GACAvB,EAAQN,QACNd,EAA+B2B,EAAM1B,WAAW,wBAAwBS,CAAG,GAC3Ec,KAAKoB,UAAU7B,CAAK,CACtB;AAAA,IACF;AAAA,IACA0E,wBAAwB9C;AAAAA,IACxB+C,UAAU;AACRpB,MAAAA,EAAAA,GACAxC,GAAaK,oBAAoB,YAAYmC,CAAK;AAAA,IACpD;AAAA,EAAA;AAEJ,GCnLaqB,IAAuCA,CAClDhE,MACgC;AAChC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO;AAC5C,SAAO;AAAA,IACLwE,YAAazF,OACXmB,EAAoCF,GAASpB,EAA+B2B,EAAM1B,WAAW,WAAWE,CAAK,CAAC;AAAA,IAChH0F,YAAYA,CAACC,GAAS3F,MAAU;AAC9BiB,MAAAA,EAAQN,QAAQd,EAA+B2B,EAAM1B,WAAW,WAAWE,CAAK,GAAGqB,KAAKoB,UAAUkD,CAAO,CAAC;AAAA,IAC5G;AAAA,EAAA;AAEJ,GAEaC,IAAsCA,CACjDpE,MACsC;AACtC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO;AAC5C,SAAO;AAAA,IACL4E,gBAAiB7F,CAAAA,MACfmB,EACEF,GACApB,EAA+B2B,EAAM1B,WAAW,UAAUE,KAASwB,EAAMxB,KAAK,CAChF;AAAA,IACF8F,gBAAgBA,CAACC,GAAO/F,MAAU;AAChC,YAAMO,IAAMV,EAA+B2B,EAAM1B,WAAW,UAAUE,KAASwB,EAAMxB,KAAK;AAC1FiB,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUsD,CAAK,CAAC;AAAA,IAC5C;AAAA,EAAA;AAEJ,GAEaC,IAAoCA,CAC/CxE,MACmC;AACnC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCV,IAAMV,EAA+B2B,EAAM1B,WAAW,QAAQ0B,EAAMxB,KAAK;AAC/E,SAAO;AAAA,IACLiG,eAAeA,MAAM9E,EAAsCF,GAASV,CAAG;AAAA,IACvE2F,eAAgBH,CAAAA,MAAU;AACxB9E,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUsD,CAAK,CAAC;AAAA,IAC5C;AAAA,EAAA;AAEJ,GAMMI,IAAgBA,CAACvF,MACrBwF,EAAQxF,KAAU,OAAQA,EAAsBb,QAAS,YAAY,OAAQa,EAAsByF,OAAQ,UAEhGC,IAA4CA,CACvD9E,MACmC;AACnC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCV,IAAMV,EAA+B2B,EAAM1B,WAAW,iBAAiB0B,EAAMxB,KAAK;AACxF,SAAO;AAAA,IACLuG,iBAAiBA,MAAM;AACrB,YAAMC,IAASrF,EAAkBF,GAASV,CAAG;AAC7C,aAAO4F,EAAcK,CAAM,IAAIA,IAASvE;AAAAA,IAC1C;AAAA,IACAwE,iBAAkBC,CAAAA,MAAa;AAC7B,UAAI,CAACA,GAAU;AACbzF,QAAAA,EAAQH,aAAaP,CAAG;AACxB;AAAA,MACF;AACAU,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUiE,CAAQ,CAAC;AAAA,IAC/C;AAAA,EAAA;AAEJ;AAQA,MAAMC,IAAoD,CAAC,YAAY,UAAU,UAAU,GAM9EC,IAAyCA,CACpDpF,MACyC;AACzC,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCV,IAAMV,EAA+B2B,EAAM1B,WAAW,cAAc0B,EAAMxB,KAAK;AACrF,SAAO;AAAA,IACL6G,SAASA,MAAM;AACb,YAAMxE,IAAYlB,EAAsCF,GAASV,CAAG;AACpE,UAAI8B,GAAWC,YAAYwE;AAC3B,eAAOH,EAAeI,SAAS1E,EAAU2E,IAAI,IAAI3E,EAAU2E,OAAO/E;AAAAA,IACpE;AAAA,IACAgF,SAAUD,CAAAA,MAAS;AACjB,YAAM3E,IAAyC;AAAA,QAAEC,SAASwE;AAAAA,QAA8BE,MAAAA;AAAAA,MAAAA;AACxF/F,MAAAA,EAAQN,QAAQJ,GAAKc,KAAKoB,UAAUJ,CAAS,CAAC;AAAA,IAChD;AAAA,EAAA;AAEJ,GAEa6E,IAAyCA,CAAC1F,MAAuD;AAC5G,QAAMP,IAAUD,EAAeQ,EAAMP,OAAO,GACtCkG,IAAoB5F,EAAoC;AAAA,IAC5DG,YAAYF,EAAME;AAAAA,IAClBC,aAAaH,EAAMG;AAAAA,IACnB7B,WAAW0B,EAAM1B;AAAAA,IACjBmB,SAAAA;AAAAA,EAAAA,CACD;AAWD,SAAO;AAAA,IACLmG,qBAXuD;AAAA,MACvDC,aAAcrH,CAAAA,MAAU;AACtB,cAAM8E,IAASqC,EAAkBxC,UAAU3E,CAAK;AAChD,eAAO8E,IAAS;AAAA,UAAEA,QAAAA;AAAAA,QAAAA,IAAW7C;AAAAA,MAC/B;AAAA,MACAqF,aAAaA,CAACC,GAAUvH,MAAUmH,EAAkBpC,UAAUwC,EAASzC,QAAQ9E,CAAK;AAAA,MACpFmE,OAAOgD,EAAkBhD;AAAAA,MACzBoB,SAAS4B,EAAkB5B;AAAAA,IAAAA;AAAAA,IAK3BiC,oBAAoBhC,EAAqC;AAAA,MAAE1F,WAAW0B,EAAM1B;AAAAA,MAAWmB,SAAAA;AAAAA,IAAAA,CAAS;AAAA,IAChGkG,mBAAAA;AAAAA,IACAM,mBAAmB7B,EAAoC;AAAA,MACrD9F,WAAW0B,EAAM1B;AAAAA,MACjBE,OAAOwB,EAAMxB,SAAS;AAAA,MACtBiB,SAAAA;AAAAA,IAAAA,CACD;AAAA,IACDyG,iBAAiB1B,EAAkC;AAAA,MAAElG,WAAW0B,EAAM1B;AAAAA,MAAWE,OAAOwB,EAAMxB;AAAAA,MAAOiB,SAAAA;AAAAA,IAAAA,CAAS;AAAA,IAC9G0G,yBAAyBrB,EAA0C;AAAA,MACjExG,WAAW0B,EAAM1B;AAAAA,MACjBE,OAAOwB,EAAMxB;AAAAA,MACbiB,SAAAA;AAAAA,IAAAA,CACD;AAAA,IACD2G,sBAAsBhB,EAAuC;AAAA,MAC3D9G,WAAW0B,EAAM1B;AAAAA,MACjBE,OAAOwB,EAAMxB;AAAAA,MACbiB,SAAAA;AAAAA,IAAAA,CACD;AAAA,EAAA;AAEL;"}
|