google-closure-compiler
Version:
Check, compile, optimize and compress Javascript with Closure-Compiler
85 lines (76 loc) • 2.81 kB
JavaScript
/*
* Copyright 2018 The Closure Compiler Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Compiler from './lib/node/index.js';
import {getNativeImagePath, getFirstSupportedPlatform} from './lib/utils.js';
import parseArgs from 'minimist';
const compilerFlags = parseArgs(process.argv.slice(2));
// The platform flag is only used by this cli script - it is not natively supported by any compiler version.
// If it exists, use the value, but then delete it so that it's not actually passed to the compiler.
let platform;
if (compilerFlags.hasOwnProperty('platform')) {
platform = getFirstSupportedPlatform(compilerFlags.platform.split(','));
delete compilerFlags.platform;
} else {
platform = getFirstSupportedPlatform(['native', 'java']);
}
// The compiler treats default arguments as if they were --js args.
// Minimist parses default arguments and puts them under the '_' key.
// Move the '_' key to the 'js' key.
if (compilerFlags.hasOwnProperty('_') && compilerFlags['_'].length > 0) {
let existingJsFlags = [];
if (compilerFlags.js) {
if (Array.isArray(compilerFlags.js)) {
existingJsFlags = compilerFlags.js;
} else {
existingJsFlags = [compilerFlags.js];
}
}
compilerFlags.js = existingJsFlags.concat(compilerFlags['_']);
delete compilerFlags['_'];
} else {
delete compilerFlags['_'];
}
// Boolean arguments can in some cases be parsed as strings.
// Since its highly unlikely that an argument actually needs to be the strings 'true' or 'false',
// convert them to true booleans.
Object.keys(compilerFlags).forEach((flag) => {
if (compilerFlags[flag] === 'true') {
compilerFlags[flag] = true;
} else if (compilerFlags[flag] === 'false') {
compilerFlags[flag] = false;
}
});
let args = process.argv.slice(2);
for (let i = 0; i < args.length; i++) {
if (/^--platform/.test(args[i])) {
let delCount = 1;
if (args[i].indexOf('=') < 0 && args.length > i + 1) {
delCount++;
}
args.splice(i, delCount);
break;
}
}
const compiler = new Compiler(args);
compiler.spawnOptions = {stdio: 'inherit'};
if (platform === 'native') {
compiler.JAR_PATH = null;
compiler.javaPath = getNativeImagePath();
}
compiler.run((exitCode) => {
process.exitCode = exitCode;
});