From 9dc5c0a9976c4b9e079ab3a2143b59e236847400 Mon Sep 17 00:00:00 2001 From: Kumaraguru <19eucs071@skcet.ac.in> Date: Thu, 31 Oct 2024 02:19:42 +0000 Subject: [PATCH] added gitignore --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 2 + README.md | 51 ++++ images/screenshot.png | Bin 0 -> 100912 bytes index.js | 397 +++++++++++++++++++++++++++ package-lock.json | 619 ++++++++++++++++++++++++++++++++++++++++++ package.json | 22 ++ 7 files changed, 1091 insertions(+) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 README.md create mode 100644 images/screenshot.png create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a98a34bde45e9133d7975a8f7417f4ada1ec2fff GIT binary patch literal 6148 zcmeHK%Sr<=6g|;`MT^v(?q=tzgNoMeSn9&HAE34)zG_EWtKvfDOZ){tQO~^zGBa%# zB8bYpkbCmDkIV^4CIDP#l5PV{0Cg6@+A`G)k#Q+gvJiS?&}ob(wD5o}#9(X_W55{r ze`D-(H>Wtm2#>hJkS(d-qK)07LDugLvL3zV=y>A+u==i|-y3~B zBF~I_jUVFz&z1NGj2ai>Z+25gL^U z^Zb~(w7R;)rv5wwyt75>D;`Z71IB{7f-W@JHK3vG`!VAS|cE*p?94_%_+88hf$_y;} zW>fC}!};(3vXixp0b}4_G2m+5<8Fta6zhNU0sU2xz5oCK literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df16ff9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +datadir \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8e37e48 --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +# Codex Storage CLI + +![CodexCLI](/images/screenshot.png) + +This CLI is the easiest way to get started with [Codex](https://codex.storage). Get your node up and running in a matter of seconds and start interacting with the Codex Testnet by uploading and downloading files from the other peers in the network. + +> ⚠️ Note : Codex is currently in testnet and there is no guarentee for files stored on the Codex test network. All the files uploaded to Codex are not encrypted by default and hence, the files are publicly accessible. By using this application, you agree to acknowledge the [disclaimer](https://github.com/codex-storage/codex-testnet-starter/blob/master/DISCLAIMER.md). + +## How it works? + +Run the Codex Storage CLI in your terminal + +``` +npx codexstorage +``` + +#### Downloading and running the Codex node + +A CLI interface would appear with multiple options. Start by downloading the Codex binaries by using option 1. + +![Installing]() + +Once you are done downloading the binaries, you can go ahead and try running the Codex node by choosing option 2. You will be asked to enter your listening (default : 8070) and discovery (default : 8090) ports during this step. + +![Running]() + +#### Checking the node status + +Now that your node is running, keep the terminal window open and start another instance of the Codex CLI by using the first command. We will be using this terminal to interact with the Codex node that is active. + +You can checkout the node status to ensure that the node is discoverable and connected to the other peers in the Codex test network. + +![Status]() + +If you face any issues (peer discovery, port forwarding etc.,), join our [discord server](https://discord.gg/codex-storage) and ask for help. + +#### Uploading and downloading files from the testnet + +To upload a new file into the testnet, select option 4 and enter the file's relative path. A unique CID will be displayed once the file is uploaded. + +![Upload]() + +To download a file from the testnet, select option 5 and enter the file's CID. + +![Download]() + +If you wish to view all the files that are stored in your local node, choose option 6 to display all the available CIDs. + +#### What's next? + +More features will be added soon! \ No newline at end of file diff --git a/images/screenshot.png b/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f0ef2a41d265ce0d88c7cc8bbae5b1f30d9c6c GIT binary patch literal 100912 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 bmIYlW%!lt%S!$ht|J@Uly^}AZ@A>}#9*U#N literal 0 HcmV?d00001 diff --git a/index.js b/index.js new file mode 100644 index 0000000..b104d03 --- /dev/null +++ b/index.js @@ -0,0 +1,397 @@ +#!/usr/bin/env node + +import inquirer from 'inquirer'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import os from 'os'; +import { createSpinner } from 'nanospinner'; +import chalk from 'chalk'; +import { fileURLToPath } from 'url'; +import { dirname } from 'path'; +import axios from 'axios'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const execAsync = promisify(exec); +const platform = os.platform(); + +const ASCII_ART = ` +██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗ +██╔════╝██╔═══██╗██╔══██╗██╔════╝╚██╗██╔╝ +██║ ██║ ██║██║ ██║█████╗ ╚███╔╝ +██║ ██║ ██║██║ ██║██╔══╝ ██╔██╗ +╚██████╗╚██████╔╝██████╔╝███████╗██╔╝ ██╗ + ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ + +███████╗████████╗ ██████╗ ██████╗ █████╗ ██████╗ ███████╗ +██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗██╔══██╗██╔════╝ ██╔════╝ +███████╗ ██║ ██║ ██║██████╔╝███████║██║ ███╗█████╗ +╚════██║ ██║ ██║ ██║██╔══██╗██╔══██║██║ ██║██╔══╝ +███████║ ██║ ╚██████╔╝██║ ██║██║ ██║╚██████╔╝███████╗ +╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ + ++--------------------------------------------------------------------+ +| Docs : docs.codex.storage | Discord : discord.gg/codex-storage | ++--------------------------------------------------------------------+ +`; + + +async function runCommand(command) { + try { + const { stdout, stderr } = await execAsync(command); + return stdout; + } catch (error) { + console.error('Error:', error.message); + throw error; + } +} + +async function showNavigationMenu() { + console.log('\n') + const { choice } = await inquirer.prompt([ + { + type: 'list', + name: 'choice', + message: 'What would you like to do?', + choices: [ + '1. Back to main menu', + '2. Exit' + ] + } + ]); + + switch (choice.split('.')[0]) { + case '1': + return main(); // Returns to main menu + case '2': + console.log(chalk.cyanBright('\nGoodbye! 👋\n')); + process.exit(0); + } +} + +async function checkCodexInstallation() { + try { + const version = await runCommand('codex --version'); + console.log(chalk.green('Codex is already installed. Version:')); + console.log(chalk.green(version)); + await showNavigationMenu(); + } catch (error) { + console.log(chalk.cyanBright('Codex is not installed, proceeding with installation...')); + await installCodex(); + } +} + +async function installCodex() { // TODO : TEST INSTALLATION TO SEE IF BACKGROUND SHELL WORKS CORRECTLY + if (platform === 'win32') { + console.log(chalk.yellow('Coming soon for Windows!')); + return; + } + + try { + console.log(chalk.cyanBright('Downloading Codex binaries...')); + const downloadCommand = 'curl -# -L https://get.codex.storage/install.sh | bash'; + await runCommand(downloadCommand); + console.log(chalk.green('Codex binaries downloaded')); + + console.log(chalk.cyanBright('Installing dependencies...')); + await runCommand('sudo apt update && sudo apt install libgomp1'); + console.log(chalk.green('Dependencies installed')); + + const version = await runCommand('codex --version'); + console.log(chalk.green('Codex is successfully installed. Version:')); + console.log(chalk.cyanBright(version)); + } catch (error) { + console.error(chalk.red('Failed to install Codex:', error.message)); + } +} + +async function isNodeRunning() { + try { + const response = await axios.get('http://localhost:8080/api/codex/v1/debug/info'); + return response.status === 200; + } catch (error) { + return false; + } +} + +async function runCodex() { + // Check if a Codex node is already running + const nodeAlreadyRunning = await isNodeRunning(); + + if (nodeAlreadyRunning) { + console.log(chalk.green('A Codex node is already running.')); + await showNavigationMenu(); + } + else { + const { discPort, listenPort } = await inquirer.prompt([ + { + type: 'number', + name: 'discPort', + message: 'Enter the discovery port (default is 8090):', + default: 8090 + }, + { + type: 'number', + name: 'listenPort', + message: 'Enter the listening port (default is 8070):', + default: 8070 + } + ]); + + try { + const command = `codex \ + --data-dir=datadir \ + --disc-port=${discPort} \ + --listen-addrs=/ip4/0.0.0.0/tcp/${listenPort} \ + --nat=\`curl -s https://ip.codex.storage\` \ + --api-cors-origin="*" \ + --bootstrap-node=spr:CiUIAhIhAiJvIcA_ZwPZ9ugVKDbmqwhJZaig5zKyLiuaicRcCGqLEgIDARo8CicAJQgCEiECIm8hwD9nA9n26BUoNuarCEllqKDnMrIuK5qJxFwIaosQ3d6esAYaCwoJBJ_f8zKRAnU6KkYwRAIgM0MvWNJL296kJ9gWvfatfmVvT-A7O2s8Mxp8l9c8EW0CIC-h-H-jBVSgFjg3Eny2u33qF7BDnWFzo7fGfZ7_qc9P`; + + console.log(chalk.cyanBright('\n\n Starting Codex node...')); + console.log(chalk.cyanBright('\n Please keep this terminal open. Start a new terminal to start interacting with the node')); + console.log(chalk.cyanBright('\n Press CTRL+C to stop the node')); + await runCommand(command); + // TODO : HANDLE THIS CHECKING PART + const peerIdResponse = await runCommand('curl http://localhost:8080/api/codex/v1/peerid -w \'\\n\''); + console.log(chalk.green('Codex node is successfully running. Peer ID:')); + console.log(chalk.cyanBright(peerIdResponse.trim())); + await showNavigationMenu(); + } catch (error) { + console.error(chalk.red('Failed to run Codex:', error.message)); + await showNavigationMenu(); + } +} +} + + + +async function checkNodeStatus() { + if (platform === 'win32') { + console.log(chalk.yellow('Coming soon for Windows!')); + return; + } + + try { + const spinner = createSpinner('Checking node status...').start(); + const response = await runCommand('curl http://localhost:8080/api/codex/v1/debug/info -w \'\\n\''); + spinner.success(); + + // Parse the JSON response + const data = JSON.parse(response); + + // Determine if node is online and discoverable based on the connected peers + const peerCount = data.table.nodes.length; + const isOnline = peerCount > 2; + + // Display node status based on connected peers + const statusMessage = isOnline + ? chalk.bgGreen(" Node status : ONLINE & DISCOVERABLE ") + : chalk.bgRed(" Node status : OFFLINE "); + const peerMessage = `Connected peers : ${peerCount}`; + + console.log('\n' + chalk.bold.cyanBright('📊 Node Status Summary')); + console.log('━'.repeat(50)); + + // Version Information + console.log(chalk.bold.cyanBright('🔹 Version Info')); + console.log(` Version: ${data.codex.version}`); + console.log(` Revision: ${data.codex.revision}\n`); + + // Local Node Information + console.log(chalk.bold.cyanBright('🔹 Local Node')); + console.log(` Node ID: ${data.table.localNode.nodeId}`); + console.log(` Peer ID: ${data.table.localNode.peerId}`); + console.log(` Listening Address: ${data.table.localNode.address}\n`); + + // Network Information + console.log(chalk.bold.cyanBright('🔹 Network Status')); + console.log(` Public IP: ${data.announceAddresses[0].split('/')[2]}`); + console.log(` Port: ${data.announceAddresses[0].split('/')[4]}\n`); + + // Connected Peers Details + if (peerCount > 0) { + console.log(chalk.bold.cyanBright('🔹 Connected Peers')); + data.table.nodes.forEach((node, index) => { + console.log(` ${index + 1}. Peer ${chalk.cyan(node.peerId)}`); + console.log(` Address: ${node.address}`); + console.log(` Status: ${node.seen ? chalk.green('Active') : chalk.gray('Inactive')}`); + if (index < peerCount - 1) console.log(''); // Add spacing between peers + }); + } else { + console.log(chalk.red('No connected peers.')); + } + + console.log('━'.repeat(50)); + await showNavigationMenu(); + } catch (error) { + console.error(chalk.red('Failed to check node status:', error.message)); + await showNavigationMenu(); + } +} + + +async function uploadFile() { + if (platform === 'win32') { + console.log(chalk.yellow('Coming soon for Windows!')); + return; + } + + console.log(chalk.bgYellow('\n ⚠️ Warning: Codex does not encrypt files. Anything uploaded will be available publicly on testnet. The testnet does not provide any guarentees - please do not use in production ⚠️ \n')); + + const { filePath } = await inquirer.prompt([ + { + type: 'input', + name: 'filePath', + message: 'Enter the file path to upload:', + validate: input => input.length > 0 + } + + ]); + + try { + const spinner = createSpinner('Uploading file').start(); + // TODO : Upload along with metadata like file name, extension etc., + const result = await runCommand(`curl -X POST http://localhost:8080/api/codex/v1/data -H 'Content-Type: application/octet-stream' -w '\\n' -T ${filePath}`); + spinner.success(); + console.log(chalk.green('Successfully uploaded!')); + console.log(chalk.bgGreen('\nCID:', result.trim())); + await showNavigationMenu(); + } catch (error) { + console.error(chalk.red('Failed to upload file:', error.message)); + await showNavigationMenu(); + } +} + +async function downloadFile() { + if (platform === 'win32') { + console.log(chalk.yellow('Coming soon for Windows!')); + return; + } + + const { cid } = await inquirer.prompt([ + { + type: 'input', + name: 'cid', + message: 'Enter the CID:', + validate: input => input.length > 0 + } + ]); + + try { + const spinner = createSpinner('Downloading file').start(); + await runCommand(`curl "http://localhost:8080/api/codex/v1/data/${cid}/network/stream" -o "${cid}.png"`); + spinner.success(); + console.log(chalk.green(`Successfully downloaded!`)); + console.log(chalk.bgGreen(`\nFile saved as ${cid}.png`)); + await showNavigationMenu(); + } catch (error) { + console.error(chalk.red('Failed to download file:', error.message)); + await showNavigationMenu(); + } +} + +async function showLocalFiles() { + if (platform === 'win32') { + console.log(chalk.yellow('Coming soon for Windows!')); + return; + } + + try { + const spinner = createSpinner('Fetching local files...').start(); + const filesResponse = await runCommand('curl http://localhost:8080/api/codex/v1/data -w \'\\n\''); + spinner.success(); + + // Parse the JSON response + const filesData = JSON.parse(filesResponse); + + if (filesData.content && filesData.content.length > 0) { + console.log(chalk.cyanBright('\nLocal Files:')); + console.log('━'.repeat(50)); + + // Iterate through each file and display information + filesData.content.forEach((file, index) => { + const { cid, manifest } = file; + const { rootHash, originalBytes, blockSize, protected: isProtected, filename, mimetype, uploadedAt } = manifest; + + // Convert the UNIX timestamp to a readable format + const uploadedDate = new Date(uploadedAt * 1000).toLocaleString(); + + console.log(`📁 File ${index + 1}:`); + console.log(` Filename : ${chalk.green(filename)}`); + console.log(` CID : ${chalk.cyan(cid)}`); + console.log(` Root Hash : ${chalk.cyan(rootHash)}`); + console.log(` Original Bytes : ${chalk.yellow(originalBytes)}`); + console.log(` Block Size : ${chalk.yellow(blockSize)}`); + console.log(` Protected : ${chalk.yellow(isProtected ? 'Yes' : 'No')}`); + console.log(` MIME Type : ${chalk.green(mimetype)}`); + console.log(` Uploaded At : ${chalk.magenta(uploadedDate)}`); + console.log('━'.repeat(50)); + }); + await showNavigationMenu(); + + } else { + console.log(chalk.red('No local files found.')); + await showNavigationMenu(); + } + } catch (error) { + console.error(chalk.red('Failed to show local files:', error.message)); + await showNavigationMenu(); + } +} + + +async function main() { + + while (true) { + console.log('\n' + chalk.cyanBright(ASCII_ART)); + + const { choice } = await inquirer.prompt([ + { + type: 'list', + name: 'choice', + message: 'Select an option:', + choices: [ + '1. Install Codex node', + '2. Run Codex node', + '3. Check node status', + '4. Upload a file', + '5. Download a file', + '6. Show local data', + '7. Exit' + ] + } + ]); + + if (choice.startsWith('7.')) { + console.log(chalk.cyanBright('\nGoodbye! 👋\n')); + break; + } + + switch (choice.split('.')[0]) { + case '1': + await checkCodexInstallation(); + break; + case '2': + await runCodex(); + return; + case '3': + await checkNodeStatus(); + break; + case '4': + await uploadFile(); + break; + case '5': + await downloadFile(); + break; + case '6': + await showLocalFiles(); + break; + } + + console.log('\n'); // Add some spacing between operations + } +} + +// Run the CLI +main().catch(console.error); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0462169 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,619 @@ +{ + "name": "codexstorage", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "codexstorage", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.7.7", + "chalk": "^5.3.0", + "inquirer": "^12.0.1", + "nanospinner": "^1.1.0" + }, + "bin": { + "codexstorage": "index.js" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.1.tgz", + "integrity": "sha512-ehJjmNPdguajc1hStvjN7DJNVjwG5LC1mgGMGFjCmdkn2fxB2GtULftMnlaqNmvMdPpqdaSoOFpl86VkLtG4pQ==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.1.tgz", + "integrity": "sha512-6ycMm7k7NUApiMGfVc32yIPp28iPKxhGRMqoNDiUjq2RyTAkbs5Fx0TdzBqhabcKvniDdAAvHCmsRjnNfTsogw==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/core": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.0.1.tgz", + "integrity": "sha512-KKTgjViBQUi3AAssqjUFMnMO3CM3qwCHvePV9EW+zTKGKafFGFF01sc1yOIYjLJ7QU52G/FbzKc+c01WLzXmVQ==", + "dependencies": { + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.0.1.tgz", + "integrity": "sha512-qAHHJ6hs343eNtCKgV2wV5CImFxYG8J1pl/YCeI5w9VoW7QpulRUU26+4NsMhjR6zDRjKBsH/rRjCIcaAOHsrg==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "external-editor": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.1.tgz", + "integrity": "sha512-9anjpdc802YInXekwePsa5LWySzVMHbhVS6v6n5IJxrl8w09mODOeP69wZ1d0WrOvot2buQSmYp4lW/pq8y+zQ==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", + "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.0.1.tgz", + "integrity": "sha512-m+SliZ2m43cDRIpAdQxfv5QOeAQCuhS8TGLvtzEP1An4IH1kBES4RLMRgE/fC+z29aN8qYG8Tq/eXQQKTYwqAg==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.1.tgz", + "integrity": "sha512-gF3erqfm0snpwBjbyKXUUe17QJ7ebm49btXApajrM0rgCCoYX0o9W5NCuYNae87iPxaIJVjtuoQ42DX32IdbMA==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.1.tgz", + "integrity": "sha512-D7zUuX4l4ZpL3D7/SWu9ibijP09jigwHi/gfUHLx5GMS5oXzuMfPV2xPMG1tskco4enTx70HA0VtMXecerpvbg==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.0.1.tgz", + "integrity": "sha512-cu2CpGC2hz7WTt2VBvdkzahDvYice6vYA/8Dm7Fy3tRNzKuQTF2EY3CV4H2GamveWE6tA2XzyXtbWX8+t4WMQg==", + "dependencies": { + "@inquirer/checkbox": "^4.0.1", + "@inquirer/confirm": "^5.0.1", + "@inquirer/editor": "^4.0.1", + "@inquirer/expand": "^4.0.1", + "@inquirer/input": "^4.0.1", + "@inquirer/number": "^3.0.1", + "@inquirer/password": "^4.0.1", + "@inquirer/rawlist": "^4.0.1", + "@inquirer/search": "^3.0.1", + "@inquirer/select": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.1.tgz", + "integrity": "sha512-0LuMOgaWs7W8JNcbiKkoFwyWFDEeCmLqDCygF0hidQUVa6J5grFVRZxrpompiWDFM49Km2rf7WoZwRo1uf1yWQ==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.1.tgz", + "integrity": "sha512-ehMqjiO0pAf+KtdONKeCLVy4i3fy3feyRRhDrvzWhiwB8JccgKn7eHFr39l+Nx/FaZAhr0YxIJvkK5NuNvG+Ww==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/select": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.1.tgz", + "integrity": "sha512-tVRatFRGU49bxFCKi/3P+C0E13KZduNFbWuHWRx0L2+jbiyKRpXgHp9qiRHWRk/KarhYBXzH/di6w3VQ5aJd5w==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/figures": "^1.0.7", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.0.tgz", + "integrity": "sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog==", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", + "peer": true, + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.0.1.tgz", + "integrity": "sha512-o11Jc2Go6wDZA17SWofiJ6L8k7mB8lsdKB/QY0bI+8e+ATiAvQzmROjqoTd1iAY8RI6N/EDcQcxbQa4JYviDWg==", + "dependencies": { + "@inquirer/core": "^10.0.1", + "@inquirer/prompts": "^7.0.1", + "@inquirer/type": "^3.0.0", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanospinner": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nanospinner/-/nanospinner-1.1.0.tgz", + "integrity": "sha512-yFvNYMig4AthKYfHFl1sLj7B2nkHL4lzdig4osvl9/LdGbXwrdFRoqBS98gsEsOakr0yH+r5NZ/1Y9gdVB8trA==", + "dependencies": { + "picocolors": "^1.0.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "peer": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a1f732a --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "codexstorage", + "version": "1.0.0", + "description": "", + "type": "module", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "bin": { + "codexstorage": "./index.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "axios": "^1.7.7", + "chalk": "^5.3.0", + "inquirer": "^12.0.1", + "nanospinner": "^1.1.0" + } +}