DEV Community

abdfn
abdfn

Posted on • Edited on

Build trash program by JS and make it npm pkg & publish it

Hi, in this post, we'll create trash program by JS,
after create it, this program will be npm package.

Pre-requisites

before we move on, you'll need :

Let's go

We're going to create package.json

The first command is npm init

$ npm init
Enter fullscreen mode Exit fullscreen mode

I'll name it manx

so you should have like this ...

{
  "name": "@your_npm_user_name/your_proj_name",
  "version": "1.0.0",
  "description": "Cli app can move files/folders to the trash without any dangerous",
  "main": "cli.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://Git_Repos_Site/Your_Git_Repo"
  },
  "keywords": [
    "cli-app",
    "cli",
    "trash"
  ],
  "author": "Your_Name",
  "license": "ISC"
}

Enter fullscreen mode Exit fullscreen mode

We don't want to have package-lock.json, so type

$ touch .npmrc
Enter fullscreen mode Exit fullscreen mode

in .npmrc

package-lock=false
Enter fullscreen mode Exit fullscreen mode

now we'll install @abdfnx/hac_k & trash

$ npm i @abdfnx/hac_k trash
Enter fullscreen mode Exit fullscreen mode

ok, let's create cli.js

in cli.js

#!/usr/bin/env node
"use strict";
Enter fullscreen mode Exit fullscreen mode

now we're going to require the packages

#!/usr/bin/env node
"use strict";

const hac_k = require("@abdfnx/hac_k");
const manx = require("trash");
Enter fullscreen mode Exit fullscreen mode

nice, also create two variables

// Ignore all flags of `rm` program.
const ignoredFlags = ["r", "f", "i", "d", "P", "R", "v", "W"];

const ignoredFlagsConfig = {};
Enter fullscreen mode Exit fullscreen mode

this variables're very important, so we'll make for loop

for (const flag of ignoredFlags) {
    ignoredFlagsConfig[flag] = {
        type: "boolean",
    };
}
Enter fullscreen mode Exit fullscreen mode

the most importnant variable is cli

const cli = hac_k(
    `
    Usage
      $ manx <file/folder> […]

    Examples
      # file
      $ manx xcode.tsx layout.tsx edge.tsx
      $ manx '*.tsx' '!xcode.tsx'
      # folder
      $ manx app
    `,
    {
        flags: {
            ...ignoredFlagsConfig,
        },
    }
);
Enter fullscreen mode Exit fullscreen mode

But what if the user entered a space, we need if statement

if (cli.input.length === 0) {
    console.error("Specify at least one path");
    process.exit(1);
}
Enter fullscreen mode Exit fullscreen mode

at the end add

manx(cli.input);
Enter fullscreen mode Exit fullscreen mode

the final result of file

#!/usr/bin/env node
"use strict";
const hac_k = require("@abdfnx/hac_k");
const manx = require("trash");

// Ignore all flags of `rm` program.
const ignoredFlags = ["r", "f", "i", "d", "P", "R", "v", "W"];

const ignoredFlagsConfig = {};

for (const flag of ignoredFlags) {
    ignoredFlagsConfig[flag] = {
        type: "boolean",
    };
}

const cli = hac_k(
    `
    Usage
      $ manx <file/folder> […]

    Examples
      # file
      $ manx xcode.tsx layout.tsx edge.tsx
      $ manx '*.tsx' '!xcode.tsx'
      # folder
      $ manx app
    `,
    {
        flags: {
            ...ignoredFlagsConfig,
        },
    }
);

if (cli.input.length === 0) {
    console.error("Specify at least one path");
    process.exit(1);
}

manx(cli.input);
Enter fullscreen mode Exit fullscreen mode

you're good, now let's test it, go to package.json and add bin, engines, files props

{
  "name": "@your_npm_user_name/your_proj_name",
  "version": "1.0.0",
  "description": "Cli app can move files/folders to the trash without any dangerous",
  "main": "cli.js",
  "bin": {
        "manx": "cli.js"
  },
  "engines": {
        "node": ">=10"
  },
  "files": [
        "cli.js"
  ],
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "https://Git_Repos_Site/Your_Git_Repo"
  },
  "keywords": [
    "cli-app",
    "cli",
    "trash"
  ],
  "author": "Your_Name",
  "license": "ISC",
  "dependencies": {
    "@abdfnx/hac_k": "^1.0.2",
    "trash": "^7.0.0"
  }
}
Enter fullscreen mode Exit fullscreen mode

type npm link

$ npm link
Enter fullscreen mode Exit fullscreen mode

add file and folder for test

$ touch test_file && mkdir test_folder
Enter fullscreen mode Exit fullscreen mode

Now the awaited moment, in the terminal

$ manx --help
    Usage
      $ manx <file/folder> […]

    Examples
      # file
      $ manx xcode.tsx layout.tsx edge.tsx
      $ manx '*.tsx' '!xcode.tsx'
      # folder
      $ manx app
$ manx test_file test_folder
Enter fullscreen mode Exit fullscreen mode

Congratulations, you now have a great program...

npm publish (optional)

if you want to publish your awesome project to npm, follow me

before publish, add some files

.editorconfig, .gitattributes, .gitignore and .travis.yml

it's optional, but it's better to create it

in .editorconfig

root = true

[*]
indent_style = tab
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.yml]
indent_style = space
indent_size = 2
Enter fullscreen mode Exit fullscreen mode

.gitattributes

* text=auto eol=lf
Enter fullscreen mode Exit fullscreen mode

.gitignore

node_modules
yarn.lock
Enter fullscreen mode Exit fullscreen mode

.travis.yml

language: node_js
node_js:
  - '14'
  - '12'
  - '10'
Enter fullscreen mode Exit fullscreen mode

ok, type

$ npm unlink
Enter fullscreen mode Exit fullscreen mode

and now we must login to npm

$ npm login
Enter fullscreen mode Exit fullscreen mode

publish

$ npm publish --access=public
Enter fullscreen mode Exit fullscreen mode

and if you want to install it, you should install it globally

$ npm i -g YOUR_PKG
Enter fullscreen mode Exit fullscreen mode

you can see your package in npm

visit https://www.npmjs.com/package/YOUR_PKG

Here you are, you have trash program and npm package...

enjoy, and see you next time.

Top comments (0)