@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.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -0
  3. package/dist/bin/wrangler-axi.d.ts +2 -0
  4. package/dist/bin/wrangler-axi.js +17 -0
  5. package/dist/src/args.d.ts +19 -0
  6. package/dist/src/args.js +105 -0
  7. package/dist/src/cli.d.ts +27 -0
  8. package/dist/src/cli.js +101 -0
  9. package/dist/src/commands/d1.d.ts +2 -0
  10. package/dist/src/commands/d1.js +149 -0
  11. package/dist/src/commands/kv.d.ts +2 -0
  12. package/dist/src/commands/kv.js +423 -0
  13. package/dist/src/commands/pages.d.ts +2 -0
  14. package/dist/src/commands/pages.js +337 -0
  15. package/dist/src/commands/r2.d.ts +2 -0
  16. package/dist/src/commands/r2.js +289 -0
  17. package/dist/src/commands/secrets.d.ts +2 -0
  18. package/dist/src/commands/secrets.js +195 -0
  19. package/dist/src/commands/whoami.d.ts +2 -0
  20. package/dist/src/commands/whoami.js +60 -0
  21. package/dist/src/commands/workers.d.ts +2 -0
  22. package/dist/src/commands/workers.js +431 -0
  23. package/dist/src/errors.d.ts +6 -0
  24. package/dist/src/errors.js +77 -0
  25. package/dist/src/fields.d.ts +15 -0
  26. package/dist/src/fields.js +36 -0
  27. package/dist/src/format.d.ts +13 -0
  28. package/dist/src/format.js +21 -0
  29. package/dist/src/list.d.ts +18 -0
  30. package/dist/src/list.js +23 -0
  31. package/dist/src/stdin.d.ts +2 -0
  32. package/dist/src/stdin.js +14 -0
  33. package/dist/src/toon.d.ts +30 -0
  34. package/dist/src/toon.js +159 -0
  35. package/dist/src/util.d.ts +8 -0
  36. package/dist/src/util.js +26 -0
  37. package/dist/src/version.d.ts +1 -0
  38. package/dist/src/version.js +23 -0
  39. package/dist/src/wrangler.d.ts +64 -0
  40. package/dist/src/wrangler.js +175 -0
  41. package/package.json +48 -0
  42. package/skills/wrangler-axi/SKILL.md +82 -0
@@ -0,0 +1,337 @@
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 { addExtraDefs, parseFields, } from "../fields.js";
6
+ import { custom, field, relativeTime, renderDetail, renderHelp } from "../toon.js";
7
+ import { renderListBlock } from "../list.js";
8
+ const projectAvailable = {
9
+ created: { def: relativeTime("created_on", "created") },
10
+ domains: { def: field("domains") },
11
+ };
12
+ const deploymentAvailable = {
13
+ created: { def: relativeTime("created_on", "created") },
14
+ environment: { def: field("environment") },
15
+ latest: { def: field("latest_stage") },
16
+ };
17
+ export const pagesCommand = {
18
+ name: "pages",
19
+ description: "manage Cloudflare Pages projects and deployments",
20
+ help: [
21
+ "Usage: wrangler-axi pages <project|deployment> <sub> [args]",
22
+ " project — list/create/delete Pages projects",
23
+ " deployment — list Pages deployments",
24
+ "Example: wrangler-axi pages project list",
25
+ "Example: wrangler-axi pages deployment list --project-name my-site",
26
+ ],
27
+ async run(ctx, args) {
28
+ const sub = args[0];
29
+ if (sub === undefined || wantsHelp(args)) {
30
+ return { stdout: renderHelp(pagesCommand.help), exitCode: 0 };
31
+ }
32
+ const rest = args.slice(1);
33
+ switch (sub) {
34
+ case "project":
35
+ return project(ctx, rest);
36
+ case "deployment":
37
+ return deployment(ctx, rest);
38
+ default:
39
+ throw new AxiError(`Unknown pages subcommand "${sub}"`, "VALIDATION_ERROR", [
40
+ "Run `wrangler-axi pages --help` for valid subcommands",
41
+ ]);
42
+ }
43
+ },
44
+ };
45
+ async function project(ctx, args) {
46
+ if (wantsHelp(args)) {
47
+ return {
48
+ stdout: renderHelp([
49
+ "Usage: wrangler-axi pages project <list|create|delete> [args]",
50
+ " list — list Pages projects",
51
+ " create <name> — create a project",
52
+ " delete <name> — delete a project",
53
+ ]),
54
+ exitCode: 0,
55
+ };
56
+ }
57
+ const sub = args[0];
58
+ if (sub === undefined || sub.startsWith("-")) {
59
+ throw new AxiError("pages project requires a subcommand", "VALIDATION_ERROR", [
60
+ "Run `wrangler-axi pages project --help` for valid subcommands",
61
+ ]);
62
+ }
63
+ const rest = args.slice(1);
64
+ switch (sub) {
65
+ case "list":
66
+ return projectList(ctx, rest);
67
+ case "create":
68
+ return projectCreate(ctx, rest);
69
+ case "delete":
70
+ return projectDelete(ctx, rest);
71
+ default:
72
+ throw new AxiError(`Unknown pages project subcommand "${sub}"`, "VALIDATION_ERROR", [
73
+ "Run `wrangler-axi pages project --help` for valid subcommands",
74
+ ]);
75
+ }
76
+ }
77
+ async function projectList(ctx, args) {
78
+ if (wantsHelp(args)) {
79
+ return {
80
+ stdout: renderHelp([
81
+ "Usage: wrangler-axi pages project list [--fields] [--limit] [--full] [--json]",
82
+ ]),
83
+ exitCode: 0,
84
+ };
85
+ }
86
+ const json = takeAllFlags(args, ["--json"]).length > 0;
87
+ const full = takeAllFlags(args, ["--full"]).length > 0;
88
+ validateFlags(args, ["--fields", "--limit", "--full", "--json"], "pages project list");
89
+ const wArgs = ["pages", "project", "list", "--json"];
90
+ if (ctx.account) {
91
+ wArgs.push("--account", ctx.account);
92
+ }
93
+ const limit = full ? undefined : takeNumber(args, "--limit");
94
+ const fieldsArg = takeFlag(args, "--fields");
95
+ const { stdout } = await callWrangler(ctx.runner, wArgs);
96
+ if (json) {
97
+ return { stdout, exitCode: 0 };
98
+ }
99
+ const items = parseJson(stdout, "pages projects");
100
+ const { extraDefs } = parseFields(fieldsArg, projectAvailable);
101
+ const schema = addExtraDefs({
102
+ name: field("name"),
103
+ domains: field("domains"),
104
+ }, extraDefs);
105
+ return {
106
+ stdout: renderListBlock({
107
+ noun: "projects",
108
+ items,
109
+ schema,
110
+ limit,
111
+ empty: "projects: no Pages projects found",
112
+ truncatedHint: "Run `wrangler-axi pages project list --json` for the full set",
113
+ }),
114
+ exitCode: 0,
115
+ };
116
+ }
117
+ async function projectCreate(ctx, args) {
118
+ if (wantsHelp(args)) {
119
+ return {
120
+ stdout: renderHelp([
121
+ "Usage: wrangler-axi pages project create <name> [--json]",
122
+ ]),
123
+ exitCode: 0,
124
+ };
125
+ }
126
+ validateFlags(args, ["--json"], "pages project create");
127
+ // wrangler's `pages project create` rejects --json and prints human output
128
+ // only, so --json is a wrapper-side escape hatch here.
129
+ const json = takeAllFlags(args, ["--json"]).length > 0;
130
+ const name = args.filter((a) => !a.startsWith("-"))[0];
131
+ if (!name) {
132
+ throw new AxiError("pages project create requires a project name", "VALIDATION_ERROR", [
133
+ "Usage: wrangler-axi pages project create <name>",
134
+ ]);
135
+ }
136
+ const wArgs = ["pages", "project", "create", name];
137
+ if (ctx.account) {
138
+ wArgs.push("--account", ctx.account);
139
+ }
140
+ await callWrangler(ctx.runner, wArgs);
141
+ if (json) {
142
+ return { stdout: JSON.stringify({ name, status: "created" }, null, 2), exitCode: 0 };
143
+ }
144
+ return {
145
+ stdout: renderDetail("project", { name, status: "created" }, {
146
+ name: custom((d) => d.name),
147
+ status: custom((d) => d.status),
148
+ }),
149
+ exitCode: 0,
150
+ };
151
+ }
152
+ async function projectDelete(ctx, args) {
153
+ if (wantsHelp(args)) {
154
+ return {
155
+ stdout: renderHelp([
156
+ "Usage: wrangler-axi pages project delete <name> [--force]",
157
+ ]),
158
+ exitCode: 0,
159
+ };
160
+ }
161
+ validateFlags(args, ["--force"], "pages project delete");
162
+ const name = args.filter((a) => !a.startsWith("-"))[0];
163
+ if (!name) {
164
+ throw new AxiError("pages project delete requires a project name", "VALIDATION_ERROR", [
165
+ "Usage: wrangler-axi pages project delete <name>",
166
+ ]);
167
+ }
168
+ const wArgs = ["pages", "project", "delete", name];
169
+ if (ctx.account) {
170
+ wArgs.push("--account", ctx.account);
171
+ }
172
+ if (takeAllFlags(args, ["--force"]).length > 0) {
173
+ wArgs.push("-f");
174
+ }
175
+ await callWrangler(ctx.runner, wArgs);
176
+ return {
177
+ stdout: renderDetail("project", { name, status: "deleted" }, {
178
+ name: custom((d) => d.name),
179
+ status: custom((d) => d.status),
180
+ }),
181
+ exitCode: 0,
182
+ };
183
+ }
184
+ async function deployment(ctx, args) {
185
+ if (wantsHelp(args)) {
186
+ return {
187
+ stdout: renderHelp([
188
+ "Usage: wrangler-axi pages deployment <list|create|delete> [args]",
189
+ " list — list deployments for a project",
190
+ " create [dir] — deploy a directory",
191
+ " delete <id> — delete a deployment",
192
+ ]),
193
+ exitCode: 0,
194
+ };
195
+ }
196
+ const sub = args[0];
197
+ if (sub === undefined || sub.startsWith("-")) {
198
+ throw new AxiError("pages deployment requires a subcommand", "VALIDATION_ERROR", [
199
+ "Run `wrangler-axi pages deployment --help` for valid subcommands",
200
+ ]);
201
+ }
202
+ const rest = args.slice(1);
203
+ switch (sub) {
204
+ case "list":
205
+ return deploymentList(ctx, rest);
206
+ case "create":
207
+ return deploymentCreate(ctx, rest);
208
+ case "delete":
209
+ return deploymentDelete(ctx, rest);
210
+ default:
211
+ throw new AxiError(`Unknown pages deployment subcommand "${sub}"`, "VALIDATION_ERROR", [
212
+ "Run `wrangler-axi pages deployment --help` for valid subcommands",
213
+ ]);
214
+ }
215
+ }
216
+ async function deploymentList(ctx, args) {
217
+ if (wantsHelp(args)) {
218
+ return {
219
+ stdout: renderHelp([
220
+ "Usage: wrangler-axi pages deployment list --project-name <name> [--environment production|preview] [--fields] [--limit] [--full] [--json]",
221
+ ]),
222
+ exitCode: 0,
223
+ };
224
+ }
225
+ const json = takeAllFlags(args, ["--json"]).length > 0;
226
+ const full = takeAllFlags(args, ["--full"]).length > 0;
227
+ validateFlags(args, ["--project-name", "--environment", "--fields", "--limit", "--full", "--json"], "pages deployment list");
228
+ const projectName = takeFlag(args, "--project-name");
229
+ if (!projectName) {
230
+ throw new AxiError("pages deployment list requires --project-name", "VALIDATION_ERROR", [
231
+ "Run `wrangler-axi pages deployment list --help` for usage",
232
+ ]);
233
+ }
234
+ const wArgs = ["pages", "deployment", "list", "--project-name", projectName];
235
+ if (ctx.account) {
236
+ wArgs.push("--account", ctx.account);
237
+ }
238
+ const env = takeFlag(args, "--environment");
239
+ if (env) {
240
+ wArgs.push("--environment", env);
241
+ }
242
+ wArgs.push("--json");
243
+ const limit = full ? undefined : takeNumber(args, "--limit");
244
+ const fieldsArg = takeFlag(args, "--fields");
245
+ const { stdout } = await callWrangler(ctx.runner, wArgs);
246
+ if (json) {
247
+ return { stdout, exitCode: 0 };
248
+ }
249
+ const items = parseJson(stdout, "pages deployments");
250
+ const { extraDefs } = parseFields(fieldsArg, deploymentAvailable);
251
+ const schema = addExtraDefs({
252
+ id: field("id"),
253
+ url: field("url"),
254
+ created: relativeTime("created_on", "created"),
255
+ }, extraDefs);
256
+ return {
257
+ stdout: renderListBlock({
258
+ noun: "deployments",
259
+ items,
260
+ schema,
261
+ limit,
262
+ empty: "deployments: no deployments found for this project",
263
+ truncatedHint: "Run `wrangler-axi pages deployment list --project-name <name> --json` for the full set",
264
+ }),
265
+ exitCode: 0,
266
+ };
267
+ }
268
+ async function deploymentCreate(ctx, args) {
269
+ if (wantsHelp(args)) {
270
+ return {
271
+ stdout: renderHelp([
272
+ "Usage: wrangler-axi pages deployment create [directory] [--project-name <name>]",
273
+ ]),
274
+ exitCode: 0,
275
+ };
276
+ }
277
+ validateFlags(args, ["--project-name"], "pages deployment create");
278
+ // Take value-consuming flags before extracting the positional directory.
279
+ const projectName = takeFlag(args, "--project-name");
280
+ const dir = args.filter((a) => !a.startsWith("-"))[0];
281
+ const wArgs = ["pages", "deployment", "create"];
282
+ if (ctx.account) {
283
+ wArgs.push("--account", ctx.account);
284
+ }
285
+ if (dir) {
286
+ wArgs.push(dir);
287
+ }
288
+ if (projectName) {
289
+ wArgs.push("--project-name", projectName);
290
+ }
291
+ const { stdout } = await callWrangler(ctx.runner, wArgs);
292
+ return {
293
+ stdout: renderDetail("deployment", { project: projectName ?? "(default)", status: "deployed" }, {
294
+ project: custom((d) => d.project),
295
+ status: custom((d) => d.status),
296
+ output: custom(() => stdout.trim() || "(no output)"),
297
+ }),
298
+ exitCode: 0,
299
+ };
300
+ }
301
+ async function deploymentDelete(ctx, args) {
302
+ if (wantsHelp(args)) {
303
+ return {
304
+ stdout: renderHelp([
305
+ "Usage: wrangler-axi pages deployment delete <deployment-id> [--project-name <name>] [--force]",
306
+ ]),
307
+ exitCode: 0,
308
+ };
309
+ }
310
+ validateFlags(args, ["--project-name", "--force"], "pages deployment delete");
311
+ // Take value-consuming flags before extracting the positional id.
312
+ const projectName = takeFlag(args, "--project-name");
313
+ const id = args.filter((a) => !a.startsWith("-"))[0];
314
+ if (!id) {
315
+ throw new AxiError("pages deployment delete requires a deployment id", "VALIDATION_ERROR", [
316
+ "Usage: wrangler-axi pages deployment delete <id>",
317
+ ]);
318
+ }
319
+ const wArgs = ["pages", "deployment", "delete", id];
320
+ if (ctx.account) {
321
+ wArgs.push("--account", ctx.account);
322
+ }
323
+ if (projectName) {
324
+ wArgs.push("--project-name", projectName);
325
+ }
326
+ if (takeAllFlags(args, ["--force"]).length > 0) {
327
+ wArgs.push("-f");
328
+ }
329
+ await callWrangler(ctx.runner, wArgs);
330
+ return {
331
+ stdout: renderDetail("deployment", { id, status: "deleted" }, {
332
+ id: custom((d) => d.id),
333
+ status: custom((d) => d.status),
334
+ }),
335
+ exitCode: 0,
336
+ };
337
+ }
@@ -0,0 +1,2 @@
1
+ import type { CommandArea } from "../cli.js";
2
+ export declare const r2Command: CommandArea;
@@ -0,0 +1,289 @@
1
+ import { AxiError, stripAnsi } 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 { addExtraDefs, parseFields, } from "../fields.js";
6
+ import { custom, field, renderDetail, renderHelp } from "../toon.js";
7
+ import { renderListBlock } from "../list.js";
8
+ const bucketAvailable = {
9
+ created: { def: field("creation_date") },
10
+ };
11
+ /**
12
+ * Parse wrangler's human `r2 bucket list` output. Wrangler 4.x rejects
13
+ * `--json` for this command; it prints one `label: value` block per bucket
14
+ * (name, creation_date), optionally ANSI-colored when attached to a TTY.
15
+ */
16
+ function parseBucketListOutput(stdout) {
17
+ const clean = stripAnsi(stdout);
18
+ const buckets = [];
19
+ let current = {};
20
+ for (const line of clean.split("\n")) {
21
+ const m = /^(name|creation_date):\s*(.*)$/.exec(line);
22
+ if (!m) {
23
+ continue;
24
+ }
25
+ if (m[1] === "name") {
26
+ if (current.name !== undefined) {
27
+ buckets.push(current);
28
+ }
29
+ current = { name: m[2] };
30
+ }
31
+ else if (current.name !== undefined) {
32
+ current.creation_date = m[2];
33
+ }
34
+ }
35
+ if (current.name !== undefined) {
36
+ buckets.push(current);
37
+ }
38
+ return buckets;
39
+ }
40
+ export const r2Command = {
41
+ name: "r2",
42
+ description: "manage R2 buckets (list, info, object pass-through)",
43
+ help: [
44
+ "Usage: wrangler-axi r2 <bucket|object> <sub> [args]",
45
+ " bucket list / info <name> — list or inspect R2 buckets",
46
+ " object get/put/delete <path> — pass-through object operations",
47
+ "Note: wrangler has no `r2 object list`; listing objects is not supported.",
48
+ "Example: wrangler-axi r2 bucket list",
49
+ "Example: wrangler-axi r2 bucket info my-bucket",
50
+ ],
51
+ async run(ctx, args) {
52
+ const sub = args[0];
53
+ if (sub === undefined || wantsHelp(args)) {
54
+ return { stdout: renderHelp(r2Command.help), exitCode: 0 };
55
+ }
56
+ const rest = args.slice(1);
57
+ switch (sub) {
58
+ case "bucket":
59
+ return bucket(ctx, rest);
60
+ case "object":
61
+ return object(ctx, rest);
62
+ default:
63
+ throw new AxiError(`Unknown r2 subcommand "${sub}"`, "VALIDATION_ERROR", [
64
+ "Run `wrangler-axi r2 --help` for valid subcommands",
65
+ ]);
66
+ }
67
+ },
68
+ };
69
+ async function bucket(ctx, args) {
70
+ if (wantsHelp(args)) {
71
+ return {
72
+ stdout: renderHelp([
73
+ "Usage: wrangler-axi r2 bucket <list|info|create|delete> [args]",
74
+ ]),
75
+ exitCode: 0,
76
+ };
77
+ }
78
+ const sub = args[0];
79
+ if (sub === undefined || sub.startsWith("-")) {
80
+ throw new AxiError("r2 bucket requires a subcommand", "VALIDATION_ERROR", [
81
+ "Run `wrangler-axi r2 bucket --help` for valid subcommands",
82
+ ]);
83
+ }
84
+ const rest = args.slice(1);
85
+ switch (sub) {
86
+ case "list":
87
+ return bucketList(ctx, rest);
88
+ case "info":
89
+ return bucketInfo(ctx, rest);
90
+ case "create":
91
+ return bucketCreate(ctx, rest);
92
+ case "delete":
93
+ return bucketDelete(ctx, rest);
94
+ default:
95
+ throw new AxiError(`Unknown r2 bucket subcommand "${sub}"`, "VALIDATION_ERROR", [
96
+ "Run `wrangler-axi r2 bucket --help` for valid subcommands",
97
+ ]);
98
+ }
99
+ }
100
+ async function bucketList(ctx, args) {
101
+ if (wantsHelp(args)) {
102
+ return {
103
+ stdout: renderHelp([
104
+ "Usage: wrangler-axi r2 bucket list [--fields] [--limit] [--full] [--json]",
105
+ ]),
106
+ exitCode: 0,
107
+ };
108
+ }
109
+ const json = takeAllFlags(args, ["--json"]).length > 0;
110
+ const full = takeAllFlags(args, ["--full"]).length > 0;
111
+ validateFlags(args, ["--fields", "--limit", "--full", "--json"], "r2 bucket list");
112
+ // wrangler's `r2 bucket list` rejects --json; parse its human output and
113
+ // provide the wrapper-side --json escape hatch from the parsed items.
114
+ const wArgs = ["r2", "bucket", "list"];
115
+ if (ctx.account) {
116
+ wArgs.push("--account", ctx.account);
117
+ }
118
+ const limit = full ? undefined : takeNumber(args, "--limit");
119
+ const fieldsArg = takeFlag(args, "--fields");
120
+ const { stdout } = await callWrangler(ctx.runner, wArgs);
121
+ const items = parseBucketListOutput(stdout);
122
+ if (json) {
123
+ return { stdout: JSON.stringify(items, null, 2), exitCode: 0 };
124
+ }
125
+ const { extraDefs } = parseFields(fieldsArg, bucketAvailable);
126
+ const schema = addExtraDefs({
127
+ name: field("name"),
128
+ created: field("creation_date"),
129
+ }, extraDefs);
130
+ return {
131
+ stdout: renderListBlock({
132
+ noun: "buckets",
133
+ items,
134
+ schema,
135
+ limit,
136
+ empty: "buckets: no R2 buckets found",
137
+ truncatedHint: "Run `wrangler-axi r2 bucket list --json` for the full set",
138
+ }),
139
+ exitCode: 0,
140
+ };
141
+ }
142
+ async function bucketInfo(ctx, args) {
143
+ if (wantsHelp(args)) {
144
+ return {
145
+ stdout: renderHelp([
146
+ "Usage: wrangler-axi r2 bucket info <name>",
147
+ ]),
148
+ exitCode: 0,
149
+ };
150
+ }
151
+ validateFlags(args, [], "r2 bucket info");
152
+ const name = args.filter((a) => !a.startsWith("-"))[0];
153
+ if (!name) {
154
+ throw new AxiError("r2 bucket info requires a bucket name", "VALIDATION_ERROR", [
155
+ "Usage: wrangler-axi r2 bucket info <name>",
156
+ ]);
157
+ }
158
+ const wArgs = ["r2", "bucket", "info", name, "--json"];
159
+ if (ctx.account) {
160
+ wArgs.push("--account", ctx.account);
161
+ }
162
+ const { stdout } = await callWrangler(ctx.runner, wArgs);
163
+ const data = parseJson(stdout, "r2 bucket");
164
+ return {
165
+ stdout: renderDetail("bucket", data, {
166
+ name: custom((b) => b.name ?? name),
167
+ location: custom((b) => b.location ?? "unknown"),
168
+ storage_class: custom((b) => b.storage_class ?? "unknown"),
169
+ size: custom((b) => b.size ?? 0),
170
+ }),
171
+ exitCode: 0,
172
+ };
173
+ }
174
+ async function bucketCreate(ctx, args) {
175
+ if (wantsHelp(args)) {
176
+ return {
177
+ stdout: renderHelp([
178
+ "Usage: wrangler-axi r2 bucket create <name>",
179
+ ]),
180
+ exitCode: 0,
181
+ };
182
+ }
183
+ validateFlags(args, [], "r2 bucket create");
184
+ const name = args.filter((a) => !a.startsWith("-"))[0];
185
+ if (!name) {
186
+ throw new AxiError("r2 bucket create requires a bucket name", "VALIDATION_ERROR", [
187
+ "Usage: wrangler-axi r2 bucket create <name>",
188
+ ]);
189
+ }
190
+ const wArgs = ["r2", "bucket", "create", name];
191
+ if (ctx.account) {
192
+ wArgs.push("--account", ctx.account);
193
+ }
194
+ await callWrangler(ctx.runner, wArgs);
195
+ return {
196
+ stdout: renderDetail("bucket", { name, status: "created" }, {
197
+ name: custom((d) => d.name),
198
+ status: custom((d) => d.status),
199
+ }),
200
+ exitCode: 0,
201
+ };
202
+ }
203
+ async function bucketDelete(ctx, args) {
204
+ if (wantsHelp(args)) {
205
+ return {
206
+ stdout: renderHelp([
207
+ "Usage: wrangler-axi r2 bucket delete <name> [--force]",
208
+ ]),
209
+ exitCode: 0,
210
+ };
211
+ }
212
+ validateFlags(args, ["--force"], "r2 bucket delete");
213
+ const name = args.filter((a) => !a.startsWith("-"))[0];
214
+ if (!name) {
215
+ throw new AxiError("r2 bucket delete requires a bucket name", "VALIDATION_ERROR", [
216
+ "Usage: wrangler-axi r2 bucket delete <name>",
217
+ ]);
218
+ }
219
+ const wArgs = ["r2", "bucket", "delete", name];
220
+ if (ctx.account) {
221
+ wArgs.push("--account", ctx.account);
222
+ }
223
+ if (takeAllFlags(args, ["--force"]).length > 0) {
224
+ wArgs.push("-f");
225
+ }
226
+ await callWrangler(ctx.runner, wArgs);
227
+ return {
228
+ stdout: renderDetail("bucket", { name, status: "deleted" }, {
229
+ name: custom((d) => d.name),
230
+ status: custom((d) => d.status),
231
+ }),
232
+ exitCode: 0,
233
+ };
234
+ }
235
+ async function object(ctx, args) {
236
+ if (wantsHelp(args)) {
237
+ return {
238
+ stdout: renderHelp([
239
+ "Usage: wrangler-axi r2 object <get|put|delete> <objectPath>",
240
+ "Pass-through to wrangler r2 object. Use --binding or --bucket to target.",
241
+ "Note: listing objects is not supported (wrangler has no r2 object list).",
242
+ ]),
243
+ exitCode: 0,
244
+ };
245
+ }
246
+ const sub = args[0];
247
+ if (sub === undefined || sub.startsWith("-")) {
248
+ throw new AxiError("r2 object requires a subcommand", "VALIDATION_ERROR", [
249
+ "Run `wrangler-axi r2 object --help` for valid subcommands",
250
+ ]);
251
+ }
252
+ if (sub === "list") {
253
+ throw new AxiError("r2 object list is not supported — wrangler has no native object listing command", "VALIDATION_ERROR", ["Use `wrangler-axi r2 bucket info <name>` to inspect a bucket"]);
254
+ }
255
+ const rest = args.slice(1);
256
+ // Take value-consuming flags before extracting the positional object path.
257
+ const flagValues = {};
258
+ for (const f of ["--binding", "--bucket", "--text", "--file", "--path", "--ttl"]) {
259
+ flagValues[f] = takeFlag(rest, f);
260
+ }
261
+ const objectPath = rest.filter((a) => !a.startsWith("-"))[0];
262
+ if (!objectPath) {
263
+ throw new AxiError(`r2 object ${sub} requires an object path`, "VALIDATION_ERROR", [
264
+ `Usage: wrangler-axi r2 object ${sub} <path>`,
265
+ ]);
266
+ }
267
+ validateFlags(rest, ["--binding", "--bucket", "--text", "--file", "--path", "--json", "--ttl"], `r2 object ${sub}`);
268
+ const wArgs = ["r2", "object", sub, objectPath];
269
+ if (ctx.account) {
270
+ wArgs.push("--account", ctx.account);
271
+ }
272
+ for (const [f, v] of Object.entries(flagValues)) {
273
+ if (v !== undefined) {
274
+ wArgs.push(f, v);
275
+ }
276
+ }
277
+ const { stdout } = await callWrangler(ctx.runner, wArgs);
278
+ if (takeAllFlags(rest, ["--json"]).length > 0) {
279
+ return { stdout, exitCode: 0 };
280
+ }
281
+ return {
282
+ stdout: renderDetail("object", { path: objectPath, status: sub }, {
283
+ path: custom((d) => d.path),
284
+ status: custom((d) => d.status),
285
+ output: custom(() => stdout.trim() || "(no output)"),
286
+ }),
287
+ exitCode: 0,
288
+ };
289
+ }
@@ -0,0 +1,2 @@
1
+ import type { CommandArea } from "../cli.js";
2
+ export declare const secretsCommand: CommandArea;