@pstdio/workbench 0.6.0 → 0.7.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/dist/extensions.d.ts +36 -1
- package/dist/extensions.js +4 -0
- package/dist/extensions.js.map +1 -1
- package/dist/file-renderer-view-B6_iR4EN.js +496 -0
- package/dist/file-renderer-view-B6_iR4EN.js.map +1 -0
- package/dist/index.d.ts +37 -2
- package/dist/index.js +267 -259
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +49 -3
- package/dist/react.js +2267 -2143
- package/dist/react.js.map +1 -1
- package/dist/testing.d.ts +36 -1
- package/dist/{workbench-built-ins-BtgeB274.js → workbench-built-ins-BncLJfQA.js} +382 -378
- package/dist/workbench-built-ins-BncLJfQA.js.map +1 -0
- package/package.json +4 -4
- package/dist/file-renderer-view-zpunbE4I.js +0 -432
- package/dist/file-renderer-view-zpunbE4I.js.map +0 -1
- package/dist/workbench-built-ins-BtgeB274.js.map +0 -1
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { jsx as g, jsxs as U } from "react/jsx-runtime";
|
|
2
|
+
import { c as ie } from "react/compiler-runtime";
|
|
3
|
+
import { Image as Ne, Box as me, Flex as B, Center as ne, Text as oe, Button as Ie, Spinner as _e } from "@chakra-ui/react";
|
|
4
|
+
import { useState as ue, useRef as K, useEffect as re, useLayoutEffect as ke } from "react";
|
|
5
|
+
import { g as Fe, r as je, s as Le } from "./file-section-navigation-CfYqVObc.js";
|
|
6
|
+
import { EmptyState as Te, useFileIconThemePreference as Ue, resolveFileIconElement as He, Header as Oe } from "@pstdio/ui";
|
|
7
|
+
import { CodeEditor as Pe } from "@pstdio/ui/diff";
|
|
8
|
+
import { MarkdownEditor as $e } from "@pstdio/ui/rich-text";
|
|
9
|
+
const Ae = /* @__PURE__ */ new Set(["png", "jpg", "jpeg", "gif", "webp", "svg", "avif", "bmp", "ico"]), Be = /* @__PURE__ */ new Set(["md", "markdown", "txt"]), Ee = {
|
|
10
|
+
ts: "typescript",
|
|
11
|
+
tsx: "typescript",
|
|
12
|
+
js: "javascript",
|
|
13
|
+
jsx: "javascript",
|
|
14
|
+
mjs: "javascript",
|
|
15
|
+
cjs: "javascript",
|
|
16
|
+
json: "json",
|
|
17
|
+
jsonc: "json",
|
|
18
|
+
py: "python",
|
|
19
|
+
rb: "ruby",
|
|
20
|
+
rs: "rust",
|
|
21
|
+
go: "go",
|
|
22
|
+
java: "java",
|
|
23
|
+
kt: "kotlin",
|
|
24
|
+
c: "c",
|
|
25
|
+
h: "c",
|
|
26
|
+
cpp: "cpp",
|
|
27
|
+
cc: "cpp",
|
|
28
|
+
hpp: "cpp",
|
|
29
|
+
cs: "csharp",
|
|
30
|
+
php: "php",
|
|
31
|
+
swift: "swift",
|
|
32
|
+
sh: "shell",
|
|
33
|
+
bash: "shell",
|
|
34
|
+
zsh: "shell",
|
|
35
|
+
sql: "sql",
|
|
36
|
+
css: "css",
|
|
37
|
+
scss: "scss",
|
|
38
|
+
less: "less",
|
|
39
|
+
html: "html",
|
|
40
|
+
xml: "xml",
|
|
41
|
+
yml: "yaml",
|
|
42
|
+
yaml: "yaml",
|
|
43
|
+
toml: "ini",
|
|
44
|
+
ini: "ini",
|
|
45
|
+
dockerfile: "dockerfile",
|
|
46
|
+
graphql: "graphql",
|
|
47
|
+
gql: "graphql",
|
|
48
|
+
md: "markdown",
|
|
49
|
+
markdown: "markdown",
|
|
50
|
+
txt: "plaintext"
|
|
51
|
+
}, ge = (t) => {
|
|
52
|
+
if (!t) return "";
|
|
53
|
+
const e = t.lastIndexOf(".");
|
|
54
|
+
return e < 0 || e === t.length - 1 ? "" : t.slice(e + 1).toLowerCase();
|
|
55
|
+
}, Ke = (t, e) => e?.startsWith("image/") ? !0 : Ae.has(ge(t)), qe = (t, e) => {
|
|
56
|
+
if (Ke(t, e)) return "image";
|
|
57
|
+
const r = ge(t);
|
|
58
|
+
return !Be.has(r) && r in Ee ? "code" : "markdown";
|
|
59
|
+
}, De = (t) => Ee[ge(t)] ?? "plaintext", Me = (t, e) => {
|
|
60
|
+
if (t.emptyState) return {
|
|
61
|
+
kind: "empty",
|
|
62
|
+
isEditable: !1
|
|
63
|
+
};
|
|
64
|
+
const r = qe(t.fileName, t.mimeType);
|
|
65
|
+
if (r === "image") return {
|
|
66
|
+
kind: "image",
|
|
67
|
+
isEditable: !1
|
|
68
|
+
};
|
|
69
|
+
const i = e && t.editable !== !1;
|
|
70
|
+
return r === "code" || t.textRenderer === "monaco" ? {
|
|
71
|
+
kind: "code",
|
|
72
|
+
isEditable: i,
|
|
73
|
+
language: De(t.fileName)
|
|
74
|
+
} : {
|
|
75
|
+
kind: "markdown",
|
|
76
|
+
isEditable: i
|
|
77
|
+
};
|
|
78
|
+
}, Ve = (t) => {
|
|
79
|
+
const e = ie(40), {
|
|
80
|
+
content: r,
|
|
81
|
+
editorKey: i,
|
|
82
|
+
errorNotice: n,
|
|
83
|
+
contributionCanSave: o,
|
|
84
|
+
onActiveSectionChange: d,
|
|
85
|
+
onChange: I,
|
|
86
|
+
rendererRef: f,
|
|
87
|
+
sectionNavigation: u,
|
|
88
|
+
title: j
|
|
89
|
+
} = t;
|
|
90
|
+
let w;
|
|
91
|
+
e[0] !== r || e[1] !== o ? (w = Me(r, o), e[0] = r, e[1] = o, e[2] = w) : w = e[2];
|
|
92
|
+
const b = w;
|
|
93
|
+
if (b.kind === "empty") {
|
|
94
|
+
const E = r.emptyState?.title ?? "Select a file", p = r.emptyState?.description;
|
|
95
|
+
let c;
|
|
96
|
+
e[3] !== E || e[4] !== p ? (c = /* @__PURE__ */ g(Te, { flex: "1", minH: "0", title: E, description: p }), e[3] = E, e[4] = p, e[5] = c) : c = e[5];
|
|
97
|
+
let h;
|
|
98
|
+
return e[6] !== n || e[7] !== c ? (h = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
|
|
99
|
+
n,
|
|
100
|
+
c
|
|
101
|
+
] }), e[6] = n, e[7] = c, e[8] = h) : h = e[8], h;
|
|
102
|
+
}
|
|
103
|
+
if (b.kind === "image") {
|
|
104
|
+
if (!r.dataUrl) {
|
|
105
|
+
let x;
|
|
106
|
+
return e[9] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (x = /* @__PURE__ */ g(ne, { h: "full", minH: "0", bg: "bg", p: "md", children: /* @__PURE__ */ g(oe, { color: "fg.muted", children: "This image preview is unavailable." }) }), e[9] = x) : x = e[9], x;
|
|
107
|
+
}
|
|
108
|
+
const E = r.fileName ?? j;
|
|
109
|
+
let p;
|
|
110
|
+
e[10] !== r.dataUrl || e[11] !== E ? (p = /* @__PURE__ */ g(Ne, { src: r.dataUrl, alt: E, maxW: "100%", maxH: "100%", objectFit: "contain" }), e[10] = r.dataUrl, e[11] = E, e[12] = p) : p = e[12];
|
|
111
|
+
let c;
|
|
112
|
+
e[13] !== f || e[14] !== p ? (c = /* @__PURE__ */ g(ne, { ref: f, flex: "1", minH: "0", p: "md", overflow: "auto", children: p }), e[13] = f, e[14] = p, e[15] = c) : c = e[15];
|
|
113
|
+
let h;
|
|
114
|
+
return e[16] !== n || e[17] !== c ? (h = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
|
|
115
|
+
n,
|
|
116
|
+
c
|
|
117
|
+
] }), e[16] = n, e[17] = c, e[18] = h) : h = e[18], h;
|
|
118
|
+
}
|
|
119
|
+
if (b.kind === "code") {
|
|
120
|
+
const E = r.content ?? "", p = b.isEditable ? I : void 0;
|
|
121
|
+
let c;
|
|
122
|
+
e[19] !== i || e[20] !== b.isEditable || e[21] !== b.language || e[22] !== E || e[23] !== p ? (c = /* @__PURE__ */ g(me, { flex: "1", minH: "0", children: /* @__PURE__ */ g(Pe, { language: b.language, defaultCode: E, isEditable: b.isEditable, showLineNumbers: !0, onChange: p }, i) }), e[19] = i, e[20] = b.isEditable, e[21] = b.language, e[22] = E, e[23] = p, e[24] = c) : c = e[24];
|
|
123
|
+
let h;
|
|
124
|
+
return e[25] !== n || e[26] !== c ? (h = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
|
|
125
|
+
n,
|
|
126
|
+
c
|
|
127
|
+
] }), e[25] = n, e[26] = c, e[27] = h) : h = e[27], h;
|
|
128
|
+
}
|
|
129
|
+
const k = r.content ?? "", S = b.isEditable ? r.placeholder ?? "Write…" : void 0, C = b.isEditable ? I : void 0;
|
|
130
|
+
let N;
|
|
131
|
+
e[28] !== i || e[29] !== d || e[30] !== b.isEditable || e[31] !== u || e[32] !== k || e[33] !== S || e[34] !== C ? (N = /* @__PURE__ */ g(me, { flex: "1", minH: "0", overflowY: "auto", children: /* @__PURE__ */ g($e, { defaultState: k, isEditable: b.isEditable, sectionNavigation: u, placeholder: S, onActiveSectionChange: d, onChange: C }, i) }), e[28] = i, e[29] = d, e[30] = b.isEditable, e[31] = u, e[32] = k, e[33] = S, e[34] = C, e[35] = N) : N = e[35];
|
|
132
|
+
let v;
|
|
133
|
+
return e[36] !== n || e[37] !== f || e[38] !== N ? (v = /* @__PURE__ */ U(B, { ref: f, direction: "column", h: "full", minH: "0", overflow: "hidden", bg: "bg", children: [
|
|
134
|
+
n,
|
|
135
|
+
N
|
|
136
|
+
] }), e[36] = n, e[37] = f, e[38] = N, e[39] = v) : v = e[39], v;
|
|
137
|
+
}, ze = (t) => {
|
|
138
|
+
let e, r, i = null, n = null, o, d, I = !1, f = null, u = 0;
|
|
139
|
+
const j = /* @__PURE__ */ new Set(), w = /* @__PURE__ */ new Set(), b = (l) => l instanceof Error ? l.message : "Failed to save file.", k = () => ({
|
|
140
|
+
dirty: i !== null || n !== null && n.value !== e,
|
|
141
|
+
saving: n !== null,
|
|
142
|
+
...o ? {
|
|
143
|
+
saveError: o
|
|
144
|
+
} : {}
|
|
145
|
+
}), S = () => t.onStateChange?.(k()), C = () => {
|
|
146
|
+
f !== null && (clearTimeout(f), f = null);
|
|
147
|
+
}, N = () => t.createOperationId?.() ?? `file-save-${Date.now()}-${++u}`, v = () => i !== null || n !== null || f !== null || !!o, E = (l) => {
|
|
148
|
+
l.revision && (!d || l.revision.localeCompare(d) > 0) && (d = l.revision), l.revision || (I = !0);
|
|
149
|
+
}, p = (l) => {
|
|
150
|
+
const a = l.origin?.operationId;
|
|
151
|
+
return !a || l.origin?.rendererId !== t.binding.rendererId || l.origin.instanceId !== t.binding.instanceId ? !1 : n?.origin.operationId === a || w.has(a);
|
|
152
|
+
}, c = (l) => {
|
|
153
|
+
if (i !== null || n) return;
|
|
154
|
+
const a = d, _ = I;
|
|
155
|
+
if (d = void 0, I = !1, a && (!l || a.localeCompare(l) > 0)) {
|
|
156
|
+
t.load({
|
|
157
|
+
resourceUri: t.binding.resourceUri,
|
|
158
|
+
revision: a
|
|
159
|
+
});
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
_ && t.load({
|
|
163
|
+
resourceUri: t.binding.resourceUri
|
|
164
|
+
});
|
|
165
|
+
}, h = () => {
|
|
166
|
+
if (i === null || n || o) return;
|
|
167
|
+
const l = i;
|
|
168
|
+
i = null;
|
|
169
|
+
const a = {
|
|
170
|
+
rendererId: t.binding.rendererId,
|
|
171
|
+
instanceId: t.binding.instanceId,
|
|
172
|
+
operationId: N()
|
|
173
|
+
};
|
|
174
|
+
n = {
|
|
175
|
+
value: l,
|
|
176
|
+
origin: a
|
|
177
|
+
}, S(), Promise.resolve(t.save(l, a)).then((_) => {
|
|
178
|
+
if (n?.origin.operationId === a.operationId) {
|
|
179
|
+
if (n = null, w.add(a.operationId), w.size > 20 && w.delete(w.values().next().value), e = l, r = _?.revision ?? r, i === e && (i = null, C()), S(), i !== null) {
|
|
180
|
+
x();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
c(_?.revision);
|
|
184
|
+
}
|
|
185
|
+
}).catch((_) => {
|
|
186
|
+
n?.origin.operationId === a.operationId && (n = null, i === null && (i = l), o = b(_), S());
|
|
187
|
+
});
|
|
188
|
+
}, x = () => {
|
|
189
|
+
C(), f = setTimeout(() => {
|
|
190
|
+
f = null, h();
|
|
191
|
+
}, t.debounceMs);
|
|
192
|
+
};
|
|
193
|
+
return {
|
|
194
|
+
getBaseline() {
|
|
195
|
+
return e;
|
|
196
|
+
},
|
|
197
|
+
getState: k,
|
|
198
|
+
setBaseline(l, a) {
|
|
199
|
+
e = l, r = a, S();
|
|
200
|
+
},
|
|
201
|
+
acceptLoaded(l, a) {
|
|
202
|
+
return v() ? (E(a ? {
|
|
203
|
+
revision: a
|
|
204
|
+
} : {}), !1) : (e = l, r = a, S(), !0);
|
|
205
|
+
},
|
|
206
|
+
handleChange(l) {
|
|
207
|
+
if (!(o && l === i)) {
|
|
208
|
+
if (o = void 0, l === e && !n) {
|
|
209
|
+
i = null, C(), S();
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (n?.value === l) {
|
|
213
|
+
i = null, C(), S();
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
i = l, x(), S();
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
handleRefreshEvent(l = {}) {
|
|
220
|
+
if (!(l.resourceUri && l.resourceUri !== t.binding.resourceUri) && !p(l) && !(l.revision && j.has(l.revision))) {
|
|
221
|
+
if (l.revision && j.add(l.revision), v()) {
|
|
222
|
+
E(l);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
l.revision && r && l.revision.localeCompare(r) <= 0 || t.load(l);
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
retry() {
|
|
229
|
+
!o || i === null || n || (o = void 0, S(), h());
|
|
230
|
+
},
|
|
231
|
+
retryLoad() {
|
|
232
|
+
t.load({
|
|
233
|
+
resourceUri: t.binding.resourceUri
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
flush() {
|
|
237
|
+
C(), h();
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
}, We = (t, e, r, i) => !t || t.loadKey !== r ? 1 : (i ?? t.content) === e.content && t.dataUrl === e.dataUrl ? t.editorRevision : t.editorRevision + 1, Ye = 30, A = /* @__PURE__ */ new Map(), pe = (t) => A.get(t), Se = (t, e) => {
|
|
241
|
+
if (A.delete(t), A.set(t, e), A.size <= Ye) return;
|
|
242
|
+
const r = A.keys().next().value;
|
|
243
|
+
r !== void 0 && A.delete(r);
|
|
244
|
+
}, ye = (t) => {
|
|
245
|
+
const e = ie(7), {
|
|
246
|
+
message: r,
|
|
247
|
+
onRetry: i
|
|
248
|
+
} = t;
|
|
249
|
+
let n;
|
|
250
|
+
e[0] !== r ? (n = /* @__PURE__ */ g(oe, { color: "fg.muted", textStyle: "label/S/regular", children: r }), e[0] = r, e[1] = n) : n = e[1];
|
|
251
|
+
let o;
|
|
252
|
+
e[2] !== i ? (o = /* @__PURE__ */ g(Ie, { size: "2xs", variant: "subtle", onClick: i, children: "Retry" }), e[2] = i, e[3] = o) : o = e[3];
|
|
253
|
+
let d;
|
|
254
|
+
return e[4] !== n || e[5] !== o ? (d = /* @__PURE__ */ U(B, { flex: "none", alignItems: "center", justifyContent: "space-between", gap: "sm", borderBottomWidth: "1px", borderColor: "border.muted", bg: "bg.muted", px: "sm", py: "xs", children: [
|
|
255
|
+
n,
|
|
256
|
+
o
|
|
257
|
+
] }), e[4] = n, e[5] = o, e[6] = d) : d = e[6], d;
|
|
258
|
+
}, he = (t) => Array.isArray(t) ? t.map(he) : !t || typeof t != "object" ? t : Object.fromEntries(Object.entries(t).sort(([e], [r]) => e.localeCompare(r)).map(([e, r]) => [e, he(r)])), Ge = (t) => {
|
|
259
|
+
const {
|
|
260
|
+
fileRendererId: e,
|
|
261
|
+
resource: r
|
|
262
|
+
} = t, i = r ? he({
|
|
263
|
+
id: r.id,
|
|
264
|
+
kind: r.kind,
|
|
265
|
+
metadata: r.metadata,
|
|
266
|
+
uri: r.uri
|
|
267
|
+
}) : null;
|
|
268
|
+
return `${e}:${JSON.stringify(i)}`;
|
|
269
|
+
}, Xe = (t, e) => t?.loadKey === e, Je = (t) => {
|
|
270
|
+
const e = ie(9), {
|
|
271
|
+
fileName: r,
|
|
272
|
+
filePath: i
|
|
273
|
+
} = t, {
|
|
274
|
+
activeFileIconTheme: n
|
|
275
|
+
} = Ue();
|
|
276
|
+
let o;
|
|
277
|
+
e[0] !== n || e[1] !== r ? (o = He(r, {
|
|
278
|
+
theme: n
|
|
279
|
+
}), e[0] = n, e[1] = r, e[2] = o) : o = e[2];
|
|
280
|
+
const d = `File path ${i}`;
|
|
281
|
+
let I;
|
|
282
|
+
e[3] !== i || e[4] !== d ? (I = /* @__PURE__ */ g(oe, { "aria-label": d, textStyle: "label/S/regular", color: "fg.muted", truncate: !0, children: i }), e[3] = i, e[4] = d, e[5] = I) : I = e[5];
|
|
283
|
+
let f;
|
|
284
|
+
return e[6] !== o || e[7] !== I ? (f = /* @__PURE__ */ U(Oe, { variant: "narrow", flexShrink: 0, gap: "2xs", bg: "bg", children: [
|
|
285
|
+
o,
|
|
286
|
+
I
|
|
287
|
+
] }), e[6] = o, e[7] = I, e[8] = f) : f = e[8], f;
|
|
288
|
+
}, Qe = 600, Ze = (t) => t instanceof Error ? t.message : "Failed to load file.", et = (t) => {
|
|
289
|
+
const {
|
|
290
|
+
workbench: e,
|
|
291
|
+
navigation: r,
|
|
292
|
+
sectionId: i
|
|
293
|
+
} = t;
|
|
294
|
+
if (!r || !e.renderers.getTreeRenderer(r.treeId)) return;
|
|
295
|
+
if (i && r.anchors.some((o) => o.id === i)) {
|
|
296
|
+
e.renderers.setSelectedNode(r.treeId, i);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const n = e.renderers.getTreeState(r.treeId).selectedNodeId;
|
|
300
|
+
n && r.anchors.some((o) => o.id === n) && e.renderers.setSelectedNode(r.treeId, void 0);
|
|
301
|
+
}, tt = (t, e) => {
|
|
302
|
+
if (!e) return;
|
|
303
|
+
const r = t.renderers.getTreeRenderer(e.treeId) ? t.renderers.getTreeState(e.treeId).selectedNodeId : void 0;
|
|
304
|
+
return {
|
|
305
|
+
anchors: e.anchors,
|
|
306
|
+
targetId: je(e, r)
|
|
307
|
+
};
|
|
308
|
+
}, ft = (t) => {
|
|
309
|
+
const e = ie(69), {
|
|
310
|
+
workbench: r,
|
|
311
|
+
contribution: i
|
|
312
|
+
} = t, n = t.placement?.resource;
|
|
313
|
+
let o, d;
|
|
314
|
+
e[0] !== n || e[1] !== r ? (o = Fe(n), d = tt(r, o), e[0] = n, e[1] = r, e[2] = o, e[3] = d) : (o = e[2], d = e[3]);
|
|
315
|
+
const I = d;
|
|
316
|
+
let f;
|
|
317
|
+
e[4] !== i.id || e[5] !== n ? (f = Ge({
|
|
318
|
+
fileRendererId: i.id,
|
|
319
|
+
resource: n
|
|
320
|
+
}), e[4] = i.id, e[5] = n, e[6] = f) : f = e[6];
|
|
321
|
+
const u = f, [j, w] = ue(null), [b, k] = ue(null);
|
|
322
|
+
let S;
|
|
323
|
+
e[7] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (S = {
|
|
324
|
+
dirty: !1,
|
|
325
|
+
saving: !1
|
|
326
|
+
}, e[7] = S) : S = e[7];
|
|
327
|
+
const [C, N] = ue(S), v = K(null), E = K(null), p = K(null);
|
|
328
|
+
let c;
|
|
329
|
+
e[8] !== n?.uri || e[9] !== o || e[10] !== r.renderers ? (c = () => {
|
|
330
|
+
const s = p.current, m = s && r.renderers.getTreeRenderer(s.treeId) ? r.renderers.getTreeState(s.treeId).selectedNodeId : void 0;
|
|
331
|
+
Le({
|
|
332
|
+
previous: s,
|
|
333
|
+
current: o,
|
|
334
|
+
currentResourceUri: n?.uri,
|
|
335
|
+
selectedNodeId: m
|
|
336
|
+
}) && s && r.renderers.setSelectedNode(s.treeId, void 0), p.current = o ? {
|
|
337
|
+
resourceUri: n?.uri,
|
|
338
|
+
treeId: o.treeId,
|
|
339
|
+
anchorIds: o.anchors.map(rt)
|
|
340
|
+
} : null;
|
|
341
|
+
}, e[8] = n?.uri, e[9] = o, e[10] = r.renderers, e[11] = c) : c = e[11];
|
|
342
|
+
const h = n?.uri;
|
|
343
|
+
let x;
|
|
344
|
+
e[12] !== o || e[13] !== h || e[14] !== r ? (x = [h, o, r], e[12] = o, e[13] = h, e[14] = r, e[15] = x) : x = e[15], re(c, x);
|
|
345
|
+
const l = K(i), a = K(n);
|
|
346
|
+
let _;
|
|
347
|
+
e[16] !== i || e[17] !== n ? (_ = () => {
|
|
348
|
+
l.current = i, a.current = n;
|
|
349
|
+
}, e[16] = i, e[17] = n, e[18] = _) : _ = e[18], re(_);
|
|
350
|
+
const L = i.id, H = !!i.save;
|
|
351
|
+
let q;
|
|
352
|
+
e[19] !== L || e[20] !== H || e[21] !== u || e[22] !== t.placement?.instanceId || e[23] !== r.renderers ? (q = () => {
|
|
353
|
+
let s = !1;
|
|
354
|
+
k(null);
|
|
355
|
+
const m = pe(u);
|
|
356
|
+
w(m ? {
|
|
357
|
+
...m,
|
|
358
|
+
editorRevision: 1,
|
|
359
|
+
loadKey: u
|
|
360
|
+
} : null);
|
|
361
|
+
const F = () => {
|
|
362
|
+
Promise.resolve(l.current.load(a.current)).then((R) => {
|
|
363
|
+
if (s || v.current && !v.current.acceptLoaded(R.content, R.revision))
|
|
364
|
+
return;
|
|
365
|
+
k(null), Se(u, R);
|
|
366
|
+
const $ = v.current?.getBaseline();
|
|
367
|
+
w((fe) => ({
|
|
368
|
+
...R,
|
|
369
|
+
editorRevision: We(fe, R, u, $),
|
|
370
|
+
loadKey: u
|
|
371
|
+
}));
|
|
372
|
+
}).catch((R) => {
|
|
373
|
+
s || k({
|
|
374
|
+
loadKey: u,
|
|
375
|
+
message: Ze(R)
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
};
|
|
379
|
+
v.current = H ? ze({
|
|
380
|
+
binding: {
|
|
381
|
+
rendererId: L,
|
|
382
|
+
instanceId: t.placement?.instanceId ?? L,
|
|
383
|
+
resourceUri: a.current?.uri
|
|
384
|
+
},
|
|
385
|
+
debounceMs: Qe,
|
|
386
|
+
load: F,
|
|
387
|
+
onStateChange: (R) => {
|
|
388
|
+
s || N(R);
|
|
389
|
+
},
|
|
390
|
+
save: (R, $) => Promise.resolve(l.current.save?.(a.current, R, $)).then((fe) => {
|
|
391
|
+
const ve = pe(u);
|
|
392
|
+
return ve && Se(u, {
|
|
393
|
+
...ve,
|
|
394
|
+
content: R
|
|
395
|
+
}), fe ?? void 0;
|
|
396
|
+
})
|
|
397
|
+
}) : null, m && v.current?.setBaseline(m.content, m.revision), N({
|
|
398
|
+
dirty: !1,
|
|
399
|
+
saving: !1
|
|
400
|
+
}), F();
|
|
401
|
+
const xe = r.renderers.onDidRefreshFileRenderer((R) => {
|
|
402
|
+
if (R.fileRendererId !== L)
|
|
403
|
+
return;
|
|
404
|
+
const $ = v.current;
|
|
405
|
+
$ ? $.handleRefreshEvent(R) : F();
|
|
406
|
+
});
|
|
407
|
+
return () => {
|
|
408
|
+
s = !0, xe.dispose(), v.current?.flush(), v.current = null;
|
|
409
|
+
};
|
|
410
|
+
}, e[19] = L, e[20] = H, e[21] = u, e[22] = t.placement?.instanceId, e[23] = r.renderers, e[24] = q) : q = e[24];
|
|
411
|
+
const le = t.placement?.instanceId;
|
|
412
|
+
let D;
|
|
413
|
+
e[25] !== L || e[26] !== H || e[27] !== u || e[28] !== le || e[29] !== r ? (D = [L, H, r, u, le], e[25] = L, e[26] = H, e[27] = u, e[28] = le, e[29] = r, e[30] = D) : D = e[30], re(q, D);
|
|
414
|
+
let M, V;
|
|
415
|
+
e[31] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (M = () => {
|
|
416
|
+
const s = () => v.current?.flush(), m = () => {
|
|
417
|
+
document.visibilityState === "hidden" && s();
|
|
418
|
+
};
|
|
419
|
+
return window.addEventListener("beforeunload", s), document.addEventListener("visibilitychange", m), () => {
|
|
420
|
+
window.removeEventListener("beforeunload", s), document.removeEventListener("visibilitychange", m);
|
|
421
|
+
};
|
|
422
|
+
}, V = [], e[31] = M, e[32] = V) : (M = e[31], V = e[32]), re(M, V);
|
|
423
|
+
let z;
|
|
424
|
+
e[33] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (z = (s) => {
|
|
425
|
+
v.current?.handleChange(s);
|
|
426
|
+
}, e[33] = z) : z = e[33];
|
|
427
|
+
const Re = z;
|
|
428
|
+
let W;
|
|
429
|
+
e[34] !== u || e[35] !== j ? (W = Xe(j, u) ? j : null, e[34] = u, e[35] = j, e[36] = W) : W = e[36];
|
|
430
|
+
const y = W, Y = y ? `${y.loadKey}:${y.editorRevision}` : "";
|
|
431
|
+
let G, X;
|
|
432
|
+
e[37] !== Y || e[38] !== o ? (G = () => {
|
|
433
|
+
if (!Y || o)
|
|
434
|
+
return;
|
|
435
|
+
const s = E.current;
|
|
436
|
+
s && requestAnimationFrame(() => {
|
|
437
|
+
let m = s.parentElement;
|
|
438
|
+
for (; m; ) {
|
|
439
|
+
const F = getComputedStyle(m).overflowY;
|
|
440
|
+
["auto", "scroll", "overlay"].includes(F) && m.scrollHeight > m.clientHeight && (m.scrollTop = 0), m = m.parentElement;
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
}, X = [Y, o], e[37] = Y, e[38] = o, e[39] = G, e[40] = X) : (G = e[39], X = e[40]), ke(G, X);
|
|
444
|
+
const T = b?.loadKey === u ? b.message : void 0;
|
|
445
|
+
let J;
|
|
446
|
+
e[41] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (J = () => v.current?.retryLoad(), e[41] = J) : J = e[41];
|
|
447
|
+
const be = J;
|
|
448
|
+
let Q;
|
|
449
|
+
e[42] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (Q = () => v.current?.retry(), e[42] = Q) : Q = e[42];
|
|
450
|
+
const Ce = Q;
|
|
451
|
+
if (T && !y) {
|
|
452
|
+
let s;
|
|
453
|
+
e[43] !== T ? (s = /* @__PURE__ */ g(oe, { color: "fg.muted", children: T }), e[43] = T, e[44] = s) : s = e[44];
|
|
454
|
+
let m;
|
|
455
|
+
e[45] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (m = /* @__PURE__ */ g(Ie, { size: "xs", variant: "subtle", onClick: be, children: "Retry" }), e[45] = m) : m = e[45];
|
|
456
|
+
let F;
|
|
457
|
+
return e[46] !== s ? (F = /* @__PURE__ */ U(ne, { h: "full", minH: "0", bg: "bg", p: "md", flexDirection: "column", gap: "sm", children: [
|
|
458
|
+
s,
|
|
459
|
+
m
|
|
460
|
+
] }), e[46] = s, e[47] = F) : F = e[47], F;
|
|
461
|
+
}
|
|
462
|
+
if (!y) {
|
|
463
|
+
let s;
|
|
464
|
+
return e[48] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (s = /* @__PURE__ */ g(ne, { h: "full", minH: "0", bg: "bg", children: /* @__PURE__ */ g(_e, { size: "sm" }) }), e[48] = s) : s = e[48], s;
|
|
465
|
+
}
|
|
466
|
+
const se = `${y.loadKey}:${y.editorRevision}`;
|
|
467
|
+
let Z;
|
|
468
|
+
e[49] !== C || e[50] !== T ? (Z = T ? /* @__PURE__ */ g(ye, { message: T, onRetry: be }) : C.saveError ? /* @__PURE__ */ g(ye, { message: C.saveError, onRetry: Ce }) : null, e[49] = C, e[50] = T, e[51] = Z) : Z = e[51];
|
|
469
|
+
const ce = Z;
|
|
470
|
+
let ee;
|
|
471
|
+
e[52] !== o || e[53] !== r ? (ee = (s) => {
|
|
472
|
+
et({
|
|
473
|
+
workbench: r,
|
|
474
|
+
navigation: o,
|
|
475
|
+
sectionId: s
|
|
476
|
+
});
|
|
477
|
+
}, e[52] = o, e[53] = r, e[54] = ee) : ee = e[54];
|
|
478
|
+
const we = ee;
|
|
479
|
+
let O;
|
|
480
|
+
e[55] !== y.fileName || e[56] !== y.filePath ? (O = y.filePath ? /* @__PURE__ */ g(Je, { fileName: y.fileName ?? y.filePath, filePath: y.filePath }) : null, e[55] = y.fileName, e[56] = y.filePath, e[57] = O) : O = e[57];
|
|
481
|
+
const ae = !!i.save, de = o ? we : void 0;
|
|
482
|
+
let P;
|
|
483
|
+
e[58] !== i.title || e[59] !== y || e[60] !== se || e[61] !== I || e[62] !== ce || e[63] !== ae || e[64] !== de ? (P = /* @__PURE__ */ g(me, { flex: "1", minH: "0", children: /* @__PURE__ */ g(Ve, { content: y, editorKey: se, errorNotice: ce, contributionCanSave: ae, onActiveSectionChange: de, onChange: Re, rendererRef: E, sectionNavigation: I, title: i.title }) }), e[58] = i.title, e[59] = y, e[60] = se, e[61] = I, e[62] = ce, e[63] = ae, e[64] = de, e[65] = P) : P = e[65];
|
|
484
|
+
let te;
|
|
485
|
+
return e[66] !== O || e[67] !== P ? (te = /* @__PURE__ */ U(B, { direction: "column", h: "full", minH: "0", bg: "bg", children: [
|
|
486
|
+
O,
|
|
487
|
+
P
|
|
488
|
+
] }), e[66] = O, e[67] = P, e[68] = te) : te = e[68], te;
|
|
489
|
+
};
|
|
490
|
+
function rt(t) {
|
|
491
|
+
return t.id;
|
|
492
|
+
}
|
|
493
|
+
export {
|
|
494
|
+
ft as WorkbenchFileRendererView
|
|
495
|
+
};
|
|
496
|
+
//# sourceMappingURL=file-renderer-view-B6_iR4EN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-renderer-view-B6_iR4EN.js","sources":["../src/react/renderers/file/file-kind.ts","../src/react/renderers/file/file-renderer-presentation.ts","../src/react/renderers/file/file-renderer-content.tsx","../src/react/renderers/file/file-renderer-edit-state.ts","../src/react/renderers/file/file-renderer-error-notice.tsx","../src/react/renderers/file/file-renderer-load-key.ts","../src/react/renderers/file/file-renderer-path-header.tsx","../src/react/renderers/file/file-renderer-view.tsx"],"sourcesContent":["// Generic file-type dispatch for the file renderer. Markdown is the default so\n// `.md` / `.txt` / extension-less files open in the prose editor; recognised code\n// extensions open in Monaco; images render read-only. This is deliberately\n// domain-agnostic — it knows about file types, not about tickets.\n\nexport type FileKind = \"markdown\" | \"code\" | \"image\";\n\nconst IMAGE_EXTENSIONS = new Set([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"svg\", \"avif\", \"bmp\", \"ico\"]);\nconst PROSE_EXTENSIONS = new Set([\"md\", \"markdown\", \"txt\"]);\n\n// Extension → Monaco language id. Markdown/plain text intentionally absent so\n// they fall through to the prose editor.\nconst CODE_LANGUAGE_BY_EXTENSION: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n json: \"json\",\n jsonc: \"json\",\n py: \"python\",\n rb: \"ruby\",\n rs: \"rust\",\n go: \"go\",\n java: \"java\",\n kt: \"kotlin\",\n c: \"c\",\n h: \"c\",\n cpp: \"cpp\",\n cc: \"cpp\",\n hpp: \"cpp\",\n cs: \"csharp\",\n php: \"php\",\n swift: \"swift\",\n sh: \"shell\",\n bash: \"shell\",\n zsh: \"shell\",\n sql: \"sql\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n html: \"html\",\n xml: \"xml\",\n yml: \"yaml\",\n yaml: \"yaml\",\n toml: \"ini\",\n ini: \"ini\",\n dockerfile: \"dockerfile\",\n graphql: \"graphql\",\n gql: \"graphql\",\n md: \"markdown\",\n markdown: \"markdown\",\n txt: \"plaintext\",\n};\n\nconst extensionOf = (fileName: string | undefined) => {\n if (!fileName) return \"\";\n const dot = fileName.lastIndexOf(\".\");\n if (dot < 0 || dot === fileName.length - 1) return \"\";\n return fileName.slice(dot + 1).toLowerCase();\n};\n\nconst isImage = (fileName: string | undefined, mimeType: string | undefined) => {\n if (mimeType?.startsWith(\"image/\")) return true;\n return IMAGE_EXTENSIONS.has(extensionOf(fileName));\n};\n\nexport const pickFileKind = (fileName: string | undefined, mimeType: string | undefined): FileKind => {\n if (isImage(fileName, mimeType)) return \"image\";\n const extension = extensionOf(fileName);\n if (!PROSE_EXTENSIONS.has(extension) && extension in CODE_LANGUAGE_BY_EXTENSION) return \"code\";\n return \"markdown\";\n};\n\n// Monaco language for a code file; falls back to plaintext for unknown extensions.\nexport const codeLanguageFor = (fileName: string | undefined) =>\n CODE_LANGUAGE_BY_EXTENSION[extensionOf(fileName)] ?? \"plaintext\";\n","import type { FileRendererContent } from \"../../../core\";\nimport { codeLanguageFor, pickFileKind } from \"./file-kind\";\n\nexport type FileRendererPresentation =\n | { kind: \"empty\"; isEditable: false }\n | { kind: \"image\"; isEditable: false }\n | { kind: \"code\"; isEditable: boolean; language: string }\n | { kind: \"markdown\"; isEditable: boolean };\n\nexport const resolveFileRendererPresentation = (\n content: FileRendererContent,\n contributionCanSave: boolean,\n): FileRendererPresentation => {\n if (content.emptyState) return { kind: \"empty\", isEditable: false };\n\n const automaticKind = pickFileKind(content.fileName, content.mimeType);\n if (automaticKind === \"image\") return { kind: \"image\", isEditable: false };\n\n const isEditable = contributionCanSave && content.editable !== false;\n if (automaticKind === \"code\" || content.textRenderer === \"monaco\") {\n return { kind: \"code\", isEditable, language: codeLanguageFor(content.fileName) };\n }\n return { kind: \"markdown\", isEditable };\n};\n","import { Box, Center, Flex, Image, Text } from \"@chakra-ui/react\";\nimport { EmptyState } from \"@pstdio/ui\";\nimport { CodeEditor } from \"@pstdio/ui/diff\";\nimport { MarkdownEditor } from \"@pstdio/ui/rich-text\";\nimport type { ReactNode, RefObject } from \"react\";\nimport type { FileRendererContent } from \"../../../core\";\nimport { resolveFileRendererPresentation } from \"./file-renderer-presentation\";\n\ninterface FileRendererContentViewProps {\n content: FileRendererContent;\n editorKey: string;\n errorNotice: ReactNode;\n contributionCanSave: boolean;\n onActiveSectionChange?: (sectionId: string | null) => void;\n onChange: (value: string) => void;\n rendererRef: RefObject<HTMLDivElement | null>;\n sectionNavigation?: {\n anchors: Array<{ id: string; heading: string; occurrence?: number }>;\n targetId: string;\n };\n title: string;\n}\n\nexport const FileRendererContentView = (props: FileRendererContentViewProps) => {\n const {\n content,\n editorKey,\n errorNotice,\n contributionCanSave,\n onActiveSectionChange,\n onChange,\n rendererRef,\n sectionNavigation,\n title,\n } = props;\n const presentation = resolveFileRendererPresentation(content, contributionCanSave);\n\n if (presentation.kind === \"empty\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <EmptyState\n flex=\"1\"\n minH=\"0\"\n title={content.emptyState?.title ?? \"Select a file\"}\n description={content.emptyState?.description}\n />\n </Flex>\n );\n }\n\n if (presentation.kind === \"image\") {\n if (!content.dataUrl) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\">\n <Text color=\"fg.muted\">This image preview is unavailable.</Text>\n </Center>\n );\n }\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <Center ref={rendererRef} flex=\"1\" minH=\"0\" p=\"md\" overflow=\"auto\">\n <Image src={content.dataUrl} alt={content.fileName ?? title} maxW=\"100%\" maxH=\"100%\" objectFit=\"contain\" />\n </Center>\n </Flex>\n );\n }\n\n if (presentation.kind === \"code\") {\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {errorNotice}\n <Box flex=\"1\" minH=\"0\">\n <CodeEditor\n key={editorKey}\n language={presentation.language}\n defaultCode={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n showLineNumbers\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n }\n\n return (\n <Flex ref={rendererRef} direction=\"column\" h=\"full\" minH=\"0\" overflow=\"hidden\" bg=\"bg\">\n {errorNotice}\n <Box flex=\"1\" minH=\"0\" overflowY=\"auto\">\n <MarkdownEditor\n key={editorKey}\n defaultState={content.content ?? \"\"}\n isEditable={presentation.isEditable}\n sectionNavigation={sectionNavigation}\n placeholder={presentation.isEditable ? (content.placeholder ?? \"Write…\") : undefined}\n onActiveSectionChange={onActiveSectionChange}\n onChange={presentation.isEditable ? onChange : undefined}\n />\n </Box>\n </Flex>\n );\n};\n","// Owns the editable file renderer's save lifecycle: the last loaded or saved\n// value (the baseline), the debounced draft, the one in-flight save, and\n// refresh events that arrive while a draft or save exists.\n//\n// Invariants (from the renderer edit/refresh lifecycle PRD):\n// - a change equal to the baseline never schedules a save\n// - at most one save runs at a time; the baseline advances when it succeeds\n// - a failed save keeps the draft so a later change or flush retries it\n// - refresh events are deferred while a draft or save exists and coalesce\n// into one reload after the last save settles\n\nimport type {\n FileRendererRefreshEnvelope,\n FileRendererRefreshOrigin,\n FileRendererSaveResult,\n} from \"../../../core/registries/renderers/file-renderer-registry\";\n\nexport interface FileEditControllerState {\n dirty: boolean;\n saving: boolean;\n saveError?: string;\n}\n\nexport interface FileEditControllerInput {\n binding: Omit<FileRendererRefreshOrigin, \"operationId\"> & { resourceUri?: string };\n debounceMs: number;\n load: (event?: FileRendererRefreshEnvelope) => void;\n save: (value: string, origin: FileRendererRefreshOrigin) => Promise<FileRendererSaveResult | undefined>;\n createOperationId?: () => string;\n onStateChange?: (state: FileEditControllerState) => void;\n}\n\nexport type FileEditController = ReturnType<typeof createFileEditController>;\n\nexport const createFileEditController = (input: FileEditControllerInput) => {\n let baseline: string | undefined;\n let baselineRevision: string | undefined;\n let draft: string | null = null;\n let activeSave: { value: string; origin: FileRendererRefreshOrigin } | null = null;\n let saveError: string | undefined;\n let deferredRevision: string | undefined;\n let genericRefreshDeferred = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let operationSequence = 0;\n const seenRefreshRevisions = new Set<string>();\n const completedOperationIds = new Set<string>();\n\n const describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to save file.\");\n const getState = (): FileEditControllerState => ({\n dirty: draft !== null || (activeSave !== null && activeSave.value !== baseline),\n saving: activeSave !== null,\n ...(saveError ? { saveError } : {}),\n });\n const notify = () => input.onStateChange?.(getState());\n\n const clearTimer = () => {\n if (timer === null) return;\n clearTimeout(timer);\n timer = null;\n };\n\n const nextOperationId = () => input.createOperationId?.() ?? `file-save-${Date.now()}-${++operationSequence}`;\n\n const hasPendingLocalState = () => draft !== null || activeSave !== null || timer !== null || Boolean(saveError);\n\n const deferRefresh = (event: FileRendererRefreshEnvelope) => {\n if (event.revision && (!deferredRevision || event.revision.localeCompare(deferredRevision) > 0)) {\n deferredRevision = event.revision;\n }\n if (!event.revision) genericRefreshDeferred = true;\n };\n\n const isSelfRefresh = (event: FileRendererRefreshEnvelope) => {\n const operationId = event.origin?.operationId;\n if (!operationId) return false;\n if (event.origin?.rendererId !== input.binding.rendererId) return false;\n if (event.origin.instanceId !== input.binding.instanceId) return false;\n return activeSave?.origin.operationId === operationId || completedOperationIds.has(operationId);\n };\n\n const takeDeferredRefresh = (savedRevision?: string) => {\n if (draft !== null || activeSave) return;\n const revision = deferredRevision;\n const generic = genericRefreshDeferred;\n deferredRevision = undefined;\n genericRefreshDeferred = false;\n if (revision && (!savedRevision || revision.localeCompare(savedRevision) > 0)) {\n input.load({ resourceUri: input.binding.resourceUri, revision });\n return;\n }\n if (generic) input.load({ resourceUri: input.binding.resourceUri });\n };\n\n const runSave = () => {\n if (draft === null || activeSave || saveError) return;\n const value = draft;\n draft = null;\n const origin = {\n rendererId: input.binding.rendererId,\n instanceId: input.binding.instanceId,\n operationId: nextOperationId(),\n };\n activeSave = { value, origin };\n notify();\n void Promise.resolve(input.save(value, origin))\n .then((result) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n completedOperationIds.add(origin.operationId);\n if (completedOperationIds.size > 20) completedOperationIds.delete(completedOperationIds.values().next().value!);\n baseline = value;\n baselineRevision = result?.revision ?? baselineRevision;\n if (draft === baseline) {\n draft = null;\n clearTimer();\n }\n notify();\n if (draft !== null) {\n schedule();\n return;\n }\n takeDeferredRefresh(result?.revision);\n })\n .catch((error) => {\n if (activeSave?.origin.operationId !== origin.operationId) return;\n activeSave = null;\n if (draft === null) draft = value;\n saveError = describeError(error);\n notify();\n });\n };\n\n const schedule = () => {\n clearTimer();\n timer = setTimeout(() => {\n timer = null;\n runSave();\n }, input.debounceMs);\n };\n\n return {\n getBaseline() {\n return baseline;\n },\n getState,\n setBaseline(value: string | undefined, revision?: string) {\n baseline = value;\n baselineRevision = revision;\n notify();\n },\n acceptLoaded(value: string | undefined, revision?: string) {\n if (hasPendingLocalState()) {\n deferRefresh(revision ? { revision } : {});\n return false;\n }\n baseline = value;\n baselineRevision = revision;\n notify();\n return true;\n },\n handleChange(value: string) {\n if (saveError && value === draft) return;\n saveError = undefined;\n if (value === baseline && !activeSave) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n if (activeSave?.value === value) {\n draft = null;\n clearTimer();\n notify();\n return;\n }\n draft = value;\n schedule();\n notify();\n },\n handleRefreshEvent(event: FileRendererRefreshEnvelope = {}) {\n if (event.resourceUri && event.resourceUri !== input.binding.resourceUri) return;\n if (isSelfRefresh(event)) return;\n if (event.revision && seenRefreshRevisions.has(event.revision)) return;\n if (event.revision) seenRefreshRevisions.add(event.revision);\n if (hasPendingLocalState()) {\n deferRefresh(event);\n return;\n }\n if (event.revision && baselineRevision && event.revision.localeCompare(baselineRevision) <= 0) return;\n input.load(event);\n },\n retry() {\n if (!saveError || draft === null || activeSave) return;\n saveError = undefined;\n notify();\n runSave();\n },\n retryLoad() {\n input.load({ resourceUri: input.binding.resourceUri });\n },\n flush() {\n clearTimer();\n runSave();\n },\n };\n};\n\n// A reload that returns what the editor already shows must not remount it: the\n// revision feeds the editor's React key, and a new key destroys focus and\n// selection. `editorValue` is the current baseline for an editable renderer —\n// after a save, a reload returns the saved value, which matches the baseline\n// even though it differs from the previously loaded state.\nexport const nextLoadedRevision = (\n previous: { content?: string; dataUrl?: string; loadKey: string; editorRevision: number } | null,\n next: { content?: string; dataUrl?: string },\n loadKey: string,\n editorValue?: string,\n) => {\n if (!previous || previous.loadKey !== loadKey) return 1;\n const shownContent = editorValue ?? previous.content;\n if (shownContent === next.content && previous.dataUrl === next.dataUrl) return previous.editorRevision;\n return previous.editorRevision + 1;\n};\n\n// Last loaded document per binding, so reopening a recently viewed file mounts\n// the editor immediately instead of a spinner. The follow-up load reconciles:\n// unchanged content keeps the revision (no remount), changed content remounts.\nconst FILE_CONTENT_CACHE_LIMIT = 30;\nconst fileContentCache = new Map<\n string,\n { content?: string; dataUrl?: string; fileName?: string; mimeType?: string; placeholder?: string; revision?: string }\n>();\n\nexport const readCachedFileContent = (loadKey: string) => fileContentCache.get(loadKey);\n\nexport const storeCachedFileContent = (\n loadKey: string,\n content: NonNullable<ReturnType<typeof readCachedFileContent>>,\n) => {\n fileContentCache.delete(loadKey);\n fileContentCache.set(loadKey, content);\n if (fileContentCache.size <= FILE_CONTENT_CACHE_LIMIT) return;\n const oldest = fileContentCache.keys().next().value;\n if (oldest !== undefined) fileContentCache.delete(oldest);\n};\n","import { Button, Flex, Text } from \"@chakra-ui/react\";\n\nexport const FileRendererErrorNotice = (props: { message: string; onRetry: () => void }) => {\n const { message, onRetry } = props;\n return (\n <Flex\n flex=\"none\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap=\"sm\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.muted\"\n bg=\"bg.muted\"\n px=\"sm\"\n py=\"xs\"\n >\n <Text color=\"fg.muted\" textStyle=\"label/S/regular\">\n {message}\n </Text>\n <Button size=\"2xs\" variant=\"subtle\" onClick={onRetry}>\n Retry\n </Button>\n </Flex>\n );\n};\n","import type { ResourceRef } from \"../../../core\";\n\ninterface FileRendererLoadKeyInput {\n fileRendererId: string;\n resource: ResourceRef | undefined;\n}\n\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (!value || typeof value !== \"object\") return value;\n\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, stableValue(entry)]),\n );\n};\n\nexport const createFileRendererLoadKey = (input: FileRendererLoadKeyInput) => {\n const { fileRendererId, resource } = input;\n const resourceValue = resource\n ? stableValue({ id: resource.id, kind: resource.kind, metadata: resource.metadata, uri: resource.uri })\n : null;\n return `${fileRendererId}:${JSON.stringify(resourceValue)}`;\n};\n\nexport const isCurrentLoadedFile = (loaded: { loadKey: string } | null, loadKey: string) => loaded?.loadKey === loadKey;\n","import { Text } from \"@chakra-ui/react\";\nimport { Header, resolveFileIconElement, useFileIconThemePreference } from \"@pstdio/ui\";\n\nexport const FileRendererPathHeader = (props: { fileName: string; filePath: string }) => {\n const { fileName, filePath } = props;\n const { activeFileIconTheme } = useFileIconThemePreference();\n\n return (\n <Header variant=\"narrow\" flexShrink={0} gap=\"2xs\" bg=\"bg\">\n {resolveFileIconElement(fileName, { theme: activeFileIconTheme })}\n <Text aria-label={`File path ${filePath}`} textStyle=\"label/S/regular\" color=\"fg.muted\" truncate>\n {filePath}\n </Text>\n </Header>\n );\n};\n","import { Box, Button, Center, Flex, Spinner, Text } from \"@chakra-ui/react\";\nimport { useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport type {\n FileRendererContent,\n RegisteredFileRendererContribution,\n WorkbenchCore,\n WorkbenchPanelInstance,\n} from \"../../../core\";\nimport {\n getFileSectionNavigation,\n resolveFileSectionTargetId,\n shouldClearFileSectionSelection,\n} from \"../../../core/registries/renderers/file-section-navigation\";\nimport { FileRendererContentView } from \"./file-renderer-content\";\nimport {\n createFileEditController,\n type FileEditController,\n type FileEditControllerState,\n nextLoadedRevision,\n readCachedFileContent,\n storeCachedFileContent,\n} from \"./file-renderer-edit-state\";\nimport { FileRendererErrorNotice } from \"./file-renderer-error-notice\";\nimport { createFileRendererLoadKey, isCurrentLoadedFile } from \"./file-renderer-load-key\";\nimport { FileRendererPathHeader } from \"./file-renderer-path-header\";\n\ninterface WorkbenchFileRendererViewProps {\n workbench: WorkbenchCore;\n contribution: RegisteredFileRendererContribution;\n // The bound resource (e.g. the open ticket / ticket-file) the load/save\n // commands operate on.\n placement?: WorkbenchPanelInstance;\n}\n\ninterface LoadedFile extends FileRendererContent {\n // Bumped on every (re)load so the uncontrolled editors remount with fresh\n // content on a refresh, but never mid-edit (load only runs on mount/refresh).\n editorRevision: number;\n loadKey: string;\n}\n\nconst SAVE_DEBOUNCE_MS = 600;\n\nconst describeError = (error: unknown) => (error instanceof Error ? error.message : \"Failed to load file.\");\n\nconst syncActiveFileSection = (input: {\n workbench: WorkbenchCore;\n navigation: ReturnType<typeof getFileSectionNavigation>;\n sectionId: string | null;\n}) => {\n const { workbench, navigation, sectionId } = input;\n if (!navigation || !workbench.renderers.getTreeRenderer(navigation.treeId)) return;\n\n if (sectionId && navigation.anchors.some((anchor) => anchor.id === sectionId)) {\n workbench.renderers.setSelectedNode(navigation.treeId, sectionId);\n return;\n }\n\n const selectedNodeId = workbench.renderers.getTreeState(navigation.treeId).selectedNodeId;\n if (selectedNodeId && navigation.anchors.some((anchor) => anchor.id === selectedNodeId)) {\n workbench.renderers.setSelectedNode(navigation.treeId, undefined);\n }\n};\n\nconst getEditorSectionNavigation = (\n workbench: WorkbenchCore,\n navigation: ReturnType<typeof getFileSectionNavigation>,\n) => {\n if (!navigation) return undefined;\n const selectedNodeId = workbench.renderers.getTreeRenderer(navigation.treeId)\n ? workbench.renderers.getTreeState(navigation.treeId).selectedNodeId\n : undefined;\n\n return {\n anchors: navigation.anchors,\n targetId: resolveFileSectionTargetId(navigation, selectedNodeId),\n };\n};\n\nexport const WorkbenchFileRendererView = (props: WorkbenchFileRendererViewProps) => {\n const { workbench, contribution } = props;\n const resource = props.placement?.resource;\n const sectionNavigation = getFileSectionNavigation(resource);\n const editorSectionNavigation = getEditorSectionNavigation(workbench, sectionNavigation);\n const loadKey = createFileRendererLoadKey({ fileRendererId: contribution.id, resource });\n const [loaded, setLoaded] = useState<LoadedFile | null>(null);\n const [error, setError] = useState<{ loadKey: string; message: string } | null>(null);\n const [editState, setEditState] = useState<FileEditControllerState>({ dirty: false, saving: false });\n const controllerRef = useRef<FileEditController | null>(null);\n const rendererRef = useRef<HTMLDivElement>(null);\n const previousSectionNavigationRef = useRef<{\n resourceUri?: string;\n treeId: string;\n anchorIds: string[];\n } | null>(null);\n\n useEffect(() => {\n const previous = previousSectionNavigationRef.current;\n const selectedNodeId =\n previous && workbench.renderers.getTreeRenderer(previous.treeId)\n ? workbench.renderers.getTreeState(previous.treeId).selectedNodeId\n : undefined;\n\n if (\n shouldClearFileSectionSelection({\n previous,\n current: sectionNavigation,\n currentResourceUri: resource?.uri,\n selectedNodeId,\n }) &&\n previous\n ) {\n workbench.renderers.setSelectedNode(previous.treeId, undefined);\n }\n\n previousSectionNavigationRef.current = sectionNavigation\n ? {\n resourceUri: resource?.uri,\n treeId: sectionNavigation.treeId,\n anchorIds: sectionNavigation.anchors.map((anchor) => anchor.id),\n }\n : null;\n }, [resource?.uri, sectionNavigation, workbench]);\n\n // Contribution refresh re-registers an identical contribution as a new\n // object, and a save that changes the document title produces a new resource\n // object with a fresh label. The load key uses resource values instead of\n // object identity, while callbacks read the latest objects through refs.\n const contributionRef = useRef(contribution);\n const resourceRef = useRef(resource);\n useEffect(() => {\n contributionRef.current = contribution;\n resourceRef.current = resource;\n });\n\n const contributionId = contribution.id;\n const hasSave = Boolean(contribution.save);\n\n // Re-binding a singleton widget to another resource changes `resource` and reloads.\n useEffect(() => {\n let cancelled = false;\n setError(null);\n // A recently viewed document mounts immediately from the cache; the load\n // below reconciles it (unchanged content keeps the editor mounted).\n const cached = readCachedFileContent(loadKey);\n setLoaded(cached ? { ...cached, editorRevision: 1, loadKey } : null);\n const load = () => {\n Promise.resolve(contributionRef.current.load(resourceRef.current))\n .then((next) => {\n if (cancelled) return;\n if (controllerRef.current && !controllerRef.current.acceptLoaded(next.content, next.revision)) return;\n setError(null);\n storeCachedFileContent(loadKey, next);\n // Compare against the editor's current value so a reload that returns\n // what is already shown (e.g. after a save) keeps the editor mounted.\n const editorValue = controllerRef.current?.getBaseline();\n setLoaded((previous) => ({\n ...next,\n editorRevision: nextLoadedRevision(previous, next, loadKey, editorValue),\n loadKey,\n }));\n })\n .catch((loadError) => {\n if (cancelled) return;\n setError({ loadKey, message: describeError(loadError) });\n });\n };\n controllerRef.current = hasSave\n ? createFileEditController({\n binding: {\n rendererId: contributionId,\n instanceId: props.placement?.instanceId ?? contributionId,\n resourceUri: resourceRef.current?.uri,\n },\n debounceMs: SAVE_DEBOUNCE_MS,\n load,\n onStateChange: (state) => {\n if (!cancelled) setEditState(state);\n },\n save: (value, origin) =>\n Promise.resolve(contributionRef.current.save?.(resourceRef.current, value, origin)).then((result) => {\n const current = readCachedFileContent(loadKey);\n if (current) storeCachedFileContent(loadKey, { ...current, content: value });\n return result ?? undefined;\n }),\n })\n : null;\n if (cached) controllerRef.current?.setBaseline(cached.content, cached.revision);\n setEditState({ dirty: false, saving: false });\n load();\n const refreshSubscription = workbench.renderers.onDidRefreshFileRenderer((event) => {\n if (event.fileRendererId !== contributionId) return;\n const controller = controllerRef.current;\n if (controller) controller.handleRefreshEvent(event);\n else load();\n });\n return () => {\n cancelled = true;\n refreshSubscription.dispose();\n // Flush the last keystrokes on unbind; the load callback above is\n // cancelled, so a deferred refresh cannot resurrect the old binding.\n controllerRef.current?.flush();\n controllerRef.current = null;\n };\n }, [contributionId, hasSave, workbench, loadKey, props.placement?.instanceId]);\n\n // The last keystrokes are also flushed when the tab is hidden or closed.\n useEffect(() => {\n const flush = () => controllerRef.current?.flush();\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") flush();\n };\n window.addEventListener(\"beforeunload\", flush);\n document.addEventListener(\"visibilitychange\", onVisibility);\n return () => {\n window.removeEventListener(\"beforeunload\", flush);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n };\n }, []);\n\n const handleChange = (value: string) => {\n controllerRef.current?.handleChange(value);\n };\n\n const currentLoaded = isCurrentLoadedFile(loaded, loadKey) ? loaded : null;\n const scrollResetKey = currentLoaded ? `${currentLoaded.loadKey}:${currentLoaded.editorRevision}` : \"\";\n\n useLayoutEffect(() => {\n if (!scrollResetKey || sectionNavigation) return;\n const node = rendererRef.current;\n if (!node) return;\n\n requestAnimationFrame(() => {\n let current = node.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if ([\"auto\", \"scroll\", \"overlay\"].includes(overflowY) && current.scrollHeight > current.clientHeight) {\n current.scrollTop = 0;\n }\n current = current.parentElement;\n }\n });\n }, [scrollResetKey, sectionNavigation]);\n\n const loadError = error?.loadKey === loadKey ? error.message : undefined;\n const retryLoad = () => controllerRef.current?.retryLoad();\n const retrySave = () => controllerRef.current?.retry();\n\n if (loadError && !currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\" p=\"md\" flexDirection=\"column\" gap=\"sm\">\n <Text color=\"fg.muted\">{loadError}</Text>\n <Button size=\"xs\" variant=\"subtle\" onClick={retryLoad}>\n Retry\n </Button>\n </Center>\n );\n }\n\n if (!currentLoaded) {\n return (\n <Center h=\"full\" minH=\"0\" bg=\"bg\">\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n\n // The key must carry the document identity, not just the contribution: two\n // documents from the same renderer both start at revision 1, so keying on the\n // contribution alone reuses the editor and keeps showing the previous file.\n const editorKey = `${currentLoaded.loadKey}:${currentLoaded.editorRevision}`;\n const errorNotice = loadError ? (\n <FileRendererErrorNotice message={loadError} onRetry={retryLoad} />\n ) : editState.saveError ? (\n <FileRendererErrorNotice message={editState.saveError} onRetry={retrySave} />\n ) : null;\n\n const handleActiveSectionChange = (sectionId: string | null) => {\n syncActiveFileSection({ workbench, navigation: sectionNavigation, sectionId });\n };\n\n return (\n <Flex direction=\"column\" h=\"full\" minH=\"0\" bg=\"bg\">\n {currentLoaded.filePath ? (\n <FileRendererPathHeader\n fileName={currentLoaded.fileName ?? currentLoaded.filePath}\n filePath={currentLoaded.filePath}\n />\n ) : null}\n <Box flex=\"1\" minH=\"0\">\n <FileRendererContentView\n content={currentLoaded}\n editorKey={editorKey}\n errorNotice={errorNotice}\n contributionCanSave={Boolean(contribution.save)}\n onActiveSectionChange={sectionNavigation ? handleActiveSectionChange : undefined}\n onChange={handleChange}\n rendererRef={rendererRef}\n sectionNavigation={editorSectionNavigation}\n title={contribution.title}\n />\n </Box>\n </Flex>\n );\n};\n"],"names":["IMAGE_EXTENSIONS","Set","PROSE_EXTENSIONS","CODE_LANGUAGE_BY_EXTENSION","ts","tsx","js","jsx","mjs","cjs","json","jsonc","py","rb","rs","go","java","kt","c","h","cpp","cc","hpp","cs","php","swift","sh","bash","zsh","sql","css","scss","less","html","xml","yml","yaml","toml","ini","dockerfile","graphql","gql","md","markdown","txt","extensionOf","fileName","dot","lastIndexOf","length","slice","toLowerCase","isImage","mimeType","startsWith","has","pickFileKind","extension","codeLanguageFor","resolveFileRendererPresentation","content","contributionCanSave","emptyState","kind","isEditable","automaticKind","editable","textRenderer","language","FileRendererContentView","props","$","_c","editorKey","errorNotice","onActiveSectionChange","onChange","rendererRef","sectionNavigation","title","t0","presentation","t1","t2","description","t3","EmptyState","t4","jsxs","Flex","dataUrl","Symbol","for","Center","Text","Image","undefined","Box","CodeEditor","placeholder","MarkdownEditor","t5","createFileEditController","input","baseline","baselineRevision","draft","activeSave","saveError","deferredRevision","genericRefreshDeferred","timer","operationSequence","seenRefreshRevisions","completedOperationIds","describeError","error","Error","message","getState","dirty","value","saving","notify","onStateChange","clearTimer","clearTimeout","nextOperationId","createOperationId","Date","now","hasPendingLocalState","Boolean","deferRefresh","event","revision","localeCompare","isSelfRefresh","operationId","origin","rendererId","binding","instanceId","takeDeferredRefresh","savedRevision","generic","load","resourceUri","runSave","Promise","resolve","save","then","result","add","size","delete","values","next","schedule","catch","setTimeout","debounceMs","getBaseline","setBaseline","acceptLoaded","handleChange","handleRefreshEvent","retry","retryLoad","flush","nextLoadedRevision","previous","loadKey","editorValue","editorRevision","FILE_CONTENT_CACHE_LIMIT","fileContentCache","Map","readCachedFileContent","get","storeCachedFileContent","set","oldest","keys","FileRendererErrorNotice","onRetry","Button","stableValue","Array","isArray","map","Object","fromEntries","entries","sort","left","right","key","entry","createFileRendererLoadKey","fileRendererId","resource","resourceValue","id","metadata","uri","JSON","stringify","isCurrentLoadedFile","loaded","FileRendererPathHeader","filePath","activeFileIconTheme","useFileIconThemePreference","resolveFileIconElement","theme","Header","SAVE_DEBOUNCE_MS","syncActiveFileSection","workbench","navigation","sectionId","renderers","getTreeRenderer","treeId","anchors","some","anchor","setSelectedNode","selectedNodeId","getTreeState","getEditorSectionNavigation","targetId","resolveFileSectionTargetId","WorkbenchFileRendererView","contribution","placement","getFileSectionNavigation","editorSectionNavigation","setLoaded","useState","setError","editState","setEditState","controllerRef","useRef","previousSectionNavigationRef","current","shouldClearFileSectionSelection","currentResourceUri","anchorIds","_temp","useEffect","contributionRef","resourceRef","t6","contributionId","hasSave","t7","cancelled","cached","previous_0","loadError","state","refreshSubscription","onDidRefreshFileRenderer","controller","dispose","t8","t9","t10","t11","onVisibility","document","visibilityState","window","addEventListener","removeEventListener","t12","value_0","t13","currentLoaded","scrollResetKey","t14","t15","node","requestAnimationFrame","current_0","parentElement","overflowY","getComputedStyle","includes","scrollHeight","clientHeight","scrollTop","useLayoutEffect","loadError_0","t16","t17","retrySave","t18","t19","t20","Spinner","handleActiveSectionChange","t21","t22","t23","t24"],"mappings":"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"}
|