JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 2
  • Score
    100M100P100Q26974F
  • License Apache-2.0

A simple yet practical command-Line application framework, written in TypeScript.

Package Exports

  • commanding

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (commanding) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Commanding

A simple yet practical command-Line application framework, written in TypeScript, with only 2 dependencies (chalk and lodash).

Why another CLI framework

Commanding has these features:

  • Written in TypeScript (easier to development & mantain, nicer to TypeScript developers)
  • Less mutable state (long chaining API calls is an old design pattern)
  • Decoupled (you can customize it, e.g.: write your own Sanitizer or change output themes)
  • Promise Based

Installation

$ npm i commanding

Quick Start

If your application only have one command:

import { solo, command, sanitize } from 'commanding';

solo(
    command('default')
        .argument('folder', {
            description: 'Output folder',
            required: true,
        })
        .argument('remark', {
        description: 'Something not important',
        })
        .option('-s, --source', {
            name: 'file',
            required: true,
            csv: true,
            description: 'The source files needs to be converted, you can assign multiple sources by `--source=[source1],[source2]`',
        })
        .option('-e', {
            description: 'Enable encryption',
            required: true,
        })
        .option('-c, --compression', {
            name: 'level',
            default: 5,
            description: 'Compression level, default: 5',
        })
        .option('--filter', {
            name: 'preset',
            repeatable: true,
            description: 'You can apply multiple filter on your video by just using `--filter=[preset]` multiple times',
        })
        .handle(async (args, options) => {
            console.log(args['folder']);
            console.log(options['-s']);
            console.log(options['--source']);

            return;
        }),
    // You can provide some infomations about your application
    {
        name: "Cool Application",
        version: '0.0.1',
        description: 'Check this out mate.',
    }
)
    .parse(process.argv)
    .then(() => {
        console.log('Promise based!');
    });

Then you can test your application:

$ node app.js -h

Screenshot

If your application has many commands (you can still have a default command):

import { gether, command, sanitize } from 'commanding';

gether(
    // Choosable commands:
    [
        command('download')
            .description('Download the content of the URL')
            .argument('URL', {
                description: 'The URL you want to download from',
                required: true,
            })
            .handle(async (args, options) => {
                // Command logic
            }),
        command('upload')
            .description('Upload content to the URL')
            .argument('URL', {
                description: 'The URL you want to upload to',
                required: true,
            })
            .handle(async (args, options) => {
                // Command logic
            }),
    ],
    // Default command:
    command('default')
        .handle((async args, options) => {
            // Command logic
        }),
    {
        name: "Cool Application",
        version: '0.0.1',
        description: 'Check this out mate.',
    }
)
    .parse(process.argv);

Roadmap

    • Better handling for long text
    • Bump test coverage to 90%
    • Support auto-complete (If it's necessary after assessment)

Credits

Heavily inspired by Caporal.

Build script from RxJS.

License

Apache 2.0