share-pages 0.2.0 → 0.4.0
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 +68 -3
- package/dist/THIRD_PARTY_NOTICES.txt +5056 -0
- package/dist/dist-BQU5lE8l.mjs +50 -0
- package/dist/document-C_zFJaJh-DTCGPWet.mjs +1 -0
- package/dist/dom-CIOfuHTB-C4-fuyKb.mjs +1 -0
- package/dist/epub-BwUDPJ1r-BH6gGWIa.mjs +5 -0
- package/dist/escape-BojitKF1.mjs +1 -0
- package/dist/esm-2MLJKInY.mjs +19 -0
- package/dist/index.mjs +1 -681
- package/dist/latex-DlhobE9G-CtYqyv9n.mjs +1 -0
- package/dist/latex-DlhobE9G-DwHHYo7c.mjs +243 -0
- package/dist/latex-lLjk9urP-B-Wr1Cpy.mjs +1 -0
- package/dist/lib-BuAs9S25.mjs +584 -0
- package/dist/markdown-CWaGsmVG-B3CzFhB7.mjs +2 -0
- package/dist/markdown-bundle-B49zJqHf-D1jB-1mu.mjs +9 -0
- package/dist/mdx-compile-BORJryFt-DZVpZfVh.mjs +147 -0
- package/dist/node-BpQDZA_b.mjs +1 -0
- package/dist/package-Dtp2swhT.mjs +21 -0
- package/dist/papaparse-4MP1mCUd.mjs +17 -0
- package/dist/prepare-4aSXVqKK-dkPhrUn5.mjs +1 -0
- package/dist/program-DJaWAEf5.mjs +17 -0
- package/dist/rolldown-runtime-Csi-cuKc.mjs +1 -0
- package/package.json +25 -17
- package/dist/dist-BkIxqYQy.mjs +0 -5450
- package/dist/epub-BXQPqTFk-CSXSpn1h.mjs +0 -4915
- package/dist/latex-CybgCSnr-CvP5kdPz.mjs +0 -33421
- package/dist/latex-DMo_3IW8-D8ylufbk.mjs +0 -20
- package/dist/markdown-BWlCFeLJ-D_-ZvWdl.mjs +0 -68089
- package/dist/node-ZNJuj10Q.mjs +0 -77
- package/dist/papaparse-BJnSo-VR.mjs +0 -1139
- package/dist/prepare-C56DezIS-DwhDVRlC.mjs +0 -8563
- package/dist/resources/assets/csv-worker-Bilq-sDm.js +0 -17
- package/dist/resources/chunks/viewer-Bz6Cwh4W.js +0 -9561
- package/dist/resources/csv.js +0 -2444
- package/dist/resources/epub.js +0 -16493
- package/dist/resources/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/resources/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/resources/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/resources/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/resources/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/resources/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/resources/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/resources/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/resources/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/dist/resources/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/resources/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/resources/katex.css +0 -1
- package/dist/resources/latex-article.css +0 -33
- package/dist/resources/latex-base.css +0 -816
- package/dist/resources/latex-book.css +0 -43
- package/dist/resources/latex-fonts/KaTeX_AMS-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-Bold.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-Italic.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Math-Italic.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Script-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size1-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size2-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size3-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size4-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/dist/resources/latex-fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/dist/resources/latex-fonts/OFL.txt +0 -102
- package/dist/resources/latex-fonts/Sans/cmun-sans.css +0 -30
- package/dist/resources/latex-fonts/Sans/cmunsi.woff +0 -0
- package/dist/resources/latex-fonts/Sans/cmunso.woff +0 -0
- package/dist/resources/latex-fonts/Sans/cmunss.woff +0 -0
- package/dist/resources/latex-fonts/Sans/cmunsx.woff +0 -0
- package/dist/resources/latex-fonts/Serif/cmun-serif.css +0 -30
- package/dist/resources/latex-fonts/Serif/cmunbi.woff +0 -0
- package/dist/resources/latex-fonts/Serif/cmunbx.woff +0 -0
- package/dist/resources/latex-fonts/Serif/cmunrm.woff +0 -0
- package/dist/resources/latex-fonts/Serif/cmunti.woff +0 -0
- package/dist/resources/latex-fonts/Serif Slanted/cmun-serif-slanted.css +0 -14
- package/dist/resources/latex-fonts/Serif Slanted/cmunbl.woff +0 -0
- package/dist/resources/latex-fonts/Serif Slanted/cmunsl.woff +0 -0
- package/dist/resources/latex-fonts/Typewriter/cmun-typewriter.css +0 -30
- package/dist/resources/latex-fonts/Typewriter/cmunit.woff +0 -0
- package/dist/resources/latex-fonts/Typewriter/cmuntb.woff +0 -0
- package/dist/resources/latex-fonts/Typewriter/cmuntt.woff +0 -0
- package/dist/resources/latex-fonts/Typewriter/cmuntx.woff +0 -0
- package/dist/resources/latex-fonts/Typewriter Slanted/cmun-typewriter-slanted.css +0 -6
- package/dist/resources/latex-fonts/Typewriter Slanted/cmunst.woff +0 -0
- package/dist/resources/latex-fonts/cmu.css +0 -13
- package/dist/resources/latex-katex.css +0 -1079
- package/dist/resources/licenses.txt +0 -131
- package/dist/resources/reader.css +0 -244
- package/dist/resources/viewers.css +0 -3
- package/dist/rolldown-runtime-B4iAMlE-.mjs +0 -35
package/dist/index.mjs
CHANGED
|
@@ -1,682 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as digest, i as defaultLimits, n as CHUNK_SIZE, r as assert, s as formats, t as AppError } from "./dist-BkIxqYQy.mjs";
|
|
3
|
-
import { Command, CommanderError, Option } from "commander";
|
|
4
|
-
import { randomUUID } from "node:crypto";
|
|
5
|
-
import { chmod, mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
6
|
-
import { homedir } from "node:os";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { createInterface } from "node:readline/promises";
|
|
9
|
-
import { createWriteStream } from "node:fs";
|
|
10
|
-
import { Readable } from "node:stream";
|
|
11
|
-
import { pipeline } from "node:stream/promises";
|
|
12
|
-
//#region ../../packages/sdk/dist/index.js
|
|
13
|
-
function checkAbort(signal) {
|
|
14
|
-
if (signal?.aborted) throw new AppError("ABORTED", "操作已取消,上传会话仍可恢复", 499);
|
|
15
|
-
}
|
|
16
|
-
function abortScope(parent, timeoutMs) {
|
|
17
|
-
const controller = new AbortController();
|
|
18
|
-
const abort = () => controller.abort(parent?.reason);
|
|
19
|
-
if (parent?.aborted) abort();
|
|
20
|
-
else parent?.addEventListener("abort", abort, { once: true });
|
|
21
|
-
const timer = timeoutMs === void 0 ? void 0 : setTimeout(() => controller.abort(), timeoutMs);
|
|
22
|
-
return {
|
|
23
|
-
controller,
|
|
24
|
-
signal: controller.signal,
|
|
25
|
-
dispose() {
|
|
26
|
-
if (timer !== void 0) clearTimeout(timer);
|
|
27
|
-
parent?.removeEventListener("abort", abort);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function delay(ms, signal) {
|
|
32
|
-
checkAbort(signal);
|
|
33
|
-
return new Promise((resolve, reject) => {
|
|
34
|
-
const finish = () => {
|
|
35
|
-
signal?.removeEventListener("abort", cancel);
|
|
36
|
-
resolve();
|
|
37
|
-
};
|
|
38
|
-
const timer = setTimeout(finish, ms);
|
|
39
|
-
const cancel = () => {
|
|
40
|
-
clearTimeout(timer);
|
|
41
|
-
signal?.removeEventListener("abort", cancel);
|
|
42
|
-
reject(new AppError("ABORTED", "操作已取消,上传会话仍可恢复", 499));
|
|
43
|
-
};
|
|
44
|
-
signal?.addEventListener("abort", cancel, { once: true });
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
function result(session) {
|
|
48
|
-
assert(session.result, "INVALID_RESPONSE", "已提交会话缺少发布结果", 502);
|
|
49
|
-
return session.result;
|
|
50
|
-
}
|
|
51
|
-
async function waitForUpload(client, id, timeoutMs = 12e4, signal) {
|
|
52
|
-
assert(Number.isFinite(timeoutMs) && timeoutMs >= 0, "INVALID_TIMEOUT", "等待时间必须为非负有限数");
|
|
53
|
-
const end = Date.now() + timeoutMs;
|
|
54
|
-
while (true) {
|
|
55
|
-
checkAbort(signal);
|
|
56
|
-
const status = await client.request(`/uploads/${encodeURIComponent(id)}`, { signal }, true);
|
|
57
|
-
if (status.status === "committed") return result(status);
|
|
58
|
-
if ([
|
|
59
|
-
"failed",
|
|
60
|
-
"cancelled",
|
|
61
|
-
"expired"
|
|
62
|
-
].includes(status.status)) throw new AppError(status.error?.code ?? "PUBLISH_FAILED", status.error?.message ?? `发布 ${status.status}`, 409);
|
|
63
|
-
if (Date.now() >= end) return status;
|
|
64
|
-
await delay(Math.min(500, Math.max(0, end - Date.now())), signal);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
async function publish(client, prepared, options = {}) {
|
|
68
|
-
const { idempotencyKey = crypto.randomUUID(), uploadId, wait = true, timeoutMs = 12e4, signal, uploadConcurrency = 3, onProgress, onSession, ...input } = options;
|
|
69
|
-
assert(Number.isFinite(timeoutMs) && timeoutMs >= 0, "INVALID_TIMEOUT", "等待时间必须为非负有限数");
|
|
70
|
-
assert(Number.isInteger(uploadConcurrency) && uploadConcurrency >= 1 && uploadConcurrency <= 4, "INVALID_CONCURRENCY", "上传并发数必须为 1–4");
|
|
71
|
-
checkAbort(signal);
|
|
72
|
-
let session = uploadId ? await client.request(`/uploads/${encodeURIComponent(uploadId)}`, { signal }, true) : await client.json("/uploads", "POST", {
|
|
73
|
-
...input,
|
|
74
|
-
title: options.title ?? prepared.title,
|
|
75
|
-
manifest: prepared.manifest
|
|
76
|
-
}, { "Idempotency-Key": idempotencyKey }, true, signal);
|
|
77
|
-
assert(session.manifestDigest === await digest(JSON.stringify(prepared.manifest)), "RESUME_MISMATCH", "上传会话与本地内容清单不同");
|
|
78
|
-
await onSession?.(session);
|
|
79
|
-
if (session.status === "committed") return result(session);
|
|
80
|
-
if (session.status === "uploading") {
|
|
81
|
-
const files = new Map(prepared.manifest.files.map((file) => [file.id, file]));
|
|
82
|
-
const tasks = [];
|
|
83
|
-
const total = prepared.manifest.files.reduce((sum, file) => sum + file.size, 0);
|
|
84
|
-
let completed = total;
|
|
85
|
-
for (const missing of session.missing) {
|
|
86
|
-
const file = files.get(missing.fileId);
|
|
87
|
-
const data = prepared.files.get(missing.fileId);
|
|
88
|
-
assert(file && data, "RESUME_MISMATCH", "断点会话与本地文件不同");
|
|
89
|
-
assert(data.byteLength === file.size, "RESUME_MISMATCH", "本地文件大小与清单不同");
|
|
90
|
-
assert(new Set(missing.parts).size === missing.parts.length, "INVALID_RESPONSE", "服务端返回重复分片", 502);
|
|
91
|
-
for (const part of missing.parts) {
|
|
92
|
-
assert(Number.isInteger(part) && part >= 0 && (part === 0 || part * 8388608 < file.size), "INVALID_RESPONSE", "服务端分片编号无效", 502);
|
|
93
|
-
const bytes = data.subarray(part * CHUNK_SIZE, (part + 1) * CHUNK_SIZE);
|
|
94
|
-
completed -= bytes.byteLength;
|
|
95
|
-
tasks.push({
|
|
96
|
-
fileId: missing.fileId,
|
|
97
|
-
part,
|
|
98
|
-
bytes
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
onProgress?.(completed, total);
|
|
103
|
-
const scope = abortScope(signal);
|
|
104
|
-
let next = 0;
|
|
105
|
-
let failure;
|
|
106
|
-
try {
|
|
107
|
-
await Promise.all(Array.from({ length: Math.min(uploadConcurrency, tasks.length) }, async () => {
|
|
108
|
-
try {
|
|
109
|
-
while (next < tasks.length) {
|
|
110
|
-
checkAbort(scope.signal);
|
|
111
|
-
const task = tasks[next++];
|
|
112
|
-
if (!task) break;
|
|
113
|
-
await client.request(`/uploads/${session.id}/files/${task.fileId}?part=${task.part}`, {
|
|
114
|
-
method: "PUT",
|
|
115
|
-
headers: { "X-Chunk-SHA256": await digest(task.bytes) },
|
|
116
|
-
body: task.bytes,
|
|
117
|
-
signal: scope.signal
|
|
118
|
-
}, true);
|
|
119
|
-
completed += task.bytes.byteLength;
|
|
120
|
-
onProgress?.(completed, total);
|
|
121
|
-
}
|
|
122
|
-
} catch (error) {
|
|
123
|
-
failure ??= error;
|
|
124
|
-
scope.controller.abort();
|
|
125
|
-
}
|
|
126
|
-
}));
|
|
127
|
-
if (failure) throw failure;
|
|
128
|
-
} finally {
|
|
129
|
-
scope.dispose();
|
|
130
|
-
}
|
|
131
|
-
session = await client.json(`/uploads/${session.id}/complete`, "POST", {}, {}, true, signal);
|
|
132
|
-
}
|
|
133
|
-
return wait ? waitForUpload(client, session.id, timeoutMs, signal) : session;
|
|
134
|
-
}
|
|
135
|
-
var HTTPClient = class {
|
|
136
|
-
server;
|
|
137
|
-
transport;
|
|
138
|
-
token;
|
|
139
|
-
timeout;
|
|
140
|
-
constructor(options) {
|
|
141
|
-
this.server = options.server.replace(/\/$/, "");
|
|
142
|
-
let url;
|
|
143
|
-
try {
|
|
144
|
-
url = new URL(this.server);
|
|
145
|
-
} catch {
|
|
146
|
-
throw new AppError("INVALID_SERVER", "实例地址需要是 HTTP(S) origin");
|
|
147
|
-
}
|
|
148
|
-
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.pathname !== "/" || url.search || url.hash) throw new AppError("INVALID_SERVER", "实例地址需要是 HTTP(S) origin");
|
|
149
|
-
if (url.protocol !== "https:" && ![
|
|
150
|
-
"localhost",
|
|
151
|
-
"127.0.0.1",
|
|
152
|
-
"[::1]"
|
|
153
|
-
].includes(url.hostname)) throw new AppError("INSECURE_SERVER", "远端实例必须使用 HTTPS");
|
|
154
|
-
this.timeout = options.requestTimeoutMs ?? 3e4;
|
|
155
|
-
if (!Number.isFinite(this.timeout) || this.timeout <= 0) throw new AppError("INVALID_TIMEOUT", "请求超时必须是有限正数");
|
|
156
|
-
this.token = options.token;
|
|
157
|
-
this.transport = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
158
|
-
}
|
|
159
|
-
async request(path, init = {}, retry = false) {
|
|
160
|
-
const headers = new Headers(init.headers);
|
|
161
|
-
if (this.token) headers.set("Authorization", `Bearer ${this.token}`);
|
|
162
|
-
for (let attempt = 0;; attempt++) {
|
|
163
|
-
checkAbort(init.signal);
|
|
164
|
-
const scope = abortScope(init.signal, this.timeout);
|
|
165
|
-
let retryAfter = 250 * 2 ** attempt;
|
|
166
|
-
try {
|
|
167
|
-
const response = await this.transport(`${this.server}/api/v1${path}`, {
|
|
168
|
-
...init,
|
|
169
|
-
headers,
|
|
170
|
-
credentials: "include",
|
|
171
|
-
signal: init.signal ? AbortSignal.any([scope.signal, init.signal]) : scope.signal
|
|
172
|
-
});
|
|
173
|
-
if (retry && [
|
|
174
|
-
429,
|
|
175
|
-
502,
|
|
176
|
-
503,
|
|
177
|
-
504
|
|
178
|
-
].includes(response.status) && attempt < 3) {
|
|
179
|
-
const value = response.headers.get("Retry-After");
|
|
180
|
-
if (value) retryAfter = Math.min(5e3, Math.max(0, /^\d+$/.test(value) ? Number(value) * 1e3 : Date.parse(value) - Date.now()) || retryAfter);
|
|
181
|
-
await response.body?.cancel();
|
|
182
|
-
} else {
|
|
183
|
-
if (!response.ok) {
|
|
184
|
-
let error = {};
|
|
185
|
-
try {
|
|
186
|
-
const value = await response.json();
|
|
187
|
-
if (value && typeof value === "object") error = value;
|
|
188
|
-
} catch {}
|
|
189
|
-
throw new AppError(typeof error.code === "string" ? error.code : "HTTP_ERROR", typeof error.message === "string" ? error.message : `请求失败 (${response.status})`, response.status, error.fields, error.requestId ?? response.headers.get("X-Request-Id") ?? void 0);
|
|
190
|
-
}
|
|
191
|
-
if (response.headers.get("Content-Type")?.includes("application/json")) try {
|
|
192
|
-
return await response.json();
|
|
193
|
-
} catch {
|
|
194
|
-
throw new AppError("INVALID_RESPONSE", "服务端返回了无效 JSON", 502);
|
|
195
|
-
}
|
|
196
|
-
return response;
|
|
197
|
-
}
|
|
198
|
-
} catch (error) {
|
|
199
|
-
checkAbort(init.signal);
|
|
200
|
-
if (error instanceof AppError) throw error;
|
|
201
|
-
if (!retry || attempt >= 3) throw new AppError(scope.signal.aborted ? "REQUEST_TIMEOUT" : "NETWORK_ERROR", "网络请求失败,可使用相同上传会话继续", 503);
|
|
202
|
-
} finally {
|
|
203
|
-
scope.dispose();
|
|
204
|
-
}
|
|
205
|
-
await delay(retryAfter, init.signal);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
json(path, method, body, headers = {}, retry = false, signal) {
|
|
209
|
-
return this.request(path, {
|
|
210
|
-
method,
|
|
211
|
-
headers: {
|
|
212
|
-
"Content-Type": "application/json",
|
|
213
|
-
...headers
|
|
214
|
-
},
|
|
215
|
-
body: JSON.stringify(body),
|
|
216
|
-
signal
|
|
217
|
-
}, retry);
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
var SharePagesClient = class extends HTTPClient {
|
|
221
|
-
publish(prepared, options = {}) {
|
|
222
|
-
return publish(this, prepared, options);
|
|
223
|
-
}
|
|
224
|
-
waitForUpload(id, timeoutMs = 12e4, signal) {
|
|
225
|
-
return waitForUpload(this, id, timeoutMs, signal);
|
|
226
|
-
}
|
|
227
|
-
capabilities() {
|
|
228
|
-
return this.request("/capabilities", {}, true);
|
|
229
|
-
}
|
|
230
|
-
listPages(params = {}) {
|
|
231
|
-
return this.request(`/pages?${new URLSearchParams(params)}`);
|
|
232
|
-
}
|
|
233
|
-
getPage(id) {
|
|
234
|
-
return this.request(`/pages/${encodeURIComponent(id)}`);
|
|
235
|
-
}
|
|
236
|
-
listVersions(id, cursor) {
|
|
237
|
-
return this.request(`/pages/${encodeURIComponent(id)}/versions` + (cursor ? `?cursor=${encodeURIComponent(cursor)}` : ""));
|
|
238
|
-
}
|
|
239
|
-
patchPage(id, patch) {
|
|
240
|
-
return this.json(`/pages/${encodeURIComponent(id)}`, "PATCH", patch);
|
|
241
|
-
}
|
|
242
|
-
async rollback(id, versionId, options = {}) {
|
|
243
|
-
const s = await this.json(`/pages/${encodeURIComponent(id)}/rollback`, "POST", { versionId }, { "Idempotency-Key": options.idempotencyKey ?? crypto.randomUUID() }, true);
|
|
244
|
-
return options.wait === false ? s : this.waitForUpload(s.id, options.timeoutMs);
|
|
245
|
-
}
|
|
246
|
-
deletePage(id, purge = false) {
|
|
247
|
-
return this.request(`/pages/${encodeURIComponent(id)}?purge=${purge}`, { method: "DELETE" });
|
|
248
|
-
}
|
|
249
|
-
restorePage(id, replaceWith) {
|
|
250
|
-
return this.json(`/pages/${encodeURIComponent(id)}/restore`, "POST", { replaceWith });
|
|
251
|
-
}
|
|
252
|
-
deleteVersion(id, version, options = {}) {
|
|
253
|
-
const params = new URLSearchParams(Object.entries(options).filter(([, v]) => v !== void 0).map(([k, v]) => [k, String(v)]));
|
|
254
|
-
return this.request(`/pages/${encodeURIComponent(id)}/versions/${encodeURIComponent(version)}?${params}`, { method: "DELETE" });
|
|
255
|
-
}
|
|
256
|
-
restoreVersion(id, version) {
|
|
257
|
-
return this.json(`/pages/${encodeURIComponent(id)}/versions/${encodeURIComponent(version)}/restore`, "POST", {});
|
|
258
|
-
}
|
|
259
|
-
download(id, version) {
|
|
260
|
-
return this.request(`/pages/${encodeURIComponent(id)}/versions/${encodeURIComponent(version)}/download`);
|
|
261
|
-
}
|
|
262
|
-
stats(params = {}) {
|
|
263
|
-
return this.request(`/stats?${new URLSearchParams(params)}`);
|
|
264
|
-
}
|
|
265
|
-
};
|
|
266
|
-
//#endregion
|
|
267
|
-
//#region src/config.ts
|
|
268
|
-
const configDir = process.env.SHARE_PAGES_CONFIG_DIR ?? join(process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config"), "share-pages");
|
|
269
|
-
const configPath = join(configDir, "config.json");
|
|
270
|
-
async function readConfig() {
|
|
271
|
-
try {
|
|
272
|
-
const value = JSON.parse(await readFile(configPath, "utf8"));
|
|
273
|
-
if (!validConfig(value)) throw new Error("Invalid configuration");
|
|
274
|
-
return value;
|
|
275
|
-
} catch (e) {
|
|
276
|
-
if (e.code === "ENOENT") return {
|
|
277
|
-
active: "default",
|
|
278
|
-
profiles: {}
|
|
279
|
-
};
|
|
280
|
-
throw new AppError("CONFIG_ERROR", "配置文件读取失败");
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
function validConfig(value) {
|
|
284
|
-
if (!value || typeof value !== "object" || !("active" in value) || !("profiles" in value)) return false;
|
|
285
|
-
if (typeof value.active !== "string" || !value.profiles || typeof value.profiles !== "object" || Array.isArray(value.profiles)) return false;
|
|
286
|
-
return Object.values(value.profiles).every((profile) => profile && typeof profile === "object" && typeof profile.server === "string" && typeof profile.token === "string");
|
|
287
|
-
}
|
|
288
|
-
async function savePrivate(path, data) {
|
|
289
|
-
await mkdir(configDir, {
|
|
290
|
-
recursive: true,
|
|
291
|
-
mode: 448
|
|
292
|
-
});
|
|
293
|
-
const temp = `${path}.${randomUUID()}.tmp`;
|
|
294
|
-
try {
|
|
295
|
-
await writeFile(temp, `${JSON.stringify(data, null, 2)}\n`, {
|
|
296
|
-
mode: 384,
|
|
297
|
-
flag: "wx"
|
|
298
|
-
});
|
|
299
|
-
await rename(temp, path);
|
|
300
|
-
await chmod(path, 384);
|
|
301
|
-
} finally {
|
|
302
|
-
await unlink(temp).catch((error) => {
|
|
303
|
-
if (error.code !== "ENOENT") throw error;
|
|
304
|
-
});
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
async function writeConfig(config) {
|
|
308
|
-
await savePrivate(configPath, config);
|
|
309
|
-
}
|
|
310
|
-
async function profile(name, server) {
|
|
311
|
-
const config = await readConfig(), key = name ?? config.active, p = Object.hasOwn(config.profiles, key) ? config.profiles[key] : void 0;
|
|
312
|
-
const value = {
|
|
313
|
-
server: server ?? process.env.SHARE_PAGES_SERVER ?? p?.server,
|
|
314
|
-
token: process.env.SHARE_PAGES_TOKEN ?? p?.token
|
|
315
|
-
};
|
|
316
|
-
if (!value.server || !value.token) throw new AppError("LOGIN_REQUIRED", "请先登录,或设置 SHARE_PAGES_SERVER 和 SHARE_PAGES_TOKEN", 401);
|
|
317
|
-
return value;
|
|
318
|
-
}
|
|
319
|
-
function resumePath(id) {
|
|
320
|
-
if (!/^[a-z0-9-]+$/i.test(id)) throw new AppError("INVALID_UPLOAD_ID", "非法上传 ID");
|
|
321
|
-
return join(configDir, `upload-${id}.json`);
|
|
322
|
-
}
|
|
323
|
-
//#endregion
|
|
324
|
-
//#region src/input.ts
|
|
325
|
-
async function stdinBytes(limit = 100 * 1024 ** 2) {
|
|
326
|
-
const chunks = [];
|
|
327
|
-
let length = 0;
|
|
328
|
-
for await (const chunk of process.stdin) {
|
|
329
|
-
const b = Buffer.from(chunk);
|
|
330
|
-
length += b.length;
|
|
331
|
-
if (length > limit) throw new AppError("INPUT_TOO_LARGE", "stdin 内容超限", 413);
|
|
332
|
-
chunks.push(b);
|
|
333
|
-
}
|
|
334
|
-
return new Uint8Array(Buffer.concat(chunks));
|
|
335
|
-
}
|
|
336
|
-
async function secret(prompt, interactive = true) {
|
|
337
|
-
if (!interactive || !process.stdin.isTTY) throw new AppError("INPUT_REQUIRED", "非交互模式需要通过 stdin 文件或环境变量提供秘密");
|
|
338
|
-
process.stderr.write(prompt);
|
|
339
|
-
process.stdin.setRawMode(true);
|
|
340
|
-
process.stdin.resume();
|
|
341
|
-
return new Promise((resolve, reject) => {
|
|
342
|
-
let value = "";
|
|
343
|
-
const onData = (data) => {
|
|
344
|
-
for (const c of data.toString("utf8")) {
|
|
345
|
-
if (c === "\r" || c === "\n") {
|
|
346
|
-
cleanup();
|
|
347
|
-
resolve(value);
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
if (c === "") {
|
|
351
|
-
cleanup();
|
|
352
|
-
reject(new AppError("CANCELLED", "操作取消"));
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
if (c === "") value = value.slice(0, -1);
|
|
356
|
-
else if (c >= " ") value += c;
|
|
357
|
-
}
|
|
358
|
-
};
|
|
359
|
-
function cleanup() {
|
|
360
|
-
process.stdin.off("data", onData);
|
|
361
|
-
process.stdin.setRawMode(false);
|
|
362
|
-
process.stdin.pause();
|
|
363
|
-
process.stderr.write("\n");
|
|
364
|
-
}
|
|
365
|
-
process.stdin.on("data", onData);
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
async function confirm(message, yes, interactive) {
|
|
369
|
-
if (yes) return;
|
|
370
|
-
if (!interactive || !process.stdin.isTTY) throw new AppError("CONFIRMATION_REQUIRED", "自动化删除需要显式 --yes");
|
|
371
|
-
const rl = createInterface({
|
|
372
|
-
input: process.stdin,
|
|
373
|
-
output: process.stderr
|
|
374
|
-
});
|
|
375
|
-
try {
|
|
376
|
-
if (await rl.question(`${message} 输入 yes 继续:`) !== "yes") throw new AppError("CANCELLED", "操作取消");
|
|
377
|
-
} finally {
|
|
378
|
-
rl.close();
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
//#endregion
|
|
382
|
-
//#region package.json
|
|
383
|
-
var version = "0.2.0";
|
|
384
|
-
//#endregion
|
|
385
|
-
//#region src/shared.ts
|
|
386
|
-
function createCommand() {
|
|
387
|
-
return new Command().name("share-pages").description("个人静态内容发布工具").version(version).option("--json", "stdout 仅输出 JSON").option("--quiet", "隐藏进度").option("--no-interactive", "禁止交互输入").option("--profile <name>", "实例 profile").option("--server <url>", "覆盖实例地址").exitOverride();
|
|
388
|
-
}
|
|
389
|
-
function options(command) {
|
|
390
|
-
const chain = [];
|
|
391
|
-
for (let current = command; current; current = current.parent) chain.unshift(current);
|
|
392
|
-
const values = {};
|
|
393
|
-
for (const current of chain) for (const [key, value] of Object.entries(current.opts())) if (!(key in values) || current.getOptionValueSource(key) !== "default") values[key] = value;
|
|
394
|
-
return values;
|
|
395
|
-
}
|
|
396
|
-
function stringOptions(options, keys) {
|
|
397
|
-
const values = {};
|
|
398
|
-
for (const key of keys) {
|
|
399
|
-
const value = options[key];
|
|
400
|
-
if (typeof value === "string") values[key] = value;
|
|
401
|
-
}
|
|
402
|
-
return values;
|
|
403
|
-
}
|
|
404
|
-
function output(value, o) {
|
|
405
|
-
if (o.json) process.stdout.write(`${JSON.stringify(value)}\n`);
|
|
406
|
-
else if (typeof value === "object" && value && "url" in value) process.stdout.write(`${String(value.url)}\n`);
|
|
407
|
-
else process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
408
|
-
}
|
|
409
|
-
async function client(o) {
|
|
410
|
-
return new SharePagesClient(await profile(o.profile, o.server));
|
|
411
|
-
}
|
|
412
|
-
//#endregion
|
|
413
|
-
//#region src/accounts.ts
|
|
414
|
-
function registerAccounts(cli) {
|
|
415
|
-
cli.command("login").description("保存实例和发布 Token").option("--token-stdin", "从 stdin 读取 Token").action(async (_local, command) => {
|
|
416
|
-
const o = options(command), token = o.tokenStdin ? new TextDecoder().decode(await stdinBytes(1024)).trim() : process.env.SHARE_PAGES_TOKEN ?? await secret("发布 Token:", o.interactive);
|
|
417
|
-
if (!o.server) throw new AppError("SERVER_REQUIRED", "登录需要 --server <url>");
|
|
418
|
-
const sdk = new SharePagesClient({
|
|
419
|
-
server: o.server,
|
|
420
|
-
token
|
|
421
|
-
});
|
|
422
|
-
await sdk.request("/me");
|
|
423
|
-
const config = await readConfig();
|
|
424
|
-
const name = o.profile ?? "default";
|
|
425
|
-
config.profiles = {
|
|
426
|
-
...config.profiles,
|
|
427
|
-
[name]: {
|
|
428
|
-
server: sdk.server,
|
|
429
|
-
token
|
|
430
|
-
}
|
|
431
|
-
};
|
|
432
|
-
config.active = name;
|
|
433
|
-
await writeConfig(config);
|
|
434
|
-
output({
|
|
435
|
-
profile: name,
|
|
436
|
-
server: sdk.server,
|
|
437
|
-
status: "logged-in"
|
|
438
|
-
}, o);
|
|
439
|
-
});
|
|
440
|
-
const profiles = cli.command("profiles");
|
|
441
|
-
profiles.command("list").action(async (_o, command) => {
|
|
442
|
-
const o = options(command), c = await readConfig();
|
|
443
|
-
output({
|
|
444
|
-
active: c.active,
|
|
445
|
-
profiles: Object.entries(c.profiles).map(([name, p]) => ({
|
|
446
|
-
name,
|
|
447
|
-
server: p.server
|
|
448
|
-
}))
|
|
449
|
-
}, o);
|
|
450
|
-
});
|
|
451
|
-
profiles.command("use <name>").action(async (name, _o, command) => {
|
|
452
|
-
const o = options(command), c = await readConfig();
|
|
453
|
-
if (!Object.hasOwn(c.profiles, name)) throw new AppError("PROFILE_NOT_FOUND", "实例配置不存在");
|
|
454
|
-
c.active = name;
|
|
455
|
-
await writeConfig(c);
|
|
456
|
-
output({ active: name }, o);
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
//#endregion
|
|
460
|
-
//#region src/pages.ts
|
|
461
|
-
function registerPages(cli) {
|
|
462
|
-
const pages = cli.command("pages");
|
|
463
|
-
pages.command("list").option("--state <state>").option("--q <text>").option("--format <format>").option("--access <mode>").option("--cursor <cursor>").action(async (_local, command) => {
|
|
464
|
-
const o = options(command);
|
|
465
|
-
output(await (await client(o)).listPages(stringOptions(o, [
|
|
466
|
-
"state",
|
|
467
|
-
"q",
|
|
468
|
-
"format",
|
|
469
|
-
"access",
|
|
470
|
-
"cursor"
|
|
471
|
-
])), o);
|
|
472
|
-
});
|
|
473
|
-
pages.command("get <id>").action(async (id, _local, command) => {
|
|
474
|
-
const o = options(command);
|
|
475
|
-
output(await (await client(o)).getPage(id), o);
|
|
476
|
-
});
|
|
477
|
-
pages.command("edit <id>").option("--title <title>").option("--access <mode>").option("--indexable <boolean>").option("--password-file <path>").action(async (id, _local, command) => {
|
|
478
|
-
const o = options(command);
|
|
479
|
-
const patch = {};
|
|
480
|
-
if (o.title) patch.title = o.title;
|
|
481
|
-
if (o.access) patch.access = o.access;
|
|
482
|
-
if (o.indexable !== void 0) {
|
|
483
|
-
if (typeof o.indexable !== "string" || !["true", "false"].includes(o.indexable)) throw new AppError("VALIDATION_ERROR", "--indexable 使用 true/false");
|
|
484
|
-
patch.indexable = o.indexable === "true";
|
|
485
|
-
}
|
|
486
|
-
if (o.access === "password") patch.password = o.passwordFile ? (await readFile(o.passwordFile, "utf8")).trimEnd() : await secret("页面密码:", o.interactive);
|
|
487
|
-
output(await (await client(o)).patchPage(id, patch), o);
|
|
488
|
-
});
|
|
489
|
-
pages.command("delete <id>").option("--purge").option("--yes").action(async (id, _local, command) => {
|
|
490
|
-
const o = options(command), sdk = await client(o);
|
|
491
|
-
const page = await sdk.getPage(id);
|
|
492
|
-
await confirm(`${o.purge ? "永久删除" : "移入回收站"}页面 ${id}(${page.title})及全部版本。`, !!o.yes, !!o.interactive);
|
|
493
|
-
output(await sdk.deletePage(id, o.purge), o);
|
|
494
|
-
});
|
|
495
|
-
pages.command("restore <id>").option("--replace-with <version>").action(async (id, _local, command) => {
|
|
496
|
-
const o = options(command);
|
|
497
|
-
output(await (await client(o)).restorePage(id, o.replaceWith), o);
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
//#endregion
|
|
501
|
-
//#region src/publish.ts
|
|
502
|
-
function registerPublish(cli) {
|
|
503
|
-
cli.command("publish <input>").description("发布文件、ZIP 或目录;使用 - 从 stdin 读取内容").option("--id <id>").option("--update", "更新已有 ID").option("--type <format>").option("--title <title>").option("--entry <path>", "HTML 入口", "index.html").option("--spa", "启用 HTML 导航回退").option("--access <access>", "public / password / admin").option("--indexable", "允许公开页面收录").option("--encoding <encoding>", "文本编码", "utf-8").option("--delimiter <delimiter>", "CSV 分隔符").option("--no-header", "CSV 没有表头").option("--password-file <path>", "从权限受限文件读取页面密码").option("--dry-run", "仅检查转换和 manifest").option("--resume <uploadId>", "继续上传会话").option("--idempotency-key <key>").option("--no-wait", "提交后返回处理中状态").option("--timeout <seconds>", "等待秒数", "120").action(async (input, _local, command) => {
|
|
504
|
-
const o = options(command);
|
|
505
|
-
const { prepareNode, prepareBytes, ensureDOM } = await import("./node-ZNJuj10Q.mjs");
|
|
506
|
-
if (o.type && !formats.includes(o.type)) throw new AppError("UNSUPPORTED_FORMAT", `--type 必须是 ${formats.join(", ")}`);
|
|
507
|
-
if (input === "-" && !o.type) throw new AppError("TYPE_REQUIRED", "stdin 需要显式 --type");
|
|
508
|
-
let sdk, limits = defaultLimits;
|
|
509
|
-
if (!o.dryRun) {
|
|
510
|
-
sdk = await client(o);
|
|
511
|
-
limits = (await sdk.capabilities()).limits;
|
|
512
|
-
}
|
|
513
|
-
const prepareOptions = {
|
|
514
|
-
type: o.type,
|
|
515
|
-
title: o.title,
|
|
516
|
-
entry: o.entry,
|
|
517
|
-
spa: o.spa,
|
|
518
|
-
encoding: o.encoding,
|
|
519
|
-
delimiter: o.delimiter,
|
|
520
|
-
header: o.header,
|
|
521
|
-
limits
|
|
522
|
-
};
|
|
523
|
-
let prepared;
|
|
524
|
-
if (input === "-") {
|
|
525
|
-
if (o.type === "latex") await ensureDOM();
|
|
526
|
-
prepared = await prepareBytes(`stdin.${o.type === "markdown" ? "md" : o.type === "latex" ? "tex" : o.type}`, await stdinBytes(limits.inputBytes), prepareOptions);
|
|
527
|
-
} else prepared = await prepareNode(input, prepareOptions);
|
|
528
|
-
if (o.dryRun) {
|
|
529
|
-
output({
|
|
530
|
-
status: "valid",
|
|
531
|
-
title: prepared.title,
|
|
532
|
-
manifest: prepared.manifest,
|
|
533
|
-
warnings: prepared.warnings
|
|
534
|
-
}, o);
|
|
535
|
-
return;
|
|
536
|
-
}
|
|
537
|
-
const manifestHash = await digest(JSON.stringify(prepared.manifest));
|
|
538
|
-
if (!sdk) throw new AppError("MISSING_CLIENT", "发布客户端尚未初始化");
|
|
539
|
-
if (o.resume) {
|
|
540
|
-
const saved = JSON.parse(await readFile(resumePath(o.resume), "utf8"));
|
|
541
|
-
if (saved.manifestHash !== manifestHash || saved.server !== sdk?.server) throw new AppError("RESUME_MISMATCH", "文件内容或实例与断点会话不一致");
|
|
542
|
-
}
|
|
543
|
-
const password = o.access === "password" ? o.passwordFile ? (await readFile(o.passwordFile, "utf8")).trimEnd() : await secret("页面密码(至少 8 位):", o.interactive) : void 0;
|
|
544
|
-
const result = await sdk.publish(prepared, {
|
|
545
|
-
id: o.id,
|
|
546
|
-
update: !!o.update,
|
|
547
|
-
title: o.title,
|
|
548
|
-
access: o.access,
|
|
549
|
-
password,
|
|
550
|
-
indexable: typeof o.indexable === "boolean" ? o.indexable : void 0,
|
|
551
|
-
idempotencyKey: o.idempotencyKey,
|
|
552
|
-
uploadId: o.resume,
|
|
553
|
-
wait: o.wait,
|
|
554
|
-
timeoutMs: Number(o.timeout) * 1e3,
|
|
555
|
-
onSession: async (s) => {
|
|
556
|
-
await savePrivate(resumePath(s.id), {
|
|
557
|
-
server: sdk?.server,
|
|
558
|
-
uploadId: s.id,
|
|
559
|
-
manifestHash
|
|
560
|
-
});
|
|
561
|
-
if (!o.quiet) process.stderr.write(`上传会话 ${s.id}\n`);
|
|
562
|
-
},
|
|
563
|
-
onProgress: (done, total) => {
|
|
564
|
-
if (!o.quiet && process.stderr.isTTY) process.stderr.write(`\r上传 ${total ? Math.floor(done / total * 100) : 100}%`);
|
|
565
|
-
}
|
|
566
|
-
});
|
|
567
|
-
if (!o.quiet && process.stderr.isTTY) process.stderr.write("\n");
|
|
568
|
-
output(result, o);
|
|
569
|
-
if (result.status !== "ready") process.exitCode = 6;
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
//#endregion
|
|
573
|
-
//#region src/stats.ts
|
|
574
|
-
function registerStats(cli) {
|
|
575
|
-
cli.command("stats [id]").option("--version <version>").option("--from <date>").option("--to <date>").option("--csv").action(async (id, _local, command) => {
|
|
576
|
-
const o = options(command), params = {};
|
|
577
|
-
if (id) params.page = id;
|
|
578
|
-
for (const k of [
|
|
579
|
-
"version",
|
|
580
|
-
"from",
|
|
581
|
-
"to"
|
|
582
|
-
]) if (o[k]) params[k] = o[k];
|
|
583
|
-
if (o.csv) params.format = "csv";
|
|
584
|
-
const data = await (await client(o)).stats(params);
|
|
585
|
-
if (data instanceof Response) process.stdout.write(await data.text());
|
|
586
|
-
else output(data, o);
|
|
587
|
-
});
|
|
588
|
-
cli.command("uploads <id>").action(async (id, _local, command) => {
|
|
589
|
-
const o = options(command);
|
|
590
|
-
output(await (await client(o)).request(`/uploads/${encodeURIComponent(id)}`), o);
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
//#endregion
|
|
594
|
-
//#region src/transfer.ts
|
|
595
|
-
function registerTransfer(cli) {
|
|
596
|
-
cli.command("download <id>").option("--version <version>").option("-o, --output <file>").action(async (id, _local, command) => {
|
|
597
|
-
const o = options(command), sdk = await client(o);
|
|
598
|
-
const version = o.version ?? (await sdk.getPage(id)).current_version_id;
|
|
599
|
-
if (!version) throw new AppError("NO_CURRENT_VERSION", "页面没有当前版");
|
|
600
|
-
const response = await sdk.download(id, String(version));
|
|
601
|
-
const filename = o.output ?? `${id}-${version}.source`;
|
|
602
|
-
if (!response.body) throw new AppError("EMPTY_DOWNLOAD", "下载内容为空");
|
|
603
|
-
await pipeline(Readable.fromWeb(response.body), createWriteStream(filename, {
|
|
604
|
-
flags: "wx",
|
|
605
|
-
mode: 384
|
|
606
|
-
}));
|
|
607
|
-
output({
|
|
608
|
-
file: filename,
|
|
609
|
-
versionId: version
|
|
610
|
-
}, o);
|
|
611
|
-
});
|
|
612
|
-
}
|
|
613
|
-
//#endregion
|
|
614
|
-
//#region src/versions.ts
|
|
615
|
-
function registerVersions(cli) {
|
|
616
|
-
const versions = cli.command("versions");
|
|
617
|
-
versions.command("list <id>").option("--cursor <cursor>").action(async (id, _local, command) => {
|
|
618
|
-
const o = options(command);
|
|
619
|
-
output(await (await client(o)).listVersions(id, o.cursor), o);
|
|
620
|
-
});
|
|
621
|
-
versions.command("delete <id> <version>").option("--replace-with <version>").option("--unpublish").option("--purge").option("--yes").action(async (id, version, _local, command) => {
|
|
622
|
-
const o = options(command), sdk = await client(o);
|
|
623
|
-
await sdk.getPage(id);
|
|
624
|
-
await confirm(`${o.purge ? "永久删除" : "移入回收站"} ${id} 的版本 ${version}。`, !!o.yes, !!o.interactive);
|
|
625
|
-
output(await sdk.deleteVersion(id, version, {
|
|
626
|
-
replaceWith: o.replaceWith,
|
|
627
|
-
unpublish: o.unpublish,
|
|
628
|
-
purge: o.purge
|
|
629
|
-
}), o);
|
|
630
|
-
});
|
|
631
|
-
versions.command("restore <id> <version>").action(async (id, version, _local, command) => {
|
|
632
|
-
const o = options(command);
|
|
633
|
-
output(await (await client(o)).restoreVersion(id, version), o);
|
|
634
|
-
});
|
|
635
|
-
cli.command("rollback <id>").requiredOption("--to <version>").option("--no-wait").action(async (id, _local, command) => {
|
|
636
|
-
const o = options(command), result = await (await client(o)).rollback(id, o.to ?? "", { wait: o.wait });
|
|
637
|
-
output(result, o);
|
|
638
|
-
if (result.status !== "ready") process.exitCode = 6;
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
//#endregion
|
|
642
|
-
//#region src/program.ts
|
|
643
|
-
function buildCLI() {
|
|
644
|
-
const cli = createCommand();
|
|
645
|
-
registerAccounts(cli);
|
|
646
|
-
registerPublish(cli);
|
|
647
|
-
registerPages(cli);
|
|
648
|
-
registerVersions(cli);
|
|
649
|
-
registerTransfer(cli);
|
|
650
|
-
registerStats(cli);
|
|
651
|
-
const configure = (command) => {
|
|
652
|
-
command.enablePositionalOptions();
|
|
653
|
-
for (const option of cli.options) {
|
|
654
|
-
if (option.long === "--version" || command.options.some((local) => local.long === option.long)) continue;
|
|
655
|
-
command.addOption(new Option(option.flags, option.description));
|
|
656
|
-
}
|
|
657
|
-
for (const child of command.commands) configure(child);
|
|
658
|
-
};
|
|
659
|
-
configure(cli);
|
|
660
|
-
return cli;
|
|
661
|
-
}
|
|
662
|
-
//#endregion
|
|
663
|
-
//#region src/index.ts
|
|
664
|
-
const cli = buildCLI();
|
|
665
|
-
try {
|
|
666
|
-
await cli.parseAsync();
|
|
667
|
-
} catch (error) {
|
|
668
|
-
if (error instanceof CommanderError && error.exitCode === 0) process.exitCode = 0;
|
|
669
|
-
else {
|
|
670
|
-
const e = error instanceof AppError ? error : new AppError("CLI_ERROR", error instanceof Error ? error.message : "命令执行失败");
|
|
671
|
-
const result = {
|
|
672
|
-
code: e.code,
|
|
673
|
-
message: e.message,
|
|
674
|
-
fields: e.fields
|
|
675
|
-
};
|
|
676
|
-
if (process.argv.includes("--json")) process.stdout.write(`${JSON.stringify({ error: result })}\n`);
|
|
677
|
-
else process.stderr.write(`${e.code}: ${e.message}\n`);
|
|
678
|
-
process.exitCode = e.status === 401 || e.status === 403 ? 3 : e.status === 409 ? 4 : e.status >= 500 ? 5 : 2;
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
//#endregion
|
|
682
|
-
export {};
|
|
2
|
+
import{i as e,t}from"./rolldown-runtime-Csi-cuKc.mjs";import{t as n}from"./dist-BQU5lE8l.mjs";import{i as r,n as i,t as a}from"./package-Dtp2swhT.mjs";import{spawn as o}from"node:child_process";import{delimiter as s,dirname as c,join as l}from"node:path";import{createHash as u,randomUUID as d}from"node:crypto";import{access as f,mkdir as p,mkdtemp as m,readFile as h,readdir as g,rename as _,rm as v,writeFile as y}from"node:fs/promises";import{homedir as b,tmpdir as x}from"node:os";const S={UPDATE_CHECK_FAILED:`检查网络、npm registry 和认证配置后重试;所有命令都必须先完成更新检查`,UPDATE_INSTALL_FAILED:`检查网络、npm 配置与用户缓存目录权限后重试`,UPDATE_EXEC_FAILED:`检查 Node.js 和用户缓存目录权限后重试`,LOGIN_REQUIRED:`先运行 share-pages login --server https://你的实例域名`,SERVER_REQUIRED:`添加 --server https://你的实例域名,或为已有 profile 重新登录`,INVALID_SERVER:`--server 只填写 origin,例如 https://pages.example.com`,INSECURE_SERVER:`远程实例必须使用 HTTPS;只有 localhost 可以使用 HTTP`,TOKEN_REQUIRED:`在后台创建发布 Token,然后重新登录`,INVALID_PAGE_ID:`页面 ID 使用 3–40 位小写字母、数字或连字符,并避开系统保留名称`,INVALID_PROFILE:`例如使用 default、production 或 team_docs`,INVALID_UPLOAD_ID:`复制上传开始时 CLI 输出的完整会话 ID`,INVALID_DATE:`例如使用 2026-09-10`,INVALID_DATE_RANGE:`交换起止日期,确保 --from 不晚于 --to`,INVALID_LIMIT:`将 --limit 设置为 1–100 的整数`,INVALID_TIMEOUT:`将 --timeout 设置为 1–3600 的整数秒数`,ID_REQUIRED:`添加 --id <已有页面 ID>,或去掉 --update 创建新页面`,TYPE_REQUIRED:`stdin 没有文件名;添加 --type markdown、html、latex、epub、csv 或 zip`,INVALID_INDEX_POLICY:`改用 --access public,或移除 --indexable`,INPUT_REQUIRED:`自动化环境请使用 --token-stdin、--password-file 或对应环境变量`,CONFIRMATION_REQUIRED:`确认目标无误后添加 --yes;永久删除无法恢复`,ID_EXISTS:`若要为已有页面创建新版本,请保持相同 --id 并添加 --update`,PAGE_NOT_FOUND:`运行 share-pages pages list 查找可用页面 ID`,VERSION_NOT_FOUND:`运行 share-pages versions list <页面 ID> 查找版本 ID`,RESUME_MISMATCH:`使用创建该会话时相同的文件和实例,或去掉 --resume 开始新上传`,INVALID_RESUME_STATE:`去掉 --resume 开始新上传;损坏状态不会影响服务端已有内容`,NETWORK_ERROR:`检查网络和实例地址后重试;已有上传会话可用 --resume 继续`,REQUEST_TIMEOUT:`可增大 --timeout,或用 --no-wait 后运行 share-pages uploads <上传 ID>`,OUTPUT_EXISTS:`换一个 --output 路径;CLI 不会覆盖已有文件`,INPUT_NOT_FOUND:`检查输入路径、--password-file 或 --resume 的值是否正确`,PERMISSION_DENIED:`检查文件权限以及当前目录是否可读写`,CONFIG_ERROR:`修复或移走配置文件后重新登录;默认位置为 ~/.config/share-pages/config.json`,INSECURE_SECRET_FILE:`秘密文件只能由当前用户读写,建议设置为 chmod 600`,INVALID_PASSWORD:`换用 8–256 位页面密码后重试`,PASSWORD_ACCESS_CONFLICT:`使用 --access password,或移除 --password-file`,EMPTY_PATCH:`运行 share-pages pages edit --help 查看可修改字段`,OUTPUT_CONFLICT:`只选择一种 stdout 输出格式后重试`};function C(e){let t=e.path?`:${e.path}`:``;if(e.code===`EEXIST`)return new n(`OUTPUT_EXISTS`,`目标文件已存在${t}`);if(e.code===`ENOENT`)return new n(`INPUT_NOT_FOUND`,`找不到文件或目录${t}`);if(e.code===`EACCES`||e.code===`EPERM`)return new n(`PERMISSION_DENIED`,`没有文件访问权限${t}`,403)}function w(e){return e instanceof r&&(e.exitCode===0||[`commander.help`,`commander.helpDisplayed`].includes(e.code))}function T(e){if(e instanceof r)return{code:`CLI_USAGE`,message:e.message.replace(/^error:\s*/i,``).trim().replace(/^unknown command /i,`未知命令 `).replace(/^unknown option /i,`未知选项 `).replace(/^missing required argument /i,`缺少必填参数 `).replace(/^too many arguments\./i,`参数过多。`).replace(/\(Did you mean (.+)\?\)/i,`你可能想输入 $1。`),status:400,hint:`运行 share-pages --help,或 share-pages <命令> --help 查看示例`};let t=(e instanceof n?e:C(e))??new n(`CLI_ERROR`,e instanceof Error?e.message:`命令执行失败;请重试或使用 --help 检查参数`);return{code:t.code,message:t.message,status:t.status,fields:t.fields,requestId:t.requestId,hint:S[t.code]}}function E(e){return e.code===`UPDATE_INTERRUPTED`?130:e.status===401||e.status===403?3:e.status===409?4:e.status>=500?5:2}function D(e,t){if(t){let{status:t,...n}=e;process.stdout.write(`${JSON.stringify({error:n})}\n`);return}process.stderr.write(`错误 [${i(e.code)}]: ${i(e.message,!0)}\n`),e.requestId&&process.stderr.write(`请求 ID: ${i(e.requestId)}\n`),e.hint&&process.stderr.write(`下一步: ${i(e.hint)}\n`)}function O(e){let t=e.indexOf(`--`),n=t===-1?e:e.slice(0,t);return n.includes(`--json`)||n.includes(`-j`)}var k=t(((e,t)=>{t.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:16,MAX_SAFE_BUILD_LENGTH:250,MAX_SAFE_INTEGER:2**53-1||9007199254740991,RELEASE_TYPES:[`major`,`premajor`,`minor`,`preminor`,`patch`,`prepatch`,`prerelease`],SEMVER_SPEC_VERSION:`2.0.0`,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}})),A=t(((e,t)=>{t.exports=typeof process==`object`&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...e)=>console.error(`SEMVER`,...e):()=>{}})),j=t(((e,t)=>{let{MAX_SAFE_COMPONENT_LENGTH:n,MAX_SAFE_BUILD_LENGTH:r,MAX_LENGTH:i}=k(),a=A();e=t.exports={};let o=e.re=[],s=e.safeRe=[],c=e.src=[],l=e.safeSrc=[],u=e.t={},d=0,f=`[a-zA-Z0-9-]`,p=[[`\\s`,1],[`\\d`,i],[f,r]],m=e=>{for(let[t,n]of p)e=e.split(`${t}*`).join(`${t}{0,${n}}`).split(`${t}+`).join(`${t}{1,${n}}`);return e},h=(e,t,n)=>{let r=m(t),i=d++;a(e,i,t),u[e]=i,c[i]=t,l[i]=r,o[i]=new RegExp(t,n?`g`:void 0),s[i]=new RegExp(r,n?`g`:void 0)};h(`NUMERICIDENTIFIER`,`0|[1-9]\\d*`),h(`NUMERICIDENTIFIERLOOSE`,`\\d+`),h(`NONNUMERICIDENTIFIER`,`\\d*[a-zA-Z-]${f}*`),h(`MAINVERSION`,`(${c[u.NUMERICIDENTIFIER]})\\.(${c[u.NUMERICIDENTIFIER]})\\.(${c[u.NUMERICIDENTIFIER]})`),h(`MAINVERSIONLOOSE`,`(${c[u.NUMERICIDENTIFIERLOOSE]})\\.(${c[u.NUMERICIDENTIFIERLOOSE]})\\.(${c[u.NUMERICIDENTIFIERLOOSE]})`),h(`PRERELEASEIDENTIFIER`,`(?:${c[u.NONNUMERICIDENTIFIER]}|${c[u.NUMERICIDENTIFIER]})`),h(`PRERELEASEIDENTIFIERLOOSE`,`(?:${c[u.NONNUMERICIDENTIFIER]}|${c[u.NUMERICIDENTIFIERLOOSE]})`),h(`PRERELEASE`,`(?:-(${c[u.PRERELEASEIDENTIFIER]}(?:\\.${c[u.PRERELEASEIDENTIFIER]})*))`),h(`PRERELEASELOOSE`,`(?:-?(${c[u.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${c[u.PRERELEASEIDENTIFIERLOOSE]})*))`),h(`BUILDIDENTIFIER`,`${f}+`),h(`BUILD`,`(?:\\+(${c[u.BUILDIDENTIFIER]}(?:\\.${c[u.BUILDIDENTIFIER]})*))`),h(`FULLPLAIN`,`v?${c[u.MAINVERSION]}${c[u.PRERELEASE]}?${c[u.BUILD]}?`),h(`FULL`,`^${c[u.FULLPLAIN]}$`),h(`LOOSEPLAIN`,`[v=\\s]*${c[u.MAINVERSIONLOOSE]}${c[u.PRERELEASELOOSE]}?${c[u.BUILD]}?`),h(`LOOSE`,`^${c[u.LOOSEPLAIN]}$`),h(`GTLT`,`((?:<|>)?=?)`),h(`XRANGEIDENTIFIERLOOSE`,`${c[u.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),h(`XRANGEIDENTIFIER`,`${c[u.NUMERICIDENTIFIER]}|x|X|\\*`),h(`XRANGEPLAIN`,`[v=\\s]*(${c[u.XRANGEIDENTIFIER]})(?:\\.(${c[u.XRANGEIDENTIFIER]})(?:\\.(${c[u.XRANGEIDENTIFIER]})(?:${c[u.PRERELEASE]})?${c[u.BUILD]}?)?)?`),h(`XRANGEPLAINLOOSE`,`[v=\\s]*(${c[u.XRANGEIDENTIFIERLOOSE]})(?:\\.(${c[u.XRANGEIDENTIFIERLOOSE]})(?:\\.(${c[u.XRANGEIDENTIFIERLOOSE]})(?:${c[u.PRERELEASELOOSE]})?${c[u.BUILD]}?)?)?`),h(`XRANGE`,`^${c[u.GTLT]}\\s*${c[u.XRANGEPLAIN]}$`),h(`XRANGELOOSE`,`^${c[u.GTLT]}\\s*${c[u.XRANGEPLAINLOOSE]}$`),h(`COERCEPLAIN`,`(^|[^\\d])(\\d{1,${n}})(?:\\.(\\d{1,${n}}))?(?:\\.(\\d{1,${n}}))?`),h(`COERCE`,`${c[u.COERCEPLAIN]}(?:$|[^\\d])`),h(`COERCEFULL`,c[u.COERCEPLAIN]+`(?:${c[u.PRERELEASE]})?(?:${c[u.BUILD]})?(?:$|[^\\d])`),h(`COERCERTL`,c[u.COERCE],!0),h(`COERCERTLFULL`,c[u.COERCEFULL],!0),h(`LONETILDE`,`(?:~>?)`),h(`TILDETRIM`,`(\\s*)${c[u.LONETILDE]}\\s+`,!0),e.tildeTrimReplace=`$1~`,h(`TILDE`,`^${c[u.LONETILDE]}${c[u.XRANGEPLAIN]}$`),h(`TILDELOOSE`,`^${c[u.LONETILDE]}${c[u.XRANGEPLAINLOOSE]}$`),h(`LONECARET`,`(?:\\^)`),h(`CARETTRIM`,`(\\s*)${c[u.LONECARET]}\\s+`,!0),e.caretTrimReplace=`$1^`,h(`CARET`,`^${c[u.LONECARET]}${c[u.XRANGEPLAIN]}$`),h(`CARETLOOSE`,`^${c[u.LONECARET]}${c[u.XRANGEPLAINLOOSE]}$`),h(`COMPARATORLOOSE`,`^${c[u.GTLT]}\\s*(${c[u.LOOSEPLAIN]})$|^$`),h(`COMPARATOR`,`^${c[u.GTLT]}\\s*(${c[u.FULLPLAIN]})$|^$`),h(`COMPARATORTRIM`,`(\\s*)${c[u.GTLT]}\\s*(${c[u.LOOSEPLAIN]}|${c[u.XRANGEPLAIN]})`,!0),e.comparatorTrimReplace=`$1$2$3`,h(`HYPHENRANGE`,`^\\s*(${c[u.XRANGEPLAIN]})\\s+-\\s+(${c[u.XRANGEPLAIN]})\\s*$`),h(`HYPHENRANGELOOSE`,`^\\s*(${c[u.XRANGEPLAINLOOSE]})\\s+-\\s+(${c[u.XRANGEPLAINLOOSE]})\\s*$`),h(`STAR`,`(<|>)?=?\\s*\\*`),h(`GTE0`,`^\\s*>=\\s*0\\.0\\.0\\s*$`),h(`GTE0PRE`,`^\\s*>=\\s*0\\.0\\.0-0\\s*$`)})),M=t(((e,t)=>{let n=Object.freeze({loose:!0}),r=Object.freeze({});t.exports=e=>e?typeof e==`object`?e:n:r})),N=t(((e,t)=>{let n=/^[0-9]+$/,r=(e,t)=>{if(typeof e==`number`&&typeof t==`number`)return e===t?0:e<t?-1:1;let r=n.test(e),i=n.test(t);return r&&i&&(e=+e,t=+t),e===t?0:r&&!i?-1:i&&!r?1:e<t?-1:1};t.exports={compareIdentifiers:r,rcompareIdentifiers:(e,t)=>r(t,e)}})),P=t(((e,t)=>{let n=A(),{MAX_LENGTH:r,MAX_SAFE_INTEGER:i}=k(),{safeRe:a,t:o}=j(),s=M(),{compareIdentifiers:c}=N(),l=(e,t)=>{let n=t.split(`.`);if(n.length>e.length)return!1;for(let t=0;t<n.length;t++)if(c(e[t],n[t])!==0)return!1;return!0};t.exports=class e{constructor(t,c){if(c=s(c),t instanceof e){if(t.loose===!!c.loose&&t.includePrerelease===!!c.includePrerelease)return t;t=t.version}else if(typeof t!=`string`)throw TypeError(`Invalid version. Must be a string. Got type "${typeof t}".`);if(t.length>r)throw TypeError(`version is longer than ${r} characters`);n(`SemVer`,t,c),this.options=c,this.loose=!!c.loose,this.includePrerelease=!!c.includePrerelease;let l=t.trim().match(c.loose?a[o.LOOSE]:a[o.FULL]);if(!l)throw TypeError(`Invalid Version: ${t}`);if(this.raw=t,this.major=+l[1],this.minor=+l[2],this.patch=+l[3],this.major>i||this.major<0)throw TypeError(`Invalid major version`);if(this.minor>i||this.minor<0)throw TypeError(`Invalid minor version`);if(this.patch>i||this.patch<0)throw TypeError(`Invalid patch version`);this.prerelease=l[4]?l[4].split(`.`).map(e=>{if(/^[0-9]+$/.test(e)){let t=+e;if(t>=0&&t<i)return t}return e}):[],this.build=l[5]?l[5].split(`.`):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(`.`)}`),this.version}toString(){return this.version}compare(t){if(n(`SemVer.compare`,this.version,this.options,t),!(t instanceof e)){if(typeof t==`string`&&t===this.version)return 0;t=new e(t,this.options)}return t.version===this.version?0:this.compareMain(t)||this.comparePre(t)}compareMain(t){return t instanceof e||(t=new e(t,this.options)),this.major<t.major?-1:this.major>t.major?1:this.minor<t.minor?-1:this.minor>t.minor?1:this.patch<t.patch?-1:+(this.patch>t.patch)}comparePre(t){if(t instanceof e||(t=new e(t,this.options)),this.prerelease.length&&!t.prerelease.length)return-1;if(!this.prerelease.length&&t.prerelease.length)return 1;if(!this.prerelease.length&&!t.prerelease.length)return 0;let r=0;do{let e=this.prerelease[r],i=t.prerelease[r];if(n(`prerelease compare`,r,e,i),e===void 0&&i===void 0)return 0;if(i===void 0)return 1;if(e===void 0)return-1;if(e!==i)return c(e,i)}while(++r)}compareBuild(t){t instanceof e||(t=new e(t,this.options));let r=0;do{let e=this.build[r],i=t.build[r];if(n(`build compare`,r,e,i),e===void 0&&i===void 0)return 0;if(i===void 0)return 1;if(e===void 0)return-1;if(e!==i)return c(e,i)}while(++r)}inc(e,t,n){if(e.startsWith(`pre`)){if(!t&&n===!1)throw Error(`invalid increment argument: identifier is empty`);if(t){let e=`-${t}`.match(this.options.loose?a[o.PRERELEASELOOSE]:a[o.PRERELEASE]);if(!e||e[1]!==t)throw Error(`invalid identifier: ${t}`)}}switch(e){case`premajor`:this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(`pre`,t,n);break;case`preminor`:this.prerelease.length=0,this.patch=0,this.minor++,this.inc(`pre`,t,n);break;case`prepatch`:this.prerelease.length=0,this.inc(`patch`,t,n),this.inc(`pre`,t,n);break;case`prerelease`:this.prerelease.length===0&&this.inc(`patch`,t,n),this.inc(`pre`,t,n);break;case`release`:if(this.prerelease.length===0)throw Error(`version ${this.raw} is not a prerelease`);this.prerelease.length=0;break;case`major`:(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case`minor`:(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case`patch`:this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case`pre`:{let e=+!!Number(n);if(this.prerelease.length===0)this.prerelease=[e];else{let r=this.prerelease.length;for(;--r>=0;)typeof this.prerelease[r]==`number`&&(this.prerelease[r]++,r=-2);if(r===-1){if(t===this.prerelease.join(`.`)&&n===!1)throw Error(`invalid increment argument: identifier already exists`);this.prerelease.push(e)}}if(t){let r=[t,e];if(n===!1&&(r=[t]),l(this.prerelease,t)){let e=this.prerelease[t.split(`.`).length];isNaN(e)&&(this.prerelease=r)}else this.prerelease=r}break}default:throw Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(`.`)}`),this}}})),F=t(((e,t)=>{let n=P();t.exports=(e,t,r=!1)=>{if(e instanceof n)return e;try{return new n(e,t)}catch(e){if(!r)return null;throw e}}})),I=t(((e,t)=>{let n=F();t.exports=(e,t)=>{let r=n(e,t);return r?r.version:null}})),L=t(((e,t)=>{let n=F();t.exports=(e,t)=>{let r=n(e.trim().replace(/^[=v]+/,``),t);return r?r.version:null}})),ee=t(((e,t)=>{let n=P();t.exports=(e,t,r,i,a)=>{typeof r==`string`&&(a=i,i=r,r=void 0);try{return new n(e instanceof n?e.version:e,r).inc(t,i,a).version}catch{return null}}})),te=t(((e,t)=>{let n=F();t.exports=(e,t)=>{let r=n(e,null,!0),i=n(t,null,!0),a=r.compare(i);if(a===0)return null;let o=a>0,s=o?r:i,c=o?i:r,l=!!s.prerelease.length;if(c.prerelease.length&&!l){if(!c.patch&&!c.minor)return`major`;if(c.compareMain(s)===0)return c.minor&&!c.patch?`minor`:`patch`}let u=l?`pre`:``;return r.major===i.major?r.minor===i.minor?r.patch===i.patch?`prerelease`:u+`patch`:u+`minor`:u+`major`}})),ne=t(((e,t)=>{let n=P();t.exports=(e,t)=>new n(e,t).major})),re=t(((e,t)=>{let n=P();t.exports=(e,t)=>new n(e,t).minor})),ie=t(((e,t)=>{let n=P();t.exports=(e,t)=>new n(e,t).patch})),ae=t(((e,t)=>{let n=F();t.exports=(e,t)=>{let r=n(e,t);return r&&r.prerelease.length?r.prerelease:null}})),R=t(((e,t)=>{let n=P();t.exports=(e,t,r)=>new n(e,r).compare(new n(t,r))})),oe=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(t,e,r)})),se=t(((e,t)=>{let n=R();t.exports=(e,t)=>n(e,t,!0)})),z=t(((e,t)=>{let n=P();t.exports=(e,t,r)=>{let i=new n(e,r),a=new n(t,r);return i.compare(a)||i.compareBuild(a)}})),ce=t(((e,t)=>{let n=z();t.exports=(e,t)=>e.sort((e,r)=>n(e,r,t))})),le=t(((e,t)=>{let n=z();t.exports=(e,t)=>e.sort((e,r)=>n(r,e,t))})),B=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(e,t,r)>0})),V=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(e,t,r)<0})),H=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(e,t,r)===0})),U=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(e,t,r)!==0})),W=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(e,t,r)>=0})),G=t(((e,t)=>{let n=R();t.exports=(e,t,r)=>n(e,t,r)<=0})),K=t(((e,t)=>{let n=H(),r=U(),i=B(),a=W(),o=V(),s=G();t.exports=(e,t,c,l)=>{switch(t){case`===`:return typeof e==`object`&&(e=e.version),typeof c==`object`&&(c=c.version),e===c;case`!==`:return typeof e==`object`&&(e=e.version),typeof c==`object`&&(c=c.version),e!==c;case``:case`=`:case`==`:return n(e,c,l);case`!=`:return r(e,c,l);case`>`:return i(e,c,l);case`>=`:return a(e,c,l);case`<`:return o(e,c,l);case`<=`:return s(e,c,l);default:throw TypeError(`Invalid operator: ${t}`)}}})),ue=t(((e,t)=>{let n=P(),r=F(),{safeRe:i,t:a}=j();t.exports=(e,t)=>{if(e instanceof n)return e;if(typeof e==`number`&&(e=String(e)),typeof e!=`string`)return null;t||={};let o=null;if(!t.rtl)o=e.match(t.includePrerelease?i[a.COERCEFULL]:i[a.COERCE]);else{let n=t.includePrerelease?i[a.COERCERTLFULL]:i[a.COERCERTL],r;for(;(r=n.exec(e))&&(!o||o.index+o[0].length!==e.length);)(!o||r.index+r[0].length!==o.index+o[0].length)&&(o=r),n.lastIndex=r.index+r[1].length+r[2].length;n.lastIndex=-1}if(o===null)return null;let s=o[2],c=o[3]||`0`,l=o[4]||`0`,u=t.includePrerelease&&o[5]?`-${o[5]}`:``,d=t.includePrerelease&&o[6]?`+${o[6]}`:``;return r(`${s}.${c}.${l}${u}${d}`,t)}})),de=t(((e,t)=>{let n=F(),r=k(),i=P(),a=(e,t,n)=>{if(!r.RELEASE_TYPES.includes(t))return null;let i=o(e,n);return i&&s(i,t)},o=(e,t)=>{let r=e instanceof i?e.version:e;return n(r,t)},s=(e,t)=>{if(c(t))return e.version;switch(e.prerelease=[],t){case`major`:e.minor=0,e.patch=0;break;case`minor`:e.patch=0}return e.format()},c=e=>e.startsWith(`pre`);t.exports=a})),fe=t(((e,t)=>{t.exports=class{constructor(){this.max=1e3,this.map=new Map}get(e){let t=this.map.get(e);if(t!==void 0)return this.map.delete(e),this.map.set(e,t),t}delete(e){return this.map.delete(e)}set(e,t){if(!this.delete(e)&&t!==void 0){if(this.map.size>=this.max){let e=this.map.keys().next().value;this.delete(e)}this.map.set(e,t)}return this}}})),q=t(((e,t)=>{let n=/\s+/g;t.exports=class e{constructor(t,r){if(r=i(r),t instanceof e)return t.loose===!!r.loose&&t.includePrerelease===!!r.includePrerelease?t:new e(t.raw,r);if(t instanceof a)return this.raw=t.value,this.set=[[t]],this.formatted=void 0,this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=t.trim().replace(n,` `),this.set=this.raw.split(`||`).map(e=>this.parseRange(e.trim())).filter(e=>e.length),!this.set.length)throw TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let e=this.set[0];if(this.set=this.set.filter(e=>!_(e[0])),this.set.length===0)this.set=[e];else if(this.set.length>1){for(let e of this.set)if(e.length===1&&v(e[0])){this.set=[e];break}}}this.formatted=void 0}get range(){if(this.formatted===void 0){this.formatted=``;for(let e=0;e<this.set.length;e++){e>0&&(this.formatted+=`||`);let t=this.set[e];for(let e=0;e<t.length;e++)e>0&&(this.formatted+=` `),this.formatted+=t[e].toString().trim()}}return this.formatted}format(){return this.range}toString(){return this.range}parseRange(e){e=e.replace(g,``);let t=((this.options.includePrerelease&&m)|(this.options.loose&&h))+`:`+e,n=r.get(t);if(n)return n;let i=this.options.loose,s=i?c[u.HYPHENRANGELOOSE]:c[u.HYPHENRANGE];e=e.replace(s,I(this.options.includePrerelease)),o(`hyphen replace`,e),e=e.replace(c[u.COMPARATORTRIM],d),o(`comparator trim`,e),e=e.replace(c[u.TILDETRIM],f),o(`tilde trim`,e),e=e.replace(c[u.CARETTRIM],p),o(`caret trim`,e);let l=e.split(` `).map(e=>b(e,this.options)).join(` `).split(/\s+/).map(e=>F(e,this.options));i&&(l=l.filter(e=>(o(`loose invalid filter`,e,this.options),!!e.match(c[u.COMPARATORLOOSE])))),o(`range list`,l);let v=new Map,y=l.map(e=>new a(e,this.options));for(let e of y){if(_(e))return[e];v.set(e.value,e)}v.size>1&&v.has(``)&&v.delete(``);let x=[...v.values()];return r.set(t,x),x}intersects(t,n){if(!(t instanceof e))throw TypeError(`a Range is required`);return this.set.some(e=>y(e,n)&&t.set.some(t=>y(t,n)&&e.every(e=>t.every(t=>e.intersects(t,n)))))}test(e){if(!e)return!1;if(typeof e==`string`)try{e=new s(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(L(this.set[t],e,this.options))return!0;return!1}};let r=new(fe()),i=M(),a=J(),o=A(),s=P(),{safeRe:c,src:l,t:u,comparatorTrimReplace:d,tildeTrimReplace:f,caretTrimReplace:p}=j(),{FLAG_INCLUDE_PRERELEASE:m,FLAG_LOOSE:h}=k(),g=new RegExp(l[u.BUILD],`g`),_=e=>e.value===`<0.0.0-0`,v=e=>e.value===``,y=(e,t)=>{let n=!0,r=e.slice(),i=r.pop();for(;n&&r.length;)n=r.every(e=>i.intersects(e,t)),i=r.pop();return n},b=(e,t)=>(e=e.replace(c[u.BUILD],``),o(`comp`,e,t),e=T(e,t),o(`caret`,e),e=C(e,t),o(`tildes`,e),e=D(e,t),o(`xrange`,e),e=N(e,t),o(`stars`,e),e),x=e=>!e||e.toLowerCase()===`x`||e===`*`,S=(e,t,n)=>x(e)&&!x(t)||x(t)&&n&&!x(n),C=(e,t)=>e.trim().split(/\s+/).map(e=>w(e,t)).join(` `),w=(e,t)=>{let n=t.loose?c[u.TILDELOOSE]:c[u.TILDE],r=t.includePrerelease?`-0`:``;return e.replace(n,(t,n,i,a,s)=>{o(`tilde`,e,t,n,i,a,s);let c;return x(n)?c=``:x(i)?c=`>=${n}.0.0${r} <${+n+1}.0.0-0`:x(a)?c=`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:s?(o(`replaceTilde pr`,s),c=`>=${n}.${i}.${a}-${s} <${n}.${+i+1}.0-0`):c=`>=${n}.${i}.${a} <${n}.${+i+1}.0-0`,o(`tilde return`,c),c})},T=(e,t)=>e.trim().split(/\s+/).map(e=>E(e,t)).join(` `),E=(e,t)=>{o(`caret`,e,t);let n=t.loose?c[u.CARETLOOSE]:c[u.CARET],r=t.includePrerelease?`-0`:``;return e.replace(n,(t,n,i,a,s)=>{o(`caret`,e,t,n,i,a,s);let c;return x(n)?c=``:x(i)?c=`>=${n}.0.0${r} <${+n+1}.0.0-0`:x(a)?c=n===`0`?`>=${n}.${i}.0${r} <${n}.${+i+1}.0-0`:`>=${n}.${i}.0${r} <${+n+1}.0.0-0`:s?(o(`replaceCaret pr`,s),c=n===`0`?i===`0`?`>=${n}.${i}.${a}-${s} <${n}.${i}.${+a+1}-0`:`>=${n}.${i}.${a}-${s} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${a}-${s} <${+n+1}.0.0-0`):(o(`no pr`),c=n===`0`?i===`0`?`>=${n}.${i}.${a} <${n}.${i}.${+a+1}-0`:`>=${n}.${i}.${a} <${n}.${+i+1}.0-0`:`>=${n}.${i}.${a} <${+n+1}.0.0-0`),o(`caret return`,c),c})},D=(e,t)=>(o(`replaceXRanges`,e,t),e.split(/\s+/).map(e=>O(e,t)).join(` `)),O=(e,t)=>{e=e.trim();let n=t.loose?c[u.XRANGELOOSE]:c[u.XRANGE];return e.replace(n,(n,r,i,a,s,c)=>{if(o(`xRange`,e,n,r,i,a,s,c),S(i,a,s))return e;let l=x(i),u=l||x(a),d=u||x(s),f=d;return r===`=`&&f&&(r=``),c=t.includePrerelease?`-0`:``,l?n=r===`>`||r===`<`?`<0.0.0-0`:`*`:r&&f?(u&&(a=0),s=0,r===`>`?(r=`>=`,u?(i=+i+1,a=0,s=0):(a=+a+1,s=0)):r===`<=`&&(r=`<`,u?i=+i+1:a=+a+1),r===`<`&&(c=`-0`),n=`${r+i}.${a}.${s}${c}`):u?n=`>=${i}.0.0${c} <${+i+1}.0.0-0`:d&&(n=`>=${i}.${a}.0${c} <${i}.${+a+1}.0-0`),o(`xRange return`,n),n})},N=(e,t)=>(o(`replaceStars`,e,t),e.trim().replace(c[u.STAR],``)),F=(e,t)=>(o(`replaceGTE0`,e,t),e.trim().replace(c[t.includePrerelease?u.GTE0PRE:u.GTE0],``)),I=e=>(t,n,r,i,a,o,s,c,l,u,d,f)=>(n=x(r)?``:x(i)?`>=${r}.0.0${e?`-0`:``}`:x(a)?`>=${r}.${i}.0${e?`-0`:``}`:o?`>=${n}`:`>=${n}${e?`-0`:``}`,c=x(l)?``:x(u)?`<${+l+1}.0.0-0`:x(d)?`<${l}.${+u+1}.0-0`:f?`<=${l}.${u}.${d}-${f}`:e?`<${l}.${u}.${+d+1}-0`:`<=${c}`,`${n} ${c}`.trim()),L=(e,t,n)=>{for(let n=0;n<e.length;n++)if(!e[n].test(t))return!1;if(t.prerelease.length&&!n.includePrerelease){for(let n=0;n<e.length;n++)if(o(e[n].semver),e[n].semver!==a.ANY&&e[n].semver.prerelease.length>0){let r=e[n].semver;if(r.major===t.major&&r.minor===t.minor&&r.patch===t.patch)return!0}return!1}return!0}})),J=t(((e,t)=>{let n=Symbol(`SemVer ANY`);t.exports=class e{static get ANY(){return n}constructor(t,i){if(i=r(i),t instanceof e){if(t.loose===!!i.loose)return t;t=t.value}t=t.trim().split(/\s+/).join(` `),s(`comparator`,t,i),this.options=i,this.loose=!!i.loose,this.parse(t),this.value=this.semver===n?``:this.operator+this.semver.version,s(`comp`,this)}parse(e){let t=this.options.loose?i[a.COMPARATORLOOSE]:i[a.COMPARATOR],r=e.match(t);if(!r)throw TypeError(`Invalid comparator: ${e}`);this.operator=r[1]===void 0?``:r[1],this.operator===`=`&&(this.operator=``),this.semver=r[2]?new c(r[2],this.options.loose):n}toString(){return this.value}test(e){if(s(`Comparator.test`,e,this.options.loose),this.semver===n||e===n)return!0;if(typeof e==`string`)try{e=new c(e,this.options)}catch{return!1}return o(e,this.operator,this.semver,this.options)}intersects(t,n){if(!(t instanceof e))throw TypeError(`a Comparator is required`);return this.operator===``?this.value===``||new l(t.value,n).test(this.value):t.operator===``?t.value===``||new l(this.value,n).test(t.semver):(n=r(n),n.includePrerelease&&(this.value===`<0.0.0-0`||t.value===`<0.0.0-0`)||!n.includePrerelease&&(this.value.startsWith(`<0.0.0`)||t.value.startsWith(`<0.0.0`))?!1:!!(this.operator.startsWith(`>`)&&t.operator.startsWith(`>`)||this.operator.startsWith(`<`)&&t.operator.startsWith(`<`)||this.semver.version===t.semver.version&&this.operator.includes(`=`)&&t.operator.includes(`=`)||o(this.semver,`<`,t.semver,n)&&this.operator.startsWith(`>`)&&t.operator.startsWith(`<`)||o(this.semver,`>`,t.semver,n)&&this.operator.startsWith(`<`)&&t.operator.startsWith(`>`)))}};let r=M(),{safeRe:i,t:a}=j(),o=K(),s=A(),c=P(),l=q()})),Y=t(((e,t)=>{let n=q();t.exports=(e,t,r)=>{try{t=new n(t,r)}catch{return!1}return t.test(e)}})),pe=t(((e,t)=>{let n=q();t.exports=(e,t)=>new n(e,t).set.map(e=>e.map(e=>e.value).join(` `).trim().split(` `))})),me=t(((e,t)=>{let n=P(),r=q();t.exports=(e,t,i)=>{let a=null,o=null,s=null;try{s=new r(t,i)}catch{return null}return e.forEach(e=>{s.test(e)&&(!a||o.compare(e)===-1)&&(a=e,o=new n(a,i))}),a}})),he=t(((e,t)=>{let n=P(),r=q();t.exports=(e,t,i)=>{let a=null,o=null,s=null;try{s=new r(t,i)}catch{return null}return e.forEach(e=>{s.test(e)&&(!a||o.compare(e)===1)&&(a=e,o=new n(a,i))}),a}})),ge=t(((e,t)=>{let n=P(),r=q(),i=B();t.exports=(e,t)=>{e=new r(e,t);let a=new n(`0.0.0`);if(e.test(a)||(a=new n(`0.0.0-0`),e.test(a)))return a;a=null;for(let t=0;t<e.set.length;++t){let r=e.set[t],o=null;r.forEach(e=>{let t=new n(e.semver.version);switch(e.operator){case`>`:t.prerelease.length===0?t.patch++:t.prerelease.push(0),t.raw=t.format();case``:case`>=`:(!o||i(t,o))&&(o=t);break;case`<`:case`<=`:break;default:throw Error(`Unexpected operation: ${e.operator}`)}}),o&&(!a||i(a,o))&&(a=o)}return a&&e.test(a)?a:null}})),_e=t(((e,t)=>{let n=q();t.exports=(e,t)=>{try{return new n(e,t).range||`*`}catch{return null}}})),X=t(((e,t)=>{let n=P(),r=J(),{ANY:i}=r,a=q(),o=Y(),s=B(),c=V(),l=G(),u=W();t.exports=(e,t,d,f)=>{e=new n(e,f),t=new a(t,f);let p,m,h,g,_;switch(d){case`>`:p=s,m=l,h=c,g=`>`,_=`>=`;break;case`<`:p=c,m=u,h=s,g=`<`,_=`<=`;break;default:throw TypeError(`Must provide a hilo val of "<" or ">"`)}if(o(e,t,f))return!1;for(let n=0;n<t.set.length;++n){let a=t.set[n],o=null,s=null;if(a.forEach(e=>{e.semver===i&&(e=new r(`>=0.0.0`)),o||=e,s||=e,p(e.semver,o.semver,f)?o=e:h(e.semver,s.semver,f)&&(s=e)}),o.operator===g||o.operator===_||(!s.operator||s.operator===g)&&m(e,s.semver)||s.operator===_&&h(e,s.semver))return!1}return!0}})),ve=t(((e,t)=>{let n=X();t.exports=(e,t,r)=>n(e,t,`>`,r)})),ye=t(((e,t)=>{let n=X();t.exports=(e,t,r)=>n(e,t,`<`,r)})),be=t(((e,t)=>{let n=q();t.exports=(e,t,r)=>(e=new n(e,r),t=new n(t,r),e.intersects(t,r))})),xe=t(((e,t)=>{let n=Y(),r=R();t.exports=(e,t,i)=>{let a=[],o=null,s=null,c=e.sort((e,t)=>r(e,t,i));for(let e of c)n(e,t,i)?(s=e,o||=e):(s&&a.push([o,s]),s=null,o=null);o&&a.push([o,null]);let l=[];for(let[e,t]of a)e===t?l.push(e):!t&&e===c[0]?l.push(`*`):t?e===c[0]?l.push(`<=${t}`):l.push(`${e} - ${t}`):l.push(`>=${e}`);let u=l.join(` || `),d=typeof t.raw==`string`?t.raw:String(t);return u.length<d.length?u:t}})),Se=t(((e,t)=>{let n=q(),r=J(),{ANY:i}=r,a=Y(),o=R(),s=(e,t,r={})=>{if(e===t)return!0;e=new n(e,r),t=new n(t,r);let i=!1;OUTER:for(let n of e.set){for(let e of t.set){let t=u(n,e,r);if(i||=t!==null,t)continue OUTER}if(i)return!1}return!0},c=[new r(`>=0.0.0-0`)],l=[new r(`>=0.0.0`)],u=(e,t,n)=>{if(e===t)return!0;if(e.length===1&&e[0].semver===i){if(t.length===1&&t[0].semver===i)return!0;e=n.includePrerelease?c:l}if(t.length===1&&t[0].semver===i){if(n.includePrerelease)return!0;t=l}let r=new Set,s,u;for(let t of e)t.operator===`>`||t.operator===`>=`?s=d(s,t,n):t.operator===`<`||t.operator===`<=`?u=f(u,t,n):r.add(t.semver);if(r.size>1)return null;let p;if(s&&u&&(p=o(s.semver,u.semver,n),p>0||p===0&&(s.operator!==`>=`||u.operator!==`<=`)))return null;for(let e of r){if(s&&!a(e,String(s),n)||u&&!a(e,String(u),n))return null;for(let r of t)if(!a(e,String(r),n))return!1;return!0}let m,h,g,_,v=u&&!n.includePrerelease&&u.semver.prerelease.length?u.semver:!1,y=s&&!n.includePrerelease&&s.semver.prerelease.length?s.semver:!1;v&&v.prerelease.length===1&&u.operator===`<`&&v.prerelease[0]===0&&(v=!1);for(let e of t){if(_=_||e.operator===`>`||e.operator===`>=`,g=g||e.operator===`<`||e.operator===`<=`,s){if(y&&e.semver.prerelease&&e.semver.prerelease.length&&e.semver.major===y.major&&e.semver.minor===y.minor&&e.semver.patch===y.patch&&(y=!1),e.operator===`>`||e.operator===`>=`){if(m=d(s,e,n),m===e&&m!==s)return!1}else if(s.operator===`>=`&&!e.test(s.semver))return!1}if(u){if(v&&e.semver.prerelease&&e.semver.prerelease.length&&e.semver.major===v.major&&e.semver.minor===v.minor&&e.semver.patch===v.patch&&(v=!1),e.operator===`<`||e.operator===`<=`){if(h=f(u,e,n),h===e&&h!==u)return!1}else if(u.operator===`<=`&&!e.test(u.semver))return!1}if(!e.operator&&(u||s)&&p!==0)return!1}return!(s&&g&&!u&&p!==0||u&&_&&!s&&p!==0||y||v)},d=(e,t,n)=>{if(!e)return t;let r=o(e.semver,t.semver,n);return r>0?e:r<0||t.operator===`>`&&e.operator===`>=`?t:e},f=(e,t,n)=>{if(!e)return t;let r=o(e.semver,t.semver,n);return r<0?e:r>0||t.operator===`<`&&e.operator===`<=`?t:e};t.exports=s})),Z=e(t(((e,t)=>{let n=j(),r=k(),i=P(),a=N();t.exports={parse:F(),valid:I(),clean:L(),inc:ee(),diff:te(),major:ne(),minor:re(),patch:ie(),prerelease:ae(),compare:R(),rcompare:oe(),compareLoose:se(),compareBuild:z(),sort:ce(),rsort:le(),gt:B(),lt:V(),eq:H(),neq:U(),gte:W(),lte:G(),cmp:K(),coerce:ue(),truncate:de(),Comparator:J(),Range:q(),satisfies:Y(),toComparators:pe(),maxSatisfying:me(),minSatisfying:he(),minVersion:ge(),validRange:_e(),outside:X(),gtr:ve(),ltr:ye(),intersects:be(),simplifyRange:xe(),subset:Se(),SemVer:i,re:n.re,src:n.src,tokens:n.t,SEMVER_SPEC_VERSION:r.SEMVER_SPEC_VERSION,RELEASE_TYPES:r.RELEASE_TYPES,compareIdentifiers:a.compareIdentifiers,rcompareIdentifiers:a.rcompareIdentifiers}}))(),1);async function Ce(){let e=[process.env.npm_execpath,l(c(process.execPath),`node_modules/npm/bin/npm-cli.js`),l(c(process.execPath),`../lib/node_modules/npm/bin/npm-cli.js`),...(process.env.PATH??``).split(s).map(e=>l(e,`node_modules/npm/bin/npm-cli.js`))];for(let t of e)if(t?.endsWith(`npm-cli.js`))try{return await f(t),{command:process.execPath,prefix:[t]}}catch{}if(process.platform!==`win32`)return{command:`npm`,prefix:[]};throw new n(`UPDATE_NPM_REQUIRED`,`强制更新需要 npm;请重新安装包含 npm 的 Node.js。`,503)}async function Q(e,t=3e4){let{command:r,prefix:i}=await Ce();return new Promise((a,s)=>{let c=o(r,[...i,...e],{stdio:[`ignore`,`pipe`,`pipe`],windowsHide:!0}),l=``,u=!1,d=!1,f=!1,p=()=>{f=!0,c.kill(`SIGTERM`)};process.once(`SIGINT`,p),process.once(`SIGTERM`,p);let m=setTimeout(()=>{d=!0,c.kill(`SIGKILL`)},t);c.stdout.setEncoding(`utf8`),c.stdout.on(`data`,e=>{l+=e,l.length>2097152&&(u=!0,c.kill(`SIGKILL`))}),c.stderr.resume();let h=()=>{clearTimeout(m),process.removeListener(`SIGINT`,p),process.removeListener(`SIGTERM`,p)};c.on(`error`,()=>{h(),s(new n(`UPDATE_NPM_REQUIRED`,`无法启动 npm,强制更新检查未完成。`,503))}),c.on(`close`,e=>{h(),f?s(new n(`UPDATE_INTERRUPTED`,`强制更新已中断,原命令未执行。`,503)):d||u||e!==0?s(new n(`UPDATE_NPM_FAILED`,`npm 请求失败或超时,原命令未执行。`,503)):a(l.trim())})})}const $=[`--offline=false`,`--prefer-offline=false`,`--prefer-online`,`--fetch-retries=0`,`--fetch-timeout=10000`];async function we(e){let t=await m(l(x(),`share-pages-update-check-`));try{return await Q([`view`,`share-pages@latest`,`--json`,`--registry`,e,`--workspaces=false`,`--cache`,t,...$])}finally{await v(t,{recursive:!0,force:!0})}}async function Te(e,t,r){return new Promise((i,a)=>{let s=o(process.execPath,[e,...t],{stdio:`inherit`,env:{...process.env,SHARE_PAGES_UPDATE_HANDOFF_VERSION:r}}),c=()=>s.kill(`SIGINT`),l=()=>s.kill(`SIGTERM`);process.on(`SIGINT`,c),process.on(`SIGTERM`,l);let u=()=>{process.removeListener(`SIGINT`,c),process.removeListener(`SIGTERM`,l)};s.on(`error`,()=>{u(),a(new n(`UPDATE_EXEC_FAILED`,`新版 CLI 启动失败,原命令未执行。`,503))}),s.on(`close`,(e,t)=>{u(),i(e??(t===`SIGINT`?130:t===`SIGTERM`?143:5))})})}async function Ee(e,t){try{let n=l(e,`node_modules/share-pages`),r=JSON.parse(await h(l(n,`package.json`),`utf8`));if(r.name!==`share-pages`||r.version!==t||r.bin?.[`share-pages`]!==`dist/index.mjs`)return;let i=l(n,`dist/index.mjs`);return(await h(i)).length?i:void 0}catch{return}}function De(e,t){let n=process.env.XDG_CACHE_HOME??(process.platform===`win32`?process.env.LOCALAPPDATA:void 0)??l(b(),`.cache`),r=u(`sha256`).update(e).digest(`hex`).slice(0,24);return l(n,`share-pages`,`cli`,r,t)}async function Oe(e,t){try{for(let n of await g(e)){if(!/^ready-[a-f0-9-]+$/.test(n))continue;let r=await Ee(l(e,n),t);if(r)return r}}catch(e){if(e.code!==`ENOENT`)throw e}}async function ke(e,t){let r=De(e,t),i;try{let n=await Oe(r,t);if(n)return n;if(await p(r,{recursive:!0,mode:448}),i=await m(l(r,`install-`)),await y(l(i,`package.json`),JSON.stringify({private:!0}),{mode:384}),await Q([`install`,`share-pages@${t}`,`--prefix`,i,`--registry`,e,`--global=false`,`--workspaces=false`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--save-exact`,`--package-lock=true`,`--engine-strict`,...$],12e4),!await Ee(i,t))throw Error(`Invalid installed package`);let a=l(r,`ready-${d()}`);return await _(i,a),l(a,`node_modules/share-pages/dist/index.mjs`)}catch(e){throw e instanceof n&&e.code===`UPDATE_INTERRUPTED`?e:new n(`UPDATE_INSTALL_FAILED`,`新版 CLI 安装失败,原命令未执行。`,503)}finally{i&&await v(i,{recursive:!0,force:!0})}}async function Ae(e=process.argv.slice(2),t=a,r={npm:Q,latest:we,install:ke,execute:Te,note:e=>process.stderr.write(`${e}\n`)},i){let o,s,c;try{o=(await r.npm([`config`,`get`,`registry`,`--workspaces=false`])).trim();let e=new URL(o);if(![`https:`,`http:`].includes(e.protocol))throw Error(`Invalid registry`);if(c=JSON.parse(await r.latest(o)),c.name!==`share-pages`||!c.version||!Z.default.valid(c.version))throw Error(`Invalid registry response`);if(c.engines?.node&&(typeof c.engines.node!=`string`||!Z.default.validRange(c.engines.node)))throw Error(`Invalid Node engine range`);s=c.version}catch(e){throw e instanceof n&&e.code===`UPDATE_INTERRUPTED`?e:new n(`UPDATE_CHECK_FAILED`,`无法检查 CLI 最新版本,原命令未执行。`,503)}if(i&&t!==i)throw new n(`UPDATE_VERSION_MISMATCH`,`新版 CLI 的实际版本与安装版本不一致,原命令未执行。`,503);if(c.engines?.node&&!Z.default.satisfies(process.versions.node,c.engines.node))throw new n(`UPDATE_NODE_REQUIRED`,`最新 CLI ${s} 要求 Node.js ${c.engines.node};请先升级 Node.js。`,503);if(!Z.default.gt(s,t))return;let l=e.indexOf(`--`),u=l<0?e:e.slice(0,l);!u.includes(`--quiet`)&&!u.includes(`-q`)&&r.note(`正在强制更新 share-pages:${t} → ${s}`);let d=await r.install(o,s);return r.execute(d,e,s)}process.stdout.on(`error`,e=>{if(e.code===`EPIPE`)process.exitCode=0;else throw e});try{let e=process.env.SHARE_PAGES_UPDATE_HANDOFF_VERSION;delete process.env.SHARE_PAGES_UPDATE_HANDOFF_VERSION;let t=await Ae(void 0,void 0,void 0,e);if(t!==void 0)process.exitCode=t;else{let{buildCLI:e}=await import(`./program-DJaWAEf5.mjs`);await e().parseAsync()}}catch(e){if(w(e))process.exitCode=0;else{let t=T(e);D(t,O(process.argv.slice(2))),process.exitCode=E(t)}}export{};
|