GitHub - oclif/core: Node.js Open CLI Framework. Built by Salesforce. (original) (raw)

Version Downloads/week License

πŸ—’ Description

This is a framework for building CLIs in Node.js. This framework was built out of the Salesforce CLI but generalized to build any custom CLI. It's designed both for single-file CLIs with a few flag options (like cat or ls), or for very complex CLIs that have subcommands (like git or heroku).

See the docs for more information.

πŸš€ Getting Started Tutorial

The Getting Started tutorial is a step-by-step guide to introduce you to oclif. If you have not developed anything in a command line before, this tutorial is a great place to get started.

✨ Features

$ heroku info --app=<tab><tab> # will complete with all the Heroku apps a user has in their account

πŸ“Œ Requirements

Currently, Node 18+ is supported. We support the LTS versions of Node. You can add the node package to your CLI to ensure users are running a specific version of Node.

πŸ“Œ Migrating

See the v3 migration guide for an overview of breaking changes that occurred between v2 and v3.

See the v2 migration guide for an overview of breaking changes that occurred between v1 and v2.

Migrating from @oclif/config and @oclif/command? See the v1 migration guide.

πŸ“Œ Documentation

The official oclif website, oclif.io, contains all the documentation you need for developing a CLI with oclif.

If there's anything you'd like to see in the documentation, please submit an issue on the oclif.github.io repo.

πŸš€ Standalone Usage

We strongly encourage you generate an oclif CLI using the oclif cli. The generator will generate an npm package with @oclif/core as a dependency.

You can, however, use @oclif/core in a standalone script like this:

#!/usr/bin/env -S node --loader ts-node/esm --no-warnings=ExperimentalWarning

import * as fs from 'fs' import {Command, Flags, flush, handle} from '@oclif/core'

class LS extends Command { static description = 'List the files in a directory.' static flags = { version: Flags.version(), help: Flags.help(), dir: Flags.string({ char: 'd', default: process.cwd(), }), }

async run() { const {flags} = await this.parse(LS) const files = fs.readdirSync(flags.dir) for (const f of files) { this.log(f) } } }

LS.run(process.argv.slice(2), { root: import.meta.dirname, // Tell oclif what the contents of the package.json are. // You could also set these in your package.json but specifying // them here is useful if you're attempting to bundle your CLI // without a package.json pjson: { name: 'ls', version: '0.0.1', oclif: { // Tell oclif that this is a single command CLI // See: https://oclif.io/docs/command_discovery_strategies commands: { strategy: 'single', target: 'index.js', }, }, }, }).then( async () => { await flush() }, async (err) => { await handle(err) }, )

Then run it like this:

$ ts-node myscript.ts ...files in current dir...

You can also use oclif's Parser separately:

// index.js import {Args, Flags, Parser} from '@oclif/core'

const {args, flags} = await Parser.parse(process.argv.slice(2), { args: { name: Args.string({required: true}), }, flags: { from: Flags.string({char: 'f', default: 'oclif'}), }, })

console.log(hello <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mrow><mi>a</mi><mi>r</mi><mi>g</mi><mi>s</mi><mi mathvariant="normal">.</mi><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi></mrow><mi>f</mi><mi>r</mi><mi>o</mi><mi>m</mi></mrow><annotation encoding="application/x-tex">{args.name} from </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">r</span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">s</span><span class="mord">.</span><span class="mord mathnormal">nam</span><span class="mord mathnormal">e</span></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mord mathnormal">ro</span><span class="mord mathnormal">m</span></span></span></span>{flags.from})

$ node index.js world --from oclif

hello world from oclif

NOTE If you're using the Parser class, you will not be able to use the builtin help and version flags since those require the context of an oclif project.

πŸš€ Contributing

See the contributing guide.