Skip to content

Commit

Permalink
Switch cmd parser to latest minimist
Browse files Browse the repository at this point in the history
  • Loading branch information
dougwilson authored and ErisDS committed Apr 3, 2020
1 parent 08e9a11 commit c2f1e62
Show file tree
Hide file tree
Showing 5 changed files with 365 additions and 401 deletions.
6 changes: 6 additions & 0 deletions bin/.eslintrc.js
@@ -0,0 +1,6 @@
module.exports = {
rules: {
'no-console': 0,
'no-var': 0
}
};
268 changes: 160 additions & 108 deletions bin/handlebars
@@ -1,124 +1,176 @@
#!/usr/bin/env node

const yargs = require('yargs')
.usage('Precompile handlebar templates.\nUsage: $0 [template|directory]...')
.option('f', {
type: 'string',
description: 'Output File',
alias: 'output'
})
.option('map', {
type: 'string',
description: 'Source Map File'
})
.option('a', {
type: 'boolean',
description: 'Exports amd style (require.js)',
alias: 'amd'
})
.option('c', {
type: 'string',
description: 'Exports CommonJS style, path to Handlebars module',
alias: 'commonjs',
default: null
})
.option('h', {
type: 'string',
description: 'Path to handlebar.js (only valid for amd-style)',
alias: 'handlebarPath',
default: ''
})
.option('k', {
type: 'string',
description: 'Known helpers',
alias: 'known'
})
.option('o', {
type: 'boolean',
description: 'Known helpers only',
alias: 'knownOnly'
})
.option('m', {
type: 'boolean',
description: 'Minimize output',
alias: 'min'
})
.option('n', {
type: 'string',
description: 'Template namespace',
alias: 'namespace',
default: 'Handlebars.templates'
})
.option('s', {
type: 'boolean',
description: 'Output template function only.',
alias: 'simple'
})
.option('N', {
type: 'string',
description:
'Name of passed string templates. Optional if running in a simple mode. Required when operating on multiple templates.',
alias: 'name'
})
.option('i', {
type: 'string',
description:
'Generates a template from the passed CLI argument.\n"-" is treated as a special value and causes stdin to be read for the template value.',
alias: 'string'
})
.option('r', {
type: 'string',
description:
'Template root. Base value that will be stripped from template names.',
alias: 'root'
})
.option('p', {
type: 'boolean',
description: 'Compiling a partial template',
alias: 'partial'
})
.option('d', {
type: 'boolean',
description: 'Include data when compiling',
alias: 'data'
})
.option('e', {
type: 'string',
description: 'Template extension.',
alias: 'extension',
default: 'handlebars'
})
.option('b', {
type: 'boolean',
description:
'Removes the BOM (Byte Order Mark) from the beginning of the templates.',
alias: 'bom'
})
.option('v', {
type: 'boolean',
description: 'Prints the current compiler version',
alias: 'version'
})
.option('help', {
type: 'boolean',
description: 'Outputs this message'
})
.wrap(120);

const argv = yargs.argv;
var argv = parseArgs({
'f': {
'type': 'string',
'description': 'Output File',
'alias': 'output'
},
'map': {
'type': 'string',
'description': 'Source Map File'
},
'a': {
'type': 'boolean',
'description': 'Exports amd style (require.js)',
'alias': 'amd'
},
'c': {
'type': 'string',
'description': 'Exports CommonJS style, path to Handlebars module',
'alias': 'commonjs',
'default': null
},
'h': {
'type': 'string',
'description': 'Path to handlebar.js (only valid for amd-style)',
'alias': 'handlebarPath',
'default': ''
},
'k': {
'type': 'string',
'description': 'Known helpers',
'alias': 'known'
},
'o': {
'type': 'boolean',
'description': 'Known helpers only',
'alias': 'knownOnly'
},
'm': {
'type': 'boolean',
'description': 'Minimize output',
'alias': 'min'
},
'n': {
'type': 'string',
'description': 'Template namespace',
'alias': 'namespace',
'default': 'Handlebars.templates'
},
's': {
'type': 'boolean',
'description': 'Output template function only.',
'alias': 'simple'
},
'N': {
'type': 'string',
'description': 'Name of passed string templates. Optional if running in a simple mode. Required when operating on multiple templates.',
'alias': 'name'
},
'i': {
'type': 'string',
'description': 'Generates a template from the passed CLI argument.\n"-" is treated as a special value and causes stdin to be read for the template value.',
'alias': 'string'
},
'r': {
'type': 'string',
'description': 'Template root. Base value that will be stripped from template names.',
'alias': 'root'
},
'p': {
'type': 'boolean',
'description': 'Compiling a partial template',
'alias': 'partial'
},
'd': {
'type': 'boolean',
'description': 'Include data when compiling',
'alias': 'data'
},
'e': {
'type': 'string',
'description': 'Template extension.',
'alias': 'extension',
'default': 'handlebars'
},
'b': {
'type': 'boolean',
'description': 'Removes the BOM (Byte Order Mark) from the beginning of the templates.',
'alias': 'bom'
},
'v': {
'type': 'boolean',
'description': 'Prints the current compiler version',
'alias': 'version'
},
'help': {
'type': 'boolean',
'description': 'Outputs this message'
}
});

argv.files = argv._;
delete argv._;

const Precompiler = require('../dist/cjs/precompiler');
var Precompiler = require('../dist/cjs/precompiler');
Precompiler.loadTemplates(argv, function(err, opts) {

if (err) {
throw err;
}

if (opts.help || (!opts.templates.length && !opts.version)) {
yargs.showHelp();
printUsage(argv._spec, 120);
} else {
Precompiler.cli(opts);
}
});

function pad(n) {
var str = '';
while (str.length < n) {
str += ' ';
}
return str;
}

function parseArgs(spec) {
var opts = { alias: {}, boolean: [], default: {}, string: [] };

Object.keys(spec).forEach(function (arg) {
var opt = spec[arg];
opts[opt.type].push(arg);
if ('alias' in opt) opts.alias[arg] = opt.alias;
if ('default' in opt) opts.default[arg] = opt.default;
});

var argv = require('minimist')(process.argv.slice(2), opts);
argv._spec = spec;
return argv;
}

function printUsage(spec, wrap) {
var wordwrap = require('wordwrap');

console.log('Precompile handlebar templates.');
console.log('Usage: handlebars [template|directory]...');

var opts = [];
var width = 0;
Object.keys(spec).forEach(function (arg) {
var opt = spec[arg];

var name = (arg.length === 1 ? '-' : '--') + arg;
if ('alias' in opt) name += ', --' + opt.alias;

var meta = '[' + opt.type + ']';
if ('default' in opt) meta += ' [default: ' + JSON.stringify(opt.default) + ']';

opts.push({ name: name, desc: opt.description, meta: meta });
if (name.length > width) width = name.length;
});

console.log('Options:');
opts.forEach(function (opt) {
var desc = wordwrap(width + 4, wrap + 1)(opt.desc);

console.log(' %s%s%s%s%s',
opt.name,
pad(width - opt.name.length + 2),
desc.slice(width + 4),
pad(wrap - opt.meta.length - desc.split(/\n/).pop().length),
opt.meta
);
});
}

0 comments on commit c2f1e62

Please sign in to comment.