permaweb-deploy 0.0.0-rc-20251001221603 ā 0.0.0-rc-20251001222052
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.js","sources":["../../src/commands/deploy.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { ANT, AOProcess, ARIO } from '@ar.io/sdk'\nimport { TurboFactory } from '@ardrive/turbo-sdk'\nimport { Command } from '@oclif/core'\nimport { connect } from '@permaweb/aoconnect'\nimport boxen from 'boxen'\nimport chalk from 'chalk'\nimport Table from 'cli-table3'\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 type { SignerType } from '../types/index.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { expandPath } from '../utils/path.js'\nimport { createSigner } from '../utils/signer.js'\nimport { uploadFile, uploadFolder } from '../utils/uploader.js'\n\nexport default class Deploy extends Command {\n static override args = {}\n\n static override description = 'Deploy your application to the permaweb'\n\n static override examples = [\n '<%= config.bin %> deploy # Interactive mode',\n '<%= config.bin %> deploy --arns-name my-app --wallet ./wallet.json',\n '<%= config.bin %> deploy --arns-name my-app --private-key \"$(cat wallet.json)\"',\n '<%= config.bin %> deploy --arns-name my-app --undername staging',\n '<%= config.bin %> deploy --arns-name my-app --deploy-file ./dist/index.html',\n '<%= config.bin %> deploy --arns-name my-app --sig-type ethereum --wallet ./private-key.txt',\n '<%= config.bin %> deploy --arns-name my-app --sig-type ethereum --private-key \"0x...\"',\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 // Check if we need interactive mode (no arns-name provided)\n const interactive = !flags['arns-name']\n\n if (interactive) {\n this.log(chalk.cyan.bold('\\nšÆ Interactive Deployment Mode\\n'))\n }\n\n // Resolve base configuration - prompts will run automatically in interactive mode\n const baseConfig = (await resolveConfig<typeof deployFlagConfigs>(deployFlagConfigs, flags, {\n interactive,\n })) as DeployConfig\n\n // Handle wallet configuration (shared between wallet and privateKey)\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 // Handle advanced options (shared between ttlSeconds, undername, arioProcess)\n let advancedOptions:\n | {\n arioProcess: 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 // Build final config with shared prompt results\n const deployConfig: DeployConfig = {\n 'ario-process': advancedOptions?.arioProcess || baseConfig['ario-process'],\n 'arns-name': baseConfig['arns-name'],\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'private-key': walletConfig.privateKey,\n 'sig-type': baseConfig['sig-type'],\n 'ttl-seconds': advancedOptions?.ttlSeconds || baseConfig['ttl-seconds'],\n undername: advancedOptions?.undername || baseConfig.undername,\n wallet: walletConfig.wallet,\n }\n\n if (interactive) {\n this.log('')\n }\n\n // Get deploy key from wallet file, private-key flag, or environment variable\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 // For Arweave wallets (JWK), encode to base64. For others (private keys), use as-is\n deployKey =\n deployConfig['sig-type'] === 'arweave'\n ? Buffer.from(walletContent).toString('base64')\n : walletContent.trim()\n } else if (deployConfig['private-key']) {\n // For Arweave wallets (JWK JSON), encode to base64. For others, use as-is\n deployKey =\n deployConfig['sig-type'] === 'arweave'\n ? Buffer.from(deployConfig['private-key']).toString('base64')\n : deployConfig['private-key'].trim()\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 // All validation is now handled in resolveDeployConfig\n const arioProcess = deployConfig['ario-process']\n\n this.log(chalk.cyan.bold('\\nš Starting deployment...\\n'))\n try {\n // Initialize ARIO\n const spinner = ora('Initializing ARIO').start()\n\n const ario = ARIO.init({\n process: new AOProcess({\n ao: connect({\n CU_URL: 'https://cu.ardrive.io',\n MODE: 'legacy',\n }),\n processId: arioProcess,\n }),\n })\n\n spinner.succeed('ARIO initialized')\n\n // Get ArNS record\n spinner.start(`Fetching ArNS record for ${chalk.yellow(deployConfig['arns-name'])}`)\n const arnsNameRecord = await ario\n .getArNSRecord({ name: deployConfig['arns-name'] })\n .catch(() => {\n spinner.fail(`ArNS name ${chalk.red(deployConfig['arns-name'])} does not exist`)\n this.error(`ArNS name [${deployConfig['arns-name']}] does not exist`)\n })\n\n spinner.succeed(`ArNS record fetched for ${chalk.green(deployConfig['arns-name'])}`)\n\n // Create signer\n spinner.start('Creating signer')\n const { signer, token } = createSigner(deployConfig['sig-type'] as SignerType, deployKey)\n spinner.succeed(`Signer created (${chalk.cyan(deployConfig['sig-type'])})`)\n\n // Initialize Turbo\n spinner.start('Initializing Turbo')\n const turbo = TurboFactory.authenticated({\n signer,\n token,\n })\n spinner.succeed('Turbo initialized')\n\n // Upload file or folder\n let txOrManifestId: string\n if (deployConfig['deploy-file']) {\n const filePath = expandPath(deployConfig['deploy-file'])\n spinner.start(`Uploading file ${chalk.yellow(deployConfig['deploy-file'])}`)\n txOrManifestId = await uploadFile(turbo, filePath)\n spinner.succeed(`File uploaded: ${chalk.green(txOrManifestId)}`)\n } else {\n const folderPath = expandPath(deployConfig['deploy-folder'])\n spinner.start(`Uploading folder ${chalk.yellow(deployConfig['deploy-folder'])}`)\n txOrManifestId = await uploadFolder(turbo, folderPath)\n spinner.succeed(`Folder uploaded: ${chalk.green(txOrManifestId)}`)\n }\n\n this.log('')\n\n // Initialize ANT and update record\n spinner.start('Updating ANT record')\n const ant = ANT.init({ processId: arnsNameRecord.processId, signer })\n\n await ant.setRecord(\n {\n transactionId: txOrManifestId,\n ttlSeconds: Number.parseInt(deployConfig['ttl-seconds'], 10),\n undername: deployConfig.undername,\n },\n {\n tags: [\n {\n name: 'App-Name',\n value: 'Permaweb-Deploy',\n },\n ...(process.env.GITHUB_SHA\n ? [\n {\n name: 'GIT-HASH',\n value: process.env.GITHUB_SHA,\n },\n ]\n : []),\n ],\n },\n )\n\n spinner.succeed('ANT record updated')\n\n // Display deployment details in a table inside a success box\n const table = new Table({\n head: [chalk.cyan.bold('Property'), chalk.cyan.bold('Value')],\n style: {\n head: [],\n },\n })\n\n table.push(\n ['Tx ID', chalk.green(txOrManifestId)],\n ['ArNS Name', chalk.yellow(deployConfig['arns-name'])],\n ['Undername', chalk.yellow(deployConfig.undername)],\n ['ANT', chalk.cyan(arnsNameRecord.processId)],\n ['ARIO Process', chalk.gray(arioProcess)],\n ['TTL Seconds', chalk.blue(deployConfig['ttl-seconds'])],\n )\n\n const successMessage = boxen(\n `${chalk.green.bold('⨠Deployment Successful!')}\\n\\n${table.toString()}`,\n {\n borderColor: 'green',\n borderStyle: 'round',\n padding: 1,\n title: chalk.bold('š Permaweb Deploy'),\n titleAlignment: 'center',\n },\n )\n\n this.log(`\\n${successMessage}`)\n } catch (error) {\n this.error(\n chalk.red(`Deployment failed: ${error instanceof Error ? error.message : String(error)}`),\n )\n }\n } catch (error) {\n // Handle user cancellation (Ctrl+C)\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nš Deployment cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deploy.js","sources":["../../src/commands/deploy.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport { ANT, AOProcess, ARIO } from '@ar.io/sdk'\nimport { TurboFactory } from '@ardrive/turbo-sdk'\nimport { Command } from '@oclif/core'\nimport { connect } from '@permaweb/aoconnect'\nimport boxen from 'boxen'\nimport chalk from 'chalk'\nimport Table from 'cli-table3'\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 type { SignerType } from '../types/index.js'\nimport { extractFlags, resolveConfig } from '../utils/config-resolver.js'\nimport { expandPath } from '../utils/path.js'\nimport { createSigner } from '../utils/signer.js'\nimport { uploadFile, uploadFolder } from '../utils/uploader.js'\n\nexport default class Deploy extends Command {\n static override args = {}\n\n static override description = 'Deploy your application to the permaweb'\n\n static override examples = [\n '<%= config.bin %> deploy # Interactive mode',\n '<%= config.bin %> deploy --arns-name my-app --wallet ./wallet.json',\n '<%= config.bin %> deploy --arns-name my-app --private-key \"$(cat wallet.json)\"',\n '<%= config.bin %> deploy --arns-name my-app --undername staging',\n '<%= config.bin %> deploy --arns-name my-app --deploy-file ./dist/index.html',\n '<%= config.bin %> deploy --arns-name my-app --sig-type ethereum --wallet ./private-key.txt',\n '<%= config.bin %> deploy --arns-name my-app --sig-type ethereum --private-key \"0x...\"',\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 // Check if we need interactive mode (no arns-name provided)\n const interactive = !flags['arns-name']\n\n if (interactive) {\n this.log(chalk.cyan.bold('\\nšÆ Interactive Deployment Mode\\n'))\n }\n\n // Resolve base configuration - prompts will run automatically in interactive mode\n const baseConfig = (await resolveConfig<typeof deployFlagConfigs>(deployFlagConfigs, flags, {\n interactive,\n })) as DeployConfig\n\n // Handle wallet configuration (shared between wallet and privateKey)\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 // Handle advanced options (shared between ttlSeconds, undername, arioProcess)\n let advancedOptions:\n | {\n arioProcess: 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 // Build final config with shared prompt results\n const deployConfig: DeployConfig = {\n 'ario-process': advancedOptions?.arioProcess || baseConfig['ario-process'],\n 'arns-name': baseConfig['arns-name'],\n 'deploy-file': baseConfig['deploy-file'],\n 'deploy-folder': baseConfig['deploy-folder'],\n 'private-key': walletConfig.privateKey,\n 'sig-type': baseConfig['sig-type'],\n 'ttl-seconds': advancedOptions?.ttlSeconds || baseConfig['ttl-seconds'],\n undername: advancedOptions?.undername || baseConfig.undername,\n wallet: walletConfig.wallet,\n }\n\n if (interactive) {\n this.log('')\n }\n\n // Get deploy key from wallet file, private-key flag, or environment variable\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 // For Arweave wallets (JWK), encode to base64. For others (private keys), use as-is\n deployKey =\n deployConfig['sig-type'] === 'arweave'\n ? Buffer.from(walletContent).toString('base64')\n : walletContent.trim()\n } else if (deployConfig['private-key']) {\n // For Arweave wallets (JWK JSON), encode to base64. For others, use as-is\n deployKey =\n deployConfig['sig-type'] === 'arweave'\n ? Buffer.from(deployConfig['private-key']).toString('base64')\n : deployConfig['private-key'].trim()\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 // All validation is now handled in resolveDeployConfig\n const arioProcess = deployConfig['ario-process']\n\n this.log(chalk.cyan.bold('\\nš Starting deployment...\\n'))\n try {\n // Initialize ARIO\n const spinner = ora('Initializing ARIO').start()\n\n const ario = ARIO.init({\n process: new AOProcess({\n ao: connect({\n CU_URL: 'https://cu.ardrive.io',\n MODE: 'legacy',\n }),\n processId: arioProcess,\n }),\n })\n\n spinner.succeed('ARIO initialized')\n\n // Get ArNS record\n spinner.start(`Fetching ArNS record for ${chalk.yellow(deployConfig['arns-name'])}`)\n const arnsNameRecord = await ario\n .getArNSRecord({ name: deployConfig['arns-name'] })\n .catch(() => {\n spinner.fail(`ArNS name ${chalk.red(deployConfig['arns-name'])} does not exist`)\n this.error(`ArNS name [${deployConfig['arns-name']}] does not exist`)\n })\n\n spinner.succeed(`ArNS record fetched for ${chalk.green(deployConfig['arns-name'])}`)\n\n // Create signer\n spinner.start('Creating signer')\n const { signer, token } = createSigner(deployConfig['sig-type'] as SignerType, deployKey)\n spinner.succeed(`Signer created (${chalk.cyan(deployConfig['sig-type'])})`)\n\n // Initialize Turbo\n spinner.start('Initializing Turbo')\n const turbo = TurboFactory.authenticated({\n signer,\n token,\n })\n spinner.succeed('Turbo initialized')\n\n // Upload file or folder\n let txOrManifestId: string\n if (deployConfig['deploy-file']) {\n const filePath = expandPath(deployConfig['deploy-file'])\n spinner.start(`Uploading file ${chalk.yellow(deployConfig['deploy-file'])}`)\n txOrManifestId = await uploadFile(turbo, filePath)\n spinner.succeed(`File uploaded: ${chalk.green(txOrManifestId)}`)\n } else {\n const folderPath = expandPath(deployConfig['deploy-folder'])\n spinner.start(`Uploading folder ${chalk.yellow(deployConfig['deploy-folder'])}`)\n txOrManifestId = await uploadFolder(turbo, folderPath)\n spinner.succeed(`Folder uploaded: ${chalk.green(txOrManifestId)}`)\n }\n\n this.log('')\n\n // Initialize ANT and update record\n spinner.start('Updating ANT record')\n const ant = ANT.init({ processId: arnsNameRecord.processId, signer })\n\n await ant.setRecord(\n {\n transactionId: txOrManifestId,\n ttlSeconds: Number.parseInt(deployConfig['ttl-seconds'], 10),\n undername: deployConfig.undername,\n },\n {\n tags: [\n {\n name: 'App-Name',\n value: 'Permaweb-Deploy',\n },\n ...(process.env.GITHUB_SHA\n ? [\n {\n name: 'GIT-HASH',\n value: process.env.GITHUB_SHA,\n },\n ]\n : []),\n ],\n },\n )\n\n spinner.succeed('ANT record updated')\n\n // Display deployment details in a table inside a success box\n const table = new Table({\n head: [chalk.cyan.bold('Property'), chalk.cyan.bold('Value')],\n style: {\n head: [],\n },\n })\n\n table.push(\n ['Tx ID', chalk.green(txOrManifestId)],\n ['ArNS Name', chalk.yellow(deployConfig['arns-name'])],\n ['Undername', chalk.yellow(deployConfig.undername)],\n ['ANT', chalk.cyan(arnsNameRecord.processId)],\n ['ARIO Process', chalk.gray(arioProcess)],\n ['TTL Seconds', chalk.blue(deployConfig['ttl-seconds'])],\n )\n\n const successMessage = boxen(\n `${chalk.green.bold('⨠Deployment Successful!')}\\n\\n${table.toString()}`,\n {\n borderColor: 'green',\n borderStyle: 'round',\n padding: 1,\n title: chalk.bold('š Permaweb Deploy'),\n titleAlignment: 'center',\n },\n )\n\n this.log(`\\n${successMessage}`)\n } catch (error) {\n this.error(\n chalk.red(`Deployment failed: ${error instanceof Error ? error.message : String(error)}`),\n )\n }\n } catch (error) {\n // Handle user cancellation (Ctrl+C)\n if (error instanceof Error && error.name === 'ExitPromptError') {\n this.log(chalk.yellow('\\n\\nš Deployment cancelled'))\n this.exit(0)\n }\n\n throw error\n }\n }\n}\n"],"names":[],"mappings":"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"}
|