@lowlighter/toolbox 1.0.1
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 +14 -0
- package/clone.d.ts +9 -0
- package/clone.js +37 -0
- package/deno.lock +53 -0
- package/env.d.ts +28 -0
- package/env.js +28 -0
- package/evaluate.d.ts +49 -0
- package/evaluate.js +90 -0
- package/events.d.ts +8 -0
- package/events.js +28 -0
- package/filesystem.d.ts +19 -0
- package/filesystem.js +40 -0
- package/fixtures/filesystem/a/b/foo.txt +1 -0
- package/fixtures/filesystem/a/c/bar.txt +1 -0
- package/fixtures/filesystem/a/c/baz.txt +1 -0
- package/fixtures/filesystem/a/d/qux.ts +1 -0
- package/format.d.ts +9 -0
- package/format.js +21 -0
- package/identicon.d.ts +6 -0
- package/identicon.js +32 -0
- package/imgb64.d.ts +1 -0
- package/imgb64.js +15 -0
- package/mod.ts +1 -0
- package/noop.d.ts +1 -0
- package/noop.js +2 -0
- package/package.json +116 -0
- package/permissions.d.ts +1 -0
- package/permissions.js +31 -0
- package/pluralize.d.ts +6 -0
- package/pluralize.js +44 -0
- package/promises.d.ts +1 -0
- package/promises.js +12 -0
- package/resolve.d.ts +5 -0
- package/resolve.js +18 -0
- package/scripts/code_quality.d.ts +0 -0
- package/scripts/code_quality.js +210 -0
- package/scripts/download_lambda_chromium.d.ts +10 -0
- package/scripts/download_lambda_chromium.js +133 -0
- package/scripts/highlight_coverage.d.ts +0 -0
- package/scripts/highlight_coverage.js +62 -0
- package/scripts/publish/_utils.js +95 -0
- package/scripts/publish/npm.d.ts +11 -0
- package/scripts/publish/npm.js +130 -0
- package/scripts/publish/x.d.ts +20 -0
- package/scripts/publish/x.js +303 -0
- package/timezone.d.ts +2 -0
- package/timezone.js +8 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
// deno-lint-ignore-file no-console no-external-import
|
|
3
|
+
import { brotliDecompressSync } from "node:zlib";
|
|
4
|
+
import { ensureDir, exists } from "@std/fs";
|
|
5
|
+
import { basename, dirname, join, resolve } from "@std/path";
|
|
6
|
+
import { UntarStream } from "@std/tar";
|
|
7
|
+
import { toArrayBuffer } from "@std/streams";
|
|
8
|
+
import { parseArgs } from "@std/cli";
|
|
9
|
+
/** Locks. */ const locks = new Map();
|
|
10
|
+
/** Download Chromium binary for AWS Lambda environment. */ export function chromium({ version = "141.0.0", path = "/tmp/chromium", arch = Deno.build.arch, force = false, env = true, debug = false } = {}) {
|
|
11
|
+
// Install browser
|
|
12
|
+
path = resolve(path);
|
|
13
|
+
if (!locks.has(path)) {
|
|
14
|
+
locks.set(path, // deno-lint-ignore no-async-promise-executor
|
|
15
|
+
new Promise(async (resolve, reject)=>{
|
|
16
|
+
try {
|
|
17
|
+
if (!await exists(path) || force) {
|
|
18
|
+
const url = `https://github.com/Sparticuz/chromium/releases/download/v${version}/chromium-v${version}-pack.${{
|
|
19
|
+
x86_64: "x64",
|
|
20
|
+
aarch64: "arm64"
|
|
21
|
+
}[arch] ?? "unknown"}.tar`;
|
|
22
|
+
if (debug) console.debug(`Downloading Chromium v${version} from ${url}`);
|
|
23
|
+
const response = await fetch(url);
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
await response.body?.cancel();
|
|
26
|
+
throw new Error(`Failed to download Chromium: ${response.status} ${url}`);
|
|
27
|
+
}
|
|
28
|
+
await extract(response.body, {
|
|
29
|
+
path: dirname(path),
|
|
30
|
+
debug
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
resolve(path);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
reject(error);
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
// Set environment variables
|
|
40
|
+
if (env) {
|
|
41
|
+
if (!Deno.env.get("FONTCONFIG_PATH")) {
|
|
42
|
+
Deno.env.set("FONTCONFIG_PATH", join(dirname(path), "fonts"));
|
|
43
|
+
if (debug) console.debug(`Set FONTCONFIG_PATH to ${Deno.env.get("FONTCONFIG_PATH")}`);
|
|
44
|
+
}
|
|
45
|
+
if (!Deno.env.get("LD_LIBRARY_PATH")?.includes(join(dirname(path), "al2023"))) {
|
|
46
|
+
Deno.env.set("LD_LIBRARY_PATH", [
|
|
47
|
+
join(dirname(path), "al2023"),
|
|
48
|
+
Deno.env.get("LD_LIBRARY_PATH")
|
|
49
|
+
].join(":"));
|
|
50
|
+
if (debug) console.debug(`Set LD_LIBRARY_PATH to ${Deno.env.get("LD_LIBRARY_PATH")}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return locks.get(path);
|
|
54
|
+
}
|
|
55
|
+
/** Extract tar stream. */ async function extract(stream, { path, debug }) {
|
|
56
|
+
for await (const entry of stream.pipeThrough(new UntarStream())){
|
|
57
|
+
if (!entry.readable) continue;
|
|
58
|
+
let name = basename(entry.path);
|
|
59
|
+
let buffer = await toArrayBuffer(entry.readable);
|
|
60
|
+
if (name.endsWith(".br")) {
|
|
61
|
+
name = basename(name, ".br");
|
|
62
|
+
buffer = brotliDecompressSync(buffer, {
|
|
63
|
+
chunkSize: 2 ** 21
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (name.endsWith(".tar")) {
|
|
67
|
+
name = basename(name, ".tar");
|
|
68
|
+
await extract(ReadableStream.from([
|
|
69
|
+
new Uint8Array(buffer)
|
|
70
|
+
]), {
|
|
71
|
+
path: name === "swiftshader" ? path : join(path, name),
|
|
72
|
+
debug
|
|
73
|
+
});
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
name = join(path, name);
|
|
77
|
+
await ensureDir(dirname(name));
|
|
78
|
+
await Deno.writeFile(name, new Uint8Array(buffer));
|
|
79
|
+
await Deno.chmod(name, 0o700);
|
|
80
|
+
if (debug) console.debug(`Extracted ${name}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (import.meta.main) {
|
|
84
|
+
const args = parseArgs(Deno.args, {
|
|
85
|
+
string: [
|
|
86
|
+
"version",
|
|
87
|
+
"path",
|
|
88
|
+
"arch"
|
|
89
|
+
],
|
|
90
|
+
boolean: [
|
|
91
|
+
"env",
|
|
92
|
+
"force",
|
|
93
|
+
"debug",
|
|
94
|
+
"help"
|
|
95
|
+
],
|
|
96
|
+
alias: {
|
|
97
|
+
v: "version",
|
|
98
|
+
p: "path",
|
|
99
|
+
a: "arch",
|
|
100
|
+
e: "env",
|
|
101
|
+
f: "force",
|
|
102
|
+
d: "debug",
|
|
103
|
+
h: "help"
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
if (args.help) {
|
|
107
|
+
console.log(`Downloads Chromium binary for AWS Lambda environment.
|
|
108
|
+
|
|
109
|
+
Usage:
|
|
110
|
+
deno run jsr:@libs/toolbox/download-lambda-chromium [options]
|
|
111
|
+
|
|
112
|
+
Options:
|
|
113
|
+
-v, --version Chromium version. Default is 141.0.0
|
|
114
|
+
-p, --path Path to save Chromium binary. Default is /tmp/chromium
|
|
115
|
+
-a, --arch System architecture. Default is current architecture
|
|
116
|
+
-e, --env Set environment variables for FONTCONFIG_PATH and LD_LIBRARY_PATH (requires --allow-env). Default is true
|
|
117
|
+
-f, --force Force download even if file exists
|
|
118
|
+
-d, --debug Enable debug logging
|
|
119
|
+
-h, --help Show this help message
|
|
120
|
+
`);
|
|
121
|
+
Deno.exit(2);
|
|
122
|
+
}
|
|
123
|
+
const path = await chromium({
|
|
124
|
+
version: args.version,
|
|
125
|
+
path: args.path,
|
|
126
|
+
arch: args.arch,
|
|
127
|
+
env: args.env,
|
|
128
|
+
force: args.force,
|
|
129
|
+
debug: args.debug
|
|
130
|
+
});
|
|
131
|
+
console.log(path);
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL2Rvd25sb2FkX2xhbWJkYV9jaHJvbWl1bS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG4vLyBkZW5vLWxpbnQtaWdub3JlLWZpbGUgbm8tY29uc29sZSBuby1leHRlcm5hbC1pbXBvcnRcbmltcG9ydCB0eXBlIHsgQnVmZmVyIH0gZnJvbSBcIm5vZGU6YnVmZmVyXCJcbmltcG9ydCB7IGJyb3RsaURlY29tcHJlc3NTeW5jIH0gZnJvbSBcIm5vZGU6emxpYlwiXG5pbXBvcnQgeyBlbnN1cmVEaXIsIGV4aXN0cyB9IGZyb20gXCJAc3RkL2ZzXCJcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIkBzdGQvcGF0aFwiXG5pbXBvcnQgeyBVbnRhclN0cmVhbSB9IGZyb20gXCJAc3RkL3RhclwiXG5pbXBvcnQgeyB0b0FycmF5QnVmZmVyIH0gZnJvbSBcIkBzdGQvc3RyZWFtc1wiXG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwiQHN0ZC9jbGlcIlxuXG4vKiogTG9ja3MuICovXG5jb25zdCBsb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHN0cmluZz4+KClcblxuLyoqIENocm9taXVtIGRvd25sb2FkIG9wdGlvbnMuICovXG5leHBvcnQgdHlwZSBDaHJvbWl1bU9wdGlvbnMgPSB7XG4gIC8qKiBDaHJvbWl1bSB2ZXJzaW9uLiBEZWZhdWx0IGlzIGAxNDEuMC4wYC4gKi9cbiAgdmVyc2lvbj86IHN0cmluZ1xuICAvKiogUGF0aCB0byBzYXZlIENocm9taXVtIGJpbmFyeS4gRGVmYXVsdCBpcyBgL3RtcC9jaHJvbWl1bWAuICovXG4gIHBhdGg/OiBzdHJpbmdcbiAgLyoqIFN5c3RlbSBhcmNoaXRlY3R1cmUuIERlZmF1bHQgaXMgY3VycmVudCBhcmNoaXRlY3R1cmUuICovXG4gIGFyY2g/OiB0eXBlb2YgRGVuby5idWlsZC5hcmNoXG4gIC8qKiBEb3dubG9hZCBVUkwuICovXG4gIHVybD86IHN0cmluZ1xuICAvKiogRm9yY2UgZG93bmxvYWQgZXZlbiBpZiBmaWxlIGV4aXN0cy4gKi9cbiAgZm9yY2U/OiBib29sZWFuXG4gIC8qKiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBgRk9OVENPTkZJR19QQVRIYCBhbmQgYExEX0xJQlJBUllfUEFUSGAgKHJlcXVpcmVzIC0tYWxsb3ctZW52KS4gRGVmYXVsdCBpcyBgdHJ1ZWAuICovXG4gIGVudj86IGJvb2xlYW5cbiAgLyoqIEVuYWJsZSBkZWJ1Z2dpbmcuICovXG4gIGRlYnVnPzogYm9vbGVhblxufVxuXG4vKiogRG93bmxvYWQgQ2hyb21pdW0gYmluYXJ5IGZvciBBV1MgTGFtYmRhIGVudmlyb25tZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNocm9taXVtKHsgdmVyc2lvbiA9IFwiMTQxLjAuMFwiLCBwYXRoID0gXCIvdG1wL2Nocm9taXVtXCIsIGFyY2ggPSBEZW5vLmJ1aWxkLmFyY2gsIGZvcmNlID0gZmFsc2UsIGVudiA9IHRydWUsIGRlYnVnID0gZmFsc2UgfTogQ2hyb21pdW1PcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBJbnN0YWxsIGJyb3dzZXJcbiAgcGF0aCA9IHJlc29sdmUocGF0aClcbiAgaWYgKCFsb2Nrcy5oYXMocGF0aCkpIHtcbiAgICBsb2Nrcy5zZXQoXG4gICAgICBwYXRoLFxuICAgICAgLy8gZGVuby1saW50LWlnbm9yZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICBuZXcgUHJvbWlzZTxzdHJpbmc+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoKCFhd2FpdCBleGlzdHMocGF0aCkpIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9naXRodWIuY29tL1NwYXJ0aWN1ei9jaHJvbWl1bS9yZWxlYXNlcy9kb3dubG9hZC92JHt2ZXJzaW9ufS9jaHJvbWl1bS12JHt2ZXJzaW9ufS1wYWNrLiR7eyB4ODZfNjQ6IFwieDY0XCIsIGFhcmNoNjQ6IFwiYXJtNjRcIiB9W2FyY2hdID8/IFwidW5rbm93blwifS50YXJgXG4gICAgICAgICAgICBpZiAoZGVidWcpXG4gICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYERvd25sb2FkaW5nIENocm9taXVtIHYke3ZlcnNpb259IGZyb20gJHt1cmx9YClcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKVxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBDaHJvbWl1bTogJHtyZXNwb25zZS5zdGF0dXN9ICR7dXJsfWApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBleHRyYWN0KHJlc3BvbnNlLmJvZHkhLCB7IHBhdGg6IGRpcm5hbWUocGF0aCksIGRlYnVnIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUocGF0aClcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIClcbiAgfVxuICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmIChlbnYpIHtcbiAgICBpZiAoIURlbm8uZW52LmdldChcIkZPTlRDT05GSUdfUEFUSFwiKSkge1xuICAgICAgRGVuby5lbnYuc2V0KFwiRk9OVENPTkZJR19QQVRIXCIsIGpvaW4oZGlybmFtZShwYXRoKSwgXCJmb250c1wiKSlcbiAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgU2V0IEZPTlRDT05GSUdfUEFUSCB0byAke0Rlbm8uZW52LmdldChcIkZPTlRDT05GSUdfUEFUSFwiKX1gKVxuICAgIH1cbiAgICBpZiAoIURlbm8uZW52LmdldChcIkxEX0xJQlJBUllfUEFUSFwiKT8uaW5jbHVkZXMoam9pbihkaXJuYW1lKHBhdGgpLCBcImFsMjAyM1wiKSkpIHtcbiAgICAgIERlbm8uZW52LnNldChcIkxEX0xJQlJBUllfUEFUSFwiLCBbam9pbihkaXJuYW1lKHBhdGgpLCBcImFsMjAyM1wiKSwgRGVuby5lbnYuZ2V0KFwiTERfTElCUkFSWV9QQVRIXCIpXS5qb2luKFwiOlwiKSlcbiAgICAgIGlmIChkZWJ1ZylcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhgU2V0IExEX0xJQlJBUllfUEFUSCB0byAke0Rlbm8uZW52LmdldChcIkxEX0xJQlJBUllfUEFUSFwiKX1gKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsb2Nrcy5nZXQocGF0aCkhXG59XG5cbi8qKiBFeHRyYWN0IHRhciBzdHJlYW0uICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0KHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheTxBcnJheUJ1ZmZlcj4+LCB7IHBhdGgsIGRlYnVnIH06IHsgcGF0aDogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSkge1xuICBmb3IgYXdhaXQgKGNvbnN0IGVudHJ5IG9mIHN0cmVhbS5waXBlVGhyb3VnaChuZXcgVW50YXJTdHJlYW0oKSkpIHtcbiAgICBpZiAoIWVudHJ5LnJlYWRhYmxlKVxuICAgICAgY29udGludWVcbiAgICBsZXQgbmFtZSA9IGJhc2VuYW1lKGVudHJ5LnBhdGgpXG4gICAgbGV0IGJ1ZmZlciA9IGF3YWl0IHRvQXJyYXlCdWZmZXIoZW50cnkucmVhZGFibGUpIGFzIEFycmF5QnVmZmVyIHwgQnVmZmVyPEFycmF5QnVmZmVyTGlrZT5cbiAgICBpZiAobmFtZS5lbmRzV2l0aChcIi5iclwiKSkge1xuICAgICAgbmFtZSA9IGJhc2VuYW1lKG5hbWUsIFwiLmJyXCIpXG4gICAgICBidWZmZXIgPSBicm90bGlEZWNvbXByZXNzU3luYyhidWZmZXIsIHsgY2h1bmtTaXplOiAyICoqIDIxIH0pXG4gICAgfVxuICAgIGlmIChuYW1lLmVuZHNXaXRoKFwiLnRhclwiKSkge1xuICAgICAgbmFtZSA9IGJhc2VuYW1lKG5hbWUsIFwiLnRhclwiKVxuICAgICAgYXdhaXQgZXh0cmFjdChSZWFkYWJsZVN0cmVhbS5mcm9tKFtuZXcgVWludDhBcnJheShidWZmZXIpXSksIHsgcGF0aDogbmFtZSA9PT0gXCJzd2lmdHNoYWRlclwiID8gcGF0aCA6IGpvaW4ocGF0aCwgbmFtZSksIGRlYnVnIH0pXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBuYW1lID0gam9pbihwYXRoLCBuYW1lKVxuICAgIGF3YWl0IGVuc3VyZURpcihkaXJuYW1lKG5hbWUpKVxuICAgIGF3YWl0IERlbm8ud3JpdGVGaWxlKG5hbWUsIG5ldyBVaW50OEFycmF5KGJ1ZmZlcikpXG4gICAgYXdhaXQgRGVuby5jaG1vZChuYW1lLCAwbzcwMClcbiAgICBpZiAoZGVidWcpXG4gICAgICBjb25zb2xlLmRlYnVnKGBFeHRyYWN0ZWQgJHtuYW1lfWApXG4gIH1cbn1cblxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgYXJncyA9IHBhcnNlQXJncyhEZW5vLmFyZ3MsIHsgc3RyaW5nOiBbXCJ2ZXJzaW9uXCIsIFwicGF0aFwiLCBcImFyY2hcIl0sIGJvb2xlYW46IFtcImVudlwiLCBcImZvcmNlXCIsIFwiZGVidWdcIiwgXCJoZWxwXCJdLCBhbGlhczogeyB2OiBcInZlcnNpb25cIiwgcDogXCJwYXRoXCIsIGE6IFwiYXJjaFwiLCBlOiBcImVudlwiLCBmOiBcImZvcmNlXCIsIGQ6IFwiZGVidWdcIiwgaDogXCJoZWxwXCIgfSB9KVxuICBpZiAoYXJncy5oZWxwKSB7XG4gICAgY29uc29sZS5sb2coYERvd25sb2FkcyBDaHJvbWl1bSBiaW5hcnkgZm9yIEFXUyBMYW1iZGEgZW52aXJvbm1lbnQuXG5cblVzYWdlOlxuICBkZW5vIHJ1biBqc3I6QGxpYnMvdG9vbGJveC9kb3dubG9hZC1sYW1iZGEtY2hyb21pdW0gW29wdGlvbnNdXG5cbk9wdGlvbnM6XG4gIC12LCAtLXZlcnNpb24gICAgICAgQ2hyb21pdW0gdmVyc2lvbi4gRGVmYXVsdCBpcyAxNDEuMC4wXG4gIC1wLCAtLXBhdGggICAgICAgICAgUGF0aCB0byBzYXZlIENocm9taXVtIGJpbmFyeS4gRGVmYXVsdCBpcyAvdG1wL2Nocm9taXVtXG4gIC1hLCAtLWFyY2ggICAgICAgICAgU3lzdGVtIGFyY2hpdGVjdHVyZS4gRGVmYXVsdCBpcyBjdXJyZW50IGFyY2hpdGVjdHVyZVxuICAtZSwgLS1lbnYgICAgICAgICAgIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIEZPTlRDT05GSUdfUEFUSCBhbmQgTERfTElCUkFSWV9QQVRIIChyZXF1aXJlcyAtLWFsbG93LWVudikuIERlZmF1bHQgaXMgdHJ1ZVxuICAtZiwgLS1mb3JjZSAgICAgICAgIEZvcmNlIGRvd25sb2FkIGV2ZW4gaWYgZmlsZSBleGlzdHNcbiAgLWQsIC0tZGVidWcgICAgICAgICBFbmFibGUgZGVidWcgbG9nZ2luZ1xuICAtaCwgLS1oZWxwICAgICAgICAgIFNob3cgdGhpcyBoZWxwIG1lc3NhZ2VcbmApXG4gICAgRGVuby5leGl0KDIpXG4gIH1cbiAgY29uc3QgcGF0aCA9IGF3YWl0IGNocm9taXVtKHsgdmVyc2lvbjogYXJncy52ZXJzaW9uLCBwYXRoOiBhcmdzLnBhdGgsIGFyY2g6IGFyZ3MuYXJjaCBhcyB0eXBlb2YgRGVuby5idWlsZC5hcmNoLCBlbnY6IGFyZ3MuZW52LCBmb3JjZTogYXJncy5mb3JjZSwgZGVidWc6IGFyZ3MuZGVidWcgfSlcbiAgY29uc29sZS5sb2cocGF0aClcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1Ysc0RBQXNEO0FBRXRELFNBQVMsb0JBQW9CLFFBQVEsWUFBVztBQUNoRCxTQUFTLFNBQVMsRUFBRSxNQUFNLFFBQVEsVUFBUztBQUMzQyxTQUFTLFFBQVEsRUFB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
|
|
File without changes
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// deno-lint-ignore-file no-console
|
|
2
|
+
import { parseArgs } from "@std/cli";
|
|
3
|
+
import { gray, green } from "@std/fmt/colors";
|
|
4
|
+
import { expandGlob } from "@std/fs";
|
|
5
|
+
// deno-lint-ignore no-import-prefix
|
|
6
|
+
const { default: hljs } = await import("highlight.js");
|
|
7
|
+
const args = parseArgs(Deno.args, {
|
|
8
|
+
string: [
|
|
9
|
+
"root",
|
|
10
|
+
"language"
|
|
11
|
+
],
|
|
12
|
+
boolean: [
|
|
13
|
+
"help"
|
|
14
|
+
],
|
|
15
|
+
default: {
|
|
16
|
+
root: "coverage",
|
|
17
|
+
language: "ts"
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
if (args.help) {
|
|
21
|
+
console.error(`Usage: deno run --allow-read --allow-write jsr:@libs/toolbox/scripts/highlight-coverage`);
|
|
22
|
+
console.error(``);
|
|
23
|
+
console.error(`Enhances HTML coverage reports generated by "deno coverage --html" with matcha.css styling and highlight.js syntax highlighting.`);
|
|
24
|
+
console.error(``);
|
|
25
|
+
console.error(`Options:`);
|
|
26
|
+
console.error(` --root=DIR Root directory to search for html coverage reports (default: coverage)`);
|
|
27
|
+
console.error(` --language=LANG Language used for syntax highlighting (default: ts)`);
|
|
28
|
+
console.error(` --help Show this help message`);
|
|
29
|
+
console.error(``);
|
|
30
|
+
Deno.exit(2);
|
|
31
|
+
}
|
|
32
|
+
const stylesheets = [
|
|
33
|
+
"@root",
|
|
34
|
+
"@syntax-highlighting",
|
|
35
|
+
"@istanbul-coverage"
|
|
36
|
+
].map((name)=>`<link rel='stylesheet' href='https://matcha.mizu.sh/styles/${name}/mod.css'>`).join("");
|
|
37
|
+
const entities = {
|
|
38
|
+
"<": "<",
|
|
39
|
+
">": ">",
|
|
40
|
+
""": '"',
|
|
41
|
+
"'": "'",
|
|
42
|
+
"&": "&"
|
|
43
|
+
};
|
|
44
|
+
for await (const { path } of expandGlob("**/*.html", {
|
|
45
|
+
root: args.root
|
|
46
|
+
})){
|
|
47
|
+
let html = await Deno.readTextFile(path);
|
|
48
|
+
if (!/<title>Coverage report/.test(html)) {
|
|
49
|
+
console.error(gray(`∅ ${path}`));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (!html.includes("matcha.mizu.sh")) html = html.replace("</head>", `${stylesheets}</head>`);
|
|
53
|
+
html = html.replace(/<pre class='prettyprint'>([\s\S]*?)<\/pre>/g, (_, code)=>{
|
|
54
|
+
const text = Object.entries(entities).reduce((text, [entity, character])=>text.replaceAll(entity, character), code.replace(/<[^>]*>/g, ""));
|
|
55
|
+
return `<pre class='prettyprint hljs' data-highlighted='true'>${hljs.highlight(text, {
|
|
56
|
+
language: args.language
|
|
57
|
+
}).value}</pre>`;
|
|
58
|
+
});
|
|
59
|
+
await Deno.writeTextFile(path, html);
|
|
60
|
+
console.error(green(`✓ ${path}`));
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL2hpZ2hsaWdodF9jb3ZlcmFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBkZW5vLWxpbnQtaWdub3JlLWZpbGUgbm8tY29uc29sZVxuaW1wb3J0IHsgcGFyc2VBcmdzIH0gZnJvbSBcIkBzdGQvY2xpXCJcbmltcG9ydCB7IGdyYXksIGdyZWVuIH0gZnJvbSBcIkBzdGQvZm10L2NvbG9yc1wiXG5pbXBvcnQgeyBleHBhbmRHbG9iIH0gZnJvbSBcIkBzdGQvZnNcIlxuLy8gZGVuby1saW50LWlnbm9yZSBuby1pbXBvcnQtcHJlZml4XG5jb25zdCB7IGRlZmF1bHQ6IGhsanMgfSA9IGF3YWl0IGltcG9ydChcImhpZ2hsaWdodC5qc1wiKVxuXG5jb25zdCBhcmdzID0gcGFyc2VBcmdzKERlbm8uYXJncywgeyBzdHJpbmc6IFtcInJvb3RcIiwgXCJsYW5ndWFnZVwiXSwgYm9vbGVhbjogW1wiaGVscFwiXSwgZGVmYXVsdDogeyByb290OiBcImNvdmVyYWdlXCIsIGxhbmd1YWdlOiBcInRzXCIgfSB9KVxuaWYgKGFyZ3MuaGVscCkge1xuICBjb25zb2xlLmVycm9yKGBVc2FnZTogZGVubyBydW4gLS1hbGxvdy1yZWFkIC0tYWxsb3ctd3JpdGUganNyOkBsaWJzL3Rvb2xib3gvc2NyaXB0cy9oaWdobGlnaHQtY292ZXJhZ2VgKVxuICBjb25zb2xlLmVycm9yKGBgKVxuICBjb25zb2xlLmVycm9yKGBFbmhhbmNlcyBIVE1MIGNvdmVyYWdlIHJlcG9ydHMgZ2VuZXJhdGVkIGJ5IFwiZGVubyBjb3ZlcmFnZSAtLWh0bWxcIiB3aXRoIG1hdGNoYS5jc3Mgc3R5bGluZyBhbmQgaGlnaGxpZ2h0LmpzIHN5bnRheCBoaWdobGlnaHRpbmcuYClcbiAgY29uc29sZS5lcnJvcihgYClcbiAgY29uc29sZS5lcnJvcihgT3B0aW9uczpgKVxuICBjb25zb2xlLmVycm9yKGAgIC0tcm9vdD1ESVIgICAgICAgUm9vdCBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBodG1sIGNvdmVyYWdlIHJlcG9ydHMgKGRlZmF1bHQ6IGNvdmVyYWdlKWApXG4gIGNvbnNvbGUuZXJyb3IoYCAgLS1sYW5ndWFnZT1MQU5HICBMYW5ndWFnZSB1c2VkIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nIChkZWZhdWx0OiB0cylgKVxuICBjb25zb2xlLmVycm9yKGAgIC0taGVscCAgICAgICAgICAgU2hvdyB0aGlzIGhlbHAgbWVzc2FnZWApXG4gIGNvbnNvbGUuZXJyb3IoYGApXG4gIERlbm8uZXhpdCgyKVxufVxuXG5jb25zdCBzdHlsZXNoZWV0cyA9IFtcIkByb290XCIsIFwiQHN5bnRheC1oaWdobGlnaHRpbmdcIiwgXCJAaXN0YW5idWwtY292ZXJhZ2VcIl0ubWFwKChuYW1lKSA9PiBgPGxpbmsgcmVsPSdzdHlsZXNoZWV0JyBocmVmPSdodHRwczovL21hdGNoYS5taXp1LnNoL3N0eWxlcy8ke25hbWV9L21vZC5jc3MnPmApLmpvaW4oXCJcIilcbmNvbnN0IGVudGl0aWVzID0geyBcIiZsdDtcIjogXCI8XCIsIFwiJmd0O1wiOiBcIj5cIiwgXCImcXVvdDtcIjogJ1wiJywgXCImIzM5O1wiOiBcIidcIiwgXCImYW1wO1wiOiBcIiZcIiB9XG5cbmZvciBhd2FpdCAoY29uc3QgeyBwYXRoIH0gb2YgZXhwYW5kR2xvYihcIioqLyouaHRtbFwiLCB7IHJvb3Q6IGFyZ3Mucm9vdCB9KSkge1xuICBsZXQgaHRtbCA9IGF3YWl0IERlbm8ucmVhZFRleHRGaWxlKHBhdGgpXG4gIGlmICghLzx0aXRsZT5Db3ZlcmFnZSByZXBvcnQvLnRlc3QoaHRtbCkpIHtcbiAgICBjb25zb2xlLmVycm9yKGdyYXkoYOKIhSAke3BhdGh9YCkpXG4gICAgY29udGludWVcbiAgfVxuICBpZiAoIWh0bWwuaW5jbHVkZXMoXCJtYXRjaGEubWl6dS5zaFwiKSlcbiAgICBodG1sID0gaHRtbC5yZXBsYWNlKFwiPC9oZWFkPlwiLCBgJHtzdHlsZXNoZWV0c308L2hlYWQ+YClcbiAgaHRtbCA9IGh0bWwucmVwbGFjZSgvPHByZSBjbGFzcz0ncHJldHR5cHJpbnQnPihbXFxzXFxTXSo/KTxcXC9wcmU+L2csIChfLCBjb2RlOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gT2JqZWN0LmVudHJpZXMoZW50aXRpZXMpLnJlZHVjZSgodGV4dCwgW2VudGl0eSwgY2hhcmFjdGVyXSkgPT4gdGV4dC5yZXBsYWNlQWxsKGVudGl0eSwgY2hhcmFjdGVyKSwgY29kZS5yZXBsYWNlKC88W14+XSo+L2csIFwiXCIpKVxuICAgIHJldHVybiBgPHByZSBjbGFzcz0ncHJldHR5cHJpbnQgaGxqcycgZGF0YS1oaWdobGlnaHRlZD0ndHJ1ZSc+JHtobGpzLmhpZ2hsaWdodCh0ZXh0LCB7IGxhbmd1YWdlOiBhcmdzLmxhbmd1YWdlIH0pLnZhbHVlfTwvcHJlPmBcbiAgfSlcbiAgYXdhaXQgRGVuby53cml0ZVRleHRGaWxlKHBhdGgsIGh0bWwpXG4gIGNvbnNvbGUuZXJyb3IoZ3JlZW4oYOKckyAke3BhdGh9YCkpXG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbUNBQW1DO0FBQ25DLFNBQVMsU0FBUyxRQUFRLFdBQVU7QUFDcEMsU0FBUyxJQUFJLEVBQUUsS0FBSyxRQUFRLGtCQUFpQjtBQUM3QyxTQUFTLFVBQVUsUUFBUSxVQUFTO0FBQ3BDLG9DQUFvQztBQUNwQyxNQUFNLEVBQUUsU0FBUyxJQUFJLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQztBQUV2QyxNQUFNLE9BQU8sVUFBVSxLQUFLLElBQUksRUFBRTtFQUFFLFFBQVE7SUFBQztJQUFRO0dBQVc7RUFBRSxTQUFTO0lBQUM7R0FBTztFQUFFLFNBQVM7SUFBRSxNQUFNO0lBQVksVUFBVTtFQUFLO0FBQUU7QUFDbkksSUFBSSxLQUFLLElBQUksRUFBRTtFQUNiLFFBQVEsS0FBSyxDQUFDLENBQUMsdUZBQXVGLENBQUM7RUFDdkcsUUFBUSxLQUFLLENBQUMsRUFBRTtFQUNoQixRQUFRLEtBQUssQ0FBQyxDQUFDLGdJQUFnSSxDQUFDO0VBQ2hKLFFBQVEsS0FBSyxDQUFDLEVBQUU7RUFDaEIsUUFBUSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDeEIsUUFBUSxLQUFLLENBQUMsQ0FBQyx5RkFBeUYsQ0FBQztFQUN6RyxRQUFRLEtBQUssQ0FBQyxDQUFDLHNFQUFzRSxDQUFDO0VBQ3RGLFFBQVEsS0FBSyxDQUFDLENBQUMseUNBQXlDLENBQUM7RUFDekQsUUFBUSxLQUFLLENBQUMsRUFBRTtFQUNoQixLQUFLLElBQUksQ0FBQztBQUNaO0FBRUEsTUFBTSxjQUFjO0VBQUM7RUFBUztFQUF3QjtDQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQVMsQ0FBQywyREFBMkQsRUFBRSxLQUFLLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQztBQUMvSyxNQUFNLFdBQVc7RUFBRSxRQUFRO0VBQUssUUFBUTtFQUFLLFVBQVU7RUFBSyxTQUFTO0VBQUssU0FBUztBQUFJO0FBRXZGLFdBQVcsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLFdBQVcsYUFBYTtFQUFFLE1BQU0sS0FBSyxJQUFJO0FBQUMsR0FBSTtFQUN6RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFlBQVksQ0FBQztFQUNuQyxJQUFJLENBQUMseUJBQXlCLElBQUksQ0FBQyxPQUFPO0lBQ3hDLFFBQVEsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTTtJQUM5QjtFQUNGO0VBQ0EsSUFBSSxDQUFDLEtBQUssUUFBUSxDQUFDLG1CQUNqQixPQUFPLEtBQUssT0FBTyxDQUFDLFdBQVcsR0FBRyxZQUFZLE9BQU8sQ0FBQztFQUN4RCxPQUFPLEtBQUssT0FBTyxDQUFDLCtDQUErQyxDQUFDLEdBQUc7SUFDckUsTUFBTSxPQUFPLE9BQU8sT0FBTyxDQUFDLFVBQVUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsVUFBVSxHQUFLLEtBQUssVUFBVSxDQUFDLFFBQVEsWUFBWSxLQUFLLE9BQU8sQ0FBQyxZQUFZO0lBQ3pJLE9BQU8sQ0FBQyxzREFBc0QsRUFBRSxLQUFLLFNBQVMsQ0FBQyxNQUFNO01BQUUsVUFBVSxLQUFLLFFBQVE7SUFBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7RUFDakk7RUFDQSxNQUFNLEtBQUssYUFBYSxDQUFDLE1BQU07RUFDL0IsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNO0FBQ2pDIn0=
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Imports
|
|
2
|
+
import { expandGlob } from "@std/fs";
|
|
3
|
+
import { dirname, resolve } from "@std/path";
|
|
4
|
+
import * as JSONC from "@std/jsonc/parse";
|
|
5
|
+
/**
|
|
6
|
+
* Rewrite the scope of import specifiers in file content.
|
|
7
|
+
*
|
|
8
|
+
* An empty `to` removes the scope entirely.
|
|
9
|
+
*
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { rescope } from "./_utils.ts"
|
|
12
|
+
* rescope('import { command } from "@lowlighter/run/command"', { from: "@libs", to: "@lowlighter" })
|
|
13
|
+
* ```
|
|
14
|
+
*/ export function rescope(content, { from, to }) {
|
|
15
|
+
return content.replaceAll(`"${from}/`, to ? `"${to}/` : `"`);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve all imports from file content against an import map.
|
|
19
|
+
*
|
|
20
|
+
* Bare specifiers matching an import map entry are replaced by their mapped value,
|
|
21
|
+
* and specifiers matching a trailing-slash entry have their prefix substituted.
|
|
22
|
+
*
|
|
23
|
+
* Both static imports and statically analyzable dynamic imports (i.e. `import()` calls with a string literal) are resolved.
|
|
24
|
+
*
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { unmap } from "./_utils.ts"
|
|
27
|
+
* unmap('import { command } from "@lowlighter/run/command"', { "@lowlighter/run/": "jsr:@libs/run@^3.0.0/" })
|
|
28
|
+
* ```
|
|
29
|
+
*/ export function unmap(content, imports) {
|
|
30
|
+
let resolved = 0;
|
|
31
|
+
const directories = Object.keys(imports).filter((module)=>module.endsWith("/"));
|
|
32
|
+
const remap = (module)=>{
|
|
33
|
+
let mapped = null;
|
|
34
|
+
if (module in imports) mapped = imports[module];
|
|
35
|
+
else if (directories.some((directory)=>module.startsWith(directory))) {
|
|
36
|
+
const [directory] = directories.filter((directory)=>module.startsWith(directory)).sort((a, b)=>b.length - a.length);
|
|
37
|
+
mapped = module.replace(directory, imports[directory]);
|
|
38
|
+
}
|
|
39
|
+
return mapped;
|
|
40
|
+
};
|
|
41
|
+
const substitute = (match, statement, quote, module)=>{
|
|
42
|
+
const mapped = remap(module);
|
|
43
|
+
if (typeof mapped === "string") {
|
|
44
|
+
resolved++;
|
|
45
|
+
return `${statement}${mapped}${quote}`;
|
|
46
|
+
}
|
|
47
|
+
return match;
|
|
48
|
+
};
|
|
49
|
+
const result = content.replace(/^(?<statement>\s*(?:import|export)\s*(?:(?:\s+type)?\s+(?:[^\n]+?|(?:\{[\s\S]*?\}))\s+from\s+)?(?<quote>["']))(?<module>[^\n]+?)\k<quote>/gm, substitute).replace(/(?<statement>\bimport\s*\(\s*(?<quote>["']))(?<module>[^"'\n]+?)\k<quote>/g, substitute);
|
|
50
|
+
return {
|
|
51
|
+
result,
|
|
52
|
+
resolved
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Compute an import map for workspace members.
|
|
57
|
+
*
|
|
58
|
+
* The workspace root is located by walking up from `cwd` until a `deno.json(c)` manifest with a `workspace` field is found.
|
|
59
|
+
* Each member with a `name` and `version` is mapped to its jsr.io counterpart (e.g. `@libs/run/` → `jsr:@libs/run@^3.0.0/`),
|
|
60
|
+
* so cross-package imports resolved through the workspace keep working once published on deno.land/x.
|
|
61
|
+
*/ export async function workspaceImports(cwd = Deno.cwd()) {
|
|
62
|
+
const imports = {};
|
|
63
|
+
for(let root = resolve(cwd);; root = dirname(root)){
|
|
64
|
+
const parsed = manifest(root);
|
|
65
|
+
if (parsed?.workspace) {
|
|
66
|
+
for (const member of parsed.workspace){
|
|
67
|
+
for await (const { path } of expandGlob(`${member}/deno.json?(c)`, {
|
|
68
|
+
root,
|
|
69
|
+
includeDirs: false
|
|
70
|
+
})){
|
|
71
|
+
const { name, version } = manifest(dirname(path));
|
|
72
|
+
if (!name || !version) continue;
|
|
73
|
+
imports[name] = `jsr:${name}@^${version}`;
|
|
74
|
+
imports[`${name}/`] = `jsr:${name}@^${version}/`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return imports;
|
|
78
|
+
}
|
|
79
|
+
if (root === dirname(root)) return imports;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Read and parse the `deno.jsonc` or `deno.json` manifest from a directory (`null` when absent). */ export function manifest(directory) {
|
|
83
|
+
for (const filename of [
|
|
84
|
+
"deno.jsonc",
|
|
85
|
+
"deno.json"
|
|
86
|
+
]){
|
|
87
|
+
try {
|
|
88
|
+
return JSONC.parse(Deno.readTextFileSync(resolve(directory, filename)));
|
|
89
|
+
} catch (error) {
|
|
90
|
+
if (!(error instanceof Deno.errors.NotFound)) throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL3B1Ymxpc2gvX3V0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiQGxpYnMvdHlwaW5nXCJcbmltcG9ydCB7IGV4cGFuZEdsb2IgfSBmcm9tIFwiQHN0ZC9mc1wiXG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIkBzdGQvcGF0aFwiXG5pbXBvcnQgKiBhcyBKU09OQyBmcm9tIFwiQHN0ZC9qc29uYy9wYXJzZVwiXG5cbi8qKlxuICogUmV3cml0ZSB0aGUgc2NvcGUgb2YgaW1wb3J0IHNwZWNpZmllcnMgaW4gZmlsZSBjb250ZW50LlxuICpcbiAqIEFuIGVtcHR5IGB0b2AgcmVtb3ZlcyB0aGUgc2NvcGUgZW50aXJlbHkuXG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHJlc2NvcGUgfSBmcm9tIFwiLi9fdXRpbHMudHNcIlxuICogcmVzY29wZSgnaW1wb3J0IHsgY29tbWFuZCB9IGZyb20gXCJAbGlicy9ydW4vY29tbWFuZFwiJywgeyBmcm9tOiBcIkBsaWJzXCIsIHRvOiBcIkBsb3dsaWdodGVyXCIgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzY29wZShjb250ZW50OiBzdHJpbmcsIHsgZnJvbSwgdG8gfTogeyBmcm9tOiBzdHJpbmc7IHRvOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIHJldHVybiBjb250ZW50LnJlcGxhY2VBbGwoYFwiJHtmcm9tfS9gLCB0byA/IGBcIiR7dG99L2AgOiBgXCJgKVxufVxuXG4vKipcbiAqIFJlc29sdmUgYWxsIGltcG9ydHMgZnJvbSBmaWxlIGNvbnRlbnQgYWdhaW5zdCBhbiBpbXBvcnQgbWFwLlxuICpcbiAqIEJhcmUgc3BlY2lmaWVycyBtYXRjaGluZyBhbiBpbXBvcnQgbWFwIGVudHJ5IGFyZSByZXBsYWNlZCBieSB0aGVpciBtYXBwZWQgdmFsdWUsXG4gKiBhbmQgc3BlY2lmaWVycyBtYXRjaGluZyBhIHRyYWlsaW5nLXNsYXNoIGVudHJ5IGhhdmUgdGhlaXIgcHJlZml4IHN1YnN0aXR1dGVkLlxuICpcbiAqIEJvdGggc3RhdGljIGltcG9ydHMgYW5kIHN0YXRpY2FsbHkgYW5hbHl6YWJsZSBkeW5hbWljIGltcG9ydHMgKGkuZS4gYGltcG9ydCgpYCBjYWxscyB3aXRoIGEgc3RyaW5nIGxpdGVyYWwpIGFyZSByZXNvbHZlZC5cbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdW5tYXAgfSBmcm9tIFwiLi9fdXRpbHMudHNcIlxuICogdW5tYXAoJ2ltcG9ydCB7IGNvbW1hbmQgfSBmcm9tIFwiQGxpYnMvcnVuL2NvbW1hbmRcIicsIHsgXCJAbGlicy9ydW4vXCI6IFwianNyOkBsaWJzL3J1bkBeMy4wLjAvXCIgfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tYXAoY29udGVudDogc3RyaW5nLCBpbXBvcnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogeyByZXN1bHQ6IHN0cmluZzsgcmVzb2x2ZWQ6IG51bWJlciB9IHtcbiAgbGV0IHJlc29sdmVkID0gMFxuICBjb25zdCBkaXJlY3RvcmllcyA9IE9iamVjdC5rZXlzKGltcG9ydHMpLmZpbHRlcigobW9kdWxlKSA9PiBtb2R1bGUuZW5kc1dpdGgoXCIvXCIpKVxuICBjb25zdCByZW1hcCA9IChtb2R1bGU6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXBwZWQgPSBudWxsIGFzIE51bGxhYmxlPHN0cmluZz5cbiAgICBpZiAobW9kdWxlIGluIGltcG9ydHMpXG4gICAgICBtYXBwZWQgPSBpbXBvcnRzW21vZHVsZV1cbiAgICBlbHNlIGlmIChkaXJlY3Rvcmllcy5zb21lKChkaXJlY3RvcnkpID0+IG1vZHVsZS5zdGFydHNXaXRoKGRpcmVjdG9yeSkpKSB7XG4gICAgICBjb25zdCBbZGlyZWN0b3J5XSA9IGRpcmVjdG9yaWVzLmZpbHRlcigoZGlyZWN0b3J5KSA9PiBtb2R1bGUuc3RhcnRzV2l0aChkaXJlY3RvcnkpKS5zb3J0KChhLCBiKSA9PiBiLmxlbmd0aCAtIGEubGVuZ3RoKVxuICAgICAgbWFwcGVkID0gbW9kdWxlLnJlcGxhY2UoZGlyZWN0b3J5LCBpbXBvcnRzW2RpcmVjdG9yeV0pXG4gICAgfVxuICAgIHJldHVybiBtYXBwZWRcbiAgfVxuICBjb25zdCBzdWJzdGl0dXRlID0gKG1hdGNoOiBzdHJpbmcsIHN0YXRlbWVudDogc3RyaW5nLCBxdW90ZTogc3RyaW5nLCBtb2R1bGU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1hcHBlZCA9IHJlbWFwKG1vZHVsZSlcbiAgICBpZiAodHlwZW9mIG1hcHBlZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmVzb2x2ZWQrK1xuICAgICAgcmV0dXJuIGAke3N0YXRlbWVudH0ke21hcHBlZH0ke3F1b3RlfWBcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY29udGVudFxuICAgIC5yZXBsYWNlKC9eKD88c3RhdGVtZW50PlxccyooPzppbXBvcnR8ZXhwb3J0KVxccyooPzooPzpcXHMrdHlwZSk/XFxzKyg/OlteXFxuXSs/fCg/Olxce1tcXHNcXFNdKj9cXH0pKVxccytmcm9tXFxzKyk/KD88cXVvdGU+W1wiJ10pKSg/PG1vZHVsZT5bXlxcbl0rPylcXGs8cXVvdGU+L2dtLCBzdWJzdGl0dXRlKVxuICAgIC5yZXBsYWNlKC8oPzxzdGF0ZW1lbnQ+XFxiaW1wb3J0XFxzKlxcKFxccyooPzxxdW90ZT5bXCInXSkpKD88bW9kdWxlPlteXCInXFxuXSs/KVxcazxxdW90ZT4vZywgc3Vic3RpdHV0ZSlcbiAgcmV0dXJuIHsgcmVzdWx0LCByZXNvbHZlZCB9XG59XG5cbi8qKlxuICogQ29tcHV0ZSBhbiBpbXBvcnQgbWFwIGZvciB3b3Jrc3BhY2UgbWVtYmVycy5cbiAqXG4gKiBUaGUgd29ya3NwYWNlIHJvb3QgaXMgbG9jYXRlZCBieSB3YWxraW5nIHVwIGZyb20gYGN3ZGAgdW50aWwgYSBgZGVuby5qc29uKGMpYCBtYW5pZmVzdCB3aXRoIGEgYHdvcmtzcGFjZWAgZmllbGQgaXMgZm91bmQuXG4gKiBFYWNoIG1lbWJlciB3aXRoIGEgYG5hbWVgIGFuZCBgdmVyc2lvbmAgaXMgbWFwcGVkIHRvIGl0cyBqc3IuaW8gY291bnRlcnBhcnQgKGUuZy4gYEBsaWJzL3J1bi9gIOKGkiBganNyOkBsaWJzL3J1bkBeMy4wLjAvYCksXG4gKiBzbyBjcm9zcy1wYWNrYWdlIGltcG9ydHMgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgd29ya3NwYWNlIGtlZXAgd29ya2luZyBvbmNlIHB1Ymxpc2hlZCBvbiBkZW5vLmxhbmQveC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdvcmtzcGFjZUltcG9ydHMoY3dkOiBzdHJpbmcgPSBEZW5vLmN3ZCgpKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IGltcG9ydHMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGZvciAobGV0IHJvb3QgPSByZXNvbHZlKGN3ZCk7OyByb290ID0gZGlybmFtZShyb290KSkge1xuICAgIGNvbnN0IHBhcnNlZCA9IG1hbmlmZXN0KHJvb3QpXG4gICAgaWYgKHBhcnNlZD8ud29ya3NwYWNlKSB7XG4gICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBwYXJzZWQud29ya3NwYWNlKSB7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgeyBwYXRoIH0gb2YgZXhwYW5kR2xvYihgJHttZW1iZXJ9L2Rlbm8uanNvbj8oYylgLCB7IHJvb3QsIGluY2x1ZGVEaXJzOiBmYWxzZSB9KSkge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gbWFuaWZlc3QoZGlybmFtZShwYXRoKSkhXG4gICAgICAgICAgaWYgKCghbmFtZSkgfHwgKCF2ZXJzaW9uKSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgaW1wb3J0c1tuYW1lXSA9IGBqc3I6JHtuYW1lfUBeJHt2ZXJzaW9ufWBcbiAgICAgICAgICBpbXBvcnRzW2Ake25hbWV9L2BdID0gYGpzcjoke25hbWV9QF4ke3ZlcnNpb259L2BcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGltcG9ydHNcbiAgICB9XG4gICAgaWYgKHJvb3QgPT09IGRpcm5hbWUocm9vdCkpXG4gICAgICByZXR1cm4gaW1wb3J0c1xuICB9XG59XG5cbi8qKiBQYXJzZWQgYGRlbm8uanNvbihjKWAgbWFuaWZlc3QuICovXG50eXBlIE1hbmlmZXN0ID0geyBuYW1lPzogc3RyaW5nOyB2ZXJzaW9uPzogc3RyaW5nOyB3b3Jrc3BhY2U/OiBzdHJpbmdbXTsgaW1wb3J0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHB1Ymxpc2g/OiB7IGV4Y2x1ZGU/OiBzdHJpbmdbXSB9IH1cblxuLyoqIFJlYWQgYW5kIHBhcnNlIHRoZSBgZGVuby5qc29uY2Agb3IgYGRlbm8uanNvbmAgbWFuaWZlc3QgZnJvbSBhIGRpcmVjdG9yeSAoYG51bGxgIHdoZW4gYWJzZW50KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYW5pZmVzdChkaXJlY3Rvcnk6IHN0cmluZyk6IE51bGxhYmxlPE1hbmlmZXN0PiB7XG4gIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgW1wiZGVuby5qc29uY1wiLCBcImRlbm8uanNvblwiXSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTkMucGFyc2UoRGVuby5yZWFkVGV4dEZpbGVTeW5jKHJlc29sdmUoZGlyZWN0b3J5LCBmaWxlbmFtZSkpKSBhcyBNYW5pZmVzdFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIERlbm8uZXJyb3JzLk5vdEZvdW5kKSlcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGxcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBRVYsU0FBUyxVQUFVLFFBQVEs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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Publish a package on npm registries. */ export declare function publish({}?: Options): Promise<{
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
directory: string;
|
|
5
|
+
}>;
|
|
6
|
+
/** Publishing options for {@linkcode publish()}. */ export type Options = {
|
|
7
|
+
/** Path to the package to publish (defaults to the current working directory). */ package?: string;
|
|
8
|
+
/** Scope to publish under: `"@"` keeps the original scope (default), `""` removes the scope, any other value replaces it. */ scope?: string;
|
|
9
|
+
/** Whether to publish with private (restricted) registry access (defaults to `false`). */ private?: boolean;
|
|
10
|
+
/** Do not actually publish (the package is packed and rewritten, but `npm publish` is run with `--dry-run`). */ dryrun?: boolean;
|
|
11
|
+
};
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// deno-lint-ignore-file no-console
|
|
2
|
+
/**
|
|
3
|
+
* Publish a package on npm registries.
|
|
4
|
+
*
|
|
5
|
+
* 1. Run `deno pack` to create an npm-compatible tarball
|
|
6
|
+
* 2. Extract it and rewrite the package scope (e.g. `@libs/git` → `@lowlighter/git`), both in `package.json` and in compiled files
|
|
7
|
+
* 3. Add `dependencies` entries for workspace members imported by the package (which `deno pack` leaves as bare specifiers)
|
|
8
|
+
* 4. Run `npm publish` on the extracted package
|
|
9
|
+
*
|
|
10
|
+
* Authentication is expected to be configured beforehand (e.g. through a `~/.npmrc` file).
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/ // Imports
|
|
14
|
+
import { parseArgs } from "@std/cli";
|
|
15
|
+
import { expandGlob } from "@std/fs";
|
|
16
|
+
import { command } from "@lowlighter/run/command";
|
|
17
|
+
import { rescope, workspaceImports } from "./_utils.js";
|
|
18
|
+
import { cyan, gray, green } from "@std/fmt/colors";
|
|
19
|
+
/** Publish a package on npm registries. */ export async function publish({ package: pkg = Deno.cwd(), scope = "@", private: restricted = false, dryrun = false } = {}) {
|
|
20
|
+
// Create npm-compatible tarball and extract it
|
|
21
|
+
const env = Deno.env.toObject();
|
|
22
|
+
const directory = await Deno.makeTempDir();
|
|
23
|
+
console.error(`packing ${pkg} to ${directory}`);
|
|
24
|
+
await command("deno", [
|
|
25
|
+
"pack",
|
|
26
|
+
"--allow-dirty",
|
|
27
|
+
"--quiet",
|
|
28
|
+
"--output",
|
|
29
|
+
`${directory}/package.tgz`
|
|
30
|
+
], {
|
|
31
|
+
env,
|
|
32
|
+
cwd: pkg,
|
|
33
|
+
throw: true
|
|
34
|
+
});
|
|
35
|
+
await command("tar", [
|
|
36
|
+
"--extract",
|
|
37
|
+
"--gzip",
|
|
38
|
+
`--file=${directory}/package.tgz`,
|
|
39
|
+
`--directory=${directory}`
|
|
40
|
+
], {
|
|
41
|
+
env,
|
|
42
|
+
throw: true
|
|
43
|
+
});
|
|
44
|
+
// Rewrite package scope and register workspace dependencies
|
|
45
|
+
const manifest = JSON.parse(await Deno.readTextFile(`${directory}/package/package.json`));
|
|
46
|
+
if (!manifest.name.startsWith("@")) throw new RangeError(`Package name is not scoped: ${manifest.name}`);
|
|
47
|
+
const from = manifest.name.split("/")[0];
|
|
48
|
+
const to = scope === "@" ? from : scope;
|
|
49
|
+
const rename = (name)=>to ? name.replace(from, to) : name.replace(`${from}/`, "");
|
|
50
|
+
const workspace = await workspaceImports(pkg);
|
|
51
|
+
const members = Object.fromEntries(Object.entries(workspace).filter(([member])=>!member.endsWith("/")).map(([member, jsr])=>[
|
|
52
|
+
member,
|
|
53
|
+
jsr.match(/@\^(?<version>.*)$/).groups.version
|
|
54
|
+
]));
|
|
55
|
+
manifest.name = rename(manifest.name);
|
|
56
|
+
console.error(`rewriting scope ${from} → ${to || "(no scope)"} for ${manifest.name}@${manifest.version}`);
|
|
57
|
+
for await (const { path } of expandGlob("package/**/*.{js,mjs,cjs,ts,mts,cts}", {
|
|
58
|
+
root: directory,
|
|
59
|
+
includeDirs: false
|
|
60
|
+
})){
|
|
61
|
+
const content = await Deno.readTextFile(path);
|
|
62
|
+
for (const [member, version] of Object.entries(members)){
|
|
63
|
+
if (new RegExp(`["']${member}(?:/[^"']*)?["']`).test(content)) {
|
|
64
|
+
manifest.dependencies ??= {};
|
|
65
|
+
manifest.dependencies[rename(member)] ??= `^${version}`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
await Deno.writeTextFile(path, rescope(content, {
|
|
69
|
+
from,
|
|
70
|
+
to
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
const manifestJson = JSON.stringify(manifest, null, 2);
|
|
74
|
+
console.error(gray(manifestJson));
|
|
75
|
+
await Deno.writeTextFile(`${directory}/package/package.json`, `${manifestJson}\n`);
|
|
76
|
+
// Publish extracted package
|
|
77
|
+
console.error(cyan(`publishing ${manifest.name}@${manifest.version}${dryrun ? " (dryrun)" : ""}`));
|
|
78
|
+
await command("npm", [
|
|
79
|
+
"publish",
|
|
80
|
+
`${directory}/package`,
|
|
81
|
+
"--access",
|
|
82
|
+
restricted ? "restricted" : "public",
|
|
83
|
+
...dryrun ? [
|
|
84
|
+
"--dry-run"
|
|
85
|
+
] : []
|
|
86
|
+
], {
|
|
87
|
+
env,
|
|
88
|
+
throw: true
|
|
89
|
+
});
|
|
90
|
+
console.error(green(`published ${manifest.name}@${manifest.version}`));
|
|
91
|
+
return {
|
|
92
|
+
name: manifest.name,
|
|
93
|
+
version: manifest.version,
|
|
94
|
+
directory
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// Entry point
|
|
98
|
+
if (import.meta.main) {
|
|
99
|
+
const args = parseArgs(Deno.args, {
|
|
100
|
+
string: [
|
|
101
|
+
"package",
|
|
102
|
+
"scope"
|
|
103
|
+
],
|
|
104
|
+
boolean: [
|
|
105
|
+
"private",
|
|
106
|
+
"dryrun",
|
|
107
|
+
"help"
|
|
108
|
+
],
|
|
109
|
+
default: {
|
|
110
|
+
scope: "@"
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
if (args.help) {
|
|
114
|
+
console.error("Usage: deno run --allow-all jsr:@libs/toolbox/scripts/publish/npm [options]");
|
|
115
|
+
console.error("");
|
|
116
|
+
console.error("Options:");
|
|
117
|
+
console.error(" --package [package] Path to the package to publish (defaults to the current working directory)");
|
|
118
|
+
console.error(" --scope [scope=@] Scope to publish under (`@` keeps the original scope, an empty value removes it, any other value replaces it)");
|
|
119
|
+
console.error(" --private Publish with private (restricted) registry access (default: public)");
|
|
120
|
+
console.error(" --dryrun Do not actually publish");
|
|
121
|
+
Deno.exit(2);
|
|
122
|
+
}
|
|
123
|
+
await publish({
|
|
124
|
+
package: args.package,
|
|
125
|
+
scope: args.scope,
|
|
126
|
+
private: args.private,
|
|
127
|
+
dryrun: args.dryrun
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9saWJzL2xpYnMvQGxpYnMvdG9vbGJveC9zY3JpcHRzL3B1Ymxpc2gvbnBtLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGRlbm8tbGludC1pZ25vcmUtZmlsZSBuby1jb25zb2xlXG4vKipcbiAqIFB1Ymxpc2ggYSBwYWNrYWdlIG9uIG5wbSByZWdpc3RyaWVzLlxuICpcbiAqIDEuIFJ1biBgZGVubyBwYWNrYCB0byBjcmVhdGUgYW4gbnBtLWNvbXBhdGlibGUgdGFyYmFsbFxuICogMi4gRXh0cmFjdCBpdCBhbmQgcmV3cml0ZSB0aGUgcGFja2FnZSBzY29wZSAoZS5nLiBgQGxpYnMvZ2l0YCDihpIgYEBsb3dsaWdodGVyL2dpdGApLCBib3RoIGluIGBwYWNrYWdlLmpzb25gIGFuZCBpbiBjb21waWxlZCBmaWxlc1xuICogMy4gQWRkIGBkZXBlbmRlbmNpZXNgIGVudHJpZXMgZm9yIHdvcmtzcGFjZSBtZW1iZXJzIGltcG9ydGVkIGJ5IHRoZSBwYWNrYWdlICh3aGljaCBgZGVubyBwYWNrYCBsZWF2ZXMgYXMgYmFyZSBzcGVjaWZpZXJzKVxuICogNC4gUnVuIGBucG0gcHVibGlzaGAgb24gdGhlIGV4dHJhY3RlZCBwYWNrYWdlXG4gKlxuICogQXV0aGVudGljYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgY29uZmlndXJlZCBiZWZvcmVoYW5kIChlLmcuIHRocm91Z2ggYSBgfi8ubnBtcmNgIGZpbGUpLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG4vLyBJbXBvcnRzXG5pbXBvcnQgeyBwYXJzZUFyZ3MgfSBmcm9tIFwiQHN0ZC9jbGlcIlxuaW1wb3J0IHsgZXhwYW5kR2xvYiB9IGZyb20gXCJAc3RkL2ZzXCJcbmltcG9ydCB7IGNvbW1hbmQgfSBmcm9tIFwiQGxpYnMvcnVuL2NvbW1hbmRcIlxuaW1wb3J0IHsgcmVzY29wZSwgd29ya3NwYWNlSW1wb3J0cyB9IGZyb20gXCIuL191dGlscy5qc1wiXG5pbXBvcnQgeyBjeWFuLCBncmF5LCBncmVlbiB9IGZyb20gXCJAc3RkL2ZtdC9jb2xvcnNcIlxuXG4vKiogUHVibGlzaCBhIHBhY2thZ2Ugb24gbnBtIHJlZ2lzdHJpZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVibGlzaCh7IHBhY2thZ2U6IHBrZyA9IERlbm8uY3dkKCksIHNjb3BlID0gXCJAXCIsIHByaXZhdGU6IHJlc3RyaWN0ZWQgPSBmYWxzZSwgZHJ5cnVuID0gZmFsc2UgfTogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nOyBkaXJlY3Rvcnk6IHN0cmluZyB9PiB7XG4gIC8vIENyZWF0ZSBucG0tY29tcGF0aWJsZSB0YXJiYWxsIGFuZCBleHRyYWN0IGl0XG4gIGNvbnN0IGVudiA9IERlbm8uZW52LnRvT2JqZWN0KClcbiAgY29uc3QgZGlyZWN0b3J5ID0gYXdhaXQgRGVuby5tYWtlVGVtcERpcigpXG4gIGNvbnNvbGUuZXJyb3IoYHBhY2tpbmcgJHtwa2d9IHRvICR7ZGlyZWN0b3J5fWApXG4gIGF3YWl0IGNvbW1hbmQoXCJkZW5vXCIsIFtcInBhY2tcIiwgXCItLWFsbG93LWRpcnR5XCIsIFwiLS1xdWlldFwiLCBcIi0tb3V0cHV0XCIsIGAke2RpcmVjdG9yeX0vcGFja2FnZS50Z3pgXSwgeyBlbnYsIGN3ZDogcGtnLCB0aHJvdzogdHJ1ZSB9KVxuICBhd2FpdCBjb21tYW5kKFwidGFyXCIsIFtcIi0tZXh0cmFjdFwiLCBcIi0tZ3ppcFwiLCBgLS1maWxlPSR7ZGlyZWN0b3J5fS9wYWNrYWdlLnRnemAsIGAtLWRpcmVjdG9yeT0ke2RpcmVjdG9yeX1gXSwgeyBlbnYsIHRocm93OiB0cnVlIH0pXG5cbiAgLy8gUmV3cml0ZSBwYWNrYWdlIHNjb3BlIGFuZCByZWdpc3RlciB3b3Jrc3BhY2UgZGVwZW5kZW5jaWVzXG4gIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5wYXJzZShhd2FpdCBEZW5vLnJlYWRUZXh0RmlsZShgJHtkaXJlY3Rvcnl9L3BhY2thZ2UvcGFja2FnZS5qc29uYCkpIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfVxuICBpZiAoIW1hbmlmZXN0Lm5hbWUuc3RhcnRzV2l0aChcIkBcIikpXG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBhY2thZ2UgbmFtZSBpcyBub3Qgc2NvcGVkOiAke21hbmlmZXN0Lm5hbWV9YClcbiAgY29uc3QgZnJvbSA9IG1hbmlmZXN0Lm5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gIGNvbnN0IHRvID0gc2NvcGUgPT09IFwiQFwiID8gZnJvbSA6IHNjb3BlXG4gIGNvbnN0IHJlbmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHRvID8gbmFtZS5yZXBsYWNlKGZyb20sIHRvKSA6IG5hbWUucmVwbGFjZShgJHtmcm9tfS9gLCBcIlwiKVxuICBjb25zdCB3b3Jrc3BhY2UgPSBhd2FpdCB3b3Jrc3BhY2VJbXBvcnRzKHBrZylcbiAgY29uc3QgbWVtYmVycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh3b3Jrc3BhY2UpXG4gICAgICAuZmlsdGVyKChbbWVtYmVyXSkgPT4gIW1lbWJlci5lbmRzV2l0aChcIi9cIikpXG4gICAgICAubWFwKChbbWVtYmVyLCBqc3JdKSA9PiBbbWVtYmVyLCBqc3IubWF0Y2goL0BcXF4oPzx2ZXJzaW9uPi4qKSQvKSEuZ3JvdXBzIS52ZXJzaW9uXSksXG4gIClcbiAgbWFuaWZlc3QubmFtZSA9IHJlbmFtZShtYW5pZmVzdC5uYW1lKVxuICBjb25zb2xlLmVycm9yKGByZXdyaXRpbmcgc2NvcGUgJHtmcm9tfSDihpIgJHt0byB8fCBcIihubyBzY29wZSlcIn0gZm9yICR7bWFuaWZlc3QubmFtZX1AJHttYW5pZmVzdC52ZXJzaW9ufWApXG4gIGZvciBhd2FpdCAoY29uc3QgeyBwYXRoIH0gb2YgZXhwYW5kR2xvYihcInBhY2thZ2UvKiovKi57anMsbWpzLGNqcyx0cyxtdHMsY3RzfVwiLCB7IHJvb3Q6IGRpcmVjdG9yeSwgaW5jbHVkZURpcnM6IGZhbHNlIH0pKSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IERlbm8ucmVhZFRleHRGaWxlKHBhdGgpXG4gICAgZm9yIChjb25zdCBbbWVtYmVyLCB2ZXJzaW9uXSBvZiBPYmplY3QuZW50cmllcyhtZW1iZXJzKSkge1xuICAgICAgaWYgKG5ldyBSZWdFeHAoYFtcIiddJHttZW1iZXJ9KD86L1teXCInXSopP1tcIiddYCkudGVzdChjb250ZW50KSkge1xuICAgICAgICBtYW5pZmVzdC5kZXBlbmRlbmNpZXMgPz89IHt9XG4gICAgICAgIG1hbmlmZXN0LmRlcGVuZGVuY2llc1tyZW5hbWUobWVtYmVyKV0gPz89IGBeJHt2ZXJzaW9ufWBcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgRGVuby53cml0ZVRleHRGaWxlKHBhdGgsIHJlc2NvcGUoY29udGVudCwgeyBmcm9tLCB0byB9KSlcbiAgfVxuICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMilcbiAgY29uc29sZS5lcnJvcihncmF5KG1hbmlmZXN0SnNvbikpXG4gIGF3YWl0IERlbm8ud3JpdGVUZXh0RmlsZShgJHtkaXJlY3Rvcnl9L3BhY2thZ2UvcGFja2FnZS5qc29uYCwgYCR7bWFuaWZlc3RKc29ufVxcbmApXG5cbiAgLy8gUHVibGlzaCBleHRyYWN0ZWQgcGFja2FnZVxuICBjb25zb2xlLmVycm9yKGN5YW4oYHB1Ymxpc2hpbmcgJHttYW5pZmVzdC5uYW1lfUAke21hbmlmZXN0LnZlcnNpb259JHtkcnlydW4gPyBcIiAoZHJ5cnVuKVwiIDogXCJcIn1gKSlcbiAgYXdhaXQgY29tbWFuZChcIm5wbVwiLCBbXCJwdWJsaXNoXCIsIGAke2RpcmVjdG9yeX0vcGFja2FnZWAsIFwiLS1hY2Nlc3NcIiwgcmVzdHJpY3RlZCA/IFwicmVzdHJpY3RlZFwiIDogXCJwdWJsaWNcIiwgLi4uKGRyeXJ1biA/IFtcIi0tZHJ5LXJ1blwiXSA6IFtdKV0sIHsgZW52LCB0aHJvdzogdHJ1ZSB9KVxuICBjb25zb2xlLmVycm9yKGdyZWVuKGBwdWJsaXNoZWQgJHttYW5pZmVzdC5uYW1lfUAke21hbmlmZXN0LnZlcnNpb259YCkpXG4gIHJldHVybiB7IG5hbWU6IG1hbmlmZXN0Lm5hbWUsIHZlcnNpb246IG1hbmlmZXN0LnZlcnNpb24sIGRpcmVjdG9yeSB9XG59XG5cbi8qKiBQdWJsaXNoaW5nIG9wdGlvbnMgZm9yIHtAbGlua2NvZGUgcHVibGlzaCgpfS4gKi9cbmV4cG9ydCB0eXBlIE9wdGlvbnMgPSB7XG4gIC8qKiBQYXRoIHRvIHRoZSBwYWNrYWdlIHRvIHB1Ymxpc2ggKGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KS4gKi9cbiAgcGFja2FnZT86IHN0cmluZ1xuICAvKiogU2NvcGUgdG8gcHVibGlzaCB1bmRlcjogYFwiQFwiYCBrZWVwcyB0aGUgb3JpZ2luYWwgc2NvcGUgKGRlZmF1bHQpLCBgXCJcImAgcmVtb3ZlcyB0aGUgc2NvcGUsIGFueSBvdGhlciB2YWx1ZSByZXBsYWNlcyBpdC4gKi9cbiAgc2NvcGU/OiBzdHJpbmdcbiAgLyoqIFdoZXRoZXIgdG8gcHVibGlzaCB3aXRoIHByaXZhdGUgKHJlc3RyaWN0ZWQpIHJlZ2lzdHJ5IGFjY2VzcyAoZGVmYXVsdHMgdG8gYGZhbHNlYCkuICovXG4gIHByaXZhdGU/OiBib29sZWFuXG4gIC8qKiBEbyBub3QgYWN0dWFsbHkgcHVibGlzaCAodGhlIHBhY2thZ2UgaXMgcGFja2VkIGFuZCByZXdyaXR0ZW4sIGJ1dCBgbnBtIHB1Ymxpc2hgIGlzIHJ1biB3aXRoIGAtLWRyeS1ydW5gKS4gKi9cbiAgZHJ5cnVuPzogYm9vbGVhblxufVxuXG4vLyBFbnRyeSBwb2ludFxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgYXJncyA9IHBhcnNlQXJncyhEZW5vLmFyZ3MsIHsgc3RyaW5nOiBbXCJwYWNrYWdlXCIsIFwic2NvcGVcIl0sIGJvb2xlYW46IFtcInByaXZhdGVcIiwgXCJkcnlydW5cIiwgXCJoZWxwXCJdLCBkZWZhdWx0OiB7IHNjb3BlOiBcIkBcIiB9IH0pXG4gIGlmIChhcmdzLmhlbHApIHtcbiAgICBjb25zb2xlLmVycm9yKFwiVXNhZ2U6IGRlbm8gcnVuIC0tYWxsb3ctYWxsIGpzcjpAbGlicy90b29sYm94L3NjcmlwdHMvcHVibGlzaC9ucG0gW29wdGlvbnNdXCIpXG4gICAgY29uc29sZS5lcnJvcihcIlwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCJPcHRpb25zOlwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCIgIC0tcGFja2FnZSBbcGFja2FnZV0gIFBhdGggdG8gdGhlIHBhY2thZ2UgdG8gcHVibGlzaCAoZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpXCIpXG4gICAgY29uc29sZS5lcnJvcihcIiAgLS1zY29wZSBbc2NvcGU9QF0gICAgU2NvcGUgdG8gcHVibGlzaCB1bmRlciAoYEBgIGtlZXBzIHRoZSBvcmlnaW5hbCBzY29wZSwgYW4gZW1wdHkgdmFsdWUgcmVtb3ZlcyBpdCwgYW55IG90aGVyIHZhbHVlIHJlcGxhY2VzIGl0KVwiKVxuICAgIGNvbnNvbGUuZXJyb3IoXCIgIC0tcHJpdmF0ZSAgICAgICAgICAgIFB1Ymxpc2ggd2l0aCBwcml2YXRlIChyZXN0cmljdGVkKSByZWdpc3RyeSBhY2Nlc3MgKGRlZmF1bHQ6IHB1YmxpYylcIilcbiAgICBjb25zb2xlLmVycm9yKFwiICAtLWRyeXJ1biAgICAgICAgICAgICBEbyBub3QgYWN0dWFsbHkgcHVibGlzaFwiKVxuICAgIERlbm8uZXhpdCgyKVxuICB9XG4gIGF3YWl0IHB1Ymxpc2goeyBwYWNrYWdlOiBhcmdzLnBhY2thZ2UsIHNjb3BlOiBhcmdzLnNjb3BlLCBwcml2YXRlOiBhcmdzLnByaXZhdGUsIGRyeXJ1bjogYXJncy5kcnlydW4gfSlcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFDbkM7Ozs7Ozs7Ozs7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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Publish a package on deno.land/x. */ export declare function publish({}: Options): Promise<{
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
url: string;
|
|
5
|
+
changed: boolean;
|
|
6
|
+
}>;
|
|
7
|
+
/** Publishing options for {@linkcode publish()}. */ export type Options = {
|
|
8
|
+
/** GitHub API token. */ token: string;
|
|
9
|
+
/** GitHub repository (e.g. `octocat/hello-world`). */ repository: string;
|
|
10
|
+
/** Package name on deno.land/x. */ name: string;
|
|
11
|
+
/** Version to publish. */ version: string;
|
|
12
|
+
/** Subdirectory of the repository to publish (optional). */ directory?: string;
|
|
13
|
+
/** Path to an import map. When specified, a temporary branch with all imports resolved is created and published instead. */ map?: string;
|
|
14
|
+
/** Activate the webhook before publishing and restore its state afterwards. */ reactive?: boolean;
|
|
15
|
+
/** Remove the tag after publishing. */ remove?: boolean;
|
|
16
|
+
/** Maximum number of attempts for publishing operations to complete. */ attempts?: number;
|
|
17
|
+
/** Delay between each attempt (in milliseconds). */ delay?: number;
|
|
18
|
+
/** Do not actually publish (no file is written and no mutating git or remote call is made). */ dryrun?: boolean;
|
|
19
|
+
/** Fetch implementation (mostly used for testing purposes). */ fetcher?: typeof fetch;
|
|
20
|
+
};
|