@dropthis/cli 0.2.4 → 0.2.5

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @dropthis/cli
2
2
 
3
- Official CLI for [dropthis](https://dropthis.app) -- the publish layer between AI and the internet. Publish a file, folder, or HTML string and get a URL back.
3
+ Official CLI for [dropthis](https://dropthis.app) -- the publish layer between AI and the internet. Built for humans, AI agents, and CI/CD pipelines.
4
4
 
5
5
  ## Install
6
6
 
@@ -8,6 +8,8 @@ Official CLI for [dropthis](https://dropthis.app) -- the publish layer between A
8
8
  npm install -g @dropthis/cli
9
9
  ```
10
10
 
11
+ Requires Node.js >= 20.
12
+
11
13
  ## Quick start
12
14
 
13
15
  ```bash
@@ -23,7 +25,17 @@ Log in with email OTP:
23
25
  dropthis login
24
26
  ```
25
27
 
26
- The CLI prompts for your email and a one-time code. For non-interactive environments, pass both:
28
+ The CLI prompts for your email and a one-time code. For non-interactive environments (agents, CI), use the two-step flow:
29
+
30
+ ```bash
31
+ # Step 1: Request OTP
32
+ dropthis login request --email you@example.com
33
+
34
+ # Step 2: Verify OTP
35
+ dropthis login verify --email you@example.com --otp 123456
36
+ ```
37
+
38
+ Or pass both flags directly:
27
39
 
28
40
  ```bash
29
41
  dropthis login --email you@example.com --otp 123456
@@ -36,8 +48,9 @@ Credentials resolve in this order:
36
48
  3. Stored credential from `dropthis login`
37
49
 
38
50
  ```bash
39
- dropthis whoami
40
- dropthis logout
51
+ dropthis whoami # Check current auth status
52
+ dropthis logout # Remove stored credentials
53
+ dropthis logout --revoke # Remove and revoke the key on the server
41
54
  ```
42
55
 
43
56
  ## Publish
@@ -46,7 +59,7 @@ dropthis logout
46
59
  # HTML file
47
60
  dropthis publish report.html
48
61
 
49
- # Directory
62
+ # Directory (static site)
50
63
  dropthis publish ./dist
51
64
 
52
65
  # Stdin
@@ -55,11 +68,11 @@ echo "<h1>Hello</h1>" | dropthis publish - --content-type text/html --path index
55
68
  # Multiple files bundled into one drop
56
69
  dropthis publish index.html styles.css app.js
57
70
 
58
- # Print only the URL
71
+ # Print only the URL (recommended for agents)
59
72
  dropthis publish ./dist --url
60
73
  ```
61
74
 
62
- ### Options
75
+ ### Publish options
63
76
 
64
77
  ```bash
65
78
  dropthis publish ./dist \
@@ -70,7 +83,7 @@ dropthis publish ./dist \
70
83
  --expires-at 2026-12-31T00:00:00Z
71
84
  ```
72
85
 
73
- All publish options:
86
+ All publish flags:
74
87
 
75
88
  | Flag | Description |
76
89
  |------|-------------|
@@ -94,7 +107,7 @@ All publish options:
94
107
 
95
108
  ### Global flags
96
109
 
97
- These flags are inherited by all commands, including `publish`:
110
+ These flags are inherited by all commands:
98
111
 
99
112
  | Flag | Description |
100
113
  |------|-------------|
@@ -113,45 +126,61 @@ dropthis update drop_abc123 --title "New title"
113
126
 
114
127
  # Optimistic concurrency
115
128
  dropthis update drop_abc123 ./dist-v2 --if-revision 1
129
+
130
+ # Change vanity slug
131
+ dropthis update drop_abc123 --slug new-slug
116
132
  ```
117
133
 
134
+ The `update` command supports all publish flags plus `--slug` and `--if-revision`.
135
+
118
136
  ## Commands
119
137
 
120
138
  ```bash
121
- dropthis publish <input> # Publish content, get a URL
122
- dropthis update <drop-id> [input] # Update an existing drop
139
+ dropthis publish [input...] # Publish content, get a URL
140
+ dropthis update <drop-id> [input] # Update an existing drop
123
141
 
124
- dropthis drops list # List your drops
125
- dropthis drops get <drop-id> # Get drop details
126
- dropthis drops update <drop-id> # Update drop metadata
127
- dropthis drops delete <drop-id> # Delete a drop
142
+ dropthis drops list # List your drops
143
+ dropthis drops get <drop-id> # Get drop details
144
+ dropthis drops update <drop-id> # Update drop metadata
145
+ dropthis drops delete <drop-id> # Delete a drop
128
146
 
129
- dropthis login # Authenticate with email OTP
130
- dropthis logout # Remove stored credentials
131
- dropthis whoami # Show current auth status
132
- dropthis account get # Account details
147
+ dropthis login # Authenticate with email OTP
148
+ dropthis login request --email <email> # Request OTP (non-interactive)
149
+ dropthis login verify --email <email> --otp <code> # Verify OTP
150
+ dropthis logout # Remove stored credentials
151
+ dropthis whoami # Show current auth status
152
+ dropthis account # Account details
133
153
 
134
- dropthis api-keys create # Create an API key
135
- dropthis api-keys list # List API keys
136
- dropthis api-keys delete <key-id> # Delete an API key
154
+ dropthis api-keys create # Create an API key
155
+ dropthis api-keys list # List API keys
156
+ dropthis api-keys delete <key-id> # Delete an API key
137
157
 
138
158
  dropthis deployments list <drop-id> # List deployments
139
159
  dropthis deployments get <drop-id> <dep-id> # Get deployment details
140
160
 
141
- dropthis doctor # CLI diagnostics
142
- dropthis commands # Machine-readable command metadata
161
+ dropthis doctor # CLI diagnostics
162
+ dropthis commands # Machine-readable command metadata
143
163
  ```
144
164
 
145
- ## CI / Automation
165
+ ## Agent & CI/CD usage
166
+
167
+ The CLI is designed for non-interactive use. In non-TTY environments (pipes, CI, agents), output defaults to JSON automatically.
146
168
 
147
- Set `DROPTHIS_API_KEY` to skip interactive login:
169
+ **Environment variable auth (recommended for CI):**
148
170
 
149
171
  ```bash
150
172
  export DROPTHIS_API_KEY=sk_live_...
151
173
  dropthis publish ./dist --url
152
174
  ```
153
175
 
154
- All commands support `--json` for structured output. Errors write to stderr with stable exit codes:
176
+ **Agent protocol:**
177
+
178
+ - Use `--url` to get only the published URL (cleanest for agents)
179
+ - Use `--json` for the full structured response
180
+ - Use `--yes` for destructive commands (`drops delete`, `api-keys delete`)
181
+ - All errors write to stderr as JSON with a `next_action` field
182
+
183
+ **Exit codes:**
155
184
 
156
185
  | Code | Meaning |
157
186
  |------|---------|
@@ -162,6 +191,32 @@ All commands support `--json` for structured output. Errors write to stderr with
162
191
  | 4 | Local input error |
163
192
  | 5 | Network error |
164
193
 
194
+ **JSON output shape:**
195
+
196
+ ```json
197
+ {"ok":true,"drop":{"url":"https://dropthis.app/abc123","id":"drop_abc123"}}
198
+ ```
199
+
200
+ **Error shape (stderr):**
201
+
202
+ ```json
203
+ {"ok":false,"error":{"code":"auth_error","message":"No API key found.","next_action":"Set DROPTHIS_API_KEY or run dropthis login."}}
204
+ ```
205
+
206
+ ## Doctor
207
+
208
+ Run diagnostics to verify CLI health:
209
+
210
+ ```bash
211
+ dropthis doctor
212
+ ```
213
+
214
+ Reports CLI version, auth source (`env`, `flag`, `stored`, or `missing`), and credential storage backend (`keyring`, `file`, or `none`).
215
+
216
+ ```json
217
+ {"ok":true,"version":"0.2.4","auth":{"source":"env"},"storage":{"backend":"keyring"}}
218
+ ```
219
+
165
220
  ## Agent skills
166
221
 
167
222
  This CLI ships with an [agent skill](https://skills.sh) that teaches AI coding agents (Cursor, Claude Code, Windsurf, etc.) how to use the dropthis CLI effectively, including non-interactive flags, output formats, and common pitfalls.
package/dist/cli.cjs CHANGED
@@ -490,13 +490,13 @@ async function runDoctor(_input, deps) {
490
490
  const authSource = credential?.source ?? "missing";
491
491
  const storageBackend = stored?.storage ?? "none";
492
492
  const pairs = [
493
- ["Version", "0.2.4"],
493
+ ["Version", "0.2.5"],
494
494
  ["Auth", authSource],
495
495
  ["Storage", storageBackend]
496
496
  ];
497
497
  writeKv(deps, pairs, {
498
498
  ok: true,
499
- version: "0.2.4",
499
+ version: "0.2.5",
500
500
  auth: { source: authSource },
501
501
  storage: { backend: storageBackend }
502
502
  });
@@ -1358,7 +1358,7 @@ function buildProgram(options = {}) {
1358
1358
  ` ${import_picocolors3.default.cyan("dropthis login")}`,
1359
1359
  ` ${import_picocolors3.default.cyan("dropthis publish ./dist")}`
1360
1360
  ].join("\n")
1361
- ).version("0.2.4").configureHelp({
1361
+ ).version("0.2.5").configureHelp({
1362
1362
  subcommandTerm(cmd) {
1363
1363
  const args = cmd.registeredArguments.map((a) => {
1364
1364
  const name = a.name();
@@ -1382,14 +1382,20 @@ function buildProgram(options = {}) {
1382
1382
  const deps = await commandDeps(program, options, store, commandOptions);
1383
1383
  const stdinIsTTY = options.stdinIsTTY ?? process.stdin.isTTY ?? false;
1384
1384
  let publishInput;
1385
- if (commandOptions.dryRun && inputs.length > 1) {
1386
- publishInput = inputs;
1387
- } else {
1388
- publishInput = await resolvePublishInputs(
1389
- inputs,
1390
- options.stdin,
1391
- stdinIsTTY
1392
- );
1385
+ try {
1386
+ if (commandOptions.dryRun && inputs.length > 1) {
1387
+ publishInput = inputs;
1388
+ } else {
1389
+ publishInput = await resolvePublishInputs(
1390
+ inputs,
1391
+ options.stdin,
1392
+ stdinIsTTY
1393
+ );
1394
+ }
1395
+ } catch (err) {
1396
+ const msg = err instanceof Error ? err.message : "Invalid input.";
1397
+ process.exitCode = writeError(deps, "local_input_error", msg).exitCode;
1398
+ return;
1393
1399
  }
1394
1400
  const result = await runPublish(
1395
1401
  publishInput,
@@ -1404,7 +1410,18 @@ function buildProgram(options = {}) {
1404
1410
  ).option("--url", "Print only the published URL").option("--dry-run", "Validate without publishing").action(
1405
1411
  async (target, input, commandOptions) => {
1406
1412
  const deps = await commandDeps(program, options, store, commandOptions);
1407
- const updateInput = input ? await resolveCommandInput(input, options.stdin) : void 0;
1413
+ let updateInput;
1414
+ try {
1415
+ updateInput = input ? await resolveCommandInput(input, options.stdin) : void 0;
1416
+ } catch (err) {
1417
+ const msg = err instanceof Error ? err.message : "Invalid input.";
1418
+ process.exitCode = writeError(
1419
+ deps,
1420
+ "local_input_error",
1421
+ msg
1422
+ ).exitCode;
1423
+ return;
1424
+ }
1408
1425
  const result = await runUpdate(
1409
1426
  target,
1410
1427
  updateInput,
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/program.ts","../src/auth.ts","../src/output.ts","../src/ui.ts","../src/fmt.ts","../src/commands/account.ts","../src/commands/api-keys.ts","../src/commands/commands.ts","../src/commands/deployments.ts","../src/commands/doctor.ts","../src/commands/drops.ts","../src/options.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/spinner.ts","../src/commands/json_body.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/context.ts","../src/storage.ts","../src/cli.ts"],"sourcesContent":["import { Command, InvalidArgumentError } from \"commander\";\nimport pc from \"picocolors\";\nimport { resolveCredential } from \"./auth.js\";\nimport { runAccountGet } from \"./commands/account.js\";\nimport {\n\trunApiKeysCreate,\n\trunApiKeysDelete,\n\trunApiKeysList,\n} from \"./commands/api-keys.js\";\nimport { runCommands } from \"./commands/commands.js\";\nimport {\n\trunDeploymentsGet,\n\trunDeploymentsList,\n} from \"./commands/deployments.js\";\nimport { runDoctor } from \"./commands/doctor.js\";\nimport {\n\trunDropsDelete,\n\trunDropsGet,\n\trunDropsList,\n\trunDropsUpdate,\n} from \"./commands/drops.js\";\nimport {\n\trunLoginInteractive,\n\trunLoginRequest,\n\trunLoginVerify,\n} from \"./commands/login.js\";\nimport { runLogout } from \"./commands/logout.js\";\nimport { runPublish } from \"./commands/publish.js\";\nimport { runUpdate } from \"./commands/update.js\";\nimport { runWhoami } from \"./commands/whoami.js\";\nimport { createContext, type GlobalOptions } from \"./context.js\";\nimport type { RawDropOptions } from \"./options.js\";\nimport { type CredentialStore, MemoryCredentialStore } from \"./storage.js\";\n\ntype BuildProgramOptions = {\n\tstore?: CredentialStore;\n\tclient?: unknown;\n\tenv?: Record<string, string | undefined>;\n\tstdin?: AsyncIterable<string | Uint8Array>;\n\tstdout?: (value: string) => void;\n\tstderr?: (value: string) => void;\n\tstdoutIsTTY?: boolean;\n\tstdinIsTTY?: boolean;\n};\n\nexport function buildProgram(options: BuildProgramOptions = {}): Command {\n\tconst program = new Command();\n\tconst store = options.store ?? new MemoryCredentialStore();\n\tprogram\n\t\t.name(\"dropthis\")\n\t\t.description(\n\t\t\t[\n\t\t\t\tpc.dim(\"Publish anything online and get a URL back.\"),\n\t\t\t\t\"\",\n\t\t\t\t`${pc.bold(\"Quick start:\")}`,\n\t\t\t\t` ${pc.cyan(\"dropthis login\")}`,\n\t\t\t\t` ${pc.cyan(\"dropthis publish ./dist\")}`,\n\t\t\t].join(\"\\n\"),\n\t\t)\n\t\t.version(PKG_VERSION)\n\t\t.configureHelp({\n\t\t\tsubcommandTerm(cmd) {\n\t\t\t\tconst args = cmd.registeredArguments\n\t\t\t\t\t.map((a) => {\n\t\t\t\t\t\tconst name = a.name();\n\t\t\t\t\t\tconst variadic = a.variadic ? \"...\" : \"\";\n\t\t\t\t\t\treturn a.required ? `<${name}${variadic}>` : `[${name}${variadic}]`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\" \");\n\t\t\t\treturn args ? `${cmd.name()} ${args}` : cmd.name();\n\t\t\t},\n\t\t\tstyleTitle: (title) => pc.bold(title),\n\t\t\tstyleCommandText: (str) => pc.cyan(str),\n\t\t\tstyleSubcommandText: (str) => pc.cyan(str),\n\t\t\tstyleOptionText: (str) => pc.yellow(str),\n\t\t});\n\tprogram.option(\"--api-key <key>\", \"Override API key for this invocation\");\n\tprogram.option(\"--api-url <url>\", \"Override API base URL\");\n\tprogram.option(\"--json\", \"Force JSON output\");\n\tprogram.option(\"-q, --quiet\", \"Suppress status output and imply JSON\");\n\n\tprogram\n\t\t.command(\"publish [input...]\")\n\t\t.description(\n\t\t\t\"Publish files, folders, URLs, strings, or stdin.\\nMultiple files are bundled into one drop.\\nUse - to read stdin explicitly, or pipe without args.\",\n\t\t)\n\t\t.option(\"--from-json <path>\", \"Read exact POST /drops JSON request body\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.option(\"--title <title>\", \"Drop title\")\n\t\t.option(\"--visibility <visibility>\", \"Drop visibility\")\n\t\t.option(\"--password <password>\", \"Set password\")\n\t\t.option(\"--no-password\", \"Clear password\")\n\t\t.option(\"--noindex\", \"Prevent indexing\")\n\t\t.option(\"--index\", \"Allow indexing\")\n\t\t.option(\"--expires-at <datetime>\", \"Expiration datetime\")\n\t\t.option(\"--metadata <json>\", \"Metadata JSON object\")\n\t\t.option(\"--metadata-file <path>\", \"Metadata JSON file\")\n\t\t.option(\"--entry <path>\", \"Entry file path\")\n\t\t.option(\"--content-type <mime>\", \"Content type\")\n\t\t.option(\"--path <path>\", \"Path for stdin or byte input\")\n\t\t.option(\"--idempotency-key <key>\", \"Idempotency key\")\n\t\t.option(\"--url\", \"Print only the published URL\")\n\t\t.option(\"--dry-run\", \"Validate without publishing\")\n\t\t.action(async (inputs: string[], commandOptions: RawCommandOptions) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runPublish>[2][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst stdinIsTTY = options.stdinIsTTY ?? process.stdin.isTTY ?? false;\n\t\t\tlet publishInput: string | string[] | undefined;\n\t\t\tif (commandOptions.dryRun && inputs.length > 1) {\n\t\t\t\tpublishInput = inputs;\n\t\t\t} else {\n\t\t\t\tpublishInput = await resolvePublishInputs(\n\t\t\t\t\tinputs,\n\t\t\t\t\toptions.stdin,\n\t\t\t\t\tstdinIsTTY,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst result = await runPublish(\n\t\t\t\tpublishInput,\n\t\t\t\ttoDropOptions(commandOptions),\n\t\t\t\tdeps,\n\t\t\t);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"update <target> [input]\")\n\t\t.description(\"Deploy new content to an existing drop\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.option(\"--slug <slug>\", \"Replace shared hosted drop slug\")\n\t\t.option(\"--title <title>\", \"Drop title\")\n\t\t.option(\"--visibility <visibility>\", \"Drop visibility\")\n\t\t.option(\"--password <password>\", \"Set password\")\n\t\t.option(\"--no-password\", \"Clear password\")\n\t\t.option(\"--noindex\", \"Prevent indexing\")\n\t\t.option(\"--index\", \"Allow indexing\")\n\t\t.option(\"--expires-at <datetime>\", \"Expiration datetime\")\n\t\t.option(\"--metadata <json>\", \"Metadata JSON object\")\n\t\t.option(\"--metadata-file <path>\", \"Metadata JSON file\")\n\t\t.option(\"--entry <path>\", \"Entry file path\")\n\t\t.option(\"--content-type <mime>\", \"Content type\")\n\t\t.option(\"--path <path>\", \"Path for stdin or byte input\")\n\t\t.option(\"--idempotency-key <key>\", \"Idempotency key\")\n\t\t.option(\"--if-revision <n>\", \"Expected current revision\", parseInteger)\n\t\t.option(\n\t\t\t\"--from-json <path>\",\n\t\t\t\"Read exact POST /drops/{drop_id}/deployments JSON request body\",\n\t\t)\n\t\t.option(\"--url\", \"Print only the published URL\")\n\t\t.option(\"--dry-run\", \"Validate without publishing\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\ttarget: string,\n\t\t\t\tinput: string | undefined,\n\t\t\t\tcommandOptions: RawCommandOptions & { ifRevision?: number },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runUpdate>[3][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst updateInput = input\n\t\t\t\t\t? await resolveCommandInput(input, options.stdin)\n\t\t\t\t\t: undefined;\n\t\t\t\tconst result = await runUpdate(\n\t\t\t\t\ttarget,\n\t\t\t\t\tupdateInput,\n\t\t\t\t\ttoDropOptions(commandOptions),\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst drops = program.command(\"drops\").description(\"Manage published drops\");\n\tdrops\n\t\t.command(\"list\")\n\t\t.description(\"List your drops\")\n\t\t.option(\"--limit <n>\", \"Page size\", parseInteger)\n\t\t.option(\"--cursor <cursor>\", \"Pagination cursor\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (commandOptions: {\n\t\t\t\tlimit?: number;\n\t\t\t\tcursor?: string;\n\t\t\t\tjson?: boolean;\n\t\t\t}) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDropsList>[1][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDropsList(commandOptions, deps);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\tdrops\n\t\t.command(\"get <dropId>\")\n\t\t.description(\"Show drop details\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (dropId: string, commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runDropsGet>[2][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runDropsGet(dropId, commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tdrops\n\t\t.command(\"update <dropId>\")\n\t\t.description(\"Update drop metadata\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.option(\"--title <title>\", \"Drop title\")\n\t\t.option(\"--visibility <visibility>\", \"Drop visibility\")\n\t\t.option(\"--password <password>\", \"Set password\")\n\t\t.option(\"--no-password\", \"Clear password\")\n\t\t.option(\"--noindex\", \"Prevent indexing\")\n\t\t.option(\"--index\", \"Allow indexing\")\n\t\t.option(\"--expires-at <datetime>\", \"Expiration datetime\")\n\t\t.option(\"--metadata <json>\", \"Metadata JSON object\")\n\t\t.option(\"--metadata-file <path>\", \"Metadata JSON file\")\n\t\t.action(async (dropId: string, commandOptions: RawCommandOptions) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runDropsUpdate>[2][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runDropsUpdate(\n\t\t\t\tdropId,\n\t\t\t\ttoDropOptions(commandOptions),\n\t\t\t\tdeps,\n\t\t\t);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tdrops\n\t\t.command(\"delete <dropId>\")\n\t\t.description(\"Delete a drop\")\n\t\t.option(\"--yes\", \"Confirm deletion\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tdropId: string,\n\t\t\t\tcommandOptions: { yes?: boolean; json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDropsDelete>[2][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDropsDelete(\n\t\t\t\t\tdropId,\n\t\t\t\t\t{ ...commandOptions, interactive: deps.outputMode === \"human\" },\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst apiKeys = program.command(\"api-keys\").description(\"Manage API keys\");\n\tapiKeys\n\t\t.command(\"create\")\n\t\t.description(\"Create an API key\")\n\t\t.option(\"--label <label>\", \"API key label\", \"CLI\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { label: string; json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runApiKeysCreate>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runApiKeysCreate(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tapiKeys\n\t\t.command(\"list\")\n\t\t.description(\"List API keys\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runApiKeysList>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runApiKeysList(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tapiKeys\n\t\t.command(\"delete <keyId>\")\n\t\t.description(\"Delete an API key\")\n\t\t.option(\"--yes\", \"Confirm deletion\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tkeyId: string,\n\t\t\t\tcommandOptions: { yes?: boolean; json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runApiKeysDelete>[2][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runApiKeysDelete(\n\t\t\t\t\tkeyId,\n\t\t\t\t\t{ ...commandOptions, interactive: deps.outputMode === \"human\" },\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst deployments = program\n\t\t.command(\"deployments\")\n\t\t.description(\"View deployment history\");\n\tdeployments\n\t\t.command(\"list <dropId>\")\n\t\t.description(\"List deployments for a drop\")\n\t\t.option(\"--limit <n>\", \"Page size\", parseInteger)\n\t\t.option(\"--cursor <cursor>\", \"Pagination cursor\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tdropId: string,\n\t\t\t\tcommandOptions: { limit?: number; cursor?: string; json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDeploymentsList>[2][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDeploymentsList(dropId, commandOptions, deps);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\tdeployments\n\t\t.command(\"get <dropId> <deploymentId>\")\n\t\t.description(\"Show deployment details\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tdropId: string,\n\t\t\t\tdeploymentId: string,\n\t\t\t\tcommandOptions: { json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDeploymentsGet>[3][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDeploymentsGet(\n\t\t\t\t\tdropId,\n\t\t\t\t\tdeploymentId,\n\t\t\t\t\tcommandOptions,\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\t// --- Auth commands ---\n\n\tprogram\n\t\t.command(\"login\")\n\t\t.description(\"Authenticate with email OTP\")\n\t\t.option(\"--email <email>\", \"Email address\")\n\t\t.option(\"--otp <otp>\", \"One-time passcode\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (commandOptions: {\n\t\t\t\temail?: string;\n\t\t\t\totp?: string;\n\t\t\t\tjson?: boolean;\n\t\t\t}) => {\n\t\t\t\tif (!commandOptions.email || !commandOptions.otp) {\n\t\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\t\tParameters<typeof runLoginInteractive>[0][\"client\"]\n\t\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\t\tconst global = globalOptions(program, commandOptions);\n\t\t\t\t\tconst context = createContext({ global });\n\t\t\t\t\tconst result = await runLoginInteractive({\n\t\t\t\t\t\t...deps,\n\t\t\t\t\t\tcreateClient: (apiKey) =>\n\t\t\t\t\t\t\tcontext.createClient(apiKey) as Parameters<\n\t\t\t\t\t\t\t\ttypeof runLoginInteractive\n\t\t\t\t\t\t\t>[0][\"client\"],\n\t\t\t\t\t});\n\t\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runLoginVerify>[1][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst global = globalOptions(program, commandOptions);\n\t\t\t\tconst verifyContext = createContext({ global });\n\t\t\t\tconst result = await runLoginVerify(\n\t\t\t\t\t{\n\t\t\t\t\t\temail: commandOptions.email,\n\t\t\t\t\t\totp: commandOptions.otp,\n\t\t\t\t\t\t...(commandOptions.json !== undefined\n\t\t\t\t\t\t\t? { json: commandOptions.json }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...deps,\n\t\t\t\t\t\tcreateClient: (apiKey) =>\n\t\t\t\t\t\t\tverifyContext.createClient(apiKey) as Parameters<\n\t\t\t\t\t\t\t\ttypeof runLoginVerify\n\t\t\t\t\t\t\t>[1][\"client\"],\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst login = program.commands.find((command) => command.name() === \"login\");\n\tlogin\n\t\t?.command(\"request\")\n\t\t.description(\"Request an email OTP\")\n\t\t.requiredOption(\"--email <email>\", \"Email address\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { email: string; json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runLoginRequest>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runLoginRequest(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tlogin\n\t\t?.command(\"verify\")\n\t\t.description(\"Verify email OTP and store an API key\")\n\t\t.requiredOption(\"--email <email>\", \"Email address\")\n\t\t.requiredOption(\"--otp <otp>\", \"One-time passcode\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (commandOptions: {\n\t\t\t\temail: string;\n\t\t\t\totp: string;\n\t\t\t\tjson?: boolean;\n\t\t\t}) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runLoginVerify>[1][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst global = globalOptions(program, commandOptions);\n\t\t\t\tconst verifySubContext = createContext({ global });\n\t\t\t\tconst result = await runLoginVerify(commandOptions, {\n\t\t\t\t\t...deps,\n\t\t\t\t\tcreateClient: (apiKey) =>\n\t\t\t\t\t\tverifySubContext.createClient(apiKey) as Parameters<\n\t\t\t\t\t\t\ttypeof runLoginVerify\n\t\t\t\t\t\t>[1][\"client\"],\n\t\t\t\t});\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tprogram\n\t\t.command(\"logout\")\n\t\t.description(\"Remove stored credentials\")\n\t\t.option(\"--revoke\", \"Best-effort revoke the saved API key\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { revoke?: boolean; json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<Parameters<typeof runLogout>[1][\"client\"]>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runLogout(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"whoami\")\n\t\t.description(\"Show current authentication status\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<unknown>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runWhoami(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"account\")\n\t\t.description(\"Show account details\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runAccountGet>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runAccountGet(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\t// --- Diagnostics ---\n\n\tprogram\n\t\t.command(\"doctor\")\n\t\t.description(\"Report CLI diagnostics\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<unknown>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runDoctor(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"commands\")\n\t\t.description(\"Print machine-readable command metadata\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<unknown>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runCommands(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\treturn program;\n}\n\ntype RawCommandOptions = Omit<RawDropOptions, \"password\"> & {\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tifRevision?: number;\n\tfromJson?: string;\n\tdryRun?: boolean;\n\tpassword?: string | boolean;\n};\n\ntype RunnerDeps<TClient> = {\n\tstore: CredentialStore;\n\tclient: TClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode: \"human\" | \"json\";\n};\n\nasync function commandDeps<TClient>(\n\tprogram: Command,\n\toptions: BuildProgramOptions,\n\tstore: CredentialStore,\n\tcommandOptions: { json?: boolean; quiet?: boolean },\n): Promise<RunnerDeps<TClient>> {\n\tconst global = globalOptions(program, commandOptions);\n\tconst context = createContext({\n\t\tglobal,\n\t\t...(options.env !== undefined ? { env: options.env } : {}),\n\t\t...(options.stdout !== undefined ? { stdout: options.stdout } : {}),\n\t\t...(options.stderr !== undefined ? { stderr: options.stderr } : {}),\n\t\t...(options.stdoutIsTTY !== undefined\n\t\t\t? { stdoutIsTTY: options.stdoutIsTTY }\n\t\t\t: {}),\n\t});\n\tconst credential = await resolveCredential({\n\t\t...(global.apiKey ? { apiKey: global.apiKey } : {}),\n\t\tenv: context.env,\n\t\tstore,\n\t});\n\treturn {\n\t\tstore,\n\t\tclient: (options.client ??\n\t\t\tcontext.createClient(credential?.apiKey)) as TClient,\n\t\t...(global.apiKey ? { apiKey: global.apiKey } : {}),\n\t\tenv: context.env,\n\t\tstdout: context.stdout,\n\t\tstderr: context.stderr,\n\t\toutputMode: context.output.mode,\n\t};\n}\n\nfunction globalOptions(\n\tprogram: Command,\n\tcommandOptions: { json?: boolean; quiet?: boolean },\n): GlobalOptions {\n\tconst opts = program.opts<GlobalOptions>();\n\treturn {\n\t\t...(opts.apiKey ? { apiKey: opts.apiKey } : {}),\n\t\t...(opts.apiUrl ? { apiUrl: opts.apiUrl } : {}),\n\t\t...(commandOptions.json !== undefined\n\t\t\t? { json: commandOptions.json }\n\t\t\t: opts.json !== undefined\n\t\t\t\t? { json: opts.json }\n\t\t\t\t: {}),\n\t\t...(commandOptions.quiet !== undefined\n\t\t\t? { quiet: commandOptions.quiet }\n\t\t\t: opts.quiet !== undefined\n\t\t\t\t? { quiet: opts.quiet }\n\t\t\t\t: {}),\n\t};\n}\n\nfunction toDropOptions(options: RawCommandOptions): RawDropOptions & {\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tifRevision?: number;\n\tfromJson?: string;\n\tdryRun?: boolean;\n} {\n\treturn {\n\t\t...(options.slug ? { slug: options.slug } : {}),\n\t\t...(options.title ? { title: options.title } : {}),\n\t\t...(options.visibility === \"public\" || options.visibility === \"unlisted\"\n\t\t\t? { visibility: options.visibility }\n\t\t\t: {}),\n\t\t...(typeof options.password === \"string\"\n\t\t\t? { password: options.password }\n\t\t\t: {}),\n\t\t...(options.password === false || options.noPassword\n\t\t\t? { noPassword: true }\n\t\t\t: {}),\n\t\t...(options.noindex ? { noindex: true } : {}),\n\t\t...(options.index ? { index: true } : {}),\n\t\t...(options.expiresAt ? { expiresAt: options.expiresAt } : {}),\n\t\t...(options.metadata ? { metadata: options.metadata } : {}),\n\t\t...(options.metadataFile ? { metadataFile: options.metadataFile } : {}),\n\t\t...(options.entry ? { entry: options.entry } : {}),\n\t\t...(options.contentType ? { contentType: options.contentType } : {}),\n\t\t...(options.path ? { path: options.path } : {}),\n\t\t...(options.idempotencyKey\n\t\t\t? { idempotencyKey: options.idempotencyKey }\n\t\t\t: {}),\n\t\t...(options.json !== undefined ? { json: options.json } : {}),\n\t\t...(options.quiet !== undefined ? { quiet: options.quiet } : {}),\n\t\t...(options.url !== undefined ? { url: options.url } : {}),\n\t\t...(options.ifRevision !== undefined\n\t\t\t? { ifRevision: options.ifRevision }\n\t\t\t: {}),\n\t\t...(options.fromJson ? { fromJson: options.fromJson } : {}),\n\t\t...(options.dryRun ? { dryRun: options.dryRun } : {}),\n\t};\n}\n\nfunction parseInteger(value: string): number {\n\tconst n = Number.parseInt(value, 10);\n\tif (Number.isNaN(n)) throw new InvalidArgumentError(\"Expected an integer.\");\n\treturn n;\n}\n\nasync function resolveCommandInput(\n\tinput: string,\n\tstdin?: AsyncIterable<string | Uint8Array>,\n): Promise<string> {\n\tif (input !== \"-\") return input;\n\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\treturn buf.toString(\"utf8\");\n}\n\nasync function resolvePublishInputs(\n\tinputs: string[],\n\tstdin?: AsyncIterable<string | Uint8Array>,\n\tstdinIsTTY?: boolean,\n): Promise<string | undefined> {\n\tif (inputs.length === 0) {\n\t\tif (stdinIsTTY) return undefined;\n\t\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\t\tif (buf.length === 0) return undefined;\n\t\treturn buf.toString(\"utf8\");\n\t}\n\tif (inputs.length === 1) {\n\t\tif (inputs[0] === \"-\") {\n\t\t\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\t\t\treturn buf.toString(\"utf8\");\n\t\t}\n\t\treturn inputs[0];\n\t}\n\tconst {\n\t\tmkdtemp,\n\t\tcopyFile,\n\t\twriteFile,\n\t\tstat: fsStat,\n\t} = await import(\"node:fs/promises\");\n\tconst { join, basename: pathBasename } = await import(\"node:path\");\n\tconst { tmpdir } = await import(\"node:os\");\n\tconst tmpDir = await mkdtemp(join(tmpdir(), \"dropthis-multi-\"));\n\tconst resolved: string[] = [];\n\tfor (const input of inputs) {\n\t\tif (input === \"-\") {\n\t\t\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\t\t\tconst tmpPath = join(tmpDir, `stdin-${Date.now()}`);\n\t\t\tawait writeFile(tmpPath, buf);\n\t\t\tresolved.push(tmpPath);\n\t\t} else {\n\t\t\tresolved.push(input);\n\t\t}\n\t}\n\tconst names = resolved.map((f) => pathBasename(f));\n\tconst dupes = names.filter((n, i) => names.indexOf(n) !== i);\n\tif (dupes.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Duplicate file names: ${[...new Set(dupes)].join(\", \")}. Rename files to avoid collisions.`,\n\t\t);\n\t}\n\tfor (const filePath of resolved) {\n\t\tconst info = await fsStat(filePath);\n\t\tif (info.isDirectory()) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot mix directories with multiple file arguments. Use a single folder instead: dropthis publish ${filePath}`,\n\t\t\t);\n\t\t}\n\t\tconst destName = pathBasename(filePath);\n\t\tawait copyFile(filePath, join(tmpDir, destName));\n\t}\n\treturn tmpDir;\n}\n\nasync function readStdinBytes(\n\tstdin: AsyncIterable<string | Uint8Array>,\n): Promise<Buffer> {\n\tconst chunks: Buffer[] = [];\n\tfor await (const chunk of stdin) {\n\t\tchunks.push(\n\t\t\ttypeof chunk === \"string\" ? Buffer.from(chunk) : Buffer.from(chunk),\n\t\t);\n\t}\n\treturn Buffer.concat(chunks);\n}\n","import type { CredentialStore } from \"./storage.js\";\n\nexport type ResolvedCredential = {\n\tapiKey: string;\n\tsource: \"flag\" | \"env\" | \"storage\";\n\tkeyId?: string;\n\tkeyLast4?: string;\n\taccountId?: string;\n\temail?: string;\n};\n\nexport async function resolveCredential(input: {\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstore: CredentialStore;\n}): Promise<ResolvedCredential | null> {\n\tif (input.apiKey) return { apiKey: input.apiKey, source: \"flag\" };\n\tif (input.env.DROPTHIS_API_KEY) {\n\t\treturn { apiKey: input.env.DROPTHIS_API_KEY, source: \"env\" };\n\t}\n\tconst stored = await input.store.read();\n\tif (!stored) return null;\n\treturn {\n\t\tapiKey: stored.apiKey,\n\t\tsource: \"storage\",\n\t\t...(stored.keyId ? { keyId: stored.keyId } : {}),\n\t\t...(stored.keyLast4 ? { keyLast4: stored.keyLast4 } : {}),\n\t\t...(stored.accountId ? { accountId: stored.accountId } : {}),\n\t\t...(stored.email ? { email: stored.email } : {}),\n\t};\n}\n\nexport function maskKey(apiKey: string): string {\n\treturn apiKey.length <= 8\n\t\t? \"sk_...\"\n\t\t: `${apiKey.slice(0, 3)}...${apiKey.slice(-4)}`;\n}\n","export type OutputMode = \"human\" | \"json\";\nexport type CliErrorCode =\n\t| \"api_error\"\n\t| \"auth_error\"\n\t| \"credential_storage_unavailable\"\n\t| \"generic_error\"\n\t| \"invalid_usage\"\n\t| \"local_input_error\"\n\t| \"network_error\";\n\nexport type Output = {\n\tmode: OutputMode;\n\tquiet: boolean;\n};\n\nexport type ApiErrorDetails = {\n\tcode?: string;\n\tmessage: string;\n\tstatusCode?: number | null;\n\tdetail?: unknown;\n\tparam?: string | null;\n\tcurrentRevision?: number;\n\trequestId?: string | null;\n};\n\nconst UPLOAD_NEXT_ACTIONS: Record<string, string> = {\n\tupload_expired: \"Create a new upload session and retry the publish.\",\n\tupload_already_used:\n\t\t\"Create a new upload session; upload sessions are single-use.\",\n\tupload_verification_failed:\n\t\t\"Re-upload the file bytes and complete the upload again.\",\n\ttoo_many_active_uploads:\n\t\t\"Cancel unused uploads or wait for expired uploads to be cleaned.\",\n\tupload_not_complete: \"Complete the upload session before publishing.\",\n};\n\nexport function createOutput(input: {\n\tjson?: boolean;\n\tquiet?: boolean;\n\tstdoutIsTTY: boolean;\n\tenv: Record<string, string | undefined>;\n}): Output {\n\tconst json =\n\t\tinput.json === true ||\n\t\tinput.quiet === true ||\n\t\tinput.stdoutIsTTY === false ||\n\t\tinput.env.CI === \"true\";\n\treturn { mode: json ? \"json\" : \"human\", quiet: input.quiet === true };\n}\n\nexport function successEnvelope<T>(data: T): { ok: true; data: T } {\n\treturn { ok: true, data };\n}\n\nexport function errorEnvelope(\n\tcode: CliErrorCode,\n\tmessage: string,\n\tnextAction?: string,\n): {\n\tok: false;\n\terror: { code: CliErrorCode; message: string; next_action?: string };\n} {\n\treturn {\n\t\tok: false,\n\t\terror: {\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\t...(nextAction ? { next_action: nextAction } : {}),\n\t\t},\n\t};\n}\n\nexport function apiErrorEnvelope(error: ApiErrorDetails): {\n\tok: false;\n\terror: Record<string, unknown>;\n} {\n\treturn {\n\t\tok: false,\n\t\terror: {\n\t\t\tcode: error.code ?? \"api_error\",\n\t\t\tmessage: error.message,\n\t\t\t...(error.statusCode !== undefined ? { status: error.statusCode } : {}),\n\t\t\t...(typeof error.detail === \"string\" ? { detail: error.detail } : {}),\n\t\t\t...(error.param ? { param: error.param } : {}),\n\t\t\t...(error.currentRevision !== undefined\n\t\t\t\t? { current_revision: error.currentRevision }\n\t\t\t\t: {}),\n\t\t\t...(error.requestId ? { request_id: error.requestId } : {}),\n\t\t\tnext_action: nextActionForApiError(error),\n\t\t},\n\t};\n}\n\nfunction nextActionForApiError(error: ApiErrorDetails): string {\n\tconst uploadNextAction = error.code\n\t\t? UPLOAD_NEXT_ACTIONS[error.code]\n\t\t: undefined;\n\tif (uploadNextAction) return uploadNextAction;\n\tif (error.code === \"revision_conflict\") {\n\t\treturn \"Fetch the drop, merge your changes, and retry with the current revision.\";\n\t}\n\tif (error.statusCode === 401 || error.code === \"missing_api_key\") {\n\t\treturn \"Authenticate with dropthis login or set DROPTHIS_API_KEY.\";\n\t}\n\tif (error.statusCode === 413 || error.code === \"quota_exceeded\") {\n\t\treturn \"Reduce the upload size or upgrade the account limit.\";\n\t}\n\tif (error.statusCode === 422) {\n\t\treturn \"Fix the input shown in the error detail and retry.\";\n\t}\n\tif (\n\t\terror.statusCode !== undefined &&\n\t\terror.statusCode !== null &&\n\t\terror.statusCode >= 500\n\t) {\n\t\treturn \"Retry the request with the same idempotency key, or contact support with the request id.\";\n\t}\n\treturn \"Fix the request or retry after checking the drop state.\";\n}\n\nexport function exitCodeFor(code: CliErrorCode): number {\n\tif (code === \"invalid_usage\") return 2;\n\tif (code === \"auth_error\") return 3;\n\tif (code === \"local_input_error\") return 4;\n\tif (code === \"network_error\") return 5;\n\treturn 1;\n}\n","import pc from \"picocolors\";\n\nexport const symbols = {\n\tsuccess: \"✓\",\n\terror: \"✗\",\n\twarning: \"!\",\n} as const;\n\nexport function success(msg: string): string {\n\treturn `${pc.green(symbols.success)} ${msg}`;\n}\n\nexport function error(msg: string): string {\n\treturn `${pc.red(symbols.error)} ${msg}`;\n}\n\nexport function warn(msg: string): string {\n\treturn `${pc.yellow(symbols.warning)} ${msg}`;\n}\n\nexport function hint(msg: string): string {\n\treturn ` ${pc.dim(msg)}`;\n}\n\nexport function url(u: string): string {\n\treturn pc.cyan(u);\n}\n\nexport function label(key: string, value: string): string {\n\treturn `${pc.dim(`${key}:`)} ${value}`;\n}\n\nexport function kvLines(pairs: Array<[key: string, value: string]>): string {\n\tif (pairs.length === 0) return \"\";\n\tconst maxKey = Math.max(...pairs.map(([k]) => k.length));\n\treturn pairs\n\t\t.map(([k, v]) => ` ${pc.dim(`${k.padEnd(maxKey)}:`)} ${v}`)\n\t\t.join(\"\\n\");\n}\n","import type { ApiErrorDetails } from \"./output.js\";\nimport {\n\tapiErrorEnvelope,\n\ttype CliErrorCode,\n\terrorEnvelope,\n\texitCodeFor,\n} from \"./output.js\";\nimport { error, hint, kvLines, success, url } from \"./ui.js\";\n\ntype WriterDeps = {\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport function writeSuccess(\n\tdeps: WriterDeps,\n\tmessage: string,\n\tlink?: string,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tconst text = link ? `${message} ${url(link)}` : message;\n\t\tdeps.stdout(`${success(text)}\\n`);\n\t}\n}\n\nexport function writeUrl(deps: WriterDeps, link: string): void {\n\tdeps.stdout(`${url(link)}\\n`);\n}\n\nexport function writeResult(\n\tdeps: WriterDeps,\n\tlink: string,\n\tverb: string,\n\tdata: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${success(`${verb} ${url(link)}`)}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify({ ok: true, drop: data })}\\n`);\n\t}\n}\n\nexport function writeJson(\n\tdeps: WriterDeps,\n\tenvelope: Record<string, unknown>,\n): void {\n\tdeps.stdout(`${JSON.stringify(envelope)}\\n`);\n}\n\nexport function writeKv(\n\tdeps: WriterDeps,\n\tpairs: Array<[string, string]>,\n\tjson: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${kvLines(pairs)}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify(json)}\\n`);\n\t}\n}\n\nexport function writeHumanOrJson(\n\tdeps: WriterDeps,\n\thumanText: string,\n\tjson: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${humanText}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify(json)}\\n`);\n\t}\n}\n\nexport function writeError(\n\tdeps: WriterDeps,\n\tcode: CliErrorCode,\n\tmessage: string,\n\tnextAction?: string,\n): { exitCode: number } {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stderr(`${error(message)}\\n`);\n\t\tif (nextAction) deps.stderr(`${hint(nextAction)}\\n`);\n\t} else {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(code, message, nextAction))}\\n`,\n\t\t);\n\t}\n\treturn { exitCode: exitCodeFor(code) };\n}\n\nexport function writeApiError(\n\tdeps: WriterDeps,\n\tdetails: ApiErrorDetails,\n): { exitCode: number } {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stderr(`${error(details.message)}\\n`);\n\t\tconst nextAction = details.requestId\n\t\t\t? `Request ID: ${details.requestId}`\n\t\t\t: undefined;\n\t\tif (nextAction) deps.stderr(`${hint(nextAction)}\\n`);\n\t} else {\n\t\tdeps.stderr(`${JSON.stringify(apiErrorEnvelope(details))}\\n`);\n\t}\n\treturn { exitCode: exitCodeFor(\"api_error\") };\n}\n\nexport function writeApiErrorSimple(\n\tdeps: WriterDeps,\n\tmessage: string,\n): { exitCode: number } {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stderr(`${error(message)}\\n`);\n\t} else {\n\t\tdeps.stderr(`${JSON.stringify(errorEnvelope(\"api_error\", message))}\\n`);\n\t}\n\treturn { exitCode: exitCodeFor(\"api_error\") };\n}\n\nexport function writeAuthError(deps: WriterDeps): { exitCode: number } {\n\treturn writeError(\n\t\tdeps,\n\t\t\"auth_error\",\n\t\t\"No API key found.\",\n\t\t\"Set DROPTHIS_API_KEY or run dropthis login.\",\n\t);\n}\n\nexport function writeEmpty(\n\tdeps: WriterDeps,\n\tmessage: string,\n\tjson: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${message}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify(json)}\\n`);\n\t}\n}\n","import { resolveCredential } from \"../auth.js\";\nimport { writeApiErrorSimple, writeAuthError, writeKv } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype AccountClient = {\n\taccount: { get(): Promise<SdkResult<unknown>> };\n};\n\ntype CommandDeps = {\n\tstore: CredentialStore;\n\tclient: AccountClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runAccountGet(\n\t_input: { json?: boolean },\n\tdeps: CommandDeps,\n): Promise<{ exitCode: number }> {\n\tif (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) === null\n\t) {\n\t\treturn writeAuthError(deps);\n\t}\n\tconst result = await deps.client.account.get();\n\tif (result.error) {\n\t\treturn writeApiErrorSimple(deps, result.error.message);\n\t}\n\tconst data = result.data as Record<string, unknown> | null;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data?.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data?.email) pairs.push([\"Email\", String(data.email)]);\n\tif (data?.plan) pairs.push([\"Plan\", String(data.plan)]);\n\n\twriteKv(deps, pairs, { ok: true, account: result.data });\n\treturn { exitCode: 0 };\n}\n","import * as prompts from \"@clack/prompts\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiErrorSimple,\n\twriteAuthError,\n\twriteEmpty,\n\twriteError,\n\twriteHumanOrJson,\n\twriteJson,\n\twriteKv,\n} from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { success } from \"../ui.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype ApiKeysCreateClient = {\n\tapiKeys: {\n\t\tcreate(input: {\n\t\t\tlabel: string;\n\t\t}): Promise<SdkResult<Record<string, unknown>>>;\n\t};\n};\n\ntype ApiKeysListClient = {\n\tapiKeys: {\n\t\tlist(): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype ApiKeysDeleteClient = {\n\tapiKeys: {\n\t\tdelete(\n\t\t\tkeyId: string,\n\t\t): Promise<SdkResult<null>> | SdkResult<null> | undefined;\n\t};\n};\n\ntype CommandDeps<TClient> = {\n\tstore: CredentialStore;\n\tclient: TClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runApiKeysCreate(\n\tinput: { label: string; json?: boolean },\n\tdeps: CommandDeps<ApiKeysCreateClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.apiKeys.create({ label: input.label });\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst data = result.data;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data.key) pairs.push([\"Key\", String(data.key)]);\n\tif (data.last4) pairs.push([\"Last 4\", String(data.last4)]);\n\twriteKv(deps, pairs, { ok: true, api_key: result.data });\n\treturn { exitCode: 0 };\n}\n\nexport async function runApiKeysList(\n\t_input: { json?: boolean },\n\tdeps: CommandDeps<ApiKeysListClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.apiKeys.list();\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst raw = listItems(result.data);\n\tconst items = Array.isArray(raw)\n\t\t? (raw as Array<Record<string, unknown>>)\n\t\t: undefined;\n\tif (deps.outputMode === \"human\") {\n\t\tif (!items || items.length === 0) {\n\t\t\twriteEmpty(deps, \"No API keys found.\", { ok: true, api_keys: [] });\n\t\t} else {\n\t\t\tfor (const item of items) {\n\t\t\t\tdeps.stdout(\n\t\t\t\t\t`${item.id ?? \"\"} ${item.label ?? \"\"} ...${item.last4 ?? \"\"}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\twriteJson(deps, { ok: true, api_keys: items ?? raw });\n\t}\n\treturn { exitCode: 0 };\n}\n\nexport async function runApiKeysDelete(\n\tkeyId: string,\n\tinput: { yes?: boolean; json?: boolean; interactive?: boolean },\n\tdeps: CommandDeps<ApiKeysDeleteClient>,\n): Promise<{ exitCode: number }> {\n\tif (!input.yes && input.interactive === false) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"Pass --yes to delete in non-interactive mode.\",\n\t\t);\n\t}\n\tif (!input.yes && input.interactive !== false) {\n\t\tconst confirmed = await prompts.confirm({\n\t\t\tmessage: `Delete API key ${keyId}?`,\n\t\t});\n\t\tif (prompts.isCancel(confirmed) || !confirmed) {\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\t}\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.apiKeys.delete(keyId);\n\tif (result?.error) return writeApiErrorSimple(deps, result.error.message);\n\twriteHumanOrJson(deps, success(`Deleted ${keyId}`), {\n\t\tok: true,\n\t\tdeleted: true,\n\t\tid: keyId,\n\t});\n\treturn { exitCode: 0 };\n}\n\nasync function hasCredential(deps: CommandDeps<unknown>): Promise<boolean> {\n\treturn (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) !== null\n\t);\n}\n\nfunction listItems(data: unknown): unknown {\n\tif (data && typeof data === \"object\" && \"data\" in data) {\n\t\treturn (data as { data: unknown }).data;\n\t}\n\tif (data && typeof data === \"object\" && \"apiKeys\" in data) {\n\t\treturn (data as { apiKeys: unknown }).apiKeys;\n\t}\n\treturn data;\n}\n","const COMMANDS = [\n\t{\n\t\tname: \"publish\",\n\t\tdescription: \"Publish an input and return a Dropthis URL.\",\n\t\targuments: [\"input\"],\n\t\toptions: [\"--json\", \"--url\", \"--dry-run\", \"--title\", \"--metadata\"],\n\t\texamples: [\n\t\t\t\"dropthis publish ./site --json\",\n\t\t\t\"dropthis publish ./site --url\",\n\t\t\t\"dropthis publish ./dist --dry-run\",\n\t\t],\n\t},\n\t{\n\t\tname: \"update\",\n\t\tdescription: \"Update an existing drop by id.\",\n\t\targuments: [\"target\", \"input\"],\n\t\toptions: [\"--json\", \"--url\", \"--dry-run\", \"--if-revision\"],\n\t\texamples: [\n\t\t\t\"dropthis update drop_abc ./site --json\",\n\t\t\t\"dropthis update drop_abc --title 'New Title' --dry-run\",\n\t\t],\n\t},\n\t{\n\t\tname: \"deployments list <dropId>\",\n\t\tdescription: \"List deployments for a drop.\",\n\t\targuments: [\"dropId\"],\n\t\toptions: [\"--json\", \"--limit\", \"--cursor\"],\n\t\tauth: \"required\",\n\t\texamples: [\"dropthis deployments list drop_abc --json\"],\n\t},\n\t{\n\t\tname: \"deployments get <dropId> <deploymentId>\",\n\t\tdescription: \"Get deployment details for a drop.\",\n\t\targuments: [\"dropId\", \"deploymentId\"],\n\t\toptions: [\"--json\"],\n\t\tauth: \"required\",\n\t\texamples: [\"dropthis deployments get drop_abc dep_abc --json\"],\n\t},\n\t{\n\t\tname: \"drops\",\n\t\tdescription: \"List, inspect, update, and delete drops.\",\n\t\texamples: [\"dropthis drops list --json\"],\n\t},\n\t{\n\t\tname: \"api-keys\",\n\t\tdescription: \"Create, list, and delete API keys.\",\n\t\texamples: [\"dropthis api-keys create --label CI --json\"],\n\t},\n\t{\n\t\tname: \"login\",\n\t\tdescription: \"Authenticate with email OTP and store an API key.\",\n\t\texamples: [\n\t\t\t\"dropthis login verify --email user@example.com --otp 123456 --json\",\n\t\t],\n\t},\n\t{\n\t\tname: \"logout\",\n\t\tdescription: \"Remove stored local credentials.\",\n\t\texamples: [\"dropthis logout --json\"],\n\t},\n\t{\n\t\tname: \"whoami\",\n\t\tdescription: \"Show current auth source and credential metadata.\",\n\t\texamples: [\"dropthis whoami --json\"],\n\t},\n\t{\n\t\tname: \"account\",\n\t\tdescription: \"Get account details.\",\n\t\texamples: [\"dropthis account get --json\"],\n\t},\n\t{\n\t\tname: \"doctor\",\n\t\tdescription: \"Report local CLI diagnostics.\",\n\t\texamples: [\"dropthis doctor --json\"],\n\t},\n\t{\n\t\tname: \"commands\",\n\t\tdescription: \"Print this machine-readable command tree.\",\n\t\texamples: [\"dropthis commands --json\"],\n\t},\n];\n\nexport async function runCommands(\n\t_input: { json?: boolean },\n\tdeps: { stdout: (value: string) => void },\n): Promise<{ exitCode: number }> {\n\tdeps.stdout(\n\t\t`${JSON.stringify({\n\t\t\tok: true,\n\t\t\toutput: \"JSON by default in CI, pipes, non-TTY, --json, or --quiet.\",\n\t\t\tcommands: COMMANDS,\n\t\t})}\\n`,\n\t);\n\treturn { exitCode: 0 };\n}\n","import { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiError,\n\twriteAuthError,\n\twriteEmpty,\n\twriteJson,\n\twriteKv,\n} from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype ApiError = {\n\tmessage: string;\n\tcode?: string;\n\tstatusCode?: number | null;\n\tdetail?: unknown;\n\tparam?: string | null;\n\trequestId?: string | null;\n};\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| { data: null; error: ApiError; headers?: Record<string, string> };\n\ntype DeploymentsClient = {\n\tdeployments: {\n\t\tlist(\n\t\t\tdropId: string,\n\t\t\tparams?: { limit?: number; cursor?: string },\n\t\t): Promise<SdkResult<unknown>>;\n\t\tget(dropId: string, deploymentId: string): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype Deps = {\n\tstore: CredentialStore;\n\tclient: DeploymentsClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runDeploymentsList(\n\tdropId: string,\n\tinput: { limit?: number; cursor?: string; json?: boolean },\n\tdeps: Deps,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst params = {\n\t\t...(input.limit !== undefined ? { limit: input.limit } : {}),\n\t\t...(input.cursor ? { cursor: input.cursor } : {}),\n\t};\n\tconst result = await deps.client.deployments.list(dropId, params);\n\tif (result.error) {\n\t\treturn writeApiError(deps, result.error);\n\t}\n\tconst spread = spreadData(result.data);\n\tconst items = (spread.deployments ?? spread.data ?? result.data) as\n\t\t| Array<Record<string, unknown>>\n\t\t| undefined;\n\tif (deps.outputMode === \"human\") {\n\t\tif (!items || (Array.isArray(items) && items.length === 0)) {\n\t\t\twriteEmpty(deps, \"No deployments found.\", {\n\t\t\t\tok: true,\n\t\t\t\t...spread,\n\t\t\t});\n\t\t} else if (Array.isArray(items)) {\n\t\t\tfor (const item of items) {\n\t\t\t\tdeps.stdout(\n\t\t\t\t\t`${item.id ?? \"\"} rev ${item.revision ?? \"?\"} ${item.created_at ?? \"\"}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\twriteJson(deps, { ok: true, ...spread });\n\t\t}\n\t} else {\n\t\twriteJson(deps, { ok: true, ...spread });\n\t}\n\treturn { exitCode: 0 };\n}\n\nexport async function runDeploymentsGet(\n\tdropId: string,\n\tdeploymentId: string,\n\t_input: { json?: boolean },\n\tdeps: Deps,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.deployments.get(dropId, deploymentId);\n\tif (result.error) {\n\t\treturn writeApiError(deps, result.error);\n\t}\n\tconst data = result.data as Record<string, unknown>;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data.revision !== undefined)\n\t\tpairs.push([\"Revision\", String(data.revision)]);\n\tif (data.created_at) pairs.push([\"Created\", String(data.created_at)]);\n\twriteKv(deps, pairs, { ok: true, deployment: result.data });\n\treturn { exitCode: 0 };\n}\n\nasync function hasCredential(\n\tdeps: Pick<Deps, \"apiKey\" | \"env\" | \"store\">,\n): Promise<boolean> {\n\treturn (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) !== null\n\t);\n}\n\nfunction spreadData(data: unknown): Record<string, unknown> {\n\treturn data && typeof data === \"object\"\n\t\t? (data as Record<string, unknown>)\n\t\t: { data };\n}\n","import { resolveCredential } from \"../auth.js\";\nimport { writeKv } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype CommandDeps = {\n\tstore: CredentialStore;\n\tclient: unknown;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runDoctor(\n\t_input: { json?: boolean },\n\tdeps: CommandDeps,\n): Promise<{ exitCode: number }> {\n\tconst stored = await deps.store.read();\n\tconst credential = await resolveCredential({\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tconst authSource = credential?.source ?? \"missing\";\n\tconst storageBackend = stored?.storage ?? \"none\";\n\n\tconst pairs: Array<[string, string]> = [\n\t\t[\"Version\", PKG_VERSION],\n\t\t[\"Auth\", authSource],\n\t\t[\"Storage\", storageBackend],\n\t];\n\n\twriteKv(deps, pairs, {\n\t\tok: true,\n\t\tversion: PKG_VERSION,\n\t\tauth: { source: authSource },\n\t\tstorage: { backend: storageBackend },\n\t});\n\treturn { exitCode: 0 };\n}\n","import * as prompts from \"@clack/prompts\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiErrorSimple,\n\twriteAuthError,\n\twriteEmpty,\n\twriteError,\n\twriteHumanOrJson,\n\twriteJson,\n\twriteKv,\n} from \"../fmt.js\";\nimport { parseDropOptions, type RawDropOptions } from \"../options.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { url as fmtUrl, success } from \"../ui.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype DropsListClient = {\n\tdrops: {\n\t\tlist(params: {\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t}): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype DropsGetClient = {\n\tdrops: {\n\t\tget(dropId: string): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype DropsUpdateClient = {\n\tdrops: {\n\t\tupdate(\n\t\t\tdropId: string,\n\t\t\tinput: Record<string, unknown>,\n\t\t): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype DropsDeleteClient = {\n\tdrops: {\n\t\tdelete(\n\t\t\tdropId: string,\n\t\t): Promise<SdkResult<null>> | SdkResult<null> | undefined;\n\t};\n};\n\ntype CommandDeps<TClient> = {\n\tstore: CredentialStore;\n\tclient: TClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runDropsList(\n\tinput: { limit?: number; cursor?: string; json?: boolean },\n\tdeps: CommandDeps<DropsListClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst params = {\n\t\t...(input.limit !== undefined ? { limit: input.limit } : {}),\n\t\t...(input.cursor ? { cursor: input.cursor } : {}),\n\t};\n\tconst result = await deps.client.drops.list(params);\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst raw = listItems(result.data);\n\tconst items = Array.isArray(raw)\n\t\t? (raw as Array<Record<string, unknown>>)\n\t\t: undefined;\n\tif (deps.outputMode === \"human\") {\n\t\tif (!items || items.length === 0) {\n\t\t\twriteEmpty(deps, \"No drops found.\", { ok: true, drops: [] });\n\t\t} else {\n\t\t\tfor (const item of items) {\n\t\t\t\tdeps.stdout(\n\t\t\t\t\t`${item.id ?? \"\"} ${item.title ?? \"\"} ${item.url ? fmtUrl(String(item.url)) : \"\"}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\twriteJson(deps, { ok: true, drops: items ?? raw });\n\t}\n\treturn { exitCode: 0 };\n}\n\nexport async function runDropsGet(\n\tdropId: string,\n\t_input: { json?: boolean },\n\tdeps: CommandDeps<DropsGetClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.drops.get(dropId);\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst data = result.data as Record<string, unknown>;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data.url) pairs.push([\"URL\", fmtUrl(String(data.url))]);\n\tif (data.title) pairs.push([\"Title\", String(data.title)]);\n\tif (data.visibility) pairs.push([\"Visibility\", String(data.visibility)]);\n\tif (data.revision !== undefined)\n\t\tpairs.push([\"Revision\", String(data.revision)]);\n\tif (data.created_at) pairs.push([\"Created\", String(data.created_at)]);\n\twriteKv(deps, pairs, { ok: true, drop: result.data });\n\treturn { exitCode: 0 };\n}\n\nexport async function runDropsUpdate(\n\tdropId: string,\n\tinput: RawDropOptions & { json?: boolean },\n\tdeps: CommandDeps<DropsUpdateClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\ttry {\n\t\tconst options = await parseDropOptions(input);\n\t\tconst result = await deps.client.drops.update(dropId, options);\n\t\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\t\twriteHumanOrJson(deps, success(`Updated ${dropId}`), {\n\t\t\tok: true,\n\t\t\tdrop: result.data,\n\t\t});\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\terror instanceof Error ? error.message : \"Invalid drop options.\",\n\t\t);\n\t}\n}\n\nexport async function runDropsDelete(\n\tdropId: string,\n\tinput: { yes?: boolean; json?: boolean; interactive?: boolean },\n\tdeps: CommandDeps<DropsDeleteClient>,\n): Promise<{ exitCode: number }> {\n\tif (!input.yes && input.interactive === false) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"Pass --yes to delete in non-interactive mode.\",\n\t\t);\n\t}\n\tif (!input.yes && input.interactive !== false) {\n\t\tconst confirmed = await prompts.confirm({\n\t\t\tmessage: `Delete ${dropId}?`,\n\t\t});\n\t\tif (prompts.isCancel(confirmed) || !confirmed) {\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\t}\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.drops.delete(dropId);\n\tif (result?.error) return writeApiErrorSimple(deps, result.error.message);\n\twriteHumanOrJson(deps, success(`Deleted ${dropId}`), {\n\t\tok: true,\n\t\tdeleted: true,\n\t\tid: dropId,\n\t});\n\treturn { exitCode: 0 };\n}\n\nasync function hasCredential(deps: CommandDeps<unknown>): Promise<boolean> {\n\treturn (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) !== null\n\t);\n}\n\nfunction listItems(data: unknown): unknown {\n\tif (data && typeof data === \"object\" && \"data\" in data) {\n\t\treturn (data as { data: unknown }).data;\n\t}\n\tif (data && typeof data === \"object\" && \"drops\" in data) {\n\t\treturn (data as { drops: unknown }).drops;\n\t}\n\treturn data;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport type RawDropOptions = {\n\tslug?: string;\n\ttitle?: string;\n\tvisibility?: \"public\" | \"unlisted\";\n\tpassword?: string;\n\tnoPassword?: boolean;\n\tnoindex?: boolean;\n\tindex?: boolean;\n\texpiresAt?: string;\n\tmetadata?: string;\n\tmetadataFile?: string;\n\tentry?: string;\n\tcontentType?: string;\n\tpath?: string;\n\tidempotencyKey?: string;\n};\n\nexport type ParsedDropOptions = {\n\tslug?: string;\n\ttitle?: string;\n\tvisibility?: \"public\" | \"unlisted\";\n\tpassword?: string | null;\n\tnoindex?: boolean;\n\texpiresAt?: string;\n\tmetadata?: Record<string, unknown>;\n\tentry?: string;\n\tcontentType?: string;\n\tpath?: string;\n\tidempotencyKey?: string;\n};\n\nexport async function parseDropOptions(\n\traw: RawDropOptions,\n): Promise<ParsedDropOptions> {\n\tif (raw.metadata && raw.metadataFile) {\n\t\tthrow new Error(\"Use either --metadata or --metadata-file, not both.\");\n\t}\n\tif (raw.password && raw.noPassword) {\n\t\tthrow new Error(\"Use either --password or --no-password, not both.\");\n\t}\n\tif (raw.noindex && raw.index) {\n\t\tthrow new Error(\"Use either --noindex or --index, not both.\");\n\t}\n\tconst metadata = raw.metadata\n\t\t? parseJsonObject(raw.metadata, \"--metadata\")\n\t\t: raw.metadataFile\n\t\t\t? parseJsonObject(\n\t\t\t\t\tawait readFile(raw.metadataFile, \"utf8\"),\n\t\t\t\t\t\"--metadata-file\",\n\t\t\t\t)\n\t\t\t: undefined;\n\treturn {\n\t\t...(raw.slug ? { slug: raw.slug } : {}),\n\t\t...(raw.title ? { title: raw.title } : {}),\n\t\t...(raw.visibility ? { visibility: raw.visibility } : {}),\n\t\t...(raw.password ? { password: raw.password } : {}),\n\t\t...(raw.noPassword ? { password: null } : {}),\n\t\t...(raw.noindex ? { noindex: true } : {}),\n\t\t...(raw.index ? { noindex: false } : {}),\n\t\t...(raw.expiresAt ? { expiresAt: raw.expiresAt } : {}),\n\t\t...(metadata ? { metadata } : {}),\n\t\t...(raw.entry ? { entry: raw.entry } : {}),\n\t\t...(raw.contentType ? { contentType: raw.contentType } : {}),\n\t\t...(raw.path ? { path: raw.path } : {}),\n\t\t...(raw.idempotencyKey ? { idempotencyKey: raw.idempotencyKey } : {}),\n\t};\n}\n\nfunction parseJsonObject(\n\tvalue: string,\n\tlabel: string,\n): Record<string, unknown> {\n\tconst parsed = JSON.parse(value) as unknown;\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`${label} must be a JSON object.`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n","import * as prompts from \"@clack/prompts\";\nimport { errorEnvelope, exitCodeFor } from \"../output.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype OtpRequestData = {\n\tok: true;\n\texpiresIn: number;\n};\n\ntype SessionData = {\n\ttoken: string;\n\taccountId: string;\n\tisNewAccount: boolean;\n};\n\ntype ApiKeyData = {\n\tid: string;\n\tkey: string;\n\tkeyLast4: string;\n\taccountId?: string | null;\n\tisNewAccount?: boolean;\n};\n\ntype LoginRequestClient = {\n\tauth: {\n\t\trequestEmailOtp(input: {\n\t\t\temail: string;\n\t\t}): Promise<SdkResult<OtpRequestData>>;\n\t};\n};\n\ntype LoginClient = {\n\tauth: {\n\t\tverifyEmailOtp(input: {\n\t\t\temail: string;\n\t\t\tcode: string;\n\t\t}): Promise<SdkResult<SessionData>>;\n\t};\n\tapiKeys: {\n\t\tcreate(input: { label: string }): Promise<SdkResult<ApiKeyData>>;\n\t};\n};\n\ntype LoginInteractiveClient = LoginRequestClient & LoginClient;\n\nexport async function runLoginInteractive(deps: {\n\tclient: LoginInteractiveClient;\n\tcreateClient: (apiKey: string) => LoginInteractiveClient;\n\tstore: CredentialStore;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n}): Promise<{ exitCode: number }> {\n\tprompts.intro(\"dropthis login\");\n\n\tconst email = await prompts.text({\n\t\tmessage: \"Email address\",\n\t\tvalidate: (v) => (v?.includes(\"@\") ? undefined : \"Enter a valid email\"),\n\t});\n\tif (prompts.isCancel(email)) {\n\t\tprompts.cancel(\"Login cancelled.\");\n\t\treturn { exitCode: 0 };\n\t}\n\n\tconst requestResult = await deps.client.auth.requestEmailOtp({ email });\n\tif (requestResult.error) {\n\t\tprompts.cancel(requestResult.error.message);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\n\tconst otp = await prompts.text({\n\t\tmessage: \"Paste the code from your email\",\n\t});\n\tif (prompts.isCancel(otp)) {\n\t\tprompts.cancel(\"Login cancelled.\");\n\t\treturn { exitCode: 0 };\n\t}\n\n\tconst session = await deps.client.auth.verifyEmailOtp({ email, code: otp });\n\tif (session.error) {\n\t\tprompts.cancel(session.error.message);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\n\tconst authedClient = deps.createClient(session.data.token);\n\tconst apiKey = await authedClient.apiKeys.create({ label: \"CLI\" });\n\tif (apiKey.error) {\n\t\tprompts.cancel(apiKey.error.message);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\n\tawait deps.store.save({\n\t\tapiKey: apiKey.data.key,\n\t\tkeyId: apiKey.data.id,\n\t\tkeyLast4: apiKey.data.keyLast4,\n\t\taccountId: apiKey.data.accountId ?? session.data.accountId,\n\t\temail,\n\t\tstorage: \"secure\",\n\t});\n\n\tprompts.outro(\"Logged in successfully.\");\n\treturn { exitCode: 0 };\n}\n\nexport async function runLoginRequest(\n\tinput: { email: string; json?: boolean },\n\tdeps: {\n\t\tclient: LoginRequestClient;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t},\n): Promise<{ exitCode: number }> {\n\tconst result = await deps.client.auth.requestEmailOtp({\n\t\temail: input.email,\n\t});\n\tif (result.error) {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(\"api_error\", result.error.message))}\\n`,\n\t\t);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\tdeps.stdout(\n\t\t`${JSON.stringify({\n\t\t\tok: true,\n\t\t\temail: input.email,\n\t\t\texpires_in: result.data.expiresIn,\n\t\t})}\\n`,\n\t);\n\treturn { exitCode: 0 };\n}\n\nexport async function runLoginVerify(\n\tinput: { email: string; otp: string; json?: boolean },\n\tdeps: {\n\t\tclient: LoginClient;\n\t\tcreateClient: (apiKey: string) => LoginClient;\n\t\tstore: CredentialStore;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t},\n): Promise<{ exitCode: number }> {\n\tconst session = await deps.client.auth.verifyEmailOtp({\n\t\temail: input.email,\n\t\tcode: input.otp,\n\t});\n\tif (session.error) {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(\"api_error\", session.error.message))}\\n`,\n\t\t);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\tconst authedClient = deps.createClient(session.data.token);\n\tconst apiKey = await authedClient.apiKeys.create({ label: \"CLI\" });\n\tif (apiKey.error) {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(\"api_error\", apiKey.error.message))}\\n`,\n\t\t);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\tawait deps.store.save({\n\t\tapiKey: apiKey.data.key,\n\t\tkeyId: apiKey.data.id,\n\t\tkeyLast4: apiKey.data.keyLast4,\n\t\taccountId: apiKey.data.accountId ?? session.data.accountId,\n\t\temail: input.email,\n\t\tstorage: \"secure\",\n\t});\n\tdeps.stdout(\n\t\t`${JSON.stringify({\n\t\t\tok: true,\n\t\t\taccount_id: apiKey.data.accountId ?? session.data.accountId,\n\t\t\tkey_id: apiKey.data.id,\n\t\t\tkey_last4: apiKey.data.keyLast4,\n\t\t\tis_new_account: apiKey.data.isNewAccount ?? session.data.isNewAccount,\n\t\t})}\\n`,\n\t);\n\treturn { exitCode: 0 };\n}\n","import { writeApiErrorSimple, writeHumanOrJson } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { success } from \"../ui.js\";\n\ntype DeleteResult =\n\t| { data: null; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype LogoutClient = {\n\tapiKeys: {\n\t\tdelete(\n\t\t\tkeyId: string,\n\t\t): DeleteResult | Promise<DeleteResult> | undefined | Promise<undefined>;\n\t};\n};\n\nexport async function runLogout(\n\tinput: { json?: boolean; revoke?: boolean },\n\tdeps: {\n\t\tstore: CredentialStore;\n\t\tclient: LogoutClient;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t\toutputMode?: \"human\" | \"json\";\n\t},\n): Promise<{ exitCode: number }> {\n\tconst stored = await deps.store.read();\n\tlet revokeError: string | undefined;\n\tif (input.revoke && stored?.keyId) {\n\t\tconst result = await deps.client.apiKeys.delete(stored.keyId);\n\t\tif (result?.error) revokeError = result.error.message;\n\t}\n\tif (revokeError) {\n\t\treturn writeApiErrorSimple(deps, revokeError);\n\t}\n\tawait deps.store.clear();\n\twriteHumanOrJson(deps, success(\"Logged out.\"), { ok: true });\n\treturn { exitCode: 0 };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { stat } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiError,\n\twriteAuthError,\n\twriteError,\n\twriteResult,\n} from \"../fmt.js\";\nimport {\n\ttype ParsedDropOptions,\n\tparseDropOptions,\n\ttype RawDropOptions,\n} from \"../options.js\";\nimport type { ApiErrorDetails } from \"../output.js\";\nimport { createSpinner, shouldSpin } from \"../spinner.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { readJsonObjectFile } from \"./json_body.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: ApiErrorDetails;\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype DropData = { url: string; [key: string]: unknown };\n\ntype ManifestFile = {\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n};\n\ntype PreparedResult = {\n\tkind: \"staged\";\n\tmanifest: { files: ManifestFile[]; entry?: string | null };\n\toptions: Record<string, unknown>;\n\tmetadata?: Record<string, unknown>;\n};\n\ntype PublishClient = {\n\tpublish(\n\t\tinput: string,\n\t\toptions: ParsedDropOptions,\n\t): Promise<SdkResult<DropData>>;\n\tprepare?(input: string, options: ParsedDropOptions): Promise<PreparedResult>;\n\tdrops: {\n\t\tcreateRaw(\n\t\t\tbody: unknown,\n\t\t\toptions?: { idempotencyKey?: string },\n\t\t): Promise<SdkResult<DropData>>;\n\t};\n};\n\ntype PublishOptions = RawDropOptions & {\n\tdryRun?: boolean;\n\tfromJson?: string;\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tapiKey?: string;\n};\n\ntype PublishDeps = {\n\tstore: CredentialStore;\n\tclient: PublishClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\treadJsonObject?: (path: string) => Promise<Record<string, unknown>>;\n\toutputMode?: \"human\" | \"json\";\n};\n\nconst MAX_BUNDLE_FILE_COUNT = 200;\n\nexport async function runPublish(\n\tinput: string | string[] | undefined,\n\traw: PublishOptions,\n\tdeps: PublishDeps,\n): Promise<{ exitCode: number }> {\n\tconst credential = await resolveCredential({\n\t\t...((raw.apiKey ?? deps.apiKey)\n\t\t\t? { apiKey: raw.apiKey ?? deps.apiKey }\n\t\t\t: {}),\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tif (!credential) {\n\t\treturn writeAuthError(deps);\n\t}\n\n\tif (raw.dryRun) {\n\t\treturn handlePublishDryRun(input, raw, deps);\n\t}\n\n\tconst singleInput = Array.isArray(input) ? input[0] : input;\n\tconst spin = shouldSpin(deps.outputMode)\n\t\t? createSpinner(\"Publishing…\", deps.stderr)\n\t\t: undefined;\n\ttry {\n\t\tif (raw.fromJson && singleInput) {\n\t\t\tthrow new Error(\"Use either <input> or --from-json, not both.\");\n\t\t}\n\t\tconst options = withPublishIdempotency(await parseDropOptions(raw));\n\t\tconst result = raw.fromJson\n\t\t\t? await deps.client.drops.createRaw(\n\t\t\t\t\tawait (deps.readJsonObject ?? readJsonObjectFile)(raw.fromJson),\n\t\t\t\t\toptions.idempotencyKey\n\t\t\t\t\t\t? { idempotencyKey: options.idempotencyKey }\n\t\t\t\t\t\t: {},\n\t\t\t\t)\n\t\t\t: singleInput\n\t\t\t\t? await deps.client.publish(singleInput, options)\n\t\t\t\t: (() => {\n\t\t\t\t\t\tthrow new Error(\"Publish requires <input> or --from-json.\");\n\t\t\t\t\t})();\n\t\tif (result.error) {\n\t\t\tspin?.fail();\n\t\t\treturn writeApiError(deps, result.error);\n\t\t}\n\t\tspin?.stop();\n\t\tif (raw.url) deps.stdout(`${result.data.url}\\n`);\n\t\telse writeResult(deps, result.data.url, \"Published\", result.data);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Publish failed.\";\n\t\tspin?.fail();\n\t\treturn writeError(deps, \"invalid_usage\", message);\n\t}\n}\n\nasync function handlePublishDryRun(\n\tinput: string | string[] | undefined,\n\traw: PublishOptions,\n\tdeps: PublishDeps,\n): Promise<{ exitCode: number }> {\n\tif (raw.url) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"--url and --dry-run cannot be combined.\",\n\t\t\t\"Remove --url; dry-run outputs JSON describing what would be published.\",\n\t\t);\n\t}\n\ttry {\n\t\tif (raw.fromJson) {\n\t\t\tif (input)\n\t\t\t\tthrow new Error(\"Use either <input> or --from-json, not both.\");\n\t\t\tconst body = await (deps.readJsonObject ?? readJsonObjectFile)(\n\t\t\t\traw.fromJson,\n\t\t\t);\n\t\t\tdeps.stdout(\n\t\t\t\t`${JSON.stringify({ dryRun: true, kind: \"raw_json\", endpoint: \"POST /drops\", body }, null, 2)}\\n`,\n\t\t\t);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tif (!input || (Array.isArray(input) && input.length === 0)) {\n\t\t\tthrow new Error(\"Publish requires <input> or --from-json.\");\n\t\t}\n\n\t\tconst options = await parseDropOptions(raw);\n\n\t\tif (Array.isArray(input)) {\n\t\t\treturn dryRunMultiFile(input, options, deps);\n\t\t}\n\n\t\tif (!deps.client.prepare) {\n\t\t\tthrow new Error(\"Client does not support dry-run.\");\n\t\t}\n\t\tconst prepared = await deps.client.prepare(input, options);\n\t\tconst output = formatDryRunOutput(prepared);\n\t\tvalidateDryRunOutput(output);\n\t\tdeps.stdout(`${JSON.stringify(output, null, 2)}\\n`);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst code = isFileSystemError(error)\n\t\t\t? \"local_input_error\"\n\t\t\t: \"invalid_usage\";\n\t\tconst message = error instanceof Error ? error.message : \"Dry-run failed.\";\n\t\treturn writeError(deps, code, message);\n\t}\n}\n\nasync function dryRunMultiFile(\n\tinputs: string[],\n\toptions: ParsedDropOptions,\n\tdeps: PublishDeps,\n): Promise<{ exitCode: number }> {\n\tconst files: ManifestFile[] = [];\n\tfor (const filePath of inputs) {\n\t\tlet info: Awaited<ReturnType<typeof stat>>;\n\t\ttry {\n\t\t\tinfo = await stat(filePath);\n\t\t} catch {\n\t\t\treturn writeError(\n\t\t\t\tdeps,\n\t\t\t\t\"local_input_error\",\n\t\t\t\t`File not found: ${filePath}`,\n\t\t\t);\n\t\t}\n\t\tif (info.isDirectory()) {\n\t\t\treturn writeError(\n\t\t\t\tdeps,\n\t\t\t\t\"local_input_error\",\n\t\t\t\t`Cannot mix directories with multiple file arguments. Use a single folder instead: dropthis publish ${filePath}`,\n\t\t\t);\n\t\t}\n\t\tfiles.push({\n\t\t\tpath: basename(filePath),\n\t\t\tcontentType: mimeForPath(filePath),\n\t\t\tsizeBytes: info.size,\n\t\t});\n\t}\n\n\tif (files.length > MAX_BUNDLE_FILE_COUNT) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"local_input_error\",\n\t\t\t`Bundle contains ${files.length} files, exceeding the maximum of ${MAX_BUNDLE_FILE_COUNT}.`,\n\t\t);\n\t}\n\n\tconst entry =\n\t\toptions.entry ??\n\t\tfiles.find((f) => f.path === \"index.html\")?.path ??\n\t\tfiles[0]?.path ??\n\t\tnull;\n\tconst totalBytes = files.reduce((sum, f) => sum + f.sizeBytes, 0);\n\tconst output = {\n\t\tdryRun: true as const,\n\t\tkind: \"staged\" as const,\n\t\tmanifest: { files, entry },\n\t\toptions: dryRunOptionsBody(options),\n\t\ttotalBytes,\n\t};\n\n\tdeps.stdout(`${JSON.stringify(output, null, 2)}\\n`);\n\treturn { exitCode: 0 };\n}\n\nfunction formatDryRunOutput(prepared: PreparedResult): Record<string, unknown> {\n\tconst totalBytes = prepared.manifest.files.reduce(\n\t\t(sum, f) => sum + f.sizeBytes,\n\t\t0,\n\t);\n\treturn {\n\t\tdryRun: true,\n\t\tkind: \"staged\",\n\t\tmanifest: {\n\t\t\tfiles: prepared.manifest.files,\n\t\t\tentry: prepared.manifest.entry ?? null,\n\t\t},\n\t\toptions: prepared.options,\n\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\ttotalBytes,\n\t};\n}\n\nfunction validateDryRunOutput(output: Record<string, unknown>): void {\n\tif (output.kind !== \"staged\") return;\n\tconst manifest = output.manifest as {\n\t\tfiles: ManifestFile[];\n\t};\n\tif (manifest.files.length > MAX_BUNDLE_FILE_COUNT) {\n\t\tthrow Object.assign(\n\t\t\tnew Error(\n\t\t\t\t`Bundle contains ${manifest.files.length} files, exceeding the maximum of ${MAX_BUNDLE_FILE_COUNT}.`,\n\t\t\t),\n\t\t\t{ code: \"ELIMIT\" },\n\t\t);\n\t}\n}\n\nfunction dryRunOptionsBody(\n\toptions: ParsedDropOptions,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\tif (options.title) result.title = options.title;\n\tif (options.visibility) result.visibility = options.visibility;\n\tif (options.password !== undefined) result.password = options.password;\n\tif (options.noindex !== undefined) result.noindex = options.noindex;\n\tif (options.expiresAt) result.expires_at = options.expiresAt;\n\treturn result;\n}\n\nfunction mimeForPath(filePath: string): string {\n\tconst ext = extname(filePath).toLowerCase();\n\tconst types: Record<string, string> = {\n\t\t\".html\": \"text/html\",\n\t\t\".htm\": \"text/html\",\n\t\t\".css\": \"text/css\",\n\t\t\".js\": \"text/javascript\",\n\t\t\".mjs\": \"text/javascript\",\n\t\t\".json\": \"application/json\",\n\t\t\".xml\": \"application/xml\",\n\t\t\".svg\": \"image/svg+xml\",\n\t\t\".txt\": \"text/plain\",\n\t\t\".md\": \"text/markdown\",\n\t\t\".jpg\": \"image/jpeg\",\n\t\t\".jpeg\": \"image/jpeg\",\n\t\t\".png\": \"image/png\",\n\t\t\".gif\": \"image/gif\",\n\t\t\".webp\": \"image/webp\",\n\t\t\".ico\": \"image/x-icon\",\n\t\t\".avif\": \"image/avif\",\n\t\t\".pdf\": \"application/pdf\",\n\t\t\".zip\": \"application/zip\",\n\t\t\".woff\": \"font/woff\",\n\t\t\".woff2\": \"font/woff2\",\n\t\t\".ttf\": \"font/ttf\",\n\t\t\".mp4\": \"video/mp4\",\n\t\t\".webm\": \"video/webm\",\n\t};\n\treturn types[ext] ?? \"application/octet-stream\";\n}\n\nfunction isFileSystemError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn code === \"ENOENT\" || code === \"ENOTDIR\" || code === \"ELIMIT\";\n}\n\nfunction withPublishIdempotency(options: ParsedDropOptions): ParsedDropOptions {\n\treturn options.idempotencyKey\n\t\t? options\n\t\t: { ...options, idempotencyKey: `cli_pub_${randomUUID()}` };\n}\n","import pc from \"picocolors\";\nimport { symbols } from \"./ui.js\";\n\nconst frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nexport type Spinner = {\n\tstop(): void;\n\tfail(): void;\n};\n\nexport function createSpinner(\n\tmessage: string,\n\tstderr: (value: string) => void,\n): Spinner {\n\tlet i = 0;\n\tconst timer = setInterval(() => {\n\t\tstderr(`\\r\\x1B[2K${pc.cyan(frames[i % frames.length])} ${message}`);\n\t\ti++;\n\t}, 80);\n\n\treturn {\n\t\tstop() {\n\t\t\tclearInterval(timer);\n\t\t\tstderr(\"\\r\\x1B[2K\");\n\t\t},\n\t\tfail() {\n\t\t\tclearInterval(timer);\n\t\t\tstderr(\"\\r\\x1B[2K\");\n\t\t},\n\t};\n}\n\nexport function shouldSpin(outputMode?: \"human\" | \"json\"): boolean {\n\treturn (\n\t\toutputMode === \"human\" && process.stderr.isTTY === true && !process.env.CI\n\t);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport async function readJsonObjectFile(\n\tpath: string,\n): Promise<Record<string, unknown>> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(await readFile(path, \"utf8\"));\n\t} catch (error) {\n\t\tconst message =\n\t\t\terror instanceof Error ? error.message : \"Unknown parse error\";\n\t\tthrow new Error(`Invalid JSON body in ${path}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(\"JSON body must be an object.\");\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiError,\n\twriteAuthError,\n\twriteError,\n\twriteResult,\n} from \"../fmt.js\";\nimport {\n\ttype ParsedDropOptions,\n\tparseDropOptions,\n\ttype RawDropOptions,\n} from \"../options.js\";\nimport type { ApiErrorDetails } from \"../output.js\";\nimport { createSpinner, shouldSpin } from \"../spinner.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { readJsonObjectFile } from \"./json_body.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| { data: null; error: ApiErrorDetails; headers?: Record<string, string> };\n\ntype DropData = { url: string; [key: string]: unknown };\ntype UpdateOptions = ParsedDropOptions & { ifRevision?: number };\n\ntype ManifestFile = {\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n};\n\ntype PreparedResult = {\n\tkind: \"staged\";\n\tmanifest: { files: ManifestFile[]; entry?: string | null };\n\toptions: Record<string, unknown>;\n\tmetadata?: Record<string, unknown>;\n};\n\ntype UpdateClient = {\n\tupdate(\n\t\ttarget: string,\n\t\tinputOrOptions: string | UpdateOptions,\n\t\toptions?: UpdateOptions,\n\t): Promise<SdkResult<DropData>>;\n\tprepare?(input: string, options: ParsedDropOptions): Promise<PreparedResult>;\n\tdeployments: {\n\t\tcreateRaw(\n\t\t\tdropId: string,\n\t\t\tbody: unknown,\n\t\t\toptions?: { idempotencyKey?: string; ifRevision?: number },\n\t\t): Promise<SdkResult<DropData>>;\n\t};\n};\n\ntype RawUpdateOptions = RawDropOptions & {\n\tdryRun?: boolean;\n\tifRevision?: number;\n\tfromJson?: string;\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tapiKey?: string;\n};\n\ntype UpdateDeps = {\n\tstore: CredentialStore;\n\tclient: UpdateClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\treadJsonObject?: (path: string) => Promise<Record<string, unknown>>;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runUpdate(\n\ttarget: string,\n\tinput: string | undefined,\n\traw: RawUpdateOptions,\n\tdeps: UpdateDeps,\n): Promise<{ exitCode: number }> {\n\tconst credential = await resolveCredential({\n\t\t...((raw.apiKey ?? deps.apiKey)\n\t\t\t? { apiKey: raw.apiKey ?? deps.apiKey }\n\t\t\t: {}),\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tif (!credential) {\n\t\treturn writeAuthError(deps);\n\t}\n\n\tif (raw.dryRun) {\n\t\treturn handleUpdateDryRun(target, input, raw, deps);\n\t}\n\n\tconst spin = shouldSpin(deps.outputMode)\n\t\t? createSpinner(\"Updating…\", deps.stderr)\n\t\t: undefined;\n\ttry {\n\t\tassertDropId(target);\n\t\tif (raw.fromJson && input) {\n\t\t\tthrow new Error(\"Use either [input] or --from-json, not both.\");\n\t\t}\n\t\tconst parsed = await parseDropOptions(raw);\n\t\tconst revisionOptions =\n\t\t\traw.ifRevision !== undefined\n\t\t\t\t? { ifRevision: Number(raw.ifRevision) }\n\t\t\t\t: {};\n\t\tconst result = raw.fromJson\n\t\t\t? await deps.client.deployments.createRaw(\n\t\t\t\t\ttarget,\n\t\t\t\t\tawait (deps.readJsonObject ?? readJsonObjectFile)(raw.fromJson),\n\t\t\t\t\twithUpdateIdempotency({\n\t\t\t\t\t\t...revisionOptions,\n\t\t\t\t\t\t...(parsed.idempotencyKey\n\t\t\t\t\t\t\t? { idempotencyKey: parsed.idempotencyKey }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: input\n\t\t\t\t? await deps.client.update(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\twithUpdateIdempotency({\n\t\t\t\t\t\t\t...parsed,\n\t\t\t\t\t\t\t...revisionOptions,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t: await deps.client.update(target, parsed, revisionOptions);\n\t\tif (result.error) {\n\t\t\tspin?.fail();\n\t\t\treturn writeApiError(deps, result.error);\n\t\t}\n\t\tspin?.stop();\n\t\tif (raw.url) deps.stdout(`${result.data.url}\\n`);\n\t\telse writeResult(deps, result.data.url, \"Updated\", result.data);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Update failed.\";\n\t\tspin?.fail();\n\t\treturn writeError(deps, \"invalid_usage\", message);\n\t}\n}\n\nasync function handleUpdateDryRun(\n\ttarget: string,\n\tinput: string | undefined,\n\traw: RawUpdateOptions,\n\tdeps: UpdateDeps,\n): Promise<{ exitCode: number }> {\n\tif (raw.url) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"--url and --dry-run cannot be combined.\",\n\t\t\t\"Remove --url; dry-run outputs JSON describing what would be published.\",\n\t\t);\n\t}\n\ttry {\n\t\tassertDropId(target);\n\n\t\tif (raw.fromJson) {\n\t\t\tif (input)\n\t\t\t\tthrow new Error(\"Use either [input] or --from-json, not both.\");\n\t\t\tconst body = await (deps.readJsonObject ?? readJsonObjectFile)(\n\t\t\t\traw.fromJson,\n\t\t\t);\n\t\t\tdeps.stdout(\n\t\t\t\t`${JSON.stringify({ dryRun: true, kind: \"raw_json\", endpoint: `POST /drops/${target}/deployments`, body }, null, 2)}\\n`,\n\t\t\t);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tconst options = await parseDropOptions(raw);\n\n\t\tif (!input) {\n\t\t\tconst fields: Record<string, unknown> = {};\n\t\t\tif (options.slug) fields.slug = options.slug;\n\t\t\tif (options.title) fields.title = options.title;\n\t\t\tif (options.visibility) fields.visibility = options.visibility;\n\t\t\tif (options.password !== undefined) fields.password = options.password;\n\t\t\tif (options.noindex !== undefined) fields.noindex = options.noindex;\n\t\t\tif (options.expiresAt) fields.expires_at = options.expiresAt;\n\t\t\tif (options.metadata) fields.metadata = options.metadata;\n\t\t\tdeps.stdout(\n\t\t\t\t`${JSON.stringify({ dryRun: true, kind: \"options_update\", target, fields }, null, 2)}\\n`,\n\t\t\t);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tif (!deps.client.prepare) {\n\t\t\tthrow new Error(\"Client does not support dry-run.\");\n\t\t}\n\t\tconst prepared = await deps.client.prepare(input, options);\n\t\tconst output = formatUpdateDryRun(target, prepared);\n\t\tvalidateDryRunFileCount(output);\n\t\tdeps.stdout(`${JSON.stringify(output, null, 2)}\\n`);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst code = isFileSystemError(error)\n\t\t\t? \"local_input_error\"\n\t\t\t: \"invalid_usage\";\n\t\tconst message = error instanceof Error ? error.message : \"Dry-run failed.\";\n\t\treturn writeError(deps, code, message);\n\t}\n}\n\nconst MAX_BUNDLE_FILE_COUNT = 200;\n\nfunction formatUpdateDryRun(\n\ttarget: string,\n\tprepared: PreparedResult,\n): Record<string, unknown> {\n\tconst totalBytes = prepared.manifest.files.reduce(\n\t\t(sum, f) => sum + f.sizeBytes,\n\t\t0,\n\t);\n\treturn {\n\t\tdryRun: true,\n\t\tkind: \"staged\",\n\t\ttarget,\n\t\tmanifest: {\n\t\t\tfiles: prepared.manifest.files,\n\t\t\tentry: prepared.manifest.entry ?? null,\n\t\t},\n\t\toptions: prepared.options,\n\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\ttotalBytes,\n\t};\n}\n\nfunction validateDryRunFileCount(output: Record<string, unknown>): void {\n\tif (output.kind !== \"staged\") return;\n\tconst manifest = output.manifest as { files: ManifestFile[] };\n\tif (manifest.files.length > MAX_BUNDLE_FILE_COUNT) {\n\t\tthrow Object.assign(\n\t\t\tnew Error(\n\t\t\t\t`Bundle contains ${manifest.files.length} files, exceeding the maximum of ${MAX_BUNDLE_FILE_COUNT}.`,\n\t\t\t),\n\t\t\t{ code: \"ELIMIT\" },\n\t\t);\n\t}\n}\n\nfunction isFileSystemError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn code === \"ENOENT\" || code === \"ENOTDIR\";\n}\n\nfunction withUpdateIdempotency(options: UpdateOptions): UpdateOptions {\n\treturn options.idempotencyKey\n\t\t? options\n\t\t: { ...options, idempotencyKey: `cli_upd_${randomUUID()}` };\n}\n\nfunction assertDropId(target: string): void {\n\tif (!target.startsWith(\"drop_\")) {\n\t\tthrow new Error(\n\t\t\t\"Update target must be a drop id returned by --json output, for example drop_...\",\n\t\t);\n\t}\n}\n","import { maskKey, resolveCredential } from \"../auth.js\";\nimport { writeHumanOrJson, writeKv } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\nexport async function runWhoami(\n\t_input: { json?: boolean },\n\tdeps: {\n\t\tstore: CredentialStore;\n\t\tenv: Record<string, string | undefined>;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t\toutputMode?: \"human\" | \"json\";\n\t},\n): Promise<{ exitCode: number }> {\n\tconst credential = await resolveCredential({\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tif (!credential) {\n\t\twriteHumanOrJson(deps, \"Not authenticated. Run dropthis login.\", {\n\t\t\tok: true,\n\t\t\tauthenticated: false,\n\t\t});\n\t\treturn { exitCode: 0 };\n\t}\n\tconst masked = maskKey(credential.apiKey);\n\tconst pairs: Array<[string, string]> = [];\n\tif (credential.email) pairs.push([\"Email\", credential.email]);\n\tpairs.push([\"Key\", masked]);\n\tpairs.push([\"Source\", credential.source]);\n\tif (credential.accountId) pairs.push([\"Account\", credential.accountId]);\n\n\tconst jsonEnvelope = {\n\t\tok: true,\n\t\tauthenticated: true,\n\t\tsource: credential.source,\n\t\tmasked_key: masked,\n\t\t...(credential.keyId ? { key_id: credential.keyId } : {}),\n\t\t...(credential.keyLast4 ? { key_last4: credential.keyLast4 } : {}),\n\t\t...(credential.accountId ? { account_id: credential.accountId } : {}),\n\t\t...(credential.email ? { email: credential.email } : {}),\n\t};\n\twriteKv(deps, pairs, jsonEnvelope);\n\treturn { exitCode: 0 };\n}\n","import { Dropthis } from \"@dropthis/node\";\nimport { createOutput, type Output } from \"./output.js\";\n\nexport type GlobalOptions = {\n\tapiKey?: string;\n\tapiUrl?: string;\n\tjson?: boolean;\n\tquiet?: boolean;\n};\n\nexport type CliContext = {\n\tenv: Record<string, string | undefined>;\n\tglobal: GlobalOptions;\n\toutput: Output;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\tcreateClient: (apiKey?: string) => Dropthis;\n};\n\nexport function createContext(input: {\n\tglobal?: GlobalOptions;\n\tenv?: Record<string, string | undefined>;\n\tstdout?: (value: string) => void;\n\tstderr?: (value: string) => void;\n\tstdoutIsTTY?: boolean;\n}): CliContext {\n\tconst env = input.env ?? process.env;\n\tconst global = input.global ?? {};\n\treturn {\n\t\tenv,\n\t\tglobal,\n\t\toutput: createOutput({\n\t\t\t...(global.json !== undefined ? { json: global.json } : {}),\n\t\t\t...(global.quiet !== undefined ? { quiet: global.quiet } : {}),\n\t\t\tstdoutIsTTY: input.stdoutIsTTY ?? process.stdout.isTTY === true,\n\t\t\tenv,\n\t\t}),\n\t\tstdout: input.stdout ?? ((value) => process.stdout.write(value)),\n\t\tstderr: input.stderr ?? ((value) => process.stderr.write(value)),\n\t\tcreateClient(apiKey) {\n\t\t\tconst baseUrl = global.apiUrl ?? env.DROPTHIS_API_URL;\n\t\t\treturn new Dropthis({\n\t\t\t\t...(apiKey ? { apiKey } : {}),\n\t\t\t\t...(baseUrl ? { baseUrl } : {}),\n\t\t\t});\n\t\t},\n\t};\n}\n","import { chmod, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Entry } from \"@napi-rs/keyring\";\n\nexport type StoredCredential = {\n\tapiKey: string;\n\tkeyId?: string;\n\tkeyLast4?: string;\n\taccountId?: string;\n\temail?: string;\n\tstorage: \"secure\" | \"insecure\";\n};\n\nexport interface CredentialStore {\n\tread(): Promise<StoredCredential | null>;\n\tsave(credential: StoredCredential): Promise<void>;\n\tclear(): Promise<void>;\n}\n\nexport type KeyringAdapter = {\n\tgetPassword(): string | null | undefined | Promise<string | null | undefined>;\n\tsetPassword(value: string): void | Promise<void>;\n\tdeletePassword(): void | Promise<void>;\n};\n\nexport class MemoryCredentialStore implements CredentialStore {\n\tprivate credential: StoredCredential | null = null;\n\n\tasync read(): Promise<StoredCredential | null> {\n\t\treturn this.credential;\n\t}\n\n\tasync save(credential: StoredCredential): Promise<void> {\n\t\tthis.credential = credential;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.credential = null;\n\t}\n}\n\nexport class InsecureFileCredentialStore implements CredentialStore {\n\tprivate readonly filePath: string;\n\n\tconstructor(options: { configDir?: string } = {}) {\n\t\tthis.filePath = credentialPath(options.configDir);\n\t}\n\n\tasync read(): Promise<StoredCredential | null> {\n\t\tconst value = await readJsonFile(this.filePath);\n\t\tif (!value) return null;\n\t\tif (typeof value.apiKey !== \"string\" || !value.apiKey) return null;\n\t\treturn { ...value, storage: \"insecure\" } as StoredCredential;\n\t}\n\n\tasync save(credential: StoredCredential): Promise<void> {\n\t\tawait writeCredentialFile(this.filePath, {\n\t\t\t...credential,\n\t\t\tstorage: \"insecure\",\n\t\t});\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait rm(this.filePath, { force: true });\n\t}\n}\n\nexport class KeyringCredentialStore implements CredentialStore {\n\tprivate readonly filePath: string;\n\tprivate readonly keyring: KeyringAdapter;\n\n\tconstructor(options: { configDir?: string; keyring?: KeyringAdapter } = {}) {\n\t\tthis.filePath = credentialPath(options.configDir);\n\t\tthis.keyring = options.keyring ?? defaultKeyringAdapter();\n\t}\n\n\tasync read(): Promise<StoredCredential | null> {\n\t\tconst metadata = await readJsonFile(this.filePath);\n\t\tif (!metadata) return null;\n\t\tconst apiKey = await this.keyring.getPassword();\n\t\tif (typeof apiKey !== \"string\" || !apiKey) return null;\n\t\treturn { ...metadata, apiKey, storage: \"secure\" } as StoredCredential;\n\t}\n\n\tasync save(credential: StoredCredential): Promise<void> {\n\t\tawait this.keyring.setPassword(credential.apiKey);\n\t\tconst { apiKey: _apiKey, ...metadata } = credential;\n\t\tawait writeCredentialFile(this.filePath, {\n\t\t\t...metadata,\n\t\t\tstorage: \"secure\",\n\t\t});\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait this.keyring.deletePassword();\n\t\tawait rm(this.filePath, { force: true });\n\t}\n}\n\nexport function createCredentialStore(\n\toptions: { insecure?: boolean; configDir?: string } = {},\n): CredentialStore {\n\tif (options.insecure) return new InsecureFileCredentialStore(options);\n\treturn new KeyringCredentialStore(options);\n}\n\nfunction defaultKeyringAdapter(): KeyringAdapter {\n\tconst entry = new Entry(\"dropthis\", \"default\");\n\treturn {\n\t\tgetPassword: () => entry.getPassword(),\n\t\tsetPassword: (value) => entry.setPassword(value),\n\t\tdeletePassword: () => {\n\t\t\tentry.deletePassword();\n\t\t},\n\t};\n}\n\nfunction credentialPath(configDir?: string): string {\n\treturn join(\n\t\tconfigDir ?? join(homedir(), \".config\", \"dropthis\"),\n\t\t\"credentials.json\",\n\t);\n}\n\nasync function readJsonFile(\n\tpath: string,\n): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\treturn JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n\t} catch (error) {\n\t\tif (\n\t\t\terror &&\n\t\t\ttypeof error === \"object\" &&\n\t\t\t\"code\" in error &&\n\t\t\terror.code === \"ENOENT\"\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function writeCredentialFile(\n\tpath: string,\n\tcredential: Record<string, unknown>,\n): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true });\n\tawait writeFile(path, `${JSON.stringify(credential, null, 2)}\\n`, {\n\t\tmode: 0o600,\n\t});\n\tawait chmod(path, 0o600);\n}\n","#!/usr/bin/env node\nimport { buildProgram } from \"./program.js\";\nimport { createCredentialStore } from \"./storage.js\";\n\nbuildProgram({ store: createCredentialStore() })\n\t.parseAsync(process.argv)\n\t.catch((error: unknown) => {\n\t\tconsole.error(error);\n\t\tprocess.exitCode = 1;\n\t});\n"],"mappings":"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","names":["import_picocolors","error","pc","pc","pc","hasCredential","prompts","hasCredential","listItems","error","prompts","import_promises","import_picocolors","pc","import_promises","error","error","import_node_crypto","error","isFileSystemError","MAX_BUNDLE_FILE_COUNT","import_promises","import_node_path","error","pc","deps","global","result","writeFile","join","error"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/auth.ts","../src/output.ts","../src/ui.ts","../src/fmt.ts","../src/commands/account.ts","../src/commands/api-keys.ts","../src/commands/commands.ts","../src/commands/deployments.ts","../src/commands/doctor.ts","../src/commands/drops.ts","../src/options.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/publish.ts","../src/spinner.ts","../src/commands/json_body.ts","../src/commands/update.ts","../src/commands/whoami.ts","../src/context.ts","../src/storage.ts","../src/cli.ts"],"sourcesContent":["import { Command, InvalidArgumentError } from \"commander\";\nimport pc from \"picocolors\";\nimport { resolveCredential } from \"./auth.js\";\nimport { runAccountGet } from \"./commands/account.js\";\nimport {\n\trunApiKeysCreate,\n\trunApiKeysDelete,\n\trunApiKeysList,\n} from \"./commands/api-keys.js\";\nimport { runCommands } from \"./commands/commands.js\";\nimport {\n\trunDeploymentsGet,\n\trunDeploymentsList,\n} from \"./commands/deployments.js\";\nimport { runDoctor } from \"./commands/doctor.js\";\nimport {\n\trunDropsDelete,\n\trunDropsGet,\n\trunDropsList,\n\trunDropsUpdate,\n} from \"./commands/drops.js\";\nimport {\n\trunLoginInteractive,\n\trunLoginRequest,\n\trunLoginVerify,\n} from \"./commands/login.js\";\nimport { runLogout } from \"./commands/logout.js\";\nimport { runPublish } from \"./commands/publish.js\";\nimport { runUpdate } from \"./commands/update.js\";\nimport { runWhoami } from \"./commands/whoami.js\";\nimport { createContext, type GlobalOptions } from \"./context.js\";\nimport { writeError } from \"./fmt.js\";\nimport type { RawDropOptions } from \"./options.js\";\nimport { type CredentialStore, MemoryCredentialStore } from \"./storage.js\";\n\ntype BuildProgramOptions = {\n\tstore?: CredentialStore;\n\tclient?: unknown;\n\tenv?: Record<string, string | undefined>;\n\tstdin?: AsyncIterable<string | Uint8Array>;\n\tstdout?: (value: string) => void;\n\tstderr?: (value: string) => void;\n\tstdoutIsTTY?: boolean;\n\tstdinIsTTY?: boolean;\n};\n\nexport function buildProgram(options: BuildProgramOptions = {}): Command {\n\tconst program = new Command();\n\tconst store = options.store ?? new MemoryCredentialStore();\n\tprogram\n\t\t.name(\"dropthis\")\n\t\t.description(\n\t\t\t[\n\t\t\t\tpc.dim(\"Publish anything online and get a URL back.\"),\n\t\t\t\t\"\",\n\t\t\t\t`${pc.bold(\"Quick start:\")}`,\n\t\t\t\t` ${pc.cyan(\"dropthis login\")}`,\n\t\t\t\t` ${pc.cyan(\"dropthis publish ./dist\")}`,\n\t\t\t].join(\"\\n\"),\n\t\t)\n\t\t.version(PKG_VERSION)\n\t\t.configureHelp({\n\t\t\tsubcommandTerm(cmd) {\n\t\t\t\tconst args = cmd.registeredArguments\n\t\t\t\t\t.map((a) => {\n\t\t\t\t\t\tconst name = a.name();\n\t\t\t\t\t\tconst variadic = a.variadic ? \"...\" : \"\";\n\t\t\t\t\t\treturn a.required ? `<${name}${variadic}>` : `[${name}${variadic}]`;\n\t\t\t\t\t})\n\t\t\t\t\t.join(\" \");\n\t\t\t\treturn args ? `${cmd.name()} ${args}` : cmd.name();\n\t\t\t},\n\t\t\tstyleTitle: (title) => pc.bold(title),\n\t\t\tstyleCommandText: (str) => pc.cyan(str),\n\t\t\tstyleSubcommandText: (str) => pc.cyan(str),\n\t\t\tstyleOptionText: (str) => pc.yellow(str),\n\t\t});\n\tprogram.option(\"--api-key <key>\", \"Override API key for this invocation\");\n\tprogram.option(\"--api-url <url>\", \"Override API base URL\");\n\tprogram.option(\"--json\", \"Force JSON output\");\n\tprogram.option(\"-q, --quiet\", \"Suppress status output and imply JSON\");\n\n\tprogram\n\t\t.command(\"publish [input...]\")\n\t\t.description(\n\t\t\t\"Publish files, folders, URLs, strings, or stdin.\\nMultiple files are bundled into one drop.\\nUse - to read stdin explicitly, or pipe without args.\",\n\t\t)\n\t\t.option(\"--from-json <path>\", \"Read exact POST /drops JSON request body\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.option(\"--title <title>\", \"Drop title\")\n\t\t.option(\"--visibility <visibility>\", \"Drop visibility\")\n\t\t.option(\"--password <password>\", \"Set password\")\n\t\t.option(\"--no-password\", \"Clear password\")\n\t\t.option(\"--noindex\", \"Prevent indexing\")\n\t\t.option(\"--index\", \"Allow indexing\")\n\t\t.option(\"--expires-at <datetime>\", \"Expiration datetime\")\n\t\t.option(\"--metadata <json>\", \"Metadata JSON object\")\n\t\t.option(\"--metadata-file <path>\", \"Metadata JSON file\")\n\t\t.option(\"--entry <path>\", \"Entry file path\")\n\t\t.option(\"--content-type <mime>\", \"Content type\")\n\t\t.option(\"--path <path>\", \"Path for stdin or byte input\")\n\t\t.option(\"--idempotency-key <key>\", \"Idempotency key\")\n\t\t.option(\"--url\", \"Print only the published URL\")\n\t\t.option(\"--dry-run\", \"Validate without publishing\")\n\t\t.action(async (inputs: string[], commandOptions: RawCommandOptions) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runPublish>[2][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst stdinIsTTY = options.stdinIsTTY ?? process.stdin.isTTY ?? false;\n\t\t\tlet publishInput: string | string[] | undefined;\n\t\t\ttry {\n\t\t\t\tif (commandOptions.dryRun && inputs.length > 1) {\n\t\t\t\t\tpublishInput = inputs;\n\t\t\t\t} else {\n\t\t\t\t\tpublishInput = await resolvePublishInputs(\n\t\t\t\t\t\tinputs,\n\t\t\t\t\t\toptions.stdin,\n\t\t\t\t\t\tstdinIsTTY,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tconst msg = err instanceof Error ? err.message : \"Invalid input.\";\n\t\t\t\tprocess.exitCode = writeError(deps, \"local_input_error\", msg).exitCode;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await runPublish(\n\t\t\t\tpublishInput,\n\t\t\t\ttoDropOptions(commandOptions),\n\t\t\t\tdeps,\n\t\t\t);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"update <target> [input]\")\n\t\t.description(\"Deploy new content to an existing drop\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.option(\"--slug <slug>\", \"Replace shared hosted drop slug\")\n\t\t.option(\"--title <title>\", \"Drop title\")\n\t\t.option(\"--visibility <visibility>\", \"Drop visibility\")\n\t\t.option(\"--password <password>\", \"Set password\")\n\t\t.option(\"--no-password\", \"Clear password\")\n\t\t.option(\"--noindex\", \"Prevent indexing\")\n\t\t.option(\"--index\", \"Allow indexing\")\n\t\t.option(\"--expires-at <datetime>\", \"Expiration datetime\")\n\t\t.option(\"--metadata <json>\", \"Metadata JSON object\")\n\t\t.option(\"--metadata-file <path>\", \"Metadata JSON file\")\n\t\t.option(\"--entry <path>\", \"Entry file path\")\n\t\t.option(\"--content-type <mime>\", \"Content type\")\n\t\t.option(\"--path <path>\", \"Path for stdin or byte input\")\n\t\t.option(\"--idempotency-key <key>\", \"Idempotency key\")\n\t\t.option(\"--if-revision <n>\", \"Expected current revision\", parseInteger)\n\t\t.option(\n\t\t\t\"--from-json <path>\",\n\t\t\t\"Read exact POST /drops/{drop_id}/deployments JSON request body\",\n\t\t)\n\t\t.option(\"--url\", \"Print only the published URL\")\n\t\t.option(\"--dry-run\", \"Validate without publishing\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\ttarget: string,\n\t\t\t\tinput: string | undefined,\n\t\t\t\tcommandOptions: RawCommandOptions & { ifRevision?: number },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runUpdate>[3][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tlet updateInput: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tupdateInput = input\n\t\t\t\t\t\t? await resolveCommandInput(input, options.stdin)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconst msg = err instanceof Error ? err.message : \"Invalid input.\";\n\t\t\t\t\tprocess.exitCode = writeError(\n\t\t\t\t\t\tdeps,\n\t\t\t\t\t\t\"local_input_error\",\n\t\t\t\t\t\tmsg,\n\t\t\t\t\t).exitCode;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst result = await runUpdate(\n\t\t\t\t\ttarget,\n\t\t\t\t\tupdateInput,\n\t\t\t\t\ttoDropOptions(commandOptions),\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst drops = program.command(\"drops\").description(\"Manage published drops\");\n\tdrops\n\t\t.command(\"list\")\n\t\t.description(\"List your drops\")\n\t\t.option(\"--limit <n>\", \"Page size\", parseInteger)\n\t\t.option(\"--cursor <cursor>\", \"Pagination cursor\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (commandOptions: {\n\t\t\t\tlimit?: number;\n\t\t\t\tcursor?: string;\n\t\t\t\tjson?: boolean;\n\t\t\t}) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDropsList>[1][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDropsList(commandOptions, deps);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\tdrops\n\t\t.command(\"get <dropId>\")\n\t\t.description(\"Show drop details\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (dropId: string, commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runDropsGet>[2][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runDropsGet(dropId, commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tdrops\n\t\t.command(\"update <dropId>\")\n\t\t.description(\"Update drop metadata\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.option(\"--title <title>\", \"Drop title\")\n\t\t.option(\"--visibility <visibility>\", \"Drop visibility\")\n\t\t.option(\"--password <password>\", \"Set password\")\n\t\t.option(\"--no-password\", \"Clear password\")\n\t\t.option(\"--noindex\", \"Prevent indexing\")\n\t\t.option(\"--index\", \"Allow indexing\")\n\t\t.option(\"--expires-at <datetime>\", \"Expiration datetime\")\n\t\t.option(\"--metadata <json>\", \"Metadata JSON object\")\n\t\t.option(\"--metadata-file <path>\", \"Metadata JSON file\")\n\t\t.action(async (dropId: string, commandOptions: RawCommandOptions) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runDropsUpdate>[2][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runDropsUpdate(\n\t\t\t\tdropId,\n\t\t\t\ttoDropOptions(commandOptions),\n\t\t\t\tdeps,\n\t\t\t);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tdrops\n\t\t.command(\"delete <dropId>\")\n\t\t.description(\"Delete a drop\")\n\t\t.option(\"--yes\", \"Confirm deletion\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tdropId: string,\n\t\t\t\tcommandOptions: { yes?: boolean; json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDropsDelete>[2][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDropsDelete(\n\t\t\t\t\tdropId,\n\t\t\t\t\t{ ...commandOptions, interactive: deps.outputMode === \"human\" },\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst apiKeys = program.command(\"api-keys\").description(\"Manage API keys\");\n\tapiKeys\n\t\t.command(\"create\")\n\t\t.description(\"Create an API key\")\n\t\t.option(\"--label <label>\", \"API key label\", \"CLI\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { label: string; json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runApiKeysCreate>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runApiKeysCreate(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tapiKeys\n\t\t.command(\"list\")\n\t\t.description(\"List API keys\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runApiKeysList>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runApiKeysList(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tapiKeys\n\t\t.command(\"delete <keyId>\")\n\t\t.description(\"Delete an API key\")\n\t\t.option(\"--yes\", \"Confirm deletion\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tkeyId: string,\n\t\t\t\tcommandOptions: { yes?: boolean; json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runApiKeysDelete>[2][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runApiKeysDelete(\n\t\t\t\t\tkeyId,\n\t\t\t\t\t{ ...commandOptions, interactive: deps.outputMode === \"human\" },\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst deployments = program\n\t\t.command(\"deployments\")\n\t\t.description(\"View deployment history\");\n\tdeployments\n\t\t.command(\"list <dropId>\")\n\t\t.description(\"List deployments for a drop\")\n\t\t.option(\"--limit <n>\", \"Page size\", parseInteger)\n\t\t.option(\"--cursor <cursor>\", \"Pagination cursor\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tdropId: string,\n\t\t\t\tcommandOptions: { limit?: number; cursor?: string; json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDeploymentsList>[2][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDeploymentsList(dropId, commandOptions, deps);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\tdeployments\n\t\t.command(\"get <dropId> <deploymentId>\")\n\t\t.description(\"Show deployment details\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tdropId: string,\n\t\t\t\tdeploymentId: string,\n\t\t\t\tcommandOptions: { json?: boolean },\n\t\t\t) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runDeploymentsGet>[3][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst result = await runDeploymentsGet(\n\t\t\t\t\tdropId,\n\t\t\t\t\tdeploymentId,\n\t\t\t\t\tcommandOptions,\n\t\t\t\t\tdeps,\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\t// --- Auth commands ---\n\n\tprogram\n\t\t.command(\"login\")\n\t\t.description(\"Authenticate with email OTP\")\n\t\t.option(\"--email <email>\", \"Email address\")\n\t\t.option(\"--otp <otp>\", \"One-time passcode\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (commandOptions: {\n\t\t\t\temail?: string;\n\t\t\t\totp?: string;\n\t\t\t\tjson?: boolean;\n\t\t\t}) => {\n\t\t\t\tif (!commandOptions.email || !commandOptions.otp) {\n\t\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\t\tParameters<typeof runLoginInteractive>[0][\"client\"]\n\t\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\t\tconst global = globalOptions(program, commandOptions);\n\t\t\t\t\tconst context = createContext({ global });\n\t\t\t\t\tconst result = await runLoginInteractive({\n\t\t\t\t\t\t...deps,\n\t\t\t\t\t\tcreateClient: (apiKey) =>\n\t\t\t\t\t\t\tcontext.createClient(apiKey) as Parameters<\n\t\t\t\t\t\t\t\ttypeof runLoginInteractive\n\t\t\t\t\t\t\t>[0][\"client\"],\n\t\t\t\t\t});\n\t\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runLoginVerify>[1][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst global = globalOptions(program, commandOptions);\n\t\t\t\tconst verifyContext = createContext({ global });\n\t\t\t\tconst result = await runLoginVerify(\n\t\t\t\t\t{\n\t\t\t\t\t\temail: commandOptions.email,\n\t\t\t\t\t\totp: commandOptions.otp,\n\t\t\t\t\t\t...(commandOptions.json !== undefined\n\t\t\t\t\t\t\t? { json: commandOptions.json }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t...deps,\n\t\t\t\t\t\tcreateClient: (apiKey) =>\n\t\t\t\t\t\t\tverifyContext.createClient(apiKey) as Parameters<\n\t\t\t\t\t\t\t\ttypeof runLoginVerify\n\t\t\t\t\t\t\t>[1][\"client\"],\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tconst login = program.commands.find((command) => command.name() === \"login\");\n\tlogin\n\t\t?.command(\"request\")\n\t\t.description(\"Request an email OTP\")\n\t\t.requiredOption(\"--email <email>\", \"Email address\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { email: string; json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runLoginRequest>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runLoginRequest(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\tlogin\n\t\t?.command(\"verify\")\n\t\t.description(\"Verify email OTP and store an API key\")\n\t\t.requiredOption(\"--email <email>\", \"Email address\")\n\t\t.requiredOption(\"--otp <otp>\", \"One-time passcode\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(\n\t\t\tasync (commandOptions: {\n\t\t\t\temail: string;\n\t\t\t\totp: string;\n\t\t\t\tjson?: boolean;\n\t\t\t}) => {\n\t\t\t\tconst deps = await commandDeps<\n\t\t\t\t\tParameters<typeof runLoginVerify>[1][\"client\"]\n\t\t\t\t>(program, options, store, commandOptions);\n\t\t\t\tconst global = globalOptions(program, commandOptions);\n\t\t\t\tconst verifySubContext = createContext({ global });\n\t\t\t\tconst result = await runLoginVerify(commandOptions, {\n\t\t\t\t\t...deps,\n\t\t\t\t\tcreateClient: (apiKey) =>\n\t\t\t\t\t\tverifySubContext.createClient(apiKey) as Parameters<\n\t\t\t\t\t\t\ttypeof runLoginVerify\n\t\t\t\t\t\t>[1][\"client\"],\n\t\t\t\t});\n\t\t\t\tprocess.exitCode = result.exitCode;\n\t\t\t},\n\t\t);\n\n\tprogram\n\t\t.command(\"logout\")\n\t\t.description(\"Remove stored credentials\")\n\t\t.option(\"--revoke\", \"Best-effort revoke the saved API key\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { revoke?: boolean; json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<Parameters<typeof runLogout>[1][\"client\"]>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runLogout(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"whoami\")\n\t\t.description(\"Show current authentication status\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<unknown>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runWhoami(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"account\")\n\t\t.description(\"Show account details\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<\n\t\t\t\tParameters<typeof runAccountGet>[1][\"client\"]\n\t\t\t>(program, options, store, commandOptions);\n\t\t\tconst result = await runAccountGet(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\t// --- Diagnostics ---\n\n\tprogram\n\t\t.command(\"doctor\")\n\t\t.description(\"Report CLI diagnostics\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<unknown>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runDoctor(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\tprogram\n\t\t.command(\"commands\")\n\t\t.description(\"Print machine-readable command metadata\")\n\t\t.option(\"--json\", \"Force JSON output\")\n\t\t.action(async (commandOptions: { json?: boolean }) => {\n\t\t\tconst deps = await commandDeps<unknown>(\n\t\t\t\tprogram,\n\t\t\t\toptions,\n\t\t\t\tstore,\n\t\t\t\tcommandOptions,\n\t\t\t);\n\t\t\tconst result = await runCommands(commandOptions, deps);\n\t\t\tprocess.exitCode = result.exitCode;\n\t\t});\n\n\treturn program;\n}\n\ntype RawCommandOptions = Omit<RawDropOptions, \"password\"> & {\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tifRevision?: number;\n\tfromJson?: string;\n\tdryRun?: boolean;\n\tpassword?: string | boolean;\n};\n\ntype RunnerDeps<TClient> = {\n\tstore: CredentialStore;\n\tclient: TClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode: \"human\" | \"json\";\n};\n\nasync function commandDeps<TClient>(\n\tprogram: Command,\n\toptions: BuildProgramOptions,\n\tstore: CredentialStore,\n\tcommandOptions: { json?: boolean; quiet?: boolean },\n): Promise<RunnerDeps<TClient>> {\n\tconst global = globalOptions(program, commandOptions);\n\tconst context = createContext({\n\t\tglobal,\n\t\t...(options.env !== undefined ? { env: options.env } : {}),\n\t\t...(options.stdout !== undefined ? { stdout: options.stdout } : {}),\n\t\t...(options.stderr !== undefined ? { stderr: options.stderr } : {}),\n\t\t...(options.stdoutIsTTY !== undefined\n\t\t\t? { stdoutIsTTY: options.stdoutIsTTY }\n\t\t\t: {}),\n\t});\n\tconst credential = await resolveCredential({\n\t\t...(global.apiKey ? { apiKey: global.apiKey } : {}),\n\t\tenv: context.env,\n\t\tstore,\n\t});\n\treturn {\n\t\tstore,\n\t\tclient: (options.client ??\n\t\t\tcontext.createClient(credential?.apiKey)) as TClient,\n\t\t...(global.apiKey ? { apiKey: global.apiKey } : {}),\n\t\tenv: context.env,\n\t\tstdout: context.stdout,\n\t\tstderr: context.stderr,\n\t\toutputMode: context.output.mode,\n\t};\n}\n\nfunction globalOptions(\n\tprogram: Command,\n\tcommandOptions: { json?: boolean; quiet?: boolean },\n): GlobalOptions {\n\tconst opts = program.opts<GlobalOptions>();\n\treturn {\n\t\t...(opts.apiKey ? { apiKey: opts.apiKey } : {}),\n\t\t...(opts.apiUrl ? { apiUrl: opts.apiUrl } : {}),\n\t\t...(commandOptions.json !== undefined\n\t\t\t? { json: commandOptions.json }\n\t\t\t: opts.json !== undefined\n\t\t\t\t? { json: opts.json }\n\t\t\t\t: {}),\n\t\t...(commandOptions.quiet !== undefined\n\t\t\t? { quiet: commandOptions.quiet }\n\t\t\t: opts.quiet !== undefined\n\t\t\t\t? { quiet: opts.quiet }\n\t\t\t\t: {}),\n\t};\n}\n\nfunction toDropOptions(options: RawCommandOptions): RawDropOptions & {\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tifRevision?: number;\n\tfromJson?: string;\n\tdryRun?: boolean;\n} {\n\treturn {\n\t\t...(options.slug ? { slug: options.slug } : {}),\n\t\t...(options.title ? { title: options.title } : {}),\n\t\t...(options.visibility === \"public\" || options.visibility === \"unlisted\"\n\t\t\t? { visibility: options.visibility }\n\t\t\t: {}),\n\t\t...(typeof options.password === \"string\"\n\t\t\t? { password: options.password }\n\t\t\t: {}),\n\t\t...(options.password === false || options.noPassword\n\t\t\t? { noPassword: true }\n\t\t\t: {}),\n\t\t...(options.noindex ? { noindex: true } : {}),\n\t\t...(options.index ? { index: true } : {}),\n\t\t...(options.expiresAt ? { expiresAt: options.expiresAt } : {}),\n\t\t...(options.metadata ? { metadata: options.metadata } : {}),\n\t\t...(options.metadataFile ? { metadataFile: options.metadataFile } : {}),\n\t\t...(options.entry ? { entry: options.entry } : {}),\n\t\t...(options.contentType ? { contentType: options.contentType } : {}),\n\t\t...(options.path ? { path: options.path } : {}),\n\t\t...(options.idempotencyKey\n\t\t\t? { idempotencyKey: options.idempotencyKey }\n\t\t\t: {}),\n\t\t...(options.json !== undefined ? { json: options.json } : {}),\n\t\t...(options.quiet !== undefined ? { quiet: options.quiet } : {}),\n\t\t...(options.url !== undefined ? { url: options.url } : {}),\n\t\t...(options.ifRevision !== undefined\n\t\t\t? { ifRevision: options.ifRevision }\n\t\t\t: {}),\n\t\t...(options.fromJson ? { fromJson: options.fromJson } : {}),\n\t\t...(options.dryRun ? { dryRun: options.dryRun } : {}),\n\t};\n}\n\nfunction parseInteger(value: string): number {\n\tconst n = Number.parseInt(value, 10);\n\tif (Number.isNaN(n)) throw new InvalidArgumentError(\"Expected an integer.\");\n\treturn n;\n}\n\nasync function resolveCommandInput(\n\tinput: string,\n\tstdin?: AsyncIterable<string | Uint8Array>,\n): Promise<string> {\n\tif (input !== \"-\") return input;\n\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\treturn buf.toString(\"utf8\");\n}\n\nasync function resolvePublishInputs(\n\tinputs: string[],\n\tstdin?: AsyncIterable<string | Uint8Array>,\n\tstdinIsTTY?: boolean,\n): Promise<string | undefined> {\n\tif (inputs.length === 0) {\n\t\tif (stdinIsTTY) return undefined;\n\t\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\t\tif (buf.length === 0) return undefined;\n\t\treturn buf.toString(\"utf8\");\n\t}\n\tif (inputs.length === 1) {\n\t\tif (inputs[0] === \"-\") {\n\t\t\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\t\t\treturn buf.toString(\"utf8\");\n\t\t}\n\t\treturn inputs[0];\n\t}\n\tconst {\n\t\tmkdtemp,\n\t\tcopyFile,\n\t\twriteFile,\n\t\tstat: fsStat,\n\t} = await import(\"node:fs/promises\");\n\tconst { join, basename: pathBasename } = await import(\"node:path\");\n\tconst { tmpdir } = await import(\"node:os\");\n\tconst tmpDir = await mkdtemp(join(tmpdir(), \"dropthis-multi-\"));\n\tconst resolved: string[] = [];\n\tfor (const input of inputs) {\n\t\tif (input === \"-\") {\n\t\t\tconst buf = await readStdinBytes(stdin ?? process.stdin);\n\t\t\tconst tmpPath = join(tmpDir, `stdin-${Date.now()}`);\n\t\t\tawait writeFile(tmpPath, buf);\n\t\t\tresolved.push(tmpPath);\n\t\t} else {\n\t\t\tresolved.push(input);\n\t\t}\n\t}\n\tconst names = resolved.map((f) => pathBasename(f));\n\tconst dupes = names.filter((n, i) => names.indexOf(n) !== i);\n\tif (dupes.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Duplicate file names: ${[...new Set(dupes)].join(\", \")}. Rename files to avoid collisions.`,\n\t\t);\n\t}\n\tfor (const filePath of resolved) {\n\t\tconst info = await fsStat(filePath);\n\t\tif (info.isDirectory()) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot mix directories with multiple file arguments. Use a single folder instead: dropthis publish ${filePath}`,\n\t\t\t);\n\t\t}\n\t\tconst destName = pathBasename(filePath);\n\t\tawait copyFile(filePath, join(tmpDir, destName));\n\t}\n\treturn tmpDir;\n}\n\nasync function readStdinBytes(\n\tstdin: AsyncIterable<string | Uint8Array>,\n): Promise<Buffer> {\n\tconst chunks: Buffer[] = [];\n\tfor await (const chunk of stdin) {\n\t\tchunks.push(\n\t\t\ttypeof chunk === \"string\" ? Buffer.from(chunk) : Buffer.from(chunk),\n\t\t);\n\t}\n\treturn Buffer.concat(chunks);\n}\n","import type { CredentialStore } from \"./storage.js\";\n\nexport type ResolvedCredential = {\n\tapiKey: string;\n\tsource: \"flag\" | \"env\" | \"storage\";\n\tkeyId?: string;\n\tkeyLast4?: string;\n\taccountId?: string;\n\temail?: string;\n};\n\nexport async function resolveCredential(input: {\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstore: CredentialStore;\n}): Promise<ResolvedCredential | null> {\n\tif (input.apiKey) return { apiKey: input.apiKey, source: \"flag\" };\n\tif (input.env.DROPTHIS_API_KEY) {\n\t\treturn { apiKey: input.env.DROPTHIS_API_KEY, source: \"env\" };\n\t}\n\tconst stored = await input.store.read();\n\tif (!stored) return null;\n\treturn {\n\t\tapiKey: stored.apiKey,\n\t\tsource: \"storage\",\n\t\t...(stored.keyId ? { keyId: stored.keyId } : {}),\n\t\t...(stored.keyLast4 ? { keyLast4: stored.keyLast4 } : {}),\n\t\t...(stored.accountId ? { accountId: stored.accountId } : {}),\n\t\t...(stored.email ? { email: stored.email } : {}),\n\t};\n}\n\nexport function maskKey(apiKey: string): string {\n\treturn apiKey.length <= 8\n\t\t? \"sk_...\"\n\t\t: `${apiKey.slice(0, 3)}...${apiKey.slice(-4)}`;\n}\n","export type OutputMode = \"human\" | \"json\";\nexport type CliErrorCode =\n\t| \"api_error\"\n\t| \"auth_error\"\n\t| \"credential_storage_unavailable\"\n\t| \"generic_error\"\n\t| \"invalid_usage\"\n\t| \"local_input_error\"\n\t| \"network_error\";\n\nexport type Output = {\n\tmode: OutputMode;\n\tquiet: boolean;\n};\n\nexport type ApiErrorDetails = {\n\tcode?: string;\n\tmessage: string;\n\tstatusCode?: number | null;\n\tdetail?: unknown;\n\tparam?: string | null;\n\tcurrentRevision?: number;\n\trequestId?: string | null;\n};\n\nconst UPLOAD_NEXT_ACTIONS: Record<string, string> = {\n\tupload_expired: \"Create a new upload session and retry the publish.\",\n\tupload_already_used:\n\t\t\"Create a new upload session; upload sessions are single-use.\",\n\tupload_verification_failed:\n\t\t\"Re-upload the file bytes and complete the upload again.\",\n\ttoo_many_active_uploads:\n\t\t\"Cancel unused uploads or wait for expired uploads to be cleaned.\",\n\tupload_not_complete: \"Complete the upload session before publishing.\",\n};\n\nexport function createOutput(input: {\n\tjson?: boolean;\n\tquiet?: boolean;\n\tstdoutIsTTY: boolean;\n\tenv: Record<string, string | undefined>;\n}): Output {\n\tconst json =\n\t\tinput.json === true ||\n\t\tinput.quiet === true ||\n\t\tinput.stdoutIsTTY === false ||\n\t\tinput.env.CI === \"true\";\n\treturn { mode: json ? \"json\" : \"human\", quiet: input.quiet === true };\n}\n\nexport function successEnvelope<T>(data: T): { ok: true; data: T } {\n\treturn { ok: true, data };\n}\n\nexport function errorEnvelope(\n\tcode: CliErrorCode,\n\tmessage: string,\n\tnextAction?: string,\n): {\n\tok: false;\n\terror: { code: CliErrorCode; message: string; next_action?: string };\n} {\n\treturn {\n\t\tok: false,\n\t\terror: {\n\t\t\tcode,\n\t\t\tmessage,\n\t\t\t...(nextAction ? { next_action: nextAction } : {}),\n\t\t},\n\t};\n}\n\nexport function apiErrorEnvelope(error: ApiErrorDetails): {\n\tok: false;\n\terror: Record<string, unknown>;\n} {\n\treturn {\n\t\tok: false,\n\t\terror: {\n\t\t\tcode: error.code ?? \"api_error\",\n\t\t\tmessage: error.message,\n\t\t\t...(error.statusCode !== undefined ? { status: error.statusCode } : {}),\n\t\t\t...(typeof error.detail === \"string\" ? { detail: error.detail } : {}),\n\t\t\t...(error.param ? { param: error.param } : {}),\n\t\t\t...(error.currentRevision !== undefined\n\t\t\t\t? { current_revision: error.currentRevision }\n\t\t\t\t: {}),\n\t\t\t...(error.requestId ? { request_id: error.requestId } : {}),\n\t\t\tnext_action: nextActionForApiError(error),\n\t\t},\n\t};\n}\n\nfunction nextActionForApiError(error: ApiErrorDetails): string {\n\tconst uploadNextAction = error.code\n\t\t? UPLOAD_NEXT_ACTIONS[error.code]\n\t\t: undefined;\n\tif (uploadNextAction) return uploadNextAction;\n\tif (error.code === \"revision_conflict\") {\n\t\treturn \"Fetch the drop, merge your changes, and retry with the current revision.\";\n\t}\n\tif (error.statusCode === 401 || error.code === \"missing_api_key\") {\n\t\treturn \"Authenticate with dropthis login or set DROPTHIS_API_KEY.\";\n\t}\n\tif (error.statusCode === 413 || error.code === \"quota_exceeded\") {\n\t\treturn \"Reduce the upload size or upgrade the account limit.\";\n\t}\n\tif (error.statusCode === 422) {\n\t\treturn \"Fix the input shown in the error detail and retry.\";\n\t}\n\tif (\n\t\terror.statusCode !== undefined &&\n\t\terror.statusCode !== null &&\n\t\terror.statusCode >= 500\n\t) {\n\t\treturn \"Retry the request with the same idempotency key, or contact support with the request id.\";\n\t}\n\treturn \"Fix the request or retry after checking the drop state.\";\n}\n\nexport function exitCodeFor(code: CliErrorCode): number {\n\tif (code === \"invalid_usage\") return 2;\n\tif (code === \"auth_error\") return 3;\n\tif (code === \"local_input_error\") return 4;\n\tif (code === \"network_error\") return 5;\n\treturn 1;\n}\n","import pc from \"picocolors\";\n\nexport const symbols = {\n\tsuccess: \"✓\",\n\terror: \"✗\",\n\twarning: \"!\",\n} as const;\n\nexport function success(msg: string): string {\n\treturn `${pc.green(symbols.success)} ${msg}`;\n}\n\nexport function error(msg: string): string {\n\treturn `${pc.red(symbols.error)} ${msg}`;\n}\n\nexport function warn(msg: string): string {\n\treturn `${pc.yellow(symbols.warning)} ${msg}`;\n}\n\nexport function hint(msg: string): string {\n\treturn ` ${pc.dim(msg)}`;\n}\n\nexport function url(u: string): string {\n\treturn pc.cyan(u);\n}\n\nexport function label(key: string, value: string): string {\n\treturn `${pc.dim(`${key}:`)} ${value}`;\n}\n\nexport function kvLines(pairs: Array<[key: string, value: string]>): string {\n\tif (pairs.length === 0) return \"\";\n\tconst maxKey = Math.max(...pairs.map(([k]) => k.length));\n\treturn pairs\n\t\t.map(([k, v]) => ` ${pc.dim(`${k.padEnd(maxKey)}:`)} ${v}`)\n\t\t.join(\"\\n\");\n}\n","import type { ApiErrorDetails } from \"./output.js\";\nimport {\n\tapiErrorEnvelope,\n\ttype CliErrorCode,\n\terrorEnvelope,\n\texitCodeFor,\n} from \"./output.js\";\nimport { error, hint, kvLines, success, url } from \"./ui.js\";\n\ntype WriterDeps = {\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport function writeSuccess(\n\tdeps: WriterDeps,\n\tmessage: string,\n\tlink?: string,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tconst text = link ? `${message} ${url(link)}` : message;\n\t\tdeps.stdout(`${success(text)}\\n`);\n\t}\n}\n\nexport function writeUrl(deps: WriterDeps, link: string): void {\n\tdeps.stdout(`${url(link)}\\n`);\n}\n\nexport function writeResult(\n\tdeps: WriterDeps,\n\tlink: string,\n\tverb: string,\n\tdata: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${success(`${verb} ${url(link)}`)}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify({ ok: true, drop: data })}\\n`);\n\t}\n}\n\nexport function writeJson(\n\tdeps: WriterDeps,\n\tenvelope: Record<string, unknown>,\n): void {\n\tdeps.stdout(`${JSON.stringify(envelope)}\\n`);\n}\n\nexport function writeKv(\n\tdeps: WriterDeps,\n\tpairs: Array<[string, string]>,\n\tjson: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${kvLines(pairs)}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify(json)}\\n`);\n\t}\n}\n\nexport function writeHumanOrJson(\n\tdeps: WriterDeps,\n\thumanText: string,\n\tjson: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${humanText}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify(json)}\\n`);\n\t}\n}\n\nexport function writeError(\n\tdeps: WriterDeps,\n\tcode: CliErrorCode,\n\tmessage: string,\n\tnextAction?: string,\n): { exitCode: number } {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stderr(`${error(message)}\\n`);\n\t\tif (nextAction) deps.stderr(`${hint(nextAction)}\\n`);\n\t} else {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(code, message, nextAction))}\\n`,\n\t\t);\n\t}\n\treturn { exitCode: exitCodeFor(code) };\n}\n\nexport function writeApiError(\n\tdeps: WriterDeps,\n\tdetails: ApiErrorDetails,\n): { exitCode: number } {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stderr(`${error(details.message)}\\n`);\n\t\tconst nextAction = details.requestId\n\t\t\t? `Request ID: ${details.requestId}`\n\t\t\t: undefined;\n\t\tif (nextAction) deps.stderr(`${hint(nextAction)}\\n`);\n\t} else {\n\t\tdeps.stderr(`${JSON.stringify(apiErrorEnvelope(details))}\\n`);\n\t}\n\treturn { exitCode: exitCodeFor(\"api_error\") };\n}\n\nexport function writeApiErrorSimple(\n\tdeps: WriterDeps,\n\tmessage: string,\n): { exitCode: number } {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stderr(`${error(message)}\\n`);\n\t} else {\n\t\tdeps.stderr(`${JSON.stringify(errorEnvelope(\"api_error\", message))}\\n`);\n\t}\n\treturn { exitCode: exitCodeFor(\"api_error\") };\n}\n\nexport function writeAuthError(deps: WriterDeps): { exitCode: number } {\n\treturn writeError(\n\t\tdeps,\n\t\t\"auth_error\",\n\t\t\"No API key found.\",\n\t\t\"Set DROPTHIS_API_KEY or run dropthis login.\",\n\t);\n}\n\nexport function writeEmpty(\n\tdeps: WriterDeps,\n\tmessage: string,\n\tjson: Record<string, unknown>,\n): void {\n\tif (deps.outputMode === \"human\") {\n\t\tdeps.stdout(`${message}\\n`);\n\t} else {\n\t\tdeps.stdout(`${JSON.stringify(json)}\\n`);\n\t}\n}\n","import { resolveCredential } from \"../auth.js\";\nimport { writeApiErrorSimple, writeAuthError, writeKv } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype AccountClient = {\n\taccount: { get(): Promise<SdkResult<unknown>> };\n};\n\ntype CommandDeps = {\n\tstore: CredentialStore;\n\tclient: AccountClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runAccountGet(\n\t_input: { json?: boolean },\n\tdeps: CommandDeps,\n): Promise<{ exitCode: number }> {\n\tif (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) === null\n\t) {\n\t\treturn writeAuthError(deps);\n\t}\n\tconst result = await deps.client.account.get();\n\tif (result.error) {\n\t\treturn writeApiErrorSimple(deps, result.error.message);\n\t}\n\tconst data = result.data as Record<string, unknown> | null;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data?.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data?.email) pairs.push([\"Email\", String(data.email)]);\n\tif (data?.plan) pairs.push([\"Plan\", String(data.plan)]);\n\n\twriteKv(deps, pairs, { ok: true, account: result.data });\n\treturn { exitCode: 0 };\n}\n","import * as prompts from \"@clack/prompts\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiErrorSimple,\n\twriteAuthError,\n\twriteEmpty,\n\twriteError,\n\twriteHumanOrJson,\n\twriteJson,\n\twriteKv,\n} from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { success } from \"../ui.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype ApiKeysCreateClient = {\n\tapiKeys: {\n\t\tcreate(input: {\n\t\t\tlabel: string;\n\t\t}): Promise<SdkResult<Record<string, unknown>>>;\n\t};\n};\n\ntype ApiKeysListClient = {\n\tapiKeys: {\n\t\tlist(): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype ApiKeysDeleteClient = {\n\tapiKeys: {\n\t\tdelete(\n\t\t\tkeyId: string,\n\t\t): Promise<SdkResult<null>> | SdkResult<null> | undefined;\n\t};\n};\n\ntype CommandDeps<TClient> = {\n\tstore: CredentialStore;\n\tclient: TClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runApiKeysCreate(\n\tinput: { label: string; json?: boolean },\n\tdeps: CommandDeps<ApiKeysCreateClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.apiKeys.create({ label: input.label });\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst data = result.data;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data.key) pairs.push([\"Key\", String(data.key)]);\n\tif (data.last4) pairs.push([\"Last 4\", String(data.last4)]);\n\twriteKv(deps, pairs, { ok: true, api_key: result.data });\n\treturn { exitCode: 0 };\n}\n\nexport async function runApiKeysList(\n\t_input: { json?: boolean },\n\tdeps: CommandDeps<ApiKeysListClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.apiKeys.list();\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst raw = listItems(result.data);\n\tconst items = Array.isArray(raw)\n\t\t? (raw as Array<Record<string, unknown>>)\n\t\t: undefined;\n\tif (deps.outputMode === \"human\") {\n\t\tif (!items || items.length === 0) {\n\t\t\twriteEmpty(deps, \"No API keys found.\", { ok: true, api_keys: [] });\n\t\t} else {\n\t\t\tfor (const item of items) {\n\t\t\t\tdeps.stdout(\n\t\t\t\t\t`${item.id ?? \"\"} ${item.label ?? \"\"} ...${item.last4 ?? \"\"}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\twriteJson(deps, { ok: true, api_keys: items ?? raw });\n\t}\n\treturn { exitCode: 0 };\n}\n\nexport async function runApiKeysDelete(\n\tkeyId: string,\n\tinput: { yes?: boolean; json?: boolean; interactive?: boolean },\n\tdeps: CommandDeps<ApiKeysDeleteClient>,\n): Promise<{ exitCode: number }> {\n\tif (!input.yes && input.interactive === false) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"Pass --yes to delete in non-interactive mode.\",\n\t\t);\n\t}\n\tif (!input.yes && input.interactive !== false) {\n\t\tconst confirmed = await prompts.confirm({\n\t\t\tmessage: `Delete API key ${keyId}?`,\n\t\t});\n\t\tif (prompts.isCancel(confirmed) || !confirmed) {\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\t}\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.apiKeys.delete(keyId);\n\tif (result?.error) return writeApiErrorSimple(deps, result.error.message);\n\twriteHumanOrJson(deps, success(`Deleted ${keyId}`), {\n\t\tok: true,\n\t\tdeleted: true,\n\t\tid: keyId,\n\t});\n\treturn { exitCode: 0 };\n}\n\nasync function hasCredential(deps: CommandDeps<unknown>): Promise<boolean> {\n\treturn (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) !== null\n\t);\n}\n\nfunction listItems(data: unknown): unknown {\n\tif (data && typeof data === \"object\" && \"data\" in data) {\n\t\treturn (data as { data: unknown }).data;\n\t}\n\tif (data && typeof data === \"object\" && \"apiKeys\" in data) {\n\t\treturn (data as { apiKeys: unknown }).apiKeys;\n\t}\n\treturn data;\n}\n","const COMMANDS = [\n\t{\n\t\tname: \"publish\",\n\t\tdescription: \"Publish an input and return a Dropthis URL.\",\n\t\targuments: [\"input\"],\n\t\toptions: [\"--json\", \"--url\", \"--dry-run\", \"--title\", \"--metadata\"],\n\t\texamples: [\n\t\t\t\"dropthis publish ./site --json\",\n\t\t\t\"dropthis publish ./site --url\",\n\t\t\t\"dropthis publish ./dist --dry-run\",\n\t\t],\n\t},\n\t{\n\t\tname: \"update\",\n\t\tdescription: \"Update an existing drop by id.\",\n\t\targuments: [\"target\", \"input\"],\n\t\toptions: [\"--json\", \"--url\", \"--dry-run\", \"--if-revision\"],\n\t\texamples: [\n\t\t\t\"dropthis update drop_abc ./site --json\",\n\t\t\t\"dropthis update drop_abc --title 'New Title' --dry-run\",\n\t\t],\n\t},\n\t{\n\t\tname: \"deployments list <dropId>\",\n\t\tdescription: \"List deployments for a drop.\",\n\t\targuments: [\"dropId\"],\n\t\toptions: [\"--json\", \"--limit\", \"--cursor\"],\n\t\tauth: \"required\",\n\t\texamples: [\"dropthis deployments list drop_abc --json\"],\n\t},\n\t{\n\t\tname: \"deployments get <dropId> <deploymentId>\",\n\t\tdescription: \"Get deployment details for a drop.\",\n\t\targuments: [\"dropId\", \"deploymentId\"],\n\t\toptions: [\"--json\"],\n\t\tauth: \"required\",\n\t\texamples: [\"dropthis deployments get drop_abc dep_abc --json\"],\n\t},\n\t{\n\t\tname: \"drops\",\n\t\tdescription: \"List, inspect, update, and delete drops.\",\n\t\texamples: [\"dropthis drops list --json\"],\n\t},\n\t{\n\t\tname: \"api-keys\",\n\t\tdescription: \"Create, list, and delete API keys.\",\n\t\texamples: [\"dropthis api-keys create --label CI --json\"],\n\t},\n\t{\n\t\tname: \"login\",\n\t\tdescription: \"Authenticate with email OTP and store an API key.\",\n\t\texamples: [\n\t\t\t\"dropthis login verify --email user@example.com --otp 123456 --json\",\n\t\t],\n\t},\n\t{\n\t\tname: \"logout\",\n\t\tdescription: \"Remove stored local credentials.\",\n\t\texamples: [\"dropthis logout --json\"],\n\t},\n\t{\n\t\tname: \"whoami\",\n\t\tdescription: \"Show current auth source and credential metadata.\",\n\t\texamples: [\"dropthis whoami --json\"],\n\t},\n\t{\n\t\tname: \"account\",\n\t\tdescription: \"Get account details.\",\n\t\texamples: [\"dropthis account get --json\"],\n\t},\n\t{\n\t\tname: \"doctor\",\n\t\tdescription: \"Report local CLI diagnostics.\",\n\t\texamples: [\"dropthis doctor --json\"],\n\t},\n\t{\n\t\tname: \"commands\",\n\t\tdescription: \"Print this machine-readable command tree.\",\n\t\texamples: [\"dropthis commands --json\"],\n\t},\n];\n\nexport async function runCommands(\n\t_input: { json?: boolean },\n\tdeps: { stdout: (value: string) => void },\n): Promise<{ exitCode: number }> {\n\tdeps.stdout(\n\t\t`${JSON.stringify({\n\t\t\tok: true,\n\t\t\toutput: \"JSON by default in CI, pipes, non-TTY, --json, or --quiet.\",\n\t\t\tcommands: COMMANDS,\n\t\t})}\\n`,\n\t);\n\treturn { exitCode: 0 };\n}\n","import { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiError,\n\twriteAuthError,\n\twriteEmpty,\n\twriteJson,\n\twriteKv,\n} from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype ApiError = {\n\tmessage: string;\n\tcode?: string;\n\tstatusCode?: number | null;\n\tdetail?: unknown;\n\tparam?: string | null;\n\trequestId?: string | null;\n};\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| { data: null; error: ApiError; headers?: Record<string, string> };\n\ntype DeploymentsClient = {\n\tdeployments: {\n\t\tlist(\n\t\t\tdropId: string,\n\t\t\tparams?: { limit?: number; cursor?: string },\n\t\t): Promise<SdkResult<unknown>>;\n\t\tget(dropId: string, deploymentId: string): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype Deps = {\n\tstore: CredentialStore;\n\tclient: DeploymentsClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runDeploymentsList(\n\tdropId: string,\n\tinput: { limit?: number; cursor?: string; json?: boolean },\n\tdeps: Deps,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst params = {\n\t\t...(input.limit !== undefined ? { limit: input.limit } : {}),\n\t\t...(input.cursor ? { cursor: input.cursor } : {}),\n\t};\n\tconst result = await deps.client.deployments.list(dropId, params);\n\tif (result.error) {\n\t\treturn writeApiError(deps, result.error);\n\t}\n\tconst spread = spreadData(result.data);\n\tconst items = (spread.deployments ?? spread.data ?? result.data) as\n\t\t| Array<Record<string, unknown>>\n\t\t| undefined;\n\tif (deps.outputMode === \"human\") {\n\t\tif (!items || (Array.isArray(items) && items.length === 0)) {\n\t\t\twriteEmpty(deps, \"No deployments found.\", {\n\t\t\t\tok: true,\n\t\t\t\t...spread,\n\t\t\t});\n\t\t} else if (Array.isArray(items)) {\n\t\t\tfor (const item of items) {\n\t\t\t\tdeps.stdout(\n\t\t\t\t\t`${item.id ?? \"\"} rev ${item.revision ?? \"?\"} ${item.created_at ?? \"\"}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\twriteJson(deps, { ok: true, ...spread });\n\t\t}\n\t} else {\n\t\twriteJson(deps, { ok: true, ...spread });\n\t}\n\treturn { exitCode: 0 };\n}\n\nexport async function runDeploymentsGet(\n\tdropId: string,\n\tdeploymentId: string,\n\t_input: { json?: boolean },\n\tdeps: Deps,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.deployments.get(dropId, deploymentId);\n\tif (result.error) {\n\t\treturn writeApiError(deps, result.error);\n\t}\n\tconst data = result.data as Record<string, unknown>;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data.revision !== undefined)\n\t\tpairs.push([\"Revision\", String(data.revision)]);\n\tif (data.created_at) pairs.push([\"Created\", String(data.created_at)]);\n\twriteKv(deps, pairs, { ok: true, deployment: result.data });\n\treturn { exitCode: 0 };\n}\n\nasync function hasCredential(\n\tdeps: Pick<Deps, \"apiKey\" | \"env\" | \"store\">,\n): Promise<boolean> {\n\treturn (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) !== null\n\t);\n}\n\nfunction spreadData(data: unknown): Record<string, unknown> {\n\treturn data && typeof data === \"object\"\n\t\t? (data as Record<string, unknown>)\n\t\t: { data };\n}\n","import { resolveCredential } from \"../auth.js\";\nimport { writeKv } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype CommandDeps = {\n\tstore: CredentialStore;\n\tclient: unknown;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runDoctor(\n\t_input: { json?: boolean },\n\tdeps: CommandDeps,\n): Promise<{ exitCode: number }> {\n\tconst stored = await deps.store.read();\n\tconst credential = await resolveCredential({\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tconst authSource = credential?.source ?? \"missing\";\n\tconst storageBackend = stored?.storage ?? \"none\";\n\n\tconst pairs: Array<[string, string]> = [\n\t\t[\"Version\", PKG_VERSION],\n\t\t[\"Auth\", authSource],\n\t\t[\"Storage\", storageBackend],\n\t];\n\n\twriteKv(deps, pairs, {\n\t\tok: true,\n\t\tversion: PKG_VERSION,\n\t\tauth: { source: authSource },\n\t\tstorage: { backend: storageBackend },\n\t});\n\treturn { exitCode: 0 };\n}\n","import * as prompts from \"@clack/prompts\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiErrorSimple,\n\twriteAuthError,\n\twriteEmpty,\n\twriteError,\n\twriteHumanOrJson,\n\twriteJson,\n\twriteKv,\n} from \"../fmt.js\";\nimport { parseDropOptions, type RawDropOptions } from \"../options.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { url as fmtUrl, success } from \"../ui.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype DropsListClient = {\n\tdrops: {\n\t\tlist(params: {\n\t\t\tlimit?: number;\n\t\t\tcursor?: string;\n\t\t}): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype DropsGetClient = {\n\tdrops: {\n\t\tget(dropId: string): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype DropsUpdateClient = {\n\tdrops: {\n\t\tupdate(\n\t\t\tdropId: string,\n\t\t\tinput: Record<string, unknown>,\n\t\t): Promise<SdkResult<unknown>>;\n\t};\n};\n\ntype DropsDeleteClient = {\n\tdrops: {\n\t\tdelete(\n\t\t\tdropId: string,\n\t\t): Promise<SdkResult<null>> | SdkResult<null> | undefined;\n\t};\n};\n\ntype CommandDeps<TClient> = {\n\tstore: CredentialStore;\n\tclient: TClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runDropsList(\n\tinput: { limit?: number; cursor?: string; json?: boolean },\n\tdeps: CommandDeps<DropsListClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst params = {\n\t\t...(input.limit !== undefined ? { limit: input.limit } : {}),\n\t\t...(input.cursor ? { cursor: input.cursor } : {}),\n\t};\n\tconst result = await deps.client.drops.list(params);\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst raw = listItems(result.data);\n\tconst items = Array.isArray(raw)\n\t\t? (raw as Array<Record<string, unknown>>)\n\t\t: undefined;\n\tif (deps.outputMode === \"human\") {\n\t\tif (!items || items.length === 0) {\n\t\t\twriteEmpty(deps, \"No drops found.\", { ok: true, drops: [] });\n\t\t} else {\n\t\t\tfor (const item of items) {\n\t\t\t\tdeps.stdout(\n\t\t\t\t\t`${item.id ?? \"\"} ${item.title ?? \"\"} ${item.url ? fmtUrl(String(item.url)) : \"\"}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\twriteJson(deps, { ok: true, drops: items ?? raw });\n\t}\n\treturn { exitCode: 0 };\n}\n\nexport async function runDropsGet(\n\tdropId: string,\n\t_input: { json?: boolean },\n\tdeps: CommandDeps<DropsGetClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.drops.get(dropId);\n\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\tconst data = result.data as Record<string, unknown>;\n\tconst pairs: Array<[string, string]> = [];\n\tif (data.id) pairs.push([\"ID\", String(data.id)]);\n\tif (data.url) pairs.push([\"URL\", fmtUrl(String(data.url))]);\n\tif (data.title) pairs.push([\"Title\", String(data.title)]);\n\tif (data.visibility) pairs.push([\"Visibility\", String(data.visibility)]);\n\tif (data.revision !== undefined)\n\t\tpairs.push([\"Revision\", String(data.revision)]);\n\tif (data.created_at) pairs.push([\"Created\", String(data.created_at)]);\n\twriteKv(deps, pairs, { ok: true, drop: result.data });\n\treturn { exitCode: 0 };\n}\n\nexport async function runDropsUpdate(\n\tdropId: string,\n\tinput: RawDropOptions & { json?: boolean },\n\tdeps: CommandDeps<DropsUpdateClient>,\n): Promise<{ exitCode: number }> {\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\ttry {\n\t\tconst options = await parseDropOptions(input);\n\t\tconst result = await deps.client.drops.update(dropId, options);\n\t\tif (result.error) return writeApiErrorSimple(deps, result.error.message);\n\t\twriteHumanOrJson(deps, success(`Updated ${dropId}`), {\n\t\t\tok: true,\n\t\t\tdrop: result.data,\n\t\t});\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\terror instanceof Error ? error.message : \"Invalid drop options.\",\n\t\t);\n\t}\n}\n\nexport async function runDropsDelete(\n\tdropId: string,\n\tinput: { yes?: boolean; json?: boolean; interactive?: boolean },\n\tdeps: CommandDeps<DropsDeleteClient>,\n): Promise<{ exitCode: number }> {\n\tif (!input.yes && input.interactive === false) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"Pass --yes to delete in non-interactive mode.\",\n\t\t);\n\t}\n\tif (!input.yes && input.interactive !== false) {\n\t\tconst confirmed = await prompts.confirm({\n\t\t\tmessage: `Delete ${dropId}?`,\n\t\t});\n\t\tif (prompts.isCancel(confirmed) || !confirmed) {\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\t}\n\tif (!(await hasCredential(deps))) return writeAuthError(deps);\n\tconst result = await deps.client.drops.delete(dropId);\n\tif (result?.error) return writeApiErrorSimple(deps, result.error.message);\n\twriteHumanOrJson(deps, success(`Deleted ${dropId}`), {\n\t\tok: true,\n\t\tdeleted: true,\n\t\tid: dropId,\n\t});\n\treturn { exitCode: 0 };\n}\n\nasync function hasCredential(deps: CommandDeps<unknown>): Promise<boolean> {\n\treturn (\n\t\t(await resolveCredential({\n\t\t\t...(deps.apiKey ? { apiKey: deps.apiKey } : {}),\n\t\t\tenv: deps.env,\n\t\t\tstore: deps.store,\n\t\t})) !== null\n\t);\n}\n\nfunction listItems(data: unknown): unknown {\n\tif (data && typeof data === \"object\" && \"data\" in data) {\n\t\treturn (data as { data: unknown }).data;\n\t}\n\tif (data && typeof data === \"object\" && \"drops\" in data) {\n\t\treturn (data as { drops: unknown }).drops;\n\t}\n\treturn data;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport type RawDropOptions = {\n\tslug?: string;\n\ttitle?: string;\n\tvisibility?: \"public\" | \"unlisted\";\n\tpassword?: string;\n\tnoPassword?: boolean;\n\tnoindex?: boolean;\n\tindex?: boolean;\n\texpiresAt?: string;\n\tmetadata?: string;\n\tmetadataFile?: string;\n\tentry?: string;\n\tcontentType?: string;\n\tpath?: string;\n\tidempotencyKey?: string;\n};\n\nexport type ParsedDropOptions = {\n\tslug?: string;\n\ttitle?: string;\n\tvisibility?: \"public\" | \"unlisted\";\n\tpassword?: string | null;\n\tnoindex?: boolean;\n\texpiresAt?: string;\n\tmetadata?: Record<string, unknown>;\n\tentry?: string;\n\tcontentType?: string;\n\tpath?: string;\n\tidempotencyKey?: string;\n};\n\nexport async function parseDropOptions(\n\traw: RawDropOptions,\n): Promise<ParsedDropOptions> {\n\tif (raw.metadata && raw.metadataFile) {\n\t\tthrow new Error(\"Use either --metadata or --metadata-file, not both.\");\n\t}\n\tif (raw.password && raw.noPassword) {\n\t\tthrow new Error(\"Use either --password or --no-password, not both.\");\n\t}\n\tif (raw.noindex && raw.index) {\n\t\tthrow new Error(\"Use either --noindex or --index, not both.\");\n\t}\n\tconst metadata = raw.metadata\n\t\t? parseJsonObject(raw.metadata, \"--metadata\")\n\t\t: raw.metadataFile\n\t\t\t? parseJsonObject(\n\t\t\t\t\tawait readFile(raw.metadataFile, \"utf8\"),\n\t\t\t\t\t\"--metadata-file\",\n\t\t\t\t)\n\t\t\t: undefined;\n\treturn {\n\t\t...(raw.slug ? { slug: raw.slug } : {}),\n\t\t...(raw.title ? { title: raw.title } : {}),\n\t\t...(raw.visibility ? { visibility: raw.visibility } : {}),\n\t\t...(raw.password ? { password: raw.password } : {}),\n\t\t...(raw.noPassword ? { password: null } : {}),\n\t\t...(raw.noindex ? { noindex: true } : {}),\n\t\t...(raw.index ? { noindex: false } : {}),\n\t\t...(raw.expiresAt ? { expiresAt: raw.expiresAt } : {}),\n\t\t...(metadata ? { metadata } : {}),\n\t\t...(raw.entry ? { entry: raw.entry } : {}),\n\t\t...(raw.contentType ? { contentType: raw.contentType } : {}),\n\t\t...(raw.path ? { path: raw.path } : {}),\n\t\t...(raw.idempotencyKey ? { idempotencyKey: raw.idempotencyKey } : {}),\n\t};\n}\n\nfunction parseJsonObject(\n\tvalue: string,\n\tlabel: string,\n): Record<string, unknown> {\n\tconst parsed = JSON.parse(value) as unknown;\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`${label} must be a JSON object.`);\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n","import * as prompts from \"@clack/prompts\";\nimport { errorEnvelope, exitCodeFor } from \"../output.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype OtpRequestData = {\n\tok: true;\n\texpiresIn: number;\n};\n\ntype SessionData = {\n\ttoken: string;\n\taccountId: string;\n\tisNewAccount: boolean;\n};\n\ntype ApiKeyData = {\n\tid: string;\n\tkey: string;\n\tkeyLast4: string;\n\taccountId?: string | null;\n\tisNewAccount?: boolean;\n};\n\ntype LoginRequestClient = {\n\tauth: {\n\t\trequestEmailOtp(input: {\n\t\t\temail: string;\n\t\t}): Promise<SdkResult<OtpRequestData>>;\n\t};\n};\n\ntype LoginClient = {\n\tauth: {\n\t\tverifyEmailOtp(input: {\n\t\t\temail: string;\n\t\t\tcode: string;\n\t\t}): Promise<SdkResult<SessionData>>;\n\t};\n\tapiKeys: {\n\t\tcreate(input: { label: string }): Promise<SdkResult<ApiKeyData>>;\n\t};\n};\n\ntype LoginInteractiveClient = LoginRequestClient & LoginClient;\n\nexport async function runLoginInteractive(deps: {\n\tclient: LoginInteractiveClient;\n\tcreateClient: (apiKey: string) => LoginInteractiveClient;\n\tstore: CredentialStore;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n}): Promise<{ exitCode: number }> {\n\tprompts.intro(\"dropthis login\");\n\n\tconst email = await prompts.text({\n\t\tmessage: \"Email address\",\n\t\tvalidate: (v) => (v?.includes(\"@\") ? undefined : \"Enter a valid email\"),\n\t});\n\tif (prompts.isCancel(email)) {\n\t\tprompts.cancel(\"Login cancelled.\");\n\t\treturn { exitCode: 0 };\n\t}\n\n\tconst requestResult = await deps.client.auth.requestEmailOtp({ email });\n\tif (requestResult.error) {\n\t\tprompts.cancel(requestResult.error.message);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\n\tconst otp = await prompts.text({\n\t\tmessage: \"Paste the code from your email\",\n\t});\n\tif (prompts.isCancel(otp)) {\n\t\tprompts.cancel(\"Login cancelled.\");\n\t\treturn { exitCode: 0 };\n\t}\n\n\tconst session = await deps.client.auth.verifyEmailOtp({ email, code: otp });\n\tif (session.error) {\n\t\tprompts.cancel(session.error.message);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\n\tconst authedClient = deps.createClient(session.data.token);\n\tconst apiKey = await authedClient.apiKeys.create({ label: \"CLI\" });\n\tif (apiKey.error) {\n\t\tprompts.cancel(apiKey.error.message);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\n\tawait deps.store.save({\n\t\tapiKey: apiKey.data.key,\n\t\tkeyId: apiKey.data.id,\n\t\tkeyLast4: apiKey.data.keyLast4,\n\t\taccountId: apiKey.data.accountId ?? session.data.accountId,\n\t\temail,\n\t\tstorage: \"secure\",\n\t});\n\n\tprompts.outro(\"Logged in successfully.\");\n\treturn { exitCode: 0 };\n}\n\nexport async function runLoginRequest(\n\tinput: { email: string; json?: boolean },\n\tdeps: {\n\t\tclient: LoginRequestClient;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t},\n): Promise<{ exitCode: number }> {\n\tconst result = await deps.client.auth.requestEmailOtp({\n\t\temail: input.email,\n\t});\n\tif (result.error) {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(\"api_error\", result.error.message))}\\n`,\n\t\t);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\tdeps.stdout(\n\t\t`${JSON.stringify({\n\t\t\tok: true,\n\t\t\temail: input.email,\n\t\t\texpires_in: result.data.expiresIn,\n\t\t})}\\n`,\n\t);\n\treturn { exitCode: 0 };\n}\n\nexport async function runLoginVerify(\n\tinput: { email: string; otp: string; json?: boolean },\n\tdeps: {\n\t\tclient: LoginClient;\n\t\tcreateClient: (apiKey: string) => LoginClient;\n\t\tstore: CredentialStore;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t},\n): Promise<{ exitCode: number }> {\n\tconst session = await deps.client.auth.verifyEmailOtp({\n\t\temail: input.email,\n\t\tcode: input.otp,\n\t});\n\tif (session.error) {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(\"api_error\", session.error.message))}\\n`,\n\t\t);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\tconst authedClient = deps.createClient(session.data.token);\n\tconst apiKey = await authedClient.apiKeys.create({ label: \"CLI\" });\n\tif (apiKey.error) {\n\t\tdeps.stderr(\n\t\t\t`${JSON.stringify(errorEnvelope(\"api_error\", apiKey.error.message))}\\n`,\n\t\t);\n\t\treturn { exitCode: exitCodeFor(\"api_error\") };\n\t}\n\tawait deps.store.save({\n\t\tapiKey: apiKey.data.key,\n\t\tkeyId: apiKey.data.id,\n\t\tkeyLast4: apiKey.data.keyLast4,\n\t\taccountId: apiKey.data.accountId ?? session.data.accountId,\n\t\temail: input.email,\n\t\tstorage: \"secure\",\n\t});\n\tdeps.stdout(\n\t\t`${JSON.stringify({\n\t\t\tok: true,\n\t\t\taccount_id: apiKey.data.accountId ?? session.data.accountId,\n\t\t\tkey_id: apiKey.data.id,\n\t\t\tkey_last4: apiKey.data.keyLast4,\n\t\t\tis_new_account: apiKey.data.isNewAccount ?? session.data.isNewAccount,\n\t\t})}\\n`,\n\t);\n\treturn { exitCode: 0 };\n}\n","import { writeApiErrorSimple, writeHumanOrJson } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { success } from \"../ui.js\";\n\ntype DeleteResult =\n\t| { data: null; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: { message: string };\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype LogoutClient = {\n\tapiKeys: {\n\t\tdelete(\n\t\t\tkeyId: string,\n\t\t): DeleteResult | Promise<DeleteResult> | undefined | Promise<undefined>;\n\t};\n};\n\nexport async function runLogout(\n\tinput: { json?: boolean; revoke?: boolean },\n\tdeps: {\n\t\tstore: CredentialStore;\n\t\tclient: LogoutClient;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t\toutputMode?: \"human\" | \"json\";\n\t},\n): Promise<{ exitCode: number }> {\n\tconst stored = await deps.store.read();\n\tlet revokeError: string | undefined;\n\tif (input.revoke && stored?.keyId) {\n\t\tconst result = await deps.client.apiKeys.delete(stored.keyId);\n\t\tif (result?.error) revokeError = result.error.message;\n\t}\n\tif (revokeError) {\n\t\treturn writeApiErrorSimple(deps, revokeError);\n\t}\n\tawait deps.store.clear();\n\twriteHumanOrJson(deps, success(\"Logged out.\"), { ok: true });\n\treturn { exitCode: 0 };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { stat } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiError,\n\twriteAuthError,\n\twriteError,\n\twriteResult,\n} from \"../fmt.js\";\nimport {\n\ttype ParsedDropOptions,\n\tparseDropOptions,\n\ttype RawDropOptions,\n} from \"../options.js\";\nimport type { ApiErrorDetails } from \"../output.js\";\nimport { createSpinner, shouldSpin } from \"../spinner.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { readJsonObjectFile } from \"./json_body.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| {\n\t\t\tdata: null;\n\t\t\terror: ApiErrorDetails;\n\t\t\theaders?: Record<string, string>;\n\t };\n\ntype DropData = { url: string; [key: string]: unknown };\n\ntype ManifestFile = {\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n};\n\ntype PreparedResult = {\n\tkind: \"staged\";\n\tmanifest: { files: ManifestFile[]; entry?: string | null };\n\toptions: Record<string, unknown>;\n\tmetadata?: Record<string, unknown>;\n};\n\ntype PublishClient = {\n\tpublish(\n\t\tinput: string,\n\t\toptions: ParsedDropOptions,\n\t): Promise<SdkResult<DropData>>;\n\tprepare?(input: string, options: ParsedDropOptions): Promise<PreparedResult>;\n\tdrops: {\n\t\tcreateRaw(\n\t\t\tbody: unknown,\n\t\t\toptions?: { idempotencyKey?: string },\n\t\t): Promise<SdkResult<DropData>>;\n\t};\n};\n\ntype PublishOptions = RawDropOptions & {\n\tdryRun?: boolean;\n\tfromJson?: string;\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tapiKey?: string;\n};\n\ntype PublishDeps = {\n\tstore: CredentialStore;\n\tclient: PublishClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\treadJsonObject?: (path: string) => Promise<Record<string, unknown>>;\n\toutputMode?: \"human\" | \"json\";\n};\n\nconst MAX_BUNDLE_FILE_COUNT = 200;\n\nexport async function runPublish(\n\tinput: string | string[] | undefined,\n\traw: PublishOptions,\n\tdeps: PublishDeps,\n): Promise<{ exitCode: number }> {\n\tconst credential = await resolveCredential({\n\t\t...((raw.apiKey ?? deps.apiKey)\n\t\t\t? { apiKey: raw.apiKey ?? deps.apiKey }\n\t\t\t: {}),\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tif (!credential) {\n\t\treturn writeAuthError(deps);\n\t}\n\n\tif (raw.dryRun) {\n\t\treturn handlePublishDryRun(input, raw, deps);\n\t}\n\n\tconst singleInput = Array.isArray(input) ? input[0] : input;\n\tconst spin = shouldSpin(deps.outputMode)\n\t\t? createSpinner(\"Publishing…\", deps.stderr)\n\t\t: undefined;\n\ttry {\n\t\tif (raw.fromJson && singleInput) {\n\t\t\tthrow new Error(\"Use either <input> or --from-json, not both.\");\n\t\t}\n\t\tconst options = withPublishIdempotency(await parseDropOptions(raw));\n\t\tconst result = raw.fromJson\n\t\t\t? await deps.client.drops.createRaw(\n\t\t\t\t\tawait (deps.readJsonObject ?? readJsonObjectFile)(raw.fromJson),\n\t\t\t\t\toptions.idempotencyKey\n\t\t\t\t\t\t? { idempotencyKey: options.idempotencyKey }\n\t\t\t\t\t\t: {},\n\t\t\t\t)\n\t\t\t: singleInput\n\t\t\t\t? await deps.client.publish(singleInput, options)\n\t\t\t\t: (() => {\n\t\t\t\t\t\tthrow new Error(\"Publish requires <input> or --from-json.\");\n\t\t\t\t\t})();\n\t\tif (result.error) {\n\t\t\tspin?.fail();\n\t\t\treturn writeApiError(deps, result.error);\n\t\t}\n\t\tspin?.stop();\n\t\tif (raw.url) deps.stdout(`${result.data.url}\\n`);\n\t\telse writeResult(deps, result.data.url, \"Published\", result.data);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Publish failed.\";\n\t\tspin?.fail();\n\t\treturn writeError(deps, \"invalid_usage\", message);\n\t}\n}\n\nasync function handlePublishDryRun(\n\tinput: string | string[] | undefined,\n\traw: PublishOptions,\n\tdeps: PublishDeps,\n): Promise<{ exitCode: number }> {\n\tif (raw.url) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"--url and --dry-run cannot be combined.\",\n\t\t\t\"Remove --url; dry-run outputs JSON describing what would be published.\",\n\t\t);\n\t}\n\ttry {\n\t\tif (raw.fromJson) {\n\t\t\tif (input)\n\t\t\t\tthrow new Error(\"Use either <input> or --from-json, not both.\");\n\t\t\tconst body = await (deps.readJsonObject ?? readJsonObjectFile)(\n\t\t\t\traw.fromJson,\n\t\t\t);\n\t\t\tdeps.stdout(\n\t\t\t\t`${JSON.stringify({ dryRun: true, kind: \"raw_json\", endpoint: \"POST /drops\", body }, null, 2)}\\n`,\n\t\t\t);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tif (!input || (Array.isArray(input) && input.length === 0)) {\n\t\t\tthrow new Error(\"Publish requires <input> or --from-json.\");\n\t\t}\n\n\t\tconst options = await parseDropOptions(raw);\n\n\t\tif (Array.isArray(input)) {\n\t\t\treturn dryRunMultiFile(input, options, deps);\n\t\t}\n\n\t\tif (!deps.client.prepare) {\n\t\t\tthrow new Error(\"Client does not support dry-run.\");\n\t\t}\n\t\tconst prepared = await deps.client.prepare(input, options);\n\t\tconst output = formatDryRunOutput(prepared);\n\t\tvalidateDryRunOutput(output);\n\t\tdeps.stdout(`${JSON.stringify(output, null, 2)}\\n`);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst code = isFileSystemError(error)\n\t\t\t? \"local_input_error\"\n\t\t\t: \"invalid_usage\";\n\t\tconst message = error instanceof Error ? error.message : \"Dry-run failed.\";\n\t\treturn writeError(deps, code, message);\n\t}\n}\n\nasync function dryRunMultiFile(\n\tinputs: string[],\n\toptions: ParsedDropOptions,\n\tdeps: PublishDeps,\n): Promise<{ exitCode: number }> {\n\tconst files: ManifestFile[] = [];\n\tfor (const filePath of inputs) {\n\t\tlet info: Awaited<ReturnType<typeof stat>>;\n\t\ttry {\n\t\t\tinfo = await stat(filePath);\n\t\t} catch {\n\t\t\treturn writeError(\n\t\t\t\tdeps,\n\t\t\t\t\"local_input_error\",\n\t\t\t\t`File not found: ${filePath}`,\n\t\t\t);\n\t\t}\n\t\tif (info.isDirectory()) {\n\t\t\treturn writeError(\n\t\t\t\tdeps,\n\t\t\t\t\"local_input_error\",\n\t\t\t\t`Cannot mix directories with multiple file arguments. Use a single folder instead: dropthis publish ${filePath}`,\n\t\t\t);\n\t\t}\n\t\tfiles.push({\n\t\t\tpath: basename(filePath),\n\t\t\tcontentType: mimeForPath(filePath),\n\t\t\tsizeBytes: info.size,\n\t\t});\n\t}\n\n\tif (files.length > MAX_BUNDLE_FILE_COUNT) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"local_input_error\",\n\t\t\t`Bundle contains ${files.length} files, exceeding the maximum of ${MAX_BUNDLE_FILE_COUNT}.`,\n\t\t);\n\t}\n\n\tconst entry =\n\t\toptions.entry ??\n\t\tfiles.find((f) => f.path === \"index.html\")?.path ??\n\t\tfiles[0]?.path ??\n\t\tnull;\n\tconst totalBytes = files.reduce((sum, f) => sum + f.sizeBytes, 0);\n\tconst output = {\n\t\tdryRun: true as const,\n\t\tkind: \"staged\" as const,\n\t\tmanifest: { files, entry },\n\t\toptions: dryRunOptionsBody(options),\n\t\ttotalBytes,\n\t};\n\n\tdeps.stdout(`${JSON.stringify(output, null, 2)}\\n`);\n\treturn { exitCode: 0 };\n}\n\nfunction formatDryRunOutput(prepared: PreparedResult): Record<string, unknown> {\n\tconst totalBytes = prepared.manifest.files.reduce(\n\t\t(sum, f) => sum + f.sizeBytes,\n\t\t0,\n\t);\n\treturn {\n\t\tdryRun: true,\n\t\tkind: \"staged\",\n\t\tmanifest: {\n\t\t\tfiles: prepared.manifest.files,\n\t\t\tentry: prepared.manifest.entry ?? null,\n\t\t},\n\t\toptions: prepared.options,\n\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\ttotalBytes,\n\t};\n}\n\nfunction validateDryRunOutput(output: Record<string, unknown>): void {\n\tif (output.kind !== \"staged\") return;\n\tconst manifest = output.manifest as {\n\t\tfiles: ManifestFile[];\n\t};\n\tif (manifest.files.length > MAX_BUNDLE_FILE_COUNT) {\n\t\tthrow Object.assign(\n\t\t\tnew Error(\n\t\t\t\t`Bundle contains ${manifest.files.length} files, exceeding the maximum of ${MAX_BUNDLE_FILE_COUNT}.`,\n\t\t\t),\n\t\t\t{ code: \"ELIMIT\" },\n\t\t);\n\t}\n}\n\nfunction dryRunOptionsBody(\n\toptions: ParsedDropOptions,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\tif (options.title) result.title = options.title;\n\tif (options.visibility) result.visibility = options.visibility;\n\tif (options.password !== undefined) result.password = options.password;\n\tif (options.noindex !== undefined) result.noindex = options.noindex;\n\tif (options.expiresAt) result.expires_at = options.expiresAt;\n\treturn result;\n}\n\nfunction mimeForPath(filePath: string): string {\n\tconst ext = extname(filePath).toLowerCase();\n\tconst types: Record<string, string> = {\n\t\t\".html\": \"text/html\",\n\t\t\".htm\": \"text/html\",\n\t\t\".css\": \"text/css\",\n\t\t\".js\": \"text/javascript\",\n\t\t\".mjs\": \"text/javascript\",\n\t\t\".json\": \"application/json\",\n\t\t\".xml\": \"application/xml\",\n\t\t\".svg\": \"image/svg+xml\",\n\t\t\".txt\": \"text/plain\",\n\t\t\".md\": \"text/markdown\",\n\t\t\".jpg\": \"image/jpeg\",\n\t\t\".jpeg\": \"image/jpeg\",\n\t\t\".png\": \"image/png\",\n\t\t\".gif\": \"image/gif\",\n\t\t\".webp\": \"image/webp\",\n\t\t\".ico\": \"image/x-icon\",\n\t\t\".avif\": \"image/avif\",\n\t\t\".pdf\": \"application/pdf\",\n\t\t\".zip\": \"application/zip\",\n\t\t\".woff\": \"font/woff\",\n\t\t\".woff2\": \"font/woff2\",\n\t\t\".ttf\": \"font/ttf\",\n\t\t\".mp4\": \"video/mp4\",\n\t\t\".webm\": \"video/webm\",\n\t};\n\treturn types[ext] ?? \"application/octet-stream\";\n}\n\nfunction isFileSystemError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn code === \"ENOENT\" || code === \"ENOTDIR\" || code === \"ELIMIT\";\n}\n\nfunction withPublishIdempotency(options: ParsedDropOptions): ParsedDropOptions {\n\treturn options.idempotencyKey\n\t\t? options\n\t\t: { ...options, idempotencyKey: `cli_pub_${randomUUID()}` };\n}\n","import pc from \"picocolors\";\nimport { symbols } from \"./ui.js\";\n\nconst frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\nexport type Spinner = {\n\tstop(): void;\n\tfail(): void;\n};\n\nexport function createSpinner(\n\tmessage: string,\n\tstderr: (value: string) => void,\n): Spinner {\n\tlet i = 0;\n\tconst timer = setInterval(() => {\n\t\tstderr(`\\r\\x1B[2K${pc.cyan(frames[i % frames.length])} ${message}`);\n\t\ti++;\n\t}, 80);\n\n\treturn {\n\t\tstop() {\n\t\t\tclearInterval(timer);\n\t\t\tstderr(\"\\r\\x1B[2K\");\n\t\t},\n\t\tfail() {\n\t\t\tclearInterval(timer);\n\t\t\tstderr(\"\\r\\x1B[2K\");\n\t\t},\n\t};\n}\n\nexport function shouldSpin(outputMode?: \"human\" | \"json\"): boolean {\n\treturn (\n\t\toutputMode === \"human\" && process.stderr.isTTY === true && !process.env.CI\n\t);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport async function readJsonObjectFile(\n\tpath: string,\n): Promise<Record<string, unknown>> {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(await readFile(path, \"utf8\"));\n\t} catch (error) {\n\t\tconst message =\n\t\t\terror instanceof Error ? error.message : \"Unknown parse error\";\n\t\tthrow new Error(`Invalid JSON body in ${path}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(\"JSON body must be an object.\");\n\t}\n\treturn parsed as Record<string, unknown>;\n}\n","import { randomUUID } from \"node:crypto\";\nimport { resolveCredential } from \"../auth.js\";\nimport {\n\twriteApiError,\n\twriteAuthError,\n\twriteError,\n\twriteResult,\n} from \"../fmt.js\";\nimport {\n\ttype ParsedDropOptions,\n\tparseDropOptions,\n\ttype RawDropOptions,\n} from \"../options.js\";\nimport type { ApiErrorDetails } from \"../output.js\";\nimport { createSpinner, shouldSpin } from \"../spinner.js\";\nimport type { CredentialStore } from \"../storage.js\";\nimport { readJsonObjectFile } from \"./json_body.js\";\n\ntype SdkResult<T> =\n\t| { data: T; error: null; headers?: Record<string, string> }\n\t| { data: null; error: ApiErrorDetails; headers?: Record<string, string> };\n\ntype DropData = { url: string; [key: string]: unknown };\ntype UpdateOptions = ParsedDropOptions & { ifRevision?: number };\n\ntype ManifestFile = {\n\tpath: string;\n\tcontentType: string;\n\tsizeBytes: number;\n};\n\ntype PreparedResult = {\n\tkind: \"staged\";\n\tmanifest: { files: ManifestFile[]; entry?: string | null };\n\toptions: Record<string, unknown>;\n\tmetadata?: Record<string, unknown>;\n};\n\ntype UpdateClient = {\n\tupdate(\n\t\ttarget: string,\n\t\tinputOrOptions: string | UpdateOptions,\n\t\toptions?: UpdateOptions,\n\t): Promise<SdkResult<DropData>>;\n\tprepare?(input: string, options: ParsedDropOptions): Promise<PreparedResult>;\n\tdeployments: {\n\t\tcreateRaw(\n\t\t\tdropId: string,\n\t\t\tbody: unknown,\n\t\t\toptions?: { idempotencyKey?: string; ifRevision?: number },\n\t\t): Promise<SdkResult<DropData>>;\n\t};\n};\n\ntype RawUpdateOptions = RawDropOptions & {\n\tdryRun?: boolean;\n\tifRevision?: number;\n\tfromJson?: string;\n\tjson?: boolean;\n\tquiet?: boolean;\n\turl?: boolean;\n\tapiKey?: string;\n};\n\ntype UpdateDeps = {\n\tstore: CredentialStore;\n\tclient: UpdateClient;\n\tapiKey?: string;\n\tenv: Record<string, string | undefined>;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\treadJsonObject?: (path: string) => Promise<Record<string, unknown>>;\n\toutputMode?: \"human\" | \"json\";\n};\n\nexport async function runUpdate(\n\ttarget: string,\n\tinput: string | undefined,\n\traw: RawUpdateOptions,\n\tdeps: UpdateDeps,\n): Promise<{ exitCode: number }> {\n\tconst credential = await resolveCredential({\n\t\t...((raw.apiKey ?? deps.apiKey)\n\t\t\t? { apiKey: raw.apiKey ?? deps.apiKey }\n\t\t\t: {}),\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tif (!credential) {\n\t\treturn writeAuthError(deps);\n\t}\n\n\tif (raw.dryRun) {\n\t\treturn handleUpdateDryRun(target, input, raw, deps);\n\t}\n\n\tconst spin = shouldSpin(deps.outputMode)\n\t\t? createSpinner(\"Updating…\", deps.stderr)\n\t\t: undefined;\n\ttry {\n\t\tassertDropId(target);\n\t\tif (raw.fromJson && input) {\n\t\t\tthrow new Error(\"Use either [input] or --from-json, not both.\");\n\t\t}\n\t\tconst parsed = await parseDropOptions(raw);\n\t\tconst revisionOptions =\n\t\t\traw.ifRevision !== undefined\n\t\t\t\t? { ifRevision: Number(raw.ifRevision) }\n\t\t\t\t: {};\n\t\tconst result = raw.fromJson\n\t\t\t? await deps.client.deployments.createRaw(\n\t\t\t\t\ttarget,\n\t\t\t\t\tawait (deps.readJsonObject ?? readJsonObjectFile)(raw.fromJson),\n\t\t\t\t\twithUpdateIdempotency({\n\t\t\t\t\t\t...revisionOptions,\n\t\t\t\t\t\t...(parsed.idempotencyKey\n\t\t\t\t\t\t\t? { idempotencyKey: parsed.idempotencyKey }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t: input\n\t\t\t\t? await deps.client.update(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\twithUpdateIdempotency({\n\t\t\t\t\t\t\t...parsed,\n\t\t\t\t\t\t\t...revisionOptions,\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t: await deps.client.update(target, parsed, revisionOptions);\n\t\tif (result.error) {\n\t\t\tspin?.fail();\n\t\t\treturn writeApiError(deps, result.error);\n\t\t}\n\t\tspin?.stop();\n\t\tif (raw.url) deps.stdout(`${result.data.url}\\n`);\n\t\telse writeResult(deps, result.data.url, \"Updated\", result.data);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : \"Update failed.\";\n\t\tspin?.fail();\n\t\treturn writeError(deps, \"invalid_usage\", message);\n\t}\n}\n\nasync function handleUpdateDryRun(\n\ttarget: string,\n\tinput: string | undefined,\n\traw: RawUpdateOptions,\n\tdeps: UpdateDeps,\n): Promise<{ exitCode: number }> {\n\tif (raw.url) {\n\t\treturn writeError(\n\t\t\tdeps,\n\t\t\t\"invalid_usage\",\n\t\t\t\"--url and --dry-run cannot be combined.\",\n\t\t\t\"Remove --url; dry-run outputs JSON describing what would be published.\",\n\t\t);\n\t}\n\ttry {\n\t\tassertDropId(target);\n\n\t\tif (raw.fromJson) {\n\t\t\tif (input)\n\t\t\t\tthrow new Error(\"Use either [input] or --from-json, not both.\");\n\t\t\tconst body = await (deps.readJsonObject ?? readJsonObjectFile)(\n\t\t\t\traw.fromJson,\n\t\t\t);\n\t\t\tdeps.stdout(\n\t\t\t\t`${JSON.stringify({ dryRun: true, kind: \"raw_json\", endpoint: `POST /drops/${target}/deployments`, body }, null, 2)}\\n`,\n\t\t\t);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tconst options = await parseDropOptions(raw);\n\n\t\tif (!input) {\n\t\t\tconst fields: Record<string, unknown> = {};\n\t\t\tif (options.slug) fields.slug = options.slug;\n\t\t\tif (options.title) fields.title = options.title;\n\t\t\tif (options.visibility) fields.visibility = options.visibility;\n\t\t\tif (options.password !== undefined) fields.password = options.password;\n\t\t\tif (options.noindex !== undefined) fields.noindex = options.noindex;\n\t\t\tif (options.expiresAt) fields.expires_at = options.expiresAt;\n\t\t\tif (options.metadata) fields.metadata = options.metadata;\n\t\t\tdeps.stdout(\n\t\t\t\t`${JSON.stringify({ dryRun: true, kind: \"options_update\", target, fields }, null, 2)}\\n`,\n\t\t\t);\n\t\t\treturn { exitCode: 0 };\n\t\t}\n\n\t\tif (!deps.client.prepare) {\n\t\t\tthrow new Error(\"Client does not support dry-run.\");\n\t\t}\n\t\tconst prepared = await deps.client.prepare(input, options);\n\t\tconst output = formatUpdateDryRun(target, prepared);\n\t\tvalidateDryRunFileCount(output);\n\t\tdeps.stdout(`${JSON.stringify(output, null, 2)}\\n`);\n\t\treturn { exitCode: 0 };\n\t} catch (error) {\n\t\tconst code = isFileSystemError(error)\n\t\t\t? \"local_input_error\"\n\t\t\t: \"invalid_usage\";\n\t\tconst message = error instanceof Error ? error.message : \"Dry-run failed.\";\n\t\treturn writeError(deps, code, message);\n\t}\n}\n\nconst MAX_BUNDLE_FILE_COUNT = 200;\n\nfunction formatUpdateDryRun(\n\ttarget: string,\n\tprepared: PreparedResult,\n): Record<string, unknown> {\n\tconst totalBytes = prepared.manifest.files.reduce(\n\t\t(sum, f) => sum + f.sizeBytes,\n\t\t0,\n\t);\n\treturn {\n\t\tdryRun: true,\n\t\tkind: \"staged\",\n\t\ttarget,\n\t\tmanifest: {\n\t\t\tfiles: prepared.manifest.files,\n\t\t\tentry: prepared.manifest.entry ?? null,\n\t\t},\n\t\toptions: prepared.options,\n\t\t...(prepared.metadata ? { metadata: prepared.metadata } : {}),\n\t\ttotalBytes,\n\t};\n}\n\nfunction validateDryRunFileCount(output: Record<string, unknown>): void {\n\tif (output.kind !== \"staged\") return;\n\tconst manifest = output.manifest as { files: ManifestFile[] };\n\tif (manifest.files.length > MAX_BUNDLE_FILE_COUNT) {\n\t\tthrow Object.assign(\n\t\t\tnew Error(\n\t\t\t\t`Bundle contains ${manifest.files.length} files, exceeding the maximum of ${MAX_BUNDLE_FILE_COUNT}.`,\n\t\t\t),\n\t\t\t{ code: \"ELIMIT\" },\n\t\t);\n\t}\n}\n\nfunction isFileSystemError(error: unknown): boolean {\n\tif (!(error instanceof Error)) return false;\n\tconst code = (error as NodeJS.ErrnoException).code;\n\treturn code === \"ENOENT\" || code === \"ENOTDIR\";\n}\n\nfunction withUpdateIdempotency(options: UpdateOptions): UpdateOptions {\n\treturn options.idempotencyKey\n\t\t? options\n\t\t: { ...options, idempotencyKey: `cli_upd_${randomUUID()}` };\n}\n\nfunction assertDropId(target: string): void {\n\tif (!target.startsWith(\"drop_\")) {\n\t\tthrow new Error(\n\t\t\t\"Update target must be a drop id returned by --json output, for example drop_...\",\n\t\t);\n\t}\n}\n","import { maskKey, resolveCredential } from \"../auth.js\";\nimport { writeHumanOrJson, writeKv } from \"../fmt.js\";\nimport type { CredentialStore } from \"../storage.js\";\n\nexport async function runWhoami(\n\t_input: { json?: boolean },\n\tdeps: {\n\t\tstore: CredentialStore;\n\t\tenv: Record<string, string | undefined>;\n\t\tstdout: (value: string) => void;\n\t\tstderr: (value: string) => void;\n\t\toutputMode?: \"human\" | \"json\";\n\t},\n): Promise<{ exitCode: number }> {\n\tconst credential = await resolveCredential({\n\t\tenv: deps.env,\n\t\tstore: deps.store,\n\t});\n\tif (!credential) {\n\t\twriteHumanOrJson(deps, \"Not authenticated. Run dropthis login.\", {\n\t\t\tok: true,\n\t\t\tauthenticated: false,\n\t\t});\n\t\treturn { exitCode: 0 };\n\t}\n\tconst masked = maskKey(credential.apiKey);\n\tconst pairs: Array<[string, string]> = [];\n\tif (credential.email) pairs.push([\"Email\", credential.email]);\n\tpairs.push([\"Key\", masked]);\n\tpairs.push([\"Source\", credential.source]);\n\tif (credential.accountId) pairs.push([\"Account\", credential.accountId]);\n\n\tconst jsonEnvelope = {\n\t\tok: true,\n\t\tauthenticated: true,\n\t\tsource: credential.source,\n\t\tmasked_key: masked,\n\t\t...(credential.keyId ? { key_id: credential.keyId } : {}),\n\t\t...(credential.keyLast4 ? { key_last4: credential.keyLast4 } : {}),\n\t\t...(credential.accountId ? { account_id: credential.accountId } : {}),\n\t\t...(credential.email ? { email: credential.email } : {}),\n\t};\n\twriteKv(deps, pairs, jsonEnvelope);\n\treturn { exitCode: 0 };\n}\n","import { Dropthis } from \"@dropthis/node\";\nimport { createOutput, type Output } from \"./output.js\";\n\nexport type GlobalOptions = {\n\tapiKey?: string;\n\tapiUrl?: string;\n\tjson?: boolean;\n\tquiet?: boolean;\n};\n\nexport type CliContext = {\n\tenv: Record<string, string | undefined>;\n\tglobal: GlobalOptions;\n\toutput: Output;\n\tstdout: (value: string) => void;\n\tstderr: (value: string) => void;\n\tcreateClient: (apiKey?: string) => Dropthis;\n};\n\nexport function createContext(input: {\n\tglobal?: GlobalOptions;\n\tenv?: Record<string, string | undefined>;\n\tstdout?: (value: string) => void;\n\tstderr?: (value: string) => void;\n\tstdoutIsTTY?: boolean;\n}): CliContext {\n\tconst env = input.env ?? process.env;\n\tconst global = input.global ?? {};\n\treturn {\n\t\tenv,\n\t\tglobal,\n\t\toutput: createOutput({\n\t\t\t...(global.json !== undefined ? { json: global.json } : {}),\n\t\t\t...(global.quiet !== undefined ? { quiet: global.quiet } : {}),\n\t\t\tstdoutIsTTY: input.stdoutIsTTY ?? process.stdout.isTTY === true,\n\t\t\tenv,\n\t\t}),\n\t\tstdout: input.stdout ?? ((value) => process.stdout.write(value)),\n\t\tstderr: input.stderr ?? ((value) => process.stderr.write(value)),\n\t\tcreateClient(apiKey) {\n\t\t\tconst baseUrl = global.apiUrl ?? env.DROPTHIS_API_URL;\n\t\t\treturn new Dropthis({\n\t\t\t\t...(apiKey ? { apiKey } : {}),\n\t\t\t\t...(baseUrl ? { baseUrl } : {}),\n\t\t\t});\n\t\t},\n\t};\n}\n","import { chmod, mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Entry } from \"@napi-rs/keyring\";\n\nexport type StoredCredential = {\n\tapiKey: string;\n\tkeyId?: string;\n\tkeyLast4?: string;\n\taccountId?: string;\n\temail?: string;\n\tstorage: \"secure\" | \"insecure\";\n};\n\nexport interface CredentialStore {\n\tread(): Promise<StoredCredential | null>;\n\tsave(credential: StoredCredential): Promise<void>;\n\tclear(): Promise<void>;\n}\n\nexport type KeyringAdapter = {\n\tgetPassword(): string | null | undefined | Promise<string | null | undefined>;\n\tsetPassword(value: string): void | Promise<void>;\n\tdeletePassword(): void | Promise<void>;\n};\n\nexport class MemoryCredentialStore implements CredentialStore {\n\tprivate credential: StoredCredential | null = null;\n\n\tasync read(): Promise<StoredCredential | null> {\n\t\treturn this.credential;\n\t}\n\n\tasync save(credential: StoredCredential): Promise<void> {\n\t\tthis.credential = credential;\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tthis.credential = null;\n\t}\n}\n\nexport class InsecureFileCredentialStore implements CredentialStore {\n\tprivate readonly filePath: string;\n\n\tconstructor(options: { configDir?: string } = {}) {\n\t\tthis.filePath = credentialPath(options.configDir);\n\t}\n\n\tasync read(): Promise<StoredCredential | null> {\n\t\tconst value = await readJsonFile(this.filePath);\n\t\tif (!value) return null;\n\t\tif (typeof value.apiKey !== \"string\" || !value.apiKey) return null;\n\t\treturn { ...value, storage: \"insecure\" } as StoredCredential;\n\t}\n\n\tasync save(credential: StoredCredential): Promise<void> {\n\t\tawait writeCredentialFile(this.filePath, {\n\t\t\t...credential,\n\t\t\tstorage: \"insecure\",\n\t\t});\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait rm(this.filePath, { force: true });\n\t}\n}\n\nexport class KeyringCredentialStore implements CredentialStore {\n\tprivate readonly filePath: string;\n\tprivate readonly keyring: KeyringAdapter;\n\n\tconstructor(options: { configDir?: string; keyring?: KeyringAdapter } = {}) {\n\t\tthis.filePath = credentialPath(options.configDir);\n\t\tthis.keyring = options.keyring ?? defaultKeyringAdapter();\n\t}\n\n\tasync read(): Promise<StoredCredential | null> {\n\t\tconst metadata = await readJsonFile(this.filePath);\n\t\tif (!metadata) return null;\n\t\tconst apiKey = await this.keyring.getPassword();\n\t\tif (typeof apiKey !== \"string\" || !apiKey) return null;\n\t\treturn { ...metadata, apiKey, storage: \"secure\" } as StoredCredential;\n\t}\n\n\tasync save(credential: StoredCredential): Promise<void> {\n\t\tawait this.keyring.setPassword(credential.apiKey);\n\t\tconst { apiKey: _apiKey, ...metadata } = credential;\n\t\tawait writeCredentialFile(this.filePath, {\n\t\t\t...metadata,\n\t\t\tstorage: \"secure\",\n\t\t});\n\t}\n\n\tasync clear(): Promise<void> {\n\t\tawait this.keyring.deletePassword();\n\t\tawait rm(this.filePath, { force: true });\n\t}\n}\n\nexport function createCredentialStore(\n\toptions: { insecure?: boolean; configDir?: string } = {},\n): CredentialStore {\n\tif (options.insecure) return new InsecureFileCredentialStore(options);\n\treturn new KeyringCredentialStore(options);\n}\n\nfunction defaultKeyringAdapter(): KeyringAdapter {\n\tconst entry = new Entry(\"dropthis\", \"default\");\n\treturn {\n\t\tgetPassword: () => entry.getPassword(),\n\t\tsetPassword: (value) => entry.setPassword(value),\n\t\tdeletePassword: () => {\n\t\t\tentry.deletePassword();\n\t\t},\n\t};\n}\n\nfunction credentialPath(configDir?: string): string {\n\treturn join(\n\t\tconfigDir ?? join(homedir(), \".config\", \"dropthis\"),\n\t\t\"credentials.json\",\n\t);\n}\n\nasync function readJsonFile(\n\tpath: string,\n): Promise<Record<string, unknown> | null> {\n\ttry {\n\t\treturn JSON.parse(await readFile(path, \"utf8\")) as Record<string, unknown>;\n\t} catch (error) {\n\t\tif (\n\t\t\terror &&\n\t\t\ttypeof error === \"object\" &&\n\t\t\t\"code\" in error &&\n\t\t\terror.code === \"ENOENT\"\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function writeCredentialFile(\n\tpath: string,\n\tcredential: Record<string, unknown>,\n): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true });\n\tawait writeFile(path, `${JSON.stringify(credential, null, 2)}\\n`, {\n\t\tmode: 0o600,\n\t});\n\tawait chmod(path, 0o600);\n}\n","#!/usr/bin/env node\nimport { buildProgram } from \"./program.js\";\nimport { createCredentialStore } from \"./storage.js\";\n\nbuildProgram({ store: createCredentialStore() })\n\t.parseAsync(process.argv)\n\t.catch((error: unknown) => {\n\t\tconsole.error(error);\n\t\tprocess.exitCode = 1;\n\t});\n"],"mappings":"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","names":["import_picocolors","error","pc","pc","pc","hasCredential","prompts","hasCredential","listItems","error","prompts","import_promises","import_picocolors","pc","import_promises","error","error","import_node_crypto","error","isFileSystemError","MAX_BUNDLE_FILE_COUNT","import_promises","import_node_path","error","pc","deps","global","result","writeFile","join","error"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dropthis/cli",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Official CLI for Dropthis.",
5
5
  "license": "MIT",
6
6
  "repository": {