@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 +114 -56
- package/bin/dev.js +0 -0
- package/bin/run.js +0 -0
- package/dist/commands/deploy.js +79 -28
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/upload.js +5 -1
- package/dist/commands/upload.js.map +1 -1
- package/dist/constants/flags.js +30 -3
- package/dist/constants/flags.js.map +1 -1
- package/dist/prompts/arns.js +7 -1
- package/dist/prompts/arns.js.map +1 -1
- package/dist/prompts/wallet.js +17 -14
- package/dist/prompts/wallet.js.map +1 -1
- package/dist/src/commands/deploy.d.ts.map +1 -1
- package/dist/src/commands/upload.d.ts.map +1 -1
- package/dist/src/constants/flags.d.ts +10 -0
- package/dist/src/constants/flags.d.ts.map +1 -1
- package/dist/src/prompts/arns.d.ts +1 -0
- package/dist/src/prompts/arns.d.ts.map +1 -1
- package/dist/src/prompts/wallet.d.ts +19 -4
- package/dist/src/prompts/wallet.d.ts.map +1 -1
- package/package.json +7 -11
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
|
-
|
|
86
|
+
A deployment uses up to **two independent keys**:
|
|
68
87
|
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
93
|
+
### Upload key (`DEPLOY_KEY`)
|
|
78
94
|
|
|
79
|
-
|
|
95
|
+
1. **Arweave signer (default):** Encode your Arweave wallet key in base64 and set it as `DEPLOY_KEY`:
|
|
80
96
|
|
|
81
|
-
|
|
97
|
+
```bash
|
|
98
|
+
base64 -i wallet.json | pbcopy
|
|
99
|
+
```
|
|
82
100
|
|
|
83
|
-
|
|
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
|
-
|
|
104
|
+
### ArNS authority key (`ARNS_KEY`)
|
|
86
105
|
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
98
|
-
- **Show Help** - Display help information
|
|
99
|
-
- **Exit** - Exit the CLI
|
|
110
|
+
## Commands
|
|
100
111
|
|
|
101
|
-
|
|
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
|
-
|
|
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 (
|
|
126
|
-
ario-deploy deploy --use-arns --arns-name my-app --
|
|
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
|
|
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 --
|
|
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 --
|
|
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 --
|
|
182
|
-
ario-deploy deploy --use-arns --arns-name my-app --
|
|
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.
|
|
260
|
-
- `--arns-name, -n`: The ArNS name to update. Required when using `--use-arns`; also implies ArNS mode
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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>
|
|
324
|
-
"deploy:staging": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --
|
|
325
|
-
"deploy:devnet": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --
|
|
326
|
-
"deploy:on-demand": "pnpm build && ario-deploy deploy --arns-name <ARNS_NAME> --
|
|
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
|
-
|
|
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
|
|
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 --
|
|
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
|
package/dist/commands/deploy.js
CHANGED
|
@@ -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 ./
|
|
21
|
-
"<%= config.bin %> deploy --wallet ./
|
|
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
|
|
28
|
-
const
|
|
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
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
84
|
-
|
|
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(
|
|
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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"}
|
package/dist/commands/upload.js
CHANGED
|
@@ -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":";;;;;;;;;AAmBA,MAAqB,eAAe,OAAA,CAAQ;AAAA,EAC1C,OAAgB,OAAO,EAAC;AAAA,EAExB,OAAgB,WAAA,GAAc,oEAAA;AAAA,EAE9B,OAAgB,QAAA,GAAW;AAAA,IACzB,iDAAA;AAAA,IACA,wEAAA;AAAA,IACA,iFAAA;AAAA,IACA,qGAAA;AAAA,IACA,qFAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEA,OAAgB,KAAA,GAAQ,YAAA,CAAa,iBAAiB,CAAA;AAAA,EAEtD,MAAa,GAAA,GAAqB;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,MAAM,MAAM,CAAA;AAEzC,MAAA,MAAM,WAAA,GAAc,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,KAAA,CAAM,aAAa,CAAA,IAAK,CAAC,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,IAAA,EAAK;AAE5F,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAA,CAAK,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,IAAA,CAAK,6BAA6B,CAAC,CAAC,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,UAAA,GAAc,MAAM,aAAA,CAAwC,iBAAA,EAAmB,KAAA,EAAO;AAAA,QAC1F;AAAA,OACD,CAAA;AAED,MAAA,IAAI,YAAA,GAAyD;AAAA,QAC3D,UAAA,EAAY,WAAW,aAAa,CAAA;AAAA,QACpC,QAAQ,UAAA,CAAW;AAAA,OACrB;AAEA,MAAA,IAAI,eAAe,CAAC,UAAA,CAAW,UAAU,CAAC,UAAA,CAAW,aAAa,CAAA,EAAG;AACnE,QAAA,MAAM,MAAA,GAAS,MAAM,eAAA,
|
|
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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"}
|
package/dist/constants/flags.js
CHANGED
|
@@ -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: "
|
|
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
|
|
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: "
|
|
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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"}
|
package/dist/prompts/arns.js
CHANGED
|
@@ -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
|
package/dist/prompts/arns.js.map
CHANGED
|
@@ -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;;;;"}
|
package/dist/prompts/wallet.js
CHANGED
|
@@ -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:
|
|
8
|
-
{ name:
|
|
9
|
-
{ name:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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;
|
|
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;
|
|
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
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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,
|
|
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": "
|
|
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
|
-
"
|
|
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.
|
|
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",
|