liusuyi
2023-04-24 4737f1e038743ced243c9e52423404d9034d6107
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
const lodash_1 = require("lodash");
const microargs_1 = __importDefault(require("microargs"));
const path_1 = __importDefault(require("path"));
class CLIError extends Error {
}
function optionToString(optionName) {
    return optionName.length === 1 ? `-${optionName}` : `--${optionName}`;
}
function optionsToString(optionsKeys) {
    return optionsKeys.map(optionToString).join(" ");
}
function printHelp(scriptName, annotations, logger) {
    if (lodash_1.isEmpty(annotations)) {
        logger.log("Documentation not found");
        return null;
    }
    const { description, params, options } = annotations;
    const extra = lodash_1.omit(annotations, ["description", "params", "options"]);
    const usageOptions = lodash_1.isEmpty(options) ? "" : "[options]";
    const usageParams = !Array.isArray(params) || lodash_1.isEmpty(params) ? "" : `[${params.join(" ")}]`;
    logger.log(`Usage: ${path_1.default.basename(scriptName)} ${usageOptions} ${usageParams}\n`);
    if (description) {
        logger.log(`${description}\n`);
    }
    if (!lodash_1.isEmpty(options)) {
        logger.log("Options:\n");
        lodash_1.forEach(options, (value, key) => {
            logger.log(`  ${lodash_1.padEnd(optionToString(key), 12)}${value}`);
        });
    }
    lodash_1.forEach(extra, (value, key) => {
        logger.log(`\n${lodash_1.capitalize(key)}:\n`);
        logger.log(`${value}\n`);
    });
}
const Cli = (argv, annotations = {}, help = printHelp, logger = console) => {
    return (callback) => {
        const { params, options } = microargs_1.default(argv.slice(2));
        const scriptName = path_1.default.basename(argv[1]);
        if (lodash_1.isString(annotations)) {
            annotations = {
                description: annotations
            };
        }
        if (options.help) {
            return help(scriptName, annotations, logger);
        }
        const annotatedOptionsKeys = (annotations &&
            annotations.options &&
            Object.keys(annotations.options)) ||
            [];
        const optionsKeys = Object.keys(options);
        const illegalOptionsKeys = lodash_1.difference(optionsKeys, annotatedOptionsKeys);
        if (annotatedOptionsKeys.length && illegalOptionsKeys.length) {
            const msg = `Illegal option: ${optionsToString(illegalOptionsKeys)}\n` +
                `Available options: ${optionsToString(annotatedOptionsKeys)}\n` +
                `Type "${scriptName} --help" for more information`;
            throw new CLIError(msg);
        }
        return callback(options, ...params);
    };
};
Cli.CliError = CLIError;
module.exports = Cli;
//# sourceMappingURL=index.js.map