UNPKG

27.1 kBJavaScriptView Raw
1'use strict';
2
3var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
4
5function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
6
7const fs = require('./utils/fs');
8const Resolver = require('./Resolver');
9const Parser = require('./Parser');
10const WorkerFarm = require('./WorkerFarm');
11const Path = require('path');
12const Bundle = require('./Bundle');
13
14var _require = require('chokidar');
15
16const FSWatcher = _require.FSWatcher;
17
18const FSCache = require('./FSCache');
19const HMRServer = require('./HMRServer');
20const Server = require('./Server');
21
22var _require2 = require('events');
23
24const EventEmitter = _require2.EventEmitter;
25
26const logger = require('./Logger');
27const PackagerRegistry = require('./packagers');
28const localRequire = require('./utils/localRequire');
29const config = require('./utils/config');
30const emoji = require('./utils/emoji');
31const loadEnv = require('./utils/env');
32const PromiseQueue = require('./utils/PromiseQueue');
33const installPackage = require('./utils/installPackage');
34const bundleReport = require('./utils/bundleReport');
35const prettifyTime = require('./utils/prettifyTime');
36
37/**
38 * The Bundler is the main entry point. It resolves and loads assets,
39 * creates the bundle tree, and manages the worker farm, cache, and file watcher.
40 */
41class Bundler extends EventEmitter {
42 constructor(main, options = {}) {
43 super();
44 this.mainFile = Path.resolve(main || '');
45 this.options = this.normalizeOptions(options);
46
47 this.resolver = new Resolver(this.options);
48 this.parser = new Parser(this.options);
49 this.packagers = new PackagerRegistry();
50 this.cache = this.options.cache ? new FSCache(this.options) : null;
51 this.delegate = options.delegate || {};
52 this.bundleLoaders = {};
53
54 const loadersPath = `./builtins/loaders/${options.target === 'node' ? 'node' : 'browser'}/`;
55
56 this.addBundleLoader('wasm', require.resolve(loadersPath + 'wasm-loader'));
57 this.addBundleLoader('css', require.resolve(loadersPath + 'css-loader'));
58 this.addBundleLoader('js', require.resolve(loadersPath + 'js-loader'));
59
60 this.pending = false;
61 this.loadedAssets = new Map();
62 this.watchedAssets = new Map();
63 this.farm = null;
64 this.watcher = null;
65 this.hmr = null;
66 this.bundleHashes = null;
67 this.errored = false;
68 this.buildQueue = new PromiseQueue(this.processAsset.bind(this));
69 this.rebuildTimeout = null;
70
71 logger.setOptions(this.options);
72 }
73
74 normalizeOptions(options) {
75 const isProduction = options.production || process.env.NODE_ENV === 'production';
76 const publicURL = options.publicUrl || options.publicURL || '/';
77 const watch = typeof options.watch === 'boolean' ? options.watch : !isProduction;
78 const target = options.target || 'browser';
79 return {
80 production: isProduction,
81 outDir: Path.resolve(options.outDir || 'dist'),
82 outFile: options.outFile || '',
83 publicURL: publicURL,
84 watch: watch,
85 cache: typeof options.cache === 'boolean' ? options.cache : true,
86 cacheDir: Path.resolve(options.cacheDir || '.cache'),
87 killWorkers: typeof options.killWorkers === 'boolean' ? options.killWorkers : true,
88 minify: typeof options.minify === 'boolean' ? options.minify : isProduction,
89 target: target,
90 hmr: target === 'node' ? false : typeof options.hmr === 'boolean' ? options.hmr : watch,
91 https: options.https || false,
92 logLevel: isNaN(options.logLevel) ? 3 : options.logLevel,
93 mainFile: this.mainFile,
94 hmrPort: options.hmrPort || 0,
95 rootDir: Path.dirname(this.mainFile),
96 sourceMaps: typeof options.sourceMaps === 'boolean' ? options.sourceMaps : true,
97 hmrHostname: options.hmrHostname || (options.target === 'electron' ? 'localhost' : ''),
98 detailedReport: options.detailedReport || false,
99 autoinstall: (options.autoinstall || false) && !isProduction,
100 contentHash: typeof options.contentHash === 'boolean' ? options.contentHash : isProduction
101 };
102 }
103
104 addAssetType(extension, path) {
105 if (typeof path !== 'string') {
106 throw new Error('Asset type should be a module path.');
107 }
108
109 if (this.farm) {
110 throw new Error('Asset types must be added before bundling.');
111 }
112
113 this.parser.registerExtension(extension, path);
114 }
115
116 addPackager(type, packager) {
117 if (this.farm) {
118 throw new Error('Packagers must be added before bundling.');
119 }
120
121 this.packagers.add(type, packager);
122 }
123
124 addBundleLoader(type, path) {
125 if (typeof path !== 'string') {
126 throw new Error('Bundle loader should be a module path.');
127 }
128
129 if (this.farm) {
130 throw new Error('Bundle loaders must be added before bundling.');
131 }
132
133 this.bundleLoaders[type] = path;
134 }
135
136 loadPlugins() {
137 var _this = this;
138
139 return _asyncToGenerator(function* () {
140 let pkg = yield config.load(_this.mainFile, ['package.json']);
141 if (!pkg) {
142 return;
143 }
144
145 try {
146 let deps = Object.assign({}, pkg.dependencies, pkg.devDependencies);
147 for (let dep in deps) {
148 if (dep.startsWith('parcel-plugin-')) {
149 let plugin = yield localRequire(dep, _this.mainFile);
150 yield plugin(_this);
151 }
152 }
153 } catch (err) {
154 logger.warn(err);
155 }
156 })();
157 }
158
159 bundle() {
160 var _this2 = this;
161
162 return _asyncToGenerator(function* () {
163 // If another bundle is already pending, wait for that one to finish and retry.
164 if (_this2.pending) {
165 return new Promise(function (resolve, reject) {
166 _this2.once('buildEnd', function () {
167 _this2.bundle().then(resolve, reject);
168 });
169 });
170 }
171
172 let isInitialBundle = !_this2.mainAsset;
173 let startTime = Date.now();
174 _this2.pending = true;
175 _this2.errored = false;
176
177 logger.clear();
178 logger.status(emoji.progress, 'Building...');
179
180 try {
181 // Start worker farm, watcher, etc. if needed
182 yield _this2.start();
183
184 // If this is the initial bundle, ensure the output directory exists, and resolve the main asset.
185 if (isInitialBundle) {
186 yield fs.mkdirp(_this2.options.outDir);
187
188 _this2.mainAsset = yield _this2.resolveAsset(_this2.mainFile);
189 _this2.buildQueue.add(_this2.mainAsset);
190 }
191
192 // Build the queued assets.
193 let loadedAssets = yield _this2.buildQueue.run();
194
195 // The changed assets are any that don't have a parent bundle yet
196 // plus the ones that were in the build queue.
197 let changedAssets = [..._this2.findOrphanAssets(), ...loadedAssets];
198
199 // Invalidate bundles
200 var _iteratorNormalCompletion = true;
201 var _didIteratorError = false;
202 var _iteratorError = undefined;
203
204 try {
205 for (var _iterator = _this2.loadedAssets.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
206 let asset = _step.value;
207
208 asset.invalidateBundle();
209 }
210
211 // Create a new bundle tree
212 } catch (err) {
213 _didIteratorError = true;
214 _iteratorError = err;
215 } finally {
216 try {
217 if (!_iteratorNormalCompletion && _iterator.return) {
218 _iterator.return();
219 }
220 } finally {
221 if (_didIteratorError) {
222 throw _iteratorError;
223 }
224 }
225 }
226
227 _this2.mainBundle = _this2.createBundleTree(_this2.mainAsset);
228
229 // Generate the final bundle names, and replace references in the built assets.
230 _this2.bundleNameMap = _this2.mainBundle.getBundleNameMap(_this2.options.contentHash);
231
232 var _iteratorNormalCompletion2 = true;
233 var _didIteratorError2 = false;
234 var _iteratorError2 = undefined;
235
236 try {
237 for (var _iterator2 = changedAssets[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
238 let asset = _step2.value;
239
240 asset.replaceBundleNames(_this2.bundleNameMap);
241 }
242
243 // Emit an HMR update if this is not the initial bundle.
244 } catch (err) {
245 _didIteratorError2 = true;
246 _iteratorError2 = err;
247 } finally {
248 try {
249 if (!_iteratorNormalCompletion2 && _iterator2.return) {
250 _iterator2.return();
251 }
252 } finally {
253 if (_didIteratorError2) {
254 throw _iteratorError2;
255 }
256 }
257 }
258
259 if (_this2.hmr && !isInitialBundle) {
260 _this2.hmr.emitUpdate(changedAssets);
261 }
262
263 // Package everything up
264 _this2.bundleHashes = yield _this2.mainBundle.package(_this2, _this2.bundleHashes);
265
266 // Unload any orphaned assets
267 _this2.unloadOrphanedAssets();
268
269 let buildTime = Date.now() - startTime;
270 let time = prettifyTime(buildTime);
271 logger.status(emoji.success, `Built in ${time}.`, 'green');
272 if (!_this2.watcher) {
273 bundleReport(_this2.mainBundle, _this2.options.detailedReport);
274 }
275
276 _this2.emit('bundled', _this2.mainBundle);
277 return _this2.mainBundle;
278 } catch (err) {
279 _this2.errored = true;
280 logger.error(err);
281 if (_this2.hmr) {
282 _this2.hmr.emitError(err);
283 }
284
285 if (process.env.NODE_ENV === 'production') {
286 process.exitCode = 1;
287 } else if (process.env.NODE_ENV === 'test' && !_this2.hmr) {
288 throw err;
289 }
290 } finally {
291 _this2.pending = false;
292 _this2.emit('buildEnd');
293
294 // If not in watch mode, stop the worker farm so we don't keep the process running.
295 if (!_this2.watcher && _this2.options.killWorkers) {
296 _this2.stop();
297 }
298 }
299 })();
300 }
301
302 start() {
303 var _this3 = this;
304
305 return _asyncToGenerator(function* () {
306 if (_this3.farm) {
307 return;
308 }
309
310 yield _this3.loadPlugins();
311 yield loadEnv(_this3.mainFile);
312
313 _this3.options.extensions = Object.assign({}, _this3.parser.extensions);
314 _this3.options.bundleLoaders = _this3.bundleLoaders;
315 _this3.options.env = process.env;
316
317 if (_this3.options.watch) {
318 // FS events on macOS are flakey in the tests, which write lots of files very quickly
319 // See https://github.com/paulmillr/chokidar/issues/612
320 _this3.watcher = new FSWatcher({
321 useFsEvents: process.env.NODE_ENV !== 'test'
322 });
323
324 _this3.watcher.on('change', _this3.onChange.bind(_this3));
325 }
326
327 if (_this3.options.hmr) {
328 _this3.hmr = new HMRServer();
329 _this3.options.hmrPort = yield _this3.hmr.start(_this3.options);
330 }
331
332 _this3.farm = WorkerFarm.getShared(_this3.options);
333 })();
334 }
335
336 stop() {
337 if (this.farm) {
338 this.farm.end();
339 }
340
341 if (this.watcher) {
342 this.watcher.close();
343 }
344
345 if (this.hmr) {
346 this.hmr.stop();
347 }
348 }
349
350 getAsset(name, parent) {
351 var _this4 = this;
352
353 return _asyncToGenerator(function* () {
354 let asset = yield _this4.resolveAsset(name, parent);
355 _this4.buildQueue.add(asset);
356 yield _this4.buildQueue.run();
357 return asset;
358 })();
359 }
360
361 resolveAsset(name, parent) {
362 var _this5 = this;
363
364 return _asyncToGenerator(function* () {
365 var _ref = yield _this5.resolver.resolve(name, parent);
366
367 let path = _ref.path,
368 pkg = _ref.pkg;
369
370 if (_this5.loadedAssets.has(path)) {
371 return _this5.loadedAssets.get(path);
372 }
373
374 let asset = _this5.parser.getAsset(path, pkg, _this5.options);
375 _this5.loadedAssets.set(path, asset);
376
377 _this5.watch(path, asset);
378 return asset;
379 })();
380 }
381
382 watch(path, asset) {
383 if (!this.watcher) {
384 return;
385 }
386
387 if (!this.watchedAssets.has(path)) {
388 this.watcher.add(path);
389 this.watchedAssets.set(path, new Set());
390 }
391
392 this.watchedAssets.get(path).add(asset);
393 }
394
395 unwatch(path, asset) {
396 if (!this.watchedAssets.has(path)) {
397 return;
398 }
399
400 let watched = this.watchedAssets.get(path);
401 watched.delete(asset);
402
403 if (watched.size === 0) {
404 this.watchedAssets.delete(path);
405 this.watcher.unwatch(path);
406 }
407 }
408
409 resolveDep(asset, dep, install = true) {
410 var _this6 = this;
411
412 return _asyncToGenerator(function* () {
413 try {
414 return yield _this6.resolveAsset(dep.name, asset.name);
415 } catch (err) {
416 let thrown = err;
417
418 if (thrown.message.indexOf(`Cannot find module '${dep.name}'`) === 0) {
419 // Check if dependency is a local file
420 let isLocalFile = /^[/~.]/.test(dep.name);
421 let fromNodeModules = asset.name.includes(`${Path.sep}node_modules${Path.sep}`);
422
423 // If it's not a local file, attempt to install the dep
424 if (!isLocalFile && !fromNodeModules && _this6.options.autoinstall && install) {
425 return yield _this6.installDep(asset, dep);
426 }
427
428 // If the dep is optional, return before we throw
429 if (dep.optional) {
430 return;
431 }
432
433 thrown.message = `Cannot resolve dependency '${dep.name}'`;
434 if (isLocalFile) {
435 const absPath = Path.resolve(Path.dirname(asset.name), dep.name);
436 thrown.message += ` at '${absPath}'`;
437 }
438
439 yield _this6.throwDepError(asset, dep, thrown);
440 }
441
442 throw thrown;
443 }
444 })();
445 }
446
447 installDep(asset, dep) {
448 var _this7 = this;
449
450 return _asyncToGenerator(function* () {
451 var _resolver$getModulePa = _this7.resolver.getModuleParts(dep.name),
452 _resolver$getModulePa2 = _slicedToArray(_resolver$getModulePa, 1);
453
454 let moduleName = _resolver$getModulePa2[0];
455
456 try {
457 yield installPackage([moduleName], asset.name, { saveDev: false });
458 } catch (err) {
459 yield _this7.throwDepError(asset, dep, err);
460 }
461
462 return yield _this7.resolveDep(asset, dep, false);
463 })();
464 }
465
466 throwDepError(asset, dep, err) {
467 return _asyncToGenerator(function* () {
468 // Generate a code frame where the dependency was used
469 if (dep.loc) {
470 yield asset.loadIfNeeded();
471 err.loc = dep.loc;
472 err = asset.generateErrorMessage(err);
473 }
474
475 err.fileName = asset.name;
476 throw err;
477 })();
478 }
479
480 processAsset(asset, isRebuild) {
481 var _this8 = this;
482
483 return _asyncToGenerator(function* () {
484 if (isRebuild) {
485 asset.invalidate();
486 if (_this8.cache) {
487 _this8.cache.invalidate(asset.name);
488 }
489 }
490
491 yield _this8.loadAsset(asset);
492 })();
493 }
494
495 loadAsset(asset) {
496 var _this9 = this;
497
498 return _asyncToGenerator(function* () {
499 if (asset.processed) {
500 return;
501 }
502
503 if (!_this9.errored) {
504 logger.status(emoji.progress, `Building ${asset.basename}...`);
505 }
506
507 // Mark the asset processed so we don't load it twice
508 asset.processed = true;
509
510 // First try the cache, otherwise load and compile in the background
511 let startTime = Date.now();
512 let processed = _this9.cache && (yield _this9.cache.read(asset.name));
513 if (!processed || asset.shouldInvalidate(processed.cacheData)) {
514 processed = yield _this9.farm.run(asset.name, asset.package, _this9.options);
515 if (_this9.cache) {
516 _this9.cache.write(asset.name, processed);
517 }
518 }
519
520 asset.buildTime = Date.now() - startTime;
521 asset.generated = processed.generated;
522 asset.hash = processed.hash;
523
524 // Call the delegate to get implicit dependencies
525 let dependencies = processed.dependencies;
526 if (_this9.delegate.getImplicitDependencies) {
527 let implicitDeps = yield _this9.delegate.getImplicitDependencies(asset);
528 if (implicitDeps) {
529 dependencies = dependencies.concat(implicitDeps);
530 }
531 }
532
533 // Resolve and load asset dependencies
534 let assetDeps = yield Promise.all(dependencies.map((() => {
535 var _ref2 = _asyncToGenerator(function* (dep) {
536 if (dep.includedInParent) {
537 // This dependency is already included in the parent's generated output,
538 // so no need to load it. We map the name back to the parent asset so
539 // that changing it triggers a recompile of the parent.
540 _this9.watch(dep.name, asset);
541 } else {
542 let assetDep = yield _this9.resolveDep(asset, dep);
543 if (assetDep) {
544 yield _this9.loadAsset(assetDep);
545 }
546
547 return assetDep;
548 }
549 });
550
551 return function (_x) {
552 return _ref2.apply(this, arguments);
553 };
554 })()));
555
556 // Store resolved assets in their original order
557 dependencies.forEach(function (dep, i) {
558 asset.dependencies.set(dep.name, dep);
559 let assetDep = assetDeps[i];
560 if (assetDep) {
561 asset.depAssets.set(dep, assetDep);
562 }
563 });
564 })();
565 }
566
567 createBundleTree(asset, dep, bundle, parentBundles = new Set()) {
568 if (dep) {
569 asset.parentDeps.add(dep);
570 }
571
572 if (asset.parentBundle) {
573 // If the asset is already in a bundle, it is shared. Move it to the lowest common ancestor.
574 if (asset.parentBundle !== bundle) {
575 let commonBundle = bundle.findCommonAncestor(asset.parentBundle);
576 if (asset.parentBundle !== commonBundle && asset.parentBundle.type === commonBundle.type) {
577 this.moveAssetToBundle(asset, commonBundle);
578 return;
579 }
580 } else {
581 return;
582 }
583
584 // Detect circular bundles
585 if (parentBundles.has(asset.parentBundle)) {
586 return;
587 }
588 }
589
590 if (!bundle) {
591 // Create the root bundle if it doesn't exist
592 bundle = Bundle.createWithAsset(asset);
593 } else if (dep && dep.dynamic) {
594 // Create a new bundle for dynamic imports
595 bundle = bundle.createChildBundle(asset);
596 } else if (asset.type && !this.packagers.has(asset.type)) {
597 // No packager is available for this asset type. Create a new bundle with only this asset.
598 bundle.createSiblingBundle(asset);
599 } else {
600 // Add the asset to the common bundle of the asset's type
601 bundle.getSiblingBundle(asset.type).addAsset(asset);
602 }
603
604 // If the asset generated a representation for the parent bundle type, also add it there
605 if (asset.generated[bundle.type] != null) {
606 bundle.addAsset(asset);
607 }
608
609 // Add the asset to sibling bundles for each generated type
610 if (asset.type && asset.generated[asset.type]) {
611 for (let t in asset.generated) {
612 if (asset.generated[t]) {
613 bundle.getSiblingBundle(t).addAsset(asset);
614 }
615 }
616 }
617
618 asset.parentBundle = bundle;
619 parentBundles.add(bundle);
620
621 var _iteratorNormalCompletion3 = true;
622 var _didIteratorError3 = false;
623 var _iteratorError3 = undefined;
624
625 try {
626 for (var _iterator3 = asset.depAssets[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
627 let _ref3 = _step3.value;
628
629 var _ref4 = _slicedToArray(_ref3, 2);
630
631 let dep = _ref4[0];
632 let assetDep = _ref4[1];
633
634 this.createBundleTree(assetDep, dep, bundle, parentBundles);
635 }
636 } catch (err) {
637 _didIteratorError3 = true;
638 _iteratorError3 = err;
639 } finally {
640 try {
641 if (!_iteratorNormalCompletion3 && _iterator3.return) {
642 _iterator3.return();
643 }
644 } finally {
645 if (_didIteratorError3) {
646 throw _iteratorError3;
647 }
648 }
649 }
650
651 parentBundles.delete(bundle);
652 return bundle;
653 }
654
655 moveAssetToBundle(asset, commonBundle) {
656 // Never move the entry asset of a bundle, as it was explicitly requested to be placed in a separate bundle.
657 if (asset.parentBundle.entryAsset === asset) {
658 return;
659 }
660
661 var _iteratorNormalCompletion4 = true;
662 var _didIteratorError4 = false;
663 var _iteratorError4 = undefined;
664
665 try {
666 for (var _iterator4 = Array.from(asset.bundles)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
667 let bundle = _step4.value;
668
669 bundle.removeAsset(asset);
670 commonBundle.getSiblingBundle(bundle.type).addAsset(asset);
671 }
672 } catch (err) {
673 _didIteratorError4 = true;
674 _iteratorError4 = err;
675 } finally {
676 try {
677 if (!_iteratorNormalCompletion4 && _iterator4.return) {
678 _iterator4.return();
679 }
680 } finally {
681 if (_didIteratorError4) {
682 throw _iteratorError4;
683 }
684 }
685 }
686
687 let oldBundle = asset.parentBundle;
688 asset.parentBundle = commonBundle;
689
690 // Move all dependencies as well
691 var _iteratorNormalCompletion5 = true;
692 var _didIteratorError5 = false;
693 var _iteratorError5 = undefined;
694
695 try {
696 for (var _iterator5 = asset.depAssets.values()[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
697 let child = _step5.value;
698
699 if (child.parentBundle === oldBundle) {
700 this.moveAssetToBundle(child, commonBundle);
701 }
702 }
703 } catch (err) {
704 _didIteratorError5 = true;
705 _iteratorError5 = err;
706 } finally {
707 try {
708 if (!_iteratorNormalCompletion5 && _iterator5.return) {
709 _iterator5.return();
710 }
711 } finally {
712 if (_didIteratorError5) {
713 throw _iteratorError5;
714 }
715 }
716 }
717 }
718
719 *findOrphanAssets() {
720 var _iteratorNormalCompletion6 = true;
721 var _didIteratorError6 = false;
722 var _iteratorError6 = undefined;
723
724 try {
725 for (var _iterator6 = this.loadedAssets.values()[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
726 let asset = _step6.value;
727
728 if (!asset.parentBundle) {
729 yield asset;
730 }
731 }
732 } catch (err) {
733 _didIteratorError6 = true;
734 _iteratorError6 = err;
735 } finally {
736 try {
737 if (!_iteratorNormalCompletion6 && _iterator6.return) {
738 _iterator6.return();
739 }
740 } finally {
741 if (_didIteratorError6) {
742 throw _iteratorError6;
743 }
744 }
745 }
746 }
747
748 unloadOrphanedAssets() {
749 var _iteratorNormalCompletion7 = true;
750 var _didIteratorError7 = false;
751 var _iteratorError7 = undefined;
752
753 try {
754 for (var _iterator7 = this.findOrphanAssets()[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
755 let asset = _step7.value;
756
757 this.unloadAsset(asset);
758 }
759 } catch (err) {
760 _didIteratorError7 = true;
761 _iteratorError7 = err;
762 } finally {
763 try {
764 if (!_iteratorNormalCompletion7 && _iterator7.return) {
765 _iterator7.return();
766 }
767 } finally {
768 if (_didIteratorError7) {
769 throw _iteratorError7;
770 }
771 }
772 }
773 }
774
775 unloadAsset(asset) {
776 this.loadedAssets.delete(asset.name);
777 if (this.watcher) {
778 this.unwatch(asset.name, asset);
779
780 // Unwatch all included dependencies that map to this asset
781 var _iteratorNormalCompletion8 = true;
782 var _didIteratorError8 = false;
783 var _iteratorError8 = undefined;
784
785 try {
786 for (var _iterator8 = asset.dependencies.values()[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
787 let dep = _step8.value;
788
789 if (dep.includedInParent) {
790 this.unwatch(dep.name, asset);
791 }
792 }
793 } catch (err) {
794 _didIteratorError8 = true;
795 _iteratorError8 = err;
796 } finally {
797 try {
798 if (!_iteratorNormalCompletion8 && _iterator8.return) {
799 _iterator8.return();
800 }
801 } finally {
802 if (_didIteratorError8) {
803 throw _iteratorError8;
804 }
805 }
806 }
807 }
808 }
809
810 onChange(path) {
811 var _this10 = this;
812
813 return _asyncToGenerator(function* () {
814 let assets = _this10.watchedAssets.get(path);
815 if (!assets || !assets.size) {
816 return;
817 }
818
819 logger.clear();
820 logger.status(emoji.progress, `Building ${Path.basename(path)}...`);
821
822 // Add the asset to the rebuild queue, and reset the timeout.
823 var _iteratorNormalCompletion9 = true;
824 var _didIteratorError9 = false;
825 var _iteratorError9 = undefined;
826
827 try {
828 for (var _iterator9 = assets[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
829 let asset = _step9.value;
830
831 _this10.buildQueue.add(asset, true);
832 }
833 } catch (err) {
834 _didIteratorError9 = true;
835 _iteratorError9 = err;
836 } finally {
837 try {
838 if (!_iteratorNormalCompletion9 && _iterator9.return) {
839 _iterator9.return();
840 }
841 } finally {
842 if (_didIteratorError9) {
843 throw _iteratorError9;
844 }
845 }
846 }
847
848 clearTimeout(_this10.rebuildTimeout);
849
850 _this10.rebuildTimeout = setTimeout(_asyncToGenerator(function* () {
851 yield _this10.bundle();
852 }), 100);
853 })();
854 }
855
856 middleware() {
857 this.bundle();
858 return Server.middleware(this);
859 }
860
861 serve(port = 1234, https = false) {
862 var _this11 = this;
863
864 return _asyncToGenerator(function* () {
865 _this11.server = yield Server.serve(_this11, port, https);
866 _this11.bundle();
867 return _this11.server;
868 })();
869 }
870}
871
872module.exports = Bundler;
873Bundler.Asset = require('./Asset');
874Bundler.Packager = require('./packagers/Packager');
\No newline at end of file