diff --git a/README.md b/README.md index 53c3aaba..189fa227 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,7 @@ USAGE * [`swanky node install`](#swanky-node-install) * [`swanky node purge`](#swanky-node-purge) * [`swanky node start`](#swanky-node-start) +* [`swanky clear CONTRACTNAME`](#) * [`swanky plugins`](#swanky-plugins) * [`swanky plugins:install PLUGIN...`](#swanky-pluginsinstall-plugin) * [`swanky plugins:inspect PLUGIN...`](#swanky-pluginsinspect-plugin) @@ -576,6 +577,25 @@ DESCRIPTION Start a local node ``` +## `swanky clear` + +Clear the artifacts + +``` +USAGE + $ swanky clear [CONTRACTNAME] [-v] [-a] + +ARGUMENTS + CONTRACTNAME Name of the contract artifact to clear + +FLAGS + -a, --all Select all the project artifacts for delete + -v, --verbose Display more info in the result logs + +DESCRIPTION + Clear the artifacts +``` + ## `swanky plugins` List installed plugins. diff --git a/src/commands/clear/index.ts b/src/commands/clear/index.ts new file mode 100644 index 00000000..ec90d667 --- /dev/null +++ b/src/commands/clear/index.ts @@ -0,0 +1,71 @@ +import { SwankyCommand } from "../../lib/swankyCommand.js"; +import { ConfigError, FileError } from "../../lib/errors.js"; +import fs from "fs-extra"; +import path from "node:path"; +import { Args, Flags } from "@oclif/core"; + +interface Folder { + name: string, + contractName?: string, + path: string +} + +export default class Clear extends SwankyCommand { + + static flags = { + all: Flags.boolean({ + char: "a", + description: "Select all the project artifacts for delete", + }), + }; + + static args = { + contractName: Args.string({ + name: "contractName", + required: false, + description: "Name of the contract artifact to clear", + }), + }; + + async deleteFolder(path: string): Promise { + try { + await fs.remove(path); + this.log(`Successfully deleted ${path}`); + } catch (err: any) { + if (err.code === "ENOENT") { + this.log(`Folder ${path} does not exist, skipping.`); + } else { + throw new FileError(`Error deleting the folder ${path}.`, { cause: err }); + } + } + } + + public async run(): Promise { + + const { flags, args } = await this.parse(Clear); + + if (args.contractName === undefined && !flags.all) { + throw new ConfigError("Specify a contract name or use the --all flag to delete all artifacts."); + } + + const workDirectory = process.cwd(); + const foldersToDelete: Folder[] = flags.all ? + [ + { name: "Artifacts", path: path.join(workDirectory, "./artifacts") }, + { name: "Target", path: path.join(workDirectory, "./target") } + ] + : args.contractName ? + [ + { name: "Artifacts", contractName: args.contractName, path: path.join(workDirectory, "./artifacts/", args.contractName) }, + { name: "Target", path: path.join(workDirectory, "./target") }, + { name: "TestArtifacts", contractName: args.contractName, path: path.join(workDirectory, "./tests/", args.contractName, "/artifacts") } + ] + : []; + for (const folder of foldersToDelete) { + await this.spinner.runCommand(async () => this.deleteFolder(folder.path), + `Deleting the ${folder.name} folder ${folder.contractName ? `for ${folder.contractName} contract` : ""}`, + `Successfully deleted the ${folder.name} folder ${folder.contractName ? `for ${folder.contractName} contract` : ""}\n at ${folder.path}` + ); + } + } +} \ No newline at end of file