Skip to content
This repository has been archived by the owner on Jun 22, 2024. It is now read-only.

add commander example, copy and remove file #27

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions cli/commander/copyAndDelete/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# copyAndDelete

This is a CLI built with [commander](https://www.npmjs.com/package/commander). You can copy files to a specific directory path and delete the specified path and its sub-files/folders.

## Usage

Here is the output of running `node bin/cli.js -h` from the `copyAndDelete` directory:

```bash
Usage: cli.js [file] [path]

Options:
--help, -h Show help [boolean]
--version, v Show version number [boolean]
```

### As a Local Project

You'll want to start by installing dependencies:

```bash
npm install
```

Since this is a CLI, you'll probably want to get it available on your PATH. There's two ways you can do this:

**Via global installation:**

```bash
npm i -g . # this will install the current working directory as a global module. you will want to do npm uninstall -g . to uninstall it.
copyAndDelete copy [file] [path] # run the CLI
copyAndDelete rimraf [path] # run the CLI
```

**Via symlink:**

```bash
npm link # this will create a symlink that makes the module act as a global module. npm unlink to remove this.
copyAndDelete copy [file] [path] # run the CLI
copyAndDelete rimraf [file] # run the CLI
```
30 changes: 30 additions & 0 deletions cli/commander/copyAndDelete/bin/cli.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env node
const { program } = require('commander')

const copyFile = require('../lib/copyFile')
const rimraf = require('../lib/rimraf')

program.version('0.0.1', '-v, --version').usage('[options]')

program
.command('copy <name> <directory>')
.usage('<name> <directory>')
.description('Copy file.')
.action((name, direcotry) => {
copyFile(name, direcotry)
})

program
.command('rimraf <path>')
.usage('<path>')
.description('Deletes the specified path and its sub-files/folders.')
.action((path) => {
rimraf(path)
})

program.command('*', { noHelp: true }).action(() => {
console.log('Command not found')
program.help()
})

program.parse(process.argv)
28 changes: 28 additions & 0 deletions cli/commander/copyAndDelete/lib/copyFile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const path = require('path')
const fs = require('fs')
const { exist } = require('./util')

const mkdirp = (dir) => {
const dirname = path
.relative('.', path.normalize(dir))
.split(path.sep)
.filter((p) => !!p)
dirname.forEach((d, idx) => {
const pathBuilder = dirname.slice(0, idx + 1).join(path.sep)
if (!exist(pathBuilder)) {
fs.mkdirSync(pathBuilder) // make directory
}
})
}

const copyFile = (name, directory) => {
if (exist(name)) {
mkdirp(directory)
fs.copyFileSync(name, path.join(directory, name))
console.log(`${name} file is copied.`)
} else {
console.error('File does not exist.')
}
}

module.exports = copyFile
24 changes: 24 additions & 0 deletions cli/commander/copyAndDelete/lib/rimraf.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const fs = require('fs')
const path = require('path')
const { exist } = require('./util')

const rimraf = (p) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Variable names such as path, directory would be more readable than p, d

if (exist(p)) {
try {
const dir = fs.readdirSync(p)
console.log(dir)
dir.forEach((d) => {
rimraf(path.join(p, d))
})
fs.rmdirSync(p)
console.log(`Remove ${p} folder success`)
} catch (e) {
fs.unlinkSync(p)
console.log(`Remove ${p} file success`)
}
} else {
console.error('No such file or directory')
}
}

module.exports = rimraf
17 changes: 17 additions & 0 deletions cli/commander/copyAndDelete/lib/util.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const fs = require('fs')

const exist = (dir) => {
try {
fs.accessSync(
dir,
fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK
) // tests a user's permissions for the file or directory specified by path
return true // if dir exists, return true.
} catch (e) {
return false // if dir not exists, return false.
}
}

module.exports = {
exist
}
21 changes: 21 additions & 0 deletions cli/commander/copyAndDelete/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"name": "copy-and-delete",
"version": "1.0.0",
"description": "You can copy files to a specific directory path or delete specific files and directory.",
"main": "index.js",
"scripts": {
"lint": "standard",
"test": "echo \"Error: no test specified\" && exit 1"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add some unit tests

},
"author": "",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Include Author Name

"license": "ISC",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use "MIT" License please

"dependencies": {
"commander": "^6.1.0"
},
"bin": {
"copyAndDelete": "./bin/cli.js"
},
"devDependencies": {
"standard": "^14.3.4"
}
}