@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
package/bin/dev.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env tsx
2
+
3
+ import { execute } from '@oclif/core'
4
+
5
+ await execute({ development: true, dir: import.meta.url })
package/bin/run.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execute } from '@oclif/core'
4
+
5
+ await execute({ development: false, dir: import.meta.url })
@@ -0,0 +1,6 @@
1
+ const DEFAULT_CACHE_MAX_ENTRIES = 1e4;
2
+ const CACHE_DIR = ".ario-deploy";
3
+ const CACHE_FILE = "transaction-cache.json";
4
+
5
+ export { CACHE_DIR as C, DEFAULT_CACHE_MAX_ENTRIES as D, CACHE_FILE as a };
6
+ //# sourceMappingURL=cache-C1tEeUx2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-C1tEeUx2.js","sources":["../../src/constants/cache.ts"],"sourcesContent":["export const DEFAULT_CACHE_MAX_ENTRIES = 10_000\nexport const CACHE_DIR = '.ario-deploy'\nexport const CACHE_FILE = 'transaction-cache.json'\n"],"names":[],"mappings":"AAAO,MAAM,yBAAA,GAA4B;AAClC,MAAM,SAAA,GAAY;AAClB,MAAM,UAAA,GAAa;;;;"}
@@ -0,0 +1,104 @@
1
+ import { DEVNET_PROGRAM_IDS, DEVNET_RPC_URL, MAINNET_RPC_URL } from '@ar.io/sdk';
2
+ import { createSolanaRpc, createKeyPairSignerFromBytes, createSolanaRpcSubscriptions } from '@solana/kit';
3
+ import bs58 from 'bs58';
4
+ import { c as chalk } from './upload-workflow-DSS5FIa5.js';
5
+
6
+ function solanaDeployKeyFromString(input) {
7
+ return input.trim();
8
+ }
9
+ function solanaDeployKeyFromFile(content) {
10
+ let bytes;
11
+ try {
12
+ bytes = JSON.parse(content);
13
+ } catch {
14
+ throw new Error("Invalid Solana wallet file: expected a JSON array of bytes (id.json format)");
15
+ }
16
+ if (!Array.isArray(bytes) || bytes.length !== 64) {
17
+ throw new Error(
18
+ "Invalid Solana wallet file: expected a 64-byte secret key array (id.json format)"
19
+ );
20
+ }
21
+ return bs58.encode(Uint8Array.from(bytes));
22
+ }
23
+ function createSolanaArnsSigner(deployKey) {
24
+ return createKeyPairSignerFromBytes(bs58.decode(deployKey));
25
+ }
26
+ function clusterHttpUrl(cluster, rpcUrl) {
27
+ if (rpcUrl) {
28
+ return rpcUrl;
29
+ }
30
+ return cluster === "devnet" ? DEVNET_RPC_URL : MAINNET_RPC_URL;
31
+ }
32
+ function toWebSocketUrl(httpUrl) {
33
+ return httpUrl.replace(/^http/, "ws");
34
+ }
35
+ function createArioRpc(cluster, rpcUrl) {
36
+ return createSolanaRpc(clusterHttpUrl(cluster, rpcUrl));
37
+ }
38
+ function createArioRpcSubscriptions(cluster, rpcUrl) {
39
+ return createSolanaRpcSubscriptions(toWebSocketUrl(clusterHttpUrl(cluster, rpcUrl)));
40
+ }
41
+ function clusterProgramIds(cluster) {
42
+ if (cluster !== "devnet") {
43
+ return {};
44
+ }
45
+ return {
46
+ antProgramId: DEVNET_PROGRAM_IDS.ant,
47
+ arnsProgramId: DEVNET_PROGRAM_IDS.arns,
48
+ coreProgramId: DEVNET_PROGRAM_IDS.core,
49
+ garProgramId: DEVNET_PROGRAM_IDS.gar
50
+ };
51
+ }
52
+
53
+ function deployKeyFromWalletFile(sigType, content) {
54
+ if (sigType === "arweave") {
55
+ return Buffer.from(content).toString("base64");
56
+ }
57
+ if (sigType === "solana") {
58
+ return solanaDeployKeyFromFile(content);
59
+ }
60
+ return content.trim();
61
+ }
62
+ function deployKeyFromPrivateKey(sigType, privateKey) {
63
+ if (sigType === "arweave") {
64
+ return Buffer.from(privateKey).toString("base64");
65
+ }
66
+ if (sigType === "solana") {
67
+ return solanaDeployKeyFromString(privateKey);
68
+ }
69
+ return privateKey.trim();
70
+ }
71
+
72
+ function formatUploadSize(size) {
73
+ return `${(size.signedBytes ?? size.payloadBytes).toLocaleString()} bytes`;
74
+ }
75
+ function formatUploadCost(cost) {
76
+ return `${cost.amount.toString()}`;
77
+ }
78
+ function formatDisplayRows(rows) {
79
+ return rows.map(([label, value]) => `${label}: ${value}`).join("\n");
80
+ }
81
+ function formatUploadError(message, title = "Upload failed") {
82
+ const rows = [];
83
+ const sections = message.split(/\n{2,}/).map((section) => section.trim()).filter(Boolean);
84
+ for (const [index, section] of sections.entries()) {
85
+ if (index === 0) {
86
+ rows.push(["Error", chalk.red(section)]);
87
+ continue;
88
+ }
89
+ if (section.startsWith("Required upload credit:")) {
90
+ rows.push([
91
+ "Required upload credit",
92
+ chalk.blue(section.replace(/^Required upload credit:\s*/, ""))
93
+ ]);
94
+ continue;
95
+ }
96
+ rows.push(["Note", section]);
97
+ }
98
+ return `${chalk.bold(chalk.red(title))}
99
+
100
+ ${formatDisplayRows(rows)}`;
101
+ }
102
+
103
+ export { deployKeyFromPrivateKey as a, createArioRpc as b, clusterProgramIds as c, deployKeyFromWalletFile as d, createSolanaArnsSigner as e, formatDisplayRows as f, createArioRpcSubscriptions as g, formatUploadError as h, formatUploadSize as i, formatUploadCost as j };
104
+ //# sourceMappingURL=display-DRcjDj9k.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-DRcjDj9k.js","sources":["../../src/utils/solana.ts","../../src/utils/deploy-key.ts","../../src/utils/display.ts"],"sourcesContent":["import { DEVNET_PROGRAM_IDS, DEVNET_RPC_URL, MAINNET_RPC_URL } from '@ar.io/sdk'\nimport {\n type Address,\n createKeyPairSignerFromBytes,\n createSolanaRpc,\n createSolanaRpcSubscriptions,\n type KeyPairSigner,\n} from '@solana/kit'\nimport bs58 from 'bs58'\n\ntype ClusterProgramIds = Partial<\n Record<'antProgramId' | 'arnsProgramId' | 'coreProgramId' | 'garProgramId', Address>\n>\n\nexport type SolanaCluster = 'devnet' | 'mainnet'\n\n/**\n * Normalize a Solana private key provided as a string. We accept a base58\n * encoded 64-byte secret key (the format wallets like Phantom export), which is\n * exactly what arbundles' HexSolanaSigner expects, so we just trim it.\n */\nexport function solanaDeployKeyFromString(input: string): string {\n return input.trim()\n}\n\n/**\n * Convert a `solana-keygen` JSON wallet (a JSON array of 64 bytes, e.g.\n * ~/.config/solana/id.json) into the base58 secret-key string used as the\n * deploy key throughout the CLI.\n */\nexport function solanaDeployKeyFromFile(content: string): string {\n let bytes: number[]\n try {\n bytes = JSON.parse(content) as number[]\n } catch {\n throw new Error('Invalid Solana wallet file: expected a JSON array of bytes (id.json format)')\n }\n\n if (!Array.isArray(bytes) || bytes.length !== 64) {\n throw new Error(\n 'Invalid Solana wallet file: expected a 64-byte secret key array (id.json format)',\n )\n }\n\n return bs58.encode(Uint8Array.from(bytes))\n}\n\n/**\n * Build a Solana `TransactionSigner` from the base58 deploy key, used to sign\n * ArNS/ANT program transactions.\n */\nexport function createSolanaArnsSigner(deployKey: string): Promise<KeyPairSigner> {\n return createKeyPairSignerFromBytes(bs58.decode(deployKey))\n}\n\nfunction clusterHttpUrl(cluster: SolanaCluster, rpcUrl?: string): string {\n if (rpcUrl) {\n return rpcUrl\n }\n\n return cluster === 'devnet' ? DEVNET_RPC_URL : MAINNET_RPC_URL\n}\n\nfunction toWebSocketUrl(httpUrl: string): string {\n return httpUrl.replace(/^http/, 'ws')\n}\n\nexport function createArioRpc(cluster: SolanaCluster, rpcUrl?: string) {\n return createSolanaRpc(clusterHttpUrl(cluster, rpcUrl))\n}\n\nexport function createArioRpcSubscriptions(cluster: SolanaCluster, rpcUrl?: string) {\n return createSolanaRpcSubscriptions(toWebSocketUrl(clusterHttpUrl(cluster, rpcUrl)))\n}\n\n/**\n * Program-id overrides to pass to `ARIO.init` / `SolanaANTWriteable`. Mainnet\n * uses the SDK defaults (empty object); devnet must pass explicit ids.\n */\nexport function clusterProgramIds(cluster: SolanaCluster): ClusterProgramIds {\n if (cluster !== 'devnet') {\n return {}\n }\n\n return {\n antProgramId: DEVNET_PROGRAM_IDS.ant,\n arnsProgramId: DEVNET_PROGRAM_IDS.arns,\n coreProgramId: DEVNET_PROGRAM_IDS.core,\n garProgramId: DEVNET_PROGRAM_IDS.gar,\n }\n}\n","import { solanaDeployKeyFromFile, solanaDeployKeyFromString } from './solana.js'\n\n/**\n * Encode the contents of a wallet file into the deploy-key string used\n * throughout the CLI, based on the signer type:\n * - arweave: base64-encoded JWK JSON\n * - solana: base58 secret key derived from a solana-keygen id.json byte array\n * - ethereum/polygon/kyve: trimmed hex private key\n */\nexport function deployKeyFromWalletFile(sigType: string, content: string): string {\n if (sigType === 'arweave') {\n return Buffer.from(content).toString('base64')\n }\n\n if (sigType === 'solana') {\n return solanaDeployKeyFromFile(content)\n }\n\n return content.trim()\n}\n\n/**\n * Encode a private-key string into the deploy-key string used throughout the\n * CLI, based on the signer type (see {@link deployKeyFromWalletFile}). For\n * Solana this is a base58-encoded secret key.\n */\nexport function deployKeyFromPrivateKey(sigType: string, privateKey: string): string {\n if (sigType === 'arweave') {\n return Buffer.from(privateKey).toString('base64')\n }\n\n if (sigType === 'solana') {\n return solanaDeployKeyFromString(privateKey)\n }\n\n return privateKey.trim()\n}\n","import { chalk } from './chalk.js'\nimport type { UploadCost, UploadSize } from './upload-types.js'\n\nexport type DisplayRow = [label: string, value: string]\n\nexport function formatUploadSize(size: UploadSize): string {\n return `${(size.signedBytes ?? size.payloadBytes).toLocaleString()} bytes`\n}\n\nexport function formatUploadCost(cost: UploadCost): string {\n return `${cost.amount.toString()}`\n}\n\nexport function formatDisplayRows(rows: DisplayRow[]): string {\n return rows.map(([label, value]) => `${label}: ${value}`).join('\\n')\n}\n\nexport function formatUploadError(message: string, title = 'Upload failed'): string {\n const rows: DisplayRow[] = []\n const sections = message\n .split(/\\n{2,}/)\n .map((section) => section.trim())\n .filter(Boolean)\n\n for (const [index, section] of sections.entries()) {\n if (index === 0) {\n rows.push(['Error', chalk.red(section)])\n continue\n }\n\n if (section.startsWith('Required upload credit:')) {\n rows.push([\n 'Required upload credit',\n chalk.blue(section.replace(/^Required upload credit:\\s*/, '')),\n ])\n continue\n }\n\n rows.push(['Note', section])\n }\n\n return `${chalk.bold(chalk.red(title))}\\n\\n${formatDisplayRows(rows)}`\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { TurboFactory, ETHToTokenAmount, ARIOToTokenAmount, OnDemandFunding } from '@ardrive/turbo-sdk';
4
+ import ora from 'ora';
5
+ import { l as loadCache, u as uploadFile, c as cleanupCache, s as saveCache, a as uploadFolder } from './uploader-B2tC-1Qw.js';
6
+ import { expandPath } from '../utils/path.js';
7
+ import { createSigner } from '../utils/signer.js';
8
+
9
+ const RESET = "\x1B[0m";
10
+ const WHITE = "\x1B[37m";
11
+ const BG_BLACK = "\x1B[40m";
12
+ const colorCodes = [
13
+ ["bold", "\x1B[1m"],
14
+ ["dim", "\x1B[2m"],
15
+ ["italic", "\x1B[3m"],
16
+ ["underline", "\x1B[4m"],
17
+ ["inverse", "\x1B[7m"],
18
+ ["strikethrough", "\x1B[9m"],
19
+ ["black", "\x1B[30m"],
20
+ ["red", "\x1B[31m"],
21
+ ["green", "\x1B[32m"],
22
+ ["yellow", "\x1B[33m"],
23
+ ["blue", "\x1B[34m"],
24
+ ["magenta", "\x1B[35m"],
25
+ ["cyan", "\x1B[36m"],
26
+ ["white", WHITE],
27
+ ["gray", "\x1B[90m"],
28
+ ["grey", "\x1B[90m"],
29
+ ["blackBright", "\x1B[90m"],
30
+ ["redBright", "\x1B[91m"],
31
+ ["greenBright", "\x1B[92m"],
32
+ ["yellowBright", "\x1B[93m"],
33
+ ["blueBright", "\x1B[94m"],
34
+ ["magentaBright", "\x1B[95m"],
35
+ ["cyanBright", "\x1B[96m"],
36
+ ["whiteBright", "\x1B[97m"],
37
+ ["bgBlack", BG_BLACK],
38
+ ["bgRed", "\x1B[41m"],
39
+ ["bgGreen", "\x1B[42m"],
40
+ ["bgYellow", "\x1B[43m"],
41
+ ["bgBlue", "\x1B[44m"],
42
+ ["bgMagenta", "\x1B[45m"],
43
+ ["bgCyan", "\x1B[46m"],
44
+ ["bgWhite", "\x1B[47m"],
45
+ ["bgBlackBright", "\x1B[100m"]
46
+ ];
47
+ const createColorFunction = (code) => (text) => `${code}${String(text)}${RESET}`;
48
+ const colorFunctions = {};
49
+ for (const [name, code] of colorCodes) {
50
+ colorFunctions[name] = createColorFunction(code);
51
+ }
52
+ const chalk = Object.assign(colorFunctions, {
53
+ highlight: (text) => `${BG_BLACK}${WHITE}${String(text)} ${RESET}`
54
+ });
55
+
56
+ function getFolderSize(folderPath) {
57
+ let totalSize = 0;
58
+ for (const item of fs.readdirSync(folderPath)) {
59
+ const fullPath = path.join(folderPath, item);
60
+ const stats = fs.statSync(fullPath);
61
+ totalSize += stats.isDirectory() ? getFolderSize(fullPath) : stats.size;
62
+ }
63
+ return totalSize;
64
+ }
65
+ async function runUploadWorkflow(deployKey, config, io) {
66
+ const spinner = ora();
67
+ spinner.start("Creating signer");
68
+ const { signer, token } = createSigner(config["sig-type"], deployKey);
69
+ spinner.succeed(`Signer created (${chalk.cyan(config["sig-type"])})`);
70
+ spinner.start("Initializing Turbo");
71
+ const turboFactoryArgs = { signer, token };
72
+ if (config.uploader) {
73
+ turboFactoryArgs.uploadServiceConfig = { url: config.uploader };
74
+ }
75
+ const turbo = TurboFactory.authenticated(turboFactoryArgs);
76
+ const uploadClient = turbo;
77
+ spinner.succeed("Turbo initialized");
78
+ let fundingMode;
79
+ if (config["on-demand"] && config["max-token-amount"]) {
80
+ const tokenType = config["on-demand"];
81
+ const maxAmount = Number.parseFloat(config["max-token-amount"]);
82
+ let maxTokenAmount;
83
+ switch (tokenType) {
84
+ case "ario": {
85
+ maxTokenAmount = ARIOToTokenAmount(maxAmount);
86
+ break;
87
+ }
88
+ case "base-eth": {
89
+ maxTokenAmount = ETHToTokenAmount(maxAmount);
90
+ break;
91
+ }
92
+ default: {
93
+ throw new Error(`Unsupported on-demand token type: ${tokenType}`);
94
+ }
95
+ }
96
+ fundingMode = new OnDemandFunding({
97
+ maxTokenAmount,
98
+ topUpBufferMultiplier: 1.1
99
+ });
100
+ }
101
+ if (!fundingMode && turbo) {
102
+ spinner.start("Checking Turbo credits for upload");
103
+ try {
104
+ const uploadBytes = config["deploy-file"] ? (() => {
105
+ const filePath = expandPath(config["deploy-file"]);
106
+ return fs.statSync(filePath).size;
107
+ })() : (() => {
108
+ const folderPath = expandPath(config["deploy-folder"]);
109
+ return getFolderSize(folderPath);
110
+ })();
111
+ const FREE_THRESHOLD_BYTES = 107520;
112
+ if (uploadBytes >= FREE_THRESHOLD_BYTES) {
113
+ const [uploadCost] = await turbo.getUploadCosts({ bytes: [uploadBytes] });
114
+ const balance = await turbo.getBalance();
115
+ const requiredWinc = BigInt(uploadCost.winc);
116
+ const currentWinc = BigInt(balance.winc);
117
+ if (requiredWinc > currentWinc) {
118
+ spinner.fail("Insufficient Turbo credits");
119
+ io.error(
120
+ [
121
+ "Insufficient Turbo credits for this upload.",
122
+ `Required: ${requiredWinc.toString()} winc, available: ${currentWinc.toString()} winc.`,
123
+ "",
124
+ "Top up your Turbo balance (or re-run with --on-demand and --max-token-amount)."
125
+ ].join(" ")
126
+ );
127
+ }
128
+ }
129
+ spinner.succeed("Turbo credits check passed");
130
+ } catch (balanceError) {
131
+ spinner.fail("Failed to check Turbo credits");
132
+ const errorMessage = balanceError instanceof Error ? balanceError.message : String(balanceError);
133
+ io.error(`Failed to check Turbo credits: ${errorMessage}`);
134
+ }
135
+ }
136
+ let txOrManifestId;
137
+ let cost;
138
+ let size;
139
+ try {
140
+ if (config["deploy-file"]) {
141
+ const filePath = expandPath(config["deploy-file"]);
142
+ spinner.start(`Uploading file ${chalk.yellow(config["deploy-file"])}`);
143
+ let cache = config["dedupe-cache-max-entries"] > 0 ? loadCache() : {};
144
+ const uploadResult = await uploadFile(uploadClient, filePath, { cache, fundingMode });
145
+ if (!uploadResult.transactionId) {
146
+ spinner.fail("File upload failed: no transaction ID returned");
147
+ io.error("File upload failed: no transaction ID returned");
148
+ }
149
+ txOrManifestId = uploadResult.transactionId;
150
+ cost = uploadResult.cost;
151
+ size = uploadResult.size;
152
+ if (uploadResult.updatedCache && config["dedupe-cache-max-entries"] > 0) {
153
+ cache = cleanupCache(uploadResult.updatedCache, config["dedupe-cache-max-entries"]);
154
+ saveCache(cache);
155
+ }
156
+ if (uploadResult.cacheHit) {
157
+ spinner.succeed(`File cache hit - reusing transaction ${chalk.green(txOrManifestId)}`);
158
+ } else {
159
+ const cacheMsg = config["dedupe-cache-max-entries"] > 0 ? chalk.gray("(cached for future uploads)") : "";
160
+ spinner.succeed(`File uploaded: ${chalk.green(txOrManifestId)} ${cacheMsg}`.trim());
161
+ }
162
+ } else {
163
+ const folderPath = expandPath(config["deploy-folder"]);
164
+ spinner.start(`Uploading folder ${chalk.yellow(config["deploy-folder"])}`);
165
+ let cache = config["dedupe-cache-max-entries"] > 0 ? loadCache() : {};
166
+ const uploadResult = await uploadFolder(uploadClient, folderPath, {
167
+ cache,
168
+ fundingMode,
169
+ throwOnFailure: true
170
+ });
171
+ if (!uploadResult.transactionId) {
172
+ spinner.fail("Folder upload failed: no transaction ID returned");
173
+ io.error("Folder upload failed: no transaction ID returned");
174
+ }
175
+ txOrManifestId = uploadResult.transactionId;
176
+ cost = uploadResult.cost;
177
+ size = uploadResult.size;
178
+ if (uploadResult.updatedCache && config["dedupe-cache-max-entries"] > 0) {
179
+ cache = cleanupCache(uploadResult.updatedCache, config["dedupe-cache-max-entries"]);
180
+ saveCache(cache);
181
+ }
182
+ const { cacheHits, totalFiles, uploaded } = uploadResult;
183
+ const statsMsg = cacheHits > 0 ? chalk.gray(` (${cacheHits}/${totalFiles} files cached, ${uploaded} uploaded)`) : "";
184
+ if (uploadResult.cacheHit) {
185
+ spinner.succeed(`All ${totalFiles} files cached - manifest: ${chalk.green(txOrManifestId)}`);
186
+ } else {
187
+ const cacheMsg = config["dedupe-cache-max-entries"] > 0 ? chalk.gray(" (files cached for future uploads)") : "";
188
+ spinner.succeed(`Folder uploaded: ${chalk.green(txOrManifestId)}${statsMsg}${cacheMsg}`);
189
+ }
190
+ }
191
+ } catch (uploadError) {
192
+ spinner.fail("Upload failed");
193
+ const errorMessage = uploadError instanceof Error ? uploadError.message : String(uploadError);
194
+ io.error(`Upload failed: ${errorMessage}`);
195
+ }
196
+ return {
197
+ cost,
198
+ size,
199
+ transactionId: txOrManifestId
200
+ };
201
+ }
202
+
203
+ export { chalk as c, runUploadWorkflow as r };
204
+ //# sourceMappingURL=upload-workflow-DSS5FIa5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-workflow-DSS5FIa5.js","sources":["../../src/utils/chalk.ts","../../src/workflows/upload-workflow.ts"],"sourcesContent":["const RESET = '\\u001B[0m'\nconst WHITE = '\\u001B[37m'\nconst BG_BLACK = '\\u001B[40m'\n\nconst colorCodes = [\n ['bold', '\\u001B[1m'],\n ['dim', '\\u001B[2m'],\n ['italic', '\\u001B[3m'],\n ['underline', '\\u001B[4m'],\n ['inverse', '\\u001B[7m'],\n ['strikethrough', '\\u001B[9m'],\n\n ['black', '\\u001B[30m'],\n ['red', '\\u001B[31m'],\n ['green', '\\u001B[32m'],\n ['yellow', '\\u001B[33m'],\n ['blue', '\\u001B[34m'],\n ['magenta', '\\u001B[35m'],\n ['cyan', '\\u001B[36m'],\n ['white', WHITE],\n ['gray', '\\u001B[90m'],\n ['grey', '\\u001B[90m'],\n\n ['blackBright', '\\u001B[90m'],\n ['redBright', '\\u001B[91m'],\n ['greenBright', '\\u001B[92m'],\n ['yellowBright', '\\u001B[93m'],\n ['blueBright', '\\u001B[94m'],\n ['magentaBright', '\\u001B[95m'],\n ['cyanBright', '\\u001B[96m'],\n ['whiteBright', '\\u001B[97m'],\n\n ['bgBlack', BG_BLACK],\n ['bgRed', '\\u001B[41m'],\n ['bgGreen', '\\u001B[42m'],\n ['bgYellow', '\\u001B[43m'],\n ['bgBlue', '\\u001B[44m'],\n ['bgMagenta', '\\u001B[45m'],\n ['bgCyan', '\\u001B[46m'],\n ['bgWhite', '\\u001B[47m'],\n ['bgBlackBright', '\\u001B[100m'],\n] as const\n\ntype ColorName = (typeof colorCodes)[number][0]\ntype ColorFunction = (text: unknown) => string\ntype Chalk = {\n highlight: ColorFunction\n} & Record<ColorName, ColorFunction>\n\nconst createColorFunction =\n (code: string): ColorFunction =>\n (text) =>\n `${code}${String(text)}${RESET}`\n\nconst colorFunctions = {} as Record<ColorName, ColorFunction>\n\nfor (const [name, code] of colorCodes) {\n colorFunctions[name] = createColorFunction(code)\n}\n\nexport const chalk: Chalk = Object.assign(colorFunctions, {\n highlight: (text: unknown) => `${BG_BLACK}${WHITE}${String(text)} ${RESET}`,\n})\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport {\n ARIOToTokenAmount,\n ETHToTokenAmount,\n OnDemandFunding,\n TurboAuthenticatedConfiguration,\n TurboFactory,\n} from '@ardrive/turbo-sdk'\nimport ora from 'ora'\n\nimport type { SignerType } from '../types/index.js'\nimport { cleanupCache, loadCache, saveCache } from '../utils/cache.js'\nimport { chalk } from '../utils/chalk.js'\nimport { expandPath } from '../utils/path.js'\nimport { createSigner } from '../utils/signer.js'\nimport type { UploadClient, UploadCost, UploadSize } from '../utils/upload-types.js'\nimport { type FolderUploadResult, uploadFile, uploadFolder } from '../utils/uploader.js'\n\nexport interface UploadWorkflowConfig {\n 'dedupe-cache-max-entries': number\n 'deploy-file'?: string\n 'deploy-folder': string\n 'max-token-amount'?: string\n 'on-demand'?: string\n 'sig-type': string\n uploader?: string\n}\n\nfunction getFolderSize(folderPath: string): number {\n let totalSize = 0\n\n for (const item of fs.readdirSync(folderPath)) {\n const fullPath = path.join(folderPath, item)\n const stats = fs.statSync(fullPath)\n\n totalSize += stats.isDirectory() ? getFolderSize(fullPath) : stats.size\n }\n\n return totalSize\n}\n\nexport interface UploadWorkflowIo {\n error: (msg: string) => never\n}\n\nexport interface UploadWorkflowResult {\n cost?: UploadCost\n size?: UploadSize\n transactionId: string\n}\n\n/**\n * Sign in to Turbo and upload a file or folder.\n *\n * @param deployKey - Wallet material (base64 JWK or hex private key per sig-type)\n * @param config - Upload paths, dedupe, bundler service URL, on-demand payment\n * @param io - Error handler (must exit the process)\n * @returns Transaction ID or folder manifest ID\n */\nexport async function runUploadWorkflow(\n deployKey: string,\n config: UploadWorkflowConfig,\n io: UploadWorkflowIo,\n): Promise<UploadWorkflowResult> {\n const spinner = ora()\n\n spinner.start('Creating signer')\n const { signer, token } = createSigner(config['sig-type'] as SignerType, deployKey)\n spinner.succeed(`Signer created (${chalk.cyan(config['sig-type'])})`)\n\n spinner.start('Initializing Turbo')\n\n const turboFactoryArgs: TurboAuthenticatedConfiguration = { signer, token }\n\n if (config.uploader) {\n turboFactoryArgs.uploadServiceConfig = { url: config.uploader }\n }\n\n const turbo = TurboFactory.authenticated(turboFactoryArgs)\n const uploadClient: UploadClient = turbo as UploadClient\n\n spinner.succeed('Turbo initialized')\n\n let fundingMode: OnDemandFunding | undefined\n if (config['on-demand'] && config['max-token-amount']) {\n const tokenType = config['on-demand']\n const maxAmount = Number.parseFloat(config['max-token-amount'])\n\n let maxTokenAmount: ReturnType<typeof ARIOToTokenAmount>\n switch (tokenType) {\n case 'ario': {\n maxTokenAmount = ARIOToTokenAmount(maxAmount)\n break\n }\n\n case 'base-eth': {\n maxTokenAmount = ETHToTokenAmount(maxAmount)\n break\n }\n\n default: {\n throw new Error(`Unsupported on-demand token type: ${tokenType}`)\n }\n }\n\n fundingMode = new OnDemandFunding({\n maxTokenAmount,\n topUpBufferMultiplier: 1.1,\n })\n }\n\n if (!fundingMode && turbo) {\n spinner.start('Checking Turbo credits for upload')\n\n try {\n const uploadBytes = config['deploy-file']\n ? (() => {\n const filePath = expandPath(config['deploy-file']!)\n return fs.statSync(filePath).size\n })()\n : (() => {\n const folderPath = expandPath(config['deploy-folder']!)\n return getFolderSize(folderPath)\n })()\n\n const FREE_THRESHOLD_BYTES = 107_520 // ~105 KiB\n\n if (uploadBytes >= FREE_THRESHOLD_BYTES) {\n const [uploadCost] = await turbo.getUploadCosts({ bytes: [uploadBytes] })\n const balance = await turbo.getBalance()\n\n const requiredWinc = BigInt(uploadCost.winc)\n const currentWinc = BigInt(balance.winc)\n\n if (requiredWinc > currentWinc) {\n spinner.fail('Insufficient Turbo credits')\n\n io.error(\n [\n 'Insufficient Turbo credits for this upload.',\n `Required: ${requiredWinc.toString()} winc, available: ${currentWinc.toString()} winc.`,\n '',\n 'Top up your Turbo balance (or re-run with --on-demand and --max-token-amount).',\n ].join(' '),\n )\n }\n }\n\n spinner.succeed('Turbo credits check passed')\n } catch (balanceError) {\n spinner.fail('Failed to check Turbo credits')\n const errorMessage =\n balanceError instanceof Error ? balanceError.message : String(balanceError)\n io.error(`Failed to check Turbo credits: ${errorMessage}`)\n }\n }\n\n let txOrManifestId: string\n let cost: UploadCost | undefined\n let size: UploadSize | undefined\n try {\n if (config['deploy-file']) {\n const filePath = expandPath(config['deploy-file'])\n spinner.start(`Uploading file ${chalk.yellow(config['deploy-file'])}`)\n\n let cache = config['dedupe-cache-max-entries'] > 0 ? loadCache() : {}\n const uploadResult = await uploadFile(uploadClient, filePath, { cache, fundingMode })\n\n if (!uploadResult.transactionId) {\n spinner.fail('File upload failed: no transaction ID returned')\n io.error('File upload failed: no transaction ID returned')\n }\n\n txOrManifestId = uploadResult.transactionId\n cost = uploadResult.cost\n size = uploadResult.size\n\n if (uploadResult.updatedCache && config['dedupe-cache-max-entries'] > 0) {\n cache = cleanupCache(uploadResult.updatedCache, config['dedupe-cache-max-entries'])\n saveCache(cache)\n }\n\n if (uploadResult.cacheHit) {\n spinner.succeed(`File cache hit - reusing transaction ${chalk.green(txOrManifestId)}`)\n } else {\n const cacheMsg =\n config['dedupe-cache-max-entries'] > 0 ? chalk.gray('(cached for future uploads)') : ''\n spinner.succeed(`File uploaded: ${chalk.green(txOrManifestId)} ${cacheMsg}`.trim())\n }\n } else {\n const folderPath = expandPath(config['deploy-folder'])\n spinner.start(`Uploading folder ${chalk.yellow(config['deploy-folder'])}`)\n\n let cache = config['dedupe-cache-max-entries'] > 0 ? loadCache() : {}\n const uploadResult: FolderUploadResult = await uploadFolder(uploadClient, folderPath, {\n cache,\n fundingMode,\n throwOnFailure: true,\n })\n\n if (!uploadResult.transactionId) {\n spinner.fail('Folder upload failed: no transaction ID returned')\n io.error('Folder upload failed: no transaction ID returned')\n }\n\n txOrManifestId = uploadResult.transactionId\n cost = uploadResult.cost\n size = uploadResult.size\n\n if (uploadResult.updatedCache && config['dedupe-cache-max-entries'] > 0) {\n cache = cleanupCache(uploadResult.updatedCache, config['dedupe-cache-max-entries'])\n saveCache(cache)\n }\n\n const { cacheHits, totalFiles, uploaded } = uploadResult\n const statsMsg =\n cacheHits > 0\n ? chalk.gray(` (${cacheHits}/${totalFiles} files cached, ${uploaded} uploaded)`)\n : ''\n\n if (uploadResult.cacheHit) {\n spinner.succeed(`All ${totalFiles} files cached - manifest: ${chalk.green(txOrManifestId)}`)\n } else {\n const cacheMsg =\n config['dedupe-cache-max-entries'] > 0\n ? chalk.gray(' (files cached for future uploads)')\n : ''\n spinner.succeed(`Folder uploaded: ${chalk.green(txOrManifestId)}${statsMsg}${cacheMsg}`)\n }\n }\n } catch (uploadError) {\n spinner.fail('Upload failed')\n const errorMessage = uploadError instanceof Error ? uploadError.message : String(uploadError)\n io.error(`Upload failed: ${errorMessage}`)\n }\n\n return {\n cost,\n size,\n transactionId: txOrManifestId,\n }\n}\n"],"names":[],"mappings":"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"}