UNPKG

steal-tools

Version:

Futuristic build tools for ES6 Module applications.

126 lines (99 loc) 3.3 kB
var _ = require("lodash"); var through = require("through2"); var hasES6 = require("../graph/has_es6"); var unbundle = require("../graph/unbundle"); var flattenBundle = require("../bundle/flatten"); var makeBundle = require("../bundle/make_bundle"); var isJavaScriptBundle = require("../bundle/is_js_bundle"); var splitByBuildType = require("../bundle/split_by_build_type"); var addTraceurRuntime = require("../bundle/add_traceur_runtime"); var makeBundlesConfig = require("../bundle/make_bundles_config"); var addPrelodedNpmPackagesToBundle = require("../bundle/add_npm_packages_node"); var BUNDLE_DEPTH = 1; module.exports = function() { return through.obj(function(data, enc, done) { try { var result = bundle(data); done(null, result); } catch (err) { done(err); } }); }; function bundle(data) { var options = data.options; var configuration = data.configuration; var npmContext = data.loader.npmContext; var graph = includePluginsInBuild(data.graph); var configGraph = includePluginsInBuild(data.configGraph); unbundle(graph); var mainBundle = makeBundle(graph); flattenBundle(mainBundle, BUNDLE_DEPTH); var splitMainBundles = nameBundles(splitByBuildType(mainBundle)); splitMainBundles.filter(isJavaScriptBundle).forEach(function(bundle) { var unshift = [].unshift; unshift.apply(bundle.nodes, configGraph); // adds node that calls `steal.addNpmPackages` when bundle is loaded; // this prevents the requests to fetch each npm dependency `package.json` if (npmContext && needsNpmPackagesNode(options.filter)) { addPrelodedNpmPackagesToBundle(bundle, npmContext, data.options); } // Make config JS code so System knows where to look for bundles. var configNode = makeBundlesConfig(splitMainBundles, configuration, bundle); bundle.nodes.unshift(configNode); // Traceur code requires a runtime. if (hasES6(graph)) { addTraceurRuntime(bundle); } }); return _.assign({}, data, { bundles: splitMainBundles }); } function needsNpmPackagesNode(filter) { filter = filter || []; // not needed when @config is part of the bundle return ( _.includes(filter, "node_modules/**/*") && !_.includes(filter, "package.json") ); } function nameBundles(bundles) { return bundles.map(function(bundle) { var type = bundle.buildType; // this is needed so css bundles are written out with the // right file extension var suffix = type === "js" ? "" : "." + type + "!"; return _.assign({}, bundle, { name: "dev-bundle" + suffix }); }); } function includePluginsInBuild(graph) { return _.isArray(graph) ? handleArrayGraph(graph) : handleObjectGraph(graph); function handleArrayGraph(graph) { var cloned = graph.slice(0); cloned .filter(function(node) { return node.isPlugin; }) .forEach(function(node) { var metadata = node.load.metadata; if (metadata) metadata.includeInBuild = true; }); return cloned; } function handleObjectGraph(graph) { var cloned = _.assign({}, graph); function isPlugin(name) { return cloned[name].isPlugin; } function includeInBuild(name) { var node = cloned[name]; var metadata = node.load.metadata; if (metadata) metadata.includeInBuild = true; } _.keys(cloned).filter(isPlugin).forEach(includeInBuild); return cloned; } }