UNPKG

3.52 kBJavaScriptView Raw
1var path = require("path");
2var through = require("through2");
3var keys = require("lodash/keys");
4var assign = require("lodash/assign");
5var isArray = require("lodash/isArray");
6var includes = require("lodash/includes");
7var hasES6 = require("../graph/has_es6");
8var unbundle = require("../graph/unbundle");
9var flattenBundle = require("../bundle/flatten");
10var makeBundle = require("../bundle/make_bundle");
11var isJavaScriptBundle = require("../bundle/is_js_bundle");
12var splitByBuildType = require("../bundle/split_by_build_type");
13var addTraceurRuntime = require("../bundle/add_traceur_runtime");
14var makeBundlesConfig = require("../bundle/make_bundles_config");
15var addPrelodedNpmPackagesToBundle = require("../bundle/add_npm_packages_node");
16
17var BUNDLE_DEPTH = 1;
18
19module.exports = function() {
20 return through.obj(function(data, enc, done) {
21 try {
22 var result = bundle(data);
23 done(null, result);
24 } catch (err) {
25 done(err);
26 }
27 });
28};
29
30function bundle(data) {
31 var options = data.options;
32 var configuration = data.configuration;
33 var npmContext = data.loader.npmContext;
34 var graph = includePluginsInBuild(data.graph);
35 var configGraph = includePluginsInBuild(data.configGraph);
36
37 unbundle(graph);
38
39 var mainBundle = makeBundle(graph);
40 flattenBundle(mainBundle, BUNDLE_DEPTH);
41 var splitMainBundles = nameBundles(splitByBuildType(mainBundle));
42
43 splitMainBundles.filter(isJavaScriptBundle).forEach(function(bundle) {
44 var unshift = [].unshift;
45
46 unshift.apply(bundle.nodes, configGraph);
47
48 // adds node that calls `steal.addNpmPackages` when bundle is loaded;
49 // this prevents the requests to fetch each npm dependency `package.json`
50 if (npmContext && needsNpmPackagesNode(options.filter)) {
51 addPrelodedNpmPackagesToBundle(bundle, npmContext, data.options);
52 }
53
54 // Make config JS code so System knows where to look for bundles.
55 bundle.nodes.unshift(
56 makeBundlesConfig(splitMainBundles, configuration, bundle, {
57 getBundleName(bundle) {
58 return path.join(options.dest || "", bundle.name);
59 }
60 })
61 );
62
63 // Traceur code requires a runtime.
64 if (hasES6(graph)) {
65 addTraceurRuntime(bundle);
66 }
67 });
68
69 return assign({}, data, {
70 bundles: splitMainBundles
71 });
72}
73
74function needsNpmPackagesNode(filter) {
75 filter = filter || [];
76
77 // not needed when @config is part of the bundle
78 return (
79 includes(filter, "node_modules/**/*") &&
80 !includes(filter, "package.json")
81 );
82}
83
84function nameBundles(bundles) {
85 return bundles.map(function(bundle) {
86 var type = bundle.buildType;
87
88 // this is needed so css bundles are written out with the
89 // right file extension
90 var suffix = type === "js" ? "" : "." + type + "!";
91
92 return assign({}, bundle, {
93 name: "dev-bundle" + suffix
94 });
95 });
96}
97
98function includePluginsInBuild(graph) {
99 return isArray(graph) ? handleArrayGraph(graph) : handleObjectGraph(graph);
100
101 function handleArrayGraph(graph) {
102 var cloned = graph.slice(0);
103
104 cloned
105 .filter(function(node) {
106 return node.isPlugin;
107 })
108 .forEach(function(node) {
109 var metadata = node.load.metadata;
110
111 if (metadata) metadata.includeInBuild = true;
112 });
113
114 return cloned;
115 }
116
117 function handleObjectGraph(graph) {
118 var cloned = assign({}, graph);
119
120 function isPlugin(name) {
121 return cloned[name].isPlugin;
122 }
123
124 function includeInBuild(name) {
125 var node = cloned[name];
126 var metadata = node.load.metadata;
127
128 if (metadata) metadata.includeInBuild = true;
129 }
130
131 keys(cloned).filter(isPlugin).forEach(includeInBuild);
132 return cloned;
133 }
134}