@w6w/cli 0.9.16 → 0.9.24
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 +4 -0
- package/dist/mod.d.ts +1 -1
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +1 -1
- package/dist/src/args.d.ts +8 -1
- package/dist/src/args.d.ts.map +1 -1
- package/dist/src/args.js +15 -3
- package/dist/src/args.js.map +1 -1
- package/dist/src/commands/agents-studio.d.ts +24 -0
- package/dist/src/commands/agents-studio.d.ts.map +1 -0
- package/dist/src/commands/agents-studio.js +431 -0
- package/dist/src/commands/agents-studio.js.map +1 -0
- package/dist/src/commands/assets.d.ts +47 -0
- package/dist/src/commands/assets.d.ts.map +1 -0
- package/dist/src/commands/assets.js +412 -0
- package/dist/src/commands/assets.js.map +1 -0
- package/dist/src/commands/build.d.ts +42 -0
- package/dist/src/commands/build.d.ts.map +1 -0
- package/dist/src/commands/build.js +413 -0
- package/dist/src/commands/build.js.map +1 -0
- package/dist/src/commands/config.d.ts +21 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +73 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/connections.d.ts +1 -1
- package/dist/src/commands/connections.d.ts.map +1 -1
- package/dist/src/commands/connections.js +27 -2
- package/dist/src/commands/connections.js.map +1 -1
- package/dist/src/commands/index.d.ts +6 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +18 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/ls.d.ts +21 -0
- package/dist/src/commands/ls.d.ts.map +1 -0
- package/dist/src/commands/ls.js +53 -0
- package/dist/src/commands/ls.js.map +1 -0
- package/dist/src/commands/models.d.ts +16 -0
- package/dist/src/commands/models.d.ts.map +1 -0
- package/dist/src/commands/models.js +126 -0
- package/dist/src/commands/models.js.map +1 -0
- package/dist/src/commands/vars.d.ts.map +1 -1
- package/dist/src/commands/vars.js +2 -2
- package/dist/src/commands/vars.js.map +1 -1
- package/dist/src/help.generated.d.ts.map +1 -1
- package/dist/src/help.generated.js +2630 -51
- package/dist/src/help.generated.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `w6w build app <folder> [--out <dir>] [--pack <file>]` — turn an app folder into a
|
|
3
|
+
* self-describing bundle, locally.
|
|
4
|
+
*
|
|
5
|
+
* Declared in `endpoints.json` `cli.commands[]` (CLI-only: no API operation sits behind
|
|
6
|
+
* it, so the node and python lanes do not implement it). It never touches the network.
|
|
7
|
+
*
|
|
8
|
+
* The folder is a Node package: a `package.json` with a `w6w` block, `version`,
|
|
9
|
+
* `scripts.test`, `scripts.build` and a `main` that names the built single-file ESM
|
|
10
|
+
* bundle. The command runs `npm run test`, then `npm run build` (both streamed to
|
|
11
|
+
* stderr so `--json` stdout stays one document), and then writes, under the output
|
|
12
|
+
* directory:
|
|
13
|
+
*
|
|
14
|
+
* - `app.js` — the built file, byte for byte; its sha256 is the app's **digest**;
|
|
15
|
+
* - `manifest.json` — deterministic (no timestamps), with the app's definition read
|
|
16
|
+
* by importing the built file, and the names of its function-valued hooks. Every
|
|
17
|
+
* relative file the `w6w` block points at (icons) is embedded in its `app` block as a
|
|
18
|
+
* `data:` URI, so the bundle is self-contained.
|
|
19
|
+
*
|
|
20
|
+
* Nothing is written unless the tests and the build both pass. With `--pack`, the
|
|
21
|
+
* pack or index file is updated with the app's `id`, `version` and `digest` — a
|
|
22
|
+
* re-read, modify and rename done under an exclusive `<pack>.lock`, so many builds may
|
|
23
|
+
* share one pack concurrently.
|
|
24
|
+
*
|
|
25
|
+
* Host access follows the package's rule (see `src/store-fs.ts`): `node:` modules are
|
|
26
|
+
* imported through a non-literal specifier with structural types, so this compiles
|
|
27
|
+
* under the npm build's `"types": []` and runs under Deno and Node alike. The `npm`
|
|
28
|
+
* process is behind {@linkcode useBuildRunner}, the test suite's seam.
|
|
29
|
+
*
|
|
30
|
+
* @module
|
|
31
|
+
*/
|
|
32
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
33
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
34
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
35
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return path;
|
|
39
|
+
};
|
|
40
|
+
import { VERSION } from "../../mod.js";
|
|
41
|
+
import { argument, noExtraArguments, textFlag, usageError } from "./shared.js";
|
|
42
|
+
let hostPromise;
|
|
43
|
+
/** The `node:` built-ins, imported by variable so the npm build needs no host types. */
|
|
44
|
+
function host() {
|
|
45
|
+
hostPromise ??= (async () => {
|
|
46
|
+
const fsName = "node:fs/promises";
|
|
47
|
+
const pathName = "node:path";
|
|
48
|
+
const urlName = "node:url";
|
|
49
|
+
const fs = (await import(__rewriteRelativeImportExtension(fsName)));
|
|
50
|
+
const path = (await import(__rewriteRelativeImportExtension(pathName)));
|
|
51
|
+
const url = (await import(__rewriteRelativeImportExtension(urlName)));
|
|
52
|
+
return { fs, path, fileUrl: (p) => url.pathToFileURL(p).href };
|
|
53
|
+
})();
|
|
54
|
+
return hostPromise;
|
|
55
|
+
}
|
|
56
|
+
const hostRunner = async (args, cwd) => {
|
|
57
|
+
const name = "node:child_process";
|
|
58
|
+
const { spawn } = (await import(__rewriteRelativeImportExtension(name)));
|
|
59
|
+
const windows = globalThis.process?.platform ===
|
|
60
|
+
"win32" ||
|
|
61
|
+
globalThis.Deno?.build?.os === "windows";
|
|
62
|
+
return await new Promise((resolve, reject) => {
|
|
63
|
+
// stdout is redirected to stderr (fd 2) so the command's own stdout stays clean.
|
|
64
|
+
const child = spawn("npm", args, { cwd, stdio: ["ignore", 2, 2], shell: windows });
|
|
65
|
+
child.on("error", reject);
|
|
66
|
+
child.on("close", (code) => resolve(code ?? 1));
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
let runner = hostRunner;
|
|
70
|
+
/**
|
|
71
|
+
* Replace the `npm` runner — the test suite's seam. Returns a function that restores
|
|
72
|
+
* the previous one.
|
|
73
|
+
*/
|
|
74
|
+
export function useBuildRunner(replacement) {
|
|
75
|
+
const previous = runner;
|
|
76
|
+
runner = replacement;
|
|
77
|
+
return () => {
|
|
78
|
+
runner = previous;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function isObject(value) {
|
|
82
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
83
|
+
}
|
|
84
|
+
async function sha256Hex(bytes) {
|
|
85
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes);
|
|
86
|
+
return Array.from(new Uint8Array(digest), (b) => b.toString(16).padStart(2, "0")).join("");
|
|
87
|
+
}
|
|
88
|
+
async function isFile(fs, path) {
|
|
89
|
+
try {
|
|
90
|
+
return (await fs.stat(path)).isFile();
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function readJson(fs, path) {
|
|
97
|
+
return JSON.parse(await fs.readFile(path, "utf8"));
|
|
98
|
+
}
|
|
99
|
+
function toJson(value) {
|
|
100
|
+
return JSON.stringify(value, null, 2) + "\n";
|
|
101
|
+
}
|
|
102
|
+
function nonEmptyString(value) {
|
|
103
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
104
|
+
}
|
|
105
|
+
/** Names of an item's function-valued properties, in declaration order. */
|
|
106
|
+
function hookNames(item) {
|
|
107
|
+
if (!isObject(item))
|
|
108
|
+
return [];
|
|
109
|
+
return Object.keys(item).filter((key) => typeof item[key] === "function");
|
|
110
|
+
}
|
|
111
|
+
/** The JSON form of one definition item, plus the hooks it carries. */
|
|
112
|
+
function describeItem(item) {
|
|
113
|
+
const plain = JSON.parse(JSON.stringify(item ?? null));
|
|
114
|
+
if (!isObject(plain))
|
|
115
|
+
return plain;
|
|
116
|
+
return { ...plain, hooks: hookNames(item) };
|
|
117
|
+
}
|
|
118
|
+
const DEFINITION_LISTS = ["actions", "auth", "triggers", "healthChecks"];
|
|
119
|
+
function describeDefinition(definition) {
|
|
120
|
+
if (!isObject(definition)) {
|
|
121
|
+
throw new Error("the built file's default export is not an app definition (an object).");
|
|
122
|
+
}
|
|
123
|
+
const result = {};
|
|
124
|
+
for (const key of DEFINITION_LISTS) {
|
|
125
|
+
const value = definition[key];
|
|
126
|
+
const list = value === undefined || value === null
|
|
127
|
+
? []
|
|
128
|
+
: Array.isArray(value)
|
|
129
|
+
? value
|
|
130
|
+
: [value];
|
|
131
|
+
result[key] = list.map(describeItem);
|
|
132
|
+
}
|
|
133
|
+
for (const key of Object.keys(definition)) {
|
|
134
|
+
if (DEFINITION_LISTS.includes(key))
|
|
135
|
+
continue;
|
|
136
|
+
const value = definition[key];
|
|
137
|
+
if (typeof value === "function" || value === undefined)
|
|
138
|
+
continue;
|
|
139
|
+
result[key] = JSON.parse(JSON.stringify(value));
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
function parsePack(context, packFlag, text) {
|
|
144
|
+
let data = { apps: [] };
|
|
145
|
+
if (text !== undefined) {
|
|
146
|
+
try {
|
|
147
|
+
data = JSON.parse(text);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
throw usageError(context, `\`${packFlag}\` is not valid JSON.`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (!isObject(data) || !Array.isArray(data.apps)) {
|
|
154
|
+
throw usageError(context, `\`${packFlag}\` has no \`apps\` array.`);
|
|
155
|
+
}
|
|
156
|
+
return data;
|
|
157
|
+
}
|
|
158
|
+
async function readPackText(h, path) {
|
|
159
|
+
try {
|
|
160
|
+
return await h.fs.readFile(path, "utf8");
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return undefined; // a missing pack is created
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Validates the pack up front, so a bad file fails before test/build. */
|
|
167
|
+
async function checkPack(context, h, packFlag) {
|
|
168
|
+
const path = h.path.resolve(packFlag);
|
|
169
|
+
const data = parsePack(context, packFlag, await readPackText(h, path));
|
|
170
|
+
return { path, dir: h.path.dirname(path), data };
|
|
171
|
+
}
|
|
172
|
+
function updatePack(h, pack, folder, entry) {
|
|
173
|
+
const apps = pack.data.apps;
|
|
174
|
+
const byPath = apps.find((item) => isObject(item) && typeof item.path === "string" &&
|
|
175
|
+
h.path.resolve(pack.dir, item.path) === folder);
|
|
176
|
+
const target = byPath ?? apps.find((item) => isObject(item) && item.id === entry.id);
|
|
177
|
+
if (target) {
|
|
178
|
+
Object.assign(target, entry);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
apps.push({ ...entry });
|
|
182
|
+
}
|
|
183
|
+
const LOCK_TIMEOUT_MS = 30_000;
|
|
184
|
+
const LOCK_STALE_MS = 30_000;
|
|
185
|
+
function sleep(ms) {
|
|
186
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
187
|
+
}
|
|
188
|
+
/** Runs `work` while holding `<pack>.lock` (created with `wx`; stale locks are removed). */
|
|
189
|
+
async function withPackLock(h, packPath, work) {
|
|
190
|
+
const lock = `${packPath}.lock`;
|
|
191
|
+
const deadline = Date.now() + LOCK_TIMEOUT_MS;
|
|
192
|
+
for (;;) {
|
|
193
|
+
try {
|
|
194
|
+
await (await h.fs.open(lock, "wx")).close();
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (error.code !== "EEXIST")
|
|
199
|
+
throw error;
|
|
200
|
+
try {
|
|
201
|
+
if (Date.now() - (await h.fs.stat(lock)).mtimeMs > LOCK_STALE_MS) {
|
|
202
|
+
await h.fs.rm(lock, { force: true });
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
continue; // released between the open and the stat: try again at once
|
|
208
|
+
}
|
|
209
|
+
if (Date.now() > deadline) {
|
|
210
|
+
throw new Error(`timed out waiting for the pack lock \`${lock}\`.`);
|
|
211
|
+
}
|
|
212
|
+
await sleep(25 + Math.floor(Math.random() * 75));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
return await work();
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
await h.fs.rm(lock, { force: true });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Re-reads the pack, applies the entry, and renames a temp file over it, under the lock. */
|
|
223
|
+
async function commitPack(context, h, packFlag, pack, folder, entry) {
|
|
224
|
+
await h.fs.mkdir(pack.dir, { recursive: true });
|
|
225
|
+
await withPackLock(h, pack.path, async () => {
|
|
226
|
+
const fresh = {
|
|
227
|
+
...pack,
|
|
228
|
+
data: parsePack(context, packFlag, await readPackText(h, pack.path)),
|
|
229
|
+
};
|
|
230
|
+
updatePack(h, fresh, folder, entry);
|
|
231
|
+
const temp = `${pack.path}.${Math.random().toString(36).slice(2)}.tmp`;
|
|
232
|
+
try {
|
|
233
|
+
await h.fs.writeFile(temp, toJson(fresh.data));
|
|
234
|
+
await h.fs.rename(temp, pack.path);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
await h.fs.rm(temp, { force: true });
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// ---------------------------------------------------------------------------
|
|
243
|
+
// Assets
|
|
244
|
+
// ---------------------------------------------------------------------------
|
|
245
|
+
const MIME_TYPES = {
|
|
246
|
+
svg: "image/svg+xml",
|
|
247
|
+
png: "image/png",
|
|
248
|
+
jpg: "image/jpeg",
|
|
249
|
+
jpeg: "image/jpeg",
|
|
250
|
+
webp: "image/webp",
|
|
251
|
+
gif: "image/gif",
|
|
252
|
+
ico: "image/x-icon",
|
|
253
|
+
};
|
|
254
|
+
function base64(bytes) {
|
|
255
|
+
let binary = "";
|
|
256
|
+
for (let i = 0; i < bytes.length; i += 0x8000) {
|
|
257
|
+
binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
258
|
+
}
|
|
259
|
+
return btoa(binary);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Every string leaf of `value` that names an existing relative file, replaced in place by
|
|
263
|
+
* a `data:` URI. `http(s):` and `data:` values are not relative paths and stay as they are.
|
|
264
|
+
*/
|
|
265
|
+
async function embedAssets(h, folder, value, skip, context) {
|
|
266
|
+
if (typeof value === "string") {
|
|
267
|
+
if (!(value.startsWith("./") || value.startsWith("../")))
|
|
268
|
+
return value;
|
|
269
|
+
const source = h.path.resolve(folder, value);
|
|
270
|
+
if (skip.has(source) || !(await isFile(h.fs, source)))
|
|
271
|
+
return value;
|
|
272
|
+
const dot = source.lastIndexOf(".");
|
|
273
|
+
const extension = dot < 0 ? "" : source.slice(dot + 1).toLowerCase();
|
|
274
|
+
const mime = MIME_TYPES[extension];
|
|
275
|
+
if (mime === undefined) {
|
|
276
|
+
throw usageError(context, `cannot embed \`${value}\`: unsupported asset type \`${extension ? "." + extension : "(none)"}\` ` +
|
|
277
|
+
`(supported: ${Object.keys(MIME_TYPES).map((e) => "." + e).join(", ")}).`);
|
|
278
|
+
}
|
|
279
|
+
return `data:${mime};base64,${base64(await h.fs.readFile(source))}`;
|
|
280
|
+
}
|
|
281
|
+
if (Array.isArray(value)) {
|
|
282
|
+
const out = [];
|
|
283
|
+
for (const item of value)
|
|
284
|
+
out.push(await embedAssets(h, folder, item, skip, context));
|
|
285
|
+
return out;
|
|
286
|
+
}
|
|
287
|
+
if (isObject(value)) {
|
|
288
|
+
const out = {};
|
|
289
|
+
for (const key of Object.keys(value)) {
|
|
290
|
+
out[key] = await embedAssets(h, folder, value[key], skip, context);
|
|
291
|
+
}
|
|
292
|
+
return out;
|
|
293
|
+
}
|
|
294
|
+
return value;
|
|
295
|
+
}
|
|
296
|
+
// ---------------------------------------------------------------------------
|
|
297
|
+
// The command
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
const buildApp = async (context) => {
|
|
300
|
+
const folderArg = argument(context, 0, "an app folder, like `./apps/2chat`");
|
|
301
|
+
noExtraArguments(context, 1);
|
|
302
|
+
const outFlag = textFlag(context, "out");
|
|
303
|
+
const packFlag = textFlag(context, "pack");
|
|
304
|
+
const h = await host();
|
|
305
|
+
const { fs, path } = h;
|
|
306
|
+
const folder = path.resolve(folderArg);
|
|
307
|
+
// 1. package.json
|
|
308
|
+
const packagePath = path.join(folder, "package.json");
|
|
309
|
+
let pkg;
|
|
310
|
+
try {
|
|
311
|
+
pkg = await readJson(fs, packagePath);
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
const reason = error instanceof SyntaxError ? "is not valid JSON" : "could not be read";
|
|
315
|
+
throw usageError(context, `\`${packagePath}\` ${reason}.`);
|
|
316
|
+
}
|
|
317
|
+
if (!isObject(pkg))
|
|
318
|
+
throw usageError(context, `\`${packagePath}\` is not a JSON object.`);
|
|
319
|
+
const block = pkg.w6w;
|
|
320
|
+
const scripts = isObject(pkg.scripts) ? pkg.scripts : {};
|
|
321
|
+
const missing = [];
|
|
322
|
+
if (!isObject(block) || !nonEmptyString(block.id))
|
|
323
|
+
missing.push("w6w.id");
|
|
324
|
+
if (!nonEmptyString(pkg.version))
|
|
325
|
+
missing.push("version");
|
|
326
|
+
if (!nonEmptyString(scripts.test))
|
|
327
|
+
missing.push("scripts.test");
|
|
328
|
+
if (!nonEmptyString(scripts.build))
|
|
329
|
+
missing.push("scripts.build");
|
|
330
|
+
if (!nonEmptyString(pkg.main))
|
|
331
|
+
missing.push("main");
|
|
332
|
+
if (missing.length > 0) {
|
|
333
|
+
throw usageError(context, `\`${packagePath}\` is missing: ${missing.join(", ")}.`);
|
|
334
|
+
}
|
|
335
|
+
const w6w = block;
|
|
336
|
+
const id = w6w.id;
|
|
337
|
+
const version = pkg.version;
|
|
338
|
+
const pack = packFlag === undefined ? undefined : await checkPack(context, h, packFlag);
|
|
339
|
+
// 2-3. test, then build
|
|
340
|
+
for (const script of ["test", "build"]) {
|
|
341
|
+
const code = await runner(["run", script], folder);
|
|
342
|
+
if (code !== 0) {
|
|
343
|
+
throw new Error(`\`npm run ${script}\` failed with exit code ${code}. Nothing was written.`);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// 4. the built file
|
|
347
|
+
const builtFile = path.resolve(folder, pkg.main);
|
|
348
|
+
if (!(await isFile(fs, builtFile))) {
|
|
349
|
+
throw new Error(`the build did not produce \`${builtFile}\` (package.json \`main\`).`);
|
|
350
|
+
}
|
|
351
|
+
const bytes = await fs.readFile(builtFile);
|
|
352
|
+
const digest = await sha256Hex(bytes);
|
|
353
|
+
// 7. definition (before anything is written, so an unloadable bundle writes nothing)
|
|
354
|
+
let definition;
|
|
355
|
+
try {
|
|
356
|
+
const module = (await import(__rewriteRelativeImportExtension(h.fileUrl(builtFile))));
|
|
357
|
+
definition = describeDefinition(module.default);
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
361
|
+
throw new Error(`could not load \`${builtFile}\`: ${reason}`);
|
|
362
|
+
}
|
|
363
|
+
// 6. assets (resolved before writing, for the same reason)
|
|
364
|
+
const appBlock = { ...w6w };
|
|
365
|
+
const skip = new Set();
|
|
366
|
+
if (typeof appBlock.entry === "string")
|
|
367
|
+
skip.add(path.resolve(folder, appBlock.entry));
|
|
368
|
+
delete appBlock.entry;
|
|
369
|
+
delete appBlock.build;
|
|
370
|
+
delete appBlock.internal;
|
|
371
|
+
const app = await embedAssets(h, folder, appBlock, skip, context);
|
|
372
|
+
// 5. output
|
|
373
|
+
const out = outFlag === undefined ? path.dirname(builtFile) : path.resolve(outFlag);
|
|
374
|
+
await fs.mkdir(out, { recursive: true });
|
|
375
|
+
const execTarget = path.join(out, "app.js");
|
|
376
|
+
if (path.resolve(execTarget) !== builtFile)
|
|
377
|
+
await fs.writeFile(execTarget, bytes);
|
|
378
|
+
// 8. manifest
|
|
379
|
+
const manifest = {
|
|
380
|
+
manifestVersion: "1",
|
|
381
|
+
id,
|
|
382
|
+
name: pkg.name,
|
|
383
|
+
version,
|
|
384
|
+
description: pkg.description,
|
|
385
|
+
license: pkg.license,
|
|
386
|
+
app,
|
|
387
|
+
exec: { file: "app.js", sha256: digest, bytes: bytes.length, format: "esm" },
|
|
388
|
+
digest,
|
|
389
|
+
definition,
|
|
390
|
+
builder: `@w6w/cli@${VERSION}`,
|
|
391
|
+
};
|
|
392
|
+
await fs.writeFile(path.join(out, "manifest.json"), toJson(manifest));
|
|
393
|
+
// 9. pack
|
|
394
|
+
if (pack) {
|
|
395
|
+
await commitPack(context, h, packFlag, pack, folder, { id, version, digest });
|
|
396
|
+
}
|
|
397
|
+
// 10. result
|
|
398
|
+
const files = ["app.js", "manifest.json"];
|
|
399
|
+
const payload = {
|
|
400
|
+
id,
|
|
401
|
+
version,
|
|
402
|
+
digest,
|
|
403
|
+
out,
|
|
404
|
+
files,
|
|
405
|
+
...(pack ? { pack: pack.path } : {}),
|
|
406
|
+
};
|
|
407
|
+
context.out.emit(payload, () => `built ${id}@${version} → ${out} (sha256 ${digest.slice(0, 12)})`);
|
|
408
|
+
};
|
|
409
|
+
/** `w6w build app`. */
|
|
410
|
+
export const BUILD_COMMANDS = {
|
|
411
|
+
"build app": buildApp,
|
|
412
|
+
};
|
|
413
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `w6w config get-base-url | set-base-url <url>` — the stored API base URL.
|
|
3
|
+
*
|
|
4
|
+
* Declared in `endpoints.json` `cli.commands[]` (CLI-only: no API operation sits
|
|
5
|
+
* behind them). Neither touches the network, and neither ever prints a token.
|
|
6
|
+
*
|
|
7
|
+
* Both resolve the URL through the one resolver in `src/client.ts`
|
|
8
|
+
* ({@linkcode resolveSettings}), so `get-base-url` reports exactly what the next
|
|
9
|
+
* command will use, and `set-base-url` stores exactly the canonical form that
|
|
10
|
+
* resolver produces (and that `hosts` is keyed by).
|
|
11
|
+
*
|
|
12
|
+
* `set-base-url` rewrites only `baseUrl`. It never copies, moves or re-keys a
|
|
13
|
+
* token: a token saved for host A is never sent to host B, so after switching
|
|
14
|
+
* hosts the new one needs its own `w6w auth login`.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import type { CommandRegistry } from "../../mod.ts";
|
|
19
|
+
/** The two `w6w config` commands. */
|
|
20
|
+
export declare const CONFIG_COMMANDS: CommandRegistry;
|
|
21
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;AAkEpE,qCAAqC;AACrC,eAAO,MAAM,eAAe,EAAE,eAG7B,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `w6w config get-base-url | set-base-url <url>` — the stored API base URL.
|
|
3
|
+
*
|
|
4
|
+
* Declared in `endpoints.json` `cli.commands[]` (CLI-only: no API operation sits
|
|
5
|
+
* behind them). Neither touches the network, and neither ever prints a token.
|
|
6
|
+
*
|
|
7
|
+
* Both resolve the URL through the one resolver in `src/client.ts`
|
|
8
|
+
* ({@linkcode resolveSettings}), so `get-base-url` reports exactly what the next
|
|
9
|
+
* command will use, and `set-base-url` stores exactly the canonical form that
|
|
10
|
+
* resolver produces (and that `hosts` is keyed by).
|
|
11
|
+
*
|
|
12
|
+
* `set-base-url` rewrites only `baseUrl`. It never copies, moves or re-keys a
|
|
13
|
+
* token: a token saved for host A is never sent to host B, so after switching
|
|
14
|
+
* hosts the new one needs its own `w6w auth login`.
|
|
15
|
+
*
|
|
16
|
+
* @module
|
|
17
|
+
*/
|
|
18
|
+
import { joinBaseUrl } from "@w6w/sdk";
|
|
19
|
+
import { ENV_BASE_URL, ENV_TOKEN, envValue, resolveSettings } from "../client.js";
|
|
20
|
+
import { serializeConfig } from "../config-store.js";
|
|
21
|
+
import { argument, noExtraArguments } from "./shared.js";
|
|
22
|
+
const getBaseUrl = (context) => {
|
|
23
|
+
noExtraArguments(context, 0);
|
|
24
|
+
// The token sources are irrelevant here; hide them so a bad token never blocks a read.
|
|
25
|
+
const settings = resolveSettings({ ...context.invocation.globals, token: undefined }, (name) => (name === ENV_TOKEN ? undefined : context.env(name)), context.stored);
|
|
26
|
+
const configBaseUrl = context.stored.baseUrl.trim().length > 0
|
|
27
|
+
? context.stored.baseUrl
|
|
28
|
+
: undefined;
|
|
29
|
+
const payload = {
|
|
30
|
+
baseUrl: settings.baseUrl,
|
|
31
|
+
baseUrlSource: settings.baseUrlSource,
|
|
32
|
+
...(configBaseUrl === undefined ? {} : { configBaseUrl }),
|
|
33
|
+
configPath: context.store.path ?? null,
|
|
34
|
+
};
|
|
35
|
+
context.out.emit(payload, () => `${payload.baseUrl} (${payload.baseUrlSource})`);
|
|
36
|
+
};
|
|
37
|
+
const setBaseUrl = async (context) => {
|
|
38
|
+
const raw = argument(context, 0, "a base URL, like `https://api.example.com`");
|
|
39
|
+
noExtraArguments(context, 1);
|
|
40
|
+
// Validate and canonicalise with the one resolver: the positional stands in for the flag.
|
|
41
|
+
const { baseUrl } = resolveSettings({
|
|
42
|
+
...context.invocation.globals,
|
|
43
|
+
baseUrl: raw,
|
|
44
|
+
token: undefined,
|
|
45
|
+
});
|
|
46
|
+
const path = context.store.path;
|
|
47
|
+
if (path === undefined) {
|
|
48
|
+
throw new Error("w6w cannot tell where to keep its config: neither XDG_CONFIG_HOME (an absolute path) " +
|
|
49
|
+
"nor HOME is set. Nothing was saved.");
|
|
50
|
+
}
|
|
51
|
+
await context.store.write(serializeConfig({ version: 1, baseUrl, hosts: context.stored.hosts }));
|
|
52
|
+
context.out.emit({ baseUrl, configPath: path }, () => `Saved ${baseUrl} as the base URL in ${path}.`);
|
|
53
|
+
const fromEnv = envValue(context.env, ENV_BASE_URL);
|
|
54
|
+
if (fromEnv !== undefined) {
|
|
55
|
+
let envCanonical;
|
|
56
|
+
try {
|
|
57
|
+
envCanonical = joinBaseUrl(fromEnv.trim());
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
envCanonical = fromEnv;
|
|
61
|
+
}
|
|
62
|
+
if (envCanonical !== baseUrl) {
|
|
63
|
+
// stderr, so `--json` stdout stays one parseable document.
|
|
64
|
+
context.out.error(`${ENV_BASE_URL} is set to ${fromEnv} and still takes precedence over the saved base URL.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
/** The two `w6w config` commands. */
|
|
69
|
+
export const CONFIG_COMMANDS = {
|
|
70
|
+
"config get-base-url": getBaseUrl,
|
|
71
|
+
"config set-base-url": setBaseUrl,
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `w6w connections list | get | delete` — find a connection, read one, remove one.
|
|
2
|
+
* `w6w connections list | get | delete [--force]` — find a connection, read one, remove one.
|
|
3
3
|
*
|
|
4
4
|
* `list` exists so a caller can find a `conn_…` id to pass to `w6w run`; it has
|
|
5
5
|
* no filters and no pagination. `get` and `delete` address one by that id.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/commands/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"connections.d.ts","sourceRoot":"","sources":["../../../src/commands/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;AAsEpE,eAAO,MAAM,mBAAmB,EAAE,eAIjC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `w6w connections list | get | delete` — find a connection, read one, remove one.
|
|
2
|
+
* `w6w connections list | get | delete [--force]` — find a connection, read one, remove one.
|
|
3
3
|
*
|
|
4
4
|
* `list` exists so a caller can find a `conn_…` id to pass to `w6w run`; it has
|
|
5
5
|
* no filters and no pagination. `get` and `delete` address one by that id.
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
|
+
import { ApiError } from "@w6w/sdk";
|
|
15
16
|
import { argument, noExtraArguments, table } from "./shared.js";
|
|
16
17
|
/** One connection, as a table row. */
|
|
17
18
|
function row(connection) {
|
|
@@ -38,10 +39,34 @@ const get = async (context) => {
|
|
|
38
39
|
JSON.stringify(connection, null, 2),
|
|
39
40
|
].join("\n"));
|
|
40
41
|
};
|
|
42
|
+
/** One dependent callable from a `connection_in_use` body, as `<kind> <displayName> (<id>)`. */
|
|
43
|
+
function dependentLines(raw) {
|
|
44
|
+
const callables = raw
|
|
45
|
+
?.error?.dependents?.callables;
|
|
46
|
+
if (!Array.isArray(callables))
|
|
47
|
+
return [];
|
|
48
|
+
return callables.map((c) => `${c.kind} ${c.displayName} (${c.id})`);
|
|
49
|
+
}
|
|
41
50
|
const remove = async (context) => {
|
|
42
51
|
const id = argument(context, 0, "a connection id (see: `w6w connections list`)");
|
|
43
52
|
noExtraArguments(context, 1);
|
|
44
|
-
|
|
53
|
+
const force = context.invocation.options.force === true;
|
|
54
|
+
try {
|
|
55
|
+
await context.client().connections.delete(id, { force });
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err instanceof ApiError && err.status === 409 && err.code === "connection_in_use") {
|
|
59
|
+
const lines = dependentLines(err.raw);
|
|
60
|
+
if (lines.length > 0) {
|
|
61
|
+
context.out.error([
|
|
62
|
+
`Connection ${id} is in use by:`,
|
|
63
|
+
...lines.map((line) => ` ${line}`),
|
|
64
|
+
"Re-run with --force to delete it anyway (the callables above are disabled, not edited).",
|
|
65
|
+
].join("\n"));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
45
70
|
// `null`: the SDK unwraps a delete to nothing; `--json` must not invent a body.
|
|
46
71
|
context.out.emit(null, (styles) => styles.dim(`Deleted ${id}.`));
|
|
47
72
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/commands/connections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"connections.js","sourceRoot":"","sources":["../../../src/commands/connections.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,12 @@ export { DASHBOARD_COMMANDS } from "./dashboard.ts";
|
|
|
30
30
|
export { PROJECT_COMMANDS } from "./projects.ts";
|
|
31
31
|
export { RELIABILITY_COMMANDS } from "./reliability.ts";
|
|
32
32
|
export { AUTH_COMMANDS } from "./auth.ts";
|
|
33
|
+
export { CONFIG_COMMANDS } from "./config.ts";
|
|
34
|
+
export { LS_COMMANDS } from "./ls.ts";
|
|
35
|
+
export { MODEL_COMMANDS } from "./models.ts";
|
|
36
|
+
export { ASSET_COMMANDS } from "./assets.ts";
|
|
37
|
+
export { AGENT_STUDIO_COMMANDS } from "./agents-studio.ts";
|
|
38
|
+
export { BUILD_COMMANDS } from "./build.ts";
|
|
33
39
|
/** Every wired command, keyed by canonical command path. */
|
|
34
40
|
export declare const COMMANDS: CommandRegistry;
|
|
35
41
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAsBpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,4DAA4D;AAC5D,eAAO,MAAM,QAAQ,EAAE,eAqBtB,CAAC"}
|