labull-framework 0.1.19 → 0.1.21

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