@ar.io/deploy 0.1.0-alpha.20260610213851.5857f96

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 +753 -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 +238 -0
  14. package/dist/commands/deploy.js.map +1 -0
  15. package/dist/commands/upload.js +126 -0
  16. package/dist/commands/upload.js.map +1 -0
  17. package/dist/constants/flags.js +268 -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 +86 -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 +55 -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 +132 -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 +14 -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 +26 -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 +111 -0
@@ -0,0 +1,238 @@
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 { promptUpdateArns, 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 ./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
+ ];
23
+ static flags = extractFlags(deployFlagConfigs);
24
+ async run() {
25
+ try {
26
+ const { flags } = await this.parse(Deploy);
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
+ }
40
+ if (interactive) {
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
+ }
49
+ }
50
+ const baseConfig = await resolveConfig(deployFlagConfigs, flags, {
51
+ interactive
52
+ });
53
+ let walletConfig = {
54
+ privateKey: baseConfig["private-key"],
55
+ wallet: baseConfig.wallet
56
+ };
57
+ const shouldPromptWallet = canPrompt && !baseConfig.wallet && !baseConfig["private-key"] && (interactive || !process.env.DEPLOY_KEY?.trim());
58
+ if (shouldPromptWallet) {
59
+ const config = await getWalletConfig({
60
+ envVar: "DEPLOY_KEY",
61
+ label: "upload key",
62
+ purpose: "pays for the upload"
63
+ });
64
+ walletConfig = {
65
+ privateKey: config.privateKey,
66
+ wallet: config.wallet
67
+ };
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
+ }
86
+ let advancedOptions;
87
+ if (interactive) {
88
+ const options = await promptAdvancedOptions();
89
+ advancedOptions = options || void 0;
90
+ }
91
+ const effectiveCacheMaxEntries = baseConfig["no-dedupe"] ? 0 : baseConfig["dedupe-cache-max-entries"];
92
+ const deployConfig = {
93
+ "arns-name": baseConfig["arns-name"],
94
+ "arns-private-key": arnsKeyConfig.privateKey,
95
+ "arns-wallet": arnsKeyConfig.wallet,
96
+ cluster: advancedOptions?.cluster || baseConfig.cluster,
97
+ "dedupe-cache-max-entries": effectiveCacheMaxEntries,
98
+ "deploy-file": baseConfig["deploy-file"],
99
+ "deploy-folder": baseConfig["deploy-folder"],
100
+ "max-token-amount": advancedOptions?.maxTokenAmount || baseConfig["max-token-amount"],
101
+ "no-dedupe": baseConfig["no-dedupe"],
102
+ "on-demand": advancedOptions?.onDemand || baseConfig["on-demand"],
103
+ "private-key": walletConfig.privateKey,
104
+ "rpc-url": baseConfig["rpc-url"],
105
+ "sig-type": baseConfig["sig-type"],
106
+ "ttl-seconds": advancedOptions?.ttlSeconds || baseConfig["ttl-seconds"],
107
+ undername: advancedOptions?.undername || baseConfig.undername,
108
+ uploader: baseConfig.uploader,
109
+ "use-arns": useArns,
110
+ wallet: walletConfig.wallet
111
+ };
112
+ if (interactive) {
113
+ this.log("");
114
+ }
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"));
122
+ }
123
+ if (key.privateKey) {
124
+ return deployKeyFromPrivateKey(key.sigType, key.privateKey);
125
+ }
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
+ }) : "";
146
+ this.log(chalk.bold(chalk.cyan("\nStarting deployment...\n")));
147
+ try {
148
+ if (!deployConfig["use-arns"]) {
149
+ const { transactionId: txOrManifestId2 } = await runUploadWorkflow(
150
+ deployKey,
151
+ deployConfig,
152
+ {
153
+ error: (msg) => this.error(msg)
154
+ }
155
+ );
156
+ this.log("");
157
+ const rows2 = [["Tx ID", chalk.green(txOrManifestId2)]];
158
+ if (deployConfig.uploader) {
159
+ rows2.push(["Bundler service", chalk.cyan(deployConfig.uploader)]);
160
+ }
161
+ rows2.push(["Arweave URL", chalk.yellow(`https://turbo-gateway.com/${txOrManifestId2}`)]);
162
+ this.log(chalk.bold(chalk.green("Deployment Successful!")));
163
+ this.log(formatDisplayRows(rows2));
164
+ return;
165
+ }
166
+ const cluster = deployConfig.cluster;
167
+ const rpcUrl = deployConfig["rpc-url"];
168
+ const arnsName = deployConfig["arns-name"];
169
+ if (!arnsName) {
170
+ this.error("--use-arns requires --arns-name");
171
+ }
172
+ const spinner = ora();
173
+ spinner.start("Initializing ARIO");
174
+ const programIds = clusterProgramIds(cluster);
175
+ const rpc = createArioRpc(cluster, rpcUrl);
176
+ const ario = ARIO.init({ rpc, ...programIds });
177
+ spinner.succeed("ARIO initialized");
178
+ spinner.start(`Fetching ArNS record for ${chalk.yellow(arnsName)}`);
179
+ const arnsNameRecord = await ario.getArNSRecord({ name: arnsName }).catch(() => {
180
+ spinner.fail(`ArNS name ${chalk.red(arnsName)} does not exist`);
181
+ this.error(`ArNS name [${arnsName}] does not exist`);
182
+ });
183
+ spinner.succeed(`ArNS record fetched for ${chalk.green(arnsName)}`);
184
+ const { transactionId: txOrManifestId } = await runUploadWorkflow(deployKey, deployConfig, {
185
+ error: (msg) => this.error(msg)
186
+ });
187
+ this.log("");
188
+ spinner.start("Updating ANT record");
189
+ const signer = await createSolanaArnsSigner(arnsAuthorityKey);
190
+ const ant = new SolanaANTWriteable({
191
+ processId: arnsNameRecord.processId,
192
+ rpc,
193
+ rpcSubscriptions: createArioRpcSubscriptions(cluster, rpcUrl),
194
+ signer,
195
+ ...programIds.antProgramId ? { antProgramId: programIds.antProgramId } : {}
196
+ });
197
+ const recordParams = {
198
+ transactionId: txOrManifestId,
199
+ ttlSeconds: Number.parseInt(deployConfig["ttl-seconds"], 10)
200
+ };
201
+ await (deployConfig.undername === "@" ? ant.setBaseNameRecord(recordParams) : ant.setUndernameRecord({ ...recordParams, undername: deployConfig.undername }));
202
+ spinner.succeed("ANT record updated");
203
+ const rows = [["Tx ID", chalk.green(txOrManifestId)]];
204
+ if (deployConfig.uploader) {
205
+ rows.push(["Bundler service", chalk.cyan(deployConfig.uploader)]);
206
+ }
207
+ rows.push(
208
+ ["ArNS Name", chalk.yellow(arnsName)],
209
+ ["Undername", chalk.yellow(deployConfig.undername)],
210
+ ["ANT", chalk.cyan(arnsNameRecord.processId)],
211
+ ["Cluster", chalk.gray(cluster)],
212
+ ["TTL Seconds", chalk.blue(deployConfig["ttl-seconds"])],
213
+ ["Arweave URL", chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)]
214
+ );
215
+ this.log(chalk.bold(chalk.green("Deployment Successful!")));
216
+ this.log(formatDisplayRows(rows));
217
+ } catch (error) {
218
+ const errorMessage = error instanceof Error ? error.message : String(error);
219
+ const normalizedError = errorMessage.startsWith("Upload failed:") ? errorMessage.replace(/^Upload failed:\s*/, "") : errorMessage;
220
+ if (errorMessage.startsWith("Upload failed:") && !process.env.CI && process.stdout.isTTY) {
221
+ this.log(`
222
+ ${formatUploadError(normalizedError, "Deployment failed")}`);
223
+ this.exit(1);
224
+ }
225
+ this.error(chalk.red(`Deployment failed: ${errorMessage}`));
226
+ }
227
+ } catch (error) {
228
+ if (error instanceof Error && error.name === "ExitPromptError") {
229
+ this.log(chalk.yellow("\n\nDeployment cancelled"));
230
+ this.exit(0);
231
+ }
232
+ throw error;
233
+ }
234
+ }
235
+ }
236
+
237
+ export { Deploy as default };
238
+ //# 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, 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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"}
@@ -0,0 +1,126 @@
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
+ envVar: "DEPLOY_KEY",
39
+ label: "upload key",
40
+ purpose: "pays for the upload"
41
+ });
42
+ walletConfig = {
43
+ privateKey: config.privateKey,
44
+ wallet: config.wallet
45
+ };
46
+ }
47
+ const effectiveCacheMaxEntries = baseConfig["no-dedupe"] ? 0 : baseConfig["dedupe-cache-max-entries"];
48
+ const uploadCfg = {
49
+ "dedupe-cache-max-entries": effectiveCacheMaxEntries,
50
+ "deploy-file": baseConfig["deploy-file"],
51
+ "deploy-folder": baseConfig["deploy-folder"],
52
+ "max-token-amount": baseConfig["max-token-amount"],
53
+ "on-demand": baseConfig["on-demand"],
54
+ "sig-type": baseConfig["sig-type"],
55
+ uploader: baseConfig.uploader
56
+ };
57
+ if (interactive) {
58
+ this.log("");
59
+ }
60
+ const { privateKey, wallet } = walletConfig;
61
+ const sigType = uploadCfg["sig-type"];
62
+ let deployKey;
63
+ if (wallet) {
64
+ const walletPath = expandPath(wallet);
65
+ if (!fs.existsSync(walletPath)) {
66
+ this.error(`Wallet file [${wallet}] does not exist`);
67
+ }
68
+ const walletContent = fs.readFileSync(walletPath, "utf8");
69
+ deployKey = deployKeyFromWalletFile(sigType, walletContent);
70
+ } else if (privateKey) {
71
+ deployKey = deployKeyFromPrivateKey(sigType, privateKey);
72
+ } else {
73
+ deployKey = process.env.DEPLOY_KEY || "";
74
+ if (!deployKey) {
75
+ this.error(
76
+ "DEPLOY_KEY environment variable not set. Use --wallet, --private-key, or set DEPLOY_KEY"
77
+ );
78
+ }
79
+ }
80
+ this.log(chalk.bold(chalk.cyan("\nStarting upload...\n")));
81
+ try {
82
+ const uploadResult = await runUploadWorkflow(deployKey, uploadCfg, {
83
+ error: (msg) => this.error(msg)
84
+ });
85
+ const txOrManifestId = uploadResult.transactionId;
86
+ this.log("");
87
+ const uploadSize = uploadResult.size;
88
+ const rows = [["Tx ID", chalk.green(txOrManifestId)]];
89
+ if (uploadSize) {
90
+ rows.push(["Upload size", chalk.blue(formatUploadSize(uploadSize))]);
91
+ }
92
+ if (uploadResult.cost) {
93
+ rows.push(["Upload cost", chalk.blue(formatUploadCost(uploadResult.cost))]);
94
+ }
95
+ if (uploadCfg.uploader) {
96
+ rows.push(["Bundler service", chalk.cyan(uploadCfg.uploader)]);
97
+ }
98
+ rows.push(["Arweave URL", chalk.yellow(`https://turbo-gateway.com/${txOrManifestId}`)]);
99
+ this.log(chalk.bold(chalk.green("Upload successful!")));
100
+ this.log(formatDisplayRows(rows));
101
+ } catch (error) {
102
+ const errorMessage = error instanceof Error ? error.message : String(error);
103
+ const normalizedError = errorMessage.startsWith("Upload failed:") ? errorMessage.replace(/^Upload failed:\s*/, "") : errorMessage;
104
+ if (!process.env.CI && process.stdout.isTTY) {
105
+ this.log(`
106
+ ${formatUploadError(normalizedError)}`);
107
+ this.exit(1);
108
+ }
109
+ this.error(
110
+ chalk.red(
111
+ errorMessage.startsWith("Upload failed:") ? errorMessage : `Upload failed: ${errorMessage}`
112
+ )
113
+ );
114
+ }
115
+ } catch (error) {
116
+ if (error instanceof Error && error.name === "ExitPromptError") {
117
+ this.log(chalk.yellow("\n\nUpload cancelled"));
118
+ this.exit(0);
119
+ }
120
+ throw error;
121
+ }
122
+ }
123
+ }
124
+
125
+ export { Upload as default };
126
+ //# 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 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":";;;;;;;;;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,CAAgB;AAAA,UACnC,MAAA,EAAQ,YAAA;AAAA,UACR,KAAA,EAAO,YAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA,YAAA,GAAe;AAAA,UACb,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,QAAQ,MAAA,CAAO;AAAA,SACjB;AAAA,MACF;AAEA,MAAA,MAAM,2BAA2B,UAAA,CAAW,WAAW,CAAA,GACnD,CAAA,GACA,WAAW,0BAA0B,CAAA;AAEzC,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,0BAAA,EAA4B,wBAAA;AAAA,QAC5B,aAAA,EAAe,WAAW,aAAa,CAAA;AAAA,QACvC,eAAA,EAAiB,WAAW,eAAe,CAAA;AAAA,QAC3C,kBAAA,EAAoB,WAAW,kBAAkB,CAAA;AAAA,QACjD,WAAA,EAAa,WAAW,WAAW,CAAA;AAAA,QACnC,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,QACjC,UAAU,UAAA,CAAW;AAAA,OACvB;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,MACb;AAEA,MAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAO,GAAI,YAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,UAAU,UAAU,CAAA;AAEpC,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,UAAA,GAAa,WAAW,MAAM,CAAA;AACpC,QAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,UAAA,IAAA,CAAK,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAAA,QACrD;AAEA,QAAA,MAAM,aAAA,GAAgB,EAAA,CAAG,YAAA,CAAa,UAAA,EAAY,MAAM,CAAA;AACxD,QAAA,SAAA,GAAY,uBAAA,CAAwB,SAAS,aAAa,CAAA;AAAA,MAC5D,WAAW,UAAA,EAAY;AACrB,QAAA,SAAA,GAAY,uBAAA,CAAwB,SAAS,UAAU,CAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,SAAA,GAAY,OAAA,CAAQ,IAAI,UAAA,IAAc,EAAA;AACtC,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,IAAA,CAAK,KAAA;AAAA,YACH;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,IAAA,CAAK,wBAAwB,CAAC,CAAC,CAAA;AAEzD,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,CAAkB,SAAA,EAAW,SAAA,EAAW;AAAA,UACjE,KAAA,EAAO,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAM,GAAG;AAAA,SAC/B,CAAA;AACD,QAAA,MAAM,iBAAiB,YAAA,CAAa,aAAA;AAEpC,QAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAEX,QAAA,MAAM,aAAa,YAAA,CAAa,IAAA;AAEhC,QAAA,MAAM,IAAA,GAAqB,CAAC,CAAC,OAAA,EAAS,MAAM,KAAA,CAAM,cAAc,CAAC,CAAC,CAAA;AAClE,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,IAAA,CAAK,IAAA,CAAK,CAAC,aAAA,EAAe,KAAA,CAAM,KAAK,gBAAA,CAAiB,UAAU,CAAC,CAAC,CAAC,CAAA;AAAA,QACrE;AAEA,QAAA,IAAI,aAAa,IAAA,EAAM;AACrB,UAAA,IAAA,CAAK,IAAA,CAAK,CAAC,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,iBAAiB,YAAA,CAAa,IAAI,CAAC,CAAC,CAAC,CAAA;AAAA,QAC5E;AAEA,QAAA,IAAI,UAAU,QAAA,EAAU;AACtB,UAAA,IAAA,CAAK,IAAA,CAAK,CAAC,iBAAA,EAAmB,KAAA,CAAM,KAAK,SAAA,CAAU,QAAQ,CAAC,CAAC,CAAA;AAAA,QAC/D;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,CAAC,aAAA,EAAe,KAAA,CAAM,OAAO,CAAA,0BAAA,EAA6B,cAAc,CAAA,CAAE,CAAC,CAAC,CAAA;AAEtF,QAAA,IAAA,CAAK,IAAI,KAAA,CAAM,IAAA,CAAK,MAAM,KAAA,CAAM,oBAAoB,CAAC,CAAC,CAAA;AACtD,QAAA,IAAA,CAAK,GAAA,CAAI,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,MAClC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,MAAM,eAAA,GAAkB,aAAa,UAAA,CAAW,gBAAgB,IAC5D,YAAA,CAAa,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA,GAC7C,YAAA;AAEJ,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAA,IAAM,OAAA,CAAQ,OAAO,KAAA,EAAO;AAC3C,UAAA,IAAA,CAAK,GAAA,CAAI;AAAA,EAAK,iBAAA,CAAkB,eAAe,CAAC,CAAA,CAAE,CAAA;AAClD,UAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,QACb;AAEA,QAAA,IAAA,CAAK,KAAA;AAAA,UACH,KAAA,CAAM,GAAA;AAAA,YACJ,aAAa,UAAA,CAAW,gBAAgB,CAAA,GACpC,YAAA,GACA,kBAAkB,YAAY,CAAA;AAAA;AACpC,SACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,iBAAA,EAAmB;AAC9D,QAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,sBAAsB,CAAC,CAAA;AAC7C,QAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,MACb;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;;;;"}