UNPKG

4.13 kBJavaScriptView Raw
1/*jshint funcscope:true*/
2var pump = require("pump");
3var arrify = require("../arrify");
4var assign = require("lodash/assign");
5var difference = require("lodash/difference");
6var makeDeferred = require("../make-deferred");
7var isUndefined = require("lodash/isUndefined");
8var assignDefaultOptions = require("../assign_default_options");
9
10// streams
11var buildType = require("../stream/build_type");
12var bundle = require("../stream/bundle");
13var envify = require("../stream/envify");
14var minify = require("../stream/minify");
15var slimBundles = require("../stream/slim");
16var transpile = require("../stream/transpile");
17var concat = require("../bundle/concat_stream");
18var addModuleIds = require("../stream/add_module_ids");
19var addBundleIds = require("../stream/add_bundle_ids");
20var filterGraph = require("../stream/filter_slim_graph");
21var addPluginNames = require("../stream/add_plugin_names");
22var addAtStealShim = require("../stream/add_steal_shim");
23var addAtLoaderShim = require("../stream/add_loader_shim");
24var loadNodeBuilder = require("../stream/load_node_builder");
25var convertSlimConfig = require("../stream/convert_slim_config");
26var adjustBundlesPath = require("../stream/adjust_bundles_path");
27var write = require("../bundle/write_bundles").createWriteStream;
28var writeBundlesManifest = require("../stream/write_bundle_manifest");
29var graph = require("../graph/make_graph_with_bundles").createBundleGraphStream;
30var treeshake = require("../stream/treeshake");
31
32module.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 // minification is on by default
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 // fail early if an unknown target is passed in
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 }), // the "" target is relevant for this transform
90 slimBundles({ target: target || "web" }), // set default target so there is no need to handle ""
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 // run external steal-tool plugins after the build
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 // If no `target` is provided resolves `buildResult`; otherwise
124 // resolves an object where the key is the target name and its value
125 // the `buildResult` object.
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};