@ar.io/deploy 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,10 +2,28 @@
2
2
 
3
3
  `ario-deploy` is a Node.js command-line tool designed to streamline the deployment of web applications to the permaweb using Arweave. It uploads your build folder or a single file, creates Arweave manifests, and can optionally update ArNS (Ar.io Name System) records via ANT (Ar.io Name Token) with the transaction ID.
4
4
 
5
+ ## Quick Start
6
+
7
+ Deploy your app to Arweave in under a minute:
8
+
9
+ ```bash
10
+ # Install
11
+ npm install -g @ar.io/deploy
12
+
13
+ # Deploy (interactive — prompts for everything)
14
+ ario-deploy deploy
15
+
16
+ # Or one-liner with a Solana wallet + ArNS name
17
+ DEPLOY_KEY=<solana-base58-key> ario-deploy deploy --deploy-folder ./dist --arns-name myapp --sig-type solana
18
+ ```
19
+
20
+ Your app is now permanently live at `https://myapp.ar.io`.
21
+
5
22
  ## Table of Contents
6
23
 
7
24
  <!-- toc -->
8
25
 
26
+ - [Quick Start](#quick-start)
9
27
  - [Table of Contents](#table-of-contents)
10
28
  - [Features](#features)
11
29
  - [Installation](#installation)
@@ -18,6 +36,7 @@
18
36
  - [Package.json Scripts](#packagejson-scripts)
19
37
  - [GitHub Action](#github-action)
20
38
  - [CLI in GitHub Actions](#cli-in-github-actions)
39
+ - [Claude Code Integration](#claude-code-integration)
21
40
  - [Development](#development)
22
41
  - [Security & Best Practices](#security--best-practices)
23
42
  - [Troubleshooting](#troubleshooting)
@@ -64,41 +83,33 @@ yarn add --dev @ar.io/deploy
64
83
 
65
84
  ## Prerequisites
66
85
 
67
- 1. **For Arweave signer (default):** Encode your Arweave wallet key in base64 format and set it as a GitHub secret:
86
+ A deployment uses up to **two independent keys**:
68
87
 
69
- ```bash
70
- base64 -i wallet.json | pbcopy
71
- ```
88
+ - **Upload key** — pays for the upload. Any supported chain (`--wallet` / `--private-key`, or the `DEPLOY_KEY` env var; chain selected with `--sig-type`).
89
+ - **ArNS authority key** — only needed when updating ArNS. Always a **Solana** key that controls the ArNS name and signs the ANT record update (`--arns-wallet` / `--arns-private-key`, or the `ARNS_KEY` env var).
72
90
 
73
- 2. **For Ethereum/Polygon/KYVE signers:** Use your raw private key (no encoding needed) as the `DEPLOY_KEY`.
74
- 3. **For Solana signers:** Use a base58-encoded secret key (the "export private key" format) as the `DEPLOY_KEY`, or a `solana-keygen` `id.json` byte-array wallet file via `--wallet`.
75
- 4. Ensure that the secret name for the encoded wallet or private key is `DEPLOY_KEY`.
91
+ They can be the same Solana wallet or two different wallets provide each explicitly.
76
92
 
77
- ⚠️ **Important:** Use a dedicated wallet for deployments to minimize security risks. Ensure your wallet has sufficient Turbo Credits for uploads.
93
+ ### Upload key (`DEPLOY_KEY`)
78
94
 
79
- > **ArNS updates require a Solana signer.** ArNS/ANT records now live on Solana programs, so any deployment that updates ArNS (`--use-arns` / `--arns-name`) must use `--sig-type solana`. Uploads alone can use any supported signer.
95
+ 1. **Arweave signer (default):** Encode your Arweave wallet key in base64 and set it as `DEPLOY_KEY`:
80
96
 
81
- ## Commands
97
+ ```bash
98
+ base64 -i wallet.json | pbcopy
99
+ ```
82
100
 
83
- ### Interactive Mode (Easiest)
101
+ 2. **Ethereum/Polygon/KYVE signers:** Use your raw private key (no encoding needed) as `DEPLOY_KEY`.
102
+ 3. **Solana signer:** Use a base58-encoded secret key as `DEPLOY_KEY`, or a `solana-keygen` `id.json` byte-array wallet file via `--wallet`.
84
103
 
85
- **Command Menu:**
104
+ ### ArNS authority key (`ARNS_KEY`)
86
105
 
87
- Simply run the CLI for an interactive command selector:
106
+ Set a base58-encoded **Solana** secret key as `ARNS_KEY`, or pass a `solana-keygen` `id.json` file via `--arns-wallet` (or a base58 string via `--arns-private-key`). This key must control the ArNS name being updated.
88
107
 
89
- ```bash
90
- ario-deploy
91
- # or explicitly
92
- ario-deploy interactive
93
- ```
94
-
95
- This shows a menu with options:
108
+ ⚠️ **Important:** Use dedicated wallets for deployments to minimize security risks. Ensure your upload wallet has sufficient Turbo Credits for uploads.
96
109
 
97
- - **Deploy to Permaweb** - Start the deployment wizard
98
- - **Show Help** - Display help information
99
- - **Exit** - Exit the CLI
110
+ ## Commands
100
111
 
101
- **Interactive Deploy (Guided):**
112
+ ### Interactive Mode (Easiest)
102
113
 
103
114
  Run the deploy command without arguments to be guided through all deployment options:
104
115
 
@@ -106,14 +117,20 @@ Run the deploy command without arguments to be guided through all deployment opt
106
117
  ario-deploy deploy
107
118
  ```
108
119
 
109
- This uploads to the permaweb by default. Use `--use-arns` or `--arns-name` to run the guided ArNS update flow, which will prompt you for:
120
+ When ArNS details aren't supplied via flags, `deploy` asks whether you want to
121
+ update an ArNS name (defaulting to yes) and, if so, prompts for the details. It
122
+ will guide you through:
110
123
 
111
- - ArNS name
124
+ - Whether to update an ArNS name (and which one)
112
125
  - Wallet method (file, string, or environment variable)
113
- - Signer type (Arweave, Ethereum, Polygon, KYVE, Solana)
114
126
  - What to deploy (folder or file)
115
127
  - Advanced options (optional: undername, TTL, Solana cluster)
116
128
 
129
+ Pass `--arns-name` (or `--use-arns`) to skip the ArNS confirmation, or use the
130
+ `upload` command for an upload-only run. In a non-interactive environment (CI,
131
+ or no TTY) `deploy` does not prompt — supply everything via flags or
132
+ `DEPLOY_KEY`.
133
+
117
134
  ### Direct Commands
118
135
 
119
136
  Use flags for faster, scriptable deployments:
@@ -122,8 +139,8 @@ Use flags for faster, scriptable deployments:
122
139
  # Basic deployment with wallet file
123
140
  ario-deploy deploy --wallet ./wallet.json
124
141
 
125
- # Deployment with ArNS update (ArNS requires a Solana signer)
126
- ario-deploy deploy --use-arns --arns-name my-app --sig-type solana --wallet ./id.json
142
+ # Deployment with ArNS update (separate upload key + Solana ArNS authority key)
143
+ ario-deploy deploy --use-arns --arns-name my-app --wallet ./wallet.json --arns-wallet ./arns-id.json
127
144
  ```
128
145
 
129
146
  Deploy using private key directly:
@@ -163,23 +180,23 @@ DEPLOY_KEY=$(base64 -i wallet.json) ario-deploy upload --deploy-folder ./dist
163
180
 
164
181
  ### Advanced Usage
165
182
 
166
- Deploy to an undername (subdomain) — ArNS, so a Solana signer is required:
183
+ Deploy to an undername (subdomain) — the ArNS authority key is a Solana wallet:
167
184
 
168
185
  ```bash
169
- ario-deploy deploy --use-arns --arns-name my-app --sig-type solana --wallet ./id.json --undername staging
186
+ ario-deploy deploy --use-arns --arns-name my-app --wallet ./wallet.json --arns-wallet ./arns-id.json --undername staging
170
187
  ```
171
188
 
172
189
  Deploy with a custom TTL:
173
190
 
174
191
  ```bash
175
- ario-deploy deploy --use-arns --arns-name my-app --sig-type solana --wallet ./id.json --ttl-seconds 7200
192
+ ario-deploy deploy --use-arns --arns-name my-app --wallet ./wallet.json --arns-wallet ./arns-id.json --ttl-seconds 7200
176
193
  ```
177
194
 
178
195
  Update ArNS on devnet (or against a custom RPC):
179
196
 
180
197
  ```bash
181
- ario-deploy deploy --use-arns --arns-name my-app --sig-type solana --wallet ./id.json --cluster devnet
182
- ario-deploy deploy --use-arns --arns-name my-app --sig-type solana --wallet ./id.json --rpc-url https://my-rpc.example.com
198
+ ario-deploy deploy --use-arns --arns-name my-app --wallet ./wallet.json --arns-wallet ./arns-id.json --cluster devnet
199
+ ario-deploy deploy --use-arns --arns-name my-app --wallet ./wallet.json --arns-wallet ./arns-id.json --rpc-url https://my-rpc.example.com
183
200
  ```
184
201
 
185
202
  Upload using an Ethereum wallet (file):
@@ -256,17 +273,25 @@ ario-deploy upload --wallet ./wallet.json --deploy-folder ./dist --uploader http
256
273
 
257
274
  **`deploy`** (upload by default, optional ArNS update):
258
275
 
259
- - `--use-arns`: Update an ArNS/ANT record after upload. **Requires `--sig-type solana`.**
260
- - `--arns-name, -n`: The ArNS name to update. Required when using `--use-arns`; also implies ArNS mode for backwards compatibility.
276
+ - `--use-arns`: Update an ArNS/ANT record after upload. When ArNS details aren't supplied and you're in a TTY, `deploy` asks by default.
277
+ - `--arns-name, -n`: The ArNS name to update. Required when using `--use-arns`; also implies ArNS mode.
261
278
  - `--cluster, -p`: Solana cluster for ArNS updates. Choices: `mainnet`, `devnet`. Default: `mainnet`
262
279
  - `--rpc-url`: Optional Solana RPC URL override for ArNS updates
263
280
  - `--deploy-folder, -d`: Folder to deploy. Default: `./dist`
264
281
  - `--deploy-file, -f`: Deploy a single file instead of a folder
265
282
  - `--undername, -u`: ANT undername to update. Default: `@`
266
283
  - `--ttl-seconds, -t`: TTL in seconds for the ANT record (60-86400). Default: `60`
267
- - `--sig-type, -s`: Signer type for deployment. Choices: `arweave`, `ethereum`, `polygon`, `kyve`, `solana`. Default: `arweave`
268
- - `--wallet, -w`: Path to wallet file (JWK for Arweave, private key for Ethereum/Polygon/KYVE, `solana-keygen` `id.json` for Solana)
269
- - `--private-key, -k`: Private key string (alternative to `--wallet`). JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana
284
+
285
+ Upload key (pays for the upload):
286
+
287
+ - `--sig-type, -s`: Signer type for the upload key. Choices: `arweave`, `ethereum`, `polygon`, `kyve`, `solana`. Default: `arweave`
288
+ - `--wallet, -w`: Path to the upload wallet file (JWK for Arweave, private key for Ethereum/Polygon/KYVE, `solana-keygen` `id.json` for Solana). Falls back to `DEPLOY_KEY`.
289
+ - `--private-key, -k`: Upload private-key string (alternative to `--wallet`). JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana.
290
+
291
+ ArNS authority key (controls the name, signs the update — always Solana):
292
+
293
+ - `--arns-wallet`: Path to the Solana `solana-keygen` `id.json` wallet that controls the ArNS name. Falls back to `ARNS_KEY`.
294
+ - `--arns-private-key`: Base58 Solana secret key for the ArNS authority (alternative to `--arns-wallet`). Falls back to `ARNS_KEY`.
270
295
  - `--on-demand`: Enable on-demand payment with specified token. Choices: `ario`, `base-eth`
271
296
  - `--max-token-amount`: Maximum token amount for on-demand payment (used with `--on-demand`)
272
297
  - `--no-dedupe`: Disable deduplication (do not cache or reuse previous uploads)
@@ -320,24 +345,24 @@ Add deployment scripts to your `package.json`:
320
345
  {
321
346
  "scripts": {
322
347
  "build": "vite build",
323
- "deploy": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --sig-type solana",
324
- "deploy:staging": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --sig-type solana --undername staging",
325
- "deploy:devnet": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --sig-type solana --cluster devnet",
326
- "deploy:on-demand": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --sig-type solana --on-demand ario --max-token-amount 1.5"
348
+ "deploy": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME>",
349
+ "deploy:staging": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --undername staging",
350
+ "deploy:devnet": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --cluster devnet",
351
+ "deploy:on-demand": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --on-demand ario --max-token-amount 1.5"
327
352
  }
328
353
  }
329
354
  ```
330
355
 
331
- Then deploy with:
356
+ These read the upload key from `DEPLOY_KEY` and the Solana ArNS authority key from `ARNS_KEY`. Deploy with:
332
357
 
333
358
  ```bash
334
- DEPLOY_KEY=$(base64 -i wallet.json) pnpm deploy
359
+ DEPLOY_KEY=$(base64 -i wallet.json) ARNS_KEY=<base58-solana-secret-key> pnpm deploy
335
360
  ```
336
361
 
337
362
  Or with on-demand payment:
338
363
 
339
364
  ```bash
340
- DEPLOY_KEY=$(base64 -i wallet.json) pnpm deploy:on-demand
365
+ DEPLOY_KEY=$(base64 -i wallet.json) ARNS_KEY=<base58-solana-secret-key> pnpm deploy:on-demand
341
366
  ```
342
367
 
343
368
  ## GitHub Action
@@ -349,10 +374,10 @@ The easiest way to integrate ario-deploy into your CI/CD pipeline is using our o
349
374
  ```yaml
350
375
  - uses: ar-io/ar-io-deploy@v1
351
376
  with:
352
- deploy-key: ${{ secrets.DEPLOY_KEY }}
377
+ deploy-key: ${{ secrets.DEPLOY_KEY }} # upload key (pays for the upload)
378
+ arns-key: ${{ secrets.ARNS_KEY }} # Solana ArNS authority key
353
379
  arns-name: myapp
354
380
  deploy-folder: ./dist
355
- sig-type: solana # ArNS updates require a Solana signer
356
381
  ```
357
382
 
358
383
  ### PR Preview Deployments
@@ -387,8 +412,8 @@ jobs:
387
412
  uses: ar-io/ar-io-deploy@v1
388
413
  with:
389
414
  deploy-key: ${{ secrets.DEPLOY_KEY }}
415
+ arns-key: ${{ secrets.ARNS_KEY }}
390
416
  arns-name: myapp
391
- sig-type: solana
392
417
  preview: 'true'
393
418
  github-token: ${{ secrets.GITHUB_TOKEN }}
394
419
  deploy-folder: ./dist
@@ -432,8 +457,8 @@ jobs:
432
457
  uses: ar-io/ar-io-deploy@v1
433
458
  with:
434
459
  deploy-key: ${{ secrets.DEPLOY_KEY }}
460
+ arns-key: ${{ secrets.ARNS_KEY }}
435
461
  arns-name: myapp
436
- sig-type: solana
437
462
  deploy-folder: ./dist
438
463
  ```
439
464
 
@@ -444,8 +469,8 @@ jobs:
444
469
  uses: ar-io/ar-io-deploy@v1
445
470
  with:
446
471
  deploy-key: ${{ secrets.DEPLOY_KEY }}
472
+ arns-key: ${{ secrets.ARNS_KEY }}
447
473
  arns-name: myapp
448
- sig-type: solana
449
474
  deploy-folder: ./dist
450
475
  on-demand: ario
451
476
  max-token-amount: '2.0'
@@ -453,16 +478,16 @@ jobs:
453
478
 
454
479
  ### Updating ArNS (Solana)
455
480
 
456
- ArNS updates run against the Solana ARIO programs, so set `sig-type: solana` and provide a Solana `DEPLOY_KEY` (base58 secret key). Use `cluster` to target `mainnet` (default) or `devnet`, and `rpc-url` for a custom RPC endpoint.
481
+ ArNS updates run against the Solana ARIO programs. Provide the Solana ArNS authority key via `arns-key` (a base58 Solana secret key); the upload is still paid for by `deploy-key`. Use `cluster` to target `mainnet` (default) or `devnet`, and `rpc-url` for a custom RPC endpoint.
457
482
 
458
483
  ```yaml
459
484
  - name: Deploy and update ArNS
460
485
  uses: ar-io/ar-io-deploy@v1
461
486
  with:
462
- deploy-key: ${{ secrets.DEPLOY_KEY }}
487
+ deploy-key: ${{ secrets.DEPLOY_KEY }} # upload key
488
+ arns-key: ${{ secrets.ARNS_KEY }} # Solana ArNS authority key
463
489
  arns-name: myapp
464
490
  deploy-folder: ./dist
465
- sig-type: solana
466
491
  cluster: mainnet
467
492
  ```
468
493
 
@@ -557,9 +582,11 @@ jobs:
557
582
  - run: pnpm build
558
583
 
559
584
  - name: Deploy with ARIO on-demand
560
- run: ario-deploy deploy --arns-name my-app --sig-type solana --on-demand ario --max-token-amount 2.0
585
+ run: ario-deploy deploy --arns-name my-app --on-demand ario --max-token-amount 2.0
561
586
  env:
562
- DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
587
+ DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # upload key (pays for the upload)
588
+ ARNS_KEY: ${{ secrets.ARNS_KEY }} # Solana ArNS authority key
589
+
563
590
 
564
591
  # Or upload with Ethereum and Base-ETH on-demand payment (upload only; ArNS requires Solana):
565
592
  # - name: Upload with Base-ETH on-demand
@@ -572,6 +599,37 @@ jobs:
572
599
  # DEPLOY_KEY: ${{ secrets.ETH_PRIVATE_KEY }}
573
600
  ```
574
601
 
602
+ ## Claude Code Integration
603
+
604
+ Use [Claude Code](https://claude.ai/code) to deploy your app with natural language. Just say "deploy to ar.io" and Claude handles the rest.
605
+
606
+ ### Add the Skill to Your Project
607
+
608
+ ```bash
609
+ mkdir -p .claude/skills
610
+ curl -o .claude/skills/deploy.md https://raw.githubusercontent.com/ar-io/ar-io-deploy/main/examples/claude-skill/deploy.md
611
+ ```
612
+
613
+ Then in Claude Code, say:
614
+
615
+ - "deploy to ar.io"
616
+ - "deploy my app to arweave"
617
+ - "set up CI/CD for ar.io deployment"
618
+
619
+ Claude will build your project, detect the output folder, and run the deploy with the right flags.
620
+
621
+ ### What the Skill Does
622
+
623
+ 1. **Detects your build folder** (`./dist`, `./build`, `./out`)
624
+ 2. **Checks for credentials** (`DEPLOY_KEY` env var or wallet file)
625
+ 3. **Installs `@ar.io/deploy`** if not already available
626
+ 4. **Runs the deployment** with appropriate flags
627
+ 5. **Reports results** — transaction ID, Arweave URL, ArNS URL
628
+
629
+ See [`examples/claude-skill/`](./examples/claude-skill/) for the full skill file and customization options.
630
+
631
+ ---
632
+
575
633
  ## Development
576
634
 
577
635
  ### Setup
package/bin/dev.js CHANGED
File without changes
package/bin/run.js CHANGED
File without changes
@@ -3,7 +3,7 @@ import { ARIO, SolanaANTWriteable } from '@ar.io/sdk';
3
3
  import { Command } from '@oclif/core';
4
4
  import ora from 'ora';
5
5
  import { deployFlagConfigs } from '../constants/flags.js';
6
- import { promptAdvancedOptions } from '../prompts/arns.js';
6
+ import { promptUpdateArns, promptAdvancedOptions } from '../prompts/arns.js';
7
7
  import { getWalletConfig } from '../prompts/wallet.js';
8
8
  import { c as chalk, r as runUploadWorkflow } from '../chunks/upload-workflow-DSS5FIa5.js';
9
9
  import { extractFlags, resolveConfig } from '../utils/config-resolver.js';
@@ -17,17 +17,35 @@ class Deploy extends Command {
17
17
  "<%= config.bin %> deploy --wallet ./wallet.json",
18
18
  "<%= config.bin %> deploy --wallet ./wallet.json --deploy-folder ./dist",
19
19
  "<%= config.bin %> deploy --wallet ./wallet.json --deploy-file ./dist/index.html",
20
- "<%= config.bin %> deploy --wallet ./id.json --sig-type solana --use-arns --arns-name my-app",
21
- "<%= config.bin %> deploy --wallet ./id.json --sig-type solana --use-arns --arns-name my-app --undername staging"
20
+ "<%= config.bin %> deploy --wallet ./wallet.json --use-arns --arns-name my-app --arns-wallet ./arns-id.json",
21
+ "<%= config.bin %> deploy --wallet ./wallet.json --use-arns --arns-name my-app --arns-wallet ./arns-id.json --undername staging"
22
22
  ];
23
23
  static flags = extractFlags(deployFlagConfigs);
24
24
  async run() {
25
25
  try {
26
26
  const { flags } = await this.parse(Deploy);
27
- const useArns = Boolean(flags["use-arns"] || flags["arns-name"]);
28
- const interactive = useArns && !flags["arns-name"];
27
+ const hasArnsName = Boolean(flags["arns-name"]);
28
+ const explicitUseArns = Boolean(flags["use-arns"]);
29
+ const canPrompt = Boolean(process.stdout.isTTY) && !process.env.CI;
30
+ let useArns = hasArnsName || explicitUseArns;
31
+ let interactive = false;
32
+ if (hasArnsName) {
33
+ interactive = false;
34
+ } else if (explicitUseArns) {
35
+ interactive = canPrompt;
36
+ } else if (canPrompt) {
37
+ useArns = await promptUpdateArns();
38
+ interactive = useArns;
39
+ }
29
40
  if (interactive) {
30
- this.log(chalk.bold(chalk.cyan("\nInteractive ArNS Deployment Mode\n")));
41
+ this.log(chalk.bold(chalk.cyan("\nInteractive Deployment Mode\n")));
42
+ if (useArns) {
43
+ this.log(
44
+ chalk.dim(
45
+ "Two keys are used:\n • Upload key — pays for the upload (any supported chain)\n • ArNS authority key — a Solana key that controls the name and signs the update\n"
46
+ )
47
+ );
48
+ }
31
49
  }
32
50
  const baseConfig = await resolveConfig(deployFlagConfigs, flags, {
33
51
  interactive
@@ -36,14 +54,35 @@ class Deploy extends Command {
36
54
  privateKey: baseConfig["private-key"],
37
55
  wallet: baseConfig.wallet
38
56
  };
39
- const shouldPromptWallet = !baseConfig.wallet && !baseConfig["private-key"] && (interactive || !process.env.DEPLOY_KEY?.trim());
57
+ const shouldPromptWallet = canPrompt && !baseConfig.wallet && !baseConfig["private-key"] && (interactive || !process.env.DEPLOY_KEY?.trim());
40
58
  if (shouldPromptWallet) {
41
- const config = await getWalletConfig();
59
+ const config = await getWalletConfig({
60
+ envVar: "DEPLOY_KEY",
61
+ label: "upload key",
62
+ purpose: "pays for the upload"
63
+ });
42
64
  walletConfig = {
43
65
  privateKey: config.privateKey,
44
66
  wallet: config.wallet
45
67
  };
46
68
  }
69
+ let arnsKeyConfig = {
70
+ privateKey: baseConfig["arns-private-key"],
71
+ wallet: baseConfig["arns-wallet"]
72
+ };
73
+ const shouldPromptArnsKey = canPrompt && useArns && !arnsKeyConfig.wallet && !arnsKeyConfig.privateKey && (interactive || !process.env.ARNS_KEY?.trim());
74
+ if (shouldPromptArnsKey) {
75
+ const config = await getWalletConfig({
76
+ envVar: "ARNS_KEY",
77
+ fileDefault: "./arns-wallet.json",
78
+ label: "ArNS authority key",
79
+ purpose: "controls the ArNS name and signs the record update"
80
+ });
81
+ arnsKeyConfig = {
82
+ privateKey: config.privateKey,
83
+ wallet: config.wallet
84
+ };
85
+ }
47
86
  let advancedOptions;
48
87
  if (interactive) {
49
88
  const options = await promptAdvancedOptions();
@@ -52,6 +91,8 @@ class Deploy extends Command {
52
91
  const effectiveCacheMaxEntries = baseConfig["no-dedupe"] ? 0 : baseConfig["dedupe-cache-max-entries"];
53
92
  const deployConfig = {
54
93
  "arns-name": baseConfig["arns-name"],
94
+ "arns-private-key": arnsKeyConfig.privateKey,
95
+ "arns-wallet": arnsKeyConfig.wallet,
55
96
  cluster: advancedOptions?.cluster || baseConfig.cluster,
56
97
  "dedupe-cache-max-entries": effectiveCacheMaxEntries,
57
98
  "deploy-file": baseConfig["deploy-file"],
@@ -71,27 +112,37 @@ class Deploy extends Command {
71
112
  if (interactive) {
72
113
  this.log("");
73
114
  }
74
- if (deployConfig["use-arns"] && deployConfig["sig-type"] !== "solana") {
75
- this.error("ArNS updates require --sig-type solana (ArNS records live on Solana)");
76
- }
77
- let deployKey;
78
- if (deployConfig.wallet) {
79
- const walletPath = expandPath(deployConfig.wallet);
80
- if (!fs.existsSync(walletPath)) {
81
- this.error(`Wallet file [${deployConfig.wallet}] does not exist`);
115
+ const resolveKey = (key) => {
116
+ if (key.walletPath) {
117
+ const resolvedPath = expandPath(key.walletPath);
118
+ if (!fs.existsSync(resolvedPath)) {
119
+ this.error(`Wallet file [${key.walletPath}] does not exist`);
120
+ }
121
+ return deployKeyFromWalletFile(key.sigType, fs.readFileSync(resolvedPath, "utf8"));
82
122
  }
83
- const walletContent = fs.readFileSync(walletPath, "utf8");
84
- deployKey = deployKeyFromWalletFile(deployConfig["sig-type"], walletContent);
85
- } else if (deployConfig["private-key"]) {
86
- deployKey = deployKeyFromPrivateKey(deployConfig["sig-type"], deployConfig["private-key"]);
87
- } else {
88
- deployKey = process.env.DEPLOY_KEY || "";
89
- if (!deployKey) {
90
- this.error(
91
- "DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY"
92
- );
123
+ if (key.privateKey) {
124
+ return deployKeyFromPrivateKey(key.sigType, key.privateKey);
93
125
  }
94
- }
126
+ const envValue = process.env[key.envVar]?.trim();
127
+ if (envValue) {
128
+ return envValue;
129
+ }
130
+ return this.error(key.missing);
131
+ };
132
+ const deployKey = resolveKey({
133
+ envVar: "DEPLOY_KEY",
134
+ missing: "No upload key provided. Use --wallet, --private-key, or set DEPLOY_KEY (the key that pays for the upload).",
135
+ privateKey: deployConfig["private-key"],
136
+ sigType: deployConfig["sig-type"],
137
+ walletPath: deployConfig.wallet
138
+ });
139
+ const arnsAuthorityKey = deployConfig["use-arns"] ? resolveKey({
140
+ envVar: "ARNS_KEY",
141
+ missing: "No ArNS authority key provided. Use --arns-wallet, --arns-private-key, or set ARNS_KEY (the Solana key that controls the ArNS name).",
142
+ privateKey: deployConfig["arns-private-key"],
143
+ sigType: "solana",
144
+ walletPath: deployConfig["arns-wallet"]
145
+ }) : "";
95
146
  this.log(chalk.bold(chalk.cyan("\nStarting deployment...\n")));
96
147
  try {
97
148
  if (!deployConfig["use-arns"]) {
@@ -135,7 +186,7 @@ class Deploy extends Command {
135
186
  });
136
187
  this.log("");
137
188
  spinner.start("Updating ANT record");
138
- const signer = await createSolanaArnsSigner(deployKey);
189
+ const signer = await createSolanaArnsSigner(arnsAuthorityKey);
139
190
  const ant = new SolanaANTWriteable({
140
191
  processId: arnsNameRecord.processId,
141
192
  rpc,
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.js","sources":["../../src/commands/deploy.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { ARIO, SolanaANTWriteable } from '@ar.io/sdk'\nimport { Command } from '@oclif/core'\nimport ora from 'ora'\n\nimport { type DeployConfig, deployFlagConfigs } from '../constants/flags.js'\nimport { promptAdvancedOptions } from '../prompts/arns.js'\nimport { getWalletConfig } from '../prompts/wallet.js'\nimport { chalk } from '../utils/chalk.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { deployKeyFromPrivateKey, deployKeyFromWalletFile } from '../utils/deploy-key.js'\nimport { type DisplayRow, formatDisplayRows, formatUploadError } from '../utils/display.js'\nimport { expandPath } from '../utils/path.js'\nimport {\n clusterProgramIds,\n createArioRpc,\n createArioRpcSubscriptions,\n createSolanaArnsSigner,\n type SolanaCluster,\n} from '../utils/solana.js'\nimport { runUploadWorkflow } from '../workflows/upload-workflow.js'\n\nexport default class Deploy extends Command {\n static override args = {}\n\n static override description = 'Deploy an application to the permaweb with optional ArNS update'\n\n static override examples = [\n '<%= config.bin %> deploy --wallet ./wallet.json',\n '<%= config.bin %> deploy --wallet ./wallet.json --deploy-folder ./dist',\n '<%= config.bin %> deploy --wallet ./wallet.json --deploy-file ./dist/index.html',\n '<%= config.bin %> deploy --wallet ./id.json --sig-type solana --use-arns --arns-name my-app',\n '<%= config.bin %> deploy --wallet ./id.json --sig-type solana --use-arns --arns-name my-app --undername staging',\n ]\n\n static override flags = extractFlags(deployFlagConfigs)\n\n public async run(): Promise<void> {\n try {\n const { flags } = await this.parse(Deploy)\n\n const useArns = Boolean(flags['use-arns'] || flags['arns-name'])\n const interactive = useArns && !flags['arns-name']\n\n if (interactive) {\n this.log(chalk.bold(chalk.cyan('\\nInteractive ArNS Deployment Mode\\n')))\n }\n\n const baseConfig = (await resolveConfig<typeof deployFlagConfigs>(deployFlagConfigs, flags, {\n interactive,\n })) as DeployConfig\n\n let walletConfig: { privateKey?: string; wallet?: string } = {\n privateKey: baseConfig['private-key'],\n wallet: baseConfig.wallet,\n }\n\n const shouldPromptWallet =\n !baseConfig.wallet &&\n !baseConfig['private-key'] &&\n (interactive || !process.env.DEPLOY_KEY?.trim())\n\n if (shouldPromptWallet) {\n const config = await getWalletConfig()\n walletConfig = {\n privateKey: config.privateKey,\n wallet: config.wallet,\n }\n }\n\n let advancedOptions:\n | {\n cluster: string\n maxTokenAmount?: string\n onDemand?: string\n ttlSeconds: string\n undername: string\n }\n | undefined\n\n if (interactive) {\n const options = await promptAdvancedOptions()\n advancedOptions = options || undefined\n }\n\n const effectiveCacheMaxEntries = baseConfig['no-dedupe']\n ? 0\n : baseConfig['dedupe-cache-max-entries']\n\n const deployConfig: DeployConfig = {\n 'arns-name': baseConfig['arns-name'],\n cluster: advancedOptions?.cluster || baseConfig.cluster,\n 'dedupe-cache-max-entries': effectiveCacheMaxEntries,\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'max-token-amount': advancedOptions?.maxTokenAmount || baseConfig['max-token-amount'],\n 'no-dedupe': baseConfig['no-dedupe'],\n 'on-demand': advancedOptions?.onDemand || baseConfig['on-demand'],\n 'private-key': walletConfig.privateKey,\n 'rpc-url': baseConfig['rpc-url'],\n 'sig-type': baseConfig['sig-type'],\n 'ttl-seconds': advancedOptions?.ttlSeconds || baseConfig['ttl-seconds'],\n undername: advancedOptions?.undername || baseConfig.undername,\n uploader: baseConfig.uploader,\n 'use-arns': useArns,\n wallet: walletConfig.wallet,\n }\n\n if (interactive) {\n this.log('')\n }\n\n if (deployConfig['use-arns'] && deployConfig['sig-type'] !== 'solana') {\n this.error('ArNS updates require --sig-type solana (ArNS records live on Solana)')\n }\n\n let deployKey: string\n if (deployConfig.wallet) {\n const walletPath = expandPath(deployConfig.wallet)\n if (!fs.existsSync(walletPath)) {\n this.error(`Wallet file [${deployConfig.wallet}] does not exist`)\n }\n\n const walletContent = fs.readFileSync(walletPath, 'utf8')\n deployKey = deployKeyFromWalletFile(deployConfig['sig-type'], walletContent)\n } else if (deployConfig['private-key']) {\n deployKey = deployKeyFromPrivateKey(deployConfig['sig-type'], deployConfig['private-key'])\n } else {\n deployKey = process.env.DEPLOY_KEY || ''\n if (!deployKey) {\n this.error(\n 'DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY',\n )\n }\n }\n\n this.log(chalk.bold(chalk.cyan('\\nStarting deployment...\\n')))\n try {\n if (!deployConfig['use-arns']) {\n const { transactionId: txOrManifestId } = await runUploadWorkflow(\n deployKey,\n deployConfig,\n {\n error: (msg) => this.error(msg),\n },\n )\n\n this.log('')\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (deployConfig.uploader) {\n rows.push(['Bundler service', chalk.cyan(deployConfig.uploader)])\n }\n\n rows.push(['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)])\n\n this.log(chalk.bold(chalk.green('Deployment Successful!')))\n this.log(formatDisplayRows(rows))\n\n return\n }\n\n const cluster = deployConfig.cluster as SolanaCluster\n const rpcUrl = deployConfig['rpc-url']\n const arnsName = deployConfig['arns-name']\n if (!arnsName) {\n this.error('--use-arns requires --arns-name')\n }\n\n const spinner = ora()\n\n spinner.start('Initializing ARIO')\n\n const programIds = clusterProgramIds(cluster)\n const rpc = createArioRpc(cluster, rpcUrl)\n const ario = ARIO.init({ rpc, ...programIds })\n\n spinner.succeed('ARIO initialized')\n\n spinner.start(`Fetching ArNS record for ${chalk.yellow(arnsName)}`)\n const arnsNameRecord = await ario.getArNSRecord({ name: arnsName }).catch(() => {\n spinner.fail(`ArNS name ${chalk.red(arnsName)} does not exist`)\n this.error(`ArNS name [${arnsName}] does not exist`)\n })\n\n spinner.succeed(`ArNS record fetched for ${chalk.green(arnsName)}`)\n\n const { transactionId: txOrManifestId } = await runUploadWorkflow(deployKey, deployConfig, {\n error: (msg) => this.error(msg),\n })\n\n this.log('')\n\n spinner.start('Updating ANT record')\n const signer = await createSolanaArnsSigner(deployKey)\n const ant = new SolanaANTWriteable({\n processId: arnsNameRecord.processId,\n rpc,\n rpcSubscriptions: createArioRpcSubscriptions(cluster, rpcUrl),\n signer,\n ...(programIds.antProgramId ? { antProgramId: programIds.antProgramId } : {}),\n })\n\n const recordParams = {\n transactionId: txOrManifestId,\n ttlSeconds: Number.parseInt(deployConfig['ttl-seconds'], 10),\n }\n\n await (deployConfig.undername === '@'\n ? ant.setBaseNameRecord(recordParams)\n : ant.setUndernameRecord({ ...recordParams, undername: deployConfig.undername }))\n\n spinner.succeed('ANT record updated')\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (deployConfig.uploader) {\n rows.push(['Bundler service', chalk.cyan(deployConfig.uploader)])\n }\n\n rows.push(\n ['ArNS Name', chalk.yellow(arnsName)],\n ['Undername', chalk.yellow(deployConfig.undername)],\n ['ANT', chalk.cyan(arnsNameRecord.processId)],\n ['Cluster', chalk.gray(cluster)],\n ['TTL Seconds', chalk.blue(deployConfig['ttl-seconds'])],\n ['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)],\n )\n\n this.log(chalk.bold(chalk.green('Deployment Successful!')))\n this.log(formatDisplayRows(rows))\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const normalizedError = errorMessage.startsWith('Upload failed:')\n ? errorMessage.replace(/^Upload failed:\\s*/, '')\n : errorMessage\n\n if (errorMessage.startsWith('Upload failed:') && !process.env.CI && process.stdout.isTTY) {\n this.log(`\\n${formatUploadError(normalizedError, 'Deployment failed')}`)\n this.exit(1)\n }\n\n this.error(chalk.red(`Deployment failed: ${errorMessage}`))\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nDeployment cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":["txOrManifestId","rows"],"mappings":"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"}
1
+ {"version":3,"file":"deploy.js","sources":["../../src/commands/deploy.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { ARIO, SolanaANTWriteable } from '@ar.io/sdk'\nimport { Command } from '@oclif/core'\nimport ora from 'ora'\n\nimport { type DeployConfig, deployFlagConfigs } from '../constants/flags.js'\nimport { promptAdvancedOptions, promptUpdateArns } from '../prompts/arns.js'\nimport { getWalletConfig } from '../prompts/wallet.js'\nimport { chalk } from '../utils/chalk.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { deployKeyFromPrivateKey, deployKeyFromWalletFile } from '../utils/deploy-key.js'\nimport { type DisplayRow, formatDisplayRows, formatUploadError } from '../utils/display.js'\nimport { expandPath } from '../utils/path.js'\nimport {\n clusterProgramIds,\n createArioRpc,\n createArioRpcSubscriptions,\n createSolanaArnsSigner,\n type SolanaCluster,\n} from '../utils/solana.js'\nimport { runUploadWorkflow } from '../workflows/upload-workflow.js'\n\nexport default class Deploy extends Command {\n static override args = {}\n\n static override description = 'Deploy an application to the permaweb with optional ArNS update'\n\n static override examples = [\n '<%= config.bin %> deploy --wallet ./wallet.json',\n '<%= config.bin %> deploy --wallet ./wallet.json --deploy-folder ./dist',\n '<%= config.bin %> deploy --wallet ./wallet.json --deploy-file ./dist/index.html',\n '<%= config.bin %> deploy --wallet ./wallet.json --use-arns --arns-name my-app --arns-wallet ./arns-id.json',\n '<%= config.bin %> deploy --wallet ./wallet.json --use-arns --arns-name my-app --arns-wallet ./arns-id.json --undername staging',\n ]\n\n static override flags = extractFlags(deployFlagConfigs)\n\n public async run(): Promise<void> {\n try {\n const { flags } = await this.parse(Deploy)\n\n const hasArnsName = Boolean(flags['arns-name'])\n const explicitUseArns = Boolean(flags['use-arns'])\n const canPrompt = Boolean(process.stdout.isTTY) && !process.env.CI\n\n // Decide whether to update ArNS and whether to run interactive prompts.\n // When no ArNS details are supplied we ask by default (in a TTY); the\n // resolveConfig pass below then prompts for the name and other missing\n // values. A non-interactive environment falls back to upload-only.\n let useArns = hasArnsName || explicitUseArns\n let interactive = false\n\n if (hasArnsName) {\n interactive = false\n } else if (explicitUseArns) {\n interactive = canPrompt\n } else if (canPrompt) {\n useArns = await promptUpdateArns()\n interactive = useArns\n }\n\n if (interactive) {\n this.log(chalk.bold(chalk.cyan('\\nInteractive Deployment Mode\\n')))\n if (useArns) {\n this.log(\n chalk.dim(\n 'Two keys are used:\\n' +\n ' • Upload key — pays for the upload (any supported chain)\\n' +\n ' • ArNS authority key — a Solana key that controls the name and signs the update\\n',\n ),\n )\n }\n }\n\n const baseConfig = (await resolveConfig<typeof deployFlagConfigs>(deployFlagConfigs, flags, {\n interactive,\n })) as DeployConfig\n\n let walletConfig: { privateKey?: string; wallet?: string } = {\n privateKey: baseConfig['private-key'],\n wallet: baseConfig.wallet,\n }\n\n const shouldPromptWallet =\n canPrompt &&\n !baseConfig.wallet &&\n !baseConfig['private-key'] &&\n (interactive || !process.env.DEPLOY_KEY?.trim())\n\n if (shouldPromptWallet) {\n const config = await getWalletConfig({\n envVar: 'DEPLOY_KEY',\n label: 'upload key',\n purpose: 'pays for the upload',\n })\n walletConfig = {\n privateKey: config.privateKey,\n wallet: config.wallet,\n }\n }\n\n // ArNS authority key — separate from the upload key. Always a Solana key\n // that controls the ArNS name and signs the ANT record update. Only needed\n // when updating ArNS.\n let arnsKeyConfig: { privateKey?: string; wallet?: string } = {\n privateKey: baseConfig['arns-private-key'],\n wallet: baseConfig['arns-wallet'],\n }\n\n const shouldPromptArnsKey =\n canPrompt &&\n useArns &&\n !arnsKeyConfig.wallet &&\n !arnsKeyConfig.privateKey &&\n (interactive || !process.env.ARNS_KEY?.trim())\n\n if (shouldPromptArnsKey) {\n const config = await getWalletConfig({\n envVar: 'ARNS_KEY',\n fileDefault: './arns-wallet.json',\n label: 'ArNS authority key',\n purpose: 'controls the ArNS name and signs the record update',\n })\n arnsKeyConfig = {\n privateKey: config.privateKey,\n wallet: config.wallet,\n }\n }\n\n let advancedOptions:\n | {\n cluster: string\n maxTokenAmount?: string\n onDemand?: string\n ttlSeconds: string\n undername: string\n }\n | undefined\n\n if (interactive) {\n const options = await promptAdvancedOptions()\n advancedOptions = options || undefined\n }\n\n const effectiveCacheMaxEntries = baseConfig['no-dedupe']\n ? 0\n : baseConfig['dedupe-cache-max-entries']\n\n const deployConfig: DeployConfig = {\n 'arns-name': baseConfig['arns-name'],\n 'arns-private-key': arnsKeyConfig.privateKey,\n 'arns-wallet': arnsKeyConfig.wallet,\n cluster: advancedOptions?.cluster || baseConfig.cluster,\n 'dedupe-cache-max-entries': effectiveCacheMaxEntries,\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'max-token-amount': advancedOptions?.maxTokenAmount || baseConfig['max-token-amount'],\n 'no-dedupe': baseConfig['no-dedupe'],\n 'on-demand': advancedOptions?.onDemand || baseConfig['on-demand'],\n 'private-key': walletConfig.privateKey,\n 'rpc-url': baseConfig['rpc-url'],\n 'sig-type': baseConfig['sig-type'],\n 'ttl-seconds': advancedOptions?.ttlSeconds || baseConfig['ttl-seconds'],\n undername: advancedOptions?.undername || baseConfig.undername,\n uploader: baseConfig.uploader,\n 'use-arns': useArns,\n wallet: walletConfig.wallet,\n }\n\n if (interactive) {\n this.log('')\n }\n\n // Resolve a deploy key from a wallet file, a private-key string, or an\n // environment variable. Used for both the upload key and the (Solana)\n // ArNS authority key — they are independent inputs.\n const resolveKey = (key: {\n envVar: string\n missing: string\n privateKey?: string\n sigType: string\n walletPath?: string\n }): string => {\n if (key.walletPath) {\n const resolvedPath = expandPath(key.walletPath)\n if (!fs.existsSync(resolvedPath)) {\n this.error(`Wallet file [${key.walletPath}] does not exist`)\n }\n\n return deployKeyFromWalletFile(key.sigType, fs.readFileSync(resolvedPath, 'utf8'))\n }\n\n if (key.privateKey) {\n return deployKeyFromPrivateKey(key.sigType, key.privateKey)\n }\n\n const envValue = process.env[key.envVar]?.trim()\n if (envValue) {\n return envValue\n }\n\n return this.error(key.missing)\n }\n\n const deployKey = resolveKey({\n envVar: 'DEPLOY_KEY',\n missing:\n 'No upload key provided. Use --wallet, --private-key, or set DEPLOY_KEY (the key that pays for the upload).',\n privateKey: deployConfig['private-key'],\n sigType: deployConfig['sig-type'],\n walletPath: deployConfig.wallet,\n })\n\n // ArNS authority key is always a Solana key, independent of the upload key.\n const arnsAuthorityKey = deployConfig['use-arns']\n ? resolveKey({\n envVar: 'ARNS_KEY',\n missing:\n 'No ArNS authority key provided. Use --arns-wallet, --arns-private-key, or set ARNS_KEY (the Solana key that controls the ArNS name).',\n privateKey: deployConfig['arns-private-key'],\n sigType: 'solana',\n walletPath: deployConfig['arns-wallet'],\n })\n : ''\n\n this.log(chalk.bold(chalk.cyan('\\nStarting deployment...\\n')))\n try {\n if (!deployConfig['use-arns']) {\n const { transactionId: txOrManifestId } = await runUploadWorkflow(\n deployKey,\n deployConfig,\n {\n error: (msg) => this.error(msg),\n },\n )\n\n this.log('')\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (deployConfig.uploader) {\n rows.push(['Bundler service', chalk.cyan(deployConfig.uploader)])\n }\n\n rows.push(['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)])\n\n this.log(chalk.bold(chalk.green('Deployment Successful!')))\n this.log(formatDisplayRows(rows))\n\n return\n }\n\n const cluster = deployConfig.cluster as SolanaCluster\n const rpcUrl = deployConfig['rpc-url']\n const arnsName = deployConfig['arns-name']\n if (!arnsName) {\n this.error('--use-arns requires --arns-name')\n }\n\n const spinner = ora()\n\n spinner.start('Initializing ARIO')\n\n const programIds = clusterProgramIds(cluster)\n const rpc = createArioRpc(cluster, rpcUrl)\n const ario = ARIO.init({ rpc, ...programIds })\n\n spinner.succeed('ARIO initialized')\n\n spinner.start(`Fetching ArNS record for ${chalk.yellow(arnsName)}`)\n const arnsNameRecord = await ario.getArNSRecord({ name: arnsName }).catch(() => {\n spinner.fail(`ArNS name ${chalk.red(arnsName)} does not exist`)\n this.error(`ArNS name [${arnsName}] does not exist`)\n })\n\n spinner.succeed(`ArNS record fetched for ${chalk.green(arnsName)}`)\n\n const { transactionId: txOrManifestId } = await runUploadWorkflow(deployKey, deployConfig, {\n error: (msg) => this.error(msg),\n })\n\n this.log('')\n\n spinner.start('Updating ANT record')\n const signer = await createSolanaArnsSigner(arnsAuthorityKey)\n const ant = new SolanaANTWriteable({\n processId: arnsNameRecord.processId,\n rpc,\n rpcSubscriptions: createArioRpcSubscriptions(cluster, rpcUrl),\n signer,\n ...(programIds.antProgramId ? { antProgramId: programIds.antProgramId } : {}),\n })\n\n const recordParams = {\n transactionId: txOrManifestId,\n ttlSeconds: Number.parseInt(deployConfig['ttl-seconds'], 10),\n }\n\n await (deployConfig.undername === '@'\n ? ant.setBaseNameRecord(recordParams)\n : ant.setUndernameRecord({ ...recordParams, undername: deployConfig.undername }))\n\n spinner.succeed('ANT record updated')\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (deployConfig.uploader) {\n rows.push(['Bundler service', chalk.cyan(deployConfig.uploader)])\n }\n\n rows.push(\n ['ArNS Name', chalk.yellow(arnsName)],\n ['Undername', chalk.yellow(deployConfig.undername)],\n ['ANT', chalk.cyan(arnsNameRecord.processId)],\n ['Cluster', chalk.gray(cluster)],\n ['TTL Seconds', chalk.blue(deployConfig['ttl-seconds'])],\n ['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)],\n )\n\n this.log(chalk.bold(chalk.green('Deployment Successful!')))\n this.log(formatDisplayRows(rows))\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const normalizedError = errorMessage.startsWith('Upload failed:')\n ? errorMessage.replace(/^Upload failed:\\s*/, '')\n : errorMessage\n\n if (errorMessage.startsWith('Upload failed:') && !process.env.CI && process.stdout.isTTY) {\n this.log(`\\n${formatUploadError(normalizedError, 'Deployment failed')}`)\n this.exit(1)\n }\n\n this.error(chalk.red(`Deployment failed: ${errorMessage}`))\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nDeployment cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":["txOrManifestId","rows"],"mappings":"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"}
@@ -34,7 +34,11 @@ class Upload extends Command {
34
34
  wallet: baseConfig.wallet
35
35
  };
36
36
  if (interactive && !baseConfig.wallet && !baseConfig["private-key"]) {
37
- const config = await getWalletConfig();
37
+ const config = await getWalletConfig({
38
+ envVar: "DEPLOY_KEY",
39
+ label: "upload key",
40
+ purpose: "pays for the upload"
41
+ });
38
42
  walletConfig = {
39
43
  privateKey: config.privateKey,
40
44
  wallet: config.wallet
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sources":["../../src/commands/upload.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { Command } from '@oclif/core'\n\nimport { type UploadConfig, uploadFlagConfigs } from '../constants/flags.js'\nimport { getWalletConfig } from '../prompts/wallet.js'\nimport { chalk } from '../utils/chalk.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { deployKeyFromPrivateKey, deployKeyFromWalletFile } from '../utils/deploy-key.js'\nimport {\n type DisplayRow,\n formatDisplayRows,\n formatUploadCost,\n formatUploadError,\n formatUploadSize,\n} from '../utils/display.js'\nimport { expandPath } from '../utils/path.js'\nimport { runUploadWorkflow } from '../workflows/upload-workflow.js'\n\nexport default class Upload extends Command {\n static override args = {}\n\n static override description = 'Upload a file or folder to Arweave via Turbo without updating ArNS'\n\n static override examples = [\n '<%= config.bin %> upload --wallet ./wallet.json',\n '<%= config.bin %> upload --wallet ./wallet.json --deploy-folder ./dist',\n '<%= config.bin %> upload --wallet ./wallet.json --deploy-file ./dist/index.html',\n '<%= config.bin %> upload --private-key \"$(cat wallet.json)\" --on-demand ario --max-token-amount 1.5',\n '<%= config.bin %> upload --wallet ./wallet.json --uploader https://turbo.ardrive.io',\n '<%= config.bin %> upload --wallet ./id.json --sig-type solana',\n ]\n\n static override flags = extractFlags(uploadFlagConfigs)\n\n public async run(): Promise<void> {\n try {\n const { flags } = await this.parse(Upload)\n\n const interactive = !flags.wallet && !flags['private-key'] && !process.env.DEPLOY_KEY?.trim()\n\n if (interactive) {\n this.log(chalk.bold(chalk.cyan('\\nInteractive upload mode\\n')))\n }\n\n const baseConfig = (await resolveConfig<typeof uploadFlagConfigs>(uploadFlagConfigs, flags, {\n interactive,\n })) as UploadConfig\n\n let walletConfig: { privateKey?: string; wallet?: string } = {\n privateKey: baseConfig['private-key'],\n wallet: baseConfig.wallet,\n }\n\n if (interactive && !baseConfig.wallet && !baseConfig['private-key']) {\n const config = await getWalletConfig()\n walletConfig = {\n privateKey: config.privateKey,\n wallet: config.wallet,\n }\n }\n\n const effectiveCacheMaxEntries = baseConfig['no-dedupe']\n ? 0\n : baseConfig['dedupe-cache-max-entries']\n\n const uploadCfg = {\n 'dedupe-cache-max-entries': effectiveCacheMaxEntries,\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'max-token-amount': baseConfig['max-token-amount'],\n 'on-demand': baseConfig['on-demand'],\n 'sig-type': baseConfig['sig-type'],\n uploader: baseConfig.uploader,\n }\n\n if (interactive) {\n this.log('')\n }\n\n const { privateKey, wallet } = walletConfig\n const sigType = uploadCfg['sig-type']\n\n let deployKey: string\n if (wallet) {\n const walletPath = expandPath(wallet)\n if (!fs.existsSync(walletPath)) {\n this.error(`Wallet file [${wallet}] does not exist`)\n }\n\n const walletContent = fs.readFileSync(walletPath, 'utf8')\n deployKey = deployKeyFromWalletFile(sigType, walletContent)\n } else if (privateKey) {\n deployKey = deployKeyFromPrivateKey(sigType, privateKey)\n } else {\n deployKey = process.env.DEPLOY_KEY || ''\n if (!deployKey) {\n this.error(\n 'DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY',\n )\n }\n }\n\n this.log(chalk.bold(chalk.cyan('\\nStarting upload...\\n')))\n\n try {\n const uploadResult = await runUploadWorkflow(deployKey, uploadCfg, {\n error: (msg) => this.error(msg),\n })\n const txOrManifestId = uploadResult.transactionId\n\n this.log('')\n\n const uploadSize = uploadResult.size\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (uploadSize) {\n rows.push(['Upload size', chalk.blue(formatUploadSize(uploadSize))])\n }\n\n if (uploadResult.cost) {\n rows.push(['Upload cost', chalk.blue(formatUploadCost(uploadResult.cost))])\n }\n\n if (uploadCfg.uploader) {\n rows.push(['Bundler service', chalk.cyan(uploadCfg.uploader)])\n }\n\n rows.push(['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)])\n\n this.log(chalk.bold(chalk.green('Upload successful!')))\n this.log(formatDisplayRows(rows))\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const normalizedError = errorMessage.startsWith('Upload failed:')\n ? errorMessage.replace(/^Upload failed:\\s*/, '')\n : errorMessage\n\n if (!process.env.CI && process.stdout.isTTY) {\n this.log(`\\n${formatUploadError(normalizedError)}`)\n this.exit(1)\n }\n\n this.error(\n chalk.red(\n errorMessage.startsWith('Upload failed:')\n ? errorMessage\n : `Upload failed: ${errorMessage}`,\n ),\n )\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nUpload cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload.js","sources":["../../src/commands/upload.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { Command } from '@oclif/core'\n\nimport { type UploadConfig, uploadFlagConfigs } from '../constants/flags.js'\nimport { getWalletConfig } from '../prompts/wallet.js'\nimport { chalk } from '../utils/chalk.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { deployKeyFromPrivateKey, deployKeyFromWalletFile } from '../utils/deploy-key.js'\nimport {\n type DisplayRow,\n formatDisplayRows,\n formatUploadCost,\n formatUploadError,\n formatUploadSize,\n} from '../utils/display.js'\nimport { expandPath } from '../utils/path.js'\nimport { runUploadWorkflow } from '../workflows/upload-workflow.js'\n\nexport default class Upload extends Command {\n static override args = {}\n\n static override description = 'Upload a file or folder to Arweave via Turbo without updating ArNS'\n\n static override examples = [\n '<%= config.bin %> upload --wallet ./wallet.json',\n '<%= config.bin %> upload --wallet ./wallet.json --deploy-folder ./dist',\n '<%= config.bin %> upload --wallet ./wallet.json --deploy-file ./dist/index.html',\n '<%= config.bin %> upload --private-key \"$(cat wallet.json)\" --on-demand ario --max-token-amount 1.5',\n '<%= config.bin %> upload --wallet ./wallet.json --uploader https://turbo.ardrive.io',\n '<%= config.bin %> upload --wallet ./id.json --sig-type solana',\n ]\n\n static override flags = extractFlags(uploadFlagConfigs)\n\n public async run(): Promise<void> {\n try {\n const { flags } = await this.parse(Upload)\n\n const interactive = !flags.wallet && !flags['private-key'] && !process.env.DEPLOY_KEY?.trim()\n\n if (interactive) {\n this.log(chalk.bold(chalk.cyan('\\nInteractive upload mode\\n')))\n }\n\n const baseConfig = (await resolveConfig<typeof uploadFlagConfigs>(uploadFlagConfigs, flags, {\n interactive,\n })) as UploadConfig\n\n let walletConfig: { privateKey?: string; wallet?: string } = {\n privateKey: baseConfig['private-key'],\n wallet: baseConfig.wallet,\n }\n\n if (interactive && !baseConfig.wallet && !baseConfig['private-key']) {\n const config = await getWalletConfig({\n envVar: 'DEPLOY_KEY',\n label: 'upload key',\n purpose: 'pays for the upload',\n })\n walletConfig = {\n privateKey: config.privateKey,\n wallet: config.wallet,\n }\n }\n\n const effectiveCacheMaxEntries = baseConfig['no-dedupe']\n ? 0\n : baseConfig['dedupe-cache-max-entries']\n\n const uploadCfg = {\n 'dedupe-cache-max-entries': effectiveCacheMaxEntries,\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'max-token-amount': baseConfig['max-token-amount'],\n 'on-demand': baseConfig['on-demand'],\n 'sig-type': baseConfig['sig-type'],\n uploader: baseConfig.uploader,\n }\n\n if (interactive) {\n this.log('')\n }\n\n const { privateKey, wallet } = walletConfig\n const sigType = uploadCfg['sig-type']\n\n let deployKey: string\n if (wallet) {\n const walletPath = expandPath(wallet)\n if (!fs.existsSync(walletPath)) {\n this.error(`Wallet file [${wallet}] does not exist`)\n }\n\n const walletContent = fs.readFileSync(walletPath, 'utf8')\n deployKey = deployKeyFromWalletFile(sigType, walletContent)\n } else if (privateKey) {\n deployKey = deployKeyFromPrivateKey(sigType, privateKey)\n } else {\n deployKey = process.env.DEPLOY_KEY || ''\n if (!deployKey) {\n this.error(\n 'DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY',\n )\n }\n }\n\n this.log(chalk.bold(chalk.cyan('\\nStarting upload...\\n')))\n\n try {\n const uploadResult = await runUploadWorkflow(deployKey, uploadCfg, {\n error: (msg) => this.error(msg),\n })\n const txOrManifestId = uploadResult.transactionId\n\n this.log('')\n\n const uploadSize = uploadResult.size\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (uploadSize) {\n rows.push(['Upload size', chalk.blue(formatUploadSize(uploadSize))])\n }\n\n if (uploadResult.cost) {\n rows.push(['Upload cost', chalk.blue(formatUploadCost(uploadResult.cost))])\n }\n\n if (uploadCfg.uploader) {\n rows.push(['Bundler service', chalk.cyan(uploadCfg.uploader)])\n }\n\n rows.push(['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)])\n\n this.log(chalk.bold(chalk.green('Upload successful!')))\n this.log(formatDisplayRows(rows))\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const normalizedError = errorMessage.startsWith('Upload failed:')\n ? errorMessage.replace(/^Upload failed:\\s*/, '')\n : errorMessage\n\n if (!process.env.CI && process.stdout.isTTY) {\n this.log(`\\n${formatUploadError(normalizedError)}`)\n this.exit(1)\n }\n\n this.error(\n chalk.red(\n errorMessage.startsWith('Upload failed:')\n ? errorMessage\n : `Upload failed: ${errorMessage}`,\n ),\n )\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nUpload cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -17,6 +17,27 @@ const globalFlags = {
17
17
  prompt: promptArnsName,
18
18
  triggersInteractive: true
19
19
  }),
20
+ arnsPrivateKey: createFlagConfig({
21
+ flag: Flags.string({
22
+ description: "ArNS authority key: base58 Solana secret key that controls the ArNS name and signs the record update (alternative to --arns-wallet). Falls back to the ARNS_KEY env var. This is separate from the upload key.",
23
+ exclusive: ["arns-wallet"],
24
+ required: false
25
+ })
26
+ }),
27
+ arnsWallet: createFlagConfig({
28
+ flag: Flags.string({
29
+ description: "ArNS authority key: path to the Solana wallet file (solana-keygen id.json) that controls the ArNS name and signs the record update. Falls back to the ARNS_KEY env var. This is separate from the upload key.",
30
+ exclusive: ["arns-private-key"],
31
+ async parse(input) {
32
+ const validation = validateFileExists(input);
33
+ if (validation !== true) {
34
+ throw new Error(validation);
35
+ }
36
+ return input;
37
+ },
38
+ required: false
39
+ })
40
+ }),
20
41
  cluster: createFlagConfig({
21
42
  flag: Flags.string({
22
43
  char: "p",
@@ -96,7 +117,7 @@ const globalFlags = {
96
117
  privateKey: createFlagConfig({
97
118
  flag: Flags.string({
98
119
  char: "k",
99
- description: "Private key string (alternative to --wallet). JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana.",
120
+ description: "Upload key (pays for the upload): private key string, alternative to --wallet. JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana.",
100
121
  exclusive: ["wallet"],
101
122
  required: false
102
123
  })
@@ -111,7 +132,7 @@ const globalFlags = {
111
132
  flag: Flags.string({
112
133
  char: "s",
113
134
  default: "arweave",
114
- description: "Signer type for deployment. ArNS updates require solana.",
135
+ description: "Signer type for the upload key (pays for the upload).",
115
136
  options: ["arweave", "ethereum", "polygon", "kyve", "solana"],
116
137
  required: false
117
138
  }),
@@ -163,7 +184,7 @@ const globalFlags = {
163
184
  wallet: createFlagConfig({
164
185
  flag: Flags.string({
165
186
  char: "w",
166
- description: "Path to wallet file (JWK for Arweave, private key for EVM chains, solana-keygen id.json for Solana)",
187
+ description: "Upload key (pays for the upload): path to wallet file. JWK for Arweave, private key for EVM chains, solana-keygen id.json for Solana.",
167
188
  exclusive: ["private-key"],
168
189
  async parse(input) {
169
190
  const validation = validateFileExists(input);
@@ -178,6 +199,8 @@ const globalFlags = {
178
199
  };
179
200
  const deployFlags = {
180
201
  "arns-name": globalFlags.arnsName.flag,
202
+ "arns-private-key": globalFlags.arnsPrivateKey.flag,
203
+ "arns-wallet": globalFlags.arnsWallet.flag,
181
204
  cluster: globalFlags.cluster.flag,
182
205
  "dedupe-cache-max-entries": globalFlags.dedupeCacheMaxEntries.flag,
183
206
  "deploy-file": globalFlags.deployFile.flag,
@@ -196,6 +219,8 @@ const deployFlags = {
196
219
  };
197
220
  const arnsFlags = {
198
221
  "arns-name": globalFlags.arnsName.flag,
222
+ "arns-private-key": globalFlags.arnsPrivateKey.flag,
223
+ "arns-wallet": globalFlags.arnsWallet.flag,
199
224
  cluster: globalFlags.cluster.flag,
200
225
  "rpc-url": globalFlags.rpcUrl.flag,
201
226
  "ttl-seconds": globalFlags.ttlSeconds.flag,
@@ -208,6 +233,8 @@ const walletFlags = {
208
233
  };
209
234
  const deployFlagConfigs = {
210
235
  "arns-name": globalFlags.arnsName,
236
+ "arns-private-key": globalFlags.arnsPrivateKey,
237
+ "arns-wallet": globalFlags.arnsWallet,
211
238
  cluster: globalFlags.cluster,
212
239
  "dedupe-cache-max-entries": globalFlags.dedupeCacheMaxEntries,
213
240
  "deploy-file": globalFlags.deployFile,
@@ -1 +1 @@
1
- {"version":3,"file":"flags.js","sources":["../../src/constants/flags.ts"],"sourcesContent":["import { Flags } from '@oclif/core'\n\nimport { promptArnsName, promptCluster } from '../prompts/arns.js'\nimport { promptDeployTarget } from '../prompts/deployment.js'\nimport { promptSignerType } from '../prompts/wallet.js'\nimport { createFlagConfig, type ResolvedConfig } from '../utils/config-resolver.js'\nimport { TTL_MAX, TTL_MIN } from '../utils/constants.js'\nimport {\n validateFileExists,\n validateFolderExists,\n validateTtl,\n validateUndername,\n} from '../utils/validators.js'\nimport { DEFAULT_CACHE_MAX_ENTRIES } from './cache.js'\n\n/**\n * Global flag definitions - single source of truth for all flags\n * Each flag includes its oclif definition and optional prompt function\n */\nexport const globalFlags = {\n arnsName: createFlagConfig<string>({\n flag: Flags.string({\n char: 'n',\n description: 'The ArNS name to deploy to',\n required: false,\n }),\n prompt: promptArnsName,\n triggersInteractive: true,\n }),\n cluster: createFlagConfig<string>({\n flag: Flags.string({\n char: 'p',\n default: 'mainnet',\n description: 'Solana cluster for ArNS updates (mainnet or devnet)',\n options: ['mainnet', 'devnet'],\n required: false,\n }),\n prompt: promptCluster,\n }),\n dedupeCacheMaxEntries: createFlagConfig<number>({\n flag: Flags.integer({\n default: DEFAULT_CACHE_MAX_ENTRIES,\n description: 'Maximum number of entries to keep in the dedupe cache (LRU)',\n min: 0,\n required: false,\n }),\n }),\n deployFile: createFlagConfig<string | undefined>({\n flag: Flags.string({\n char: 'f',\n description: 'File to deploy (overrides deploy-folder)',\n async parse(input) {\n const validation = validateFileExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n async prompt() {\n const target = await promptDeployTarget()\n return target.type === 'file' ? target.path : undefined\n },\n }),\n deployFolder: createFlagConfig<string>({\n flag: Flags.string({\n char: 'd',\n default: './dist',\n description: 'Folder to deploy',\n async parse(input) {\n const validation = validateFolderExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n async prompt() {\n const target = await promptDeployTarget()\n return target.type === 'folder' ? target.path : './dist'\n },\n }),\n // Advanced payment settings\n maxTokenAmount: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description: 'Maximum token amount for on-demand payment',\n required: false,\n }),\n }),\n noDedupe: createFlagConfig<boolean>({\n flag: Flags.boolean({\n default: false,\n description: 'Disable deduplication (do not cache or reuse previous uploads)',\n required: false,\n }),\n }),\n onDemand: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description: 'Enable on-demand payment with specified token (ario or base-eth)',\n options: ['ario', 'base-eth'],\n required: false,\n }),\n }),\n privateKey: createFlagConfig<string | undefined>({\n flag: Flags.string({\n char: 'k',\n description:\n 'Private key string (alternative to --wallet). JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana.',\n exclusive: ['wallet'],\n required: false,\n }),\n }),\n rpcUrl: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description: 'Optional Solana RPC URL override for ArNS updates',\n required: false,\n }),\n }),\n sigType: createFlagConfig<string>({\n flag: Flags.string({\n char: 's',\n default: 'arweave',\n description: 'Signer type for deployment. ArNS updates require solana.',\n options: ['arweave', 'ethereum', 'polygon', 'kyve', 'solana'],\n required: false,\n }),\n prompt: promptSignerType,\n }),\n ttlSeconds: createFlagConfig<string>({\n flag: Flags.string({\n char: 't',\n default: '60',\n description: `ArNS TTL in seconds (${TTL_MIN}-${TTL_MAX})`,\n async parse(input) {\n const validation = validateTtl(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n undername: createFlagConfig<string>({\n flag: Flags.string({\n char: 'u',\n default: '@',\n description: 'ANT undername to update',\n async parse(input) {\n const validation = validateUndername(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n uploader: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description:\n 'Custom Turbo upload service base URL. Omit for ArDrive production: https://upload.ardrive.io.',\n required: false,\n }),\n }),\n useArns: createFlagConfig<boolean>({\n flag: Flags.boolean({\n default: false,\n description: 'Update an ArNS/ANT record after upload.',\n required: false,\n }),\n }),\n wallet: createFlagConfig<string | undefined>({\n flag: Flags.string({\n char: 'w',\n description:\n 'Path to wallet file (JWK for Arweave, private key for EVM chains, solana-keygen id.json for Solana)',\n exclusive: ['private-key'],\n async parse(input) {\n const validation = validateFileExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n}\n\n/**\n * Complete set of flags for the deploy command\n */\nexport const deployFlags = {\n 'arns-name': globalFlags.arnsName.flag,\n cluster: globalFlags.cluster.flag,\n 'dedupe-cache-max-entries': globalFlags.dedupeCacheMaxEntries.flag,\n 'deploy-file': globalFlags.deployFile.flag,\n 'deploy-folder': globalFlags.deployFolder.flag,\n 'max-token-amount': globalFlags.maxTokenAmount.flag,\n 'no-dedupe': globalFlags.noDedupe.flag,\n 'on-demand': globalFlags.onDemand.flag,\n 'private-key': globalFlags.privateKey.flag,\n 'rpc-url': globalFlags.rpcUrl.flag,\n 'sig-type': globalFlags.sigType.flag,\n 'ttl-seconds': globalFlags.ttlSeconds.flag,\n undername: globalFlags.undername.flag,\n uploader: globalFlags.uploader.flag,\n 'use-arns': globalFlags.useArns.flag,\n wallet: globalFlags.wallet.flag,\n}\n\n/**\n * ArNS-specific flags (subset of deploy flags)\n */\nexport const arnsFlags = {\n 'arns-name': globalFlags.arnsName.flag,\n cluster: globalFlags.cluster.flag,\n 'rpc-url': globalFlags.rpcUrl.flag,\n 'ttl-seconds': globalFlags.ttlSeconds.flag,\n undername: globalFlags.undername.flag,\n}\n\n/**\n * Wallet/authentication flags (subset of deploy flags)\n */\nexport const walletFlags = {\n 'private-key': globalFlags.privateKey.flag,\n 'sig-type': globalFlags.sigType.flag,\n wallet: globalFlags.wallet.flag,\n}\n\n/**\n * Deploy command configuration type\n */\nexport interface DeployConfig {\n 'arns-name'?: string\n cluster: string\n 'dedupe-cache-max-entries': number\n 'deploy-file'?: string\n 'deploy-folder': string\n 'max-token-amount'?: string\n 'no-dedupe': boolean\n 'on-demand'?: string\n 'private-key'?: string\n 'rpc-url'?: string\n 'sig-type': string\n 'ttl-seconds': string\n undername: string\n 'use-arns': boolean\n uploader?: string\n wallet?: string\n}\n\n/**\n * Deploy command flag configurations\n * Maps kebab-case flag names to their camelCase globalFlags definitions\n */\nexport const deployFlagConfigs = {\n 'arns-name': globalFlags.arnsName,\n cluster: globalFlags.cluster,\n 'dedupe-cache-max-entries': globalFlags.dedupeCacheMaxEntries,\n 'deploy-file': globalFlags.deployFile,\n 'deploy-folder': globalFlags.deployFolder,\n 'max-token-amount': globalFlags.maxTokenAmount,\n 'no-dedupe': globalFlags.noDedupe,\n 'on-demand': globalFlags.onDemand,\n 'private-key': globalFlags.privateKey,\n 'rpc-url': globalFlags.rpcUrl,\n 'sig-type': globalFlags.sigType,\n 'ttl-seconds': globalFlags.ttlSeconds,\n undername: globalFlags.undername,\n uploader: globalFlags.uploader,\n 'use-arns': globalFlags.useArns,\n wallet: globalFlags.wallet,\n} as const\n\n/**\n * Upload command — file/folder to Arweave via Turbo without updating ArNS\n */\nexport const uploadFlagConfigs = {\n 'dedupe-cache-max-entries': globalFlags.dedupeCacheMaxEntries,\n 'deploy-file': globalFlags.deployFile,\n 'deploy-folder': globalFlags.deployFolder,\n 'max-token-amount': globalFlags.maxTokenAmount,\n 'no-dedupe': globalFlags.noDedupe,\n 'on-demand': globalFlags.onDemand,\n 'private-key': globalFlags.privateKey,\n 'sig-type': globalFlags.sigType,\n uploader: globalFlags.uploader,\n wallet: globalFlags.wallet,\n} as const\n\nexport type UploadConfig = ResolvedConfig<typeof uploadFlagConfigs>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flags.js","sources":["../../src/constants/flags.ts"],"sourcesContent":["import { Flags } from '@oclif/core'\n\nimport { promptArnsName, promptCluster } from '../prompts/arns.js'\nimport { promptDeployTarget } from '../prompts/deployment.js'\nimport { promptSignerType } from '../prompts/wallet.js'\nimport { createFlagConfig, type ResolvedConfig } from '../utils/config-resolver.js'\nimport { TTL_MAX, TTL_MIN } from '../utils/constants.js'\nimport {\n validateFileExists,\n validateFolderExists,\n validateTtl,\n validateUndername,\n} from '../utils/validators.js'\nimport { DEFAULT_CACHE_MAX_ENTRIES } from './cache.js'\n\n/**\n * Global flag definitions - single source of truth for all flags\n * Each flag includes its oclif definition and optional prompt function\n */\nexport const globalFlags = {\n arnsName: createFlagConfig<string>({\n flag: Flags.string({\n char: 'n',\n description: 'The ArNS name to deploy to',\n required: false,\n }),\n prompt: promptArnsName,\n triggersInteractive: true,\n }),\n arnsPrivateKey: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description:\n 'ArNS authority key: base58 Solana secret key that controls the ArNS name and signs the record update (alternative to --arns-wallet). Falls back to the ARNS_KEY env var. This is separate from the upload key.',\n exclusive: ['arns-wallet'],\n required: false,\n }),\n }),\n arnsWallet: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description:\n 'ArNS authority key: path to the Solana wallet file (solana-keygen id.json) that controls the ArNS name and signs the record update. Falls back to the ARNS_KEY env var. This is separate from the upload key.',\n exclusive: ['arns-private-key'],\n async parse(input) {\n const validation = validateFileExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n cluster: createFlagConfig<string>({\n flag: Flags.string({\n char: 'p',\n default: 'mainnet',\n description: 'Solana cluster for ArNS updates (mainnet or devnet)',\n options: ['mainnet', 'devnet'],\n required: false,\n }),\n prompt: promptCluster,\n }),\n dedupeCacheMaxEntries: createFlagConfig<number>({\n flag: Flags.integer({\n default: DEFAULT_CACHE_MAX_ENTRIES,\n description: 'Maximum number of entries to keep in the dedupe cache (LRU)',\n min: 0,\n required: false,\n }),\n }),\n deployFile: createFlagConfig<string | undefined>({\n flag: Flags.string({\n char: 'f',\n description: 'File to deploy (overrides deploy-folder)',\n async parse(input) {\n const validation = validateFileExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n async prompt() {\n const target = await promptDeployTarget()\n return target.type === 'file' ? target.path : undefined\n },\n }),\n deployFolder: createFlagConfig<string>({\n flag: Flags.string({\n char: 'd',\n default: './dist',\n description: 'Folder to deploy',\n async parse(input) {\n const validation = validateFolderExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n async prompt() {\n const target = await promptDeployTarget()\n return target.type === 'folder' ? target.path : './dist'\n },\n }),\n // Advanced payment settings\n maxTokenAmount: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description: 'Maximum token amount for on-demand payment',\n required: false,\n }),\n }),\n noDedupe: createFlagConfig<boolean>({\n flag: Flags.boolean({\n default: false,\n description: 'Disable deduplication (do not cache or reuse previous uploads)',\n required: false,\n }),\n }),\n onDemand: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description: 'Enable on-demand payment with specified token (ario or base-eth)',\n options: ['ario', 'base-eth'],\n required: false,\n }),\n }),\n privateKey: createFlagConfig<string | undefined>({\n flag: Flags.string({\n char: 'k',\n description:\n 'Upload key (pays for the upload): private key string, alternative to --wallet. JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana.',\n exclusive: ['wallet'],\n required: false,\n }),\n }),\n rpcUrl: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description: 'Optional Solana RPC URL override for ArNS updates',\n required: false,\n }),\n }),\n sigType: createFlagConfig<string>({\n flag: Flags.string({\n char: 's',\n default: 'arweave',\n description: 'Signer type for the upload key (pays for the upload).',\n options: ['arweave', 'ethereum', 'polygon', 'kyve', 'solana'],\n required: false,\n }),\n prompt: promptSignerType,\n }),\n ttlSeconds: createFlagConfig<string>({\n flag: Flags.string({\n char: 't',\n default: '60',\n description: `ArNS TTL in seconds (${TTL_MIN}-${TTL_MAX})`,\n async parse(input) {\n const validation = validateTtl(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n undername: createFlagConfig<string>({\n flag: Flags.string({\n char: 'u',\n default: '@',\n description: 'ANT undername to update',\n async parse(input) {\n const validation = validateUndername(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n uploader: createFlagConfig<string | undefined>({\n flag: Flags.string({\n description:\n 'Custom Turbo upload service base URL. Omit for ArDrive production: https://upload.ardrive.io.',\n required: false,\n }),\n }),\n useArns: createFlagConfig<boolean>({\n flag: Flags.boolean({\n default: false,\n description: 'Update an ArNS/ANT record after upload.',\n required: false,\n }),\n }),\n wallet: createFlagConfig<string | undefined>({\n flag: Flags.string({\n char: 'w',\n description:\n 'Upload key (pays for the upload): path to wallet file. JWK for Arweave, private key for EVM chains, solana-keygen id.json for Solana.',\n exclusive: ['private-key'],\n async parse(input) {\n const validation = validateFileExists(input)\n if (validation !== true) {\n throw new Error(validation)\n }\n\n return input\n },\n required: false,\n }),\n }),\n}\n\n/**\n * Complete set of flags for the deploy command\n */\nexport const deployFlags = {\n 'arns-name': globalFlags.arnsName.flag,\n 'arns-private-key': globalFlags.arnsPrivateKey.flag,\n 'arns-wallet': globalFlags.arnsWallet.flag,\n cluster: globalFlags.cluster.flag,\n 'dedupe-cache-max-entries': globalFlags.dedupeCacheMaxEntries.flag,\n 'deploy-file': globalFlags.deployFile.flag,\n 'deploy-folder': globalFlags.deployFolder.flag,\n 'max-token-amount': globalFlags.maxTokenAmount.flag,\n 'no-dedupe': globalFlags.noDedupe.flag,\n 'on-demand': globalFlags.onDemand.flag,\n 'private-key': globalFlags.privateKey.flag,\n 'rpc-url': globalFlags.rpcUrl.flag,\n 'sig-type': globalFlags.sigType.flag,\n 'ttl-seconds': globalFlags.ttlSeconds.flag,\n undername: globalFlags.undername.flag,\n uploader: globalFlags.uploader.flag,\n 'use-arns': globalFlags.useArns.flag,\n wallet: globalFlags.wallet.flag,\n}\n\n/**\n * ArNS-specific flags (subset of deploy flags)\n */\nexport const arnsFlags = {\n 'arns-name': globalFlags.arnsName.flag,\n 'arns-private-key': globalFlags.arnsPrivateKey.flag,\n 'arns-wallet': globalFlags.arnsWallet.flag,\n cluster: globalFlags.cluster.flag,\n 'rpc-url': globalFlags.rpcUrl.flag,\n 'ttl-seconds': globalFlags.ttlSeconds.flag,\n undername: globalFlags.undername.flag,\n}\n\n/**\n * Wallet/authentication flags (subset of deploy flags)\n */\nexport const walletFlags = {\n 'private-key': globalFlags.privateKey.flag,\n 'sig-type': globalFlags.sigType.flag,\n wallet: globalFlags.wallet.flag,\n}\n\n/**\n * Deploy command configuration type\n */\nexport interface DeployConfig {\n 'arns-name'?: string\n 'arns-private-key'?: string\n 'arns-wallet'?: string\n cluster: string\n 'dedupe-cache-max-entries': number\n 'deploy-file'?: string\n 'deploy-folder': string\n 'max-token-amount'?: string\n 'no-dedupe': boolean\n 'on-demand'?: string\n 'private-key'?: string\n 'rpc-url'?: string\n 'sig-type': string\n 'ttl-seconds': string\n undername: string\n 'use-arns': boolean\n uploader?: string\n wallet?: string\n}\n\n/**\n * Deploy command flag configurations\n * Maps kebab-case flag names to their camelCase globalFlags definitions\n */\nexport const deployFlagConfigs = {\n 'arns-name': globalFlags.arnsName,\n 'arns-private-key': globalFlags.arnsPrivateKey,\n 'arns-wallet': globalFlags.arnsWallet,\n cluster: globalFlags.cluster,\n 'dedupe-cache-max-entries': globalFlags.dedupeCacheMaxEntries,\n 'deploy-file': globalFlags.deployFile,\n 'deploy-folder': globalFlags.deployFolder,\n 'max-token-amount': globalFlags.maxTokenAmount,\n 'no-dedupe': globalFlags.noDedupe,\n 'on-demand': globalFlags.onDemand,\n 'private-key': globalFlags.privateKey,\n 'rpc-url': globalFlags.rpcUrl,\n 'sig-type': globalFlags.sigType,\n 'ttl-seconds': globalFlags.ttlSeconds,\n undername: globalFlags.undername,\n uploader: globalFlags.uploader,\n 'use-arns': globalFlags.useArns,\n wallet: globalFlags.wallet,\n} as const\n\n/**\n * Upload command — file/folder to Arweave via Turbo without updating ArNS\n */\nexport const uploadFlagConfigs = {\n 'dedupe-cache-max-entries': globalFlags.dedupeCacheMaxEntries,\n 'deploy-file': globalFlags.deployFile,\n 'deploy-folder': globalFlags.deployFolder,\n 'max-token-amount': globalFlags.maxTokenAmount,\n 'no-dedupe': globalFlags.noDedupe,\n 'on-demand': globalFlags.onDemand,\n 'private-key': globalFlags.privateKey,\n 'sig-type': globalFlags.sigType,\n uploader: globalFlags.uploader,\n wallet: globalFlags.wallet,\n} as const\n\nexport type UploadConfig = ResolvedConfig<typeof uploadFlagConfigs>\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,12 @@
1
1
  import { select, input, confirm } from '@inquirer/prompts';
2
2
  import { validateArnsName, validateTtl } from '../utils/validators.js';
3
3
 
4
+ async function promptUpdateArns() {
5
+ return confirm({
6
+ default: true,
7
+ message: "Update an ArNS name after upload?"
8
+ });
9
+ }
4
10
  async function promptArnsName() {
5
11
  return input({
6
12
  message: "Enter your ArNS name:",
@@ -76,5 +82,5 @@ async function promptAdvancedOptions() {
76
82
  };
77
83
  }
78
84
 
79
- export { promptAdvancedOptions, promptArnsName, promptCluster, promptTtl, promptUndername };
85
+ export { promptAdvancedOptions, promptArnsName, promptCluster, promptTtl, promptUndername, promptUpdateArns };
80
86
  //# sourceMappingURL=arns.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"arns.js","sources":["../../src/prompts/arns.ts"],"sourcesContent":["import { confirm, input, select } from '@inquirer/prompts'\n\nimport { validateArnsName, validateTtl } from '../utils/validators.js'\n\nexport interface AdvancedOptions {\n cluster: string\n maxTokenAmount?: string\n onDemand?: string\n ttlSeconds: string\n undername: string\n}\n\nexport async function promptArnsName(): Promise<string> {\n return input({\n message: 'Enter your ArNS name:',\n required: true,\n validate: validateArnsName,\n })\n}\n\nexport async function promptUndername(): Promise<string> {\n return input({\n default: '@',\n message: 'Enter undername (subdomain):',\n })\n}\n\nexport async function promptTtl(): Promise<string> {\n return input({\n default: '60',\n message: 'Enter TTL in seconds:',\n validate: validateTtl,\n })\n}\n\nexport async function promptCluster(): Promise<string> {\n return select({\n choices: [\n { name: 'Mainnet', value: 'mainnet' },\n { name: 'Devnet', value: 'devnet' },\n ],\n default: 'mainnet',\n message: 'Select Solana cluster:',\n })\n}\n\nexport async function promptAdvancedOptions(): Promise<AdvancedOptions | null> {\n const wantsAdvanced = await confirm({\n default: false,\n message: 'Configure advanced options?',\n })\n\n if (!wantsAdvanced) {\n return null\n }\n\n const undername = await promptUndername()\n const ttlSeconds = await promptTtl()\n const cluster = await promptCluster()\n\n // On-demand payment options\n const wantsOnDemand = await confirm({\n default: false,\n message: 'Enable on-demand payment?',\n })\n\n let onDemand: string | undefined\n let maxTokenAmount: string | undefined\n\n if (wantsOnDemand) {\n onDemand = await select({\n choices: [\n { name: 'ARIO', value: 'ario' },\n { name: 'ETH (Base Network)', value: 'base-eth' },\n ],\n message: 'Select payment token:',\n })\n\n maxTokenAmount = await input({\n message: 'Enter maximum token amount:',\n validate(value: string) {\n const num = Number.parseFloat(value)\n if (Number.isNaN(num) || num <= 0) {\n return 'Please enter a valid positive number'\n }\n\n return true\n },\n })\n }\n\n return {\n cluster,\n maxTokenAmount,\n onDemand,\n ttlSeconds,\n undername,\n }\n}\n"],"names":[],"mappings":";;;AAYA,eAAsB,cAAA,GAAkC;AACtD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,uBAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,eAAA,GAAmC;AACvD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,GAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,SAAA,GAA6B;AACjD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,uBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,aAAA,GAAiC;AACrD,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,MACpC,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,KACpC;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,qBAAA,GAAyD;AAC7E,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ;AAAA,IAClC,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,eAAA,EAAgB;AACxC,EAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAU;AACnC,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,EAAc;AAGpC,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ;AAAA,IAClC,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,cAAA;AAEJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,QAAA,GAAW,MAAM,MAAA,CAAO;AAAA,MACtB,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC9B,EAAE,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAO,UAAA;AAAW,OAClD;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,cAAA,GAAiB,MAAM,KAAA,CAAM;AAAA,MAC3B,OAAA,EAAS,6BAAA;AAAA,MACT,SAAS,KAAA,EAAe;AACtB,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACnC,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACjC,UAAA,OAAO,sCAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"arns.js","sources":["../../src/prompts/arns.ts"],"sourcesContent":["import { confirm, input, select } from '@inquirer/prompts'\n\nimport { validateArnsName, validateTtl } from '../utils/validators.js'\n\nexport interface AdvancedOptions {\n cluster: string\n maxTokenAmount?: string\n onDemand?: string\n ttlSeconds: string\n undername: string\n}\n\nexport async function promptUpdateArns(): Promise<boolean> {\n return confirm({\n default: true,\n message: 'Update an ArNS name after upload?',\n })\n}\n\nexport async function promptArnsName(): Promise<string> {\n return input({\n message: 'Enter your ArNS name:',\n required: true,\n validate: validateArnsName,\n })\n}\n\nexport async function promptUndername(): Promise<string> {\n return input({\n default: '@',\n message: 'Enter undername (subdomain):',\n })\n}\n\nexport async function promptTtl(): Promise<string> {\n return input({\n default: '60',\n message: 'Enter TTL in seconds:',\n validate: validateTtl,\n })\n}\n\nexport async function promptCluster(): Promise<string> {\n return select({\n choices: [\n { name: 'Mainnet', value: 'mainnet' },\n { name: 'Devnet', value: 'devnet' },\n ],\n default: 'mainnet',\n message: 'Select Solana cluster:',\n })\n}\n\nexport async function promptAdvancedOptions(): Promise<AdvancedOptions | null> {\n const wantsAdvanced = await confirm({\n default: false,\n message: 'Configure advanced options?',\n })\n\n if (!wantsAdvanced) {\n return null\n }\n\n const undername = await promptUndername()\n const ttlSeconds = await promptTtl()\n const cluster = await promptCluster()\n\n // On-demand payment options\n const wantsOnDemand = await confirm({\n default: false,\n message: 'Enable on-demand payment?',\n })\n\n let onDemand: string | undefined\n let maxTokenAmount: string | undefined\n\n if (wantsOnDemand) {\n onDemand = await select({\n choices: [\n { name: 'ARIO', value: 'ario' },\n { name: 'ETH (Base Network)', value: 'base-eth' },\n ],\n message: 'Select payment token:',\n })\n\n maxTokenAmount = await input({\n message: 'Enter maximum token amount:',\n validate(value: string) {\n const num = Number.parseFloat(value)\n if (Number.isNaN(num) || num <= 0) {\n return 'Please enter a valid positive number'\n }\n\n return true\n },\n })\n }\n\n return {\n cluster,\n maxTokenAmount,\n onDemand,\n ttlSeconds,\n undername,\n }\n}\n"],"names":[],"mappings":";;;AAYA,eAAsB,gBAAA,GAAqC;AACzD,EAAA,OAAO,OAAA,CAAQ;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,cAAA,GAAkC;AACtD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,uBAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,eAAA,GAAmC;AACvD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,GAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,SAAA,GAA6B;AACjD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,uBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,aAAA,GAAiC;AACrD,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,MACpC,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,KACpC;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,qBAAA,GAAyD;AAC7E,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ;AAAA,IAClC,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,eAAA,EAAgB;AACxC,EAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAU;AACnC,EAAA,MAAM,OAAA,GAAU,MAAM,aAAA,EAAc;AAGpC,EAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ;AAAA,IAClC,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,cAAA;AAEJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,QAAA,GAAW,MAAM,MAAA,CAAO;AAAA,MACtB,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,QAC9B,EAAE,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAO,UAAA;AAAW,OAClD;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,cAAA,GAAiB,MAAM,KAAA,CAAM;AAAA,MAC3B,OAAA,EAAS,6BAAA;AAAA,MACT,SAAS,KAAA,EAAe;AACtB,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACnC,QAAA,IAAI,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,IAAK,OAAO,CAAA,EAAG;AACjC,UAAA,OAAO,sCAAA;AAAA,QACT;AAEA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,29 +1,32 @@
1
1
  import { select, input } from '@inquirer/prompts';
2
2
  import { validateFileExists } from '../utils/validators.js';
3
3
 
4
- async function promptWalletMethod() {
4
+ async function promptWalletMethod(opts) {
5
5
  return select({
6
6
  choices: [
7
- { name: "Wallet file path", value: "file" },
8
- { name: "Private key/JWK string", value: "string" },
9
- { name: "Environment variable (DEPLOY_KEY)", value: "env" }
7
+ { name: `${capitalize(opts.label)} file path`, value: "file" },
8
+ { name: `${capitalize(opts.label)} private key/JWK string`, value: "string" },
9
+ { name: `Environment variable (${opts.envVar})`, value: "env" }
10
10
  ],
11
- message: "How do you want to provide your wallet?"
11
+ message: `How do you want to provide your ${opts.label} (${opts.purpose})?`
12
12
  });
13
13
  }
14
- async function promptWalletFile() {
14
+ async function promptWalletFile(opts) {
15
15
  return input({
16
- default: "./wallet.json",
17
- message: "Enter wallet file path:",
16
+ default: opts.fileDefault ?? "./wallet.json",
17
+ message: `Enter ${opts.label} file path:`,
18
18
  validate: validateFileExists
19
19
  });
20
20
  }
21
- async function promptPrivateKey() {
21
+ async function promptPrivateKey(opts) {
22
22
  return input({
23
- message: "Enter your private key or JWK JSON:",
23
+ message: `Enter your ${opts.label} (private key or JWK JSON):`,
24
24
  required: true
25
25
  });
26
26
  }
27
+ function capitalize(value) {
28
+ return value.charAt(0).toUpperCase() + value.slice(1);
29
+ }
27
30
  async function promptSignerType() {
28
31
  return select({
29
32
  choices: [
@@ -37,13 +40,13 @@ async function promptSignerType() {
37
40
  message: "Select signer type:"
38
41
  });
39
42
  }
40
- async function getWalletConfig() {
41
- const method = await promptWalletMethod();
43
+ async function getWalletConfig(opts) {
44
+ const method = await promptWalletMethod(opts);
42
45
  const config = { method };
43
46
  if (method === "file") {
44
- config.wallet = await promptWalletFile();
47
+ config.wallet = await promptWalletFile(opts);
45
48
  } else if (method === "string") {
46
- config.privateKey = await promptPrivateKey();
49
+ config.privateKey = await promptPrivateKey(opts);
47
50
  }
48
51
  return config;
49
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.js","sources":["../../src/prompts/wallet.ts"],"sourcesContent":["import { input, select } from '@inquirer/prompts'\n\nimport { validateFileExists } from '../utils/validators.js'\n\nexport interface WalletConfig {\n method: 'env' | 'file' | 'string'\n privateKey?: string\n wallet?: string\n}\n\nexport async function promptWalletMethod(): Promise<string> {\n return select({\n choices: [\n { name: 'Wallet file path', value: 'file' },\n { name: 'Private key/JWK string', value: 'string' },\n { name: 'Environment variable (DEPLOY_KEY)', value: 'env' },\n ],\n message: 'How do you want to provide your wallet?',\n })\n}\n\nexport async function promptWalletFile(): Promise<string> {\n return input({\n default: './wallet.json',\n message: 'Enter wallet file path:',\n validate: validateFileExists,\n })\n}\n\nexport async function promptPrivateKey(): Promise<string> {\n return input({\n message: 'Enter your private key or JWK JSON:',\n required: true,\n })\n}\n\nexport async function promptSignerType(): Promise<string> {\n return select({\n choices: [\n { name: 'Arweave', value: 'arweave' },\n { name: 'Ethereum', value: 'ethereum' },\n { name: 'Polygon', value: 'polygon' },\n { name: 'KYVE', value: 'kyve' },\n { name: 'Solana', value: 'solana' },\n ],\n default: 'arweave',\n message: 'Select signer type:',\n })\n}\n\nexport async function getWalletConfig(): Promise<WalletConfig> {\n const method = (await promptWalletMethod()) as 'env' | 'file' | 'string'\n\n const config: WalletConfig = { method }\n\n if (method === 'file') {\n config.wallet = await promptWalletFile()\n } else if (method === 'string') {\n config.privateKey = await promptPrivateKey()\n }\n\n return config\n}\n"],"names":[],"mappings":";;;AAUA,eAAsB,kBAAA,GAAsC;AAC1D,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,kBAAA,EAAoB,KAAA,EAAO,MAAA,EAAO;AAAA,MAC1C,EAAE,IAAA,EAAM,wBAAA,EAA0B,KAAA,EAAO,QAAA,EAAS;AAAA,MAClD,EAAE,IAAA,EAAM,mCAAA,EAAqC,KAAA,EAAO,KAAA;AAAM,KAC5D;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,gBAAA,GAAoC;AACxD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,eAAA;AAAA,IACT,OAAA,EAAS,yBAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,gBAAA,GAAoC;AACxD,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,qCAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,gBAAA,GAAoC;AACxD,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,MACpC,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,MACtC,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,MACpC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,KACpC;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,eAAA,GAAyC;AAC7D,EAAA,MAAM,MAAA,GAAU,MAAM,kBAAA,EAAmB;AAEzC,EAAA,MAAM,MAAA,GAAuB,EAAE,MAAA,EAAO;AAEtC,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,gBAAA,EAAiB;AAAA,EACzC,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,UAAA,GAAa,MAAM,gBAAA,EAAiB;AAAA,EAC7C;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"wallet.js","sources":["../../src/prompts/wallet.ts"],"sourcesContent":["import { input, select } from '@inquirer/prompts'\n\nimport { validateFileExists } from '../utils/validators.js'\n\nexport interface WalletConfig {\n method: 'env' | 'file' | 'string'\n privateKey?: string\n wallet?: string\n}\n\n/**\n * Describes which key is being collected so prompts can be explicit about\n * purpose (e.g. the upload key that pays for the upload vs. the ArNS authority\n * key that signs the record update).\n */\nexport interface KeyPromptOptions {\n /** Short name for the key, e.g. 'upload key' or 'ArNS authority key' */\n label: string\n /** What the key is used for, e.g. 'pays for the upload' */\n purpose: string\n /** Environment variable that can supply this key, e.g. 'DEPLOY_KEY' */\n envVar: string\n /** Default path shown in the file prompt */\n fileDefault?: string\n}\n\nexport async function promptWalletMethod(opts: KeyPromptOptions): Promise<string> {\n return select({\n choices: [\n { name: `${capitalize(opts.label)} file path`, value: 'file' },\n { name: `${capitalize(opts.label)} private key/JWK string`, value: 'string' },\n { name: `Environment variable (${opts.envVar})`, value: 'env' },\n ],\n message: `How do you want to provide your ${opts.label} (${opts.purpose})?`,\n })\n}\n\nexport async function promptWalletFile(opts: KeyPromptOptions): Promise<string> {\n return input({\n default: opts.fileDefault ?? './wallet.json',\n message: `Enter ${opts.label} file path:`,\n validate: validateFileExists,\n })\n}\n\nexport async function promptPrivateKey(opts: KeyPromptOptions): Promise<string> {\n return input({\n message: `Enter your ${opts.label} (private key or JWK JSON):`,\n required: true,\n })\n}\n\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nexport async function promptSignerType(): Promise<string> {\n return select({\n choices: [\n { name: 'Arweave', value: 'arweave' },\n { name: 'Ethereum', value: 'ethereum' },\n { name: 'Polygon', value: 'polygon' },\n { name: 'KYVE', value: 'kyve' },\n { name: 'Solana', value: 'solana' },\n ],\n default: 'arweave',\n message: 'Select signer type:',\n })\n}\n\nexport async function getWalletConfig(opts: KeyPromptOptions): Promise<WalletConfig> {\n const method = (await promptWalletMethod(opts)) as 'env' | 'file' | 'string'\n\n const config: WalletConfig = { method }\n\n if (method === 'file') {\n config.wallet = await promptWalletFile(opts)\n } else if (method === 'string') {\n config.privateKey = await promptPrivateKey(opts)\n }\n\n return config\n}\n"],"names":[],"mappings":";;;AA0BA,eAAsB,mBAAmB,IAAA,EAAyC;AAChF,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,EAAE,MAAM,CAAA,EAAG,UAAA,CAAW,KAAK,KAAK,CAAC,CAAA,UAAA,CAAA,EAAc,KAAA,EAAO,MAAA,EAAO;AAAA,MAC7D,EAAE,MAAM,CAAA,EAAG,UAAA,CAAW,KAAK,KAAK,CAAC,CAAA,uBAAA,CAAA,EAA2B,KAAA,EAAO,QAAA,EAAS;AAAA,MAC5E,EAAE,IAAA,EAAM,CAAA,sBAAA,EAAyB,KAAK,MAAM,CAAA,CAAA,CAAA,EAAK,OAAO,KAAA;AAAM,KAChE;AAAA,IACA,SAAS,CAAA,gCAAA,EAAmC,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,KAAK,OAAO,CAAA,EAAA;AAAA,GACxE,CAAA;AACH;AAEA,eAAsB,iBAAiB,IAAA,EAAyC;AAC9E,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,KAAK,WAAA,IAAe,eAAA;AAAA,IAC7B,OAAA,EAAS,CAAA,MAAA,EAAS,IAAA,CAAK,KAAK,CAAA,WAAA,CAAA;AAAA,IAC5B,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,eAAsB,iBAAiB,IAAA,EAAyC;AAC9E,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,OAAA,EAAS,CAAA,WAAA,EAAc,IAAA,CAAK,KAAK,CAAA,2BAAA,CAAA;AAAA,IACjC,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,KAAA,CAAM,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,KAAA,CAAM,MAAM,CAAC,CAAA;AACtD;AAEA,eAAsB,gBAAA,GAAoC;AACxD,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,MACpC,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,MACtC,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,SAAA,EAAU;AAAA,MACpC,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAO;AAAA,MAC9B,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,QAAA;AAAS,KACpC;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACV,CAAA;AACH;AAEA,eAAsB,gBAAgB,IAAA,EAA+C;AACnF,EAAA,MAAM,MAAA,GAAU,MAAM,kBAAA,CAAmB,IAAI,CAAA;AAE7C,EAAA,MAAM,MAAA,GAAuB,EAAE,MAAA,EAAO;AAEtC,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAA,CAAO,MAAA,GAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,EAC7C,CAAA,MAAA,IAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,UAAA,GAAa,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAoBrC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,IAAI,KAAK;IAEzB,OAAgB,WAAW,SAAoE;IAE/F,OAAgB,QAAQ,WAMvB;IAED,OAAgB,KAAK,sBAAkC;IAE1C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuNlC"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAoBrC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,IAAI,KAAK;IAEzB,OAAgB,WAAW,SAAoE;IAE/F,OAAgB,QAAQ,WAMvB;IAED,OAAgB,KAAK,sBAAkC;IAE1C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAgTlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/commands/upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAiBrC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,IAAI,KAAK;IAEzB,OAAgB,WAAW,SAAuE;IAElG,OAAgB,QAAQ,WAOvB;IAED,OAAgB,KAAK,sBAAkC;IAE1C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA6HlC"}
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../../src/commands/upload.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAiBrC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,OAAgB,IAAI,KAAK;IAEzB,OAAgB,WAAW,SAAuE;IAElG,OAAgB,QAAQ,WAOvB;IAED,OAAgB,KAAK,sBAAkC;IAE1C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiIlC"}
@@ -5,6 +5,8 @@ import { type ResolvedConfig } from '../utils/config-resolver.js';
5
5
  */
6
6
  export declare const globalFlags: {
7
7
  arnsName: import("../utils/config-resolver.js").FlagConfig<string, any>;
8
+ arnsPrivateKey: import("../utils/config-resolver.js").FlagConfig<string | undefined, any>;
9
+ arnsWallet: import("../utils/config-resolver.js").FlagConfig<string | undefined, any>;
8
10
  cluster: import("../utils/config-resolver.js").FlagConfig<string, any>;
9
11
  dedupeCacheMaxEntries: import("../utils/config-resolver.js").FlagConfig<number, any>;
10
12
  deployFile: import("../utils/config-resolver.js").FlagConfig<string | undefined, any>;
@@ -26,6 +28,8 @@ export declare const globalFlags: {
26
28
  */
27
29
  export declare const deployFlags: {
28
30
  'arns-name': any;
31
+ 'arns-private-key': any;
32
+ 'arns-wallet': any;
29
33
  cluster: any;
30
34
  'dedupe-cache-max-entries': any;
31
35
  'deploy-file': any;
@@ -47,6 +51,8 @@ export declare const deployFlags: {
47
51
  */
48
52
  export declare const arnsFlags: {
49
53
  'arns-name': any;
54
+ 'arns-private-key': any;
55
+ 'arns-wallet': any;
50
56
  cluster: any;
51
57
  'rpc-url': any;
52
58
  'ttl-seconds': any;
@@ -65,6 +71,8 @@ export declare const walletFlags: {
65
71
  */
66
72
  export interface DeployConfig {
67
73
  'arns-name'?: string;
74
+ 'arns-private-key'?: string;
75
+ 'arns-wallet'?: string;
68
76
  cluster: string;
69
77
  'dedupe-cache-max-entries': number;
70
78
  'deploy-file'?: string;
@@ -87,6 +95,8 @@ export interface DeployConfig {
87
95
  */
88
96
  export declare const deployFlagConfigs: {
89
97
  readonly 'arns-name': import("../utils/config-resolver.js").FlagConfig<string, any>;
98
+ readonly 'arns-private-key': import("../utils/config-resolver.js").FlagConfig<string | undefined, any>;
99
+ readonly 'arns-wallet': import("../utils/config-resolver.js").FlagConfig<string | undefined, any>;
90
100
  readonly cluster: import("../utils/config-resolver.js").FlagConfig<string, any>;
91
101
  readonly 'dedupe-cache-max-entries': import("../utils/config-resolver.js").FlagConfig<number, any>;
92
102
  readonly 'deploy-file': import("../utils/config-resolver.js").FlagConfig<string | undefined, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../../src/constants/flags.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAUnF;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;CAgLvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;CAiBvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;CAIvB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,0BAA0B,EAAE,MAAM,CAAA;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAiBpB,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;CAWpB,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,iBAAiB,CAAC,CAAA"}
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../../src/constants/flags.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAUnF;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CAwMvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;CAmBvB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;CAQrB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;CAIvB,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,0BAA0B,EAAE,MAAM,CAAA;IAClC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;CAmBpB,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;CAWpB,CAAA;AAEV,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,iBAAiB,CAAC,CAAA"}
@@ -5,6 +5,7 @@ export interface AdvancedOptions {
5
5
  ttlSeconds: string;
6
6
  undername: string;
7
7
  }
8
+ export declare function promptUpdateArns(): Promise<boolean>;
8
9
  export declare function promptArnsName(): Promise<string>;
9
10
  export declare function promptUndername(): Promise<string>;
10
11
  export declare function promptTtl(): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"arns.d.ts","sourceRoot":"","sources":["../../../src/prompts/arns.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAMtD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAKvD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAMjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CASrD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoD7E"}
1
+ {"version":3,"file":"arns.d.ts","sourceRoot":"","sources":["../../../src/prompts/arns.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAKzD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAMtD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAKvD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAMjD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CASrD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAoD7E"}
@@ -3,9 +3,24 @@ export interface WalletConfig {
3
3
  privateKey?: string;
4
4
  wallet?: string;
5
5
  }
6
- export declare function promptWalletMethod(): Promise<string>;
7
- export declare function promptWalletFile(): Promise<string>;
8
- export declare function promptPrivateKey(): Promise<string>;
6
+ /**
7
+ * Describes which key is being collected so prompts can be explicit about
8
+ * purpose (e.g. the upload key that pays for the upload vs. the ArNS authority
9
+ * key that signs the record update).
10
+ */
11
+ export interface KeyPromptOptions {
12
+ /** Short name for the key, e.g. 'upload key' or 'ArNS authority key' */
13
+ label: string;
14
+ /** What the key is used for, e.g. 'pays for the upload' */
15
+ purpose: string;
16
+ /** Environment variable that can supply this key, e.g. 'DEPLOY_KEY' */
17
+ envVar: string;
18
+ /** Default path shown in the file prompt */
19
+ fileDefault?: string;
20
+ }
21
+ export declare function promptWalletMethod(opts: KeyPromptOptions): Promise<string>;
22
+ export declare function promptWalletFile(opts: KeyPromptOptions): Promise<string>;
23
+ export declare function promptPrivateKey(opts: KeyPromptOptions): Promise<string>;
9
24
  export declare function promptSignerType(): Promise<string>;
10
- export declare function getWalletConfig(): Promise<WalletConfig>;
25
+ export declare function getWalletConfig(opts: KeyPromptOptions): Promise<WalletConfig>;
11
26
  //# sourceMappingURL=wallet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/prompts/wallet.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAS1D;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAMxD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAKxD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYxD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAY7D"}
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/prompts/wallet.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;IACjC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;IACf,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAA;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAShF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAM9E;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAK9E;AAMD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAYxD;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAYnF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ar.io/deploy",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "ARIO Deploy — CLI for deploying apps to the permaweb (Arweave) and updating ArNS",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,20 +24,13 @@
24
24
  "docs:update": "markdown-toc-gen insert README.md --max-depth 2",
25
25
  "generate:types": "openapi-typescript tests/fixtures/upload-service.openapi.yaml -o tests/types/upload-service.ts && openapi-typescript tests/fixtures/payment-service.openapi.yaml -o tests/types/payment-service.ts",
26
26
  "prepare": "husky install",
27
- "changeset": "changeset",
28
- "version": "changeset version",
29
- "version:alpha": "changeset version --snapshot alpha",
30
- "version:snapshot": "changeset version --snapshot rc",
31
- "release": "changeset publish --tag latest",
32
- "release:alpha": "changeset publish --tag alpha",
33
- "release:snapshot": "changeset publish --tag rc --no-git-tag"
27
+ "release": "semantic-release"
34
28
  },
35
29
  "oclif": {
36
30
  "bin": "ario-deploy",
37
31
  "dirname": "ario-deploy",
38
32
  "commands": "./dist/commands",
39
33
  "topicSeparator": " ",
40
- "default": "interactive",
41
34
  "topics": {
42
35
  "deploy": {
43
36
  "description": "Deploy to the permaweb"
@@ -53,7 +46,7 @@
53
46
  "oclif.manifest.json"
54
47
  ],
55
48
  "dependencies": {
56
- "@ar.io/sdk": "4.0.0-solana.38",
49
+ "@ar.io/sdk": "4.0.2-alpha.4",
57
50
  "@ardrive/turbo-sdk": "^1.41.3",
58
51
  "@dha-team/arbundles": "^1.0.4",
59
52
  "@inquirer/prompts": "^7.2.0",
@@ -65,11 +58,13 @@
65
58
  "p-limit": "^7.2.0"
66
59
  },
67
60
  "devDependencies": {
68
- "@changesets/cli": "^2.27.10",
69
61
  "@commitlint/cli": "^19.6.0",
70
62
  "@commitlint/config-conventional": "^19.6.0",
71
63
  "@oclif/prettier-config": "^0.2.1",
72
64
  "@oclif/test": "^4.1.14",
65
+ "@semantic-release/changelog": "^6.0.3",
66
+ "@semantic-release/git": "^10.0.1",
67
+ "@semantic-release/npm": "^13.1.1",
73
68
  "@types/mime-types": "^2.1.4",
74
69
  "@types/node": "^22.10.2",
75
70
  "@typescript-eslint/eslint-plugin": "^8.18.1",
@@ -89,6 +84,7 @@
89
84
  "msw": "^2.11.3",
90
85
  "openapi-typescript": "^7.9.1",
91
86
  "prettier": "^3.4.2",
87
+ "semantic-release": "^25.0.5",
92
88
  "tsx": "^4.19.2",
93
89
  "typescript": "^5.7.2",
94
90
  "vite": "^6.0.5",