opensphere-build-resolver
Version:
Resolves projects, their dependencies, plugins, and config to the correct arguments for compilation via the Google Closure Compiler, sass/node-sass, and other tools.
150 lines (130 loc) • 4.15 kB
JavaScript
;
const Promise = require('bluebird');
const src = require('./src');
const options = require('./options');
const externs = require('./externs');
const defines = require('./defines');
const builder = require('./builder-writer');
const java = require('./java-writer');
const json = require('./json-writer');
const tests = require('./test-writer');
const webpack = require('./webpack-writer');
const path = require('path');
const utils = require('../../utils.js');
var basePackage = null;
/**
* Resolve GCC configuration for a package.
* @param {Object} pack The package
* @param {string} projectDir The package directory
* @param {number} depth The resolved depth
* @param {Array<string>} depStack the ancestry stack
* @return {Promise} A promise that resolves when resolution is complete
*/
const resolver = function(pack, projectDir, depth, depStack) {
if (utils.isConfigPackage(pack)) {
return Promise.resolve();
}
// This block covers a couple of weird cases:
//
// Case 1:
//
// appA
// \
// appB
//
// appB is treating appA as a library
//
// Case 2:
//
// appA appA-plugin-x
// \ /
// \ /
// appB
//
// appB is treating appA and appA-plugin-x as libraries
if (!basePackage) {
basePackage = pack;
} else if ((utils.isPluginPackage(pack) &&
!utils.isPluginOfPackage(basePackage, pack, depStack)) ||
utils.isAppPackage(pack) && depth > 0) {
if (pack.build.gcc) {
// so remove entry_point and define config
delete pack.build.gcc.entry_point;
delete pack.build.gcc.define;
}
}
return Promise.all([
src.resolver(pack, projectDir, depth, depStack),
externs.resolver(pack, projectDir, depth, depStack),
defines.resolver(pack, projectDir, depth, depStack),
options.resolver(pack, projectDir, depth, depStack),
tests.resolver(pack, projectDir, depth, depStack)
]);
};
const updater = function(pack, depth, depStack) {
if (src.updater) src.updater(pack, depth, depStack);
if (externs.updater) externs.updater(pack, depth, depStack);
if (defines.updater) defines.updater(pack, depth, depStack);
if (options.updater) options.updater(pack, depth, depStack);
if (tests.updater) tests.updater(pack, depth, depStack);
};
const postResolver = function(pack, projectDir) {
if (pack.build && pack.build.type === 'config') {
return Promise.resolve();
}
return Promise.all([
src.postResolver(pack, projectDir),
tests.postResolver(pack, projectDir)
]);
};
const getOptions = function(pack, outputDir) {
// the compiler options are not defined in camelcase
/* eslint camelcase: "off" */
var opts = Object.assign({}, require('./options-base'));
if (utils.isAppPackage(pack)) {
opts = Object.assign(opts, require('./options-app'));
} else {
opts = Object.assign(opts, require('./options-lib'));
}
opts.js_output_file = path.join(outputDir, pack.name + '.min.js');
opts.output_manifest = path.join(outputDir, 'gcc-manifest');
opts.create_source_map = path.join(outputDir, pack.name + '.min.map');
src.adder(pack, opts);
externs.adder(pack, opts);
options.adder(pack, opts);
defines.adder(pack, opts);
if (!opts.entry_point && !opts.closure_entry_point) {
throw new Error('ERROR: build.gcc.entry_point must be defined in ' +
pack.name + '\'s package.json');
}
return opts;
};
const writer = function(pack, outputDir) {
if (pack.build && pack.build.type === 'config') {
return Promise.resolve();
}
var options = getOptions(pack, outputDir);
return Promise.all([
builder.writer(pack, outputDir, options),
java.writer(pack, outputDir, options),
json.writer(pack, outputDir, options),
defines.writer(pack, outputDir, options),
tests.writer(pack, outputDir, options),
webpack.writer(pack, outputDir, options)
]);
};
const clear = function() {
src.clear();
externs.clear();
options.clear();
defines.clear();
tests.clear();
};
module.exports = {
clear: clear,
resolver: resolver,
updater: updater,
postResolver: postResolver,
writer: writer,
_getOptions: getOptions
};