@linkdesk/plugin-sdk 0.1.3 → 0.1.7

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.
@@ -0,0 +1,544 @@
1
+ /**
2
+ * `linkdesk-plugin-sdk publish`——E6#26d CLI 主路(自动发布链路底座 = E6#26b)。
3
+ *
4
+ * 作者在自己插件工程根跑 `npm run publish`(= linkdesk-plugin-sdk publish):
5
+ * 1. 读 plugin.json(复用 validate.ts 面)→ 插件 <id> v<version>;找 build 已产的分发件
6
+ * `<root>/<id>.linkdesk-plugin`(缺 → 提示先 `npm run build`)。
7
+ * 2. 目标仓库 = 工程 git remote origin(多市场源模型 01 §六——作者发布到**自己**的 GitHub 仓库,
8
+ * 别人把该仓库加为市场源即发现)。仅支持 github.com。
9
+ * 3. 自动发布链路(GitHub REST,github-http.ts):
10
+ * a. 校验仓库可达 + 取 default_branch(顺带验证 PAT)
11
+ * b. Release tag 已存在 → 拦(先 bump plugin.json version 再发)
12
+ * c. 创建 Release v<version> → 上传 <id>.linkdesk-plugin asset
13
+ * d. 更新仓库根 marketplace.json(Contents API:读 sha → 合并条目 → PUT)——
14
+ * 格式 = marketplace.json 规范 §三 + §3.2(versions[] 版本历史最新在前);更新消费者
15
+ * electron/ipc/handlers/plugin-install-handlers.ts:198 读 plugins[].versions[] 做版本对比。
16
+ * 条目里的**两个「未装态」展示字段**(E6#91c 接通,作者零声明、publish 自动写):
17
+ * · `readmeUrl` ← 工程根有 `README.md` 时填 raw.githubusercontent.com/{owner}/{repo}/{tag}/README.md
18
+ * · `versions[0].changelog` ← 工程根 `CHANGELOG.md` 切出「版本号 === manifest.version」那一段正文
19
+ * **两者缺省即不写键**(无 README / 无 CHANGELOG / 切不到该版本)——写了 404、写空串都是骗人。
20
+ * 4. 发前预览确认(#26b「发布前预览+确认」):打印 id/name/version/author/文件大小/目标仓库/tag
21
+ * → [y/N];`--yes` 跳过(CI);`--dry-run` 只打印将做动作不碰网络。
22
+ *
23
+ * PAT(#26c 链路的 CLI 半侧):env `LINKDESK_GITHUB_TOKEN` > 用户配置档
24
+ * `{configDir}/linkdesk-sdk/config.json`(首跑掩码提示输入存一次,0600)。
25
+ * #26a UI 备路 + #26c 的 app.* 配置存储 = 市场插件轮(L3)——UI 发 GitHub 需壳主进程 handler,
26
+ * 本 CLI 是无壳作者终端主路(00-第三方作者旅程 §五)。
27
+ *
28
+ * 失败都 throw 中文可读错误 → bin.ts catch 打印;退出码由 bin 定。
29
+ */
30
+ import { execFileSync } from "node:child_process";
31
+ import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
32
+ import { homedir } from "node:os";
33
+ import { basename, join, resolve } from "node:path";
34
+ import { createInterface } from "node:readline";
35
+ import { derivePluginId, readPluginManifest } from "./validate.js";
36
+ import { ghErrorDetail, ghHttp } from "./github-http.js";
37
+ /* ── token 链路(CLI 半侧)────────────────────────────────────────────── */
38
+ function sdkConfigDir() {
39
+ const home = homedir();
40
+ const base = process.env.APPDATA && process.platform === "win32"
41
+ ? process.env.APPDATA
42
+ : process.env.XDG_CONFIG_HOME && process.platform !== "darwin"
43
+ ? process.env.XDG_CONFIG_HOME
44
+ : process.platform === "darwin"
45
+ ? join(home, "Library", "Application Support")
46
+ : join(home, ".config");
47
+ return join(base, "linkdesk-sdk");
48
+ }
49
+ function tokenFilePath() {
50
+ return join(sdkConfigDir(), "config.json");
51
+ }
52
+ /** 读已存 token(env 覆盖优先——CI/临时注入;文件 = 作者机器持久) */
53
+ function readStoredToken() {
54
+ const env = process.env.LINKDESK_GITHUB_TOKEN;
55
+ if (env && env.trim())
56
+ return env.trim();
57
+ try {
58
+ const raw = readFileSync(tokenFilePath(), "utf8");
59
+ const cfg = JSON.parse(raw);
60
+ if (typeof cfg.githubToken === "string" && cfg.githubToken.trim())
61
+ return cfg.githubToken.trim();
62
+ }
63
+ catch {
64
+ // 文件不存在 / 坏 JSON → 视为无 token
65
+ }
66
+ return "";
67
+ }
68
+ function writeStoredToken(token) {
69
+ const dir = sdkConfigDir();
70
+ mkdirSync(dir, { recursive: true });
71
+ writeFileSync(tokenFilePath(), `${JSON.stringify({ githubToken: token }, null, 2)}\n`, {
72
+ encoding: "utf8",
73
+ mode: 0o600, // POSIX 生效;Windows 忽略(ACL 由用户账户隔离)
74
+ });
75
+ }
76
+ /** 掩码输入——stdin raw 模式逐键收,输出 '*' 不回显原文。回车/EOF 结束;Ctrl+C 取消。 */
77
+ function promptMasked(prompt) {
78
+ return new Promise((resolveP, rejectP) => {
79
+ const stdin = process.stdin;
80
+ if (!stdin.isTTY) {
81
+ rejectP(new Error("当前非交互终端,无法安全输入 token——请设环境变量 LINKDESK_GITHUB_TOKEN"));
82
+ return;
83
+ }
84
+ process.stdout.write(prompt);
85
+ let acc = "";
86
+ let done = false;
87
+ const finish = () => {
88
+ if (done)
89
+ return;
90
+ done = true;
91
+ try {
92
+ stdin.setRawMode(false);
93
+ }
94
+ catch {
95
+ // raw 模式还原失败不阻断
96
+ }
97
+ stdin.pause();
98
+ stdin.off("data", onData);
99
+ process.stdout.write("\n");
100
+ };
101
+ const onData = (buf) => {
102
+ for (const code of buf) {
103
+ if (code === 3 || code === 4) {
104
+ // Ctrl+C / Ctrl+D → 取消
105
+ finish();
106
+ rejectP(new Error("已取消"));
107
+ return;
108
+ }
109
+ if (code === 13 || code === 10) {
110
+ finish();
111
+ resolveP(acc);
112
+ return;
113
+ }
114
+ if (code === 8 || code === 127) {
115
+ if (acc.length > 0) {
116
+ acc = acc.slice(0, -1);
117
+ process.stdout.write("\b \b");
118
+ }
119
+ continue;
120
+ }
121
+ acc += String.fromCharCode(code);
122
+ process.stdout.write("*");
123
+ }
124
+ };
125
+ stdin.setRawMode(true);
126
+ stdin.resume();
127
+ stdin.on("data", onData);
128
+ });
129
+ }
130
+ /** 取 token:env > 文件 > (TTY 首跑)掩码提示并持久化;非 TTY 无 token → throw */
131
+ async function acquireToken() {
132
+ const env = process.env.LINKDESK_GITHUB_TOKEN;
133
+ if (env && env.trim())
134
+ return env.trim();
135
+ const stored = readStoredToken();
136
+ if (stored)
137
+ return stored;
138
+ const isTty = Boolean(process.stdin.isTTY);
139
+ if (!isTty) {
140
+ throw new Error("未找到 GitHub token:请设环境变量 LINKDESK_GITHUB_TOKEN,或先在有交互终端跑一次 publish 让它记住(存到用户配置档)。");
141
+ }
142
+ const token = await promptMasked("GitHub Personal Access Token(首次发布,需 repo 权限;仅本次输入、存入本机配置,不输出):");
143
+ if (!token.trim())
144
+ throw new Error("未输入 token,已取消");
145
+ writeStoredToken(token.trim());
146
+ console.log(" ✓ token 已存入本机配置(后续发布自动复用;env LINKDESK_GITHUB_TOKEN 可随时覆盖)");
147
+ return token.trim();
148
+ }
149
+ /* ── 纯逻辑:仓库解析 / 条目映射 / catalog 合并(可单测,无 I/O)────────── */
150
+ /** 解析 git remote origin → owner/repo。支持 https:// / git:// / ssh://git@ / git@github.com:o/r(.git) */
151
+ export function parseGitHubRemote(raw) {
152
+ const s = raw.trim();
153
+ const m = /^(?:https?:\/\/|git:\/\/|ssh:\/\/)?(?:git@)?github\.com[:/]([A-Za-z0-9._-]+)\/([A-Za-z0-9._-]+?)(?:\.git)?\/?$/.exec(s);
154
+ if (!m)
155
+ return null;
156
+ const owner = m[1];
157
+ const repo = m[2];
158
+ if (!owner || !repo)
159
+ return null;
160
+ return { owner, repo };
161
+ }
162
+ /** 当前工程 git origin URL——非 git 工程 / 无 origin → throw(发布前提 = 插件工程已推到 GitHub) */
163
+ export function gitRemoteOrigin(root) {
164
+ try {
165
+ const out = execFileSync("git", ["remote", "get-url", "origin"], { cwd: root, encoding: "utf8" });
166
+ const url = out.trim();
167
+ if (!url)
168
+ throw new Error("empty");
169
+ return url;
170
+ }
171
+ catch {
172
+ throw new Error("发布需要插件工程是一个已推到 GitHub 的 git 仓库(发布目标 = 工程 origin 的 Releases + marketplace.json,多市场源模型)。请先:git init → git remote add origin git@github.com:<你>/<仓库>.git → git push -u origin main,再跑 publish。");
173
+ }
174
+ }
175
+ export function collectManifestView(manifest, sourceDirName) {
176
+ const id = derivePluginId(manifest, sourceDirName);
177
+ const m = (manifest ?? {});
178
+ const str = (v) => (typeof v === "string" && v.trim() ? v.trim() : undefined);
179
+ const name = str(m.name) ?? id;
180
+ const version = str(m.version);
181
+ if (!version)
182
+ throw new Error(`plugin.json 缺 version——publish 以插件版本为 Release tag(v<version>),请先声明 version`);
183
+ return {
184
+ id,
185
+ name,
186
+ version,
187
+ description: str(m.description),
188
+ author: str(m.author),
189
+ icon: str(m.icon),
190
+ iconSource: str(m.iconSource),
191
+ };
192
+ }
193
+ /** 单条 catalog 条目构造——versions[] 只有当前一版(合并时与既有历史拼接)。author 缺失时回落 owner。 */
194
+ export function buildCatalogEntry(v, downloadUrl, size, owner, publishedAt, extras = {}) {
195
+ return {
196
+ id: v.id,
197
+ name: v.name,
198
+ version: v.version,
199
+ ...(v.description !== undefined ? { description: v.description } : {}),
200
+ author: { name: v.author ?? owner },
201
+ ...(v.icon !== undefined ? { icon: v.icon } : {}),
202
+ ...(v.iconSource !== undefined ? { iconSource: v.iconSource } : {}),
203
+ ...(extras.readmeUrl !== undefined ? { readmeUrl: extras.readmeUrl } : {}),
204
+ downloadUrl,
205
+ size,
206
+ publishedAt,
207
+ versions: [
208
+ {
209
+ version: v.version,
210
+ downloadUrl,
211
+ publishedAt,
212
+ ...(extras.changelog !== undefined ? { changelog: extras.changelog } : {}),
213
+ },
214
+ ],
215
+ };
216
+ }
217
+ /** 建空 catalog(首发的插件仓库无 marketplace.json) */
218
+ export function createEmptyCatalog() {
219
+ return { version: "1", plugins: [] };
220
+ }
221
+ /**
222
+ * 合并(纯函数):把新 entry 合进既有 catalog——同 id 更新(顶层 = 最新 + 历史拼接去重),
223
+ * 异 id 追加;其余插件条目原样保留。返回新对象,不改入参。
224
+ */
225
+ export function upsertCatalogEntry(catalog, entry) {
226
+ const now = entry.publishedAt ?? new Date().toISOString();
227
+ const next = catalog.plugins.map((p) => ({ ...p, versions: [...p.versions] }));
228
+ const idx = next.findIndex((p) => p.id === entry.id);
229
+ if (idx < 0) {
230
+ next.push(entry);
231
+ }
232
+ else {
233
+ const existing = next[idx];
234
+ const history = [
235
+ entry.versions[0],
236
+ ...existing.versions.filter((v) => v.version !== entry.version), // 同版本重发 = 顶掉旧行
237
+ ];
238
+ const merged = {
239
+ ...entry,
240
+ versions: history,
241
+ // 保历史字段:新 manifest 没填的(icon/description 等)回落到旧值,避免发布抖动丢展示数据
242
+ icon: entry.icon ?? existing.icon,
243
+ iconSource: entry.iconSource ?? existing.iconSource,
244
+ description: entry.description ?? existing.description,
245
+ category: entry.category ?? existing.category,
246
+ minAppVersion: entry.minAppVersion ?? existing.minAppVersion,
247
+ };
248
+ next[idx] = merged;
249
+ }
250
+ return { version: catalog.version ?? "1", updatedAt: now, plugins: next };
251
+ }
252
+ /** release tag = v{version} */
253
+ export function releaseTagForVersion(version) {
254
+ return `v${version}`;
255
+ }
256
+ /** asset 名 = <id>.linkdesk-plugin(对齐 build 分发件命名) */
257
+ export function assetNameForId(id) {
258
+ return `${id}.linkdesk-plugin`;
259
+ }
260
+ /** Release asset 直链——GitHub 固定形态,无需等上传响应回读 */
261
+ export function releaseDownloadUrl(remote, tag, assetName) {
262
+ return `https://github.com/${remote.owner}/${remote.repo}/releases/download/${tag}/${assetName}`;
263
+ }
264
+ /** 未装插件读 README 的远端直链(E6#91c)——**用 tag 不用 default_branch**:这条 URL 与打进 zip 的
265
+ * 那份 README 同源(同一 commit);用 main 会让「未装浏览者看到的」与「装上后看到的」是两份内容。 */
266
+ export function readmeRawUrl(remote, tag) {
267
+ return `https://raw.githubusercontent.com/${remote.owner}/${remote.repo}/${tag}/README.md`;
268
+ }
269
+ /** 去版本号前导 `v`——段标题与 plugin.json 两侧同规则,免「v1.0.0 vs 1.0.0」假不等 */
270
+ function stripLeadingV(s) {
271
+ return /^[vV]/.test(s) ? s.slice(1) : s;
272
+ }
273
+ /** 段标题——`## v1.0.0` / `## 1.0.0` / `## [1.0.0] - 2026-09-11`(Keep a Changelog)/ `## v1.0.0-beta.1` 全认。
274
+ * ① `#{2,4}`:`##` 常规,容忍 `###`/`####`;**一级 `#` 不算**(那是文档标题「# 更新日志」)。
275
+ * ② `\[?…\]?`:容忍一对可选方括号——Keep a Changelog 是最流行的约定,作者不该为适配解析器改习惯。
276
+ * ③ 版本段整段捕获(含 prerelease/build 后缀)——只捕 `\d+.\d+.\d+` 会把 `1.0.0-beta.1` 截成 `1.0.0`,与真有的 `1.0.0` 段撞号。
277
+ * ④ 尾部否定前瞻 `(?![0-9A-Za-z.-])`:防 `1.0.0` 吃掉 `1.0.01` 的前缀。中文全角括号天然通过(不在否定类里)。 */
278
+ const CHANGELOG_HEADING = /^#{2,4}\s+\[?[vV]?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)\]?(?![0-9A-Za-z.-])/;
279
+ /** 围栏代码块起止行(``` / ~~~,允许缩进)。块内的 `## v1.0.0` 是示例文本不是段标题——误判会把它当更新说明 */
280
+ const FENCE_LINE = /^\s*(?:```|~~~)/;
281
+ /**
282
+ * 从 `CHANGELOG.md` 原文切出指定版本的正文(E6#91c)。**纯函数、零 IO**——publish 内可直测。
283
+ *
284
+ * 返回**该版本段标题之下、下一个段标题之前**的正文(`trim` 后);**切不到 / 正文为空 → `undefined`**
285
+ * (诚实留空,不猜——渲染层已有「此版本未提供变更说明」兜底)。**绝不回落到「取第一段」**:那会把上一版
286
+ * 的说明挂到新版本上,是**发错信息**(同 marketCatalog/select.ts「不发错包」的既有纪律)。
287
+ *
288
+ * 版本相等判据 = 去 `v` 后**字符串严格相等**,不做 semver 松弛匹配(`1.0.0` ≠ `1.0`)——目录条目版本号与
289
+ * `plugin.json.version` 本就该逐字相同,松弛只会掩盖作者写错。
290
+ */
291
+ export function sliceChangelogSection(text, version) {
292
+ const src = text.replace(/^\uFEFF/, ""); // BOM 剥离——记事本存过就带,不剥会让首行匹配位移
293
+ const lines = src.split(/\r?\n/); // CRLF 兼容(本仓 Windows 开发,多份文档实测 CRLF)
294
+ const target = stripLeadingV(version);
295
+ let inFence = false;
296
+ let start = -1; // 正文起始行(段标题的下一行)
297
+ let end = lines.length;
298
+ for (let i = 0; i < lines.length; i++) {
299
+ const line = lines[i] ?? "";
300
+ if (FENCE_LINE.test(line)) {
301
+ inFence = !inFence; // 开/闭同一判定——只关心奇偶
302
+ continue;
303
+ }
304
+ if (inFence)
305
+ continue; // 围栏块内一律不看
306
+ const m = CHANGELOG_HEADING.exec(line);
307
+ if (!m)
308
+ continue;
309
+ if (start < 0) {
310
+ // 取第一个匹配段(同版本出现多次 = 取最新那段,「最新在最上」是格式约定)
311
+ if (stripLeadingV(m[1] ?? "") === target)
312
+ start = i + 1;
313
+ }
314
+ else {
315
+ end = i; // 正文到下一个段标题为止
316
+ break;
317
+ }
318
+ }
319
+ if (start < 0)
320
+ return undefined;
321
+ const body = lines.slice(start, end).join("\n").trim();
322
+ return body === "" ? undefined : body;
323
+ }
324
+ async function apiGetRepo(token, remote) {
325
+ const res = await ghHttp({ token, api: "api", path: `/repos/${remote.owner}/${remote.repo}` });
326
+ if (!res.ok) {
327
+ if (res.status === 401)
328
+ throw new Error("GitHub token 无效或无权访问——请检查 PAT(需 repo 权限)");
329
+ if (res.status === 404)
330
+ throw new Error(`仓库 ${remote.owner}/${remote.repo} 不存在或当前 token 不可见——确认已 push 到 GitHub 且仓库为 public 或 token 有权限`);
331
+ throw new Error(`读取仓库信息失败(${res.status}):${ghErrorDetail(res)}`);
332
+ }
333
+ const json = res.json;
334
+ return { defaultBranch: typeof json?.default_branch === "string" ? json.default_branch : "main" };
335
+ }
336
+ /** 查 Release 是否已存在(GET releases/tags/{tag};404 = 没有) */
337
+ async function apiReleaseExists(token, remote, tag) {
338
+ const res = await ghHttp({ token, api: "api", path: `/repos/${remote.owner}/${remote.repo}/releases/tags/${encodeURIComponent(tag)}` });
339
+ return res.ok;
340
+ }
341
+ /** 建 Release → 返回 release id */
342
+ async function apiCreateRelease(token, remote, tag, name, body, prerelease) {
343
+ const res = await ghHttp({
344
+ token,
345
+ api: "api",
346
+ method: "POST",
347
+ path: `/repos/${remote.owner}/${remote.repo}/releases`,
348
+ body: JSON.stringify({ tag_name: tag, name, body, draft: false, prerelease }),
349
+ });
350
+ if (!res.ok) {
351
+ if (res.status === 422)
352
+ throw new Error(`创建 Release v${tag} 被拒(422)——tag 可能已被占用:${ghErrorDetail(res)}`);
353
+ throw new Error(`创建 Release 失败(${res.status}):${ghErrorDetail(res)}`);
354
+ }
355
+ const json = res.json;
356
+ const id = json?.id;
357
+ if (typeof id !== "number")
358
+ throw new Error(`创建 Release 响应缺 id:${res.text.slice(0, 200)}`);
359
+ return id;
360
+ }
361
+ /** 上传 asset(直链走固定形态 releaseDownloadUrl,无需读响应) */
362
+ async function apiUploadAsset(token, remote, releaseId, assetName, data) {
363
+ const res = await ghHttp({
364
+ token,
365
+ api: "uploads",
366
+ method: "POST",
367
+ path: `/repos/${remote.owner}/${remote.repo}/releases/${releaseId}/assets`,
368
+ query: `name=${encodeURIComponent(assetName)}`,
369
+ headers: { "Content-Type": "application/zip" },
370
+ body: data,
371
+ });
372
+ if (!res.ok) {
373
+ throw new Error(`上传 ${assetName} 失败(${res.status}):${ghErrorDetail(res)}`);
374
+ }
375
+ }
376
+ /** Contents 读:取 marketplace.json 的 sha + 解码内容;404 → null(首次发布无目录文件) */
377
+ async function apiReadCatalog(token, remote) {
378
+ const res = await ghHttp({
379
+ token,
380
+ api: "api",
381
+ path: `/repos/${remote.owner}/${remote.repo}/contents/marketplace.json`,
382
+ headers: { Accept: "application/vnd.github+json" },
383
+ });
384
+ if (res.status === 404)
385
+ return null;
386
+ if (!res.ok)
387
+ throw new Error(`读取 marketplace.json 失败(${res.status}):${ghErrorDetail(res)}`);
388
+ const json = res.json;
389
+ const sha = json?.sha;
390
+ const content = json?.content;
391
+ if (typeof sha !== "string" || typeof content !== "string") {
392
+ throw new Error(`marketplace.json 响应异常(缺 sha/content):${res.text.slice(0, 200)}`);
393
+ }
394
+ const decoded = Buffer.from(content.replace(/\n/g, ""), "base64").toString("utf8");
395
+ let catalog;
396
+ try {
397
+ const parsed = JSON.parse(decoded);
398
+ if (!parsed || !Array.isArray(parsed.plugins))
399
+ throw new Error("plugins 数组缺失");
400
+ catalog = parsed;
401
+ }
402
+ catch (e) {
403
+ throw new Error(`现有 marketplace.json 解析失败(可能被手改坏):${e instanceof Error ? e.message : String(e)}`);
404
+ }
405
+ return { sha, catalog };
406
+ }
407
+ /** Contents 写:PUT base64 内容(带 sha 覆盖 / 无 sha 新建)。走仓库默认分支。 */
408
+ async function apiWriteCatalog(token, remote, id, sha, catalog) {
409
+ const content = `${JSON.stringify(catalog, null, 2)}\n`;
410
+ const body = {
411
+ message: `publish ${id} (marketplace.json)`,
412
+ content: Buffer.from(content, "utf8").toString("base64"),
413
+ };
414
+ if (sha)
415
+ body.sha = sha;
416
+ const res = await ghHttp({
417
+ token,
418
+ api: "api",
419
+ method: "PUT",
420
+ path: `/repos/${remote.owner}/${remote.repo}/contents/marketplace.json`,
421
+ body: JSON.stringify(body),
422
+ });
423
+ if (!res.ok) {
424
+ if (res.status === 409)
425
+ throw new Error("marketplace.json 写冲突(409)——远端刚被改动,重跑一次 publish 即可");
426
+ throw new Error(`更新 marketplace.json 失败(${res.status}):${ghErrorDetail(res)}`);
427
+ }
428
+ }
429
+ function collectPreview(root) {
430
+ const pluginJsonPath = join(root, "plugin.json");
431
+ if (!existsSync(pluginJsonPath)) {
432
+ throw new Error(`当前目录不是插件工程——找不到 ${pluginJsonPath}。请 cd 进插件项目根再跑 linkdesk-plugin-sdk publish`);
433
+ }
434
+ const manifest = readPluginManifest(pluginJsonPath);
435
+ const view = collectManifestView(manifest, basename(resolve(root)));
436
+ const assetName = assetNameForId(view.id);
437
+ const assetPath = join(root, assetName);
438
+ if (!existsSync(assetPath)) {
439
+ throw new Error(`找不到分发件 ${assetName}——先跑 npm run build(= linkdesk-plugin-sdk build)产出 .linkdesk-plugin 再发布`);
440
+ }
441
+ const remoteUrl = gitRemoteOrigin(root);
442
+ const remote = parseGitHubRemote(remoteUrl);
443
+ if (!remote) {
444
+ throw new Error(`origin 不是 github.com 仓库(当前:${remoteUrl})。发布目标 = 工程 origin 的 GitHub Releases + marketplace.json,多市场源模型仅支持 github.com`);
445
+ }
446
+ const tag = releaseTagForVersion(view.version);
447
+ // 未装态两个展示字段——**本层 3.7.2 接通的两处写入方**(此前读取方早已写好、只差这两行):
448
+ // `readmeUrl` = 未装详情页 README 远端源;`changelog` = 未装「更改日志」页签的逐版正文。
449
+ // 两者都**缺省即不写**——不写是本函数要表达的诚实(写了 404 / 写空串都是骗人)。
450
+ const changelogPath = join(root, "CHANGELOG.md");
451
+ return {
452
+ id: view.id,
453
+ name: view.name,
454
+ version: view.version,
455
+ view,
456
+ assetName,
457
+ assetPath,
458
+ sizeBytes: statSync(assetPath).size,
459
+ remote,
460
+ tag,
461
+ releaseName: `${view.name} v${view.version}`,
462
+ prerelease: view.version.includes("-"),
463
+ ...(existsSync(join(root, "README.md")) ? { readmeUrl: readmeRawUrl(remote, tag) } : {}),
464
+ ...(existsSync(changelogPath) ? { changelog: sliceChangelogSection(readFileSync(changelogPath, "utf8"), view.version) } : {}),
465
+ };
466
+ }
467
+ function renderPreview(p) {
468
+ const lines = [
469
+ "",
470
+ " ┌─ 发布预览 ──────────────────────────────",
471
+ ` │ 插件 : ${p.name} v${p.version}${p.prerelease ? "(prerelease)" : ""} (${p.id})`,
472
+ ` │ 作者 : ${p.view.author ?? p.remote.owner}`,
473
+ ` │ 分发件 : ${p.assetName}(${(p.sizeBytes / 1024).toFixed(1)} KB)`,
474
+ ` │ 目标仓库 : github.com/${p.remote.owner}/${p.remote.repo}(来自 git origin)`,
475
+ ` │ 发布号 : ${p.tag}`,
476
+ ` │ 未装展示 : README ${p.readmeUrl ? "✓ 已随条目(远端直链)" : "✗ 工程根无 README.md → 不写 readmeUrl"}`,
477
+ ` │ 日志 ${p.changelog ? `✓ 已切出 v${p.version} 正文(${p.changelog.split("\n").length} 行)` : `✗ 工程根 CHANGELOG.md 无 v${p.version} 段 → 不写 changelog`}`,
478
+ " │ 将做 : 创建 GitHub Release → 上传 asset → 更新该仓库根 marketplace.json",
479
+ " └─────────────────────────────────────────",
480
+ ];
481
+ return lines.join("\n");
482
+ }
483
+ /** 确认:--yes 跳过;非 TTY 无 --yes → throw(防静默发布) */
484
+ async function confirmPublish(yes) {
485
+ if (yes)
486
+ return;
487
+ const isTty = Boolean(process.stdin.isTTY && process.stdout.isTTY);
488
+ if (!isTty)
489
+ throw new Error("非交互终端发布需加 --yes 确认(或先 --dry-run 预览)");
490
+ process.stdout.write(" 发布以上内容到 GitHub?[y/N] ");
491
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
492
+ const answer = await new Promise((res) => rl.question("", (a) => res(a.trim().toLowerCase())));
493
+ rl.close();
494
+ if (answer !== "y" && answer !== "yes")
495
+ throw new Error("已取消");
496
+ }
497
+ /**
498
+ * 跑发布。返回退出码(0 成功 / 1 失败)。所有失败 throw;bin catch 打印统一前缀。
499
+ */
500
+ export async function runPluginPublish(root, opts = {}) {
501
+ const preview = collectPreview(root);
502
+ process.stdout.write(renderPreview(preview) + "\n");
503
+ if (opts.dryRun) {
504
+ console.log(" --dry-run:以上为将执行的动作,未调用 GitHub(无网络/token 触碰)。");
505
+ return 0;
506
+ }
507
+ await confirmPublish(opts.yes);
508
+ const token = await acquireToken();
509
+ const { remote, tag, assetName, assetPath, version, id } = preview;
510
+ console.log("");
511
+ console.log(` publishing ${id} v${version} → github.com/${remote.owner}/${remote.repo} …`);
512
+ // 1. 校验仓库 + 取 default_branch(顺带验证 token)
513
+ await apiGetRepo(token, remote);
514
+ console.log(" ✓ 仓库可达、token 有效");
515
+ // 2. 防重发
516
+ if (await apiReleaseExists(token, remote, tag)) {
517
+ throw new Error(`Release ${tag} 已存在——该版本已发布过。要发新版本请先 bump plugin.json 的 version 再 build + publish`);
518
+ }
519
+ // 3. 建 Release + 传 asset
520
+ const body = preview.prerelease ? `${preview.releaseName}(prerelease,更新机制默认忽略非正式版)` : preview.releaseName;
521
+ const releaseId = await apiCreateRelease(token, remote, tag, preview.releaseName, body, preview.prerelease);
522
+ console.log(` ✓ Release ${tag} 已创建`);
523
+ const data = readFileSync(assetPath);
524
+ await apiUploadAsset(token, remote, releaseId, assetName, data);
525
+ const url = releaseDownloadUrl(remote, tag, assetName);
526
+ console.log(` ✓ asset ${assetName} 已上传`);
527
+ // 4. 更新 marketplace.json(含新条目 / 既有条目版本历史拼接——描述/图标等回落旧值见 upsertCatalogEntry)
528
+ const read = await apiReadCatalog(token, remote);
529
+ const existing = read ? read.catalog : createEmptyCatalog();
530
+ const entry = buildCatalogEntry(preview.view, url, preview.sizeBytes, remote.owner, new Date().toISOString(), {
531
+ readmeUrl: preview.readmeUrl,
532
+ changelog: preview.changelog,
533
+ });
534
+ const merged = upsertCatalogEntry(existing, entry);
535
+ await apiWriteCatalog(token, remote, id, read?.sha ?? null, merged);
536
+ console.log("");
537
+ console.log(` 🚀 发布成功:${id} v${version}`);
538
+ console.log(` Release : https://github.com/${remote.owner}/${remote.repo}/releases/tag/${tag}`);
539
+ console.log(` 下载直链 : ${url}`);
540
+ console.log(` marketplace.json 已更新(${merged.plugins.length} 个插件条目)`);
541
+ console.log(" 要让别人看到:对方在 LinkDesk 市场「添加市场源」填本仓库 URL 即见;想所有用户默认可见 → 申请收录官方目录。");
542
+ return 0;
543
+ }
544
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../src/publish.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAmDzD,uEAAuE;AAEvE,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QACjD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;QACrB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC5D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe;YAC7B,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;gBAC7B,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,CAAC;gBAC9C,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,+CAA+C;AAC/C,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8B,CAAC;QACzD,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE;YAAE,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACnG,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACrF,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK,EAAE,mCAAmC;KACjD,CAAC,CAAC;AACL,CAAC;AAED,8DAA8D;AAC9D,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,IAAI,CAAC;gBACH,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;YACD,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,GAAW,EAAQ,EAAE;YACnC,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;gBACvB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBAC7B,uBAAuB;oBACvB,MAAM,EAAE,CAAC;oBACT,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;oBAC/B,MAAM,EAAE,CAAC;oBACT,QAAQ,CAAC,GAAG,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBAC/B,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACnB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;wBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gEAAgE;AAChE,KAAK,UAAU,YAAY;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC9C,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,gEAAgE,CAAC,CAAC;IACnG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACpD,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,0DAA0D;AAE1D,qGAAqG;AACrG,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACrB,MAAM,CAAC,GACL,gHAAgH,CAAC,IAAI,CACnH,CAAC,CACF,CAAC;IACJ,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAClG,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,6LAA6L,CAC9L,CAAC;IACJ,CAAC;AACH,CAAC;AAaD,MAAM,UAAU,mBAAmB,CAAC,QAAiB,EAAE,aAAqB;IAC1E,MAAM,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;IACtD,MAAM,GAAG,GAAG,CAAC,CAAU,EAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3G,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;IAC5G,OAAO;QACL,EAAE;QACF,IAAI;QACJ,OAAO;QACP,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACrB,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACjB,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;KAC9B,CAAC;AACJ,CAAC;AAUD,yEAAyE;AACzE,MAAM,UAAU,iBAAiB,CAC/B,CAAe,EACf,WAAmB,EACnB,IAAY,EACZ,KAAa,EACb,WAAmB,EACnB,SAA6B,EAAE;IAE/B,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,GAAG,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,EAAE;QACnC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,WAAW;QACX,IAAI;QACJ,WAAW;QACX,QAAQ,EAAE;YACR;gBACE,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,WAAW;gBACX,WAAW;gBACX,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E;SACF;KACF,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA2B,EAAE,KAAyB;IACvF,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAyB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG;YACd,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,eAAe;SACjF,CAAC;QACF,MAAM,MAAM,GAAuB;YACjC,GAAG,KAAK;YACR,QAAQ,EAAE,OAAO;YACjB,4DAA4D;YAC5D,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;YACjC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU;YACnD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;YACtD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ;YAC7C,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa;SAC7D,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC5E,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,GAAG,EAAE,kBAAkB,CAAC;AACjC,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,kBAAkB,CAAC,MAAoB,EAAE,GAAW,EAAE,SAAiB;IACrF,OAAO,sBAAsB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,sBAAsB,GAAG,IAAI,SAAS,EAAE,CAAC;AACnG,CAAC;AAED;iEACiE;AACjE,MAAM,UAAU,YAAY,CAAC,MAAoB,EAAE,GAAW;IAC5D,OAAO,qCAAqC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,YAAY,CAAC;AAC7F,CAAC;AAED,+DAA+D;AAC/D,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;iFAIiF;AACjF,MAAM,iBAAiB,GAAG,8EAA8E,CAAC;AAEzG,sEAAsE;AACtE,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAErC;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAe;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,6BAA6B;IACtE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC;IACvE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;IACjC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,iBAAiB;YACrC,SAAS;QACX,CAAC;QACD,IAAI,OAAO;YAAE,SAAS,CAAC,WAAW;QAElC,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,wCAAwC;YACxC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM;gBAAE,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc;YACvB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAQD,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,MAAoB;IAC3D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/F,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACpF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,MAAM,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,8DAA8D,CAAC,CAAC;QACzI,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2C,CAAC;IAC7D,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACpG,CAAC;AAED,wDAAwD;AACxD,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAAoB,EAAE,GAAW;IAC9E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,kBAAkB,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACxI,OAAO,GAAG,CAAC,EAAE,CAAC;AAChB,CAAC;AAED,gCAAgC;AAChC,KAAK,UAAU,gBAAgB,CAC7B,KAAa,EACb,MAAoB,EACpB,GAAW,EACX,IAAY,EACZ,IAAY,EACZ,UAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;QACvB,KAAK;QACL,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,WAAW;QACtD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;KAC9E,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,wBAAwB,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA+B,CAAC;IACjD,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;IACpB,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3F,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,iDAAiD;AACjD,KAAK,UAAU,cAAc,CAC3B,KAAa,EACb,MAAoB,EACpB,SAAiB,EACjB,SAAiB,EACjB,IAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;QACvB,KAAK;QACL,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,aAAa,SAAS,SAAS;QAC1E,KAAK,EAAE,QAAQ,kBAAkB,CAAC,SAAS,CAAC,EAAE;QAC9C,OAAO,EAAE,EAAE,cAAc,EAAE,iBAAiB,EAAE;QAC9C,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,MAAM,SAAS,OAAO,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,MAAoB;IAC/D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;QACvB,KAAK;QACL,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,4BAA4B;QACvE,OAAO,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE;KACnD,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,GAAG,CAAC,IAAmD,CAAC;IACrE,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC;IACtB,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;IAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnF,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QACzD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAC/E,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,6DAA6D;AAC7D,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,MAAoB,EAAE,EAAU,EAAE,GAAkB,EAAE,OAA2B;IAC7H,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,IAAI,GAA4B;QACpC,OAAO,EAAE,WAAW,EAAE,qBAAqB;QAC3C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;KACzD,CAAC;IACF,IAAI,GAAG;QAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;QACvB,KAAK;QACL,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,4BAA4B;QACvE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC7F,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAuBD,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,mBAAmB,cAAc,4CAA4C,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,wEAAwE,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,8EAA8E,CAAC,CAAC;IACzI,CAAC;IACD,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/C,qDAAqD;IACrD,gEAAgE;IAChE,gDAAgD;IAChD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACjD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI;QACJ,SAAS;QACT,SAAS;QACT,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI;QACnC,MAAM;QACN,GAAG;QACH,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE;QAC5C,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9H,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,CAAiB;IACtC,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,0CAA0C;QAC1C,iBAAiB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG;QACxF,iBAAiB,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE;QAClD,gBAAgB,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;QACpE,0BAA0B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,iBAAiB;QAC1E,gBAAgB,CAAC,CAAC,GAAG,EAAE;QACvB,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,iCAAiC,EAAE;QACxF,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,OAAO,mBAAmB,EAAE;QAC3J,sEAAsE;QACtE,8CAA8C;KAC/C,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+CAA+C;AAC/C,KAAK,UAAU,cAAc,CAAC,GAAa;IACzC,IAAI,GAAG;QAAE,OAAO;IAChB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAuB,EAAE;IAC5E,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAEnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,OAAO,iBAAiB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5F,yCAAyC;IACzC,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,SAAS;IACT,IAAI,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,oEAAoE,CAAC,CAAC;IACtG,CAAC;IACD,yBAAyB;IACzB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC1G,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5G,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,MAAM,CAAC,CAAC;IAC1C,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QAC5G,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAEpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,wCAAwC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACvG,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAChF,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=publish.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.test.d.ts","sourceRoot":"","sources":["../src/publish.test.ts"],"names":[],"mappings":""}