UNPKG

4.32 kBJavaScriptView Raw
1"use strict";
2var path = require("path");
3var rollup = require("rollup");
4var hypothetical = require("rollup-plugin-hypothetical");
5var fableLib = require("./lib");
6var constants = require("./constants");
7var build_1 = require("./build");
8/** Bundles generated JS files and dependencies, requires rollup and plugins */
9var bundleCache = null;
10var fullRebuildTriggered = false;
11function normalizeProjectName(opts) {
12 var projName = path.basename(opts.projFile[opts.projFile.length - 1]);
13 return projName.substr(0, projName.indexOf(".")).replace(/[^A-Z_]/ig, "_");
14}
15function readRollupOptions(opts) {
16 if (!opts.rollup) {
17 return opts;
18 }
19 var rollupOpts = opts.rollup;
20 var outDir = fableLib.pathJoin(opts.workingDir, opts.outDir);
21 rollupOpts = typeof rollupOpts === "boolean" ? {} : rollupOpts;
22 rollupOpts = typeof rollupOpts === "string" ? { dest: fableLib.pathJoin(outDir, rollupOpts) } : rollupOpts;
23 rollupOpts.plugins = fableLib.resolvePlugins(rollupOpts.plugins, opts.workingDir, "rollup-plugin-");
24 var plugins = [], nodeResolve = 'rollup-plugin-node-resolve', commonjs = 'rollup-plugin-commonjs';
25 // Attention: Plugin order is important
26 if (!rollupOpts.plugins.some(function (kv) { return kv[0].indexOf(nodeResolve) >= 0; })) {
27 plugins.push(require(nodeResolve)({ ignoreGlobal: true }));
28 }
29 if (!rollupOpts.plugins.some(function (kv) { return kv[0].indexOf(commonjs) >= 0; })) {
30 plugins.push(require(commonjs)({ jsnext: true, main: true, browser: true }));
31 }
32 // Custom plugins
33 for (var i = 0; i < rollupOpts.plugins.length; i++) {
34 var kv = rollupOpts.plugins[i];
35 plugins.push(require(kv[0])(kv[1]));
36 }
37 rollupOpts.plugins = plugins;
38 // Other options
39 rollupOpts.format = rollupOpts.format == null ? constants.JS_MODULES[opts.module] : rollupOpts.format;
40 rollupOpts.sourceMap = rollupOpts.sourceMap == null ? opts.sourceMaps : rollupOpts.sourceMap;
41 rollupOpts.moduleName = rollupOpts.moduleName || normalizeProjectName(opts);
42 rollupOpts.dest = rollupOpts.dest == null
43 ? fableLib.pathJoin(outDir, "bundle.js")
44 : fableLib.pathJoin(opts.workingDir, rollupOpts.dest);
45 if (!opts.verbose) {
46 rollupOpts.onwarn = function (warning) { };
47 }
48 opts.rollup = rollupOpts;
49 return opts;
50}
51exports.readRollupOptions = readRollupOptions;
52function clearBundleCache() {
53 bundleCache = null;
54}
55exports.clearBundleCache = clearBundleCache;
56function bundle(jsFiles, opts, fableProc, continuation) {
57 var rollupOpts = Object.assign({}, opts.rollup);
58 rollupOpts.cache = bundleCache;
59 rollupOpts.plugins.splice(0, 0, hypothetical({
60 files: jsFiles, allowRealFiles: true, allowExternalModules: true
61 }));
62 if (rollupOpts.entry == null) {
63 rollupOpts.entry = Object.getOwnPropertyNames(jsFiles)
64 .find(function (f) { return jsFiles[f].isEntry; });
65 }
66 fableLib.stdoutLog("Bundling...");
67 rollup.rollup(rollupOpts)
68 .then(function (bundle) {
69 var parsed = bundle.generate(rollupOpts);
70 if (opts.watch) {
71 bundleCache = bundle;
72 }
73 // Write to disk, bundle.write doesn't seem to work
74 // bundle.write({ dest: rollupOpts.dest, format: rollupOpts.format, sourceMap: rollupOpts.sourceMap });
75 fableLib.writeFile(rollupOpts.dest, parsed.code, rollupOpts.sourceMap === true ? parsed.map : null);
76 fableLib.stdoutLog("Bundled " + path.relative(opts.workingDir, rollupOpts.dest) + " at " + (new Date()).toLocaleTimeString());
77 build_1.postbuild(opts, "SUCCESS", fableProc, continuation);
78 })
79 .catch(function (err) {
80 // The stack here is a bit noisy just report the message
81 fableLib.stderrLog(err.message);
82 bundleCache = null;
83 var buildResult = null;
84 if (!fullRebuildTriggered) {
85 fullRebuildTriggered = true;
86 buildResult = "NEEDS_FULL_REBUILD";
87 }
88 else {
89 fullRebuildTriggered = false; // Prevent infinite loop
90 buildResult = "FAIL";
91 }
92 build_1.postbuild(opts, buildResult, fableProc, continuation);
93 });
94}
95exports.bundle = bundle;