labull-framework 0.1.24 → 0.1.25

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.
@@ -1,8 +1,8 @@
1
- import { defineComponent as Ce, ref as x, computed as R, watch as St, nextTick as Ue, onMounted as Ze, onBeforeUnmount as Xe, openBlock as r, createElementBlock as c, normalizeStyle as Qe, normalizeClass as z, unref as mt, createElementVNode as s, toDisplayString as p, createCommentVNode as y, Fragment as S, renderList as L, withModifiers as he, createBlock as Kn, createTextVNode as k, withDirectives as _t, vModelText as ce, withKeys as qn, vShow as qt } from "vue";
2
- import { useRouter as tn, useRoute as Vn } from "vue-router";
3
- import { A as Jn, b as st, c as Gt, u as en } from "./chunk-index-BWpDbB19.js";
4
- import { u as Gn, o as ge, b as nn, _ as sn, d as Wn } from "./chunk-ProductShell.vue_vue_type_style_index_0_scoped_06035587_lang-BpRKKThg.js";
5
- const lt = "__mb", on = "call", ye = "reply", an = "host-ready", ln = "height", Yn = "html, body { overflow: hidden !important; }", Zn = `
1
+ import { defineComponent as Re, ref as w, computed as O, watch as Ot, nextTick as Ze, onMounted as ln, onBeforeUnmount as un, openBlock as c, createElementBlock as d, normalizeStyle as rn, normalizeClass as H, unref as _t, createElementVNode as s, toDisplayString as p, createCommentVNode as k, Fragment as T, renderList as I, withModifiers as Ce, createBlock as ls, createTextVNode as y, withDirectives as ft, vModelCheckbox as is, vModelText as Yt, withKeys as us, vShow as Zt } from "vue";
2
+ import { useRouter as cn, useRoute as rs } from "vue-router";
3
+ import { A as cs, b as at, c as te, u as dn } from "./chunk-index-BWpDbB19.js";
4
+ import { u as ds, o as Ee, b as pn, _ as bn, d as ps } from "./chunk-ProductShell.vue_vue_type_style_index_0_scoped_06035587_lang-BpRKKThg.js";
5
+ const dt = "__mb", mn = "call", Se = "reply", fn = "host-ready", vn = "height", bs = "html, body { overflow: hidden !important; }", ms = `
6
6
  (function () {
7
7
  var seq = 0, waiting = {}, queue = [], ready = false, last = -1;
8
8
  function call(method, args) {
@@ -10,16 +10,16 @@ const lt = "__mb", on = "call", ye = "reply", an = "host-ready", ln = "height",
10
10
  function run() {
11
11
  var id = ++seq;
12
12
  waiting[id] = { resolve: resolve, reject: reject };
13
- parent.postMessage({ '${lt}': '${on}', id: id, method: method, args: args }, '*');
13
+ parent.postMessage({ '${dt}': '${mn}', id: id, method: method, args: args }, '*');
14
14
  }
15
15
  if (ready) run(); else queue.push(run);
16
16
  });
17
17
  }
18
18
  window.addEventListener('message', function (event) {
19
19
  var data = event.data, pending;
20
- if (!data || data['${lt}'] === undefined) return;
21
- if (data['${lt}'] === '${an}') { ready = true; queue.splice(0).forEach(function (run) { run(); }); return; }
22
- if (data['${lt}'] !== '${ye}') return;
20
+ if (!data || data['${dt}'] === undefined) return;
21
+ if (data['${dt}'] === '${fn}') { ready = true; queue.splice(0).forEach(function (run) { run(); }); return; }
22
+ if (data['${dt}'] !== '${Se}') return;
23
23
  if (!(pending = waiting[data.id])) return;
24
24
  delete waiting[data.id];
25
25
  if (data.ok) pending.resolve(data.value); else pending.reject(new Error(data.error || '调用失败'));
@@ -60,7 +60,7 @@ const lt = "__mb", on = "call", ye = "reply", an = "host-ready", ln = "height",
60
60
  if (height > 0) height += 1;
61
61
  if (height === last) return; /* 一样高就不再发:否则「宿主改高度 → 触发观察 → 又发一次」会转个不停 */
62
62
  last = height;
63
- parent.postMessage({ '${lt}': '${ln}', height: height }, '*');
63
+ parent.postMessage({ '${dt}': '${vn}', height: height }, '*');
64
64
  }
65
65
  function start() {
66
66
  report();
@@ -69,366 +69,366 @@ const lt = "__mb", on = "call", ye = "reply", an = "host-ready", ln = "height",
69
69
  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start); else start();
70
70
  setInterval(report, 500);
71
71
  })();
72
- `, Xn = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/;
73
- function un(o) {
74
- const a = typeof window > "u" ? "http://localhost" : window.location.href;
75
- return new URL(`${Jn}${o}`, a);
72
+ `, fs = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)+$/;
73
+ function hn(a) {
74
+ const o = typeof window > "u" ? "http://localhost" : window.location.href;
75
+ return new URL(`${cs}${a}`, o);
76
76
  }
77
- const He = (() => {
77
+ const Xe = (() => {
78
78
  try {
79
- return un("").origin;
79
+ return hn("").origin;
80
80
  } catch {
81
81
  return typeof window > "u" ? "" : window.location.origin;
82
82
  }
83
83
  })();
84
- async function Qn(o, a, l) {
85
- if (!Xn.test(a)) throw new Error(`路由名不合法:${a}(要写成 类名.方法名,例如 Customer.create)`);
86
- const i = un(`/bx/${o}/${a}`);
87
- if (i.origin !== He) throw new Error(`后端地址必须是本应用的(${He}):${i.origin}`);
88
- const d = l instanceof Blob ? l : null, v = await fetch(i.toString(), {
84
+ async function vs(a, o, l) {
85
+ if (!fs.test(o)) throw new Error(`路由名不合法:${o}(要写成 类名.方法名,例如 Customer.create)`);
86
+ const i = hn(`/bx/${a}/${o}`);
87
+ if (i.origin !== Xe) throw new Error(`后端地址必须是本应用的(${Xe}):${i.origin}`);
88
+ const r = l instanceof Blob ? l : null, m = await fetch(i.toString(), {
89
89
  method: "POST",
90
90
  credentials: "include",
91
91
  // 带上 HttpOnly 会话 cookie;authHeaders('POST') 给 CSRF 头(缺了 403)
92
- headers: d ? { "Content-Type": d.type || "application/octet-stream", ...Gt("POST") } : { "Content-Type": "application/json", ...Gt("POST") },
93
- body: d ?? JSON.stringify(l ?? {})
94
- }), m = await v.text().catch(() => "");
95
- if (v.ok) {
96
- if (!m) return null;
92
+ headers: r ? { "Content-Type": r.type || "application/octet-stream", ...te("POST") } : { "Content-Type": "application/json", ...te("POST") },
93
+ body: r ?? JSON.stringify(l ?? {})
94
+ }), v = await m.text().catch(() => "");
95
+ if (m.ok) {
96
+ if (!v) return null;
97
97
  try {
98
- return JSON.parse(m);
98
+ return JSON.parse(v);
99
99
  } catch {
100
- return m;
100
+ return v;
101
101
  }
102
102
  }
103
- let b = m;
103
+ let b = v;
104
104
  try {
105
- const _ = JSON.parse(m);
106
- typeof _?.message == "string" && (b = _.message);
105
+ const h = JSON.parse(v);
106
+ typeof h?.message == "string" && (b = h.message);
107
107
  } catch {
108
- b = m;
108
+ b = v;
109
109
  }
110
- throw new Error(b ? `${a} 调用失败:${b.slice(0, 300)}` : `${a} 调用失败(${v.status})`);
110
+ throw new Error(b ? `${o} 调用失败:${b.slice(0, 300)}` : `${o} 调用失败(${m.status})`);
111
111
  }
112
- function ts(o, a) {
113
- const l = (m) => {
112
+ function hs(a, o) {
113
+ const l = (v) => {
114
114
  try {
115
- o.contentWindow?.postMessage(m, "*");
115
+ a.contentWindow?.postMessage(v, "*");
116
116
  } catch (b) {
117
117
  console.warn("[magic-block] 有一条宿主消息没能发给块(协议继续走):", b);
118
118
  }
119
119
  };
120
- async function i(m, b) {
121
- if (m === "getMe") return await st("/auth/me");
122
- if (m === "navigateTab") {
123
- const _ = typeof b[0] == "string" ? b[0].trim() : "";
124
- if (!_ || !a.onNavigateTab) throw new Error(`跳不了 ${_ || "(空地址)"}:这个页面没有把宿主接到路由上`);
125
- return await a.onNavigateTab(_);
126
- }
127
- if (m === "context") return a.context ? a.context() : {};
128
- if (m === "setTabTitle") {
129
- const _ = typeof b[0] == "string" ? b[0].trim() : "", f = typeof b[1] == "string" ? b[1].trim() : "";
130
- if (!_) throw new Error("setTabTitle 要给一个非空的名字");
131
- return a.onTabTitle?.(_, f || void 0), !0;
132
- }
133
- if (m === "backend") {
134
- const _ = typeof b[0] == "string" ? b[0].trim() : "", f = b[1];
135
- if (!_) throw new Error("后端调用的路由名是空的:要写成 magicBackendApi.类名.方法名(参数)");
136
- if (!f || typeof f != "object" || Array.isArray(f)) throw new Error(`magicBackendApi.${_}(params) 的参数要么是一个对象,要么是一个文件(File / Blob)`);
137
- return await Qn(a.uuid, _, f);
138
- }
139
- throw new Error(`不认识的方法:${String(m)}(这块桥只有 getMe / navigateTab / context / setTabTitle / backend 五个)`);
120
+ async function i(v, b) {
121
+ if (v === "getMe") return await at("/auth/me");
122
+ if (v === "navigateTab") {
123
+ const h = typeof b[0] == "string" ? b[0].trim() : "";
124
+ if (!h || !o.onNavigateTab) throw new Error(`跳不了 ${h || "(空地址)"}:这个页面没有把宿主接到路由上`);
125
+ return await o.onNavigateTab(h);
126
+ }
127
+ if (v === "context") return o.context ? o.context() : {};
128
+ if (v === "setTabTitle") {
129
+ const h = typeof b[0] == "string" ? b[0].trim() : "", f = typeof b[1] == "string" ? b[1].trim() : "";
130
+ if (!h) throw new Error("setTabTitle 要给一个非空的名字");
131
+ return o.onTabTitle?.(h, f || void 0), !0;
132
+ }
133
+ if (v === "backend") {
134
+ const h = typeof b[0] == "string" ? b[0].trim() : "", f = b[1];
135
+ if (!h) throw new Error("后端调用的路由名是空的:要写成 magicBackendApi.类名.方法名(参数)");
136
+ if (!f || typeof f != "object" || Array.isArray(f)) throw new Error(`magicBackendApi.${h}(params) 的参数要么是一个对象,要么是一个文件(File / Blob)`);
137
+ return await vs(o.uuid, h, f);
138
+ }
139
+ throw new Error(`不认识的方法:${String(v)}(这块桥只有 getMe / navigateTab / context / setTabTitle / backend 五个)`);
140
140
  }
141
- const d = (m) => {
142
- if (m.source !== o.contentWindow) return;
143
- const b = m.data;
141
+ const r = (v) => {
142
+ if (v.source !== a.contentWindow) return;
143
+ const b = v.data;
144
144
  if (!b) return;
145
- if (b[lt] === ln) {
145
+ if (b[dt] === vn) {
146
146
  const f = typeof b.height == "number" ? b.height : NaN;
147
- Number.isFinite(f) && f > 0 && a.onHeight?.(f);
147
+ Number.isFinite(f) && f > 0 && o.onHeight?.(f);
148
148
  return;
149
149
  }
150
- if (b[lt] !== on) return;
151
- const _ = b.id;
150
+ if (b[dt] !== mn) return;
151
+ const h = b.id;
152
152
  (async () => {
153
153
  try {
154
- l({ [lt]: ye, id: _, ok: !0, value: await i(String(b.method), b.args ?? []) });
154
+ l({ [dt]: Se, id: h, ok: !0, value: await i(String(b.method), b.args ?? []) });
155
155
  } catch (f) {
156
- l({ [lt]: ye, id: _, ok: !1, error: f instanceof Error ? f.message : String(f) });
156
+ l({ [dt]: Se, id: h, ok: !1, error: f instanceof Error ? f.message : String(f) });
157
157
  }
158
158
  })();
159
159
  };
160
- window.addEventListener("message", d);
161
- const v = () => l({ [lt]: an });
162
- return v(), o.addEventListener("load", v), () => {
163
- window.removeEventListener("message", d), o.removeEventListener("load", v);
160
+ window.addEventListener("message", r);
161
+ const m = () => l({ [dt]: fn });
162
+ return m(), a.addEventListener("load", m), () => {
163
+ window.removeEventListener("message", r), a.removeEventListener("load", m);
164
164
  };
165
165
  }
166
- const Nt = "index.open.html", de = "magic-block.open.yaml", pe = ["id", "module", "name", "brief", "detail"], Ke = ["id", "module", "name", "brief"], Ee = 40, es = /^(?![A-Za-z]:)(?!\/)[A-Za-z0-9._\-/]+$/, ns = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, ss = /^[a-z][a-z0-9]*$/, os = /^[A-Za-z_][A-Za-z0-9_]*$/, as = "_";
167
- function qe(o) {
168
- return String(o ?? "").split("/").some((a) => a.startsWith(as));
166
+ const Ut = "index.open.html", _e = "magic-block.open.yaml", ge = ["id", "module", "name", "brief", "detail"], Qe = ["id", "module", "name", "brief"], Oe = 40, _s = /^(?![A-Za-z]:)(?!\/)[A-Za-z0-9._\-/]+$/, gs = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, ys = /^[a-z][a-z0-9]*$/, ks = /^[A-Za-z_][A-Za-z0-9_]*$/, $s = "_";
167
+ function tn(a) {
168
+ return String(a ?? "").split("/").some((o) => o.startsWith($s));
169
169
  }
170
- function ls(o) {
171
- return o.length > 0 && o.length <= Ee && !/[\u0000-\u001f\u007f]/.test(o);
170
+ function ws(a) {
171
+ return a.length > 0 && a.length <= Oe && !/[\u0000-\u001f\u007f]/.test(a);
172
172
  }
173
- const is = {
173
+ const xs = {
174
174
  id: "块的 uuid,必须与页面里挂载它时写死的那个 uuid 逐字一致",
175
175
  module: "模块名(小写字母与数字,必须以字母开头),例如 home",
176
- name: `可读名:可以用中文,不超过 ${Ee} 个字符`,
176
+ name: `可读名:可以用中文,不超过 ${Oe} 个字符`,
177
177
  brief: "一句话说明这个块解决什么问题",
178
178
  // 可选键:这一句不会出现在"缺少 xxx"的报文里(它不在 MANIFEST_REQUIRED 里),
179
179
  // 留着是为了让这份 Map 与 MANIFEST_KEYS 一一对上(少一个键 `tsc` 就会报)。
180
180
  detail: "详情介绍(可选):一段给人读的说明,比 brief 那一句长;一行写完,控制台会显示它"
181
181
  };
182
- function Ve(o) {
183
- const a = Object.keys(o);
184
- return a.length > 0 ? `现在包里有:${a.join(" / ")}` : "现在这个包是空的";
185
- }
186
- function us(o) {
187
- let a = "";
188
- for (let l = 0; l < o.length; l += 1) {
189
- const i = o[l];
190
- if (a)
191
- i === a && (a = "");
192
- else if (i === '"' || i === "'") a = i;
193
- else if (i === "#") return o.slice(0, l);
182
+ function en(a) {
183
+ const o = Object.keys(a);
184
+ return o.length > 0 ? `现在包里有:${o.join(" / ")}` : "现在这个包是空的";
185
+ }
186
+ function Cs(a) {
187
+ let o = "";
188
+ for (let l = 0; l < a.length; l += 1) {
189
+ const i = a[l];
190
+ if (o)
191
+ i === o && (o = "");
192
+ else if (i === '"' || i === "'") o = i;
193
+ else if (i === "#") return a.slice(0, l);
194
194
  }
195
- return o;
195
+ return a;
196
196
  }
197
- function rs(o) {
198
- let a = "";
199
- for (let l = 0; l < o.length; l += 1) {
200
- const i = o[l];
201
- if (a)
202
- i === a && (a = "");
203
- else if (i === '"' || i === "'") a = i;
197
+ function Es(a) {
198
+ let o = "";
199
+ for (let l = 0; l < a.length; l += 1) {
200
+ const i = a[l];
201
+ if (o)
202
+ i === o && (o = "");
203
+ else if (i === '"' || i === "'") o = i;
204
204
  else if (i === ":") return l;
205
205
  }
206
206
  return -1;
207
207
  }
208
- function cs(o) {
209
- return !o || o[0] !== '"' && o[0] !== "'" ? o : o.length >= 2 && o[o.length - 1] === o[0] ? o.slice(1, -1).trim() : o;
208
+ function Ss(a) {
209
+ return !a || a[0] !== '"' && a[0] !== "'" ? a : a.length >= 2 && a[a.length - 1] === a[0] ? a.slice(1, -1).trim() : a;
210
210
  }
211
- function ds(o) {
212
- const a = [], l = {}, i = {};
213
- o.split(/\r?\n/).forEach((d, v) => {
214
- const m = v + 1, b = us(d).trim();
211
+ function Ts(a) {
212
+ const o = [], l = {}, i = {};
213
+ a.split(/\r?\n/).forEach((r, m) => {
214
+ const v = m + 1, b = Cs(r).trim();
215
215
  if (!b) return;
216
216
  if (b.startsWith("-")) {
217
- a.push(`第 ${m} 行是列表写法(${b}):清单只认「键: 值」,每个键各占一行 —— 例如 name: 客户档案`);
217
+ o.push(`第 ${v} 行是列表写法(${b}):清单只认「键: 值」,每个键各占一行 —— 例如 name: 客户档案`);
218
218
  return;
219
219
  }
220
- const _ = rs(b);
221
- if (_ < 0) {
222
- a.push(`第 ${m} 行不是「键: 值」(${b}):清单只认「键: 值」与 # 注释 —— 要么删掉这一行,要么照 name: 客户档案 写`);
220
+ const h = Es(b);
221
+ if (h < 0) {
222
+ o.push(`第 ${v} 行不是「键: 值」(${b}):清单只认「键: 值」与 # 注释 —— 要么删掉这一行,要么照 name: 客户档案 写`);
223
223
  return;
224
224
  }
225
- const f = b.slice(0, _).trim();
226
- if (!os.test(f)) {
227
- a.push(`第 ${m} 行的键名不合法(${f}):键名只许字母或下划线开头,认得的键只有 ${pe.join(" / ")}`);
225
+ const f = b.slice(0, h).trim();
226
+ if (!ks.test(f)) {
227
+ o.push(`第 ${v} 行的键名不合法(${f}):键名只许字母或下划线开头,认得的键只有 ${ge.join(" / ")}`);
228
228
  return;
229
229
  }
230
- if (!pe.includes(f)) {
231
- a.push(
232
- `第 ${m} 行的键不认识(${f}):清单只有 ${pe.join(" / ")} 这几个键(其中 ${Ke.join(" / ")} 必填,detail 可以不写)`
230
+ if (!ge.includes(f)) {
231
+ o.push(
232
+ `第 ${v} 行的键不认识(${f}):清单只有 ${ge.join(" / ")} 这几个键(其中 ${Qe.join(" / ")} 必填,detail 可以不写)`
233
233
  );
234
234
  return;
235
235
  }
236
236
  if (f in i) {
237
- a.push(`第 ${m} 行重复写了 ${f}(第 ${i[f]} 行已经写过):一个键只许出现一次`);
237
+ o.push(`第 ${v} 行重复写了 ${f}(第 ${i[f]} 行已经写过):一个键只许出现一次`);
238
238
  return;
239
239
  }
240
- i[f] = m, l[f] = cs(b.slice(_ + 1).trim());
240
+ i[f] = v, l[f] = Ss(b.slice(h + 1).trim());
241
241
  });
242
- for (const d of Ke) {
243
- const v = l[d] ?? "";
244
- if (v === "") {
245
- a.push(`清单里缺少 ${d}(或者是空的):${is[d]}`);
242
+ for (const r of Qe) {
243
+ const m = l[r] ?? "";
244
+ if (m === "") {
245
+ o.push(`清单里缺少 ${r}(或者是空的):${xs[r]}`);
246
246
  continue;
247
247
  }
248
- d === "id" && !ns.test(v) ? a.push(`清单里的 id 不是 uuid:${v} —— 要 8-4-4-4-12 那种十六进制`) : d === "module" && !ss.test(v) ? a.push(
249
- `清单里的 module 不合法:${v} —— 它同时是 Django 的 app label,所以只许小写字母与数字、必须以字母开头(不能有横线与下划线),例如 home / orders`
250
- ) : d === "name" && !ls(v) && a.push(`清单里的 name 不合法:${v} —— 不能超过 ${Ee} 个字符、不能含控制字符(中文可以)`);
248
+ r === "id" && !gs.test(m) ? o.push(`清单里的 id 不是 uuid:${m} —— 要 8-4-4-4-12 那种十六进制`) : r === "module" && !ys.test(m) ? o.push(
249
+ `清单里的 module 不合法:${m} —— 它同时是 Django 的 app label,所以只许小写字母与数字、必须以字母开头(不能有横线与下划线),例如 home / orders`
250
+ ) : r === "name" && !ws(m) && o.push(`清单里的 name 不合法:${m} —— 不能超过 ${Oe} 个字符、不能含控制字符(中文可以)`);
251
251
  }
252
- return [l, a];
252
+ return [l, o];
253
253
  }
254
- function ps(o) {
255
- return es.test(o) && !o.split("/").includes("..");
254
+ function Bs(a) {
255
+ return _s.test(a) && !a.split("/").includes("..");
256
256
  }
257
- function bs(o) {
258
- const a = [], l = o[Nt];
259
- l === void 0 ? a.push(`包里缺入口:必须有 ${Nt}(${Ve(o)})`) : l.trim() || a.push(`${Nt} 不能是空文件`);
260
- const i = o[de];
261
- let d = {};
257
+ function Ms(a) {
258
+ const o = [], l = a[Ut];
259
+ l === void 0 ? o.push(`包里缺入口:必须有 ${Ut}(${en(a)})`) : l.trim() || o.push(`${Ut} 不能是空文件`);
260
+ const i = a[_e];
261
+ let r = {};
262
262
  if (i === void 0)
263
- a.push(`包里缺清单:必须有 ${de}(${Ve(o)})`);
263
+ o.push(`包里缺清单:必须有 ${_e}(${en(a)})`);
264
264
  else if (!i.trim())
265
- a.push(`${de} 不能是空文件`);
265
+ o.push(`${_e} 不能是空文件`);
266
266
  else {
267
- const [v, m] = ds(i);
268
- d = v, a.push(...m);
267
+ const [m, v] = Ts(i);
268
+ r = m, o.push(...v);
269
269
  }
270
- for (const v of Object.keys(o))
271
- ps(v) || a.push(`文件名不合法:${v}(只许字母数字与 . _ - /,且不许 .. 与绝对路径)`);
272
- return { manifest: d, issues: a };
273
- }
274
- function ms(o) {
275
- const a = [];
276
- if (o.length === 0)
277
- return a.push("一个块都没勾:请在「读回改动」的结果里勾上要保存的块"), { selected: 0, issues: a };
278
- for (const l of o) {
270
+ for (const m of Object.keys(a))
271
+ Bs(m) || o.push(`文件名不合法:${m}(只许字母数字与 . _ - /,且不许 .. 与绝对路径)`);
272
+ return { manifest: r, issues: o };
273
+ }
274
+ function As(a) {
275
+ const o = [];
276
+ if (a.length === 0)
277
+ return o.push("一个块都没勾:请在「读回改动」的结果里勾上要保存的块"), { selected: 0, issues: o };
278
+ for (const l of a) {
279
279
  const i = l.name?.trim() || "(没有名字的块)";
280
- for (const d of bs(l.files ?? {}).issues) a.push(`${i}:${d}`);
280
+ for (const r of Ms(l.files ?? {}).issues) o.push(`${i}:${r}`);
281
281
  }
282
- return { selected: o.length, issues: a };
282
+ return { selected: a.length, issues: o };
283
283
  }
284
- const fs = "backend_open.py", vs = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
285
- function Je(o, a) {
286
- if (vs.test(o)) return;
287
- const l = (o.split(/[?#]/)[0] ?? "").replace(/^\.\//, "").replace(/^\/+/, "");
288
- if (l in a) return qe(l) ? void 0 : l;
284
+ const Rs = "backend_open.py", Os = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
285
+ function nn(a, o) {
286
+ if (Os.test(a)) return;
287
+ const l = (a.split(/[?#]/)[0] ?? "").replace(/^\.\//, "").replace(/^\/+/, "");
288
+ if (l in o) return tn(l) ? void 0 : l;
289
289
  const i = l.split("/").pop() ?? "";
290
- return i ? Object.keys(a).find((d) => !qe(d) && (d.split("/").pop() ?? "") === i) : void 0;
291
- }
292
- const rn = "\0mb:";
293
- function _s(o) {
294
- return `${rn}${o}\0`;
295
- }
296
- const hs = /<script\b([^>]*?)\bsrc\s*=\s*(["'])(.*?)\2([^>]*)>\s*<\/script\s*>/gi, gs = /<link\b([^>]*?)\bhref\s*=\s*(["'])(.*?)\2([^>]*?)\/?>/gi;
297
- function ys(o, a) {
298
- const l = [], i = (m) => (l.push(m), _s(l.length - 1));
299
- return { html: o.replace(hs, (m, b, _, f, w) => {
300
- const h = Je(f, a);
301
- return h === void 0 ? m : i(`<script${b}${w}>
302
- ${cn(a[h] ?? "")}
290
+ return i ? Object.keys(o).find((r) => !tn(r) && (r.split("/").pop() ?? "") === i) : void 0;
291
+ }
292
+ const _n = "\0mb:";
293
+ function Ps(a) {
294
+ return `${_n}${a}\0`;
295
+ }
296
+ const Ls = /<script\b([^>]*?)\bsrc\s*=\s*(["'])(.*?)\2([^>]*)>\s*<\/script\s*>/gi, js = /<link\b([^>]*?)\bhref\s*=\s*(["'])(.*?)\2([^>]*?)\/?>/gi;
297
+ function Ds(a, o) {
298
+ const l = [], i = (v) => (l.push(v), Ps(l.length - 1));
299
+ return { html: a.replace(Ls, (v, b, h, f, x) => {
300
+ const _ = nn(f, o);
301
+ return _ === void 0 ? v : i(`<script${b}${x}>
302
+ ${gn(o[_] ?? "")}
303
303
  <\/script>`);
304
- }).replace(gs, (m, b, _, f, w) => {
305
- if (!/\brel\s*=\s*(?:"|')?stylesheet/i.test(`${b}${w}`)) return m;
306
- const h = Je(f, a);
307
- return h === void 0 ? m : i(`<style>
308
- ${a[h]}
304
+ }).replace(js, (v, b, h, f, x) => {
305
+ if (!/\brel\s*=\s*(?:"|')?stylesheet/i.test(`${b}${x}`)) return v;
306
+ const _ = nn(f, o);
307
+ return _ === void 0 ? v : i(`<style>
308
+ ${o[_]}
309
309
  </style>`);
310
310
  }), slots: l };
311
311
  }
312
- function cn(o) {
313
- return o.replace(/<\/(script)/gi, "<\\/$1");
312
+ function gn(a) {
313
+ return a.replace(/<\/(script)/gi, "<\\/$1");
314
314
  }
315
- function dn(o, a) {
316
- const l = /<\/head\s*>/i.exec(o);
317
- return l ? `${o.slice(0, l.index)}${a}${o.slice(l.index)}` : `${a}${o}`;
315
+ function yn(a, o) {
316
+ const l = /<\/head\s*>/i.exec(a);
317
+ return l ? `${a.slice(0, l.index)}${o}${a.slice(l.index)}` : `${o}${a}`;
318
318
  }
319
- function ks(o, a) {
320
- return a ? dn(o, `<script>
321
- ${cn(a)}
319
+ function Is(a, o) {
320
+ return o ? yn(a, `<script>
321
+ ${gn(o)}
322
322
  <\/script>
323
- `) : o;
323
+ `) : a;
324
324
  }
325
- function Ge(o, a) {
326
- return a ? dn(o, `<style data-magic-block="host">
327
- ${a}
325
+ function sn(a, o) {
326
+ return o ? yn(a, `<style data-magic-block="host">
327
+ ${o}
328
328
  </style>
329
- `) : o;
330
- }
331
- function $s(o, a = {}) {
332
- const l = a.bootstrap ?? "", i = a.css ?? "", d = a.themeCss ?? "", v = o[Nt];
333
- if (v === void 0) return "";
334
- const { html: m, slots: b } = ys(v, o), _ = ks(Ge(Ge(m, d), i), l), f = _.split(rn);
335
- if (f.length === 1) return _;
336
- let w = f[0] ?? "";
337
- for (let h = 1; h < f.length; h += 1) {
338
- const g = f[h] ?? "", A = g.indexOf("\0"), K = Number(g.slice(0, A));
339
- w += (b[K] ?? "") + g.slice(A + 1);
329
+ `) : a;
330
+ }
331
+ function Ns(a, o = {}) {
332
+ const l = o.bootstrap ?? "", i = o.css ?? "", r = o.themeCss ?? "", m = a[Ut];
333
+ if (m === void 0) return "";
334
+ const { html: v, slots: b } = Ds(m, a), h = Is(sn(sn(v, r), i), l), f = h.split(_n);
335
+ if (f.length === 1) return h;
336
+ let x = f[0] ?? "";
337
+ for (let _ = 1; _ < f.length; _ += 1) {
338
+ const g = f[_] ?? "", M = g.indexOf("\0"), F = Number(g.slice(0, M));
339
+ x += (b[F] ?? "") + g.slice(M + 1);
340
340
  }
341
- return w;
342
- }
343
- const It = /* @__PURE__ */ new Map();
344
- let Bt = null;
345
- const ke = /* @__PURE__ */ new Set();
346
- function ws(o) {
347
- return ke.add(o), () => {
348
- ke.delete(o);
341
+ return x;
342
+ }
343
+ const Ft = /* @__PURE__ */ new Map();
344
+ let Pt = null;
345
+ const Te = /* @__PURE__ */ new Set();
346
+ function Fs(a) {
347
+ return Te.add(a), () => {
348
+ Te.delete(a);
349
349
  };
350
350
  }
351
- function xs() {
352
- It.clear(), Bt = null;
353
- for (const o of ke) o();
351
+ function Us() {
352
+ Ft.clear(), Pt = null;
353
+ for (const a of Te) a();
354
354
  }
355
- async function Cs(o) {
356
- const a = [...new Set(o)].filter(Boolean);
357
- if (a.some((l) => !It.has(l))) {
358
- Bt && await Bt.catch(() => {
355
+ async function zs(a) {
356
+ const o = [...new Set(a)].filter(Boolean);
357
+ if (o.some((l) => !Ft.has(l))) {
358
+ Pt && await Pt.catch(() => {
359
359
  });
360
- const l = a.filter((i) => !It.has(i));
361
- l.length > 0 && (Bt = st(`/magic-blocks/render?ids=${l.map(encodeURIComponent).join(",")}`).then((i) => {
362
- for (const d of i) d?.id && It.set(d.id, d);
360
+ const l = o.filter((i) => !Ft.has(i));
361
+ l.length > 0 && (Pt = at(`/magic-blocks/render?ids=${l.map(encodeURIComponent).join(",")}`).then((i) => {
362
+ for (const r of i) r?.id && Ft.set(r.id, r);
363
363
  return i;
364
364
  }).catch(() => []).finally(() => {
365
- Bt = null;
366
- }), await Bt.catch(() => {
365
+ Pt = null;
366
+ }), await Pt.catch(() => {
367
367
  }));
368
368
  }
369
- return a.map((l) => It.get(l)).filter((l) => !!l);
369
+ return o.map((l) => Ft.get(l)).filter((l) => !!l);
370
370
  }
371
- const ht = "labull.css", Jt = "CONTROLS.lock.html";
372
- function Es(o, a) {
373
- const l = String(a || "");
371
+ const Tt = "labull.css", Qt = "CONTROLS.lock.html";
372
+ function Hs(a, o) {
373
+ const l = String(o || "");
374
374
  if (/@font-face|@keyframes/i.test(l)) return !0;
375
- const i = String(o || "");
375
+ const i = String(a || "");
376
376
  return /(^|[\s,>+~])(\.p-|\.pi(?![a-z])|\.pi-|\.labull-|:root|html(?![a-z-])|body(?![a-z-])|\*|:where\()/.test(i) ? !0 : /--(?:sp|surface|primary|text-color|content|highlight|focus-ring|p-)/.test(l);
377
377
  }
378
- function pn(o, a, l) {
379
- for (let i = 0; i < o.length; i += 1) {
380
- const d = o[i], v = String(d.cssText || ""), m = String(d.selectorText || "");
381
- if (d.cssRules && d.cssRules.length > 0) {
378
+ function kn(a, o, l) {
379
+ for (let i = 0; i < a.length; i += 1) {
380
+ const r = a[i], m = String(r.cssText || ""), v = String(r.selectorText || "");
381
+ if (r.cssRules && r.cssRules.length > 0) {
382
382
  const b = [];
383
- if (pn(d.cssRules, b, l), b.length === 0) continue;
384
- const _ = v.slice(0, v.indexOf("{")).trim();
385
- a.push(`${_} {
383
+ if (kn(r.cssRules, b, l), b.length === 0) continue;
384
+ const h = m.slice(0, m.indexOf("{")).trim();
385
+ o.push(`${h} {
386
386
  ${b.map((f) => " " + f).join(`
387
387
  `)}
388
388
  }`);
389
389
  continue;
390
390
  }
391
- Es(m, v) && (a.push(v), l.n += 1);
391
+ Hs(v, m) && (o.push(m), l.n += 1);
392
392
  }
393
393
  }
394
- function bn() {
395
- const o = [], a = [], l = { n: 0 };
394
+ function $n() {
395
+ const a = [], o = [], l = { n: 0 };
396
396
  let i = 0;
397
- const d = typeof document > "u" ? [] : Array.from(document.styleSheets);
398
- for (const m of d) {
399
- const b = m.href || "(内联 <style>)";
400
- let _ = null;
397
+ const r = typeof document > "u" ? [] : Array.from(document.styleSheets);
398
+ for (const v of r) {
399
+ const b = v.href || "(内联 <style>)";
400
+ let h = null;
401
401
  try {
402
- _ = m.cssRules;
402
+ h = v.cssRules;
403
403
  } catch {
404
- a.push(b);
404
+ o.push(b);
405
405
  continue;
406
406
  }
407
- if (!_ || _.length === 0) continue;
407
+ if (!h || h.length === 0) continue;
408
408
  const f = [];
409
- pn(_, f, l), f.length !== 0 && (i += 1, o.push(`/* ── ${b} ── */`, ...f));
409
+ kn(h, f, l), f.length !== 0 && (i += 1, a.push(`/* ── ${b} ── */`, ...f));
410
410
  }
411
411
  return { css: [
412
412
  "/* 生成物:每次导出都会重写,别手改。",
413
413
  " *",
414
414
  " * 这是这个应用此刻真正在用的 **labull 主题 + 控件样式**(token / PrimeVue 控件 / 结构类 / 图标)。",
415
415
  ` * 收自 ${i} 张样式表、${l.n} 条规则。`,
416
- a.length > 0 ? ` * ⚠️ 有 ${a.length} 张样式表读不到规则(跨源,浏览器不让读):${a.join(" / ")} —— 需要的话手动补一份。` : " * (没有读不到的样式表:收全了。)",
416
+ o.length > 0 ? ` * ⚠️ 有 ${o.length} 张样式表读不到规则(跨源,浏览器不让读):${o.join(" / ")} —— 需要的话手动补一份。` : " * (没有读不到的样式表:收全了。)",
417
417
  " *",
418
418
  " * 怎么用(块里):**什么都不用加** —— 宿主会把这一份注入每个块的 iframe(`MagicBlockHost` 的 `theme` prop),",
419
419
  ' * 所以直接写类名就行:`<button class="p-button">` / `<input class="p-inputtext">` / `<span class="p-tag">`。',
420
- " * 这一份放在开发包里是给你**查 / 对照 / 抄**用的(`" + Jt + "` 里的每一块 markup 都能直接用)。",
420
+ " * 这一份放在开发包里是给你**查 / 对照 / 抄**用的(`" + Qt + "` 里的每一块 markup 都能直接用)。",
421
421
  " * ⚠️ 别把它当块包文件塞进块里:它 500 KB 上下,而且宿主已经注入了一份(重复只会更慢)。",
422
422
  " * ⚠️ 块里**只有 CSS,没有 JS 组件**:下拉 / 日期 / 弹窗那些要装了 PrimeVue 才有行为,",
423
423
  " * 这里能用的是类名(按钮、输入框、标签、面板、表格、图标)。",
424
424
  " */",
425
425
  ""
426
426
  ].join(`
427
- `) + o.join(`
427
+ `) + a.join(`
428
428
  `) + `
429
- `, sheets: i, skipped: a, rules: l.n };
429
+ `, sheets: i, skipped: o, rules: l.n };
430
430
  }
431
- function Ts() {
431
+ function Ks() {
432
432
  const l = [
433
433
  ["按钮", '<button class="p-button" type="button">主要按钮</button>'],
434
434
  ["次要按钮", '<button class="p-button p-button-outlined" type="button">次要按钮</button>'],
@@ -446,10 +446,10 @@ function Ts() {
446
446
  ["面板 + 标题", '<div class="labull-panel"><h2 class="labull-subject-title"><i class="pi pi-list"></i> 面板标题</h2><p>面板正文。</p></div>'],
447
447
  ["表格", "<table><thead><tr><th>列 A</th><th>列 B</th></tr></thead><tbody><tr><td>值</td><td>值</td></tr></tbody></table>"]
448
448
  ].map(
449
- ([i, d]) => ` <section>
449
+ ([i, r]) => ` <section>
450
450
  <h3>${i}</h3>
451
- <div class="demo">${d}</div>
452
- <pre>${d.replace(/&/g, "&amp;").replace(/</g, "&lt;")}</pre>
451
+ <div class="demo">${r}</div>
452
+ <pre>${r.replace(/&/g, "&amp;").replace(/</g, "&lt;")}</pre>
453
453
  </section>`
454
454
  ).join(`
455
455
  `);
@@ -461,7 +461,7 @@ function Ts() {
461
461
  <head>
462
462
  <meta charset="utf-8">
463
463
  <title>labull 控件清单</title>
464
- <link rel="stylesheet" href="${ht}">
464
+ <link rel="stylesheet" href="${Tt}">
465
465
  <style>
466
466
  body { margin: 0; padding: 16px; }
467
467
  h1 { margin: 0 0 4px; font-size: 18px; }
@@ -477,10 +477,10 @@ function Ts() {
477
477
  <body>
478
478
  <h1>labull 控件清单</h1>
479
479
  <p class="lead">
480
- 这些类名来自 <code>${ht}</code>(与应用同源同版本)。块里别自己写一套配色 / 按钮:
480
+ 这些类名来自 <code>${Tt}</code>(与应用同源同版本)。块里别自己写一套配色 / 按钮:
481
481
  把这一行加进 <code>index.open.html</code> 的 <code>&lt;head&gt;</code>,
482
482
  下面每一块 markup 都能直接用:
483
- <code>&lt;link rel="stylesheet" href="${ht}"&gt;</code>
483
+ <code>&lt;link rel="stylesheet" href="${Tt}"&gt;</code>
484
484
  <br />
485
485
  ⚠️ 这里**只有 CSS,没有 JS 组件**:下拉 / 日期 / 弹窗那些要装了 PrimeVue 才有行为(块里没有构建步骤)。
486
486
  </p>
@@ -489,60 +489,60 @@ ${l}
489
489
  </html>
490
490
  `;
491
491
  }
492
- const gt = /* @__PURE__ */ new Map(), $e = /* @__PURE__ */ new Set(), Ss = 4e3;
493
- let we = "", Vt = null;
494
- function We() {
495
- for (const o of $e) o();
492
+ const Bt = /* @__PURE__ */ new Map(), Be = /* @__PURE__ */ new Set(), Vs = 4e3;
493
+ let Me = "", Xt = null;
494
+ function on() {
495
+ for (const a of Be) a();
496
496
  }
497
- function Bs(o) {
498
- return $e.add(o), () => {
499
- $e.delete(o);
497
+ function qs(a) {
498
+ return Be.add(a), () => {
499
+ Be.delete(a);
500
500
  };
501
501
  }
502
- function be() {
503
- return we;
502
+ function ye() {
503
+ return Me;
504
504
  }
505
- function As(o, a) {
506
- const l = String(o || "").trim(), i = String(a || "").trim();
505
+ function Js(a, o) {
506
+ const l = String(a || "").trim(), i = String(o || "").trim();
507
507
  if (!l || !i) return () => {
508
508
  };
509
- let d = gt.get(l);
510
- return d || (d = /* @__PURE__ */ new Set(), gt.set(l, d)), d.add(i), () => {
511
- const v = gt.get(l);
512
- v && (v.delete(i), v.size === 0 && gt.delete(l));
509
+ let r = Bt.get(l);
510
+ return r || (r = /* @__PURE__ */ new Set(), Bt.set(l, r)), r.add(i), () => {
511
+ const m = Bt.get(l);
512
+ m && (m.delete(i), m.size === 0 && Bt.delete(l));
513
513
  };
514
514
  }
515
- function xe(o, a, l) {
516
- const i = gt.get(String(o || ""));
515
+ function Ae(a, o, l) {
516
+ const i = Bt.get(String(a || ""));
517
517
  if (!i) return null;
518
- for (const d of i)
519
- if (d !== a && !(l && !l(d)))
520
- return d;
518
+ for (const r of i)
519
+ if (r !== o && !(l && !l(r)))
520
+ return r;
521
521
  return null;
522
522
  }
523
- function Ms(o) {
524
- return [...gt.get(String(o || "")) ?? []];
523
+ function Gs(a) {
524
+ return [...Bt.get(String(a || "")) ?? []];
525
525
  }
526
- function Os(o, a, l) {
527
- const i = gt.get(String(o || ""));
528
- return !i || i.size === 0 || i.has(a) ? null : xe(o, a, l);
526
+ function Ws(a, o, l) {
527
+ const i = Bt.get(String(a || ""));
528
+ return !i || i.size === 0 || i.has(o) ? null : Ae(a, o, l);
529
529
  }
530
- function mn(o, a = Ss) {
531
- we = String(o || ""), Vt !== null && clearTimeout(Vt), Vt = setTimeout(() => {
532
- Vt = null, we = "", We();
533
- }, Math.max(1, a)), We();
530
+ function wn(a, o = Vs) {
531
+ Me = String(a || ""), Xt !== null && clearTimeout(Xt), Xt = setTimeout(() => {
532
+ Xt = null, Me = "", on();
533
+ }, Math.max(1, o)), on();
534
534
  }
535
- const Rs = ["data-magic-block", "data-magic-module"], Ps = ["srcdoc", "title"], js = { class: "mb__state" }, Ls = { class: "mb__brief" }, Is = {
535
+ const Ys = ["data-magic-block", "data-magic-module"], Zs = ["srcdoc", "title"], Xs = { class: "mb__state" }, Qs = { class: "mb__brief" }, to = {
536
536
  key: 0,
537
537
  class: "mb__reason"
538
- }, Ns = {
538
+ }, eo = {
539
539
  key: 1,
540
540
  class: "mb__issues"
541
- }, Ds = {
541
+ }, no = {
542
542
  key: 2,
543
543
  class: "mb__ring",
544
544
  "aria-hidden": "true"
545
- }, Fs = ["title", "aria-label"], zs = ["title", "aria-label"], Us = ["title", "aria-label"], Hs = ["title", "aria-label"], Ks = /* @__PURE__ */ Ce({
545
+ }, so = ["title", "aria-label"], oo = ["title", "aria-label"], ao = ["title", "aria-label"], lo = ["title", "aria-label"], io = /* @__PURE__ */ Re({
546
546
  __name: "MagicBlockHost",
547
547
  props: {
548
548
  uuid: {},
@@ -550,189 +550,189 @@ const Rs = ["data-magic-block", "data-magic-module"], Ps = ["srcdoc", "title"],
550
550
  module: { default: "" },
551
551
  theme: { type: Boolean, default: !0 }
552
552
  },
553
- setup(o) {
554
- const a = o, l = Gn(), i = tn(), { isStaff: d } = en(), v = x(null), m = x(null), b = x(null), _ = x(!1), f = x(0), w = x(0);
555
- let h = null, g = null, A = null, K = null, q = null, U = null;
556
- const V = R(() => a.name.trim() || a.uuid), Z = R(() => b.value?.state ?? ""), yt = R(() => Z.value === "invalid" ? "校验不通过" : Z.value === "draft" ? "未开发" : V.value), X = R(() => (b.value?.brief ?? "").trim() || (b.value?.name ?? "").trim() || V.value), C = R(() => (b.value?.reason ?? "").trim()), kt = R(() => b.value?.issues ?? []), it = R(() => Math.max(w.value, f.value, 1)), Mt = R(() => ({ height: `${it.value}px` })), $t = R(() => {
553
+ setup(a) {
554
+ const o = a, l = ds(), i = cn(), { isStaff: r } = dn(), m = w(null), v = w(null), b = w(null), h = w(!1), f = w(0), x = w(0);
555
+ let _ = null, g = null, M = null, F = null, B = null, R = null;
556
+ const L = O(() => o.name.trim() || o.uuid), G = O(() => b.value?.state ?? ""), pt = O(() => G.value === "invalid" ? "校验不通过" : G.value === "draft" ? "未开发" : L.value), Z = O(() => (b.value?.brief ?? "").trim() || (b.value?.name ?? "").trim() || L.value), gt = O(() => (b.value?.reason ?? "").trim()), yt = O(() => b.value?.issues ?? []), C = O(() => Math.max(x.value, f.value, 1)), Lt = O(() => ({ height: `${C.value}px` })), lt = O(() => {
557
557
  const $ = {};
558
- for (const [T, D] of Object.entries(b.value?.files ?? {})) T !== fs && ($[T] = D);
558
+ for (const [E, j] of Object.entries(b.value?.files ?? {})) E !== Rs && ($[E] = j);
559
559
  return $;
560
- }), N = R(() => Z.value === "ok" && typeof $t.value[Nt] == "string");
561
- let P = null;
562
- function Q() {
563
- if (!a.theme) return "";
564
- if (P !== null || (P = "", typeof document > "u")) return P;
560
+ }), kt = O(() => G.value === "ok" && typeof lt.value[Ut] == "string");
561
+ let nt = null;
562
+ function K() {
563
+ if (!o.theme) return "";
564
+ if (nt !== null || (nt = "", typeof document > "u")) return nt;
565
565
  try {
566
- P = bn().css;
566
+ nt = $n().css;
567
567
  } catch {
568
- P = "";
568
+ nt = "";
569
569
  }
570
- return P;
570
+ return nt;
571
571
  }
572
- const dt = R(() => {
573
- if (!N.value) return "";
574
- const $ = { bootstrap: Zn, css: Yn }, T = Q();
575
- return T && ($.themeCss = T), $s($t.value, $);
572
+ const U = O(() => {
573
+ if (!kt.value) return "";
574
+ const $ = { bootstrap: ms, css: bs }, E = K();
575
+ return E && ($.themeCss = E), Ns(lt.value, $);
576
576
  });
577
- function ut() {
577
+ function X() {
578
578
  return { key: l.key, path: l.path, params: l.params, query: l.query };
579
579
  }
580
- async function Ot($) {
581
- const T = i.resolve($);
582
- if (T.matched.length === 0) {
583
- const D = i.getRoutes().map((O) => O.path);
584
- throw new Error(`这个应用里没有页面 ${$}。能跳的页面只有:${D.length > 0 ? D.join(" / ") : "(还没有配路由)"}`);
580
+ async function $t($) {
581
+ const E = i.resolve($);
582
+ if (E.matched.length === 0) {
583
+ const j = i.getRoutes().map((ut) => ut.path);
584
+ throw new Error(`这个应用里没有页面 ${$}。能跳的页面只有:${j.length > 0 ? j.join(" / ") : "(还没有配路由)"}`);
585
585
  }
586
- return ge($) || T.fullPath;
586
+ return Ee($) || E.fullPath;
587
587
  }
588
- function Dt() {
589
- A?.(), A = null;
590
- const $ = m.value;
591
- $ && (A = ts($, {
592
- uuid: a.uuid,
593
- onHeight: (T) => {
594
- f.value = T;
588
+ function bt() {
589
+ M?.(), M = null;
590
+ const $ = v.value;
591
+ $ && (M = hs($, {
592
+ uuid: o.uuid,
593
+ onHeight: (E) => {
594
+ f.value = E;
595
595
  },
596
- onNavigateTab: Ot,
597
- context: ut,
596
+ onNavigateTab: $t,
597
+ context: X,
598
598
  /* 🔴 块给**自己所属那条标签**起名:整页就是一个块时(`MagicBlockPage`),标签栏上那条
599
599
  * 默认只有路由的 `meta.title`("订单详情"),而"订单 SO-42"只有块自己知道。 */
600
- onTabTitle: (T, D) => l.setTitle(T, D)
600
+ onTabTitle: (E, j) => l.setTitle(E, j)
601
601
  }));
602
602
  }
603
- async function Rt() {
604
- const $ = a.uuid, T = await Cs([$]);
605
- $ === a.uuid && (b.value = T.find((D) => D.id === $) ?? null);
603
+ async function wt() {
604
+ const $ = o.uuid, E = await zs([$]);
605
+ $ === o.uuid && (b.value = E.find((j) => j.id === $) ?? null);
606
606
  }
607
- function tt() {
608
- window.dispatchEvent(new CustomEvent("magic-block:open-console", { detail: { uuid: a.uuid } }));
607
+ function zt() {
608
+ window.dispatchEvent(new CustomEvent("magic-block:open-console", { detail: { uuid: o.uuid } }));
609
609
  }
610
- function rt($ = !1) {
611
- $ && q?.(), q = As(a.uuid, l.key);
610
+ function Ht($ = !1) {
611
+ $ && B?.(), B = Js(o.uuid, l.key);
612
612
  }
613
- const M = ($) => !nn($, i), F = R(() => {
614
- if (!d.value) return "";
615
- const $ = xe(a.uuid, l.key, M);
613
+ const Q = ($) => !pn($, i), V = O(() => {
614
+ if (!r.value) return "";
615
+ const $ = Ae(o.uuid, l.key, Q);
616
616
  return $ ? `管理员:切到还挂着这个块的标签 ${$}(点一下这一块会亮红框)` : "管理员:这个块只在这一条标签里挂着 —— 点一下会亮几秒红框";
617
617
  });
618
- function I() {
619
- if (!d.value) return;
620
- const $ = xe(a.uuid, l.key, M);
621
- mn(a.uuid), $ && ge($);
622
- }
623
- function J($) {
624
- let T = $.parentElement;
625
- for (; T; ) {
626
- if (getComputedStyle(T).overflowY !== "visible" && T.clientHeight > 0) return T;
627
- T = T.parentElement;
618
+ function A() {
619
+ if (!r.value) return;
620
+ const $ = Ae(o.uuid, l.key, Q);
621
+ wn(o.uuid), $ && Ee($);
622
+ }
623
+ function it($) {
624
+ let E = $.parentElement;
625
+ for (; E; ) {
626
+ if (getComputedStyle(E).overflowY !== "visible" && E.clientHeight > 0) return E;
627
+ E = E.parentElement;
628
628
  }
629
629
  return document.documentElement;
630
630
  }
631
- function pt() {
632
- const $ = v.value;
631
+ function W() {
632
+ const $ = m.value;
633
633
  if (!$) return 0;
634
- const T = J($), D = getComputedStyle(T), O = parseFloat(D.paddingTop) || 0, Ft = parseFloat(D.paddingBottom) || 0, Yt = parseFloat(D.borderTopWidth) || 0, Pt = T === document.documentElement, Zt = Pt ? Math.max(0, window.innerHeight - O - Ft) : Math.max(0, T.clientHeight - O - Ft), H = Pt ? O : T.getBoundingClientRect().top + Yt + O, j = Pt ? window.scrollY || 0 : T.scrollTop, Xt = $.getBoundingClientRect().top - H + j;
635
- return Math.max(0, Math.floor(Zt - Xt));
636
- }
637
- function wt() {
638
- if (!l.active.value || !v.value) return;
639
- const $ = pt();
640
- $ > 0 && Math.abs($ - w.value) > 1 && (w.value = $);
641
- }
642
- function et() {
643
- if (!v.value) return;
644
- const $ = J(v.value);
645
- h !== $ && (h = $, g?.disconnect(), g = null), wt(), !(g || typeof ResizeObserver > "u") && (g = new ResizeObserver(() => wt()), g.observe($));
646
- }
647
- return St(m, () => Dt()), St(dt, () => {
648
- f.value = 0, w.value = 0, et();
649
- }, { flush: "post" }), St(() => a.uuid, () => {
650
- Ue().then(() => et());
651
- }), St(() => l.active.value, ($) => {
652
- $ && Ue().then(() => {
653
- et();
654
- const T = v.value;
655
- !T || !T.isConnected || T.offsetParent === null || _.value && T.scrollIntoView({ behavior: "smooth", block: "center" });
634
+ const E = it($), j = getComputedStyle(E), ut = parseFloat(j.paddingTop) || 0, jt = parseFloat(j.paddingBottom) || 0, z = parseFloat(j.borderTopWidth) || 0, Dt = E === document.documentElement, ne = Dt ? Math.max(0, window.innerHeight - ut - jt) : Math.max(0, E.clientHeight - ut - jt), se = Dt ? ut : E.getBoundingClientRect().top + z + ut, oe = Dt ? window.scrollY || 0 : E.scrollTop, q = $.getBoundingClientRect().top - se + oe;
635
+ return Math.max(0, Math.floor(ne - q));
636
+ }
637
+ function Y() {
638
+ if (!l.active.value || !m.value) return;
639
+ const $ = W();
640
+ $ > 0 && Math.abs($ - x.value) > 1 && (x.value = $);
641
+ }
642
+ function st() {
643
+ if (!m.value) return;
644
+ const $ = it(m.value);
645
+ _ !== $ && (_ = $, g?.disconnect(), g = null), Y(), !(g || typeof ResizeObserver > "u") && (g = new ResizeObserver(() => Y()), g.observe($));
646
+ }
647
+ return Ot(v, () => bt()), Ot(U, () => {
648
+ f.value = 0, x.value = 0, st();
649
+ }, { flush: "post" }), Ot(() => o.uuid, () => {
650
+ Ze().then(() => st());
651
+ }), Ot(() => l.active.value, ($) => {
652
+ $ && Ze().then(() => {
653
+ st();
654
+ const E = m.value;
655
+ !E || !E.isConnected || E.offsetParent === null || h.value && E.scrollIntoView({ behavior: "smooth", block: "center" });
656
656
  });
657
- }), St(() => a.uuid, () => {
658
- f.value = 0, b.value = null, rt(!0), _.value = be() === a.uuid, Rt();
659
- }), Ze(() => {
660
- K = ws(() => void Rt()), U = Bs(() => {
661
- _.value = be() === a.uuid;
662
- }), _.value = be() === a.uuid, rt(), et(), Rt();
663
- }), Xe(() => {
664
- g?.disconnect(), g = null, K?.(), K = null, U?.(), U = null, q?.(), q = null, A?.(), A = null;
665
- }), ($, T) => (r(), c("div", {
657
+ }), Ot(() => o.uuid, () => {
658
+ f.value = 0, b.value = null, Ht(!0), h.value = ye() === o.uuid, wt();
659
+ }), ln(() => {
660
+ F = Fs(() => void wt()), R = qs(() => {
661
+ h.value = ye() === o.uuid;
662
+ }), h.value = ye() === o.uuid, Ht(), st(), wt();
663
+ }), un(() => {
664
+ g?.disconnect(), g = null, F?.(), F = null, R?.(), R = null, B?.(), B = null, M?.(), M = null;
665
+ }), ($, E) => (c(), d("div", {
666
666
  ref_key: "el",
667
- ref: v,
668
- class: z(["mb", { "mb--admin": mt(d), "mb--lit": mt(d) && _.value }]),
669
- style: Qe(Mt.value),
670
- "data-magic-block": o.uuid,
671
- "data-magic-module": o.module
667
+ ref: m,
668
+ class: H(["mb", { "mb--admin": _t(r), "mb--lit": _t(r) && h.value }]),
669
+ style: rn(Lt.value),
670
+ "data-magic-block": a.uuid,
671
+ "data-magic-module": a.module
672
672
  }, [
673
- N.value ? (r(), c("iframe", {
673
+ kt.value ? (c(), d("iframe", {
674
674
  key: 0,
675
675
  ref_key: "frame",
676
- ref: m,
676
+ ref: v,
677
677
  class: "mb__frame",
678
- srcdoc: dt.value,
679
- title: V.value,
678
+ srcdoc: U.value,
679
+ title: L.value,
680
680
  scrolling: "no",
681
681
  sandbox: "allow-scripts allow-forms allow-modals allow-popups allow-downloads"
682
- }, null, 8, Ps)) : (r(), c("div", {
682
+ }, null, 8, Zs)) : (c(), d("div", {
683
683
  key: 1,
684
- class: z(["mb__empty", { "mb__empty--off": Z.value === "invalid", "mb__empty--draft": Z.value === "draft" }]),
685
- onClick: I
684
+ class: H(["mb__empty", { "mb__empty--off": G.value === "invalid", "mb__empty--draft": G.value === "draft" }]),
685
+ onClick: A
686
686
  }, [
687
- s("p", js, p(yt.value), 1),
688
- s("p", Ls, p(X.value), 1),
689
- Z.value === "invalid" && C.value ? (r(), c("p", Is, p(C.value), 1)) : y("", !0),
690
- Z.value === "invalid" && kt.value.length > 0 ? (r(), c("ul", Ns, [
691
- (r(!0), c(S, null, L(kt.value, (D, O) => (r(), c("li", {
692
- key: O,
687
+ s("p", Xs, p(pt.value), 1),
688
+ s("p", Qs, p(Z.value), 1),
689
+ G.value === "invalid" && gt.value ? (c(), d("p", to, p(gt.value), 1)) : k("", !0),
690
+ G.value === "invalid" && yt.value.length > 0 ? (c(), d("ul", eo, [
691
+ (c(!0), d(T, null, I(yt.value, (j, ut) => (c(), d("li", {
692
+ key: ut,
693
693
  class: "mb__issue"
694
- }, p(D.message), 1))), 128))
695
- ])) : y("", !0),
694
+ }, p(j.message), 1))), 128))
695
+ ])) : k("", !0),
696
696
  s("button", {
697
697
  class: "mb__go",
698
698
  type: "button",
699
- onClick: he(tt, ["stop"])
699
+ onClick: Ce(zt, ["stop"])
700
700
  }, "去控制台")
701
701
  ], 2)),
702
- mt(d) ? (r(), c("span", Ds)) : y("", !0),
703
- mt(d) && N.value ? (r(), c(S, { key: 3 }, [
702
+ _t(r) ? (c(), d("span", no)) : k("", !0),
703
+ _t(r) && kt.value ? (c(), d(T, { key: 3 }, [
704
704
  s("button", {
705
705
  class: "mb__grab mb__grab--top",
706
706
  type: "button",
707
- title: F.value,
708
- "aria-label": F.value,
709
- onClick: I
710
- }, null, 8, Fs),
707
+ title: V.value,
708
+ "aria-label": V.value,
709
+ onClick: A
710
+ }, null, 8, so),
711
711
  s("button", {
712
712
  class: "mb__grab mb__grab--right",
713
713
  type: "button",
714
- title: F.value,
715
- "aria-label": F.value,
716
- onClick: I
717
- }, null, 8, zs),
714
+ title: V.value,
715
+ "aria-label": V.value,
716
+ onClick: A
717
+ }, null, 8, oo),
718
718
  s("button", {
719
719
  class: "mb__grab mb__grab--bottom",
720
720
  type: "button",
721
- title: F.value,
722
- "aria-label": F.value,
723
- onClick: I
724
- }, null, 8, Us),
721
+ title: V.value,
722
+ "aria-label": V.value,
723
+ onClick: A
724
+ }, null, 8, ao),
725
725
  s("button", {
726
726
  class: "mb__grab mb__grab--left",
727
727
  type: "button",
728
- title: F.value,
729
- "aria-label": F.value,
730
- onClick: I
731
- }, null, 8, Hs)
732
- ], 64)) : y("", !0)
733
- ], 14, Rs));
728
+ title: V.value,
729
+ "aria-label": V.value,
730
+ onClick: A
731
+ }, null, 8, lo)
732
+ ], 64)) : k("", !0)
733
+ ], 14, Ys));
734
734
  }
735
- }), qs = /* @__PURE__ */ sn(Ks, [["__scopeId", "data-v-8e1e849f"]]), Vs = /* @__PURE__ */ Ce({
735
+ }), uo = /* @__PURE__ */ bn(io, [["__scopeId", "data-v-8e1e849f"]]), ro = /* @__PURE__ */ Re({
736
736
  __name: "MagicBlockPage",
737
737
  props: {
738
738
  uuid: { default: "" },
@@ -740,70 +740,70 @@ const Rs = ["data-magic-block", "data-magic-module"], Ps = ["srcdoc", "title"],
740
740
  module: { default: "" },
741
741
  theme: { type: Boolean, default: !0 }
742
742
  },
743
- setup(o) {
744
- const a = o, l = Vn(), i = R(() => {
745
- const d = l.meta?.blockUuid;
746
- return typeof d == "string" && d.trim() ? d.trim() : a.uuid;
743
+ setup(a) {
744
+ const o = a, l = rs(), i = O(() => {
745
+ const r = l.meta?.blockUuid;
746
+ return typeof r == "string" && r.trim() ? r.trim() : o.uuid;
747
747
  });
748
- return (d, v) => (r(), Kn(qs, {
748
+ return (r, m) => (c(), ls(uo, {
749
749
  uuid: i.value,
750
- name: o.name,
751
- module: o.module,
752
- theme: o.theme
750
+ name: a.name,
751
+ module: a.module,
752
+ theme: a.theme
753
753
  }, null, 8, ["uuid", "name", "module", "theme"]));
754
754
  }
755
755
  });
756
- function bt(o) {
757
- return typeof o == "string" ? o.trim() : "";
756
+ function ht(a) {
757
+ return typeof a == "string" ? a.trim() : "";
758
758
  }
759
- function Js(o) {
760
- const a = bt(o?.meta?.blockUuid);
761
- if (a) return a;
762
- const l = o?.props;
759
+ function co(a) {
760
+ const o = ht(a?.meta?.blockUuid);
761
+ if (o) return o;
762
+ const l = a?.props;
763
763
  if (!l || typeof l != "object" || Array.isArray(l)) return "";
764
764
  const i = l.default;
765
- return !i || typeof i != "object" || Array.isArray(i) ? "" : bt(i.uuid);
765
+ return !i || typeof i != "object" || Array.isArray(i) ? "" : ht(i.uuid);
766
766
  }
767
- function Gs(o, a) {
767
+ function po(a, o) {
768
768
  const l = [], i = /* @__PURE__ */ new Set();
769
- for (const d of o ?? []) {
770
- if (!d || d.redirect || d.components?.default !== a) continue;
771
- const v = Js(d);
772
- if (!v || i.has(v)) continue;
773
- i.add(v);
774
- const m = bt(d.path), b = bt(d.meta?.title) || bt(d.meta?.sub) || m;
775
- l.push({ uuid: v, path: m, title: b, module: bt(d.meta?.module), brief: bt(d.meta?.brief) });
769
+ for (const r of a ?? []) {
770
+ if (!r || r.redirect || r.components?.default !== o) continue;
771
+ const m = co(r);
772
+ if (!m || i.has(m)) continue;
773
+ i.add(m);
774
+ const v = ht(r.path), b = ht(r.meta?.title) || ht(r.meta?.sub) || v;
775
+ l.push({ uuid: m, path: v, title: b, module: ht(r.meta?.module), brief: ht(r.meta?.brief) });
776
776
  }
777
777
  return l;
778
778
  }
779
- function Ws(o, a, l) {
779
+ function bo(a, o, l) {
780
780
  const i = /* @__PURE__ */ new Set();
781
- for (const d of l ?? []) i.add(bt(d));
782
- return Gs(o, a).filter((d) => !i.has(d.uuid));
783
- }
784
- const me = "pages.lock.ts";
785
- function Ys(o, a) {
786
- const l = String(o || "").split(/[^A-Za-z0-9]+/).filter(Boolean);
787
- if (l.length === 0) return `Page${a + 1}`;
788
- const i = l.map((d) => d[0].toUpperCase() + d.slice(1)).join("");
781
+ for (const r of l ?? []) i.add(ht(r));
782
+ return po(a, o).filter((r) => !i.has(r.uuid));
783
+ }
784
+ const ke = "pages.lock.ts";
785
+ function mo(a, o) {
786
+ const l = String(a || "").split(/[^A-Za-z0-9]+/).filter(Boolean);
787
+ if (l.length === 0) return `Page${o + 1}`;
788
+ const i = l.map((r) => r[0].toUpperCase() + r.slice(1)).join("");
789
789
  return /^[0-9]/.test(i) ? `P${i}` : i;
790
790
  }
791
- function Zs(o, a) {
792
- if (!a.has(o))
793
- return a.add(o), o;
791
+ function fo(a, o) {
792
+ if (!o.has(a))
793
+ return o.add(a), a;
794
794
  let l = 2;
795
- for (; a.has(`${o}${l}`); ) l += 1;
796
- const i = `${o}${l}`;
797
- return a.add(i), i;
798
- }
799
- function Xs(o) {
800
- const a = (o ?? []).filter((v) => v && typeof v.path == "string" && v.path.trim() !== ""), l = /* @__PURE__ */ new Set(), i = [];
801
- a.forEach((v, m) => {
802
- const b = v.group?.trim() || "(没写 meta.group)";
803
- let _ = i.find((f) => f.title === b);
804
- _ || (_ = { title: b, rows: [] }, i.push(_)), _.rows.push({ key: Zs(Ys(v.path, m), l), row: v });
795
+ for (; o.has(`${a}${l}`); ) l += 1;
796
+ const i = `${a}${l}`;
797
+ return o.add(i), i;
798
+ }
799
+ function vo(a) {
800
+ const o = (a ?? []).filter((m) => m && typeof m.path == "string" && m.path.trim() !== ""), l = /* @__PURE__ */ new Set(), i = [];
801
+ o.forEach((m, v) => {
802
+ const b = m.group?.trim() || "(没写 meta.group)";
803
+ let h = i.find((f) => f.title === b);
804
+ h || (h = { title: b, rows: [] }, i.push(h)), h.rows.push({ key: fo(mo(m.path, v), l), row: m });
805
805
  });
806
- const d = [
806
+ const r = [
807
807
  "/* 生成物:**每次导出都会重写**,别手改 —— 改了下次导出就没了。",
808
808
  " *",
809
809
  " * 这个文件回答「块的前端(index.open.html 那一侧)里我能跳哪些页面、能调什么」。",
@@ -829,17 +829,17 @@ function Xs(o) {
829
829
  ""
830
830
  ];
831
831
  if (i.length === 0)
832
- d.push("/* ⚠️ 这次导出没拿到路由表(这个应用没装 vue-router,或者一条页面路由都没有)。 */", "export const Page = {} as const", "");
832
+ r.push("/* ⚠️ 这次导出没拿到路由表(这个应用没装 vue-router,或者一条页面路由都没有)。 */", "export const Page = {} as const", "");
833
833
  else {
834
- d.push("export const Page = {");
835
- for (const v of i) {
836
- d.push(` // ── ${v.title} ──`);
837
- for (const m of v.rows)
838
- d.push(` /** ${m.row.title?.trim() || m.row.path}(${m.row.path}) */`), d.push(` ${m.key}: '${m.row.path}',`);
834
+ r.push("export const Page = {");
835
+ for (const m of i) {
836
+ r.push(` // ── ${m.title} ──`);
837
+ for (const v of m.rows)
838
+ r.push(` /** ${v.row.title?.trim() || v.row.path}(${v.row.path}) */`), r.push(` ${v.key}: '${v.row.path}',`);
839
839
  }
840
- d.push("} as const", "");
840
+ r.push("} as const", "");
841
841
  }
842
- return d.push(
842
+ return r.push(
843
843
  "/** `Page` 里那些路径的联合类型(只想收页面路径的参数可以写它)。 */",
844
844
  "export type PagePath = (typeof Page)[keyof typeof Page]",
845
845
  "",
@@ -891,174 +891,209 @@ function Xs(o) {
891
891
  "",
892
892
  "export {}",
893
893
  ""
894
- ), d.join(`
894
+ ), r.join(`
895
895
  `);
896
896
  }
897
- function fn() {
897
+ function xn() {
898
898
  return typeof window < "u" && typeof window.showDirectoryPicker == "function";
899
899
  }
900
- const Qs = "这个浏览器没法直接写你本机的文件夹(少了 File System Access API):请用 Chrome / Edge,并且从 https 或 http://localhost 打开这个页面(内网 http 会更少 API)。";
901
- async function fe() {
902
- if (!fn()) throw new Error(Qs);
900
+ const ho = "这个浏览器没法直接写你本机的文件夹(少了 File System Access API):请用 Chrome / Edge,并且从 https 或 http://localhost 打开这个页面(内网 http 会更少 API)。";
901
+ async function $e() {
902
+ if (!xn()) throw new Error(ho);
903
903
  try {
904
- const o = await window.showDirectoryPicker({ mode: "readwrite", id: "labull-magic-block" });
905
- return { name: o.name, handle: o };
906
- } catch (o) {
907
- const a = o instanceof Error ? o.name : "";
908
- throw a === "AbortError" ? new Error("取消选目录了:想导出就再点一次「选择文件夹」") : a === "SecurityError" ? new Error(`选不了这个目录:浏览器不让(${Wt(o)})—— 换一个目录,或确认页面是 https / localhost`) : new Error(`选目录失败:${Wt(o)}`);
904
+ const a = await window.showDirectoryPicker({ mode: "readwrite", id: "labull-magic-block" });
905
+ return { name: a.name, handle: a };
906
+ } catch (a) {
907
+ const o = a instanceof Error ? a.name : "";
908
+ throw o === "AbortError" ? new Error("取消选目录了:想导出就再点一次「选择文件夹」") : o === "SecurityError" ? new Error(`选不了这个目录:浏览器不让(${ee(a)})—— 换一个目录,或确认页面是 https / localhost`) : new Error(`选目录失败:${ee(a)}`);
909
909
  }
910
910
  }
911
- function Wt(o) {
912
- return (o instanceof Error ? o.message.trim() : String(o)) || "没有说原因";
911
+ function ee(a) {
912
+ return (a instanceof Error ? a.message.trim() : String(a)) || "没有说原因";
913
913
  }
914
- function Te(o) {
915
- const a = String(o ?? "").split("/");
916
- for (const l of a)
914
+ function Pe(a) {
915
+ const o = String(a ?? "").split("/");
916
+ for (const l of o)
917
917
  if (!l || l === "." || l === ".." || l.includes("\\") || /^[A-Za-z]:/.test(l))
918
- throw new Error(`路径不合法:${o}(要相对路径,不许 .. / 盘符 / 反斜杠)`);
919
- return a;
918
+ throw new Error(`路径不合法:${a}(要相对路径,不许 .. / 盘符 / 反斜杠)`);
919
+ return o;
920
920
  }
921
- const to = 8;
922
- async function ft(o, a) {
921
+ function _o(a) {
922
+ const o = String(a ?? "");
923
+ let l = 3735928559, i = 1103547991;
924
+ for (let r = 0; r < o.length; r += 1) {
925
+ const m = o.charCodeAt(r);
926
+ l = Math.imul(l ^ m, 2654435761), i = Math.imul(i ^ m, 1597334677);
927
+ }
928
+ return l = Math.imul(l ^ l >>> 16, 2246822507) ^ Math.imul(i ^ i >>> 13, 3266489909), i = Math.imul(i ^ i >>> 16, 2246822507) ^ Math.imul(l ^ l >>> 13, 3266489909), `${(4294967296 * (2097151 & i) + (l >>> 0)).toString(36)}:${o.length}`;
929
+ }
930
+ const go = 8;
931
+ async function vt(a, o) {
923
932
  let l = 0;
924
933
  const i = async () => {
925
934
  for (; ; ) {
926
- const d = l;
927
- if (l += 1, d >= o.length) return;
928
- await a(o[d], d);
935
+ const r = l;
936
+ if (l += 1, r >= a.length) return;
937
+ await o(a[r], r);
929
938
  }
930
939
  };
931
- await Promise.all(Array.from({ length: Math.max(1, Math.min(to, o.length)) }, () => i()));
940
+ await Promise.all(Array.from({ length: Math.max(1, Math.min(go, a.length)) }, () => i()));
932
941
  }
933
- function eo(o) {
934
- const a = /* @__PURE__ */ new Map();
942
+ function yo(a) {
943
+ const o = /* @__PURE__ */ new Map();
935
944
  return (l) => {
936
- const i = l.join("\0"), d = a.get(i);
937
- if (d) return d;
938
- let v = Promise.resolve(o);
939
- for (let m = 0; m < l.length; m += 1) {
940
- const b = l[m], _ = l.slice(0, m + 1).join("\0"), f = a.get(_);
941
- v = f ?? v.then((w) => w.getDirectoryHandle(b, { create: !0 })), f || a.set(_, v);
942
- }
943
- return v;
945
+ const i = l.join("\0"), r = o.get(i);
946
+ if (r) return r;
947
+ let m = Promise.resolve(a);
948
+ for (let v = 0; v < l.length; v += 1) {
949
+ const b = l[v], h = l.slice(0, v + 1).join("\0"), f = o.get(h);
950
+ m = f ?? m.then((x) => x.getDirectoryHandle(b, { create: !0 })), f || o.set(h, m);
951
+ }
952
+ return m;
944
953
  };
945
954
  }
946
- async function no(o, a, l) {
955
+ async function ko(a, o, l) {
947
956
  try {
948
- return await (await (await o.getFileHandle(a)).getFile()).text() === l;
957
+ return await (await (await a.getFileHandle(o)).getFile()).text() === l;
949
958
  } catch {
950
959
  return !1;
951
960
  }
952
961
  }
953
- async function so(o, a, l, i = {}) {
954
- const d = Object.entries(a ?? {}).map(([h, g]) => ({ path: h, parts: Te(h), body: String(g ?? "") })), v = d.length, m = [], b = eo(o.handle), _ = i.verify === !0;
955
- let f = 0, w = 0;
956
- return l?.(0, v), await ft(d, async (h) => {
962
+ async function $o(a, o, l, i = {}) {
963
+ const r = Object.entries(o ?? {}).map(([B, R]) => {
964
+ const L = String(R ?? "");
965
+ return { path: B, parts: Pe(B), body: L, digest: _o(L) };
966
+ }), m = r.length, v = [], b = yo(a.handle), h = i.verify === !0, f = i.trust, x = i.existing, _ = /* @__PURE__ */ new Map();
967
+ let g = 0, M = 0, F = 0;
968
+ return l?.(0, m), await vt(r, async (B) => {
957
969
  try {
958
- const g = await b(h.parts.slice(0, -1)), A = h.parts[h.parts.length - 1];
959
- if (_ && await no(g, A, h.body))
960
- w += 1;
970
+ if (f?.get(B.path) === B.digest && (x?.has(B.path) ?? !1))
971
+ F += 1, _.set(B.path, B.digest);
961
972
  else {
962
- const q = await (await g.getFileHandle(A, { create: !0 })).createWritable();
963
- try {
964
- await q.write(h.body);
965
- } finally {
966
- await q.close();
973
+ const R = await b(B.parts.slice(0, -1)), L = B.parts[B.parts.length - 1];
974
+ if (h && await ko(R, L, B.body))
975
+ M += 1, _.set(B.path, B.digest);
976
+ else {
977
+ const pt = await (await R.getFileHandle(L, { create: !0 })).createWritable();
978
+ try {
979
+ await pt.write(B.body);
980
+ } finally {
981
+ await pt.close();
982
+ }
983
+ g += 1, _.set(B.path, B.digest);
967
984
  }
968
- f += 1;
969
985
  }
970
- } catch (g) {
971
- m.push({ path: h.path, message: Wt(g) });
986
+ } catch (R) {
987
+ v.push({ path: B.path, message: ee(R) });
972
988
  }
973
- l?.(f + w + m.length, v);
974
- }), m.sort((h, g) => h.path < g.path ? -1 : h.path > g.path ? 1 : 0), { written: f, failed: m, total: v, skipped: w };
989
+ l?.(g + M + F + v.length, m);
990
+ }), v.sort((B, R) => B.path < R.path ? -1 : B.path > R.path ? 1 : 0), { written: g, failed: v, total: m, skipped: M, trusted: F, fingerprints: _ };
975
991
  }
976
- async function ve(o, a) {
977
- const l = { items: [], topCount: 0, files: 0, dirs: 0 }, i = async (m, b) => {
978
- const _ = [];
979
- for (const f of await At(m)) {
992
+ async function we(a, o) {
993
+ const l = { items: [], topCount: 0, files: 0, dirs: 0 }, i = async (v, b) => {
994
+ const h = [];
995
+ for (const f of await Mt(v)) {
980
996
  if (f.kind === "file") {
981
997
  l.files += 1;
982
998
  continue;
983
999
  }
984
- l.dirs += 1, !(b >= a.maxDepth) && (a.skipDirs.includes(f.name) || _.push(f));
1000
+ l.dirs += 1, !(b >= o.maxDepth) && (o.skipDirs.includes(f.name) || h.push(f));
985
1001
  }
986
- await ft(_, (f) => i(f, b + 1));
987
- }, d = await At(o.handle), v = [];
988
- for (const m of d)
989
- if (l.items.push({ name: m.name, dir: m.kind === "directory" }), m.kind === "file") l.files += 1;
1002
+ await vt(h, (f) => i(f, b + 1));
1003
+ }, r = await Mt(a.handle), m = [];
1004
+ for (const v of r)
1005
+ if (l.items.push({ name: v.name, dir: v.kind === "directory" }), v.kind === "file") l.files += 1;
990
1006
  else {
991
- if (l.dirs += 1, a.skipDirs.includes(m.name) || a.maxDepth <= 0) continue;
992
- v.push(m);
1007
+ if (l.dirs += 1, o.skipDirs.includes(v.name) || o.maxDepth <= 0) continue;
1008
+ m.push(v);
993
1009
  }
994
- return await ft(v, (m) => i(m, 1)), l.topCount = l.items.length, l;
1010
+ return await vt(m, (v) => i(v, 1)), l.topCount = l.items.length, l;
995
1011
  }
996
- async function oo(o) {
997
- const a = [];
998
- for (const i of await At(o.handle)) a.push(i.name);
1012
+ async function wo(a) {
1013
+ const o = [];
1014
+ for (const i of await Mt(a.handle)) o.push(i.name);
999
1015
  let l = 0;
1000
- return await ft(a, async (i) => {
1001
- await o.handle.removeEntry(i, { recursive: !0 }), l += 1;
1016
+ return await vt(o, async (i) => {
1017
+ await a.handle.removeEntry(i, { recursive: !0 }), l += 1;
1002
1018
  }), l;
1003
1019
  }
1004
- async function ao(o, a) {
1005
- const l = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set();
1006
- for (const m of Object.keys(a ?? {})) {
1007
- const b = Te(m);
1008
- l.add(b.join("/"));
1009
- for (let _ = 1; _ < b.length; _ += 1) i.add(b.slice(0, _).join("/"));
1020
+ async function xo(a, o) {
1021
+ const { wantedFiles: l, wantedDirs: i } = Cn(o), r = /* @__PURE__ */ new Set();
1022
+ let m = 0;
1023
+ const v = async (b, h) => {
1024
+ const f = [], x = [];
1025
+ for (const _ of await Mt(b)) {
1026
+ const g = h ? `${h}/${_.name}` : _.name;
1027
+ if (_.kind === "file") {
1028
+ l.has(g) ? r.add(g) : f.push(_.name);
1029
+ continue;
1030
+ }
1031
+ i.has(g) ? x.push([g, _]) : f.push(_.name);
1032
+ }
1033
+ await vt(f, async (_) => {
1034
+ await b.removeEntry(_, { recursive: !0 }), m += 1;
1035
+ }), await vt(x, ([_, g]) => v(g, _));
1036
+ };
1037
+ return await v(a.handle, ""), { removed: m, existing: r };
1038
+ }
1039
+ function Cn(a) {
1040
+ const o = /* @__PURE__ */ new Set(), l = /* @__PURE__ */ new Set();
1041
+ for (const i of Object.keys(a ?? {})) {
1042
+ const r = Pe(i);
1043
+ o.add(r.join("/"));
1044
+ for (let m = 1; m < r.length; m += 1) l.add(r.slice(0, m).join("/"));
1010
1045
  }
1011
- let d = 0;
1012
- const v = async (m, b) => {
1013
- const _ = [], f = [];
1014
- for (const w of await At(m)) {
1015
- const h = b ? `${b}/${w.name}` : w.name;
1016
- if (w.kind === "file") {
1017
- l.has(h) || _.push(w.name);
1046
+ return { wantedFiles: o, wantedDirs: l };
1047
+ }
1048
+ async function Co(a, o) {
1049
+ const { wantedFiles: l, wantedDirs: i } = Cn(o), r = /* @__PURE__ */ new Set(), m = async (v, b) => {
1050
+ const h = [];
1051
+ for (const f of await Mt(v)) {
1052
+ const x = b ? `${b}/${f.name}` : f.name;
1053
+ if (f.kind === "file") {
1054
+ l.has(x) && r.add(x);
1018
1055
  continue;
1019
1056
  }
1020
- i.has(h) ? f.push([h, w]) : _.push(w.name);
1057
+ i.has(x) && h.push([x, f]);
1021
1058
  }
1022
- await ft(_, async (w) => {
1023
- await m.removeEntry(w, { recursive: !0 }), d += 1;
1024
- }), await ft(f, ([w, h]) => v(h, w));
1059
+ await vt(h, ([f, x]) => m(x, f));
1025
1060
  };
1026
- return await v(o.handle, ""), d;
1061
+ return await m(a.handle, ""), r;
1027
1062
  }
1028
- function lo(o, a) {
1029
- if (o.name === a.blocksDir)
1063
+ function Eo(a, o) {
1064
+ if (a.name === o.blocksDir)
1030
1065
  throw new Error(
1031
- `你选中的是「${a.blocksDir}」这一层(它就是放代码的那一层):导出会铺成 ${a.blocksDir}/${a.blocksDir}/…。请选它**上面**那一层 —— 也就是开发目录本身。`
1066
+ `你选中的是「${o.blocksDir}」这一层(它就是放代码的那一层):导出会铺成 ${o.blocksDir}/${o.blocksDir}/…。请选它**上面**那一层 —— 也就是开发目录本身。`
1032
1067
  );
1033
1068
  }
1034
- async function At(o) {
1035
- const a = [];
1036
- for await (const l of o.values()) a.push(l);
1037
- return a.sort((l, i) => l.name < i.name ? -1 : l.name > i.name ? 1 : 0), a;
1069
+ async function Mt(a) {
1070
+ const o = [];
1071
+ for await (const l of a.values()) o.push(l);
1072
+ return o.sort((l, i) => l.name < i.name ? -1 : l.name > i.name ? 1 : 0), o;
1038
1073
  }
1039
- function io(o) {
1040
- return o.charCodeAt(0) === 65279 ? o.slice(1) : o;
1074
+ function So(a) {
1075
+ return a.charCodeAt(0) === 65279 ? a.slice(1) : a;
1041
1076
  }
1042
- function uo(o) {
1043
- const a = o.lastIndexOf(".");
1044
- return a <= 0 ? "" : o.slice(a).toLowerCase();
1077
+ function To(a) {
1078
+ const o = a.lastIndexOf(".");
1079
+ return o <= 0 ? "" : a.slice(o).toLowerCase();
1045
1080
  }
1046
- const ro = { folders: [], failures: [], truncated: !1 };
1047
- async function vn(o, a, l) {
1048
- const i = await At(o), d = new Array(i.length);
1049
- await ft(i, async (b, _) => {
1050
- const f = a ? `${a}/${b.name}` : b.name, w = { files: {}, failures: [] };
1051
- if (d[_] = w, b.kind === "directory") {
1081
+ const Bo = { folders: [], failures: [], truncated: !1 };
1082
+ async function En(a, o, l) {
1083
+ const i = await Mt(a), r = new Array(i.length);
1084
+ await vt(i, async (b, h) => {
1085
+ const f = o ? `${o}/${b.name}` : b.name, x = { files: {}, failures: [] };
1086
+ if (r[h] = x, b.kind === "directory") {
1052
1087
  if (l.skipDirs.includes(b.name)) return;
1053
- const g = await vn(b, f, l);
1054
- for (const [A, K] of Object.entries(g.files))
1055
- w.files[`${b.name}/${A}`] = K;
1056
- w.failures.push(...g.failures);
1088
+ const g = await En(b, f, l);
1089
+ for (const [M, F] of Object.entries(g.files))
1090
+ x.files[`${b.name}/${M}`] = F;
1091
+ x.failures.push(...g.failures);
1057
1092
  return;
1058
1093
  }
1059
1094
  if (!l.platformFiles.includes(b.name)) {
1060
- if (!l.textExt.includes(uo(b.name))) {
1061
- w.failures.push({
1095
+ if (!l.textExt.includes(To(b.name))) {
1096
+ x.failures.push({
1062
1097
  kind: "file",
1063
1098
  where: f,
1064
1099
  message: `不是文本文件(认得的扩展名:${l.textExt.join(" ")}),已跳过`
@@ -1066,212 +1101,212 @@ async function vn(o, a, l) {
1066
1101
  return;
1067
1102
  }
1068
1103
  try {
1069
- const h = await b.getFile();
1070
- if (h.size > l.maxFileBytes) {
1071
- w.failures.push({
1104
+ const _ = await b.getFile();
1105
+ if (_.size > l.maxFileBytes) {
1106
+ x.failures.push({
1072
1107
  kind: "file",
1073
1108
  where: f,
1074
- message: `文件 ${Math.round(h.size / 1024)} KB 超过上限 ${Math.floor(l.maxFileBytes / 1024)} KB,已跳过`
1109
+ message: `文件 ${Math.round(_.size / 1024)} KB 超过上限 ${Math.floor(l.maxFileBytes / 1024)} KB,已跳过`
1075
1110
  });
1076
1111
  return;
1077
1112
  }
1078
- w.files[b.name] = io(await h.text());
1079
- } catch (h) {
1080
- w.failures.push({ kind: "file", where: f, message: `读不了这个文件:${Wt(h)}` });
1113
+ x.files[b.name] = So(await _.text());
1114
+ } catch (_) {
1115
+ x.failures.push({ kind: "file", where: f, message: `读不了这个文件:${ee(_)}` });
1081
1116
  }
1082
1117
  }
1083
1118
  });
1084
- const v = {}, m = [];
1085
- for (const b of d)
1086
- b && (Object.assign(v, b.files), m.push(...b.failures));
1087
- return { files: v, failures: m };
1088
- }
1089
- async function _n(o, a, l, i) {
1090
- const d = await At(o), v = d.filter((h) => h.kind === "directory"), m = d.filter((h) => h.kind === "file"), b = a.join("/"), _ = { folders: [], failures: [], truncated: !1 };
1091
- if (v.length === 0 || m.some((h) => h.name === i.entry)) {
1092
- const h = await vn(o, b, i);
1093
- return _.folders.push({ where: b, files: h.files }), _.failures.push(...h.failures), _;
1119
+ const m = {}, v = [];
1120
+ for (const b of r)
1121
+ b && (Object.assign(m, b.files), v.push(...b.failures));
1122
+ return { files: m, failures: v };
1123
+ }
1124
+ async function Sn(a, o, l, i) {
1125
+ const r = await Mt(a), m = r.filter((_) => _.kind === "directory"), v = r.filter((_) => _.kind === "file"), b = o.join("/"), h = { folders: [], failures: [], truncated: !1 };
1126
+ if (m.length === 0 || v.some((_) => _.name === i.entry)) {
1127
+ const _ = await En(a, b, i);
1128
+ return h.folders.push({ where: b, files: _.files }), h.failures.push(..._.failures), h;
1094
1129
  }
1095
- for (const h of m)
1096
- a.length === 0 && i.rootSkipFiles.includes(h.name.toLowerCase()) || _.failures.push({
1130
+ for (const _ of v)
1131
+ o.length === 0 && i.rootSkipFiles.includes(_.name.toLowerCase()) || h.failures.push({
1097
1132
  kind: "file",
1098
- where: [...a, h.name].join("/"),
1133
+ where: [...o, _.name].join("/"),
1099
1134
  message: `这一层直接放着一份文件,但它自己不是块文件夹、也没有 ${i.entry},文件没有归属`
1100
1135
  });
1101
- const f = v.map((h) => async () => i.skipDirs.includes(h.name) ? ro : l >= i.maxDepth ? {
1136
+ const f = m.map((_) => async () => i.skipDirs.includes(_.name) ? Bo : l >= i.maxDepth ? {
1102
1137
  folders: [],
1103
1138
  failures: [{
1104
1139
  kind: "dir",
1105
- where: [...a, h.name].join("/"),
1140
+ where: [...o, _.name].join("/"),
1106
1141
  message: `超过最大层数 ${i.maxDepth} 层还没见到 ${i.entry},没有继续往下找`
1107
1142
  }],
1108
1143
  truncated: !0
1109
- } : _n(h, [...a, h.name], l + 1, i)), w = new Array(f.length);
1110
- await ft(f, async (h, g) => {
1111
- w[g] = await h();
1144
+ } : Sn(_, [...o, _.name], l + 1, i)), x = new Array(f.length);
1145
+ await vt(f, async (_, g) => {
1146
+ x[g] = await _();
1112
1147
  });
1113
- for (const h of w)
1114
- h && (_.folders.push(...h.folders), _.failures.push(...h.failures), h.truncated && (_.truncated = !0));
1115
- return _;
1148
+ for (const _ of x)
1149
+ _ && (h.folders.push(..._.folders), h.failures.push(..._.failures), _.truncated && (h.truncated = !0));
1150
+ return h;
1116
1151
  }
1117
- function Ye(o) {
1118
- return o >= 1024 * 1024 ? `${(o / 1024 / 1024).toFixed(1)} MB` : `${Math.max(1, Math.round(o / 1024))} KB`;
1152
+ function an(a) {
1153
+ return a >= 1024 * 1024 ? `${(a / 1024 / 1024).toFixed(1)} MB` : `${Math.max(1, Math.round(a / 1024))} KB`;
1119
1154
  }
1120
- async function co(o, a) {
1121
- const l = await _n(o.handle, [], 0, a), i = {
1122
- root: o.name,
1155
+ async function Mo(a, o) {
1156
+ const l = await Sn(a.handle, [], 0, o), i = {
1157
+ root: a.name,
1123
1158
  folders: l.folders,
1124
1159
  failures: l.failures,
1125
1160
  truncated: l.truncated
1126
- }, d = i.folders.reduce(
1127
- (v, m) => v + Object.values(m.files).reduce((b, _) => b + _.length, 0),
1161
+ }, r = i.folders.reduce(
1162
+ (m, v) => m + Object.values(v.files).reduce((b, h) => b + h.length, 0),
1128
1163
  0
1129
1164
  );
1130
- if (d > a.maxBodyBytes)
1165
+ if (r > o.maxBodyBytes)
1131
1166
  throw new Error(
1132
- `这个目录读到的正文有 ${Ye(d)},超过一次读回的上限 ${Ye(a.maxBodyBytes)}:请先只留要改的那几个块,或者把大文件挪走。`
1167
+ `这个目录读到的正文有 ${an(r)},超过一次读回的上限 ${an(o.maxBodyBytes)}:请先只留要改的那几个块,或者把大文件挪走。`
1133
1168
  );
1134
1169
  return i;
1135
1170
  }
1136
- const po = { class: "mbc__head" }, bo = ["title"], mo = ["title"], fo = {
1171
+ const Ao = { class: "mbc__head" }, Ro = ["title"], Oo = ["title"], Po = {
1137
1172
  class: "mbc__tabs",
1138
1173
  role: "tablist"
1139
- }, vo = ["aria-selected"], _o = { class: "mbc__count" }, ho = ["title"], go = ["aria-selected"], yo = ["title"], ko = {
1174
+ }, Lo = ["aria-selected"], jo = { class: "mbc__count" }, Do = ["title"], Io = ["aria-selected"], No = ["title"], Fo = {
1140
1175
  key: 1,
1141
1176
  class: "mbc__chip is-ok"
1142
- }, $o = { class: "mbc__body" }, wo = {
1177
+ }, Uo = { class: "mbc__body" }, zo = {
1143
1178
  key: 0,
1144
1179
  class: "mbc__running"
1145
- }, xo = ["aria-valuenow"], Co = {
1180
+ }, Ho = ["aria-valuenow"], Ko = {
1146
1181
  key: 1,
1147
1182
  class: "mbc__confirm"
1148
- }, Eo = { class: "mbc__confirm-title" }, To = { class: "mbc__confirm-body" }, So = {
1183
+ }, Vo = { class: "mbc__confirm-title" }, qo = { class: "mbc__confirm-body" }, Jo = {
1149
1184
  key: 0,
1150
1185
  class: "mbc__mono"
1151
- }, Bo = { class: "mbc__actions" }, Ao = ["disabled"], Mo = ["disabled"], Oo = ["disabled"], Ro = {
1186
+ }, Go = { class: "mbc__confirm-check" }, Wo = { class: "mbc__actions" }, Yo = ["disabled"], Zo = ["disabled"], Xo = ["disabled"], Qo = {
1152
1187
  key: 2,
1153
1188
  class: "mbc__confirm"
1154
- }, Po = { class: "mbc__confirm-title" }, jo = { class: "mbc__confirm-body" }, Lo = { class: "mbc__mono" }, Io = { class: "mbc__actions" }, No = ["disabled"], Do = ["disabled"], Fo = { class: "mbc__panel mbc__panel--blocks" }, zo = { class: "mbc__title" }, Uo = { class: "mbc__count" }, Ho = {
1189
+ }, ta = { class: "mbc__confirm-title" }, ea = { class: "mbc__confirm-body" }, na = { class: "mbc__mono" }, sa = { class: "mbc__actions" }, oa = ["disabled"], aa = ["disabled"], la = { class: "mbc__panel mbc__panel--blocks" }, ia = { class: "mbc__title" }, ua = { class: "mbc__count" }, ra = {
1155
1190
  key: 0,
1156
1191
  class: "mbc__count mbc__count--tag"
1157
- }, Ko = {
1192
+ }, ca = {
1158
1193
  key: 0,
1159
1194
  class: "mbc__tagbar"
1160
- }, qo = ["title", "onClick"], Vo = { class: "mbc__list" }, Jo = ["title", "onClick"], Go = { class: "mbc__module" }, Wo = { class: "mbc__name" }, Yo = ["title"], Zo = {
1195
+ }, da = ["title", "onClick"], pa = { class: "mbc__list" }, ba = ["title", "onClick"], ma = { class: "mbc__module" }, fa = { class: "mbc__name" }, va = ["title"], ha = {
1161
1196
  key: 0,
1162
1197
  class: "mbc__where"
1163
- }, Xo = ["title"], Qo = {
1198
+ }, _a = ["title"], ga = {
1164
1199
  key: 0,
1165
1200
  class: "mbc__detail"
1166
- }, ta = {
1201
+ }, ya = {
1167
1202
  key: 0,
1168
1203
  class: "mbc__hint"
1169
- }, ea = { class: "mbc__meta" }, na = {
1204
+ }, ka = { class: "mbc__meta" }, $a = {
1170
1205
  key: 0,
1171
1206
  class: "mbc__blockdetail"
1172
- }, sa = {
1207
+ }, wa = {
1173
1208
  key: 1,
1174
1209
  class: "mbc__hint"
1175
- }, oa = { class: "mbc__hint" }, aa = {
1210
+ }, xa = ["disabled", "onClick"], Ca = ["disabled", "onClick"], Ea = ["disabled"], Sa = { class: "mbc__hint" }, Ta = {
1176
1211
  key: 0,
1177
1212
  class: "mbc__hint"
1178
- }, la = ["disabled", "onClick"], ia = ["onKeyup"], ua = ["disabled", "onClick"], ra = ["disabled"], ca = {
1213
+ }, Ba = ["disabled", "onClick"], Ma = ["onKeyup"], Aa = ["disabled", "onClick"], Ra = ["disabled"], Oa = {
1179
1214
  key: 0,
1180
1215
  class: "mbc__tagbar"
1181
- }, da = ["title", "onClick"], pa = {
1216
+ }, Pa = ["title", "onClick"], La = {
1182
1217
  key: 1,
1183
1218
  class: "mbc__tagbar"
1184
- }, ba = ["title", "onClick"], ma = { class: "mbc__mono" }, fa = { class: "mbc__actions mbc__actions--row" }, va = ["disabled", "onClick"], _a = { class: "mbc__versions" }, ha = { class: "mbc__versions-head" }, ga = ["disabled", "onClick"], ya = {
1219
+ }, ja = ["title", "onClick"], Da = { class: "mbc__mono" }, Ia = { class: "mbc__actions mbc__actions--row" }, Na = ["disabled", "onClick"], Fa = { class: "mbc__versions" }, Ua = { class: "mbc__versions-head" }, za = ["disabled", "onClick"], Ha = {
1185
1220
  key: 0,
1186
1221
  class: "mbc__hint"
1187
- }, ka = {
1222
+ }, Ka = {
1188
1223
  key: 1,
1189
1224
  class: "mbc__versions-list"
1190
- }, $a = { class: "mbc__mono" }, wa = { class: "mbc__hint" }, xa = { class: "mbc__actions" }, Ca = ["disabled", "onClick", "title"], Ea = ["disabled", "onClick", "title"], Ta = ["disabled", "onClick", "title"], Sa = ["disabled", "onClick", "title"], Ba = {
1225
+ }, Va = { class: "mbc__mono" }, qa = { class: "mbc__hint" }, Ja = { class: "mbc__actions" }, Ga = ["disabled", "onClick", "title"], Wa = ["disabled", "onClick", "title"], Ya = ["disabled", "onClick", "title"], Za = ["disabled", "onClick", "title"], Xa = {
1191
1226
  key: 2,
1192
1227
  class: "mbc__hint"
1193
- }, Aa = {
1228
+ }, Qa = {
1194
1229
  key: 3,
1195
1230
  class: "mbc__viewer"
1196
- }, Ma = { class: "mbc__versions-head" }, Oa = { class: "mbc__mono" }, Ra = { class: "mbc__viewer-body" }, Pa = { class: "mbc__panel mbc__panel--export" }, ja = { class: "mbc__field" }, La = ["disabled"], Ia = { class: "mbc__field" }, Na = { class: "mbc__radio" }, Da = ["checked"], Fa = { class: "mbc__radio" }, za = ["checked"], Ua = ["value", "disabled"], Ha = {
1231
+ }, tl = { class: "mbc__versions-head" }, el = { class: "mbc__mono" }, nl = { class: "mbc__viewer-body" }, sl = { class: "mbc__panel mbc__panel--export" }, ol = { class: "mbc__field" }, al = ["disabled"], ll = { class: "mbc__field" }, il = { class: "mbc__radio" }, ul = ["checked"], rl = { class: "mbc__radio" }, cl = ["checked"], dl = ["value", "disabled"], pl = {
1197
1232
  key: 0,
1198
1233
  value: ""
1199
- }, Ka = ["value"], qa = { class: "mbc__field" }, Va = ["value"], Ja = ["disabled"], Ga = ["disabled", "title"], Wa = { class: "mbc__hint" }, Ya = {
1234
+ }, bl = ["value"], ml = { class: "mbc__field" }, fl = ["value"], vl = ["disabled"], hl = ["disabled", "title"], _l = { class: "mbc__hint" }, gl = {
1200
1235
  key: 0,
1201
1236
  class: "mbc__hint"
1202
- }, Za = { class: "mbc__panel mbc__panel--read" }, Xa = { class: "mbc__field" }, Qa = ["value"], tl = ["disabled"], el = ["disabled"], nl = {
1237
+ }, yl = { class: "mbc__panel mbc__panel--read" }, kl = { class: "mbc__field" }, $l = ["value"], wl = ["disabled"], xl = ["disabled"], Cl = {
1203
1238
  key: 0,
1204
1239
  class: "mbc__hint"
1205
- }, sl = {
1240
+ }, El = {
1206
1241
  key: 1,
1207
1242
  class: "mbc__hint"
1208
- }, ol = {
1243
+ }, Sl = {
1209
1244
  key: 0,
1210
1245
  class: "mbc__hint"
1211
- }, al = { class: "mbc__ok-text" }, ll = ["disabled"], il = ["disabled"], ul = {
1246
+ }, Tl = { class: "mbc__ok-text" }, Bl = ["disabled"], Ml = ["disabled"], Al = {
1212
1247
  key: 1,
1213
1248
  class: "mbc__scan"
1214
- }, rl = { class: "mbc__pick" }, cl = ["disabled", "checked", "onChange"], dl = { class: "mbc__name" }, pl = { class: "mbc__module" }, bl = { class: "mbc__hint" }, ml = { class: "mbc__mono" }, fl = {
1249
+ }, Rl = { class: "mbc__pick" }, Ol = ["disabled", "checked", "onChange"], Pl = { class: "mbc__name" }, Ll = { class: "mbc__module" }, jl = { class: "mbc__hint" }, Dl = { class: "mbc__mono" }, Il = {
1215
1250
  key: 0,
1216
1251
  class: "mbc__problem"
1217
- }, vl = { class: "mbc__hint mbc__mono" }, _l = {
1252
+ }, Nl = { class: "mbc__hint mbc__mono" }, Fl = {
1218
1253
  key: 2,
1219
1254
  class: "mbc__hint"
1220
- }, hl = { class: "mbc__field" }, gl = ["title"], yl = {
1255
+ }, Ul = { class: "mbc__field" }, zl = ["title"], Hl = {
1221
1256
  key: 1,
1222
1257
  class: "mbc__chip is-ok"
1223
- }, kl = ["title"], $l = {
1258
+ }, Kl = ["title"], Vl = {
1224
1259
  key: 3,
1225
1260
  class: "mbc__hint"
1226
- }, wl = { class: "mbc__field mbc__field--end" }, xl = ["disabled"], Cl = { class: "mbc__panel mbc__panel--declared" }, El = { class: "mbc__title" }, Tl = { class: "p-tag p-tag-info" }, Sl = { class: "mbc__count" }, Bl = {
1261
+ }, ql = { class: "mbc__field mbc__field--end" }, Jl = ["disabled"], Gl = { class: "mbc__panel mbc__panel--declared" }, Wl = { class: "mbc__title" }, Yl = { class: "p-tag p-tag-info" }, Zl = { class: "mbc__count" }, Xl = {
1227
1262
  key: 0,
1228
1263
  class: "mbc__hint"
1229
- }, Al = { class: "mbc__hint" }, Ml = { class: "mbc__scan" }, Ol = { class: "mbc__pick" }, Rl = { class: "mbc__name" }, Pl = { class: "p-tag p-tag-info" }, jl = { class: "mbc__module" }, Ll = { class: "mbc__hint" }, Il = { class: "mbc__mono" }, Nl = { class: "mbc__hint mbc__mono" }, Dl = {
1264
+ }, Ql = { class: "mbc__hint" }, ti = { class: "mbc__scan" }, ei = { class: "mbc__pick" }, ni = { class: "mbc__name" }, si = { class: "p-tag p-tag-info" }, oi = { class: "mbc__module" }, ai = { class: "mbc__hint" }, li = { class: "mbc__mono" }, ii = { class: "mbc__hint mbc__mono" }, ui = {
1230
1265
  key: 3,
1231
1266
  class: "mbc__panel mbc__panel--result"
1232
- }, Fl = { class: "mbc__summary" }, zl = { class: "mbc__chip is-ok" }, Ul = {
1267
+ }, ri = { class: "mbc__summary" }, ci = { class: "mbc__chip is-ok" }, di = {
1233
1268
  key: 0,
1234
1269
  class: "mbc__chip is-bad"
1235
- }, Hl = {
1270
+ }, pi = {
1236
1271
  key: 1,
1237
1272
  class: "mbc__chip is-bad"
1238
- }, Kl = {
1273
+ }, bi = {
1239
1274
  key: 2,
1240
1275
  class: "mbc__hint"
1241
- }, ql = { class: "mbc__actions" }, Vl = { class: "mbc__foot" }, Jl = ["title"], Gl = {
1276
+ }, mi = { class: "mbc__actions" }, fi = { class: "mbc__foot" }, vi = ["title"], hi = {
1242
1277
  key: 1,
1243
1278
  class: "mbc__error"
1244
- }, Wl = {
1279
+ }, _i = {
1245
1280
  key: 2,
1246
1281
  class: "mbc__notice"
1247
- }, Yl = {
1282
+ }, gi = {
1248
1283
  key: 3,
1249
1284
  class: "mbc__hint mbc__foot-idle"
1250
- }, Zl = { class: "mbc__modal-box" }, Xl = { class: "mbc__modal-head" }, Ql = { class: "mbc__modal-body" }, ti = {
1285
+ }, yi = { class: "mbc__modal-box" }, ki = { class: "mbc__modal-head" }, $i = { class: "mbc__modal-body" }, wi = {
1251
1286
  key: 0,
1252
1287
  class: "mbc__issues-group"
1253
- }, ei = { class: "mbc__title" }, ni = { class: "mbc__failures" }, si = {
1288
+ }, xi = { class: "mbc__title" }, Ci = { class: "mbc__failures" }, Ei = {
1254
1289
  key: 1,
1255
1290
  class: "mbc__issues-group"
1256
- }, oi = { class: "mbc__title" }, ai = { class: "mbc__failures" }, li = { class: "mbc__kind" }, ii = { class: "mbc__mono" }, ui = {
1291
+ }, Si = { class: "mbc__title" }, Ti = { class: "mbc__failures" }, Bi = { class: "mbc__kind" }, Mi = { class: "mbc__mono" }, Ai = {
1257
1292
  key: 2,
1258
1293
  class: "mbc__issues-group"
1259
- }, ri = { class: "mbc__title" }, ci = { class: "mbc__failures" }, di = { class: "mbc__mono" }, pi = {
1294
+ }, Ri = { class: "mbc__title" }, Oi = { class: "mbc__failures" }, Pi = { class: "mbc__mono" }, Li = {
1260
1295
  key: 3,
1261
1296
  class: "mbc__issues-group"
1262
- }, bi = { class: "mbc__title" }, mi = { class: "mbc__failures" }, fi = { key: 0 }, vi = {
1297
+ }, ji = { class: "mbc__title" }, Di = { class: "mbc__failures" }, Ii = { key: 0 }, Ni = {
1263
1298
  key: 1,
1264
1299
  class: "mbc__failures mbc__failures--nested"
1265
- }, _i = {
1300
+ }, Fi = {
1266
1301
  key: 4,
1267
1302
  class: "mbc__hint"
1268
- }, hi = { class: "mbc__modal-foot" }, gi = { class: "mbc__modal-box" }, yi = { class: "mbc__modal-head" }, ki = { class: "mbc__modal-body" }, $i = { class: "mbc__reports" }, wi = { class: "mbc__report-head" }, xi = { class: "mbc__mono" }, Ci = { class: "mbc__report-text" }, Ei = {
1303
+ }, Ui = { class: "mbc__modal-foot" }, zi = { class: "mbc__modal-box" }, Hi = { class: "mbc__modal-head" }, Ki = { class: "mbc__modal-body" }, Vi = { class: "mbc__reports" }, qi = { class: "mbc__report-head" }, Ji = { class: "mbc__mono" }, Gi = { class: "mbc__report-text" }, Wi = {
1269
1304
  key: 0,
1270
1305
  class: "mbc__hint"
1271
- }, Ti = { class: "mbc__modal-foot" }, _e = 2, Si = 100, Bi = 250, Ai = /* @__PURE__ */ Ce({
1306
+ }, Yi = { class: "mbc__modal-foot" }, xe = 2, Zi = 100, Xi = 250, Qi = /* @__PURE__ */ Re({
1272
1307
  __name: "MagicBlockConsole",
1273
- setup(o) {
1274
- const a = {
1308
+ setup(a) {
1309
+ const o = {
1275
1310
  modified: "有改动",
1276
1311
  unchanged: "没改动",
1277
1312
  missing: "目录里没有",
@@ -1279,115 +1314,115 @@ const po = { class: "mbc__head" }, bo = ["title"], mo = ["title"], fo = {
1279
1314
  两种情形共用它(前端声明了、手里却还没有那个文件夹 / 手里那个文件夹的清单 id 库里没有)
1280
1315
  —— 对用户是同一件事:这个块不在库里。 */
1281
1316
  "not-in-db": "不在数据库"
1282
- }, l = a["not-in-db"], { isStaff: i } = en(), d = tn(), { active: v } = Wn(), m = (n) => !nn(n, d), b = x(!1), _ = x(""), f = x([]), w = x(""), h = x(""), g = x(""), A = x([]), K = x(!1), q = x(!1), U = x("blocks"), V = x(""), Z = x([]), yt = x(""), X = x(""), C = x(!1), kt = x(!1), it = x(!1), Mt = x(!1), $t = x(!1), N = x(null), P = x(null), Q = x("one"), dt = x(Rt()), ut = R(() => f.value.find((n) => n.id === dt.value) ?? null), Ot = () => Q.value === "all" ? {} : { blocks: [dt.value] };
1283
- function Dt(n) {
1284
- dt.value = n;
1317
+ }, l = o["not-in-db"], { isStaff: i } = dn(), r = cn(), { active: m } = ps(), v = (n) => !pn(n, r), b = w(!1), h = w(""), f = w([]), x = w(""), _ = w(""), g = w(""), M = w([]), F = w(!1), B = w(!1), R = w("blocks"), L = w(""), G = w([]), pt = w(""), Z = w(""), gt = w(""), yt = w(""), C = w(!1), Lt = w(!1), lt = w(!1), kt = w(!1), nt = w(!1), K = w(null), U = w(null), X = w("one"), $t = w(Ht()), bt = O(() => f.value.find((n) => n.id === $t.value) ?? null), wt = () => X.value === "all" ? {} : { blocks: [$t.value] };
1318
+ function zt(n) {
1319
+ $t.value = n;
1285
1320
  try {
1286
1321
  window.localStorage.setItem("mb:export-block", n);
1287
1322
  } catch {
1288
1323
  }
1289
1324
  }
1290
- function Rt() {
1325
+ function Ht() {
1291
1326
  try {
1292
1327
  return window.localStorage.getItem("mb:export-block") ?? "";
1293
1328
  } catch {
1294
1329
  return "";
1295
1330
  }
1296
1331
  }
1297
- St(f, (n) => {
1298
- n.length !== 0 && (n.some((t) => t.id === dt.value) || Dt(n[0].id));
1332
+ Ot(f, (n) => {
1333
+ n.length !== 0 && (n.some((t) => t.id === $t.value) || zt(n[0].id));
1299
1334
  });
1300
- const tt = x(null), rt = x(""), M = x(null), F = x({}), I = x([]), J = x([]), pt = x({}), wt = x(""), et = x(null);
1301
- async function $(n) {
1302
- wt.value = n;
1335
+ const Q = w(null), V = w(""), A = w(null), it = w({}), W = w([]), Y = w([]), st = w({}), $ = w(""), E = w(null);
1336
+ async function j(n) {
1337
+ $.value = n;
1303
1338
  try {
1304
- const t = await st(`/magic-blocks/${encodeURIComponent(n)}/versions`);
1305
- pt.value = { ...pt.value, [n]: t.versions ?? [] };
1339
+ const t = await at(`/magic-blocks/${encodeURIComponent(n)}/versions`);
1340
+ st.value = { ...st.value, [n]: t.versions ?? [] };
1306
1341
  } catch (t) {
1307
- Lt(t, "读版本列表");
1342
+ Nt(t, "读版本列表");
1308
1343
  } finally {
1309
- wt.value = "";
1344
+ $.value = "";
1310
1345
  }
1311
1346
  }
1312
- function T(n) {
1347
+ function ut(n) {
1313
1348
  const t = [n.current ? "当前" : "", n.empty ? "空包(代码被删过)" : ""].filter(Boolean).join("、");
1314
1349
  return `v${n.number}${t ? ` · ${t}` : ""}`;
1315
1350
  }
1316
- function D(n) {
1351
+ function jt(n) {
1317
1352
  return n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${Math.round(n / 1024)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
1318
1353
  }
1319
- const O = x(null);
1320
- function Ft(n, t) {
1354
+ const z = w(null);
1355
+ function Dt(n, t) {
1321
1356
  return `${String(t || "").replace(/[\\/:*?"<>|]/g, "").trim() || "block"}-${n}`;
1322
1357
  }
1323
- const Yt = (n) => G(async () => {
1324
- const t = Ft(n.id, n.name || n.module);
1325
- let e = N.value, u = null;
1358
+ const ne = (n) => J(async () => {
1359
+ const t = Dt(n.id, n.name || n.module);
1360
+ let e = K.value, u = null;
1326
1361
  if (e)
1327
1362
  try {
1328
- u = await ve(e, tt.value ?? await le());
1363
+ u = await we(e, Q.value ?? await pe());
1329
1364
  } catch {
1330
1365
  e = null, u = null;
1331
1366
  }
1332
- O.value = { row: n, target: e, folder: t, inventory: u };
1333
- }, C), Pt = () => G(async () => {
1334
- const n = O.value;
1335
- if (O.value = null, !n) return;
1367
+ z.value = { row: n, target: e, folder: t, inventory: u };
1368
+ }, C), se = () => J(async () => {
1369
+ const n = z.value;
1370
+ if (z.value = null, !n) return;
1336
1371
  const t = `「${n.row.module} / ${n.row.name || n.row.id}」`;
1337
- Be(), j.value = { active: !0, percent: 0, stage: "清本机那个文件夹…", failed: !1 };
1372
+ je(), N.value = { active: !0, percent: 0, stage: "清本机那个文件夹…", failed: !1 };
1338
1373
  let e = "";
1339
1374
  if (n.target)
1340
1375
  try {
1341
- const u = await Zt(n.target, n.folder), E = await oo(u);
1342
- e = `清掉了本机「${n.target.name}/${n.folder}」里的 ${E} 项`;
1376
+ const u = await oe(n.target, n.folder), S = await wo(u);
1377
+ e = `清掉了本机「${n.target.name}/${n.folder}」里的 ${S} 项`;
1343
1378
  } catch (u) {
1344
- e = `本机那份没清成(${Ct(u)})`;
1379
+ e = `本机那份没清成(${Rt(u)})`;
1345
1380
  }
1346
1381
  else
1347
1382
  e = "没选开发目录 ⇒ 本机那份没动";
1348
1383
  ot(60, "清库里那份代码…");
1349
1384
  try {
1350
- await st(`/magic-blocks/${n.row.id}`, { method: "DELETE" });
1385
+ await at(`/magic-blocks/${n.row.id}`, { method: "DELETE" });
1351
1386
  } catch (u) {
1352
- throw vt(!1, "本机清了,但库里那份代码没清成"), new Error(`${e};但**库里那份代码没清成**(${Ct(u)})—— 再点一次「删除代码文件」`);
1387
+ throw xt(!1, "本机清了,但库里那份代码没清成"), new Error(`${e};但**库里那份代码没清成**(${Rt(u)})—— 再点一次「删除代码文件」`);
1353
1388
  }
1354
- await Tt(), rt.value = `${t}的代码文件已删除:${e};库里那一份也清空了 ——**块还在**(页面上会显示成占位框)。想找回来:上面「块」那一屏点开这一块 → 版本史 → 对上一版点「切回」`, g.value = `删掉了${t}的代码文件(块本身还在)`, vt(!0, "完成");
1389
+ await Et(), V.value = `${t}的代码文件已删除:${e};库里那一份也清空了 ——**块还在**(页面上会显示成占位框)。想找回来:上面「块」那一屏点开这一块 → 版本史 → 对上一版点「切回」`, g.value = `删掉了${t}的代码文件(块本身还在)`, xt(!0, "完成");
1355
1390
  }, C);
1356
- async function Zt(n, t) {
1391
+ async function oe(n, t) {
1357
1392
  let e = n.handle;
1358
- for (const u of Te(t))
1393
+ for (const u of Pe(t))
1359
1394
  e = await e.getDirectoryHandle(u, { create: !0 });
1360
1395
  return { handle: e, name: `${n.name}/${t}` };
1361
1396
  }
1362
- const H = x(null), j = x({ active: !1, percent: 0, stage: "", failed: !1 }), Xt = R(() => ({
1363
- width: `${Math.max(0, Math.min(100, j.value.percent))}%`,
1364
- background: j.value.failed ? "var(--sp-color-danger)" : "var(--sp-color-primary, var(--primary-color))"
1397
+ const q = w(null), Kt = w(!1), N = w({ active: !1, percent: 0, stage: "", failed: !1 }), Tn = O(() => ({
1398
+ width: `${Math.max(0, Math.min(100, N.value.percent))}%`,
1399
+ background: N.value.failed ? "var(--sp-color-danger)" : "var(--sp-color-primary, var(--primary-color))"
1365
1400
  }));
1366
- let Qt = [], Se = 0;
1367
- function te(n = !1) {
1368
- if (!(!n && performance.now() - Se < Bi)) {
1369
- Se = performance.now();
1401
+ let ae = [], Le = 0;
1402
+ function le(n = !1) {
1403
+ if (!(!n && performance.now() - Le < Xi)) {
1404
+ Le = performance.now();
1370
1405
  try {
1371
- window.localStorage.setItem("mb:progress", JSON.stringify(Qt));
1406
+ window.localStorage.setItem("mb:progress", JSON.stringify(ae));
1372
1407
  } catch {
1373
1408
  }
1374
1409
  }
1375
1410
  }
1376
1411
  function ot(n, t) {
1377
- j.value = { active: !0, percent: Math.max(j.value.percent, n), stage: t, failed: !1 }, Qt.push({ p: j.value.percent, s: t, t: Math.round(performance.now()) }), te();
1412
+ N.value = { active: !0, percent: Math.max(N.value.percent, n), stage: t, failed: !1 }, ae.push({ p: N.value.percent, s: t, t: Math.round(performance.now()) }), le();
1378
1413
  }
1379
- function vt(n, t) {
1380
- ot(n ? 100 : j.value.percent, t), j.value = { active: !n, percent: n ? 100 : j.value.percent, stage: t, failed: !n }, te(!0);
1414
+ function xt(n, t) {
1415
+ ot(n ? 100 : N.value.percent, t), N.value = { active: !n, percent: n ? 100 : N.value.percent, stage: t, failed: !n }, le(!0);
1381
1416
  }
1382
- function Be() {
1383
- Qt = [], te(!0);
1417
+ function je() {
1418
+ ae = [], le(!0);
1384
1419
  }
1385
- const Ae = (n) => (n.disabledReason ?? "").trim(), ee = (n) => (n.issues ?? []).map((t) => String(t?.message ?? "")).filter(Boolean), zt = (n) => Ms(n.id);
1386
- function hn(n) {
1387
- w.value = w.value === n.id ? "" : n.id, w.value === n.id && $(n.id);
1388
- const t = v.value;
1389
- mn(n.id);
1390
- const e = n.name || n.id, u = zt(n);
1420
+ const De = (n) => (n.disabledReason ?? "").trim(), ie = (n) => (n.issues ?? []).map((t) => String(t?.message ?? "")).filter(Boolean), Vt = (n) => Gs(n.id);
1421
+ function Bn(n) {
1422
+ x.value = x.value === n.id ? "" : n.id, x.value === n.id && j(n.id);
1423
+ const t = m.value;
1424
+ wn(n.id);
1425
+ const e = n.name || n.id, u = Vt(n);
1391
1426
  if (u.length === 0) {
1392
1427
  g.value = `「${e}」这次会话里还没在哪条标签上露过面:先打开挂着它的那一页,再点一次`;
1393
1428
  return;
@@ -1396,127 +1431,133 @@ const po = { class: "mbc__head" }, bo = ["title"], mo = ["title"], fo = {
1396
1431
  g.value = `「${e}」就在这一条标签上(${u.join(" / ")}):已经把它标红`;
1397
1432
  return;
1398
1433
  }
1399
- const E = Os(n.id, t, m);
1400
- if (E) {
1401
- g.value = `「${e}」不在这一条标签上:正在切到 ${E} 那条标签`, ge(E);
1434
+ const S = Ws(n.id, t, v);
1435
+ if (S) {
1436
+ g.value = `「${e}」不在这一条标签上:正在切到 ${S} 那条标签`, Ee(S);
1402
1437
  return;
1403
1438
  }
1404
1439
  g.value = `「${e}」只挂在带参数的实例标签上(${u.join(" / ")}):不替你挑一单 —— 自己打开要看的那一页再点`;
1405
1440
  }
1406
- const gn = (n, t) => G(async () => {
1407
- const e = await st(
1441
+ const Mn = (n, t) => J(async () => {
1442
+ const e = await at(
1408
1443
  `/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`
1409
1444
  );
1410
- et.value = { id: n.id, number: t, files: e.files ?? {} }, g.value = `正在看「${n.name || n.id}」的 v${t}(只读:不会改库里任何东西)`;
1411
- }, C), yn = (n, t) => G(async () => {
1445
+ E.value = { id: n.id, number: t, files: e.files ?? {} }, g.value = `正在看「${n.name || n.id}」的 v${t}(只读:不会改库里任何东西)`;
1446
+ }, C), An = (n, t) => J(async () => {
1412
1447
  window.confirm(`把「${n.name || n.id}」切回 v${t}?
1413
1448
 
1414
- 这会把那一版的代码变成**当前版**,并且记成一个**新版本**(号继续 +1):历史只追加,旧版本一个都不会没。`) && (await Et(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { updatedBy: "" }), g.value = `「${n.name || n.id}」已切回 v${t}(并记成了一个新版本)`, await Tt(), await $(n.id));
1415
- }, C), kn = (n, t) => G(async () => {
1449
+ 这会把那一版的代码变成**当前版**,并且记成一个**新版本**(号继续 +1):历史只追加,旧版本一个都不会没。`) && (await Ct(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { updatedBy: "" }), g.value = `「${n.name || n.id}」已切回 v${t}(并记成了一个新版本)`, await Et(), await j(n.id));
1450
+ }, C), Rn = (n, t) => J(async () => {
1416
1451
  window.confirm(`删掉「${n.name || n.id}」的 v${t}?
1417
1452
 
1418
- 这一版的代码就找不回来了(别的版本不受影响)。`) && (await st(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { method: "DELETE" }), g.value = `删掉了「${n.name || n.id}」的 v${t}`, await $(n.id));
1419
- }, C), $n = (n, t) => G(async () => {
1453
+ 这一版的代码就找不回来了(别的版本不受影响)。`) && (await at(`/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}`, { method: "DELETE" }), g.value = `删掉了「${n.name || n.id}」的 v${t}`, await j(n.id));
1454
+ }, C), On = (n, t) => J(async () => {
1420
1455
  const e = await fetch(
1421
1456
  `http://localhost:3000/magic-blocks/${encodeURIComponent(n.id)}/versions/${t}?download=1`,
1422
- { credentials: "include", headers: Gt("GET", !1) }
1457
+ { credentials: "include", headers: te("GET", !1) }
1423
1458
  );
1424
1459
  if (!e.ok) throw new Error(`下载失败(HTTP ${e.status})`);
1425
- const u = await e.blob(), E = URL.createObjectURL(u);
1460
+ const u = await e.blob(), S = URL.createObjectURL(u);
1426
1461
  try {
1427
- const B = document.createElement("a");
1428
- B.href = E, B.download = `magic-block-${n.name || n.id}-v${t}.zip`, document.body.appendChild(B), B.click(), B.remove();
1462
+ const D = document.createElement("a");
1463
+ D.href = S, D.download = `magic-block-${n.name || n.id}-v${t}.zip`, document.body.appendChild(D), D.click(), D.remove();
1429
1464
  } finally {
1430
- setTimeout(() => URL.revokeObjectURL(E), 0);
1465
+ setTimeout(() => URL.revokeObjectURL(S), 0);
1431
1466
  }
1432
1467
  g.value = `已下载「${n.name || n.id}」的 v${t}`;
1433
1468
  }, C);
1434
- function wn(n) {
1435
- yt.value = n.id, X.value = (n.tags ?? []).join(", ");
1436
- }
1437
- const Me = (n) => G(async () => {
1438
- const t = X.value.split(/[,,\s]+/).map((u) => u.trim()).filter(Boolean), e = await Et(`/magic-blocks/${encodeURIComponent(n.id)}/tags`, { tags: t });
1439
- yt.value = "", g.value = `「${n.name || n.id}」的标签已存:${(e.tags ?? []).join(" / ") || "(一个都不剩)"}`, await Tt();
1440
- }, C, "存标签");
1441
- function xn(n) {
1442
- const t = X.value.split(/[,,\s]+/).map((e) => e.trim()).filter(Boolean);
1443
- t.some((e) => e.toLowerCase() === n.toLowerCase()) || t.push(n), X.value = t.join(", ");
1444
- }
1445
- function Cn(n) {
1446
- X.value = X.value.split(/[,,\s]+/).map((t) => t.trim()).filter((t) => t && t.toLowerCase() !== n.toLowerCase()).join(", ");
1447
- }
1448
- function En(n) {
1449
- const t = V.value.trim().toLowerCase();
1469
+ function Pn(n) {
1470
+ pt.value = n.id, Z.value = (n.tags ?? []).join(", ");
1471
+ }
1472
+ const Ie = (n) => J(async () => {
1473
+ const t = Z.value.split(/[,,\s]+/).map((u) => u.trim()).filter(Boolean), e = await Ct(`/magic-blocks/${encodeURIComponent(n.id)}/tags`, { tags: t });
1474
+ pt.value = "", g.value = `「${n.name || n.id}」的标签已存:${(e.tags ?? []).join(" / ") || "(一个都不剩)"}`, await Et();
1475
+ }, C, "存标签"), Ln = (n) => J(async () => {
1476
+ const t = await Ct(`/magic-blocks/${encodeURIComponent(n.id)}/detail`, { detail: yt.value });
1477
+ gt.value = "", g.value = `「${n.name || n.id}」的详情已存${(t.detail ?? "").trim() ? "" : "(清掉了)"};下次导出会写进它的 magic-block.open.yaml`, await Et();
1478
+ }, C, "存详情");
1479
+ function jn(n) {
1480
+ gt.value = n.id, yt.value = (n.detail ?? "").trim();
1481
+ }
1482
+ function Dn(n) {
1483
+ const t = Z.value.split(/[,,\s]+/).map((e) => e.trim()).filter(Boolean);
1484
+ t.some((e) => e.toLowerCase() === n.toLowerCase()) || t.push(n), Z.value = t.join(", ");
1485
+ }
1486
+ function In(n) {
1487
+ Z.value = Z.value.split(/[,,\s]+/).map((t) => t.trim()).filter((t) => t && t.toLowerCase() !== n.toLowerCase()).join(", ");
1488
+ }
1489
+ function Nn(n) {
1490
+ const t = L.value.trim().toLowerCase();
1450
1491
  return t ? (n.tags ?? []).some((e) => e.toLowerCase().includes(t)) : !0;
1451
1492
  }
1452
- function Tn(n) {
1453
- const t = zt(n), e = t.length === 0 ? "点一下:这次会话里它还没在哪条标签上露过面" : `点一下:把「${n.name || n.id}」标红,并在需要时切到挂着它的标签(${t.join(" / ")})`, u = Ae(n);
1493
+ function Fn(n) {
1494
+ const t = Vt(n), e = t.length === 0 ? "点一下:这次会话里它还没在哪条标签上露过面" : `点一下:把「${n.name || n.id}」标红,并在需要时切到挂着它的标签(${t.join(" / ")})`, u = De(n);
1454
1495
  return u ? `${u}
1455
1496
  ${e}` : e;
1456
1497
  }
1457
- const Oe = R(() => {
1458
- const n = _.value.trim().toLowerCase();
1459
- return f.value.filter((t) => En(t) ? n ? `${t.module} ${t.name} ${t.brief} ${t.detail ?? ""} ${t.id} v${t.version ?? ""} ${(t.tags ?? []).join(" ")}`.toLowerCase().includes(n) : !0 : !1);
1460
- }), Ut = R(() => (M.value?.blocks ?? []).filter((n) => n.canApply)), Ht = R(() => Ut.value.filter((n) => F.value[n.id] === !0)), xt = x(!1), at = R(() => I.value.length + (M.value?.failures ?? []).length + J.value.filter((n) => !n.ok).length), jt = R(() => J.value.filter((n) => !n.ok)), ne = R(() => J.value.filter((n) => n.ok).length), se = R(() => f.value.filter((n) => n.enabled === !1).length);
1461
- function Sn() {
1498
+ const Ne = O(() => {
1499
+ const n = h.value.trim().toLowerCase();
1500
+ return f.value.filter((t) => Nn(t) ? n ? `${t.module} ${t.name} ${t.brief} ${t.detail ?? ""} ${t.id} v${t.version ?? ""} ${(t.tags ?? []).join(" ")}`.toLowerCase().includes(n) : !0 : !1);
1501
+ }), qt = O(() => (A.value?.blocks ?? []).filter((n) => n.canApply)), Jt = O(() => qt.value.filter((n) => it.value[n.id] === !0)), At = w(!1), rt = O(() => W.value.length + (A.value?.failures ?? []).length + Y.value.filter((n) => !n.ok).length), It = O(() => Y.value.filter((n) => !n.ok)), ue = O(() => Y.value.filter((n) => n.ok).length), re = O(() => f.value.filter((n) => n.enabled === !1).length);
1502
+ function Un() {
1462
1503
  const n = /* @__PURE__ */ new Set(), t = [];
1463
- for (const e of Re()) {
1504
+ for (const e of Fe()) {
1464
1505
  const u = typeof e?.path == "string" ? e.path.trim() : "";
1465
1506
  if (!u || n.has(u) || u.includes(":") || u.includes("*") || e.redirect || !e.components?.default || e.meta?.tab === !1) continue;
1466
1507
  n.add(u);
1467
- const E = e.meta?.title ?? e.meta?.sub, B = e.meta?.group;
1508
+ const S = e.meta?.title ?? e.meta?.sub, D = e.meta?.group;
1468
1509
  t.push({
1469
1510
  path: u,
1470
- title: typeof E == "string" && E.trim() ? E.trim() : u,
1471
- group: typeof B == "string" ? B.trim() : ""
1511
+ title: typeof S == "string" && S.trim() ? S.trim() : u,
1512
+ group: typeof D == "string" ? D.trim() : ""
1472
1513
  });
1473
1514
  }
1474
1515
  return t;
1475
1516
  }
1476
- function Re() {
1477
- return d?.getRoutes?.() ?? [];
1517
+ function Fe() {
1518
+ return r?.getRoutes?.() ?? [];
1478
1519
  }
1479
- const oe = R(() => Ws(Re(), Vs, f.value.map((n) => n.id)));
1480
- function Ct(n) {
1520
+ const ce = O(() => bo(Fe(), ro, f.value.map((n) => n.id)));
1521
+ function Rt(n) {
1481
1522
  return (n instanceof Error ? n.message.trim() : String(n)) || "请求没有到达后端(网络或登录态的问题),请重试";
1482
1523
  }
1483
- function Bn(n) {
1524
+ function zn(n) {
1484
1525
  const t = n?.issues;
1485
1526
  return Array.isArray(t) ? t.map((e) => typeof e == "string" ? e : String(e?.message ?? "")).filter(Boolean) : [];
1486
1527
  }
1487
- async function Et(n, t) {
1528
+ async function Ct(n, t) {
1488
1529
  const e = JSON.stringify(t);
1489
1530
  try {
1490
- return await st(n, { method: "POST", body: e });
1531
+ return await at(n, { method: "POST", body: e });
1491
1532
  } catch (u) {
1492
- const E = Ct(u), B = await fetch(`http://localhost:3000${n}`, {
1533
+ const S = Rt(u), D = await fetch(`http://localhost:3000${n}`, {
1493
1534
  method: "POST",
1494
1535
  credentials: "include",
1495
- headers: { "Content-Type": "application/json", ...Gt("POST", !0) },
1536
+ headers: { "Content-Type": "application/json", ...te("POST", !0) },
1496
1537
  body: e
1497
- }).then((Y) => Y.json()).catch(() => null), W = Bn(B);
1498
- throw W.length === 0 ? new Error(E) : new Error(`${String(B?.message ?? E)}
1499
- - ${W.join(`
1538
+ }).then((mt) => mt.json()).catch(() => null), P = zn(D);
1539
+ throw P.length === 0 ? new Error(S) : new Error(`${String(D?.message ?? S)}
1540
+ - ${P.join(`
1500
1541
  - `)}`);
1501
1542
  }
1502
1543
  }
1503
- async function An() {
1504
- const n = A.value.map((t) => `[${t.at}] ${t.where}
1544
+ async function Hn() {
1545
+ const n = M.value.map((t) => `[${t.at}] ${t.where}
1505
1546
  ${t.text}`).join(`
1506
1547
 
1507
1548
  `);
1508
1549
  try {
1509
- await navigator.clipboard.writeText(n), g.value = `已复制 ${A.value.length} 条报错`;
1550
+ await navigator.clipboard.writeText(n), g.value = `已复制 ${M.value.length} 条报错`;
1510
1551
  } catch (t) {
1511
- Lt(t, "复制报错");
1552
+ Nt(t, "复制报错");
1512
1553
  }
1513
1554
  }
1514
- function Mn() {
1555
+ function Kn() {
1515
1556
  const n = [];
1516
- I.value.length > 0 && n.push("【前端校验拦下的】", ...I.value.map((t) => `- ${t}`), "");
1517
- for (const t of M.value?.failures ?? [])
1557
+ W.value.length > 0 && n.push("【前端校验拦下的】", ...W.value.map((t) => `- ${t}`), "");
1558
+ for (const t of A.value?.failures ?? [])
1518
1559
  n.push(`【读回:${t.kind || "问题"}】${t.where || ""}`, `- ${t.message || ""}`, "");
1519
- for (const t of jt.value)
1560
+ for (const t of It.value)
1520
1561
  n.push(
1521
1562
  `【没存成】${t.name || t.id}`,
1522
1563
  `- ${t.error || ""}`,
@@ -1526,209 +1567,231 @@ ${t.text}`).join(`
1526
1567
  return n.join(`
1527
1568
  `).trim() || "这一趟没有问题。";
1528
1569
  }
1529
- async function On() {
1570
+ async function Vn() {
1530
1571
  try {
1531
- await navigator.clipboard.writeText(Mn()), g.value = `已复制这一趟的 ${at.value} 条问题`;
1572
+ await navigator.clipboard.writeText(Kn()), g.value = `已复制这一趟的 ${rt.value} 条问题`;
1532
1573
  } catch (n) {
1533
- Lt(n, "复制问题");
1574
+ Nt(n, "复制问题");
1534
1575
  }
1535
1576
  }
1536
- function Lt(n, t) {
1537
- const e = Ct(n);
1538
- h.value = e, A.value = [...A.value, { at: (/* @__PURE__ */ new Date()).toLocaleTimeString(), where: t, text: e }];
1577
+ function Nt(n, t) {
1578
+ const e = Rt(n);
1579
+ _.value = e, M.value = [...M.value, { at: (/* @__PURE__ */ new Date()).toLocaleTimeString(), where: t, text: e }];
1539
1580
  }
1540
- function ae() {
1541
- h.value = "", A.value = [];
1581
+ function de() {
1582
+ _.value = "", M.value = [];
1542
1583
  }
1543
- async function Tt() {
1584
+ async function Et() {
1544
1585
  try {
1545
- const n = await st("/magic-blocks/index");
1546
- f.value = n.blocks ?? [], Z.value = n.tags ?? [];
1586
+ const n = await at("/magic-blocks/index");
1587
+ f.value = n.blocks ?? [], G.value = n.tags ?? [];
1547
1588
  } catch (n) {
1548
- Lt(n, "读块清单");
1589
+ Nt(n, "读块清单");
1549
1590
  }
1550
1591
  }
1551
- async function G(n, t, e = "") {
1552
- t.value = !0, ae();
1592
+ async function J(n, t, e = "") {
1593
+ t.value = !0, de();
1553
1594
  try {
1554
- await n(), xs();
1595
+ await n(), Us();
1555
1596
  } catch (u) {
1556
- Lt(u, e || "这个动作");
1597
+ Nt(u, e || "这个动作");
1557
1598
  } finally {
1558
1599
  t.value = !1;
1559
1600
  }
1560
1601
  }
1561
- const Rn = () => G(async () => {
1562
- kt.value = !0;
1602
+ const qn = () => J(async () => {
1603
+ Lt.value = !0;
1563
1604
  try {
1564
- await st("/magic-blocks/check", { method: "POST", body: JSON.stringify({}) }), g.value = "全部魔法块重新校验完了", await Tt();
1605
+ await at("/magic-blocks/check", { method: "POST", body: JSON.stringify({}) }), g.value = "全部魔法块重新校验完了", await Et();
1565
1606
  } finally {
1566
- kt.value = !1;
1607
+ Lt.value = !1;
1567
1608
  }
1568
- }, C), Pe = (n) => G(async () => {
1569
- const t = await fe();
1570
- n === "export" ? (N.value = t, P.value || (P.value = t)) : (P.value = t, N.value || (N.value = t)), g.value = n === "export" ? `导出目录:${t.name}${P.value === t ? "(读回目录也填成它了)" : ""}` : `读回目录:${t.name}`;
1609
+ }, C), Ue = (n) => J(async () => {
1610
+ const t = await $e();
1611
+ n === "export" ? (K.value = t, U.value || (U.value = t)) : (U.value = t, K.value || (K.value = t)), g.value = n === "export" ? `导出目录:${t.name}${U.value === t ? "(读回目录也填成它了)" : ""}` : `读回目录:${t.name}`;
1571
1612
  }, C);
1572
- async function le() {
1573
- if (tt.value) return tt.value;
1574
- const n = await st("/magic-blocks/rules");
1575
- return tt.value = n.rules, n.rules;
1576
- }
1577
- const Pn = () => G(async () => {
1578
- if (!fn()) throw new Error("这个浏览器没法直接写你本机的文件夹:请用 Chrome / Edge,并从 https 或 localhost 打开");
1579
- if (Q.value === "one" && !ut.value)
1613
+ async function pe() {
1614
+ if (Q.value) return Q.value;
1615
+ const n = await at("/magic-blocks/rules");
1616
+ return Q.value = n.rules, n.rules;
1617
+ }
1618
+ const Jn = () => J(async () => {
1619
+ if (!xn()) throw new Error("这个浏览器没法直接写你本机的文件夹:请用 Chrome / Edge,并从 https 或 localhost 打开");
1620
+ if (X.value === "one" && !bt.value)
1580
1621
  throw new Error("还没挑块:上面选「仅这一个块」时要先在下拉里挑一个块(或者把范围改成「全部块」)");
1581
- it.value = !0, g.value = "", rt.value = "", ae(), Be(), j.value = { active: !0, percent: 0, stage: "准备…", failed: !1 };
1622
+ lt.value = !0, g.value = "", V.value = "", de(), je(), Gt.length = 0, N.value = { active: !0, percent: 0, stage: "准备…", failed: !1 };
1582
1623
  try {
1583
- const n = N.value ?? await fe();
1584
- N.value = n, P.value || (P.value = n);
1585
- const t = Et("/magic-blocks/export", Ot()), e = Kt(), u = tt.value ? ve(n, tt.value) : null, E = await t;
1586
- tt.value = E.rules, lo(n, E.rules);
1587
- const B = u ? await u : await ve(n, E.rules);
1588
- if (B.topCount > 0) {
1589
- ot(5, "等你确认要不要先清空"), H.value = { target: n, inventory: B };
1624
+ const n = K.value ?? await $e();
1625
+ K.value = n, U.value || (U.value = n);
1626
+ const t = Ct("/magic-blocks/export", wt()), e = be(), u = Q.value ? we(n, Q.value) : null, S = await St("取包", t);
1627
+ Q.value = S.rules, Eo(n, S.rules);
1628
+ const D = u ? await St("数目录", u) : await St("数目录", we(n, S.rules));
1629
+ if (D.topCount > 0) {
1630
+ ot(5, "等你确认要不要先清空"), q.value = { target: n, inventory: D };
1590
1631
  return;
1591
1632
  }
1592
- await ie(n, E, !1, !1, e);
1633
+ await me(n, S, { clean: !1, verify: !1, front: e });
1593
1634
  } catch (n) {
1594
- throw vt(!1, "导出失败"), n;
1635
+ throw xt(!1, "导出失败"), n;
1595
1636
  } finally {
1596
- it.value = !1;
1637
+ lt.value = !1;
1597
1638
  }
1598
- }, C);
1599
- function Kt() {
1639
+ }, C), ze = /* @__PURE__ */ new WeakMap(), Gt = [];
1640
+ function He(n, t) {
1641
+ Gt.push([n, Math.round(performance.now() - t)]);
1642
+ }
1643
+ async function St(n, t) {
1644
+ const e = performance.now();
1645
+ try {
1646
+ return await t;
1647
+ } finally {
1648
+ He(n, e);
1649
+ }
1650
+ }
1651
+ function Gn() {
1652
+ return Gt.length > 0 ? `;耗时:${Gt.map(([n, t]) => `${n} ${t}ms`).join(" · ")}` : "";
1653
+ }
1654
+ function be() {
1600
1655
  try {
1601
- const n = bn();
1656
+ const n = $n();
1602
1657
  return {
1603
1658
  css: n.css,
1604
- controls: Ts(),
1659
+ controls: Ks(),
1605
1660
  note: n.skipped.length > 0 ? `;⚠️ 有 ${n.skipped.length} 张样式表读不到规则(跨源):${n.skipped.join(" / ")}` : ""
1606
1661
  };
1607
1662
  } catch (n) {
1608
- return { css: "", controls: "", note: `;主题 CSS 没收成(${Ct(n)}):${ht} 没写,其余照旧` };
1663
+ return { css: "", controls: "", note: `;主题 CSS 没收成(${Rt(n)}):${Tt} 没写,其余照旧` };
1609
1664
  }
1610
1665
  }
1611
- async function ie(n, t, e, u, E) {
1666
+ async function me(n, t, e) {
1667
+ const { clean: u, verify: S, thorough: D, front: P } = e;
1612
1668
  try {
1613
- const B = E ?? Kt();
1614
1669
  ot(20, "准备写盘…");
1615
- const W = Xs(Sn()), Y = { ...t.files };
1616
- Y[me] = W, B.css && (Y[ht] = B.css), B.controls && (Y[Jt] = B.controls), t.exampleDir && (Y[`${t.exampleDir}/${me}`] = W, B.css && (Y[`${t.exampleDir}/${ht}`] = B.css), B.controls && (Y[`${t.exampleDir}/${Jt}`] = B.controls));
1617
- const Fn = B.note;
1618
- await new Promise((nt) => {
1619
- setTimeout(nt, 0);
1670
+ const mt = vo(Un()), ct = { ...t.files };
1671
+ ct[ke] = mt, P.css && (ct[Tt] = P.css), P.controls && (ct[Qt] = P.controls), t.exampleDir && (ct[`${t.exampleDir}/${ke}`] = mt, P.css && (ct[`${t.exampleDir}/${Tt}`] = P.css), P.controls && (ct[`${t.exampleDir}/${Qt}`] = P.controls));
1672
+ const ts = P.note;
1673
+ await new Promise((et) => {
1674
+ setTimeout(et, 0);
1620
1675
  });
1621
- let De = "";
1622
- if (e) {
1676
+ let Ge = "", fe;
1677
+ if (u) {
1623
1678
  ot(35, "清掉这一包不要的东西…");
1624
- const nt = await ao(n, Y);
1625
- De = nt > 0 ? `,先清掉了 ${nt} 项` : ",没有多余的东西要清";
1626
- }
1627
- const zn = Object.keys(Y).length, ue = e ? 45 : 30;
1628
- ot(ue, `写文件 0/${zn}…`);
1629
- let Fe = 0;
1630
- const ct = await so(n, Y, (nt, re) => {
1631
- const ze = Date.now();
1632
- nt < re && ze - Fe < Si || (Fe = ze, ot(ue + Math.round(nt / Math.max(1, re) * (95 - ue)), `写文件 ${nt}/${re}…`));
1633
- }, { verify: u });
1634
- ot(98, "收尾…");
1635
- const Un = ct.failed.length > 0 ? `;⚠️ ${ct.failed.length} 个文件没写成:${ct.failed.slice(0, 3).map((nt) => `${nt.path}(${nt.message})`).join("、")}` + (ct.failed.length > 3 ? ` 等 ${ct.failed.length} 条` : "") : "", Hn = ct.skipped > 0 ? `,跳过 ${ct.skipped} 个没变的` : "";
1636
- rt.value = `铺到「${n.name}」:${t.blocks} 个块、写了 ${ct.written} 个文件${Hn}(含 ${me} / ${ht} / ${Jt})${De}${Un}${Fn}`, g.value = ct.failed.length > 0 ? "导出完了,但有文件没写成(见下面那句)" : "导出完了:用你自己的编辑器改,改完回这里「读回改动」", vt(!0, "完成");
1637
- } catch (B) {
1638
- throw vt(!1, "导出中途失败(已经铺进去的文件不会自己删掉)"), B;
1679
+ const et = await St("清多余", xo(n, ct));
1680
+ fe = et.existing, Ge = et.removed > 0 ? `,先清掉了 ${et.removed} 项` : ",没有多余的东西要清";
1681
+ } else
1682
+ ot(35, "看一眼目录里有什么…"), fe = await St("看目录", Co(n, ct));
1683
+ const es = ze.get(n.handle), ns = Object.keys(ct).length, ve = u ? 45 : 30;
1684
+ ot(ve, `写文件 0/${ns}…`);
1685
+ let We = 0;
1686
+ const ss = performance.now(), tt = await $o(n, ct, (et, he) => {
1687
+ const Ye = Date.now();
1688
+ et < he && Ye - We < Zi || (We = Ye, ot(ve + Math.round(et / Math.max(1, he) * (95 - ve)), `写文件 ${et}/${he}…`));
1689
+ }, {
1690
+ verify: S,
1691
+ // 🔴 账本:勾了「逐个核对磁盘」就不给它 —— 那样连上一趟铺过的也重新核对一遍。
1692
+ trust: D ? void 0 : es,
1693
+ existing: fe
1694
+ });
1695
+ He("写盘", ss), ze.set(n.handle, tt.fingerprints), ot(98, "收尾…");
1696
+ const os = tt.failed.length > 0 ? `;⚠️ ${tt.failed.length} 个文件没写成:${tt.failed.slice(0, 3).map((et) => `${et.path}(${et.message})`).join("、")}` + (tt.failed.length > 3 ? ` 等 ${tt.failed.length} 条` : "") : "", Wt = [];
1697
+ tt.skipped > 0 && Wt.push(`${tt.skipped} 个与库里一字不差(逐字节比过)`), tt.trusted > 0 && Wt.push(`${tt.trusted} 个按上一趟的账本跳过(没再碰磁盘)`);
1698
+ const as = Wt.length > 0 ? `,跳过 ${Wt.join(" / ")}` : "";
1699
+ V.value = `铺到「${n.name}」:${t.blocks} 个块、写了 ${tt.written} 个文件${as}(含 ${ke} / ${Tt} / ${Qt})${Ge}${os}${ts}${Gn()}`, g.value = tt.failed.length > 0 ? "导出完了,但有文件没写成(见下面那句)" : "导出完了:用你自己的编辑器改,改完回这里「读回改动」", xt(!0, "完成");
1700
+ } catch (mt) {
1701
+ throw xt(!1, "导出中途失败(已经铺进去的文件不会自己删掉)"), mt;
1639
1702
  }
1640
1703
  }
1641
- const jn = () => G(async () => {
1642
- const n = H.value;
1643
- if (H.value = null, !!n) {
1644
- it.value = !0;
1704
+ const Wn = () => J(async () => {
1705
+ const n = q.value;
1706
+ if (q.value = null, !!n) {
1707
+ lt.value = !0;
1645
1708
  try {
1646
1709
  ot(15, "重新取一份开发包…");
1647
- const t = Et("/magic-blocks/export", Ot()), e = Kt(), u = await t;
1648
- tt.value = u.rules, await ie(n.target, u, !0, !0, e);
1710
+ const t = Ct("/magic-blocks/export", wt()), e = be(), u = await St("取包", t);
1711
+ Q.value = u.rules, await me(n.target, u, { clean: !0, verify: !0, thorough: Kt.value, front: e });
1649
1712
  } catch (t) {
1650
- throw vt(!1, "导出失败"), t;
1713
+ throw xt(!1, "导出失败"), t;
1651
1714
  } finally {
1652
- it.value = !1;
1715
+ lt.value = !1;
1653
1716
  }
1654
1717
  }
1655
- }, C), Ln = () => G(async () => {
1656
- const n = H.value;
1657
- if (H.value = null, !!n) {
1658
- it.value = !0;
1718
+ }, C), Yn = () => J(async () => {
1719
+ const n = q.value;
1720
+ if (q.value = null, !!n) {
1721
+ lt.value = !0;
1659
1722
  try {
1660
1723
  ot(15, "重新取一份开发包…");
1661
- const t = Et("/magic-blocks/export", Ot()), e = Kt(), u = await t;
1662
- tt.value = u.rules, await ie(n.target, u, !1, !0, e);
1724
+ const t = Ct("/magic-blocks/export", wt()), e = be(), u = await St("取包", t);
1725
+ Q.value = u.rules, await me(n.target, u, { clean: !1, verify: !0, thorough: Kt.value, front: e });
1663
1726
  } catch (t) {
1664
- throw vt(!1, "导出失败"), t;
1727
+ throw xt(!1, "导出失败"), t;
1665
1728
  } finally {
1666
- it.value = !1;
1729
+ lt.value = !1;
1667
1730
  }
1668
1731
  }
1669
1732
  }, C);
1670
- function In() {
1671
- H.value = null, j.value = { active: !1, percent: 0, stage: "", failed: !1 }, g.value = "这次没有导出(目录里的东西一个字节都没动)", rt.value = "";
1733
+ function Zn() {
1734
+ q.value = null, N.value = { active: !1, percent: 0, stage: "", failed: !1 }, g.value = "这次没有导出(目录里的东西一个字节都没动)", V.value = "";
1672
1735
  }
1673
- const je = () => G(async () => {
1674
- const n = P.value ?? await fe();
1675
- P.value = n, N.value || (N.value = n), Mt.value = !0, g.value = "", I.value = [], J.value = [];
1736
+ const Ke = () => J(async () => {
1737
+ const n = U.value ?? await $e();
1738
+ U.value = n, K.value || (K.value = n), kt.value = !0, g.value = "", W.value = [], Y.value = [];
1676
1739
  try {
1677
- const t = await le().catch((W) => {
1678
- throw new Error(`取不到扫描规则(GET /magic-blocks/rules):${Ct(W)}`);
1679
- }), e = await co(n, t), u = await st("/magic-blocks/read", {
1740
+ const t = await pe().catch((P) => {
1741
+ throw new Error(`取不到扫描规则(GET /magic-blocks/rules):${Rt(P)}`);
1742
+ }), e = await Mo(n, t), u = await at("/magic-blocks/read", {
1680
1743
  method: "POST",
1681
1744
  body: JSON.stringify({ ...e, includeMissing: !1 })
1682
1745
  });
1683
- M.value = u;
1684
- const E = {};
1685
- for (const W of u.blocks ?? []) E[W.id] = W.status === "modified" && W.canApply;
1686
- F.value = E;
1687
- const B = (u.blocks ?? []).reduce((W, Y) => ({ ...W, [Y.status]: (W[Y.status] ?? 0) + 1 }), {});
1688
- g.value = `扫到 ${u.folders} 个文件夹、${u.files} 个文件:有改动 ${B.modified ?? 0} / 没改动 ${B.unchanged ?? 0}` + (u.complete ? "" : "(层数到了上限,没走完,可能还有块没扫到)");
1746
+ A.value = u;
1747
+ const S = {};
1748
+ for (const P of u.blocks ?? []) S[P.id] = P.status === "modified" && P.canApply;
1749
+ it.value = S;
1750
+ const D = (u.blocks ?? []).reduce((P, mt) => ({ ...P, [mt.status]: (P[mt.status] ?? 0) + 1 }), {});
1751
+ g.value = `扫到 ${u.folders} 个文件夹、${u.files} 个文件:有改动 ${D.modified ?? 0} / 没改动 ${D.unchanged ?? 0}` + (u.complete ? "" : "(层数到了上限,没走完,可能还有块没扫到)");
1689
1752
  } finally {
1690
- Mt.value = !1;
1753
+ kt.value = !1;
1691
1754
  }
1692
- }, C), Nn = () => G(async () => {
1693
- const n = Ht.value, t = ms(n);
1694
- if (I.value = t.issues, J.value = [], t.issues.length > 0)
1755
+ }, C), Xn = () => J(async () => {
1756
+ const n = Jt.value, t = As(n);
1757
+ if (W.value = t.issues, Y.value = [], t.issues.length > 0)
1695
1758
  throw g.value = "", new Error(`前端校验没过(${t.issues.length} 条),没有发请求:
1696
1759
  - ${t.issues.join(`
1697
1760
  - `)}`);
1698
- $t.value = !0, g.value = "";
1761
+ nt.value = !0, g.value = "";
1699
1762
  try {
1700
- const e = await Et("/magic-blocks/import", { updatedBy: "", blocks: n });
1701
- J.value = e.results ?? [], g.value = `保存:成功 ${e.saved} 个、失败 ${e.failed} 个`, await Tt();
1763
+ const e = await Ct("/magic-blocks/import", { updatedBy: "", blocks: n });
1764
+ Y.value = e.results ?? [], g.value = `保存:成功 ${e.saved} 个、失败 ${e.failed} 个`, await Et();
1702
1765
  const u = g.value;
1703
- await je(), g.value = `${u};已重新读回该目录`;
1766
+ await Ke(), g.value = `${u};已重新读回该目录`;
1704
1767
  } finally {
1705
- $t.value = !1;
1768
+ nt.value = !1;
1706
1769
  }
1707
1770
  }, C);
1708
- function Dn(n, t) {
1771
+ function Qn(n, t) {
1709
1772
  const e = t.target;
1710
- F.value[n] = e?.checked === !0;
1773
+ it.value[n] = e?.checked === !0;
1711
1774
  }
1712
- function Le(n) {
1713
- const t = { ...F.value };
1714
- for (const e of Ut.value) t[e.id] = n;
1715
- F.value = t;
1775
+ function Ve(n) {
1776
+ const t = { ...it.value };
1777
+ for (const e of qt.value) t[e.id] = n;
1778
+ it.value = t;
1716
1779
  }
1717
- function Ie(n) {
1780
+ function qe(n) {
1718
1781
  const t = n.detail?.uuid ?? "";
1719
- b.value = !0, w.value = t;
1782
+ b.value = !0, x.value = t;
1720
1783
  }
1721
- function Ne(n) {
1784
+ function Je(n) {
1722
1785
  n.key === "Escape" && b.value && (b.value = !1);
1723
1786
  }
1724
- return Ze(() => {
1725
- window.addEventListener("magic-block:open-console", Ie), window.addEventListener("keydown", Ne), Tt(), le().catch(() => {
1787
+ return ln(() => {
1788
+ window.addEventListener("magic-block:open-console", qe), window.addEventListener("keydown", Je), Et(), pe().catch(() => {
1726
1789
  });
1727
- }), Xe(() => {
1728
- window.removeEventListener("magic-block:open-console", Ie), window.removeEventListener("keydown", Ne);
1729
- }), (n, t) => mt(i) ? (r(), c("div", {
1790
+ }), un(() => {
1791
+ window.removeEventListener("magic-block:open-console", qe), window.removeEventListener("keydown", Je);
1792
+ }), (n, t) => _t(i) ? (c(), d("div", {
1730
1793
  key: 0,
1731
- class: z(["mbc__shell", { "is-wide": q.value }])
1794
+ class: H(["mbc__shell", { "is-wide": B.value }])
1732
1795
  }, [
1733
1796
  s("button", {
1734
1797
  class: "fab",
@@ -1736,622 +1799,665 @@ ${t.text}`).join(`
1736
1799
  title: "magic block 控制台",
1737
1800
  onClick: t[0] || (t[0] = (e) => b.value = !0)
1738
1801
  }, "块"),
1739
- b.value ? (r(), c("aside", {
1802
+ b.value ? (c(), d("aside", {
1740
1803
  key: 0,
1741
- class: z(["mbc", { "is-wide": q.value }])
1804
+ class: H(["mbc", { "is-wide": B.value }])
1742
1805
  }, [
1743
- s("header", po, [
1744
- t[40] || (t[40] = s("strong", { class: "mbc__brand" }, "magic block", -1)),
1806
+ s("header", Ao, [
1807
+ t[43] || (t[43] = s("strong", { class: "mbc__brand" }, "magic block", -1)),
1745
1808
  s("span", {
1746
1809
  class: "mbc__count",
1747
1810
  title: `库里一共 ${f.value.length} 个块`
1748
- }, p(f.value.length) + " 个块", 9, bo),
1749
- t[41] || (t[41] = s("span", { class: "mbc__grow" }, null, -1)),
1811
+ }, p(f.value.length) + " 个块", 9, Ro),
1812
+ t[44] || (t[44] = s("span", { class: "mbc__grow" }, null, -1)),
1750
1813
  s("button", {
1751
1814
  class: "p-button p-button-sm p-button-text",
1752
1815
  type: "button",
1753
- title: q.value ? "收起(回到右侧那条窄抽屉)" : "展开:整屏(块 / 工作区两个页签)",
1754
- onClick: t[1] || (t[1] = (e) => q.value = !q.value)
1755
- }, p(q.value ? "收起" : "展开全屏"), 9, mo),
1816
+ title: B.value ? "收起(回到右侧那条窄抽屉)" : "展开:整屏(块 / 工作区两个页签)",
1817
+ onClick: t[1] || (t[1] = (e) => B.value = !B.value)
1818
+ }, p(B.value ? "收起" : "展开全屏"), 9, Oo),
1756
1819
  s("button", {
1757
1820
  class: "p-button p-button-sm p-button-text",
1758
1821
  type: "button",
1759
1822
  onClick: t[2] || (t[2] = (e) => b.value = !1)
1760
1823
  }, "关闭")
1761
1824
  ]),
1762
- s("div", fo, [
1825
+ s("div", Po, [
1763
1826
  s("button", {
1764
- class: z(["mbc__tab", { "is-on": U.value === "blocks" }]),
1827
+ class: H(["mbc__tab", { "is-on": R.value === "blocks" }]),
1765
1828
  type: "button",
1766
1829
  role: "tab",
1767
- "aria-selected": U.value === "blocks",
1768
- onClick: t[3] || (t[3] = (e) => U.value = "blocks")
1830
+ "aria-selected": R.value === "blocks",
1831
+ onClick: t[3] || (t[3] = (e) => R.value = "blocks")
1769
1832
  }, [
1770
- t[42] || (t[42] = k(" 块 ", -1)),
1771
- s("span", _o, p(f.value.length), 1),
1772
- se.value > 0 ? (r(), c("span", {
1833
+ t[45] || (t[45] = y(" 块 ", -1)),
1834
+ s("span", jo, p(f.value.length), 1),
1835
+ re.value > 0 ? (c(), d("span", {
1773
1836
  key: 0,
1774
1837
  class: "mbc__chip is-bad",
1775
- title: `${se.value} 个块被停用(体检没过)`
1776
- }, p(se.value) + " 停用", 9, ho)) : y("", !0)
1777
- ], 10, vo),
1838
+ title: `${re.value} 个块被停用(体检没过)`
1839
+ }, p(re.value) + " 停用", 9, Do)) : k("", !0)
1840
+ ], 10, Lo),
1778
1841
  s("button", {
1779
- class: z(["mbc__tab", { "is-on": U.value === "workspace" }]),
1842
+ class: H(["mbc__tab", { "is-on": R.value === "workspace" }]),
1780
1843
  type: "button",
1781
1844
  role: "tab",
1782
- "aria-selected": U.value === "workspace",
1783
- onClick: t[4] || (t[4] = (e) => U.value = "workspace")
1845
+ "aria-selected": R.value === "workspace",
1846
+ onClick: t[4] || (t[4] = (e) => R.value = "workspace")
1784
1847
  }, [
1785
- t[43] || (t[43] = k(" 工作区(导出 / 读回 / 校验) ", -1)),
1786
- at.value > 0 ? (r(), c("span", {
1848
+ t[46] || (t[46] = y(" 工作区(导出 / 读回 / 校验) ", -1)),
1849
+ rt.value > 0 ? (c(), d("span", {
1787
1850
  key: 0,
1788
1851
  class: "mbc__chip is-bad",
1789
- title: `这一趟有 ${at.value} 条问题`
1790
- }, p(at.value), 9, yo)) : J.value.length > 0 ? (r(), c("span", ko, p(ne.value) + " 存成", 1)) : y("", !0)
1791
- ], 10, go)
1852
+ title: `这一趟有 ${rt.value} 条问题`
1853
+ }, p(rt.value), 9, No)) : Y.value.length > 0 ? (c(), d("span", Fo, p(ue.value) + " 存成", 1)) : k("", !0)
1854
+ ], 10, Io)
1792
1855
  ]),
1793
- s("div", $o, [
1794
- j.value.active ? (r(), c("div", wo, [
1856
+ s("div", Uo, [
1857
+ N.value.active ? (c(), d("div", zo, [
1795
1858
  s("div", {
1796
- class: z(["mbc__progress", { "is-failed": j.value.failed }]),
1859
+ class: H(["mbc__progress", { "is-failed": N.value.failed }]),
1797
1860
  role: "progressbar",
1798
- "aria-valuenow": j.value.percent,
1861
+ "aria-valuenow": N.value.percent,
1799
1862
  "aria-valuemin": "0",
1800
1863
  "aria-valuemax": "100"
1801
1864
  }, [
1802
1865
  s("div", {
1803
1866
  class: "mbc__progress-bar",
1804
- style: Qe(Xt.value)
1867
+ style: rn(Tn.value)
1805
1868
  }, null, 4)
1806
- ], 10, xo),
1869
+ ], 10, Ho),
1807
1870
  s("p", {
1808
- class: z(["mbc__hint", { "mbc__progress-note": j.value.failed }])
1809
- }, p(j.value.failed ? "✗" : "") + " " + p(j.value.percent) + "% · " + p(j.value.stage), 3)
1810
- ])) : y("", !0),
1811
- H.value ? (r(), c("div", Co, [
1812
- s("p", Eo, "「" + p(H.value.target.name) + "」里现在有 " + p(H.value.inventory.dirs) + " 个文件夹 / " + p(H.value.inventory.files) + " 个文件", 1),
1813
- s("p", To, [
1814
- t[44] || (t[44] = s("b", null, "清空并导出", -1)),
1815
- t[45] || (t[45] = k(":把这一包", -1)),
1816
- t[46] || (t[46] = s("b", null, "没有", -1)),
1817
- t[47] || (t[47] = k("的东西删掉(你改过、还没读回库的也在里面), 包里那些已经一样的文件原样不动 —— 铺完目录里正好只剩这一包,比全删重铺快得多。 ", -1)),
1818
- t[48] || (t[48] = s("b", null, "只覆盖", -1)),
1819
- t[49] || (t[49] = k(":什么都不删,只把库里的那份盖上去(目录里多出来的东西原样留着)。 两种都只动这个目录", -1)),
1820
- t[50] || (t[50] = s("b", null, "里面", -1)),
1821
- t[51] || (t[51] = k("的子项:目录本身、以及它外面的任何东西都不会被碰。", -1)),
1822
- H.value.inventory.items.length > 0 ? (r(), c("span", So, "(" + p(H.value.inventory.items.slice(0, 6).map((e) => e.name).join(" / ")) + p(H.value.inventory.items.length > 6 ? " …" : "") + ")", 1)) : y("", !0)
1871
+ class: H(["mbc__hint", { "mbc__progress-note": N.value.failed }])
1872
+ }, p(N.value.failed ? "✗" : "") + " " + p(N.value.percent) + "% · " + p(N.value.stage), 3)
1873
+ ])) : k("", !0),
1874
+ q.value ? (c(), d("div", Ko, [
1875
+ s("p", Vo, "「" + p(q.value.target.name) + "」里现在有 " + p(q.value.inventory.dirs) + " 个文件夹 / " + p(q.value.inventory.files) + " 个文件", 1),
1876
+ s("p", qo, [
1877
+ t[47] || (t[47] = s("b", null, "只覆盖", -1)),
1878
+ t[48] || (t[48] = y("(天天用这个):只把库里", -1)),
1879
+ t[49] || (t[49] = s("b", null, "改过 / 缺了", -1)),
1880
+ t[50] || (t[50] = y("的那些写下去 —— 上一趟铺过、 这一趟一字没变的**一概不碰**(所以很快;代价是你自己在编辑器里改过、还没读回库的那些 ", -1)),
1881
+ t[51] || (t[51] = s("b", null, "会留着", -1)),
1882
+ t[52] || (t[52] = y(")。 ", -1)),
1883
+ t[53] || (t[53] = s("b", null, "清空并导出", -1)),
1884
+ t[54] || (t[54] = y(":先删掉这一包没有的东西,其余同上。 两种都只动这个目录", -1)),
1885
+ t[55] || (t[55] = s("b", null, "里面", -1)),
1886
+ t[56] || (t[56] = y("的子项:目录本身、以及它外面的任何东西都不会被碰。", -1)),
1887
+ q.value.inventory.items.length > 0 ? (c(), d("span", Jo, "(" + p(q.value.inventory.items.slice(0, 6).map((e) => e.name).join(" / ")) + p(q.value.inventory.items.length > 6 ? " …" : "") + ")", 1)) : k("", !0)
1823
1888
  ]),
1824
- s("div", Bo, [
1889
+ s("label", Go, [
1890
+ ft(s("input", {
1891
+ "onUpdate:modelValue": t[5] || (t[5] = (e) => Kt.value = e),
1892
+ type: "checkbox"
1893
+ }, null, 512), [
1894
+ [is, Kt.value]
1895
+ ]),
1896
+ t[57] || (t[57] = s("span", null, [
1897
+ y("逐个核对磁盘(慢):把上一趟铺过的也重新读一遍比对,"),
1898
+ s("b", null, "你在编辑器里改过、还没读回库的那些会被库里的那份盖掉")
1899
+ ], -1))
1900
+ ]),
1901
+ s("div", Wo, [
1825
1902
  s("button", {
1826
1903
  class: "p-button p-button-sm",
1827
1904
  type: "button",
1828
1905
  disabled: C.value,
1829
- onClick: t[5] || (t[5] = (e) => jn())
1830
- }, "清空并导出", 8, Ao),
1906
+ onClick: t[6] || (t[6] = (e) => Wn())
1907
+ }, "清空并导出", 8, Yo),
1831
1908
  s("button", {
1832
1909
  class: "p-button p-button-sm p-button-outlined",
1833
1910
  type: "button",
1834
1911
  disabled: C.value,
1835
- onClick: t[6] || (t[6] = (e) => Ln())
1836
- }, "只覆盖", 8, Mo),
1912
+ onClick: t[7] || (t[7] = (e) => Yn())
1913
+ }, "只覆盖", 8, Zo),
1837
1914
  s("button", {
1838
1915
  class: "p-button p-button-sm p-button-text",
1839
1916
  type: "button",
1840
1917
  disabled: C.value,
1841
- onClick: t[7] || (t[7] = (e) => In())
1842
- }, "取消", 8, Oo)
1918
+ onClick: t[8] || (t[8] = (e) => Zn())
1919
+ }, "取消", 8, Xo)
1843
1920
  ])
1844
- ])) : y("", !0),
1845
- O.value ? (r(), c("div", Ro, [
1846
- s("p", Po, "删掉「" + p(O.value.row.module) + " / " + p(O.value.row.name || O.value.row.id) + "」的代码文件", 1),
1847
- s("p", jo, [
1848
- t[60] || (t[60] = s("b", null, "库里那一份代码正文会被清空", -1)),
1849
- t[61] || (t[61] = k("(入口 / 清单 / 后端一起); ", -1)),
1850
- O.value.target ? (r(), c(S, { key: 0 }, [
1851
- t[52] || (t[52] = k(" 同时清掉你本机那个块文件夹 ", -1)),
1852
- s("span", Lo, p(O.value.target.name) + "/" + p(O.value.folder), 1),
1853
- O.value.inventory && O.value.inventory.items.some((e) => e.name === O.value?.folder) ? (r(), c(S, { key: 0 }, [
1854
- k(" (它现在在顶层,里面有东西:本次会先清空)。 ")
1855
- ], 64)) : y("", !0),
1856
- t[53] || (t[53] = s("b", null, "只动这一个块的文件夹", -1)),
1857
- t[54] || (t[54] = k(":别的块、", -1)),
1858
- t[55] || (t[55] = s("span", { class: "mbc__mono" }, "example/", -1)),
1859
- t[56] || (t[56] = k("、以及目录外面的一切都不会被碰。 ", -1))
1860
- ], 64)) : (r(), c(S, { key: 1 }, [
1861
- t[57] || (t[57] = k(" 现在没有选中开发目录 / 或者读不到它,所以", -1)),
1862
- t[58] || (t[58] = s("b", null, "本机那份不动", -1)),
1863
- t[59] || (t[59] = k(",只清库里那份。 ", -1))
1921
+ ])) : k("", !0),
1922
+ z.value ? (c(), d("div", Qo, [
1923
+ s("p", ta, "删掉「" + p(z.value.row.module) + " / " + p(z.value.row.name || z.value.row.id) + "」的代码文件", 1),
1924
+ s("p", ea, [
1925
+ t[66] || (t[66] = s("b", null, "库里那一份代码正文会被清空", -1)),
1926
+ t[67] || (t[67] = y("(入口 / 清单 / 后端一起); ", -1)),
1927
+ z.value.target ? (c(), d(T, { key: 0 }, [
1928
+ t[58] || (t[58] = y(" 同时清掉你本机那个块文件夹 ", -1)),
1929
+ s("span", na, p(z.value.target.name) + "/" + p(z.value.folder), 1),
1930
+ z.value.inventory && z.value.inventory.items.some((e) => e.name === z.value?.folder) ? (c(), d(T, { key: 0 }, [
1931
+ y(" (它现在在顶层,里面有东西:本次会先清空)。 ")
1932
+ ], 64)) : k("", !0),
1933
+ t[59] || (t[59] = s("b", null, "只动这一个块的文件夹", -1)),
1934
+ t[60] || (t[60] = y(":别的块、", -1)),
1935
+ t[61] || (t[61] = s("span", { class: "mbc__mono" }, "example/", -1)),
1936
+ t[62] || (t[62] = y("、以及目录外面的一切都不会被碰。 ", -1))
1937
+ ], 64)) : (c(), d(T, { key: 1 }, [
1938
+ t[63] || (t[63] = y(" 现在没有选中开发目录 / 或者读不到它,所以", -1)),
1939
+ t[64] || (t[64] = s("b", null, "本机那份不动", -1)),
1940
+ t[65] || (t[65] = y(",只清库里那份。 ", -1))
1864
1941
  ], 64)),
1865
- t[62] || (t[62] = s("br", null, null, -1)),
1866
- t[63] || (t[63] = k(" 🔴 ", -1)),
1867
- t[64] || (t[64] = s("b", null, "块本身留着", -1)),
1868
- t[65] || (t[65] = k('(这一行不动):页面上那块会显示成占位框,而不是"库里没有这个块"; 删错了也能救回来:展开这一块 → 版本史 → 「切回」删之前那一版。 ', -1))
1942
+ t[68] || (t[68] = s("br", null, null, -1)),
1943
+ t[69] || (t[69] = y(" 🔴 ", -1)),
1944
+ t[70] || (t[70] = s("b", null, "块本身留着", -1)),
1945
+ t[71] || (t[71] = y('(这一行不动):页面上那块会显示成占位框,而不是"库里没有这个块"; 删错了也能救回来:展开这一块 → 版本史 → 「切回」删之前那一版。 ', -1))
1869
1946
  ]),
1870
- s("div", Io, [
1947
+ s("div", sa, [
1871
1948
  s("button", {
1872
1949
  class: "p-button p-button-sm",
1873
1950
  type: "button",
1874
1951
  disabled: C.value,
1875
- onClick: t[8] || (t[8] = (e) => Pt())
1876
- }, "确认删除代码文件", 8, No),
1952
+ onClick: t[9] || (t[9] = (e) => se())
1953
+ }, "确认删除代码文件", 8, oa),
1877
1954
  s("button", {
1878
1955
  class: "p-button p-button-sm p-button-text",
1879
1956
  type: "button",
1880
1957
  disabled: C.value,
1881
- onClick: t[9] || (t[9] = (e) => O.value = null)
1882
- }, "取消", 8, Do)
1958
+ onClick: t[10] || (t[10] = (e) => z.value = null)
1959
+ }, "取消", 8, aa)
1883
1960
  ])
1884
- ])) : y("", !0),
1885
- _t(s("section", Fo, [
1886
- s("h3", zo, [
1887
- t[66] || (t[66] = k(" 库里的块 ", -1)),
1888
- s("span", Uo, p(Oe.value.length) + " / " + p(f.value.length), 1),
1889
- V.value.trim() ? (r(), c("span", Ho, "标签:" + p(V.value), 1)) : y("", !0)
1961
+ ])) : k("", !0),
1962
+ ft(s("section", la, [
1963
+ s("h3", ia, [
1964
+ t[72] || (t[72] = y(" 库里的块 ", -1)),
1965
+ s("span", ua, p(Ne.value.length) + " / " + p(f.value.length), 1),
1966
+ L.value.trim() ? (c(), d("span", ra, "标签:" + p(L.value), 1)) : k("", !0)
1890
1967
  ]),
1891
- _t(s("input", {
1892
- "onUpdate:modelValue": t[10] || (t[10] = (e) => _.value = e),
1968
+ ft(s("input", {
1969
+ "onUpdate:modelValue": t[11] || (t[11] = (e) => h.value = e),
1893
1970
  class: "p-inputtext p-component mbc__search",
1894
1971
  type: "search",
1895
1972
  placeholder: "筛选 module / 名字 / 备注 / 详情 / id / 版本号 / 标签"
1896
1973
  }, null, 512), [
1897
- [ce, _.value]
1974
+ [Yt, h.value]
1898
1975
  ]),
1899
- Z.value.length > 0 ? (r(), c("div", Ko, [
1900
- t[67] || (t[67] = s("span", { class: "mbc__label" }, "标签", -1)),
1901
- _t(s("input", {
1902
- "onUpdate:modelValue": t[11] || (t[11] = (e) => V.value = e),
1976
+ G.value.length > 0 ? (c(), d("div", ca, [
1977
+ t[73] || (t[73] = s("span", { class: "mbc__label" }, "标签", -1)),
1978
+ ft(s("input", {
1979
+ "onUpdate:modelValue": t[12] || (t[12] = (e) => L.value = e),
1903
1980
  class: "p-inputtext p-component mbc__tagfilter",
1904
1981
  type: "search",
1905
1982
  placeholder: "只看贴了…的块"
1906
1983
  }, null, 512), [
1907
- [ce, V.value]
1984
+ [Yt, L.value]
1908
1985
  ]),
1909
- (r(!0), c(S, null, L(Z.value.slice(0, 24), (e) => (r(), c("button", {
1986
+ (c(!0), d(T, null, I(G.value.slice(0, 24), (e) => (c(), d("button", {
1910
1987
  key: e.tag,
1911
- class: z(["p-tag mbc__tag", { "is-on": V.value.trim().toLowerCase() === e.tag.toLowerCase() }]),
1988
+ class: H(["p-tag mbc__tag", { "is-on": L.value.trim().toLowerCase() === e.tag.toLowerCase() }]),
1912
1989
  type: "button",
1913
1990
  title: `只看贴了「${e.tag}」的块(${e.count} 个)`,
1914
- onClick: (u) => V.value = V.value.trim().toLowerCase() === e.tag.toLowerCase() ? "" : e.tag
1915
- }, p(e.tag) + " " + p(e.count), 11, qo))), 128)),
1916
- V.value ? (r(), c("button", {
1991
+ onClick: (u) => L.value = L.value.trim().toLowerCase() === e.tag.toLowerCase() ? "" : e.tag
1992
+ }, p(e.tag) + " " + p(e.count), 11, da))), 128)),
1993
+ L.value ? (c(), d("button", {
1917
1994
  key: 0,
1918
1995
  class: "p-button p-button-sm p-button-text",
1919
1996
  type: "button",
1920
- onClick: t[12] || (t[12] = (e) => V.value = "")
1921
- }, "清掉标签筛选")) : y("", !0)
1922
- ])) : y("", !0),
1923
- s("ul", Vo, [
1924
- (r(!0), c(S, null, L(Oe.value, (e) => (r(), c("li", {
1997
+ onClick: t[13] || (t[13] = (e) => L.value = "")
1998
+ }, "清掉标签筛选")) : k("", !0)
1999
+ ])) : k("", !0),
2000
+ s("ul", pa, [
2001
+ (c(!0), d(T, null, I(Ne.value, (e) => (c(), d("li", {
1925
2002
  key: e.id
1926
2003
  }, [
1927
2004
  s("button", {
1928
2005
  type: "button",
1929
- class: z(["mbc__row", { "is-active": e.id === w.value, "is-off": e.enabled === !1 }]),
1930
- title: Tn(e),
1931
- onClick: (u) => hn(e)
2006
+ class: H(["mbc__row", { "is-active": e.id === x.value, "is-off": e.enabled === !1 }]),
2007
+ title: Fn(e),
2008
+ onClick: (u) => Bn(e)
1932
2009
  }, [
1933
- s("span", Go, p(e.module || "unassigned"), 1),
1934
- s("span", Wo, p(e.name || e.id), 1),
2010
+ s("span", ma, p(e.module || "unassigned"), 1),
2011
+ s("span", fa, p(e.name || e.id), 1),
1935
2012
  s("span", {
1936
2013
  class: "mbc__version-badge",
1937
2014
  title: `当前是第 ${e.version || 1} 版,一共留着 ${e.versionCount ?? 1} 版`
1938
2015
  }, [
1939
- k("v" + p(e.version || 1), 1),
1940
- (e.versionCount ?? 1) > 1 ? (r(), c(S, { key: 0 }, [
1941
- k("/" + p(e.versionCount), 1)
1942
- ], 64)) : y("", !0)
1943
- ], 8, Yo),
1944
- (r(!0), c(S, null, L(e.tags ?? [], (u) => (r(), c("span", {
2016
+ y("v" + p(e.version || 1), 1),
2017
+ (e.versionCount ?? 1) > 1 ? (c(), d(T, { key: 0 }, [
2018
+ y("/" + p(e.versionCount), 1)
2019
+ ], 64)) : k("", !0)
2020
+ ], 8, va),
2021
+ (c(!0), d(T, null, I(e.tags ?? [], (u) => (c(), d("span", {
1945
2022
  key: u,
1946
2023
  class: "p-tag mbc__tag mbc__tag--on-row"
1947
2024
  }, p(u), 1))), 128)),
1948
- zt(e).length > 0 ? (r(), c("span", Zo, p(zt(e).join(" / ")), 1)) : y("", !0),
2025
+ Vt(e).length > 0 ? (c(), d("span", ha, p(Vt(e).join(" / ")), 1)) : k("", !0),
1949
2026
  s("em", {
1950
- class: z({ "is-off": e.enabled === !1 })
1951
- }, p(e.enabled === !1 ? Ae(e) || "校验失败已停用" : "可用"), 3),
1952
- (e.detail ?? "").trim() ? (r(), c("span", {
2027
+ class: H({ "is-off": e.enabled === !1 })
2028
+ }, p(e.enabled === !1 ? De(e) || "校验失败已停用" : "可用"), 3),
2029
+ (e.detail ?? "").trim() ? (c(), d("span", {
1953
2030
  key: 1,
1954
2031
  class: "mbc__detail-line",
1955
2032
  title: e.detail
1956
- }, p(e.detail), 9, Xo)) : y("", !0)
1957
- ], 10, Jo),
1958
- w.value === e.id ? (r(), c("div", Qo, [
1959
- (r(!0), c(S, null, L(ee(e).slice(0, _e), (u, E) => (r(), c("p", {
1960
- key: E,
2033
+ }, p(e.detail), 9, _a)) : k("", !0)
2034
+ ], 10, ba),
2035
+ x.value === e.id ? (c(), d("div", ga, [
2036
+ (c(!0), d(T, null, I(ie(e).slice(0, xe), (u, S) => (c(), d("p", {
2037
+ key: S,
1961
2038
  class: "mbc__problem"
1962
2039
  }, p(u), 1))), 128)),
1963
- ee(e).length > _e ? (r(), c("p", ta, "还有 " + p(ee(e).length - _e) + " 条问题没显示出来:点上面的「校验全部魔法块」重算一遍(这几条是上次校验的结论)", 1)) : y("", !0),
1964
- s("dl", ea, [
1965
- t[71] || (t[71] = s("dt", null, "详情", -1)),
1966
- (e.detail ?? "").trim() ? (r(), c("dd", na, p(e.detail), 1)) : (r(), c("dd", sa, [...t[68] || (t[68] = [
1967
- k("(这一块没写详情:清单 ", -1),
1968
- s("span", { class: "mbc__mono" }, "magic-block.open.yaml", -1),
1969
- k(" 里可选的 ", -1),
1970
- s("span", { class: "mbc__mono" }, "detail", -1),
1971
- k(" 加上一段,读回改动再保存就显示在这里)", -1)
1972
- ])])),
1973
- t[72] || (t[72] = s("dt", null, "文件", -1)),
2040
+ ie(e).length > xe ? (c(), d("p", ya, "还有 " + p(ie(e).length - xe) + " 条问题没显示出来:点上面的「校验全部魔法块」重算一遍(这几条是上次校验的结论)", 1)) : k("", !0),
2041
+ s("dl", ka, [
2042
+ t[77] || (t[77] = s("dt", null, "详情", -1)),
2043
+ s("dd", null, [
2044
+ gt.value !== e.id ? (c(), d(T, { key: 0 }, [
2045
+ (e.detail ?? "").trim() ? (c(), d("span", $a, p(e.detail), 1)) : (c(), d("span", wa, [...t[74] || (t[74] = [
2046
+ y("(这一块没写详情 —— 点右边「写详情」写一段:它会存进库,下次导出还会写进它的 ", -1),
2047
+ s("span", { class: "mbc__mono" }, "magic-block.open.yaml", -1),
2048
+ y(")", -1)
2049
+ ])])),
2050
+ s("button", {
2051
+ class: "p-button p-button-sm p-button-text",
2052
+ type: "button",
2053
+ disabled: C.value,
2054
+ onClick: (u) => jn(e)
2055
+ }, p((e.detail ?? "").trim() ? "改详情" : "写详情"), 9, xa)
2056
+ ], 64)) : (c(), d(T, { key: 1 }, [
2057
+ ft(s("textarea", {
2058
+ "onUpdate:modelValue": t[14] || (t[14] = (u) => yt.value = u),
2059
+ class: "p-inputtext p-component mbc__detailinput",
2060
+ rows: "3",
2061
+ placeholder: "一段给人读的说明:这个块解决什么、怎么用、有哪些前提(只占一行)"
2062
+ }, null, 512), [
2063
+ [Yt, yt.value]
2064
+ ]),
2065
+ s("button", {
2066
+ class: "p-button p-button-sm",
2067
+ type: "button",
2068
+ disabled: C.value,
2069
+ onClick: (u) => Ln(e)
2070
+ }, "存详情", 8, Ca),
2071
+ s("button", {
2072
+ class: "p-button p-button-sm p-button-text",
2073
+ type: "button",
2074
+ disabled: C.value,
2075
+ onClick: t[15] || (t[15] = (u) => gt.value = "")
2076
+ }, "取消", 8, Ea)
2077
+ ], 64))
2078
+ ]),
2079
+ t[78] || (t[78] = s("dt", null, "文件", -1)),
1974
2080
  s("dd", null, p((e.fileNames || []).join(" / ") || "(没有文件)"), 1),
1975
- t[73] || (t[73] = s("dt", null, "版本", -1)),
2081
+ t[79] || (t[79] = s("dt", null, "版本", -1)),
1976
2082
  s("dd", null, [
1977
- k("v" + p(e.version || 1), 1),
1978
- s("span", oa, "(一共留着 " + p(e.versionCount ?? pt.value[e.id]?.length ?? 1) + " 版)", 1)
2083
+ y("v" + p(e.version || 1), 1),
2084
+ s("span", Sa, "(一共留着 " + p(e.versionCount ?? st.value[e.id]?.length ?? 1) + " 版)", 1)
1979
2085
  ]),
1980
- t[74] || (t[74] = s("dt", null, "标签", -1)),
2086
+ t[80] || (t[80] = s("dt", null, "标签", -1)),
1981
2087
  s("dd", null, [
1982
- yt.value !== e.id ? (r(), c(S, { key: 0 }, [
1983
- (r(!0), c(S, null, L(e.tags ?? [], (u) => (r(), c("span", {
2088
+ pt.value !== e.id ? (c(), d(T, { key: 0 }, [
2089
+ (c(!0), d(T, null, I(e.tags ?? [], (u) => (c(), d("span", {
1984
2090
  key: u,
1985
2091
  class: "p-tag mbc__tag"
1986
2092
  }, p(u), 1))), 128)),
1987
- (e.tags ?? []).length === 0 ? (r(), c("span", aa, "(没贴标签)")) : y("", !0),
2093
+ (e.tags ?? []).length === 0 ? (c(), d("span", Ta, "(没贴标签)")) : k("", !0),
1988
2094
  s("button", {
1989
2095
  class: "p-button p-button-sm p-button-text",
1990
2096
  type: "button",
1991
2097
  disabled: C.value,
1992
- onClick: (u) => wn(e)
1993
- }, "改标签", 8, la)
1994
- ], 64)) : (r(), c(S, { key: 1 }, [
1995
- _t(s("input", {
1996
- "onUpdate:modelValue": t[13] || (t[13] = (u) => X.value = u),
2098
+ onClick: (u) => Pn(e)
2099
+ }, "改标签", 8, Ba)
2100
+ ], 64)) : (c(), d(T, { key: 1 }, [
2101
+ ft(s("input", {
2102
+ "onUpdate:modelValue": t[16] || (t[16] = (u) => Z.value = u),
1997
2103
  class: "p-inputtext p-component mbc__taginput",
1998
2104
  type: "text",
1999
2105
  placeholder: "逗号分隔,例如:订单, 报表",
2000
- onKeyup: qn((u) => Me(e), ["enter"])
2001
- }, null, 40, ia), [
2002
- [ce, X.value]
2106
+ onKeyup: us((u) => Ie(e), ["enter"])
2107
+ }, null, 40, Ma), [
2108
+ [Yt, Z.value]
2003
2109
  ]),
2004
2110
  s("button", {
2005
2111
  class: "p-button p-button-sm",
2006
2112
  type: "button",
2007
2113
  disabled: C.value,
2008
- onClick: (u) => Me(e)
2009
- }, "存标签", 8, ua),
2114
+ onClick: (u) => Ie(e)
2115
+ }, "存标签", 8, Aa),
2010
2116
  s("button", {
2011
2117
  class: "p-button p-button-sm p-button-text",
2012
2118
  type: "button",
2013
2119
  disabled: C.value,
2014
- onClick: t[14] || (t[14] = (u) => yt.value = "")
2015
- }, "取消", 8, ra),
2016
- Z.value.length > 0 ? (r(), c("div", ca, [
2017
- t[69] || (t[69] = s("span", { class: "mbc__hint" }, "点现成的加进去:", -1)),
2018
- (r(!0), c(S, null, L(Z.value.slice(0, 16), (u) => (r(), c("button", {
2120
+ onClick: t[17] || (t[17] = (u) => pt.value = "")
2121
+ }, "取消", 8, Ra),
2122
+ G.value.length > 0 ? (c(), d("div", Oa, [
2123
+ t[75] || (t[75] = s("span", { class: "mbc__hint" }, "点现成的加进去:", -1)),
2124
+ (c(!0), d(T, null, I(G.value.slice(0, 16), (u) => (c(), d("button", {
2019
2125
  key: u.tag,
2020
2126
  class: "p-tag mbc__tag",
2021
2127
  type: "button",
2022
2128
  title: `把「${u.tag}」加进去`,
2023
- onClick: (E) => xn(u.tag)
2024
- }, p(u.tag), 9, da))), 128))
2025
- ])) : y("", !0),
2026
- X.value.trim() ? (r(), c("div", pa, [
2027
- t[70] || (t[70] = s("span", { class: "mbc__hint" }, "这一块会贴:", -1)),
2028
- (r(!0), c(S, null, L(X.value.split(/[,,\s]+/).filter(Boolean), (u) => (r(), c("button", {
2129
+ onClick: (S) => Dn(u.tag)
2130
+ }, p(u.tag), 9, Pa))), 128))
2131
+ ])) : k("", !0),
2132
+ Z.value.trim() ? (c(), d("div", La, [
2133
+ t[76] || (t[76] = s("span", { class: "mbc__hint" }, "这一块会贴:", -1)),
2134
+ (c(!0), d(T, null, I(Z.value.split(/[,,\s]+/).filter(Boolean), (u) => (c(), d("button", {
2029
2135
  key: u,
2030
2136
  class: "p-tag mbc__tag",
2031
2137
  type: "button",
2032
2138
  title: `从这一块上摘掉「${u}」`,
2033
- onClick: (E) => Cn(u)
2034
- }, p(u) + " ×", 9, ba))), 128))
2035
- ])) : y("", !0)
2139
+ onClick: (S) => In(u)
2140
+ }, p(u) + " ×", 9, ja))), 128))
2141
+ ])) : k("", !0)
2036
2142
  ], 64))
2037
2143
  ]),
2038
- t[75] || (t[75] = s("dt", null, "更新", -1)),
2144
+ t[81] || (t[81] = s("dt", null, "更新", -1)),
2039
2145
  s("dd", null, p(e.updatedAt || "—"), 1),
2040
- t[76] || (t[76] = s("dt", null, "id", -1)),
2041
- s("dd", ma, p(e.id), 1)
2146
+ t[82] || (t[82] = s("dt", null, "id", -1)),
2147
+ s("dd", Da, p(e.id), 1)
2042
2148
  ]),
2043
- s("div", fa, [
2149
+ s("div", Ia, [
2044
2150
  s("button", {
2045
2151
  class: "p-button p-button-sm p-button-outlined",
2046
2152
  type: "button",
2047
2153
  disabled: C.value,
2048
- onClick: (u) => Yt(e),
2154
+ onClick: (u) => ne(e),
2049
2155
  title: "删掉这一块的代码文件:本机的文件夹 + 库里那份代码正文(点下去会先问你确认)。块本身留着,页面上会显示成占位框"
2050
- }, "删除代码文件", 8, va)
2156
+ }, "删除代码文件", 8, Na)
2051
2157
  ]),
2052
- s("div", _a, [
2053
- s("div", ha, [
2054
- t[77] || (t[77] = s("strong", null, "版本(每次上传 +1,旧的都留着)", -1)),
2158
+ s("div", Fa, [
2159
+ s("div", Ua, [
2160
+ t[83] || (t[83] = s("strong", null, "版本(每次上传 +1,旧的都留着)", -1)),
2055
2161
  s("button", {
2056
2162
  class: "p-button p-button-sm p-button-text",
2057
2163
  type: "button",
2058
2164
  disabled: C.value,
2059
- onClick: (u) => $(e.id)
2060
- }, p(wt.value === e.id ? "读版本中…" : "刷新版本"), 9, ga)
2165
+ onClick: (u) => j(e.id)
2166
+ }, p($.value === e.id ? "读版本中…" : "刷新版本"), 9, za)
2061
2167
  ]),
2062
- pt.value[e.id] ? pt.value[e.id].length > 0 ? (r(), c("ul", ka, [
2063
- (r(!0), c(S, null, L(pt.value[e.id], (u) => (r(), c("li", {
2168
+ st.value[e.id] ? st.value[e.id].length > 0 ? (c(), d("ul", Ka, [
2169
+ (c(!0), d(T, null, I(st.value[e.id], (u) => (c(), d("li", {
2064
2170
  key: u.number,
2065
- class: z({ "is-current": u.current })
2171
+ class: H({ "is-current": u.current })
2066
2172
  }, [
2067
- s("span", $a, p(T(u)), 1),
2068
- s("span", wa, [
2069
- k(p(u.fileCount) + " 个文件 · " + p(D(u.sizeBytes)), 1),
2070
- u.createdBy ? (r(), c(S, { key: 0 }, [
2071
- k(" · " + p(u.createdBy), 1)
2072
- ], 64)) : y("", !0),
2073
- k(" · " + p(u.createdAt || "—"), 1)
2173
+ s("span", Va, p(ut(u)), 1),
2174
+ s("span", qa, [
2175
+ y(p(u.fileCount) + " 个文件 · " + p(jt(u.sizeBytes)), 1),
2176
+ u.createdBy ? (c(), d(T, { key: 0 }, [
2177
+ y(" · " + p(u.createdBy), 1)
2178
+ ], 64)) : k("", !0),
2179
+ y(" · " + p(u.createdAt || "—"), 1)
2074
2180
  ]),
2075
- s("span", xa, [
2181
+ s("span", Ja, [
2076
2182
  s("button", {
2077
2183
  class: "p-button p-button-sm p-button-text",
2078
2184
  type: "button",
2079
2185
  disabled: C.value || u.empty,
2080
- onClick: (E) => gn(e, u.number),
2186
+ onClick: (S) => Mn(e, u.number),
2081
2187
  title: u.empty ? "这一版是空包(代码被删过),没有正文可看" : "看这一版的正文(只读)"
2082
- }, "查看", 8, Ca),
2188
+ }, "查看", 8, Ga),
2083
2189
  s("button", {
2084
2190
  class: "p-button p-button-sm p-button-text",
2085
2191
  type: "button",
2086
2192
  disabled: C.value || u.current || u.empty,
2087
- onClick: (E) => yn(e, u.number),
2193
+ onClick: (S) => An(e, u.number),
2088
2194
  title: u.current ? "这一版正在跑" : "把这一版变成当前版(会记成一个新版本)"
2089
- }, "切回", 8, Ea),
2195
+ }, "切回", 8, Wa),
2090
2196
  s("button", {
2091
2197
  class: "p-button p-button-sm p-button-text",
2092
2198
  type: "button",
2093
2199
  disabled: C.value || u.empty,
2094
- onClick: (E) => $n(e, u.number),
2200
+ onClick: (S) => On(e, u.number),
2095
2201
  title: u.empty ? "空包没什么可下的" : "下载这一版(一个 zip)"
2096
- }, "下载", 8, Ta),
2202
+ }, "下载", 8, Ya),
2097
2203
  s("button", {
2098
2204
  class: "p-button p-button-sm p-button-text",
2099
2205
  type: "button",
2100
2206
  disabled: C.value || u.current,
2101
- onClick: (E) => kn(e, u.number),
2207
+ onClick: (S) => Rn(e, u.number),
2102
2208
  title: u.current ? "当前那一版不许删:先切到别的版本" : "删掉这一版(别的版本不受影响)"
2103
- }, "删", 8, Sa)
2209
+ }, "删", 8, Za)
2104
2210
  ])
2105
2211
  ], 2))), 128))
2106
- ])) : (r(), c("p", Ba, "这个块还没有版本记录(它从没被保存过)。")) : (r(), c("p", ya, "正在读版本…(没读到时点「刷新版本」)")),
2107
- et.value && et.value.id === e.id ? (r(), c("div", Aa, [
2108
- s("div", Ma, [
2109
- s("strong", null, "看 v" + p(et.value.number) + " 的正文(只读)", 1),
2212
+ ])) : (c(), d("p", Xa, "这个块还没有版本记录(它从没被保存过)。")) : (c(), d("p", Ha, "正在读版本…(没读到时点「刷新版本」)")),
2213
+ E.value && E.value.id === e.id ? (c(), d("div", Qa, [
2214
+ s("div", tl, [
2215
+ s("strong", null, "看 v" + p(E.value.number) + " 的正文(只读)", 1),
2110
2216
  s("button", {
2111
2217
  class: "p-button p-button-sm p-button-text",
2112
2218
  type: "button",
2113
- onClick: t[15] || (t[15] = (u) => et.value = null)
2219
+ onClick: t[18] || (t[18] = (u) => E.value = null)
2114
2220
  }, "收起")
2115
2221
  ]),
2116
- (r(!0), c(S, null, L(et.value.files, (u, E) => (r(), c("details", {
2117
- key: E,
2222
+ (c(!0), d(T, null, I(E.value.files, (u, S) => (c(), d("details", {
2223
+ key: S,
2118
2224
  class: "mbc__viewer-file"
2119
2225
  }, [
2120
- s("summary", Oa, p(E) + "(" + p(D(u.length)) + ")", 1),
2121
- s("pre", Ra, p(u), 1)
2226
+ s("summary", el, p(S) + "(" + p(jt(u.length)) + ")", 1),
2227
+ s("pre", nl, p(u), 1)
2122
2228
  ]))), 128))
2123
- ])) : y("", !0)
2229
+ ])) : k("", !0)
2124
2230
  ])
2125
- ])) : y("", !0)
2231
+ ])) : k("", !0)
2126
2232
  ]))), 128))
2127
2233
  ])
2128
2234
  ], 512), [
2129
- [qt, U.value === "blocks"]
2235
+ [Zt, R.value === "blocks"]
2130
2236
  ]),
2131
- _t(s("section", Pa, [
2132
- t[87] || (t[87] = s("h3", { class: "mbc__title" }, "导出去改(用你自己的编辑器)", -1)),
2133
- s("div", ja, [
2134
- t[78] || (t[78] = s("span", { class: "mbc__label" }, "体检", -1)),
2237
+ ft(s("section", sl, [
2238
+ t[93] || (t[93] = s("h3", { class: "mbc__title" }, "导出去改(用你自己的编辑器)", -1)),
2239
+ s("div", ol, [
2240
+ t[84] || (t[84] = s("span", { class: "mbc__label" }, "体检", -1)),
2135
2241
  s("button", {
2136
2242
  class: "p-button p-button-sm",
2137
2243
  type: "button",
2138
2244
  disabled: C.value,
2139
- onClick: t[16] || (t[16] = (e) => Rn())
2140
- }, p(kt.value ? "校验中…" : "校验全部魔法块"), 9, La),
2141
- t[79] || (t[79] = s("span", { class: "mbc__hint" }, "重新跑一遍逐块判据(试加载 + 引用深检),过不了的整块停用;改好再点一次就恢复。", -1))
2245
+ onClick: t[19] || (t[19] = (e) => qn())
2246
+ }, p(Lt.value ? "校验中…" : "校验全部魔法块"), 9, al),
2247
+ t[85] || (t[85] = s("span", { class: "mbc__hint" }, "重新跑一遍逐块判据(试加载 + 引用深检),过不了的整块停用;改好再点一次就恢复。", -1))
2142
2248
  ]),
2143
- t[88] || (t[88] = s("hr", { class: "mbc__rule" }, null, -1)),
2144
- s("div", Ia, [
2145
- t[81] || (t[81] = s("span", { class: "mbc__label" }, "导出范围", -1)),
2146
- s("label", Na, [
2249
+ t[94] || (t[94] = s("hr", { class: "mbc__rule" }, null, -1)),
2250
+ s("div", ll, [
2251
+ t[87] || (t[87] = s("span", { class: "mbc__label" }, "导出范围", -1)),
2252
+ s("label", il, [
2147
2253
  s("input", {
2148
2254
  type: "radio",
2149
2255
  name: "mbc-scope",
2150
2256
  value: "one",
2151
- checked: Q.value === "one",
2152
- onChange: t[17] || (t[17] = (e) => Q.value = "one")
2153
- }, null, 40, Da),
2154
- t[80] || (t[80] = k(" 仅这一个块 ", -1))
2257
+ checked: X.value === "one",
2258
+ onChange: t[20] || (t[20] = (e) => X.value = "one")
2259
+ }, null, 40, ul),
2260
+ t[86] || (t[86] = y(" 仅这一个块 ", -1))
2155
2261
  ]),
2156
- s("label", Fa, [
2262
+ s("label", rl, [
2157
2263
  s("input", {
2158
2264
  type: "radio",
2159
2265
  name: "mbc-scope",
2160
2266
  value: "all",
2161
- checked: Q.value === "all",
2162
- onChange: t[18] || (t[18] = (e) => Q.value = "all")
2163
- }, null, 40, za),
2164
- k(" 全部块(" + p(f.value.length) + " 个) ", 1)
2267
+ checked: X.value === "all",
2268
+ onChange: t[21] || (t[21] = (e) => X.value = "all")
2269
+ }, null, 40, cl),
2270
+ y(" 全部块(" + p(f.value.length) + " 个) ", 1)
2165
2271
  ]),
2166
- Q.value === "one" ? (r(), c("select", {
2272
+ X.value === "one" ? (c(), d("select", {
2167
2273
  key: 0,
2168
2274
  class: "p-inputtext p-component mbc__grow",
2169
- value: dt.value,
2275
+ value: $t.value,
2170
2276
  disabled: C.value || f.value.length === 0,
2171
- onChange: t[19] || (t[19] = (e) => Dt(e.target.value))
2277
+ onChange: t[22] || (t[22] = (e) => zt(e.target.value))
2172
2278
  }, [
2173
- f.value.length === 0 ? (r(), c("option", Ha, "(库里还没有块)")) : y("", !0),
2174
- (r(!0), c(S, null, L(f.value, (e) => (r(), c("option", {
2279
+ f.value.length === 0 ? (c(), d("option", pl, "(库里还没有块)")) : k("", !0),
2280
+ (c(!0), d(T, null, I(f.value, (e) => (c(), d("option", {
2175
2281
  key: e.id,
2176
2282
  value: e.id
2177
- }, p(e.module) + " / " + p(e.name || e.id), 9, Ka))), 128))
2178
- ], 40, Ua)) : y("", !0)
2283
+ }, p(e.module) + " / " + p(e.name || e.id), 9, bl))), 128))
2284
+ ], 40, dl)) : k("", !0)
2179
2285
  ]),
2180
- s("div", qa, [
2181
- t[82] || (t[82] = s("label", { for: "mbc-dir" }, "导出目录", -1)),
2286
+ s("div", ml, [
2287
+ t[88] || (t[88] = s("label", { for: "mbc-dir" }, "导出目录", -1)),
2182
2288
  s("input", {
2183
2289
  id: "mbc-dir",
2184
2290
  class: "p-inputtext p-component mbc__grow mbc__mono",
2185
2291
  type: "text",
2186
2292
  readonly: "",
2187
- value: N.value ? N.value.name : "(还没选:点右边那个按钮选一个文件夹)"
2188
- }, null, 8, Va),
2293
+ value: K.value ? K.value.name : "(还没选:点右边那个按钮选一个文件夹)"
2294
+ }, null, 8, fl),
2189
2295
  s("button", {
2190
2296
  class: "p-button p-button-sm p-button-outlined",
2191
2297
  type: "button",
2192
2298
  disabled: C.value,
2193
- onClick: t[20] || (t[20] = (e) => Pe("export"))
2194
- }, "选择文件夹", 8, Ja),
2299
+ onClick: t[23] || (t[23] = (e) => Ue("export"))
2300
+ }, "选择文件夹", 8, vl),
2195
2301
  s("button", {
2196
2302
  class: "p-button p-button-sm mbc__act-export",
2197
2303
  type: "button",
2198
- disabled: C.value || Q.value === "one" && !ut.value,
2199
- title: Q.value === "one" && !ut.value ? "先在左边挑一个块(或者把范围改成「全部块」)" : "把库里的块铺到你选的文件夹",
2200
- onClick: t[21] || (t[21] = (e) => Pn())
2201
- }, p(it.value ? "导出中…" : "导出"), 9, Ga)
2304
+ disabled: C.value || X.value === "one" && !bt.value,
2305
+ title: X.value === "one" && !bt.value ? "先在左边挑一个块(或者把范围改成「全部块」)" : "把库里的块铺到你选的文件夹",
2306
+ onClick: t[24] || (t[24] = (e) => Jn())
2307
+ }, p(lt.value ? "导出中…" : "导出"), 9, hl)
2202
2308
  ]),
2203
- s("p", Wa, [
2204
- k(p(Q.value === "all" ? `这一趟铺全部 ${f.value.length} 个块` : ut.value ? `这一趟只铺「${ut.value.module} / ${ut.value.name || ut.value.id}」` : "先挑一个块") + " ⇒ ", 1),
2205
- t[83] || (t[83] = s("span", { class: "mbc__mono" }, "workspace/<可读名>-<块 uuid>/", -1)),
2206
- t[84] || (t[84] = k(",顶层另附开发说明与 ", -1)),
2207
- t[85] || (t[85] = s("span", { class: "mbc__mono" }, "example/", -1)),
2208
- t[86] || (t[86] = k("。 ", -1))
2309
+ s("p", _l, [
2310
+ y(p(X.value === "all" ? `这一趟铺全部 ${f.value.length} 个块` : bt.value ? `这一趟只铺「${bt.value.module} / ${bt.value.name || bt.value.id}」` : "先挑一个块") + " ⇒ ", 1),
2311
+ t[89] || (t[89] = s("span", { class: "mbc__mono" }, "workspace/<可读名>-<块 uuid>/", -1)),
2312
+ t[90] || (t[90] = y(",顶层另附开发说明与 ", -1)),
2313
+ t[91] || (t[91] = s("span", { class: "mbc__mono" }, "example/", -1)),
2314
+ t[92] || (t[92] = y("。 ", -1))
2209
2315
  ]),
2210
- rt.value ? (r(), c("p", Ya, p(rt.value), 1)) : y("", !0)
2316
+ V.value ? (c(), d("p", gl, p(V.value), 1)) : k("", !0)
2211
2317
  ], 512), [
2212
- [qt, U.value === "workspace"]
2318
+ [Zt, R.value === "workspace"]
2213
2319
  ]),
2214
- _t(s("section", Za, [
2215
- t[97] || (t[97] = s("h3", { class: "mbc__title" }, "读回改动", -1)),
2216
- s("div", Xa, [
2217
- t[89] || (t[89] = s("label", { for: "mbc-read-dir" }, "读回目录", -1)),
2320
+ ft(s("section", yl, [
2321
+ t[103] || (t[103] = s("h3", { class: "mbc__title" }, "读回改动", -1)),
2322
+ s("div", kl, [
2323
+ t[95] || (t[95] = s("label", { for: "mbc-read-dir" }, "读回目录", -1)),
2218
2324
  s("input", {
2219
2325
  id: "mbc-read-dir",
2220
2326
  class: "p-inputtext p-component mbc__grow mbc__mono",
2221
2327
  type: "text",
2222
2328
  readonly: "",
2223
- value: P.value ? P.value.name : "(还没选:导出会自动填上,也可以自己选一个)"
2224
- }, null, 8, Qa),
2329
+ value: U.value ? U.value.name : "(还没选:导出会自动填上,也可以自己选一个)"
2330
+ }, null, 8, $l),
2225
2331
  s("button", {
2226
2332
  class: "p-button p-button-sm p-button-outlined",
2227
2333
  type: "button",
2228
2334
  disabled: C.value,
2229
- onClick: t[22] || (t[22] = (e) => Pe("read"))
2230
- }, "选择文件夹", 8, tl),
2335
+ onClick: t[25] || (t[25] = (e) => Ue("read"))
2336
+ }, "选择文件夹", 8, wl),
2231
2337
  s("button", {
2232
2338
  class: "p-button p-button-sm p-button-outlined",
2233
2339
  type: "button",
2234
2340
  disabled: C.value,
2235
- onClick: t[23] || (t[23] = (e) => je())
2236
- }, p(Mt.value ? "读回中…" : "读回改动"), 9, el)
2341
+ onClick: t[26] || (t[26] = (e) => Ke())
2342
+ }, p(kt.value ? "读回中…" : "读回改动"), 9, xl)
2237
2343
  ]),
2238
- P.value && N.value && P.value.name !== N.value.name ? (r(), c("p", nl, " 读回的是「" + p(P.value.name) + "」(与导出目录「" + p(N.value.name) + "」不是同一个 —— 想同步就再选一次)。 ", 1)) : (r(), c("p", sl, "读回目录默认跟着导出目录;要读别的文件夹就点「选择文件夹」单独选一个。")),
2239
- M.value ? (r(), c(S, { key: 2 }, [
2240
- Ut.value.length > 0 ? (r(), c("p", ol, [
2241
- t[90] || (t[90] = k(" 扫到 ", -1)),
2242
- s("b", null, p(M.value.blocks.length), 1),
2243
- t[91] || (t[91] = k(" 个块,其中 ", -1)),
2244
- s("b", al, p(Ut.value.length), 1),
2245
- t[92] || (t[92] = k(" 个可以存;已经勾了 ", -1)),
2246
- s("b", null, p(Ht.value.length), 1),
2247
- t[93] || (t[93] = k(" 个。 ", -1)),
2344
+ U.value && K.value && U.value.name !== K.value.name ? (c(), d("p", Cl, " 读回的是「" + p(U.value.name) + "」(与导出目录「" + p(K.value.name) + "」不是同一个 —— 想同步就再选一次)。 ", 1)) : (c(), d("p", El, "读回目录默认跟着导出目录;要读别的文件夹就点「选择文件夹」单独选一个。")),
2345
+ A.value ? (c(), d(T, { key: 2 }, [
2346
+ qt.value.length > 0 ? (c(), d("p", Sl, [
2347
+ t[96] || (t[96] = y(" 扫到 ", -1)),
2348
+ s("b", null, p(A.value.blocks.length), 1),
2349
+ t[97] || (t[97] = y(" 个块,其中 ", -1)),
2350
+ s("b", Tl, p(qt.value.length), 1),
2351
+ t[98] || (t[98] = y(" 个可以存;已经勾了 ", -1)),
2352
+ s("b", null, p(Jt.value.length), 1),
2353
+ t[99] || (t[99] = y(" 个。 ", -1)),
2248
2354
  s("button", {
2249
2355
  class: "p-button p-button-sm p-button-text",
2250
2356
  type: "button",
2251
2357
  disabled: C.value,
2252
- onClick: t[24] || (t[24] = (e) => Le(!0))
2253
- }, "全选可存的", 8, ll),
2358
+ onClick: t[27] || (t[27] = (e) => Ve(!0))
2359
+ }, "全选可存的", 8, Bl),
2254
2360
  s("button", {
2255
2361
  class: "p-button p-button-sm p-button-text",
2256
2362
  type: "button",
2257
- disabled: C.value || Ht.value.length === 0,
2258
- onClick: t[25] || (t[25] = (e) => Le(!1))
2259
- }, "全不选", 8, il)
2260
- ])) : y("", !0),
2261
- M.value.blocks.length > 0 ? (r(), c("ul", ul, [
2262
- (r(!0), c(S, null, L(M.value.blocks, (e) => (r(), c("li", {
2363
+ disabled: C.value || Jt.value.length === 0,
2364
+ onClick: t[28] || (t[28] = (e) => Ve(!1))
2365
+ }, "全不选", 8, Ml)
2366
+ ])) : k("", !0),
2367
+ A.value.blocks.length > 0 ? (c(), d("ul", Al, [
2368
+ (c(!0), d(T, null, I(A.value.blocks, (e) => (c(), d("li", {
2263
2369
  key: e.id,
2264
- class: z(["mbc__block", { "is-picked": F.value[e.id] === !0, "is-blocked": !e.canApply }])
2370
+ class: H(["mbc__block", { "is-picked": it.value[e.id] === !0, "is-blocked": !e.canApply }])
2265
2371
  }, [
2266
- s("label", rl, [
2372
+ s("label", Rl, [
2267
2373
  s("span", {
2268
- class: z(["p-checkbox p-component", { "p-disabled": !e.canApply }])
2374
+ class: H(["p-checkbox p-component", { "p-disabled": !e.canApply }])
2269
2375
  }, [
2270
2376
  s("input", {
2271
2377
  class: "p-checkbox-input",
2272
2378
  type: "checkbox",
2273
2379
  disabled: !e.canApply,
2274
- checked: F.value[e.id] === !0,
2275
- onChange: (u) => Dn(e.id, u)
2276
- }, null, 40, cl),
2277
- t[94] || (t[94] = s("span", { class: "p-checkbox-box" }, null, -1))
2380
+ checked: it.value[e.id] === !0,
2381
+ onChange: (u) => Qn(e.id, u)
2382
+ }, null, 40, Ol),
2383
+ t[100] || (t[100] = s("span", { class: "p-checkbox-box" }, null, -1))
2278
2384
  ], 2),
2279
- s("span", dl, p(e.name || e.id), 1),
2385
+ s("span", Pl, p(e.name || e.id), 1),
2280
2386
  s("span", {
2281
- class: z(["p-tag", e.status === "modified" ? "p-tag-success" : e.status === "missing" ? "p-tag-warning" : e.status === "not-in-db" ? "p-tag-info" : ""])
2282
- }, p(a[e.status]), 3),
2283
- s("span", pl, p(e.module || "—"), 1)
2387
+ class: H(["p-tag", e.status === "modified" ? "p-tag-success" : e.status === "missing" ? "p-tag-warning" : e.status === "not-in-db" ? "p-tag-info" : ""])
2388
+ }, p(o[e.status]), 3),
2389
+ s("span", Ll, p(e.module || "—"), 1)
2284
2390
  ]),
2285
- s("p", bl, [
2286
- e.status === "missing" ? (r(), c(S, { key: 0 }, [
2287
- k("目录里没有这一块,勾不上")
2288
- ], 64)) : e.status === "not-in-db" ? (r(), c(S, { key: 1 }, [
2289
- k("库里还没有这一块 —— 勾上它保存,就是按这一包新建")
2290
- ], 64)) : e.changedFiles.length > 0 ? (r(), c(S, { key: 2 }, [
2291
- t[95] || (t[95] = k("改了:", -1)),
2292
- s("span", ml, p(e.changedFiles.join(" / ")), 1)
2293
- ], 64)) : (r(), c(S, { key: 3 }, [
2294
- k("内容与库里一致")
2391
+ s("p", jl, [
2392
+ e.status === "missing" ? (c(), d(T, { key: 0 }, [
2393
+ y("目录里没有这一块,勾不上")
2394
+ ], 64)) : e.status === "not-in-db" ? (c(), d(T, { key: 1 }, [
2395
+ y("库里还没有这一块 —— 勾上它保存,就是按这一包新建")
2396
+ ], 64)) : e.changedFiles.length > 0 ? (c(), d(T, { key: 2 }, [
2397
+ t[101] || (t[101] = y("改了:", -1)),
2398
+ s("span", Dl, p(e.changedFiles.join(" / ")), 1)
2399
+ ], 64)) : (c(), d(T, { key: 3 }, [
2400
+ y("内容与库里一致")
2295
2401
  ], 64))
2296
2402
  ]),
2297
- e.blockedWhy ? (r(), c("p", fl, "不能存:" + p(e.blockedWhy), 1)) : y("", !0),
2298
- s("p", vl, p(e.folder || e.where), 1)
2403
+ e.blockedWhy ? (c(), d("p", Il, "不能存:" + p(e.blockedWhy), 1)) : k("", !0),
2404
+ s("p", Nl, p(e.folder || e.where), 1)
2299
2405
  ], 2))), 128))
2300
- ])) : (r(), c("p", _l, "这个目录里没有认出任何块(点上面那个按钮再扫一次,或者确认文件夹名里有那个块的 uuid)。")),
2301
- s("div", hl, [
2302
- at.value > 0 ? (r(), c("button", {
2406
+ ])) : (c(), d("p", Fl, "这个目录里没有认出任何块(点上面那个按钮再扫一次,或者确认文件夹名里有那个块的 uuid)。")),
2407
+ s("div", Ul, [
2408
+ rt.value > 0 ? (c(), d("button", {
2303
2409
  key: 0,
2304
2410
  class: "p-button p-button-sm mbc__report-btn",
2305
2411
  type: "button",
2306
- title: "点开看这一趟的全部问题(" + at.value + " 条)",
2307
- onClick: t[26] || (t[26] = (e) => xt.value = !0)
2308
- }, "查看问题(" + p(at.value) + ")⚠", 9, gl)) : (r(), c("span", yl, "这一趟没有问题")),
2309
- M.value.unmatched.length > 0 ? (r(), c("span", {
2412
+ title: "点开看这一趟的全部问题(" + rt.value + " 条)",
2413
+ onClick: t[29] || (t[29] = (e) => At.value = !0)
2414
+ }, "查看问题(" + p(rt.value) + ")⚠", 9, zl)) : (c(), d("span", Hl, "这一趟没有问题")),
2415
+ A.value.unmatched.length > 0 ? (c(), d("span", {
2310
2416
  key: 2,
2311
2417
  class: "mbc__chip is-bad",
2312
- title: M.value.unmatched.join(" / ")
2313
- }, "认不出归属的文件夹 " + p(M.value.unmatched.length), 9, kl)) : y("", !0)
2418
+ title: A.value.unmatched.join(" / ")
2419
+ }, "认不出归属的文件夹 " + p(A.value.unmatched.length), 9, Kl)) : k("", !0)
2314
2420
  ]),
2315
- (M.value.skipped ?? []).length > 0 ? (r(), c("p", $l, [
2316
- k(" 忽略了 " + p((M.value.skipped ?? []).length) + " 个文件夹(名字里没有 uuid,当测试文件处理 —— 与忽略 ", 1),
2317
- t[96] || (t[96] = s("span", { class: "mbc__mono" }, "example/", -1)),
2318
- k(" 同一个规矩):" + p((M.value.skipped ?? []).join(" / ")), 1)
2319
- ])) : y("", !0),
2320
- s("div", wl, [
2421
+ (A.value.skipped ?? []).length > 0 ? (c(), d("p", Vl, [
2422
+ y(" 忽略了 " + p((A.value.skipped ?? []).length) + " 个文件夹(名字里没有 uuid,当测试文件处理 —— 与忽略 ", 1),
2423
+ t[102] || (t[102] = s("span", { class: "mbc__mono" }, "example/", -1)),
2424
+ y(" 同一个规矩):" + p((A.value.skipped ?? []).join(" / ")), 1)
2425
+ ])) : k("", !0),
2426
+ s("div", ql, [
2321
2427
  s("button", {
2322
2428
  class: "p-button p-button-sm mbc__act-import",
2323
2429
  type: "button",
2324
2430
  disabled: C.value,
2325
- onClick: t[27] || (t[27] = (e) => Nn())
2326
- }, p($t.value ? "保存中…" : `保存选中的块(${Ht.value.length})`), 9, xl)
2431
+ onClick: t[30] || (t[30] = (e) => Xn())
2432
+ }, p(nt.value ? "保存中…" : `保存选中的块(${Jt.value.length})`), 9, Jl)
2327
2433
  ])
2328
- ], 64)) : y("", !0)
2434
+ ], 64)) : k("", !0)
2329
2435
  ], 512), [
2330
- [qt, U.value === "workspace"]
2436
+ [Zt, R.value === "workspace"]
2331
2437
  ]),
2332
- _t(s("section", Cl, [
2333
- s("h3", El, [
2334
- t[98] || (t[98] = k(" 不在数据库 ", -1)),
2335
- s("span", Tl, p(mt(l)), 1),
2336
- s("span", Sl, p(oe.value.length), 1)
2438
+ ft(s("section", Gl, [
2439
+ s("h3", Wl, [
2440
+ t[104] || (t[104] = y(" 不在数据库 ", -1)),
2441
+ s("span", Yl, p(_t(l)), 1),
2442
+ s("span", Zl, p(ce.value.length), 1)
2337
2443
  ]),
2338
- oe.value.length === 0 ? (r(), c("p", Bl, "路由表里声明的块,库里都有那一行。")) : (r(), c(S, { key: 1 }, [
2339
- s("p", Al, [
2340
- t[99] || (t[99] = k(" 这些页面的路由(", -1)),
2341
- t[100] || (t[100] = s("span", { class: "mbc__mono" }, "component: MagicBlockPage", -1)),
2342
- t[101] || (t[101] = k(")声明了块的 uuid, ", -1)),
2343
- t[102] || (t[102] = s("span", { class: "mbc__mono" }, "/magic-blocks/index", -1)),
2344
- t[103] || (t[103] = k(" 里却没有这一行 —— 页面上那一块现在是占位框。 ", -1)),
2345
- t[104] || (t[104] = s("b", null, "要建进库", -1)),
2346
- k(":在上面「读回改动」里选中放这一块的文件夹(文件夹名里有 uuid), 扫出来就是一条标签写着「" + p(mt(l)) + "」、能勾能存的条目。 ", 1)
2444
+ ce.value.length === 0 ? (c(), d("p", Xl, "路由表里声明的块,库里都有那一行。")) : (c(), d(T, { key: 1 }, [
2445
+ s("p", Ql, [
2446
+ t[105] || (t[105] = y(" 这些页面的路由(", -1)),
2447
+ t[106] || (t[106] = s("span", { class: "mbc__mono" }, "component: MagicBlockPage", -1)),
2448
+ t[107] || (t[107] = y(")声明了块的 uuid, ", -1)),
2449
+ t[108] || (t[108] = s("span", { class: "mbc__mono" }, "/magic-blocks/index", -1)),
2450
+ t[109] || (t[109] = y(" 里却没有这一行 —— 页面上那一块现在是占位框。 ", -1)),
2451
+ t[110] || (t[110] = s("b", null, "要建进库", -1)),
2452
+ y(":在上面「读回改动」里选中放这一块的文件夹(文件夹名里有 uuid), 扫出来就是一条标签写着「" + p(_t(l)) + "」、能勾能存的条目。 ", 1)
2347
2453
  ]),
2348
- s("ul", Ml, [
2349
- (r(!0), c(S, null, L(oe.value, (e) => (r(), c("li", {
2454
+ s("ul", ti, [
2455
+ (c(!0), d(T, null, I(ce.value, (e) => (c(), d("li", {
2350
2456
  key: e.uuid,
2351
2457
  class: "mbc__block is-blocked"
2352
2458
  }, [
2353
- s("label", Ol, [
2354
- t[105] || (t[105] = s("span", { class: "p-checkbox p-component p-disabled" }, [
2459
+ s("label", ei, [
2460
+ t[111] || (t[111] = s("span", { class: "p-checkbox p-component p-disabled" }, [
2355
2461
  s("input", {
2356
2462
  class: "p-checkbox-input",
2357
2463
  type: "checkbox",
@@ -2359,205 +2465,205 @@ ${t.text}`).join(`
2359
2465
  }),
2360
2466
  s("span", { class: "p-checkbox-box" })
2361
2467
  ], -1)),
2362
- s("span", Rl, p(e.title || e.uuid), 1),
2363
- s("span", Pl, p(mt(l)), 1),
2364
- s("span", jl, p(e.module || "—"), 1)
2468
+ s("span", ni, p(e.title || e.uuid), 1),
2469
+ s("span", si, p(_t(l)), 1),
2470
+ s("span", oi, p(e.module || "—"), 1)
2365
2471
  ]),
2366
- s("p", Ll, [
2367
- t[106] || (t[106] = k(" 路由 ", -1)),
2368
- s("span", Il, p(e.path), 1),
2369
- t[107] || (t[107] = k(" 声明了它,库里没有这个块 —— 手里还没有放这个块的文件夹,所以这里勾不上(勾上了也没有正文可存)。 ", -1))
2472
+ s("p", ai, [
2473
+ t[112] || (t[112] = y(" 路由 ", -1)),
2474
+ s("span", li, p(e.path), 1),
2475
+ t[113] || (t[113] = y(" 声明了它,库里没有这个块 —— 手里还没有放这个块的文件夹,所以这里勾不上(勾上了也没有正文可存)。 ", -1))
2370
2476
  ]),
2371
- s("p", Nl, p(e.uuid), 1)
2477
+ s("p", ii, p(e.uuid), 1)
2372
2478
  ]))), 128))
2373
2479
  ])
2374
2480
  ], 64))
2375
2481
  ], 512), [
2376
- [qt, U.value === "workspace"]
2482
+ [Zt, R.value === "workspace"]
2377
2483
  ]),
2378
- U.value === "workspace" && (I.value.length > 0 || J.value.length > 0) ? (r(), c("section", Dl, [
2379
- t[108] || (t[108] = s("h3", { class: "mbc__title" }, "保存结果", -1)),
2380
- s("p", Fl, [
2381
- s("span", zl, "存成 " + p(ne.value), 1),
2382
- jt.value.length > 0 ? (r(), c("span", Ul, "没存成 " + p(jt.value.length), 1)) : y("", !0),
2383
- I.value.length > 0 ? (r(), c("span", Hl, "前端拦下 " + p(I.value.length), 1)) : y("", !0),
2384
- jt.value.length === 0 && I.value.length === 0 ? (r(), c("span", Kl, "明细在下面那个「查看问题」里(没问题时是空的)。")) : y("", !0)
2484
+ R.value === "workspace" && (W.value.length > 0 || Y.value.length > 0) ? (c(), d("section", ui, [
2485
+ t[114] || (t[114] = s("h3", { class: "mbc__title" }, "保存结果", -1)),
2486
+ s("p", ri, [
2487
+ s("span", ci, "存成 " + p(ue.value), 1),
2488
+ It.value.length > 0 ? (c(), d("span", di, "没存成 " + p(It.value.length), 1)) : k("", !0),
2489
+ W.value.length > 0 ? (c(), d("span", pi, "前端拦下 " + p(W.value.length), 1)) : k("", !0),
2490
+ It.value.length === 0 && W.value.length === 0 ? (c(), d("span", bi, "明细在下面那个「查看问题」里(没问题时是空的)。")) : k("", !0)
2385
2491
  ]),
2386
- s("div", ql, [
2492
+ s("div", mi, [
2387
2493
  s("button", {
2388
2494
  class: "p-button p-button-sm mbc__report-btn",
2389
2495
  type: "button",
2390
- onClick: t[28] || (t[28] = (e) => xt.value = !0)
2391
- }, "查看问题(" + p(at.value) + ")⚠", 1)
2496
+ onClick: t[31] || (t[31] = (e) => At.value = !0)
2497
+ }, "查看问题(" + p(rt.value) + ")⚠", 1)
2392
2498
  ])
2393
- ])) : y("", !0),
2394
- t[109] || (t[109] = s("div", {
2499
+ ])) : k("", !0),
2500
+ t[115] || (t[115] = s("div", {
2395
2501
  class: "mbc__tailspace",
2396
2502
  "aria-hidden": "true"
2397
2503
  }, null, -1))
2398
2504
  ]),
2399
- s("footer", Vl, [
2400
- A.value.length > 0 ? (r(), c("button", {
2505
+ s("footer", fi, [
2506
+ M.value.length > 0 ? (c(), d("button", {
2401
2507
  key: 0,
2402
2508
  class: "p-button p-button-sm mbc__report-btn",
2403
2509
  type: "button",
2404
- title: "点开看全部报错(" + A.value.length + " 条)",
2405
- onClick: t[29] || (t[29] = (e) => K.value = !0)
2406
- }, "查看报错(" + p(A.value.length) + " 条)⚠", 9, Jl)) : y("", !0),
2407
- h.value ? (r(), c("p", Gl, p(h.value), 1)) : g.value ? (r(), c("p", Wl, p(g.value), 1)) : (r(), c("p", Yl, "—"))
2510
+ title: "点开看全部报错(" + M.value.length + " 条)",
2511
+ onClick: t[32] || (t[32] = (e) => F.value = !0)
2512
+ }, "查看报错(" + p(M.value.length) + " 条)⚠", 9, vi)) : k("", !0),
2513
+ _.value ? (c(), d("p", hi, p(_.value), 1)) : g.value ? (c(), d("p", _i, p(g.value), 1)) : (c(), d("p", gi, "—"))
2408
2514
  ])
2409
- ], 2)) : y("", !0),
2410
- b.value && xt.value ? (r(), c("div", {
2515
+ ], 2)) : k("", !0),
2516
+ b.value && At.value ? (c(), d("div", {
2411
2517
  key: 1,
2412
2518
  class: "mbc__modal",
2413
2519
  role: "dialog",
2414
2520
  "aria-modal": "true",
2415
- onClick: t[33] || (t[33] = he((e) => xt.value = !1, ["self"]))
2521
+ onClick: t[36] || (t[36] = Ce((e) => At.value = !1, ["self"]))
2416
2522
  }, [
2417
- s("div", Zl, [
2418
- s("header", Xl, [
2419
- s("strong", null, "读回 / 保存的问题(" + p(at.value) + " 条)", 1),
2523
+ s("div", yi, [
2524
+ s("header", ki, [
2525
+ s("strong", null, "读回 / 保存的问题(" + p(rt.value) + " 条)", 1),
2420
2526
  s("button", {
2421
2527
  class: "p-button p-button-sm p-button-text",
2422
2528
  type: "button",
2423
- onClick: t[30] || (t[30] = (e) => xt.value = !1)
2529
+ onClick: t[33] || (t[33] = (e) => At.value = !1)
2424
2530
  }, "收起")
2425
2531
  ]),
2426
- s("div", Ql, [
2427
- I.value.length > 0 ? (r(), c("section", ti, [
2428
- s("h4", ei, "前端校验拦下的(" + p(I.value.length) + ")", 1),
2429
- s("ul", ni, [
2430
- (r(!0), c(S, null, L(I.value, (e, u) => (r(), c("li", { key: u }, p(e), 1))), 128))
2532
+ s("div", $i, [
2533
+ W.value.length > 0 ? (c(), d("section", wi, [
2534
+ s("h4", xi, "前端校验拦下的(" + p(W.value.length) + ")", 1),
2535
+ s("ul", Ci, [
2536
+ (c(!0), d(T, null, I(W.value, (e, u) => (c(), d("li", { key: u }, p(e), 1))), 128))
2431
2537
  ])
2432
- ])) : y("", !0),
2433
- (M.value?.failures ?? []).length > 0 ? (r(), c("section", si, [
2434
- s("h4", oi, "读回时逐条回的(" + p((M.value?.failures ?? []).length) + ")", 1),
2435
- s("ul", ai, [
2436
- (r(!0), c(S, null, L(M.value?.failures ?? [], (e, u) => (r(), c("li", { key: u }, [
2437
- s("span", li, p(e.kind || "问题"), 1),
2438
- s("span", ii, p(e.where), 1),
2439
- k(" " + p(e.message), 1)
2538
+ ])) : k("", !0),
2539
+ (A.value?.failures ?? []).length > 0 ? (c(), d("section", Ei, [
2540
+ s("h4", Si, "读回时逐条回的(" + p((A.value?.failures ?? []).length) + ")", 1),
2541
+ s("ul", Ti, [
2542
+ (c(!0), d(T, null, I(A.value?.failures ?? [], (e, u) => (c(), d("li", { key: u }, [
2543
+ s("span", Bi, p(e.kind || "问题"), 1),
2544
+ s("span", Mi, p(e.where), 1),
2545
+ y(" " + p(e.message), 1)
2440
2546
  ]))), 128))
2441
2547
  ])
2442
- ])) : y("", !0),
2443
- (M.value?.unmatched ?? []).length > 0 ? (r(), c("section", ui, [
2444
- s("h4", ri, "认不出归属的文件夹(" + p((M.value?.unmatched ?? []).length) + ")", 1),
2445
- s("ul", ci, [
2446
- (r(!0), c(S, null, L(M.value?.unmatched ?? [], (e, u) => (r(), c("li", { key: u }, [
2447
- s("span", di, p(e), 1)
2548
+ ])) : k("", !0),
2549
+ (A.value?.unmatched ?? []).length > 0 ? (c(), d("section", Ai, [
2550
+ s("h4", Ri, "认不出归属的文件夹(" + p((A.value?.unmatched ?? []).length) + ")", 1),
2551
+ s("ul", Oi, [
2552
+ (c(!0), d(T, null, I(A.value?.unmatched ?? [], (e, u) => (c(), d("li", { key: u }, [
2553
+ s("span", Pi, p(e), 1)
2448
2554
  ]))), 128))
2449
2555
  ])
2450
- ])) : y("", !0),
2451
- J.value.length > 0 ? (r(), c("section", pi, [
2452
- s("h4", bi, "保存结果(" + p(J.value.length) + ":存成 " + p(ne.value) + ",没存成 " + p(jt.value.length) + ")", 1),
2453
- s("ul", mi, [
2454
- (r(!0), c(S, null, L(J.value, (e) => (r(), c("li", {
2556
+ ])) : k("", !0),
2557
+ Y.value.length > 0 ? (c(), d("section", Li, [
2558
+ s("h4", ji, "保存结果(" + p(Y.value.length) + ":存成 " + p(ue.value) + ",没存成 " + p(It.value.length) + ")", 1),
2559
+ s("ul", Di, [
2560
+ (c(!0), d(T, null, I(Y.value, (e) => (c(), d("li", {
2455
2561
  key: e.id,
2456
- class: z({ "is-ok": e.ok })
2562
+ class: H({ "is-ok": e.ok })
2457
2563
  }, [
2458
2564
  s("strong", null, p(e.name || e.id) + ":" + p(e.ok ? "已保存" : "没保存"), 1),
2459
- !e.ok && e.error ? (r(), c("span", fi, p(e.error), 1)) : y("", !0),
2460
- !e.ok && (e.issues ?? []).length > 0 ? (r(), c("ul", vi, [
2461
- (r(!0), c(S, null, L(e.issues, (u, E) => (r(), c("li", { key: E }, p(u), 1))), 128))
2462
- ])) : y("", !0)
2565
+ !e.ok && e.error ? (c(), d("span", Ii, p(e.error), 1)) : k("", !0),
2566
+ !e.ok && (e.issues ?? []).length > 0 ? (c(), d("ul", Ni, [
2567
+ (c(!0), d(T, null, I(e.issues, (u, S) => (c(), d("li", { key: S }, p(u), 1))), 128))
2568
+ ])) : k("", !0)
2463
2569
  ], 2))), 128))
2464
2570
  ])
2465
- ])) : y("", !0),
2466
- at.value === 0 ? (r(), c("p", _i, "这一趟没有问题。")) : y("", !0)
2571
+ ])) : k("", !0),
2572
+ rt.value === 0 ? (c(), d("p", Fi, "这一趟没有问题。")) : k("", !0)
2467
2573
  ]),
2468
- s("footer", hi, [
2574
+ s("footer", Ui, [
2469
2575
  s("button", {
2470
2576
  class: "p-button p-button-sm p-button-outlined",
2471
2577
  type: "button",
2472
- onClick: t[31] || (t[31] = (e) => On())
2578
+ onClick: t[34] || (t[34] = (e) => Vn())
2473
2579
  }, "复制全部"),
2474
2580
  s("button", {
2475
2581
  class: "p-button p-button-sm",
2476
2582
  type: "button",
2477
- onClick: t[32] || (t[32] = (e) => xt.value = !1)
2583
+ onClick: t[35] || (t[35] = (e) => At.value = !1)
2478
2584
  }, "知道了")
2479
2585
  ])
2480
2586
  ])
2481
- ])) : y("", !0),
2482
- b.value && K.value ? (r(), c("div", {
2587
+ ])) : k("", !0),
2588
+ b.value && F.value ? (c(), d("div", {
2483
2589
  key: 2,
2484
2590
  class: "mbc__modal",
2485
2591
  role: "dialog",
2486
2592
  "aria-modal": "true",
2487
- onClick: t[38] || (t[38] = he((e) => K.value = !1, ["self"]))
2593
+ onClick: t[41] || (t[41] = Ce((e) => F.value = !1, ["self"]))
2488
2594
  }, [
2489
- s("div", gi, [
2490
- s("header", yi, [
2491
- s("strong", null, "报错(" + p(A.value.length) + " 条)", 1),
2595
+ s("div", zi, [
2596
+ s("header", Hi, [
2597
+ s("strong", null, "报错(" + p(M.value.length) + " 条)", 1),
2492
2598
  s("button", {
2493
2599
  class: "p-button p-button-sm p-button-text",
2494
2600
  type: "button",
2495
- onClick: t[34] || (t[34] = (e) => K.value = !1)
2601
+ onClick: t[37] || (t[37] = (e) => F.value = !1)
2496
2602
  }, "收起")
2497
2603
  ]),
2498
- s("div", ki, [
2499
- s("ol", $i, [
2500
- (r(!0), c(S, null, L(A.value, (e, u) => (r(), c("li", { key: u }, [
2501
- s("div", wi, [
2502
- s("span", xi, p(e.at), 1),
2503
- k(" · " + p(e.where), 1)
2604
+ s("div", Ki, [
2605
+ s("ol", Vi, [
2606
+ (c(!0), d(T, null, I(M.value, (e, u) => (c(), d("li", { key: u }, [
2607
+ s("div", qi, [
2608
+ s("span", Ji, p(e.at), 1),
2609
+ y(" · " + p(e.where), 1)
2504
2610
  ]),
2505
- s("pre", Ci, p(e.text), 1)
2611
+ s("pre", Gi, p(e.text), 1)
2506
2612
  ]))), 128))
2507
2613
  ]),
2508
- A.value.length === 0 ? (r(), c("p", Ei, "这一轮没有报错。")) : y("", !0)
2614
+ M.value.length === 0 ? (c(), d("p", Wi, "这一轮没有报错。")) : k("", !0)
2509
2615
  ]),
2510
- s("footer", Ti, [
2616
+ s("footer", Yi, [
2511
2617
  s("button", {
2512
2618
  class: "p-button p-button-sm p-button-outlined",
2513
2619
  type: "button",
2514
- onClick: t[35] || (t[35] = (e) => An())
2620
+ onClick: t[38] || (t[38] = (e) => Hn())
2515
2621
  }, "复制全部"),
2516
2622
  s("button", {
2517
2623
  class: "p-button p-button-sm p-button-text",
2518
2624
  type: "button",
2519
- onClick: t[36] || (t[36] = (e) => ae())
2625
+ onClick: t[39] || (t[39] = (e) => de())
2520
2626
  }, "清空报错"),
2521
2627
  s("button", {
2522
2628
  class: "p-button p-button-sm",
2523
2629
  type: "button",
2524
- onClick: t[37] || (t[37] = (e) => K.value = !1)
2630
+ onClick: t[40] || (t[40] = (e) => F.value = !1)
2525
2631
  }, "知道了")
2526
2632
  ])
2527
2633
  ])
2528
- ])) : y("", !0),
2529
- b.value ? (r(), c("button", {
2634
+ ])) : k("", !0),
2635
+ b.value ? (c(), d("button", {
2530
2636
  key: 3,
2531
2637
  class: "mbc__close",
2532
2638
  type: "button",
2533
2639
  title: "关掉 magic block 控制台(Esc)",
2534
- onClick: t[39] || (t[39] = (e) => b.value = !1)
2535
- }, "×")) : y("", !0)
2536
- ], 2)) : y("", !0);
2640
+ onClick: t[42] || (t[42] = (e) => b.value = !1)
2641
+ }, "×")) : k("", !0)
2642
+ ], 2)) : k("", !0);
2537
2643
  }
2538
- }), ji = /* @__PURE__ */ sn(Ai, [["__scopeId", "data-v-4ab98f5e"]]);
2644
+ }), ou = /* @__PURE__ */ bn(Qi, [["__scopeId", "data-v-8e10f9f2"]]);
2539
2645
  export {
2540
- Jn as API_BASE,
2541
- fs as BLOCK_BACKEND_FILE,
2542
- Nt as BLOCK_ENTRY,
2543
- de as BLOCK_MANIFEST,
2544
- Zn as CLIENT_SOURCE,
2545
- pe as MANIFEST_KEYS,
2546
- Ke as MANIFEST_REQUIRED,
2547
- ji as MagicBlockConsole,
2548
- Vs as MagicBlockPage,
2549
- Ee as NAME_MAX,
2550
- $s as buildPreview,
2551
- ms as checkSelection,
2552
- Ws as declaredMissing,
2553
- Js as declaredUuidOf,
2554
- Gs as declaredUuidsOf,
2555
- ts as installBridge,
2556
- Cs as loadBlockRender,
2557
- ws as onBlockRenderRefresh,
2558
- ds as parseManifest,
2559
- xs as refreshBlockRender,
2560
- ps as validFileName,
2561
- ls as validName,
2562
- bs as validateBlock
2646
+ cs as API_BASE,
2647
+ Rs as BLOCK_BACKEND_FILE,
2648
+ Ut as BLOCK_ENTRY,
2649
+ _e as BLOCK_MANIFEST,
2650
+ ms as CLIENT_SOURCE,
2651
+ ge as MANIFEST_KEYS,
2652
+ Qe as MANIFEST_REQUIRED,
2653
+ ou as MagicBlockConsole,
2654
+ ro as MagicBlockPage,
2655
+ Oe as NAME_MAX,
2656
+ Ns as buildPreview,
2657
+ As as checkSelection,
2658
+ bo as declaredMissing,
2659
+ co as declaredUuidOf,
2660
+ po as declaredUuidsOf,
2661
+ hs as installBridge,
2662
+ zs as loadBlockRender,
2663
+ Fs as onBlockRenderRefresh,
2664
+ Ts as parseManifest,
2665
+ Us as refreshBlockRender,
2666
+ Bs as validFileName,
2667
+ ws as validName,
2668
+ Ms as validateBlock
2563
2669
  };