1 | var path = require("path");
|
2 | var through = require("through2");
|
3 | var keys = require("lodash/keys");
|
4 | var assign = require("lodash/assign");
|
5 | var isArray = require("lodash/isArray");
|
6 | var includes = require("lodash/includes");
|
7 | var hasES6 = require("../graph/has_es6");
|
8 | var unbundle = require("../graph/unbundle");
|
9 | var flattenBundle = require("../bundle/flatten");
|
10 | var makeBundle = require("../bundle/make_bundle");
|
11 | var isJavaScriptBundle = require("../bundle/is_js_bundle");
|
12 | var splitByBuildType = require("../bundle/split_by_build_type");
|
13 | var addTraceurRuntime = require("../bundle/add_traceur_runtime");
|
14 | var makeBundlesConfig = require("../bundle/make_bundles_config");
|
15 | var addPrelodedNpmPackagesToBundle = require("../bundle/add_npm_packages_node");
|
16 |
|
17 | var BUNDLE_DEPTH = 1;
|
18 |
|
19 | module.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 |
|
30 | function 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 |
|
49 |
|
50 | if (npmContext && needsNpmPackagesNode(options.filter)) {
|
51 | addPrelodedNpmPackagesToBundle(bundle, npmContext, data.options);
|
52 | }
|
53 |
|
54 |
|
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 |
|
64 | if (hasES6(graph)) {
|
65 | addTraceurRuntime(bundle);
|
66 | }
|
67 | });
|
68 |
|
69 | return assign({}, data, {
|
70 | bundles: splitMainBundles
|
71 | });
|
72 | }
|
73 |
|
74 | function needsNpmPackagesNode(filter) {
|
75 | filter = filter || [];
|
76 |
|
77 |
|
78 | return (
|
79 | includes(filter, "node_modules/**/*") &&
|
80 | !includes(filter, "package.json")
|
81 | );
|
82 | }
|
83 |
|
84 | function nameBundles(bundles) {
|
85 | return bundles.map(function(bundle) {
|
86 | var type = bundle.buildType;
|
87 |
|
88 |
|
89 |
|
90 | var suffix = type === "js" ? "" : "." + type + "!";
|
91 |
|
92 | return assign({}, bundle, {
|
93 | name: "dev-bundle" + suffix
|
94 | });
|
95 | });
|
96 | }
|
97 |
|
98 | function 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 | }
|