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