@masculinecache/wrangler-axi 0.1.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/LICENSE +21 -0
- package/README.md +193 -0
- package/dist/bin/wrangler-axi.d.ts +2 -0
- package/dist/bin/wrangler-axi.js +17 -0
- package/dist/src/args.d.ts +19 -0
- package/dist/src/args.js +105 -0
- package/dist/src/cli.d.ts +27 -0
- package/dist/src/cli.js +101 -0
- package/dist/src/commands/d1.d.ts +2 -0
- package/dist/src/commands/d1.js +149 -0
- package/dist/src/commands/kv.d.ts +2 -0
- package/dist/src/commands/kv.js +423 -0
- package/dist/src/commands/pages.d.ts +2 -0
- package/dist/src/commands/pages.js +337 -0
- package/dist/src/commands/r2.d.ts +2 -0
- package/dist/src/commands/r2.js +289 -0
- package/dist/src/commands/secrets.d.ts +2 -0
- package/dist/src/commands/secrets.js +195 -0
- package/dist/src/commands/whoami.d.ts +2 -0
- package/dist/src/commands/whoami.js +60 -0
- package/dist/src/commands/workers.d.ts +2 -0
- package/dist/src/commands/workers.js +431 -0
- package/dist/src/errors.d.ts +6 -0
- package/dist/src/errors.js +77 -0
- package/dist/src/fields.d.ts +15 -0
- package/dist/src/fields.js +36 -0
- package/dist/src/format.d.ts +13 -0
- package/dist/src/format.js +21 -0
- package/dist/src/list.d.ts +18 -0
- package/dist/src/list.js +23 -0
- package/dist/src/stdin.d.ts +2 -0
- package/dist/src/stdin.js +14 -0
- package/dist/src/toon.d.ts +30 -0
- package/dist/src/toon.js +159 -0
- package/dist/src/util.d.ts +8 -0
- package/dist/src/util.js +26 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +23 -0
- package/dist/src/wrangler.d.ts +64 -0
- package/dist/src/wrangler.js +175 -0
- package/package.json +48 -0
- package/skills/wrangler-axi/SKILL.md +82 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { AxiError } from "../errors.js";
|
|
2
|
+
import { callWrangler, parseJson } from "../wrangler.js";
|
|
3
|
+
import { takeAllFlags, takeFlag, takeNumber } from "../args.js";
|
|
4
|
+
import { validateFlags, wantsHelp } from "../util.js";
|
|
5
|
+
import { readStdin, isStdinTTY } from "../stdin.js";
|
|
6
|
+
import { addExtraDefs, parseFields, } from "../fields.js";
|
|
7
|
+
import { custom, field, renderDetail, renderHelp, } from "../toon.js";
|
|
8
|
+
import { renderListBlock } from "../list.js";
|
|
9
|
+
const VALID_FLAGS = ["--name", "--format", "--limit", "--fields", "--json", "--full"];
|
|
10
|
+
const available = {
|
|
11
|
+
type: { def: field("type") },
|
|
12
|
+
};
|
|
13
|
+
export const secretsCommand = {
|
|
14
|
+
name: "secrets",
|
|
15
|
+
aliases: ["secret"],
|
|
16
|
+
description: "manage Worker secrets (list/put/delete)",
|
|
17
|
+
help: [
|
|
18
|
+
"Usage: wrangler-axi secrets <list|put|delete> [args]",
|
|
19
|
+
" list — list secrets for a worker",
|
|
20
|
+
" put — create or update a secret (value via stdin)",
|
|
21
|
+
" delete — delete a secret",
|
|
22
|
+
"Global: --account <id|name>, --name <worker>",
|
|
23
|
+
"Examples:",
|
|
24
|
+
" wrangler-axi secrets list --name my-worker",
|
|
25
|
+
" echo -n 's3cr3t' | wrangler-axi secrets put MY_KEY --name my-worker",
|
|
26
|
+
" wrangler-axi secrets delete MY_KEY --name my-worker",
|
|
27
|
+
],
|
|
28
|
+
async run(ctx, args) {
|
|
29
|
+
const sub = args[0];
|
|
30
|
+
if (sub === undefined || wantsHelp(args)) {
|
|
31
|
+
return { stdout: renderHelp(secretsCommand.help), exitCode: 0 };
|
|
32
|
+
}
|
|
33
|
+
const rest = args.slice(1);
|
|
34
|
+
switch (sub) {
|
|
35
|
+
case "list":
|
|
36
|
+
return list(ctx, rest);
|
|
37
|
+
case "put":
|
|
38
|
+
return put(ctx, rest);
|
|
39
|
+
case "delete":
|
|
40
|
+
return del(ctx, rest);
|
|
41
|
+
default:
|
|
42
|
+
throw new AxiError(`Unknown secrets subcommand "${sub}"`, "VALIDATION_ERROR", [
|
|
43
|
+
"Run `wrangler-axi secrets --help` for valid subcommands",
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
function truncatingField(key, length = 20) {
|
|
49
|
+
return {
|
|
50
|
+
render: (item) => {
|
|
51
|
+
const value = (item && typeof item === "object" && key in item) ? item[key] : undefined;
|
|
52
|
+
if (typeof value === "string") {
|
|
53
|
+
if (value.length <= length) {
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
return value.slice(0, length - 1) + "…";
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function list(ctx, args) {
|
|
63
|
+
if (wantsHelp(args)) {
|
|
64
|
+
return {
|
|
65
|
+
stdout: renderHelp([
|
|
66
|
+
"Usage: wrangler-axi secrets list [--name <worker>]",
|
|
67
|
+
"Flags: --name <worker>, --fields <cols>, --limit <n>, --json, --full",
|
|
68
|
+
]),
|
|
69
|
+
exitCode: 0,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const json = takeAllFlags(args, ["--json"]).length > 0;
|
|
73
|
+
const full = takeAllFlags(args, ["--full"]).length > 0;
|
|
74
|
+
validateFlags(args, VALID_FLAGS, "secrets list");
|
|
75
|
+
const wArgs = ["secret", "list", "--format", "json"];
|
|
76
|
+
if (ctx.account) {
|
|
77
|
+
wArgs.push("--account", ctx.account);
|
|
78
|
+
}
|
|
79
|
+
const worker = takeFlag(args, "--name");
|
|
80
|
+
if (worker) {
|
|
81
|
+
wArgs.push("--name", worker);
|
|
82
|
+
}
|
|
83
|
+
const limit = full ? undefined : takeNumber(args, "--limit");
|
|
84
|
+
const fieldsArg = takeFlag(args, "--fields");
|
|
85
|
+
const { stdout } = await callWrangler(ctx.runner, wArgs);
|
|
86
|
+
if (json) {
|
|
87
|
+
return { stdout, exitCode: 0 };
|
|
88
|
+
}
|
|
89
|
+
const items = parseJson(stdout, "secrets");
|
|
90
|
+
const { extraDefs, extraKeys } = parseFields(fieldsArg, available);
|
|
91
|
+
const schema = addExtraDefs({
|
|
92
|
+
name: full ? field("name") : truncatingField("name", 20),
|
|
93
|
+
type: field("type"),
|
|
94
|
+
}, extraDefs);
|
|
95
|
+
const blocks = [
|
|
96
|
+
renderListBlock({
|
|
97
|
+
noun: "secrets",
|
|
98
|
+
items,
|
|
99
|
+
schema,
|
|
100
|
+
limit,
|
|
101
|
+
empty: "secrets: no secrets found for this worker",
|
|
102
|
+
}),
|
|
103
|
+
];
|
|
104
|
+
if (extraKeys.length > 0 && Object.keys(available).length > 0) {
|
|
105
|
+
blocks.push(renderHelp([`Available extra fields: ${Object.keys(available).join(", ")}`]));
|
|
106
|
+
}
|
|
107
|
+
return { stdout: blocks.filter(Boolean).join("\n"), exitCode: 0 };
|
|
108
|
+
}
|
|
109
|
+
async function put(ctx, args) {
|
|
110
|
+
if (wantsHelp(args)) {
|
|
111
|
+
return {
|
|
112
|
+
stdout: renderHelp([
|
|
113
|
+
"Usage: echo -n '<value>' | wrangler-axi secrets put <key> [--name <worker>]",
|
|
114
|
+
"Creates or updates a secret. Value MUST come via stdin.",
|
|
115
|
+
]),
|
|
116
|
+
exitCode: 0,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
validateFlags(args, ["--name"], "secrets put");
|
|
120
|
+
// Take value-consuming flags before extracting the positional key.
|
|
121
|
+
const worker = takeFlag(args, "--name");
|
|
122
|
+
const key = args.filter((a) => !a.startsWith("-"))[0];
|
|
123
|
+
if (!key) {
|
|
124
|
+
throw new AxiError("secrets put requires a secret key", "VALIDATION_ERROR", [
|
|
125
|
+
"Usage: wrangler-axi secrets put <key> [--name <worker>]",
|
|
126
|
+
]);
|
|
127
|
+
}
|
|
128
|
+
if (isStdinTTY()) {
|
|
129
|
+
throw new AxiError("secrets put requires the secret value via stdin", "VALIDATION_ERROR", [
|
|
130
|
+
"Usage: echo -n '<value>' | wrangler-axi secrets put <key> [--name <worker>]",
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
133
|
+
const secretValue = await readStdin();
|
|
134
|
+
if (!secretValue) {
|
|
135
|
+
throw new AxiError("secrets put received empty stdin; a non-empty value is required", "VALIDATION_ERROR", [
|
|
136
|
+
"Usage: echo -n '<value>' | wrangler-axi secrets put <key> [--name <worker>]",
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
const wArgs = ["secret", "put", key];
|
|
140
|
+
if (ctx.account) {
|
|
141
|
+
wArgs.push("--account", ctx.account);
|
|
142
|
+
}
|
|
143
|
+
if (worker) {
|
|
144
|
+
wArgs.push("--name", worker);
|
|
145
|
+
}
|
|
146
|
+
wArgs.push("--quiet");
|
|
147
|
+
const { stdout } = await callWrangler(ctx.runner, wArgs, { input: secretValue });
|
|
148
|
+
return {
|
|
149
|
+
stdout: renderDetail("secret", { key, worker: worker ?? "default worker", status: "written" }, {
|
|
150
|
+
key: custom((d) => d.key),
|
|
151
|
+
worker: custom((d) => d.worker),
|
|
152
|
+
status: custom((d) => d.status),
|
|
153
|
+
}),
|
|
154
|
+
exitCode: 0,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
async function del(ctx, args) {
|
|
158
|
+
if (wantsHelp(args)) {
|
|
159
|
+
return {
|
|
160
|
+
stdout: renderHelp([
|
|
161
|
+
"Usage: wrangler-axi secrets delete <key> [--name <worker>]",
|
|
162
|
+
"Deletes a secret. Run with --force to skip confirmation.",
|
|
163
|
+
]),
|
|
164
|
+
exitCode: 0,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
validateFlags(args, ["--name", "--force"], "secrets delete");
|
|
168
|
+
// Take value-consuming flags before extracting the positional key.
|
|
169
|
+
const worker = takeFlag(args, "--name");
|
|
170
|
+
const key = args.filter((a) => !a.startsWith("-"))[0];
|
|
171
|
+
if (!key) {
|
|
172
|
+
throw new AxiError("secrets delete requires a secret key", "VALIDATION_ERROR", [
|
|
173
|
+
"Usage: wrangler-axi secrets delete <key> [--name <worker>] [--force]",
|
|
174
|
+
]);
|
|
175
|
+
}
|
|
176
|
+
const wArgs = ["secret", "delete", key];
|
|
177
|
+
if (ctx.account) {
|
|
178
|
+
wArgs.push("--account", ctx.account);
|
|
179
|
+
}
|
|
180
|
+
if (worker) {
|
|
181
|
+
wArgs.push("--name", worker);
|
|
182
|
+
}
|
|
183
|
+
if (takeAllFlags(args, ["--force"]).length > 0) {
|
|
184
|
+
wArgs.push("-y");
|
|
185
|
+
}
|
|
186
|
+
const { stdout } = await callWrangler(ctx.runner, wArgs);
|
|
187
|
+
return {
|
|
188
|
+
stdout: renderDetail("secret", { key, worker: worker ?? "default worker", status: "deleted" }, {
|
|
189
|
+
key: custom((d) => d.key),
|
|
190
|
+
worker: custom((d) => d.worker),
|
|
191
|
+
status: custom((d) => d.status),
|
|
192
|
+
}),
|
|
193
|
+
exitCode: 0,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { callWranglerLenient, parseJson } from "../wrangler.js";
|
|
2
|
+
import { takeAllFlags } from "../args.js";
|
|
3
|
+
import { validateFlags, wantsHelp } from "../util.js";
|
|
4
|
+
import { custom, renderDetail, renderHelp, renderOutput } from "../toon.js";
|
|
5
|
+
const VALID_FLAGS = ["--json"];
|
|
6
|
+
export const whoamiCommand = {
|
|
7
|
+
name: "whoami",
|
|
8
|
+
description: "show the currently authenticated Cloudflare account",
|
|
9
|
+
help: [
|
|
10
|
+
"Usage: wrangler-axi whoami [--json]",
|
|
11
|
+
"Shows which Cloudflare account you are authenticated as.",
|
|
12
|
+
"Flags: --json (raw wrangler JSON output)",
|
|
13
|
+
"Global: --account <id|name>",
|
|
14
|
+
"Example: wrangler-axi whoami",
|
|
15
|
+
],
|
|
16
|
+
async run(ctx, args) {
|
|
17
|
+
if (wantsHelp(args)) {
|
|
18
|
+
return { stdout: renderHelp(whoamiCommand.help), exitCode: 0 };
|
|
19
|
+
}
|
|
20
|
+
const json = takeAllFlags(args, ["--json"]).length > 0;
|
|
21
|
+
validateFlags(args, VALID_FLAGS, "whoami");
|
|
22
|
+
const wArgs = ["whoami", "--json"];
|
|
23
|
+
if (ctx.account) {
|
|
24
|
+
wArgs.push("--account", ctx.account);
|
|
25
|
+
}
|
|
26
|
+
const { stdout } = await callWranglerLenient(ctx.runner, wArgs);
|
|
27
|
+
if (json) {
|
|
28
|
+
return { stdout, exitCode: 0 };
|
|
29
|
+
}
|
|
30
|
+
const data = parseJson(stdout, "whoami");
|
|
31
|
+
if (!data.loggedIn) {
|
|
32
|
+
const detail = {
|
|
33
|
+
email: "not authenticated",
|
|
34
|
+
accountId: "none",
|
|
35
|
+
accountName: "none",
|
|
36
|
+
loggedIn: "no",
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
stdout: renderOutput([
|
|
40
|
+
renderDetail("identity", detail, whoamiSchema),
|
|
41
|
+
renderHelp(["Run `wrangler login` to authenticate"]),
|
|
42
|
+
]),
|
|
43
|
+
exitCode: 0,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const detail = {
|
|
47
|
+
email: data.email ?? data.apiToken?.email ?? data.deviceToken?.email ?? "unknown",
|
|
48
|
+
accountId: data.account?.id ?? "unknown",
|
|
49
|
+
accountName: data.account?.name ?? "unknown",
|
|
50
|
+
loggedIn: "yes",
|
|
51
|
+
};
|
|
52
|
+
return { stdout: renderDetail("identity", detail, whoamiSchema), exitCode: 0 };
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
const whoamiSchema = {
|
|
56
|
+
email: custom((d) => d.email),
|
|
57
|
+
accountId: custom((d) => d.accountId),
|
|
58
|
+
accountName: custom((d) => d.accountName),
|
|
59
|
+
loggedIn: custom((d) => d.loggedIn),
|
|
60
|
+
};
|