mirror of
https://github.com/Modernizr/Modernizr.git
synced 2026-01-09 07:38:03 -05:00
194 lines
4.8 KiB
JavaScript
Executable File
194 lines
4.8 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
'use strict';
|
|
|
|
var fs = require('fs');
|
|
var _ = require('lodash');
|
|
var path = require('path');
|
|
var mkdirp = require('mkdirp');
|
|
var Modernizr = require(path.resolve(__dirname + '/../lib/cli.js'));
|
|
var yargs = require('yargs')
|
|
.options('h', {
|
|
alias: 'help',
|
|
describe: 'Print Help'
|
|
})
|
|
.options('V', {
|
|
alias: ['v', 'version'],
|
|
describe: 'Print the version and exit'
|
|
})
|
|
.options('f', {
|
|
alias: 'features',
|
|
describe: 'comma separated list of feature detects'
|
|
})
|
|
.options('o', {
|
|
alias: 'options',
|
|
describe: 'comma separated list of extensibility options'
|
|
})
|
|
.options('c', {
|
|
alias: 'config',
|
|
describe: 'Path to a JSON file containing Modernizr configuration. See lib/config-all.json for an example'
|
|
})
|
|
.options('d', {
|
|
alias: 'dest',
|
|
describe: 'Path to write the Modernizr build file to. Defaults to ./modernizr.js'
|
|
})
|
|
.options('m', {
|
|
alias: 'metadata',
|
|
describe: 'Path to where the Modernizr feature-detect metadata should be saved. Defaults to ./metadata.json'
|
|
})
|
|
.options('u', {
|
|
alias: 'uglify',
|
|
describe: 'uglify/minify the output'
|
|
})
|
|
.options('s', {
|
|
alias: 'scriptGlobalName',
|
|
describe: 'Script global variable where Modernizr is attached. Defaults to window'
|
|
})
|
|
.options('q', {
|
|
alias: 'quiet',
|
|
describe: 'Silence all output'
|
|
});
|
|
var argv = yargs.argv;
|
|
var cwd = process.cwd();
|
|
var dest = cwd + '/modernizr.js';
|
|
var configPath;
|
|
var config;
|
|
|
|
function log() {
|
|
if (!argv.q) {
|
|
console.log.apply(console, arguments);
|
|
}
|
|
}
|
|
function stringify(obj, minified) {
|
|
var replacer = function(key, value) {
|
|
return value;
|
|
};
|
|
var args = minified ? [replacer,2] : [];
|
|
args.unshift(obj);
|
|
return JSON.stringify.apply(JSON, args);
|
|
}
|
|
|
|
if (argv.h) {
|
|
yargs.showHelp();
|
|
process.exit();
|
|
}
|
|
|
|
if (argv.V) {
|
|
var pkg = require('../package.json');
|
|
console.log('Modernizr v' + pkg.version);
|
|
process.exit();
|
|
}
|
|
|
|
if (argv.d) {
|
|
dest = path.normalize(argv.d);
|
|
var exists = fs.existsSync(dest);
|
|
var isDir = exists && fs.statSync(dest).isDirectory();
|
|
var fileRequested = _.endsWith(dest, '.js');
|
|
|
|
if ((exists && isDir) || (!exists && !fileRequested)) {
|
|
dest = path.join(dest, 'modernizr.js');
|
|
}
|
|
|
|
mkdirp.sync(path.dirname(dest));
|
|
}
|
|
|
|
if (argv.m) {
|
|
// path.normalize is used instead of normalize in order to support ~
|
|
// we get an absolute path on the fallback from cwd, and any user supplied
|
|
// argument will be relative to their current directory.
|
|
var metaDest = path.normalize(argv.m === true ? cwd + '/metadata.json' : argv.m);
|
|
Modernizr.metadata(function(metadata) {
|
|
mkdirp.sync(path.dirname(metaDest));
|
|
fs.writeFileSync(metaDest, stringify(metadata, !argv.u));
|
|
log('metadata saved to ' + metaDest);
|
|
});
|
|
if (!argv.d) {
|
|
// return early unless we explicitly request Modernizr to be built
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (argv.o || argv.f) {
|
|
var metadata = Modernizr.metadata();
|
|
var options = Modernizr.options();
|
|
|
|
var find = function(config, source) {
|
|
if (!config) {
|
|
return;
|
|
}
|
|
|
|
return config
|
|
.replace(/-/g, ',')
|
|
.split(',')
|
|
.map(function(prop) {
|
|
var obj = _.find(source, function(o) {
|
|
if (o.property instanceof Array) {
|
|
return o.property.includes(prop);
|
|
} else {
|
|
return o.property === prop;
|
|
}
|
|
});
|
|
|
|
// setClasses is technically a flag, not an option. But it is passed
|
|
// in as an option. Since it doesn't exist as an option we have to
|
|
// special case around it :[
|
|
if (prop === 'setClasses') {
|
|
return 'setClasses';
|
|
} else if (_.isUndefined(obj)) {
|
|
throw new Error('invalid key value name - ' + prop);
|
|
} else {
|
|
return obj.amdPath || obj.property;
|
|
}
|
|
});
|
|
};
|
|
|
|
config = {
|
|
'feature-detects': find(argv.f, metadata),
|
|
'options': find(argv.o, options)
|
|
};
|
|
}
|
|
|
|
if (argv.c) {
|
|
try {
|
|
configPath = fs.realpathSync(argv.c);
|
|
} catch (e) {
|
|
console.error(argv.c + ' does not exist.');
|
|
process.exit(1);
|
|
}
|
|
if (!configPath) {
|
|
configPath = path.resolve(__dirname, '../lib/config-all.json');
|
|
}
|
|
}
|
|
|
|
try {
|
|
if (!config && !configPath) {
|
|
console.error('config file, inline features, or options required.');
|
|
yargs.showHelp();
|
|
process.exit(1);
|
|
} else {
|
|
config = config || {};
|
|
if (configPath) {
|
|
config = _.extend(config, require(configPath));
|
|
}
|
|
if (config && config.dest) {
|
|
dest = path.join(cwd, config.dest, 'modernizr.js');
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.error(configPath + ' is not valid JSON.');
|
|
console.error(e);
|
|
process.exit(1);
|
|
}
|
|
|
|
if (argv.u) {
|
|
config.minify = true;
|
|
}
|
|
|
|
if (argv.scriptGlobalName) {
|
|
config.scriptGlobalName = argv.scriptGlobalName;
|
|
}
|
|
|
|
Modernizr.build(config, function(output) {
|
|
fs.writeFileSync(dest, output);
|
|
log('Modernizr build saved to ' + dest);
|
|
});
|