UNPKG

16.8 kBJavaScriptView Raw
1'use strict';
2
3var builtinModules = require('builtin-modules');
4var readPkg = require('read-pkg');
5var path = require('path');
6var babel = require('rollup-plugin-babel');
7var buble = require('rollup-plugin-buble');
8var commonjs = require('rollup-plugin-commonjs');
9var exportEquals = require('rollup-plugin-export-equals');
10var json = require('rollup-plugin-json');
11var nodeResolve = require('rollup-plugin-node-resolve');
12var rollupPluginTerser = require('rollup-plugin-terser');
13var ts2 = require('rollup-plugin-typescript2');
14var events = require('events');
15var rollup = require('rollup');
16
17var resolvePath = function (filename, cwd) { return path.resolve(cwd, filename); };
18
19function log(pattern) {
20 var args = [], len = arguments.length - 1;
21 while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
22
23 // tslint:disable-next-line: no-console
24 console.log.apply(console, [ pattern ].concat( args ));
25}
26function logFilename(filename, cwd, pattern) {
27 log(pattern, path.relative(cwd, filename));
28}
29
30function error(msg) {
31 return new TypeError(msg);
32}
33function invalidPkgField(fieldName) {
34 return error(("Invalid package.json " + fieldName + " field."));
35}
36function invalidOption(optionName) {
37 return error(("Invalid " + optionName + " options."));
38}
39
40function isNull(value) {
41 return value == null;
42}
43function isObject(value) {
44 return typeof value === "object" && !!value;
45}
46function isString(value) {
47 return typeof value === "string";
48}
49function isBool(value) {
50 return value === true || value === false;
51}
52var isArray = Array.isArray;
53
54function isBrowserFormat(value) {
55 return !!value && (value === "iife" || value === "amd" || value === "umd");
56}
57
58function isValidMin(value) {
59 return !!value && (value === "main" || value === "module" || value === "browser");
60}
61function isValidMinOption(value) {
62 return isBool(value) || isValidMin(value) || isArray(value) && value.every(function (item) { return isValidMin(item); });
63}
64
65function _await(value, then, direct) {
66 if (direct) {
67 return then ? then(value) : value;
68 }
69
70 if (!value || !value.then) {
71 value = Promise.resolve(value);
72 }
73
74 return then ? value.then(then) : value;
75}
76
77var analizePkg = _async(function (cwd, pkg) {
78 return _await(pkg || readPkg({
79 cwd: cwd
80 }), function (resolvedPkg) {
81 var obj;
82
83 var pkgName = resolvedPkg.name;
84 var cjsModuleFile = resolvedPkg.main;
85 var esModuleFile = resolvedPkg.module;
86 var browserFile = resolvedPkg.browser;
87 var pkgTypes = resolvedPkg.types;
88 var typings = resolvedPkg.typings;
89 var runtimeDependencies = resolvedPkg.dependencies;
90 var peerDependencies = resolvedPkg.peerDependencies;
91 var bundledDependencies = resolvedPkg.bundledDependencies;
92 var bundleDependencies = resolvedPkg.bundleDependencies;
93 var bundlibOptions = resolvedPkg.bundlib;
94
95 if (browserFile && !isString(browserFile)) {
96 throw invalidPkgField("browser");
97 }
98
99 if (!isNull(bundlibOptions) && (!isObject(bundlibOptions) || isArray(bundlibOptions))) {
100 throw invalidPkgField("bundlib");
101 }
102
103 var ref = bundlibOptions || {};
104 var pkgInput = ref.input;
105 var sourcemapFlag = ref.sourcemap;
106 var esModuleFlag = ref.esModule;
107 var interopFlag = ref.interop;
108 var extendFlag = ref.extend;
109 var equalsFlag = ref.equals;
110 var pkgBrowserFormat = ref.browser;
111 var browserName = ref.name;
112 var amdId = ref.id;
113 var browserGlobals = ref.globals;
114 var iife = ref.iife;
115 var amd = ref.amd;
116 var umd = ref.umd;
117 var min = ref.min;
118
119 if (!isNull(pkgInput) && !isString(pkgInput)) {
120 throw invalidOption("input");
121 }
122
123 if (!isNull(pkgBrowserFormat) && !isBrowserFormat(pkgBrowserFormat)) {
124 throw invalidOption("browser");
125 }
126
127 if (!isNull(browserName) && !isString(browserName)) {
128 throw invalidOption("name");
129 }
130
131 if (!isNull(amdId) && !isString(amdId)) {
132 throw invalidOption("id");
133 }
134
135 if (!isNull(browserGlobals) && !isObject(browserGlobals)) {
136 throw invalidOption("globals");
137 }
138
139 if (!isNull(min) && !isValidMinOption(min)) {
140 throw invalidOption("min");
141 } // compatible with version <0.3
142
143
144 if (iife && amd || iife && umd || amd && umd) {
145 throw error("multiple browser builds are no longer supported in bundlib >= 0.3.");
146 }
147
148 if (iife || amd || umd) {
149 // warn about deprecated options
150 log("options iife, amd & umd are deprecated in version >= 0.3");
151 }
152
153 var deprecatedBrowserFormat = iife ? "iife" : amd ? "amd" : null; // get format from deprecated options if no format specified
154
155 var browserFormat = pkgBrowserFormat || deprecatedBrowserFormat || "umd"; //
156
157 var input = resolvePath(pkgInput || "src/index.ts", cwd);
158 var typesPath = pkgTypes || typings;
159 var output = {
160 main: cjsModuleFile ? resolvePath(cjsModuleFile, cwd) : null,
161 module: esModuleFile ? resolvePath(esModuleFile, cwd) : null,
162 browser: browserFile ? resolvePath(browserFile, cwd) : null,
163 types: typesPath ? resolvePath(typesPath, cwd) : null
164 };
165 var dependencies = {
166 builtin: builtinModules,
167 runtime: runtimeDependencies ? Object.keys(runtimeDependencies) : [],
168 peer: peerDependencies ? Object.keys(peerDependencies) : [],
169 bundled: bundledDependencies || bundleDependencies || []
170 };
171 var buildName = browserName || pkgName || null;
172 var minify = !min ? {} : min === true ? {
173 main: true,
174 module: true,
175 browser: true
176 } : isArray(min) ? min.reduce(function (result, value) {
177 result[value] = true;
178 return result;
179 }, {}) : ( obj = {}, obj[min] = true, obj );
180 var globals = !browserGlobals ? null : isArray(browserGlobals) ? browserGlobals.reduce(function (result, value) {
181 if (isString(value)) {
182 result[value] = value;
183 }
184
185 return result;
186 }, {}) : browserGlobals;
187 var browser = {
188 format: browserFormat,
189 name: buildName,
190 id: amdId || null,
191 globals: globals
192 };
193 var options = {
194 sourcemap: sourcemapFlag !== false,
195 esModule: !!esModuleFlag,
196 interop: !!interopFlag,
197 extend: !!extendFlag,
198 equals: !!equalsFlag
199 };
200 return {
201 cwd: cwd,
202 pkg: resolvedPkg,
203 dependencies: dependencies,
204 input: input,
205 output: output,
206 minify: minify,
207 browser: browser,
208 options: options
209 };
210 }, pkg);
211});
212
213function _async(f) {
214 return function () {
215 var arguments$1 = arguments;
216
217 for (var args = [], i = 0; i < arguments.length; i++) {
218 args[i] = arguments$1[i];
219 }
220
221 try {
222 return Promise.resolve(f.apply(this, args));
223 } catch (e) {
224 return Promise.reject(e);
225 }
226 };
227}
228
229var BUILDING = "BUILDING";
230var BUILT = "BUILT";
231var WRITING = "WRITING";
232var WRITTEN = "WRITTEN";
233var ERROR = "ERROR";
234
235function createOutput(format, file, sourcemap, esModule, interop, extra) {
236 var output = Object.assign({}, {file: file,
237 format: format,
238 sourcemap: sourcemap,
239 esModule: esModule,
240 interop: interop},
241 extra);
242 return output;
243}
244function createConfig(input, output, external, plugins, extra) {
245 var config = Object.assign({}, {input: input,
246 output: output,
247 external: external,
248 plugins: plugins.filter(Boolean)},
249 extra);
250 return config;
251}
252function createModuleConfig(input, format, file, sourcemap, esModule, interop, external, plugins) {
253 var output = createOutput(format, file, sourcemap, esModule, interop);
254 return createConfig(input, output, external, plugins);
255}
256function createBrowserConfig(input, format, file, sourcemap, esModule, interop, plugins, name, extend, globals, id) {
257 var output = createOutput(format, file, sourcemap, esModule, interop, {
258 name: name,
259 extend: extend,
260 globals: globals
261 });
262
263 if (id && (format === "umd" || format === "amd")) {
264 output.amd = {
265 id: id
266 };
267 }
268
269 var external = globals ? Object.keys(globals) : [];
270 return createConfig(input, output, external, plugins);
271}
272
273function renameMin(filename) {
274 var ref = path.parse(filename);
275 var dir = ref.dir;
276 var name = ref.name;
277 var ext = ref.ext;
278 return path.join(dir, name + ".min" + ext);
279}
280
281var pkgToConfigs = function (ref, dev) {
282 var cwd = ref.cwd;
283 var apiInput = ref.input;
284 var output = ref.output;
285 var minify = ref.minify;
286 var dependencies = ref.dependencies;
287 var browserOptions = ref.browser;
288 var options = ref.options;
289
290 var apiFolder = path.dirname(apiInput);
291 var cjsOutputFile = output.main;
292 var esOutputFile = output.module;
293 var browserOutputFile = output.browser;
294 var typesOutputFile = output.types;
295 var builtinDependencies = dependencies.builtin;
296 var runtimeDependencies = dependencies.runtime;
297 var peerDependencies = dependencies.peer;
298 var sourcemap = options.sourcemap;
299 var esModule = options.esModule;
300 var interop = options.interop;
301 var extend = options.extend;
302 var equals = options.equals;
303 var browserFormat = browserOptions.format;
304 var pkgName = browserOptions.name;
305 var id = browserOptions.id;
306 var globals = browserOptions.globals;
307 var prod = !dev;
308 var configs = [];
309 var typesOutputDir = typesOutputFile;
310
311 if (typesOutputDir && path.extname(typesOutputDir) === ".ts") {
312 typesOutputDir = path.dirname(typesOutputDir);
313 }
314
315 var modulePlugins = function (mini) {
316 var declarationDir = !configs.length && typesOutputDir;
317 var srcFolderContent = resolvePath("**/*.ts", apiFolder);
318 return [ts2({
319 include: srcFolderContent,
320 cacheRoot: resolvePath(".cache/rpt2", cwd),
321 useTsconfigDeclarationDir: true,
322 tsconfigDefaults: {
323 include: [srcFolderContent],
324 exclude: []
325 },
326 tsconfigOverride: {
327 compilerOptions: {
328 target: "esnext",
329 module: "esnext",
330 moduleResolution: "node",
331 sourceMap: sourcemap,
332 declaration: !!declarationDir,
333 declarationDir: declarationDir || "",
334 emitDeclarationOnly: false
335 }
336 }
337 }), json(), declarationDir && equals && exportEquals({
338 file: resolvePath(path.join(declarationDir, "index.d.ts"), cwd)
339 }) || null, babel({
340 extensions: [".ts", ".js"],
341 exclude: /node_modules/,
342 babelrc: false,
343 plugins: [require.resolve("babel-plugin-transform-async-to-promises")]
344 }), buble({
345 exclude: /node_modules/,
346 target: {
347 node: 0.12
348 },
349 objectAssign: true
350 }), mini && rollupPluginTerser.terser({
351 sourcemap: sourcemap,
352 toplevel: true,
353 module: true
354 })];
355 };
356
357 var browserPlugins = function (mini) { return [nodeResolve(), commonjs() ].concat( modulePlugins(mini)); };
358
359 var external = builtinDependencies.concat( runtimeDependencies, peerDependencies);
360
361 if (esOutputFile) {
362 var config = createModuleConfig(apiInput, "es", esOutputFile, sourcemap, true, false, external, modulePlugins(prod && !minify.module));
363 configs.push(config);
364
365 if (minify.module) {
366 var configMin = createModuleConfig(apiInput, "es", renameMin(esOutputFile), sourcemap, true, false, external, modulePlugins(true));
367 configs.push(configMin);
368 }
369 }
370
371 if (cjsOutputFile) {
372 var config$1 = createModuleConfig(apiInput, "cjs", cjsOutputFile, sourcemap, esModule, interop, external, modulePlugins(prod && !minify.main));
373 configs.push(config$1);
374
375 if (minify.main) {
376 var configMin$1 = createModuleConfig(apiInput, "cjs", renameMin(cjsOutputFile), sourcemap, esModule, interop, external, modulePlugins(true));
377 configs.push(configMin$1);
378 }
379 }
380
381 if (!pkgName && browserOutputFile) {
382 throw new Error("name option is required for IIFE and UMD builds");
383 }
384
385 if (browserOutputFile) {
386 var config$2 = createBrowserConfig(apiInput, browserFormat, browserOutputFile, sourcemap, esModule, interop, browserPlugins(prod && !minify.browser), pkgName, extend, globals || {}, id);
387 configs.push(config$2);
388
389 if (minify.browser) {
390 var configMin$2 = createBrowserConfig(apiInput, browserFormat, renameMin(browserOutputFile), sourcemap, esModule, interop, browserPlugins(true), pkgName, extend, globals || {}, id);
391 configs.push(configMin$2);
392 }
393 }
394
395 return configs;
396};
397
398function _async$1(f) {
399 return function () {
400 var arguments$1 = arguments;
401
402 for (var args = [], i = 0; i < arguments.length; i++) {
403 args[i] = arguments$1[i];
404 }
405
406 try {
407 return Promise.resolve(f.apply(this, args));
408 } catch (e) {
409 return Promise.reject(e);
410 }
411 };
412}
413
414function createNext(arr, callback) {
415 var index = 0;
416
417 var next = _async$1(function (err) {
418 if (!(index in arr)) {
419 return;
420 }
421
422 var currentIndex = index++;
423 var item = arr[currentIndex];
424 callback(item, next, currentIndex);
425 });
426
427 return next;
428}
429
430function oneByOne(arr, callback) {
431 var next = createNext(arr, callback);
432 next();
433}
434
435function _async$2(f) {
436 return function () {
437 var arguments$1 = arguments;
438
439 for (var args = [], i = 0; i < arguments.length; i++) {
440 args[i] = arguments$1[i];
441 }
442
443 try {
444 return Promise.resolve(f.apply(this, args));
445 } catch (e) {
446 return Promise.reject(e);
447 }
448 };
449}
450
451var build = _async$2(function (configs) {
452 var result = new events.EventEmitter();
453 setImmediate(function () {
454 result.emit(BUILDING);
455 oneByOne(configs, _async$2(function (config, next, index) {
456 var output = config.output;
457 var filename = output.file;
458 result.emit(WRITING, filename);
459 return _await$1(rollup.rollup(config), function (buildResult) {
460 return _await$1(buildResult.write(output), function () {
461 result.emit(WRITTEN, filename);
462 next();
463
464 if (index + 1 >= configs.length) {
465 result.emit(BUILT);
466 }
467 });
468 });
469 }));
470 });
471 return result;
472});
473
474function _await$1(value, then, direct) {
475 if (direct) {
476 return then ? then(value) : value;
477 }
478
479 if (!value || !value.then) {
480 value = Promise.resolve(value);
481 }
482
483 return then ? value.then(then) : value;
484}
485
486var ERR = function (result, ref) {
487 var error = ref.error;
488
489 result.emit(ERROR, error);
490};
491
492var map = {
493 START: function START(result) {
494 result.emit(BUILDING);
495 },
496
497 END: function END(result) {
498 result.emit(BUILT);
499 },
500
501 BUNDLE_START: function BUNDLE_START(result, ref) {
502 var output = ref.output;
503
504 for (var filename of output) {
505 result.emit(WRITING, filename);
506 }
507 },
508
509 BUNDLE_END: function BUNDLE_END(result, ref) {
510 var output = ref.output;
511
512 for (var filename of output) {
513 result.emit(WRITTEN, filename);
514 }
515 },
516
517 ERROR: ERR,
518 FATAL: ERR
519};
520
521var watch = function (configs) {
522 var watcher = rollup.watch(configs);
523 var result = new events.EventEmitter();
524 watcher.on("event", function (event) {
525 var code = event.code;
526 var emit = map[code];
527
528 if (emit) {
529 emit(result, event);
530 }
531 });
532 return result;
533};
534
535var rollItUp = function (configs, watch$1) {
536 return watch$1 ? watch(configs) : build(configs);
537};
538
539// version has to be hardcoded due to issue #7
540// https://github.com/manferlo81/bundlib/issues/7
541
542function _await$2(value, then, direct) {
543 if (direct) {
544 return then ? then(value) : value;
545 }
546
547 if (!value || !value.then) {
548 value = Promise.resolve(value);
549 }
550
551 return then ? value.then(then) : value;
552}
553
554var version = 0.4;
555
556function _async$3(f) {
557 return function () {
558 var arguments$1 = arguments;
559
560 for (var args = [], i = 0; i < arguments.length; i++) {
561 args[i] = arguments$1[i];
562 }
563
564 try {
565 return Promise.resolve(f.apply(this, args));
566 } catch (e) {
567 return Promise.reject(e);
568 }
569 };
570}
571
572var bundlib = _async$3(function (cwd, ref) {
573 if ( ref === void 0 ) ref = {};
574 var dev = ref.dev;
575 var watch = ref.watch;
576 var silent = ref.silent;
577
578 if (!silent) {
579 log("bundlib v%s\r\n", version);
580 log("> reading package.json...");
581 }
582
583 return _await$2(analizePkg(cwd), function (pkg) {
584 var configs = pkgToConfigs(pkg, dev);
585 return _await$2(rollItUp(configs, watch), function (buildProcess) {
586 if (!silent) {
587 buildProcess.on(WRITING, function (filename) {
588 logFilename(filename, cwd, "building > %s...");
589 });
590 buildProcess.on(WRITTEN, function (filename) {
591 logFilename(filename, cwd, "built > %s");
592 });
593 buildProcess.on(ERROR, function (err) {
594 log(err);
595 });
596
597 if (watch) {
598 buildProcess.on(BUILT, function () {
599 log("> watching for changes...");
600 });
601 }
602 }
603
604 return buildProcess;
605 });
606 });
607});
608
609exports.analizePkg = analizePkg;
610exports.bundlib = bundlib;
611exports.pkgToConfigs = pkgToConfigs;
612exports.rollItUp = rollItUp;
613//# sourceMappingURL=bundlib.cjs.js.map