// you may not need all of these but they come up a lot import fs from "fs"; import assert from "assert"; import logging from '../lib/logging.js'; import glob from "fast-glob"; import path from "path"; import template from "lodash/template.js"; const log = logging.create(import.meta.url); export const description = "Describe your command here." // your command uses the npm package commander's options format export const options = [ ["--input ", "A string option with a default.", "default.json"], ["--min ", "A number option, no default."], ] // example of a positional argument, it's the 1st argument to main export const argument = ["source", "source directory"]; // put required options in the required variable export const required = [ ["--output ", "Save to file rather than stdout."], ] // handy function for checking things are good and aborting const check = (test, fail_message) => { if(!test) { log.error(fail_message); process.exit(1); } } export const main = async (arg, opts) => { // if they give an numeric option this is how you can convert it // yes, this is annoying and commander should handle it but oh well if(opts.min !== undefined) { // commander doesn't do integer conversions sadly opts.min = parseInt(opts.min, 10); check(!isNaN(opts.min), "--min must be a number"); } // it's easier to debug options with console console.log("OPTIONS", opts, "ARG", arg); // due to how async/await works it's just easier to manually exit with exit codes process.exit(0); }