UNPKG

steal-tools

Version:

Futuristic build tools for ES6 Module applications.

141 lines (124 loc) 4.02 kB
/*jshint funcscope:true*/ var pump = require("pump"); var arrify = require("../arrify"); var assign = require("lodash/assign"); var difference = require("lodash/difference"); var makeDeferred = require("../make-deferred"); var isUndefined = require("lodash/isUndefined"); var assignDefaultOptions = require("../assign_default_options"); // streams var buildType = require("../stream/build_type"); var bundle = require("../stream/bundle"); var minify = require("../stream/minify"); var slimBundles = require("../stream/slim"); var transpile = require("../stream/transpile"); var concat = require("../bundle/concat_stream"); var addModuleIds = require("../stream/add_module_ids"); var addBundleIds = require("../stream/add_bundle_ids"); var filterGraph = require("../stream/filter_slim_graph"); var addPluginNames = require("../stream/add_plugin_names"); var addAtStealShim = require("../stream/add_steal_shim"); var addAtLoaderShim = require("../stream/add_loader_shim"); var loadNodeBuilder = require("../stream/load_node_builder"); var convertSlimConfig = require("../stream/convert_slim_config"); var adjustBundlesPath = require("../stream/adjust_bundles_path"); var write = require("../bundle/write_bundles").createWriteStream; var writeBundlesManifest = require("../stream/write_bundle_manifest"); var graph = require("../graph/make_graph_with_bundles").createBundleGraphStream; module.exports = function(cfg, opts) { var config = cfg !== undefined ? cfg : {}; var options = opts !== undefined ? opts : {}; var slimDfd = makeDeferred(); var supportedTargets = ["web", "node", "worker"]; // minification is on by default assign(options, { minify: isUndefined(options.minify) ? true : options.minify }); try { options = assignDefaultOptions(config, options); } catch (err) { return Promise.reject(err); } // fail early if an unknown target is passed in var targets = arrify(options.target); if (difference(targets, supportedTargets).length) { var unknown = difference(targets, supportedTargets); return Promise.reject( new Error( `Cannot create slim build, target(s) ${unknown.join(",")} not supported` ) ); } var initialStream = pump( graph(config, options), buildType("optimize"), filterGraph(), addAtStealShim(), addAtLoaderShim(), addModuleIds(), convertSlimConfig(), loadNodeBuilder(), transpile({ outputFormat: "slim", keepInGraph: ["@steal", "@loader"] }), bundle(), addPluginNames(), addBundleIds(), function(err) { if (err) slimDfd.reject(err); } ); var promises = (targets.length ? targets : [""]).map(function(target) { var dfd = makeDeferred(); var final = pump( initialStream, adjustBundlesPath({ target: target }), // the "" target is relevant for this transform slimBundles({ target: target || "web" }), // set default target so there is no need to handle "" concat(), minify(), write(), writeBundlesManifest(), function(err) { if (err) dfd.reject(err); } ); final.on("data", function (builtResult) { // run external steal-tool plugins after the build if (options) { var p = Promise.resolve(builtResult); if (options.bundleAssets) { var bundleAssets = require("steal-bundler"); p = p.then(function (builtResult) { return bundleAssets(builtResult, options.bundleAssets); }); } } p.then(function (builtResult) { dfd.resolve(builtResult); }).catch(function (error) { dfd.reject(error); }); }); return dfd.promise; }); Promise.all(promises).then( // If no `target` is provided resolves `buildResult`; otherwise // resolves an object where the key is the target name and its value // the `buildResult` object. function(results) { var value; if (targets.length) { value = {}; results.forEach(function(result, index) { value[targets[index]] = result; }); } else { value = results[0]; } slimDfd.resolve(value); }, slimDfd.reject ); return slimDfd.promise; };