Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch cmd parser to latest minimist #1672

Merged
merged 2 commits into from Apr 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.markdown
Expand Up @@ -79,7 +79,7 @@ Supported Environments

Handlebars has been designed to work in any ECMAScript 3 environment. This includes

- Node.js v6+
- Node.js
- Chrome
- Firefox
- Safari 5+
Expand Down
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
);
});
}
2 changes: 1 addition & 1 deletion integration-testing/multi-nodejs-test/test.sh
Expand Up @@ -17,7 +17,7 @@ cd "$( dirname "$( readlink -f "$0" )" )" || exit 1
unset npm_config_prefix

echo "Handlebars should be able to run in various versions of NodeJS"
for i in 6 7 8 9 10 11 12 13; do
for i in 0.10 0.12 4 5 6 7 8 9 10 11 ; do
rm target node_modules package-lock.json -rf
mkdir target
nvm install "$i"
Expand Down