1 |
|
2 | var pump = require("pump");
|
3 | var arrify = require("../arrify");
|
4 | var assign = require("lodash/assign");
|
5 | var difference = require("lodash/difference");
|
6 | var makeDeferred = require("../make-deferred");
|
7 | var isUndefined = require("lodash/isUndefined");
|
8 | var assignDefaultOptions = require("../assign_default_options");
|
9 |
|
10 |
|
11 | var buildType = require("../stream/build_type");
|
12 | var bundle = require("../stream/bundle");
|
13 | var envify = require("../stream/envify");
|
14 | var minify = require("../stream/minify");
|
15 | var slimBundles = require("../stream/slim");
|
16 | var transpile = require("../stream/transpile");
|
17 | var concat = require("../bundle/concat_stream");
|
18 | var addModuleIds = require("../stream/add_module_ids");
|
19 | var addBundleIds = require("../stream/add_bundle_ids");
|
20 | var filterGraph = require("../stream/filter_slim_graph");
|
21 | var addPluginNames = require("../stream/add_plugin_names");
|
22 | var addAtStealShim = require("../stream/add_steal_shim");
|
23 | var addAtLoaderShim = require("../stream/add_loader_shim");
|
24 | var loadNodeBuilder = require("../stream/load_node_builder");
|
25 | var convertSlimConfig = require("../stream/convert_slim_config");
|
26 | var adjustBundlesPath = require("../stream/adjust_bundles_path");
|
27 | var write = require("../bundle/write_bundles").createWriteStream;
|
28 | var writeBundlesManifest = require("../stream/write_bundle_manifest");
|
29 | var graph = require("../graph/make_graph_with_bundles").createBundleGraphStream;
|
30 | var treeshake = require("../stream/treeshake");
|
31 |
|
32 | module.exports = function(cfg, opts) {
|
33 | var config = cfg !== undefined ? cfg : {};
|
34 | var options = opts !== undefined ? opts : {};
|
35 |
|
36 | var slimDfd = makeDeferred();
|
37 | var supportedTargets = ["web", "node", "worker"];
|
38 |
|
39 |
|
40 | assign(options, {
|
41 | minify: isUndefined(options.minify) ? true : options.minify
|
42 | });
|
43 |
|
44 | try {
|
45 | options = assignDefaultOptions(config, options);
|
46 | } catch (err) {
|
47 | return Promise.reject(err);
|
48 | }
|
49 |
|
50 |
|
51 | var targets = arrify(options.target);
|
52 | if (difference(targets, supportedTargets).length) {
|
53 | var unknown = difference(targets, supportedTargets);
|
54 | return Promise.reject(
|
55 | new Error(
|
56 | `Cannot create slim build, target(s) ${unknown.join(",")} not supported`
|
57 | )
|
58 | );
|
59 | }
|
60 |
|
61 | var initialStream = pump(
|
62 | graph(config, options),
|
63 | buildType("optimize"),
|
64 | treeshake(),
|
65 | filterGraph(),
|
66 | addAtStealShim(),
|
67 | addAtLoaderShim(),
|
68 | addModuleIds(),
|
69 | convertSlimConfig(),
|
70 | loadNodeBuilder(),
|
71 | transpile({
|
72 | outputFormat: "slim",
|
73 | keepInGraph: ["@steal", "@loader"]
|
74 | }),
|
75 | envify(),
|
76 | bundle(),
|
77 | addPluginNames(),
|
78 | addBundleIds(),
|
79 | function(err) {
|
80 | if (err) slimDfd.reject(err);
|
81 | }
|
82 | );
|
83 |
|
84 | var promises = (targets.length ? targets : [""]).map(function(target) {
|
85 | var dfd = makeDeferred();
|
86 |
|
87 | var final = pump(
|
88 | initialStream,
|
89 | adjustBundlesPath({ target: target }),
|
90 | slimBundles({ target: target || "web" }),
|
91 | concat(),
|
92 | minify(),
|
93 | write(),
|
94 | writeBundlesManifest(),
|
95 | function(err) {
|
96 | if (err) dfd.reject(err);
|
97 | }
|
98 | );
|
99 |
|
100 | final.on("data", function (builtResult) {
|
101 |
|
102 | if (options) {
|
103 | var p = Promise.resolve(builtResult);
|
104 |
|
105 | if (options.bundleAssets) {
|
106 | var bundleAssets = require("steal-bundler");
|
107 | p = p.then(function (builtResult) {
|
108 | return bundleAssets(builtResult, options.bundleAssets);
|
109 | });
|
110 | }
|
111 | }
|
112 |
|
113 | p.then(function (builtResult) {
|
114 | dfd.resolve(builtResult);
|
115 | }).catch(function (error) {
|
116 | dfd.reject(error);
|
117 | });
|
118 | });
|
119 | return dfd.promise;
|
120 | });
|
121 |
|
122 | Promise.all(promises).then(
|
123 |
|
124 |
|
125 |
|
126 | function(results) {
|
127 | var value;
|
128 |
|
129 | if (targets.length) {
|
130 | value = {};
|
131 | results.forEach(function(result, index) {
|
132 | value[targets[index]] = result;
|
133 | });
|
134 | } else {
|
135 | value = results[0];
|
136 | }
|
137 |
|
138 | slimDfd.resolve(value);
|
139 | },
|
140 | slimDfd.reject
|
141 | );
|
142 |
|
143 | return slimDfd.promise;
|
144 | };
|