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