webgme/webgme-cli

View on GitHub
bin/webgme-new-plugin

Summary

Maintainability
Test Coverage
#!/usr/bin/env node

'use strict';
var Command = require('commander').Command,
    program = new Command(),
    nop = require('nop'),
    utils = require('../src/utils'),
    PluginManager = require('../src/PluginManager');

const options = PluginManager.prototype._getOptions()
    .filter(opt => opt.name !== '--plugin-id');

program.arguments('<pluginID>')
    .action(function(pluginID) {
        if (typeof program.templateType !== 'string') {  // invalid
            program.templateType = null;
        }
        program.pluginID = pluginID;
        validateOptions(program, options);
        const manager = new PluginManager();
        manager.new(program, nop);
    });

for (let i = options.length; i--;) {
    const args = [options[i].name, options[i].desc];
    if (options[i].type !== 'boolean') {
        args[0] += ' <value>';
    }

    if (options[i].items) {
        const regex = new RegExp('^(' + options[i].items.join('|') + ')$');
        args.push(regex);
    }
    program.option(...args);
}

program.parse(process.argv);

function validateOptions(program, options) {
    const failedRegexOptions = options
        .filter(option => {
            const isEnum = option.items;
            if (isEnum) {
                const name = parseOptionName(option.name);
                return program[name] === true;
            }
        });

    if (failedRegexOptions.length) {
        const [firstFailure] = failedRegexOptions;
        const displayOpts = firstFailure.items.join(', ');
        console.log(`Invalid value for ${firstFailure.name}. Expected one of ${displayOpts}`)
        process.exit(1);
    }
}

function parseOptionName(cliOpt) {
    return cliOpt.replace(/^--/, '').replace(/\s+.*/, '');
}