@ar.io/deploy 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +695 -0
  3. package/bin/dev.js +5 -0
  4. package/bin/run.js +5 -0
  5. package/dist/chunks/cache-C1tEeUx2.js +6 -0
  6. package/dist/chunks/cache-C1tEeUx2.js.map +1 -0
  7. package/dist/chunks/display-DRcjDj9k.js +104 -0
  8. package/dist/chunks/display-DRcjDj9k.js.map +1 -0
  9. package/dist/chunks/upload-workflow-DSS5FIa5.js +204 -0
  10. package/dist/chunks/upload-workflow-DSS5FIa5.js.map +1 -0
  11. package/dist/chunks/uploader-B2tC-1Qw.js +472 -0
  12. package/dist/chunks/uploader-B2tC-1Qw.js.map +1 -0
  13. package/dist/commands/deploy.js +187 -0
  14. package/dist/commands/deploy.js.map +1 -0
  15. package/dist/commands/upload.js +122 -0
  16. package/dist/commands/upload.js.map +1 -0
  17. package/dist/constants/flags.js +241 -0
  18. package/dist/constants/flags.js.map +1 -0
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/prompts/arns.js +80 -0
  22. package/dist/prompts/arns.js.map +1 -0
  23. package/dist/prompts/deployment.js +27 -0
  24. package/dist/prompts/deployment.js.map +1 -0
  25. package/dist/prompts/wallet.js +52 -0
  26. package/dist/prompts/wallet.js.map +1 -0
  27. package/dist/src/commands/deploy.d.ts +9 -0
  28. package/dist/src/commands/deploy.d.ts.map +1 -0
  29. package/dist/src/commands/upload.d.ts +9 -0
  30. package/dist/src/commands/upload.d.ts.map +1 -0
  31. package/dist/src/constants/cache.d.ts +4 -0
  32. package/dist/src/constants/cache.d.ts.map +1 -0
  33. package/dist/src/constants/flags.d.ts +122 -0
  34. package/dist/src/constants/flags.d.ts.map +1 -0
  35. package/dist/src/index.d.ts +2 -0
  36. package/dist/src/index.d.ts.map +1 -0
  37. package/dist/src/prompts/arns.d.ts +13 -0
  38. package/dist/src/prompts/arns.d.ts.map +1 -0
  39. package/dist/src/prompts/deployment.d.ts +6 -0
  40. package/dist/src/prompts/deployment.d.ts.map +1 -0
  41. package/dist/src/prompts/wallet.d.ts +11 -0
  42. package/dist/src/prompts/wallet.d.ts.map +1 -0
  43. package/dist/src/types/index.d.ts +31 -0
  44. package/dist/src/types/index.d.ts.map +1 -0
  45. package/dist/src/utils/__tests__/cache.test.d.ts +2 -0
  46. package/dist/src/utils/__tests__/cache.test.d.ts.map +1 -0
  47. package/dist/src/utils/__tests__/constants.test.d.ts +2 -0
  48. package/dist/src/utils/__tests__/constants.test.d.ts.map +1 -0
  49. package/dist/src/utils/__tests__/display.test.d.ts +2 -0
  50. package/dist/src/utils/__tests__/display.test.d.ts.map +1 -0
  51. package/dist/src/utils/cache.d.ts +48 -0
  52. package/dist/src/utils/cache.d.ts.map +1 -0
  53. package/dist/src/utils/chalk.d.ts +9 -0
  54. package/dist/src/utils/chalk.d.ts.map +1 -0
  55. package/dist/src/utils/config-resolver.d.ts +72 -0
  56. package/dist/src/utils/config-resolver.d.ts.map +1 -0
  57. package/dist/src/utils/constants.d.ts +4 -0
  58. package/dist/src/utils/constants.d.ts.map +1 -0
  59. package/dist/src/utils/deploy-key.d.ts +15 -0
  60. package/dist/src/utils/deploy-key.d.ts.map +1 -0
  61. package/dist/src/utils/display.d.ts +7 -0
  62. package/dist/src/utils/display.d.ts.map +1 -0
  63. package/dist/src/utils/path.d.ts +5 -0
  64. package/dist/src/utils/path.d.ts.map +1 -0
  65. package/dist/src/utils/signer.d.ts +19 -0
  66. package/dist/src/utils/signer.d.ts.map +1 -0
  67. package/dist/src/utils/solana.d.ts +29 -0
  68. package/dist/src/utils/solana.d.ts.map +1 -0
  69. package/dist/src/utils/upload-types.d.ts +35 -0
  70. package/dist/src/utils/upload-types.d.ts.map +1 -0
  71. package/dist/src/utils/uploader.d.ts +50 -0
  72. package/dist/src/utils/uploader.d.ts.map +1 -0
  73. package/dist/src/utils/validators.d.ts +21 -0
  74. package/dist/src/utils/validators.d.ts.map +1 -0
  75. package/dist/src/workflows/upload-workflow.d.ts +28 -0
  76. package/dist/src/workflows/upload-workflow.d.ts.map +1 -0
  77. package/dist/tests/constants.d.ts +11 -0
  78. package/dist/tests/constants.d.ts.map +1 -0
  79. package/dist/tests/e2e/deploy-command.test.d.ts +2 -0
  80. package/dist/tests/e2e/deploy-command.test.d.ts.map +1 -0
  81. package/dist/tests/global-setup.d.ts +6 -0
  82. package/dist/tests/global-setup.d.ts.map +1 -0
  83. package/dist/tests/mocks/turbo-handlers.d.ts +106 -0
  84. package/dist/tests/mocks/turbo-handlers.d.ts.map +1 -0
  85. package/dist/tests/setup.d.ts +11 -0
  86. package/dist/tests/setup.d.ts.map +1 -0
  87. package/dist/tests/types/payment-service.d.ts +218 -0
  88. package/dist/tests/types/payment-service.d.ts.map +1 -0
  89. package/dist/tests/types/upload-service.d.ts +168 -0
  90. package/dist/tests/types/upload-service.d.ts.map +1 -0
  91. package/dist/tests/unit/deploy-key.test.d.ts +2 -0
  92. package/dist/tests/unit/deploy-key.test.d.ts.map +1 -0
  93. package/dist/tests/unit/signer.test.d.ts +2 -0
  94. package/dist/tests/unit/signer.test.d.ts.map +1 -0
  95. package/dist/tests/unit/solana.test.d.ts +2 -0
  96. package/dist/tests/unit/solana.test.d.ts.map +1 -0
  97. package/dist/tests/unit/uploader-tags.test.d.ts +2 -0
  98. package/dist/tests/unit/uploader-tags.test.d.ts.map +1 -0
  99. package/dist/tests/unit/validators.test.d.ts +2 -0
  100. package/dist/tests/unit/validators.test.d.ts.map +1 -0
  101. package/dist/types/index.js +2 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/utils/config-resolver.js +39 -0
  104. package/dist/utils/config-resolver.js.map +1 -0
  105. package/dist/utils/constants.js +6 -0
  106. package/dist/utils/constants.js.map +1 -0
  107. package/dist/utils/path.js +15 -0
  108. package/dist/utils/path.js.map +1 -0
  109. package/dist/utils/signer.js +45 -0
  110. package/dist/utils/signer.js.map +1 -0
  111. package/dist/utils/uploader.js +5 -0
  112. package/dist/utils/uploader.js.map +1 -0
  113. package/dist/utils/validators.js +43 -0
  114. package/dist/utils/validators.js.map +1 -0
  115. package/dist/workflows/upload-workflow.js +9 -0
  116. package/dist/workflows/upload-workflow.js.map +1 -0
  117. package/package.json +116 -0
@@ -0,0 +1,187 @@
1
+ import fs from 'node:fs';
2
+ import { ARIO, SolanaANTWriteable } from '@ar.io/sdk';
3
+ import { Command } from '@oclif/core';
4
+ import ora from 'ora';
5
+ import { deployFlagConfigs } from '../constants/flags.js';
6
+ import { promptAdvancedOptions } from '../prompts/arns.js';
7
+ import { getWalletConfig } from '../prompts/wallet.js';
8
+ import { c as chalk, r as runUploadWorkflow } from '../chunks/upload-workflow-DSS5FIa5.js';
9
+ import { extractFlags, resolveConfig } from '../utils/config-resolver.js';
10
+ import { d as deployKeyFromWalletFile, a as deployKeyFromPrivateKey, f as formatDisplayRows, c as clusterProgramIds, b as createArioRpc, e as createSolanaArnsSigner, g as createArioRpcSubscriptions, h as formatUploadError } from '../chunks/display-DRcjDj9k.js';
11
+ import { expandPath } from '../utils/path.js';
12
+
13
+ class Deploy extends Command {
14
+ static args = {};
15
+ static description = "Deploy an application to the permaweb with optional ArNS update";
16
+ static examples = [
17
+ "<%= config.bin %> deploy --wallet ./wallet.json",
18
+ "<%= config.bin %> deploy --wallet ./wallet.json --deploy-folder ./dist",
19
+ "<%= config.bin %> deploy --wallet ./wallet.json --deploy-file ./dist/index.html",
20
+ "<%= config.bin %> deploy --wallet ./id.json --sig-type solana --use-arns --arns-name my-app",
21
+ "<%= config.bin %> deploy --wallet ./id.json --sig-type solana --use-arns --arns-name my-app --undername staging"
22
+ ];
23
+ static flags = extractFlags(deployFlagConfigs);
24
+ async run() {
25
+ try {
26
+ const { flags } = await this.parse(Deploy);
27
+ const useArns = Boolean(flags["use-arns"] || flags["arns-name"]);
28
+ const interactive = useArns && !flags["arns-name"];
29
+ if (interactive) {
30
+ this.log(chalk.bold(chalk.cyan("\nInteractive ArNS Deployment Mode\n")));
31
+ }
32
+ const baseConfig = await resolveConfig(deployFlagConfigs, flags, {
33
+ interactive
34
+ });
35
+ let walletConfig = {
36
+ privateKey: baseConfig["private-key"],
37
+ wallet: baseConfig.wallet
38
+ };
39
+ const shouldPromptWallet = !baseConfig.wallet && !baseConfig["private-key"] && (interactive || !process.env.DEPLOY_KEY?.trim());
40
+ if (shouldPromptWallet) {
41
+ const config = await getWalletConfig();
42
+ walletConfig = {
43
+ privateKey: config.privateKey,
44
+ wallet: config.wallet
45
+ };
46
+ }
47
+ let advancedOptions;
48
+ if (interactive) {
49
+ const options = await promptAdvancedOptions();
50
+ advancedOptions = options || void 0;
51
+ }
52
+ const effectiveCacheMaxEntries = baseConfig["no-dedupe"] ? 0 : baseConfig["dedupe-cache-max-entries"];
53
+ const deployConfig = {
54
+ "arns-name": baseConfig["arns-name"],
55
+ cluster: advancedOptions?.cluster || baseConfig.cluster,
56
+ "dedupe-cache-max-entries": effectiveCacheMaxEntries,
57
+ "deploy-file": baseConfig["deploy-file"],
58
+ "deploy-folder": baseConfig["deploy-folder"],
59
+ "max-token-amount": advancedOptions?.maxTokenAmount || baseConfig["max-token-amount"],
60
+ "no-dedupe": baseConfig["no-dedupe"],
61
+ "on-demand": advancedOptions?.onDemand || baseConfig["on-demand"],
62
+ "private-key": walletConfig.privateKey,
63
+ "rpc-url": baseConfig["rpc-url"],
64
+ "sig-type": baseConfig["sig-type"],
65
+ "ttl-seconds": advancedOptions?.ttlSeconds || baseConfig["ttl-seconds"],
66
+ undername: advancedOptions?.undername || baseConfig.undername,
67
+ uploader: baseConfig.uploader,
68
+ "use-arns": useArns,
69
+ wallet: walletConfig.wallet
70
+ };
71
+ if (interactive) {
72
+ this.log("");
73
+ }
74
+ if (deployConfig["use-arns"] && deployConfig["sig-type"] !== "solana") {
75
+ this.error("ArNS updates require --sig-type solana (ArNS records live on Solana)");
76
+ }
77
+ let deployKey;
78
+ if (deployConfig.wallet) {
79
+ const walletPath = expandPath(deployConfig.wallet);
80
+ if (!fs.existsSync(walletPath)) {
81
+ this.error(`Wallet file [${deployConfig.wallet}] does not exist`);
82
+ }
83
+ const walletContent = fs.readFileSync(walletPath, "utf8");
84
+ deployKey = deployKeyFromWalletFile(deployConfig["sig-type"], walletContent);
85
+ } else if (deployConfig["private-key"]) {
86
+ deployKey = deployKeyFromPrivateKey(deployConfig["sig-type"], deployConfig["private-key"]);
87
+ } else {
88
+ deployKey = process.env.DEPLOY_KEY || "";
89
+ if (!deployKey) {
90
+ this.error(
91
+ "DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY"
92
+ );
93
+ }
94
+ }
95
+ this.log(chalk.bold(chalk.cyan("\nStarting deployment...\n")));
96
+ try {
97
+ if (!deployConfig["use-arns"]) {
98
+ const { transactionId: txOrManifestId2 } = await runUploadWorkflow(
99
+ deployKey,
100
+ deployConfig,
101
+ {
102
+ error: (msg) => this.error(msg)
103
+ }
104
+ );
105
+ this.log("");
106
+ const rows2 = [["Tx ID", chalk.green(txOrManifestId2)]];
107
+ if (deployConfig.uploader) {
108
+ rows2.push(["Bundler service", chalk.cyan(deployConfig.uploader)]);
109
+ }
110
+ rows2.push(["Arweave URL", chalk.yellow(`https://turbo-gateway.com/${txOrManifestId2}`)]);
111
+ this.log(chalk.bold(chalk.green("Deployment Successful!")));
112
+ this.log(formatDisplayRows(rows2));
113
+ return;
114
+ }
115
+ const cluster = deployConfig.cluster;
116
+ const rpcUrl = deployConfig["rpc-url"];
117
+ const arnsName = deployConfig["arns-name"];
118
+ if (!arnsName) {
119
+ this.error("--use-arns requires --arns-name");
120
+ }
121
+ const spinner = ora();
122
+ spinner.start("Initializing ARIO");
123
+ const programIds = clusterProgramIds(cluster);
124
+ const rpc = createArioRpc(cluster, rpcUrl);
125
+ const ario = ARIO.init({ rpc, ...programIds });
126
+ spinner.succeed("ARIO initialized");
127
+ spinner.start(`Fetching ArNS record for ${chalk.yellow(arnsName)}`);
128
+ const arnsNameRecord = await ario.getArNSRecord({ name: arnsName }).catch(() => {
129
+ spinner.fail(`ArNS name ${chalk.red(arnsName)} does not exist`);
130
+ this.error(`ArNS name [${arnsName}] does not exist`);
131
+ });
132
+ spinner.succeed(`ArNS record fetched for ${chalk.green(arnsName)}`);
133
+ const { transactionId: txOrManifestId } = await runUploadWorkflow(deployKey, deployConfig, {
134
+ error: (msg) => this.error(msg)
135
+ });
136
+ this.log("");
137
+ spinner.start("Updating ANT record");
138
+ const signer = await createSolanaArnsSigner(deployKey);
139
+ const ant = new SolanaANTWriteable({
140
+ processId: arnsNameRecord.processId,
141
+ rpc,
142
+ rpcSubscriptions: createArioRpcSubscriptions(cluster, rpcUrl),
143
+ signer,
144
+ ...programIds.antProgramId ? { antProgramId: programIds.antProgramId } : {}
145
+ });
146
+ const recordParams = {
147
+ transactionId: txOrManifestId,
148
+ ttlSeconds: Number.parseInt(deployConfig["ttl-seconds"], 10)
149
+ };
150
+ await (deployConfig.undername === "@" ? ant.setBaseNameRecord(recordParams) : ant.setUndernameRecord({ ...recordParams, undername: deployConfig.undername }));
151
+ spinner.succeed("ANT record updated");
152
+ const rows = [["Tx ID", chalk.green(txOrManifestId)]];
153
+ if (deployConfig.uploader) {
154
+ rows.push(["Bundler service", chalk.cyan(deployConfig.uploader)]);
155
+ }
156
+ rows.push(
157
+ ["ArNS Name", chalk.yellow(arnsName)],
158
+ ["Undername", chalk.yellow(deployConfig.undername)],
159
+ ["ANT", chalk.cyan(arnsNameRecord.processId)],
160
+ ["Cluster", chalk.gray(cluster)],
161
+ ["TTL Seconds", chalk.blue(deployConfig["ttl-seconds"])],
162
+ ["Arweave URL", chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)]
163
+ );
164
+ this.log(chalk.bold(chalk.green("Deployment Successful!")));
165
+ this.log(formatDisplayRows(rows));
166
+ } catch (error) {
167
+ const errorMessage = error instanceof Error ? error.message : String(error);
168
+ const normalizedError = errorMessage.startsWith("Upload failed:") ? errorMessage.replace(/^Upload failed:\s*/, "") : errorMessage;
169
+ if (errorMessage.startsWith("Upload failed:") && !process.env.CI && process.stdout.isTTY) {
170
+ this.log(`
171
+ ${formatUploadError(normalizedError, "Deployment failed")}`);
172
+ this.exit(1);
173
+ }
174
+ this.error(chalk.red(`Deployment failed: ${errorMessage}`));
175
+ }
176
+ } catch (error) {
177
+ if (error instanceof Error && error.name === "ExitPromptError") {
178
+ this.log(chalk.yellow("\n\nDeployment cancelled"));
179
+ this.exit(0);
180
+ }
181
+ throw error;
182
+ }
183
+ }
184
+ }
185
+
186
+ export { Deploy as default };
187
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,122 @@
1
+ import fs from 'node:fs';
2
+ import { Command } from '@oclif/core';
3
+ import { uploadFlagConfigs } from '../constants/flags.js';
4
+ import { getWalletConfig } from '../prompts/wallet.js';
5
+ import { c as chalk, r as runUploadWorkflow } from '../chunks/upload-workflow-DSS5FIa5.js';
6
+ import { extractFlags, resolveConfig } from '../utils/config-resolver.js';
7
+ import { d as deployKeyFromWalletFile, a as deployKeyFromPrivateKey, i as formatUploadSize, j as formatUploadCost, f as formatDisplayRows, h as formatUploadError } from '../chunks/display-DRcjDj9k.js';
8
+ import { expandPath } from '../utils/path.js';
9
+
10
+ class Upload extends Command {
11
+ static args = {};
12
+ static description = "Upload a file or folder to Arweave via Turbo without updating ArNS";
13
+ static examples = [
14
+ "<%= config.bin %> upload --wallet ./wallet.json",
15
+ "<%= config.bin %> upload --wallet ./wallet.json --deploy-folder ./dist",
16
+ "<%= config.bin %> upload --wallet ./wallet.json --deploy-file ./dist/index.html",
17
+ '<%= config.bin %> upload --private-key "$(cat wallet.json)" --on-demand ario --max-token-amount 1.5',
18
+ "<%= config.bin %> upload --wallet ./wallet.json --uploader https://turbo.ardrive.io",
19
+ "<%= config.bin %> upload --wallet ./id.json --sig-type solana"
20
+ ];
21
+ static flags = extractFlags(uploadFlagConfigs);
22
+ async run() {
23
+ try {
24
+ const { flags } = await this.parse(Upload);
25
+ const interactive = !flags.wallet && !flags["private-key"] && !process.env.DEPLOY_KEY?.trim();
26
+ if (interactive) {
27
+ this.log(chalk.bold(chalk.cyan("\nInteractive upload mode\n")));
28
+ }
29
+ const baseConfig = await resolveConfig(uploadFlagConfigs, flags, {
30
+ interactive
31
+ });
32
+ let walletConfig = {
33
+ privateKey: baseConfig["private-key"],
34
+ wallet: baseConfig.wallet
35
+ };
36
+ if (interactive && !baseConfig.wallet && !baseConfig["private-key"]) {
37
+ const config = await getWalletConfig();
38
+ walletConfig = {
39
+ privateKey: config.privateKey,
40
+ wallet: config.wallet
41
+ };
42
+ }
43
+ const effectiveCacheMaxEntries = baseConfig["no-dedupe"] ? 0 : baseConfig["dedupe-cache-max-entries"];
44
+ const uploadCfg = {
45
+ "dedupe-cache-max-entries": effectiveCacheMaxEntries,
46
+ "deploy-file": baseConfig["deploy-file"],
47
+ "deploy-folder": baseConfig["deploy-folder"],
48
+ "max-token-amount": baseConfig["max-token-amount"],
49
+ "on-demand": baseConfig["on-demand"],
50
+ "sig-type": baseConfig["sig-type"],
51
+ uploader: baseConfig.uploader
52
+ };
53
+ if (interactive) {
54
+ this.log("");
55
+ }
56
+ const { privateKey, wallet } = walletConfig;
57
+ const sigType = uploadCfg["sig-type"];
58
+ let deployKey;
59
+ if (wallet) {
60
+ const walletPath = expandPath(wallet);
61
+ if (!fs.existsSync(walletPath)) {
62
+ this.error(`Wallet file [${wallet}] does not exist`);
63
+ }
64
+ const walletContent = fs.readFileSync(walletPath, "utf8");
65
+ deployKey = deployKeyFromWalletFile(sigType, walletContent);
66
+ } else if (privateKey) {
67
+ deployKey = deployKeyFromPrivateKey(sigType, privateKey);
68
+ } else {
69
+ deployKey = process.env.DEPLOY_KEY || "";
70
+ if (!deployKey) {
71
+ this.error(
72
+ "DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY"
73
+ );
74
+ }
75
+ }
76
+ this.log(chalk.bold(chalk.cyan("\nStarting upload...\n")));
77
+ try {
78
+ const uploadResult = await runUploadWorkflow(deployKey, uploadCfg, {
79
+ error: (msg) => this.error(msg)
80
+ });
81
+ const txOrManifestId = uploadResult.transactionId;
82
+ this.log("");
83
+ const uploadSize = uploadResult.size;
84
+ const rows = [["Tx ID", chalk.green(txOrManifestId)]];
85
+ if (uploadSize) {
86
+ rows.push(["Upload size", chalk.blue(formatUploadSize(uploadSize))]);
87
+ }
88
+ if (uploadResult.cost) {
89
+ rows.push(["Upload cost", chalk.blue(formatUploadCost(uploadResult.cost))]);
90
+ }
91
+ if (uploadCfg.uploader) {
92
+ rows.push(["Bundler service", chalk.cyan(uploadCfg.uploader)]);
93
+ }
94
+ rows.push(["Arweave URL", chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)]);
95
+ this.log(chalk.bold(chalk.green("Upload successful!")));
96
+ this.log(formatDisplayRows(rows));
97
+ } catch (error) {
98
+ const errorMessage = error instanceof Error ? error.message : String(error);
99
+ const normalizedError = errorMessage.startsWith("Upload failed:") ? errorMessage.replace(/^Upload failed:\s*/, "") : errorMessage;
100
+ if (!process.env.CI && process.stdout.isTTY) {
101
+ this.log(`
102
+ ${formatUploadError(normalizedError)}`);
103
+ this.exit(1);
104
+ }
105
+ this.error(
106
+ chalk.red(
107
+ errorMessage.startsWith("Upload failed:") ? errorMessage : `Upload failed: ${errorMessage}`
108
+ )
109
+ );
110
+ }
111
+ } catch (error) {
112
+ if (error instanceof Error && error.name === "ExitPromptError") {
113
+ this.log(chalk.yellow("\n\nUpload cancelled"));
114
+ this.exit(0);
115
+ }
116
+ throw error;
117
+ }
118
+ }
119
+ }
120
+
121
+ export { Upload as default };
122
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sources":["../../src/commands/upload.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { Command } from '@oclif/core'\n\nimport { type UploadConfig, uploadFlagConfigs } from '../constants/flags.js'\nimport { getWalletConfig } from '../prompts/wallet.js'\nimport { chalk } from '../utils/chalk.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { deployKeyFromPrivateKey, deployKeyFromWalletFile } from '../utils/deploy-key.js'\nimport {\n type DisplayRow,\n formatDisplayRows,\n formatUploadCost,\n formatUploadError,\n formatUploadSize,\n} from '../utils/display.js'\nimport { expandPath } from '../utils/path.js'\nimport { runUploadWorkflow } from '../workflows/upload-workflow.js'\n\nexport default class Upload extends Command {\n static override args = {}\n\n static override description = 'Upload a file or folder to Arweave via Turbo without updating ArNS'\n\n static override examples = [\n '<%= config.bin %> upload --wallet ./wallet.json',\n '<%= config.bin %> upload --wallet ./wallet.json --deploy-folder ./dist',\n '<%= config.bin %> upload --wallet ./wallet.json --deploy-file ./dist/index.html',\n '<%= config.bin %> upload --private-key \"$(cat wallet.json)\" --on-demand ario --max-token-amount 1.5',\n '<%= config.bin %> upload --wallet ./wallet.json --uploader https://turbo.ardrive.io',\n '<%= config.bin %> upload --wallet ./id.json --sig-type solana',\n ]\n\n static override flags = extractFlags(uploadFlagConfigs)\n\n public async run(): Promise<void> {\n try {\n const { flags } = await this.parse(Upload)\n\n const interactive = !flags.wallet && !flags['private-key'] && !process.env.DEPLOY_KEY?.trim()\n\n if (interactive) {\n this.log(chalk.bold(chalk.cyan('\\nInteractive upload mode\\n')))\n }\n\n const baseConfig = (await resolveConfig<typeof uploadFlagConfigs>(uploadFlagConfigs, flags, {\n interactive,\n })) as UploadConfig\n\n let walletConfig: { privateKey?: string; wallet?: string } = {\n privateKey: baseConfig['private-key'],\n wallet: baseConfig.wallet,\n }\n\n if (interactive && !baseConfig.wallet && !baseConfig['private-key']) {\n const config = await getWalletConfig()\n walletConfig = {\n privateKey: config.privateKey,\n wallet: config.wallet,\n }\n }\n\n const effectiveCacheMaxEntries = baseConfig['no-dedupe']\n ? 0\n : baseConfig['dedupe-cache-max-entries']\n\n const uploadCfg = {\n 'dedupe-cache-max-entries': effectiveCacheMaxEntries,\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'max-token-amount': baseConfig['max-token-amount'],\n 'on-demand': baseConfig['on-demand'],\n 'sig-type': baseConfig['sig-type'],\n uploader: baseConfig.uploader,\n }\n\n if (interactive) {\n this.log('')\n }\n\n const { privateKey, wallet } = walletConfig\n const sigType = uploadCfg['sig-type']\n\n let deployKey: string\n if (wallet) {\n const walletPath = expandPath(wallet)\n if (!fs.existsSync(walletPath)) {\n this.error(`Wallet file [${wallet}] does not exist`)\n }\n\n const walletContent = fs.readFileSync(walletPath, 'utf8')\n deployKey = deployKeyFromWalletFile(sigType, walletContent)\n } else if (privateKey) {\n deployKey = deployKeyFromPrivateKey(sigType, privateKey)\n } else {\n deployKey = process.env.DEPLOY_KEY || ''\n if (!deployKey) {\n this.error(\n 'DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY',\n )\n }\n }\n\n this.log(chalk.bold(chalk.cyan('\\nStarting upload...\\n')))\n\n try {\n const uploadResult = await runUploadWorkflow(deployKey, uploadCfg, {\n error: (msg) => this.error(msg),\n })\n const txOrManifestId = uploadResult.transactionId\n\n this.log('')\n\n const uploadSize = uploadResult.size\n\n const rows: DisplayRow[] = [['Tx ID', chalk.green(txOrManifestId)]]\n if (uploadSize) {\n rows.push(['Upload size', chalk.blue(formatUploadSize(uploadSize))])\n }\n\n if (uploadResult.cost) {\n rows.push(['Upload cost', chalk.blue(formatUploadCost(uploadResult.cost))])\n }\n\n if (uploadCfg.uploader) {\n rows.push(['Bundler service', chalk.cyan(uploadCfg.uploader)])\n }\n\n rows.push(['Arweave URL', chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)])\n\n this.log(chalk.bold(chalk.green('Upload successful!')))\n this.log(formatDisplayRows(rows))\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n const normalizedError = errorMessage.startsWith('Upload failed:')\n ? errorMessage.replace(/^Upload failed:\\s*/, '')\n : errorMessage\n\n if (!process.env.CI && process.stdout.isTTY) {\n this.log(`\\n${formatUploadError(normalizedError)}`)\n this.exit(1)\n }\n\n this.error(\n chalk.red(\n errorMessage.startsWith('Upload failed:')\n ? errorMessage\n : `Upload failed: ${errorMessage}`,\n ),\n )\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nUpload cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ import { Flags } from '@oclif/core';
2
+ import { promptCluster, promptArnsName } from '../prompts/arns.js';
3
+ import { promptDeployTarget } from '../prompts/deployment.js';
4
+ import { promptSignerType } from '../prompts/wallet.js';
5
+ import { createFlagConfig } from '../utils/config-resolver.js';
6
+ import { TTL_MIN, TTL_MAX } from '../utils/constants.js';
7
+ import { validateFileExists, validateUndername, validateFolderExists, validateTtl } from '../utils/validators.js';
8
+ import { D as DEFAULT_CACHE_MAX_ENTRIES } from '../chunks/cache-C1tEeUx2.js';
9
+
10
+ const globalFlags = {
11
+ arnsName: createFlagConfig({
12
+ flag: Flags.string({
13
+ char: "n",
14
+ description: "The ArNS name to deploy to",
15
+ required: false
16
+ }),
17
+ prompt: promptArnsName,
18
+ triggersInteractive: true
19
+ }),
20
+ cluster: createFlagConfig({
21
+ flag: Flags.string({
22
+ char: "p",
23
+ default: "mainnet",
24
+ description: "Solana cluster for ArNS updates (mainnet or devnet)",
25
+ options: ["mainnet", "devnet"],
26
+ required: false
27
+ }),
28
+ prompt: promptCluster
29
+ }),
30
+ dedupeCacheMaxEntries: createFlagConfig({
31
+ flag: Flags.integer({
32
+ default: DEFAULT_CACHE_MAX_ENTRIES,
33
+ description: "Maximum number of entries to keep in the dedupe cache (LRU)",
34
+ min: 0,
35
+ required: false
36
+ })
37
+ }),
38
+ deployFile: createFlagConfig({
39
+ flag: Flags.string({
40
+ char: "f",
41
+ description: "File to deploy (overrides deploy-folder)",
42
+ async parse(input) {
43
+ const validation = validateFileExists(input);
44
+ if (validation !== true) {
45
+ throw new Error(validation);
46
+ }
47
+ return input;
48
+ },
49
+ required: false
50
+ }),
51
+ async prompt() {
52
+ const target = await promptDeployTarget();
53
+ return target.type === "file" ? target.path : void 0;
54
+ }
55
+ }),
56
+ deployFolder: createFlagConfig({
57
+ flag: Flags.string({
58
+ char: "d",
59
+ default: "./dist",
60
+ description: "Folder to deploy",
61
+ async parse(input) {
62
+ const validation = validateFolderExists(input);
63
+ if (validation !== true) {
64
+ throw new Error(validation);
65
+ }
66
+ return input;
67
+ },
68
+ required: false
69
+ }),
70
+ async prompt() {
71
+ const target = await promptDeployTarget();
72
+ return target.type === "folder" ? target.path : "./dist";
73
+ }
74
+ }),
75
+ // Advanced payment settings
76
+ maxTokenAmount: createFlagConfig({
77
+ flag: Flags.string({
78
+ description: "Maximum token amount for on-demand payment",
79
+ required: false
80
+ })
81
+ }),
82
+ noDedupe: createFlagConfig({
83
+ flag: Flags.boolean({
84
+ default: false,
85
+ description: "Disable deduplication (do not cache or reuse previous uploads)",
86
+ required: false
87
+ })
88
+ }),
89
+ onDemand: createFlagConfig({
90
+ flag: Flags.string({
91
+ description: "Enable on-demand payment with specified token (ario or base-eth)",
92
+ options: ["ario", "base-eth"],
93
+ required: false
94
+ })
95
+ }),
96
+ privateKey: createFlagConfig({
97
+ flag: Flags.string({
98
+ char: "k",
99
+ description: "Private key string (alternative to --wallet). JWK JSON for Arweave, hex for EVM chains, base58 secret key for Solana.",
100
+ exclusive: ["wallet"],
101
+ required: false
102
+ })
103
+ }),
104
+ rpcUrl: createFlagConfig({
105
+ flag: Flags.string({
106
+ description: "Optional Solana RPC URL override for ArNS updates",
107
+ required: false
108
+ })
109
+ }),
110
+ sigType: createFlagConfig({
111
+ flag: Flags.string({
112
+ char: "s",
113
+ default: "arweave",
114
+ description: "Signer type for deployment. ArNS updates require solana.",
115
+ options: ["arweave", "ethereum", "polygon", "kyve", "solana"],
116
+ required: false
117
+ }),
118
+ prompt: promptSignerType
119
+ }),
120
+ ttlSeconds: createFlagConfig({
121
+ flag: Flags.string({
122
+ char: "t",
123
+ default: "60",
124
+ description: `ArNS TTL in seconds (${TTL_MIN}-${TTL_MAX})`,
125
+ async parse(input) {
126
+ const validation = validateTtl(input);
127
+ if (validation !== true) {
128
+ throw new Error(validation);
129
+ }
130
+ return input;
131
+ },
132
+ required: false
133
+ })
134
+ }),
135
+ undername: createFlagConfig({
136
+ flag: Flags.string({
137
+ char: "u",
138
+ default: "@",
139
+ description: "ANT undername to update",
140
+ async parse(input) {
141
+ const validation = validateUndername(input);
142
+ if (validation !== true) {
143
+ throw new Error(validation);
144
+ }
145
+ return input;
146
+ },
147
+ required: false
148
+ })
149
+ }),
150
+ uploader: createFlagConfig({
151
+ flag: Flags.string({
152
+ description: "Custom Turbo upload service base URL. Omit for ArDrive production: https://upload.ardrive.io.",
153
+ required: false
154
+ })
155
+ }),
156
+ useArns: createFlagConfig({
157
+ flag: Flags.boolean({
158
+ default: false,
159
+ description: "Update an ArNS/ANT record after upload.",
160
+ required: false
161
+ })
162
+ }),
163
+ wallet: createFlagConfig({
164
+ flag: Flags.string({
165
+ char: "w",
166
+ description: "Path to wallet file (JWK for Arweave, private key for EVM chains, solana-keygen id.json for Solana)",
167
+ exclusive: ["private-key"],
168
+ async parse(input) {
169
+ const validation = validateFileExists(input);
170
+ if (validation !== true) {
171
+ throw new Error(validation);
172
+ }
173
+ return input;
174
+ },
175
+ required: false
176
+ })
177
+ })
178
+ };
179
+ const deployFlags = {
180
+ "arns-name": globalFlags.arnsName.flag,
181
+ cluster: globalFlags.cluster.flag,
182
+ "dedupe-cache-max-entries": globalFlags.dedupeCacheMaxEntries.flag,
183
+ "deploy-file": globalFlags.deployFile.flag,
184
+ "deploy-folder": globalFlags.deployFolder.flag,
185
+ "max-token-amount": globalFlags.maxTokenAmount.flag,
186
+ "no-dedupe": globalFlags.noDedupe.flag,
187
+ "on-demand": globalFlags.onDemand.flag,
188
+ "private-key": globalFlags.privateKey.flag,
189
+ "rpc-url": globalFlags.rpcUrl.flag,
190
+ "sig-type": globalFlags.sigType.flag,
191
+ "ttl-seconds": globalFlags.ttlSeconds.flag,
192
+ undername: globalFlags.undername.flag,
193
+ uploader: globalFlags.uploader.flag,
194
+ "use-arns": globalFlags.useArns.flag,
195
+ wallet: globalFlags.wallet.flag
196
+ };
197
+ const arnsFlags = {
198
+ "arns-name": globalFlags.arnsName.flag,
199
+ cluster: globalFlags.cluster.flag,
200
+ "rpc-url": globalFlags.rpcUrl.flag,
201
+ "ttl-seconds": globalFlags.ttlSeconds.flag,
202
+ undername: globalFlags.undername.flag
203
+ };
204
+ const walletFlags = {
205
+ "private-key": globalFlags.privateKey.flag,
206
+ "sig-type": globalFlags.sigType.flag,
207
+ wallet: globalFlags.wallet.flag
208
+ };
209
+ const deployFlagConfigs = {
210
+ "arns-name": globalFlags.arnsName,
211
+ cluster: globalFlags.cluster,
212
+ "dedupe-cache-max-entries": globalFlags.dedupeCacheMaxEntries,
213
+ "deploy-file": globalFlags.deployFile,
214
+ "deploy-folder": globalFlags.deployFolder,
215
+ "max-token-amount": globalFlags.maxTokenAmount,
216
+ "no-dedupe": globalFlags.noDedupe,
217
+ "on-demand": globalFlags.onDemand,
218
+ "private-key": globalFlags.privateKey,
219
+ "rpc-url": globalFlags.rpcUrl,
220
+ "sig-type": globalFlags.sigType,
221
+ "ttl-seconds": globalFlags.ttlSeconds,
222
+ undername: globalFlags.undername,
223
+ uploader: globalFlags.uploader,
224
+ "use-arns": globalFlags.useArns,
225
+ wallet: globalFlags.wallet
226
+ };
227
+ const uploadFlagConfigs = {
228
+ "dedupe-cache-max-entries": globalFlags.dedupeCacheMaxEntries,
229
+ "deploy-file": globalFlags.deployFile,
230
+ "deploy-folder": globalFlags.deployFolder,
231
+ "max-token-amount": globalFlags.maxTokenAmount,
232
+ "no-dedupe": globalFlags.noDedupe,
233
+ "on-demand": globalFlags.onDemand,
234
+ "private-key": globalFlags.privateKey,
235
+ "sig-type": globalFlags.sigType,
236
+ uploader: globalFlags.uploader,
237
+ wallet: globalFlags.wallet
238
+ };
239
+
240
+ export { arnsFlags, deployFlagConfigs, deployFlags, globalFlags, uploadFlagConfigs, walletFlags };
241
+ //# sourceMappingURL=flags.js.map
@@ -0,0 +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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"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { run } from '@oclif/core';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}