From 363723fc84f7b8477592e0105aeb331ec9a017af Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 14 Aug 2017 05:01:11 +0200 Subject: node_modules --- node_modules/webpack/lib/Compiler.js | 875 ++++++++++++++++++----------------- 1 file changed, 450 insertions(+), 425 deletions(-) (limited to 'node_modules/webpack/lib/Compiler.js') diff --git a/node_modules/webpack/lib/Compiler.js b/node_modules/webpack/lib/Compiler.js index dc17a89f3..8e3118a8c 100644 --- a/node_modules/webpack/lib/Compiler.js +++ b/node_modules/webpack/lib/Compiler.js @@ -2,503 +2,528 @@ MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ -var path = require("path"); -var Tapable = require("tapable"); - -var Compilation = require("./Compilation"); -var Stats = require("./Stats"); -var NormalModuleFactory = require("./NormalModuleFactory"); -var ContextModuleFactory = require("./ContextModuleFactory"); - -function Watching(compiler, watchOptions, handler) { - this.startTime = null; - this.invalid = false; - this.handler = handler; - this.closed = false; - if(typeof watchOptions === "number") { - this.watchOptions = { - aggregateTimeout: watchOptions - }; - } else if(watchOptions && typeof watchOptions === "object") { - this.watchOptions = Object.assign({}, watchOptions); - } else { - this.watchOptions = {}; +"use strict"; + +const path = require("path"); +const Tapable = require("tapable"); + +const Compilation = require("./Compilation"); +const Stats = require("./Stats"); +const NormalModuleFactory = require("./NormalModuleFactory"); +const ContextModuleFactory = require("./ContextModuleFactory"); + +const makePathsRelative = require("./util/identifier").makePathsRelative; + +class Watching { + constructor(compiler, watchOptions, handler) { + this.startTime = null; + this.invalid = false; + this.handler = handler; + this.callbacks = []; + this.closed = false; + if(typeof watchOptions === "number") { + this.watchOptions = { + aggregateTimeout: watchOptions + }; + } else if(watchOptions && typeof watchOptions === "object") { + this.watchOptions = Object.assign({}, watchOptions); + } else { + this.watchOptions = {}; + } + this.watchOptions.aggregateTimeout = this.watchOptions.aggregateTimeout || 200; + this.compiler = compiler; + this.running = true; + this.compiler.readRecords(err => { + if(err) return this._done(err); + + this._go(); + }); } - this.watchOptions.aggregateTimeout = this.watchOptions.aggregateTimeout || 200; - this.compiler = compiler; - this.running = true; - this.compiler.readRecords(function(err) { - if(err) return this._done(err); - - this._go(); - }.bind(this)); -} -Watching.prototype._go = function() { - var self = this; - self.startTime = Date.now(); - self.running = true; - self.invalid = false; - self.compiler.applyPluginsAsync("watch-run", self, function(err) { - if(err) return self._done(err); - self.compiler.compile(function onCompiled(err, compilation) { - if(err) return self._done(err); - if(self.invalid) return self._done(); - - if(self.compiler.applyPluginsBailResult("should-emit", compilation) === false) { - return self._done(null, compilation); - } + _go() { + this.startTime = Date.now(); + this.running = true; + this.invalid = false; + this.compiler.applyPluginsAsync("watch-run", this, err => { + if(err) return this._done(err); + const onCompiled = (err, compilation) => { + if(err) return this._done(err); + if(this.invalid) return this._done(); + + if(this.compiler.applyPluginsBailResult("should-emit", compilation) === false) { + return this._done(null, compilation); + } - self.compiler.emitAssets(compilation, function(err) { - if(err) return self._done(err); - if(self.invalid) return self._done(); + this.compiler.emitAssets(compilation, err => { + if(err) return this._done(err); + if(this.invalid) return this._done(); - self.compiler.emitRecords(function(err) { - if(err) return self._done(err); + this.compiler.emitRecords(err => { + if(err) return this._done(err); - if(compilation.applyPluginsBailResult("need-additional-pass")) { - compilation.needAdditionalPass = true; + if(compilation.applyPluginsBailResult("need-additional-pass")) { + compilation.needAdditionalPass = true; - var stats = new Stats(compilation); - stats.startTime = self.startTime; - stats.endTime = Date.now(); - self.compiler.applyPlugins("done", stats); + const stats = new Stats(compilation); + stats.startTime = this.startTime; + stats.endTime = Date.now(); + this.compiler.applyPlugins("done", stats); - self.compiler.applyPluginsAsync("additional-pass", function(err) { - if(err) return self._done(err); - self.compiler.compile(onCompiled); - }); - return; - } - return self._done(null, compilation); + this.compiler.applyPluginsAsync("additional-pass", err => { + if(err) return this._done(err); + this.compiler.compile(onCompiled); + }); + return; + } + return this._done(null, compilation); + }); }); - }); + }; + this.compiler.compile(onCompiled); }); - }); -}; - -Watching.prototype._getStats = function(compilation) { - var stats = new Stats(compilation); - stats.startTime = this.startTime; - stats.endTime = Date.now(); - return stats; -}; - -Watching.prototype._done = function(err, compilation) { - this.running = false; - if(this.invalid) return this._go(); - - var stats = compilation ? this._getStats(compilation) : null; - if(err) { - this.compiler.applyPlugins("failed", err); - this.handler(err, stats); - return; } - this.compiler.applyPlugins("done", stats); - this.handler(null, stats); - if(!this.closed) { - this.watch(compilation.fileDependencies, compilation.contextDependencies, compilation.missingDependencies); - } -}; - -Watching.prototype.watch = function(files, dirs, missing) { - this.pausedWatcher = null; - this.watcher = this.compiler.watchFileSystem.watch(files, dirs, missing, this.startTime, this.watchOptions, function(err, filesModified, contextModified, missingModified, fileTimestamps, contextTimestamps) { - this.pausedWatcher = this.watcher; - this.watcher = null; - if(err) return this.handler(err); - - this.compiler.fileTimestamps = fileTimestamps; - this.compiler.contextTimestamps = contextTimestamps; - this.invalidate(); - }.bind(this), function(fileName, changeTime) { - this.compiler.applyPlugins("invalid", fileName, changeTime); - }.bind(this)); -}; - -Watching.prototype.invalidate = function() { - if(this.watcher) { - this.pausedWatcher = this.watcher; - this.watcher.pause(); - this.watcher = null; + _getStats(compilation) { + const stats = new Stats(compilation); + stats.startTime = this.startTime; + stats.endTime = Date.now(); + return stats; } - if(this.running) { - this.invalid = true; - return false; - } else { - this._go(); - } -}; - -Watching.prototype.close = function(callback) { - if(callback === undefined) callback = function() {}; - this.closed = true; - if(this.watcher) { - this.watcher.close(); - this.watcher = null; + _done(err, compilation) { + this.running = false; + if(this.invalid) return this._go(); + + const stats = compilation ? this._getStats(compilation) : null; + if(err) { + this.compiler.applyPlugins("failed", err); + this.handler(err, stats); + return; + } + + this.compiler.applyPlugins("done", stats); + this.handler(null, stats); + if(!this.closed) { + this.watch(compilation.fileDependencies, compilation.contextDependencies, compilation.missingDependencies); + } + this.callbacks.forEach(cb => cb()); + this.callbacks.length = 0; } - if(this.pausedWatcher) { - this.pausedWatcher.close(); + + watch(files, dirs, missing) { this.pausedWatcher = null; + this.watcher = this.compiler.watchFileSystem.watch(files, dirs, missing, this.startTime, this.watchOptions, (err, filesModified, contextModified, missingModified, fileTimestamps, contextTimestamps) => { + this.pausedWatcher = this.watcher; + this.watcher = null; + if(err) return this.handler(err); + + this.compiler.fileTimestamps = fileTimestamps; + this.compiler.contextTimestamps = contextTimestamps; + this.invalidate(); + }, (fileName, changeTime) => { + this.compiler.applyPlugins("invalid", fileName, changeTime); + }); + } + + invalidate(callback) { + if(callback) { + this.callbacks.push(callback); + } + if(this.watcher) { + this.pausedWatcher = this.watcher; + this.watcher.pause(); + this.watcher = null; + } + if(this.running) { + this.invalid = true; + return false; + } else { + this._go(); + } } - if(this.running) { - this.invalid = true; - this._done = () => { + + close(callback) { + if(callback === undefined) callback = function() {}; + + this.closed = true; + if(this.watcher) { + this.watcher.close(); + this.watcher = null; + } + if(this.pausedWatcher) { + this.pausedWatcher.close(); + this.pausedWatcher = null; + } + if(this.running) { + this.invalid = true; + this._done = () => { + this.compiler.applyPlugins("watch-close"); + callback(); + }; + } else { this.compiler.applyPlugins("watch-close"); callback(); - }; - } else { - this.compiler.applyPlugins("watch-close"); - callback(); + } } -}; - -function Compiler() { - Tapable.call(this); - - this.outputPath = ""; - this.outputFileSystem = null; - this.inputFileSystem = null; - - this.recordsInputPath = null; - this.recordsOutputPath = null; - this.records = {}; - - this.fileTimestamps = {}; - this.contextTimestamps = {}; - - this.resolvers = { - normal: null, - loader: null, - context: null - }; - var deprecationReported = false; - this.parser = { - plugin: function(hook, fn) { - if(!deprecationReported) { - console.warn("webpack: Using compiler.parser is deprecated.\n" + - "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.plugin(/* ... */); });\n}); instead. " + - "It was called " + new Error().stack.split("\n")[2].trim() + "."); - deprecationReported = true; - } - this.plugin("compilation", function(compilation, data) { - data.normalModuleFactory.plugin("parser", function(parser) { - parser.plugin(hook, fn); - }); - }); - }.bind(this), - apply: function() { - var args = arguments; - if(!deprecationReported) { - console.warn("webpack: Using compiler.parser is deprecated.\n" + - "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.apply(/* ... */); });\n}); instead. " + - "It was called " + new Error().stack.split("\n")[2].trim() + "."); - deprecationReported = true; - } - this.plugin("compilation", function(compilation, data) { - data.normalModuleFactory.plugin("parser", function(parser) { - parser.apply.apply(parser, args); - }); - }); - }.bind(this) - }; - - this.options = {}; } -module.exports = Compiler; -Compiler.prototype = Object.create(Tapable.prototype); -Compiler.prototype.constructor = Compiler; +class Compiler extends Tapable { + constructor() { + super(); + this.outputPath = ""; + this.outputFileSystem = null; + this.inputFileSystem = null; -Compiler.Watching = Watching; -Compiler.prototype.watch = function(watchOptions, handler) { - this.fileTimestamps = {}; - this.contextTimestamps = {}; - var watching = new Watching(this, watchOptions, handler); - return watching; -}; + this.recordsInputPath = null; + this.recordsOutputPath = null; + this.records = {}; + + this.fileTimestamps = {}; + this.contextTimestamps = {}; -Compiler.prototype.run = function(callback) { - var self = this; - var startTime = Date.now(); + this.resolvers = { + normal: null, + loader: null, + context: null + }; + let deprecationReported = false; + this.parser = { + plugin: (hook, fn) => { + if(!deprecationReported) { + console.warn("webpack: Using compiler.parser is deprecated.\n" + + "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.plugin(/* ... */); });\n}); instead. " + + "It was called " + new Error().stack.split("\n")[2].trim() + "."); + deprecationReported = true; + } + this.plugin("compilation", (compilation, data) => { + data.normalModuleFactory.plugin("parser", parser => { + parser.plugin(hook, fn); + }); + }); + }, + apply: () => { + const args = arguments; + if(!deprecationReported) { + console.warn("webpack: Using compiler.parser is deprecated.\n" + + "Use compiler.plugin(\"compilation\", function(compilation, data) {\n data.normalModuleFactory.plugin(\"parser\", function(parser, options) { parser.apply(/* ... */); });\n}); instead. " + + "It was called " + new Error().stack.split("\n")[2].trim() + "."); + deprecationReported = true; + } + this.plugin("compilation", (compilation, data) => { + data.normalModuleFactory.plugin("parser", parser => { + parser.apply.apply(parser, args); + }); + }); + } + }; - self.applyPluginsAsync("before-run", self, function(err) { - if(err) return callback(err); + this.options = {}; + } + + watch(watchOptions, handler) { + this.fileTimestamps = {}; + this.contextTimestamps = {}; + const watching = new Watching(this, watchOptions, handler); + return watching; + } + + run(callback) { + const startTime = Date.now(); - self.applyPluginsAsync("run", self, function(err) { + const onCompiled = (err, compilation) => { if(err) return callback(err); - self.readRecords(function(err) { + if(this.applyPluginsBailResult("should-emit", compilation) === false) { + const stats = new Stats(compilation); + stats.startTime = startTime; + stats.endTime = Date.now(); + this.applyPlugins("done", stats); + return callback(null, stats); + } + + this.emitAssets(compilation, err => { if(err) return callback(err); - self.compile(function onCompiled(err, compilation) { - if(err) return callback(err); + if(compilation.applyPluginsBailResult("need-additional-pass")) { + compilation.needAdditionalPass = true; - if(self.applyPluginsBailResult("should-emit", compilation) === false) { - var stats = new Stats(compilation); - stats.startTime = startTime; - stats.endTime = Date.now(); - self.applyPlugins("done", stats); - return callback(null, stats); - } + const stats = new Stats(compilation); + stats.startTime = startTime; + stats.endTime = Date.now(); + this.applyPlugins("done", stats); - self.emitAssets(compilation, function(err) { + this.applyPluginsAsync("additional-pass", err => { if(err) return callback(err); + this.compile(onCompiled); + }); + return; + } - if(compilation.applyPluginsBailResult("need-additional-pass")) { - compilation.needAdditionalPass = true; + this.emitRecords(err => { + if(err) return callback(err); - var stats = new Stats(compilation); - stats.startTime = startTime; - stats.endTime = Date.now(); - self.applyPlugins("done", stats); + const stats = new Stats(compilation); + stats.startTime = startTime; + stats.endTime = Date.now(); + this.applyPlugins("done", stats); + return callback(null, stats); + }); + }); + }; - self.applyPluginsAsync("additional-pass", function(err) { - if(err) return callback(err); - self.compile(onCompiled); - }); - return; - } + this.applyPluginsAsync("before-run", this, err => { + if(err) return callback(err); - self.emitRecords(function(err) { - if(err) return callback(err); + this.applyPluginsAsync("run", this, err => { + if(err) return callback(err); - var stats = new Stats(compilation); - stats.startTime = startTime; - stats.endTime = Date.now(); - self.applyPlugins("done", stats); - return callback(null, stats); - }); - }); + this.readRecords(err => { + if(err) return callback(err); + + this.compile(onCompiled); }); }); }); - }); -}; - -Compiler.prototype.runAsChild = function(callback) { - this.compile(function(err, compilation) { - if(err) return callback(err); - - this.parentCompilation.children.push(compilation); - Object.keys(compilation.assets).forEach(function(name) { - this.parentCompilation.assets[name] = compilation.assets[name]; - }.bind(this)); - - var entries = Object.keys(compilation.entrypoints).map(function(name) { - return compilation.entrypoints[name].chunks; - }).reduce(function(array, chunks) { - return array.concat(chunks); - }, []); - - return callback(null, entries, compilation); - }.bind(this)); -}; - -Compiler.prototype.purgeInputFileSystem = function() { - if(this.inputFileSystem && this.inputFileSystem.purge) - this.inputFileSystem.purge(); -}; - -Compiler.prototype.emitAssets = function(compilation, callback) { - var outputPath; - - this.applyPluginsAsync("emit", compilation, function(err) { - if(err) return callback(err); - outputPath = compilation.getPath(this.outputPath); - this.outputFileSystem.mkdirp(outputPath, emitFiles.bind(this)); - }.bind(this)); - - function emitFiles(err) { - if(err) return callback(err); - - require("async").forEach(Object.keys(compilation.assets), function(file, callback) { - - var targetFile = file; - var queryStringIdx = targetFile.indexOf("?"); - if(queryStringIdx >= 0) { - targetFile = targetFile.substr(0, queryStringIdx); - } + } - if(targetFile.match(/\/|\\/)) { - var dir = path.dirname(targetFile); - this.outputFileSystem.mkdirp(this.outputFileSystem.join(outputPath, dir), writeOut.bind(this)); - } else writeOut.call(this); + runAsChild(callback) { + this.compile((err, compilation) => { + if(err) return callback(err); - function writeOut(err) { - if(err) return callback(err); - var targetPath = this.outputFileSystem.join(outputPath, targetFile); - var source = compilation.assets[file]; - if(source.existsAt === targetPath) { - source.emitted = false; - return callback(); - } - var content = source.source(); + this.parentCompilation.children.push(compilation); + Object.keys(compilation.assets).forEach(name => { + this.parentCompilation.assets[name] = compilation.assets[name]; + }); + + const entries = Object.keys(compilation.entrypoints).map(name => { + return compilation.entrypoints[name].chunks; + }).reduce((array, chunks) => { + return array.concat(chunks); + }, []); + + return callback(null, entries, compilation); + }); + } + + purgeInputFileSystem() { + if(this.inputFileSystem && this.inputFileSystem.purge) + this.inputFileSystem.purge(); + } + + emitAssets(compilation, callback) { + let outputPath; + + const emitFiles = (err) => { + if(err) return callback(err); - if(!Buffer.isBuffer(content)) { - content = new Buffer(content, "utf8"); //eslint-disable-line + require("async").forEach(Object.keys(compilation.assets), (file, callback) => { + + let targetFile = file; + const queryStringIdx = targetFile.indexOf("?"); + if(queryStringIdx >= 0) { + targetFile = targetFile.substr(0, queryStringIdx); } - source.existsAt = targetPath; - source.emitted = true; - this.outputFileSystem.writeFile(targetPath, content, callback); - } + const writeOut = (err) => { + if(err) return callback(err); + const targetPath = this.outputFileSystem.join(outputPath, targetFile); + const source = compilation.assets[file]; + if(source.existsAt === targetPath) { + source.emitted = false; + return callback(); + } + let content = source.source(); + + if(!Buffer.isBuffer(content)) { + content = new Buffer(content, "utf8"); // eslint-disable-line + } + + source.existsAt = targetPath; + source.emitted = true; + this.outputFileSystem.writeFile(targetPath, content, callback); + }; + + if(targetFile.match(/\/|\\/)) { + const dir = path.dirname(targetFile); + this.outputFileSystem.mkdirp(this.outputFileSystem.join(outputPath, dir), writeOut); + } else writeOut(); - }.bind(this), function(err) { + }, err => { + if(err) return callback(err); + + afterEmit.call(this); + }); + }; + + this.applyPluginsAsync("emit", compilation, err => { if(err) return callback(err); + outputPath = compilation.getPath(this.outputPath); + this.outputFileSystem.mkdirp(outputPath, emitFiles); + }); + + function afterEmit() { + this.applyPluginsAsyncSeries1("after-emit", compilation, err => { + if(err) return callback(err); + + return callback(); + }); + } - afterEmit.call(this); - }.bind(this)); } - function afterEmit() { - this.applyPluginsAsyncSeries1("after-emit", compilation, function(err) { + emitRecords(callback) { + if(!this.recordsOutputPath) return callback(); + const idx1 = this.recordsOutputPath.lastIndexOf("/"); + const idx2 = this.recordsOutputPath.lastIndexOf("\\"); + let recordsOutputPathDirectory = null; + if(idx1 > idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1); + if(idx1 < idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2); + if(!recordsOutputPathDirectory) return writeFile.call(this); + this.outputFileSystem.mkdirp(recordsOutputPathDirectory, err => { if(err) return callback(err); + writeFile.call(this); + }); + + function writeFile() { + this.outputFileSystem.writeFile(this.recordsOutputPath, JSON.stringify(this.records, undefined, 2), callback); + } + } + readRecords(callback) { + if(!this.recordsInputPath) { + this.records = {}; return callback(); + } + this.inputFileSystem.stat(this.recordsInputPath, err => { + // It doesn't exist + // We can ignore this. + if(err) return callback(); + + this.inputFileSystem.readFile(this.recordsInputPath, (err, content) => { + if(err) return callback(err); + + try { + this.records = JSON.parse(content.toString("utf-8")); + } catch(e) { + e.message = "Cannot parse records: " + e.message; + return callback(e); + } + + return callback(); + }); }); } -}; - -Compiler.prototype.emitRecords = function emitRecords(callback) { - if(!this.recordsOutputPath) return callback(); - var idx1 = this.recordsOutputPath.lastIndexOf("/"); - var idx2 = this.recordsOutputPath.lastIndexOf("\\"); - var recordsOutputPathDirectory = null; - if(idx1 > idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1); - if(idx1 < idx2) recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2); - if(!recordsOutputPathDirectory) return writeFile.call(this); - this.outputFileSystem.mkdirp(recordsOutputPathDirectory, function(err) { - if(err) return callback(err); - writeFile.call(this); - }.bind(this)); - - function writeFile() { - this.outputFileSystem.writeFile(this.recordsOutputPath, JSON.stringify(this.records, undefined, 2), callback); + createChildCompiler(compilation, compilerName, compilerIndex, outputOptions, plugins) { + const childCompiler = new Compiler(); + if(Array.isArray(plugins)) { + plugins.forEach(plugin => childCompiler.apply(plugin)); + } + for(const name in this._plugins) { + if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0) + childCompiler._plugins[name] = this._plugins[name].slice(); + } + childCompiler.name = compilerName; + childCompiler.outputPath = this.outputPath; + childCompiler.inputFileSystem = this.inputFileSystem; + childCompiler.outputFileSystem = null; + childCompiler.resolvers = this.resolvers; + childCompiler.fileTimestamps = this.fileTimestamps; + childCompiler.contextTimestamps = this.contextTimestamps; + + const relativeCompilerName = makePathsRelative(this.context, compilerName); + if(!this.records[relativeCompilerName]) this.records[relativeCompilerName] = []; + if(this.records[relativeCompilerName][compilerIndex]) + childCompiler.records = this.records[relativeCompilerName][compilerIndex]; + else + this.records[relativeCompilerName].push(childCompiler.records = {}); + + if(this.cache) { + if(!this.cache.children) this.cache.children = {}; + if(!this.cache.children[compilerName]) this.cache.children[compilerName] = []; + if(this.cache.children[compilerName][compilerIndex]) + childCompiler.cache = this.cache.children[compilerName][compilerIndex]; + else + this.cache.children[compilerName].push(childCompiler.cache = {}); + } + + childCompiler.options = Object.create(this.options); + childCompiler.options.output = Object.create(childCompiler.options.output); + for(const name in outputOptions) { + childCompiler.options.output[name] = outputOptions[name]; + } + childCompiler.parentCompilation = compilation; + return childCompiler; } -}; -Compiler.prototype.readRecords = function readRecords(callback) { - var self = this; - if(!self.recordsInputPath) { - self.records = {}; - return callback(); + isChild() { + return !!this.parentCompilation; } - self.inputFileSystem.stat(self.recordsInputPath, function(err) { - // It doesn't exist - // We can ignore self. - if(err) return callback(); - - self.inputFileSystem.readFile(self.recordsInputPath, function(err, content) { - if(err) return callback(err); - try { - self.records = JSON.parse(content.toString("utf-8")); - } catch(e) { - e.message = "Cannot parse records: " + e.message; - return callback(e); - } + createCompilation() { + return new Compilation(this); + } - return callback(); - }); - }); -}; + newCompilation(params) { + const compilation = this.createCompilation(); + compilation.fileTimestamps = this.fileTimestamps; + compilation.contextTimestamps = this.contextTimestamps; + compilation.name = this.name; + compilation.records = this.records; + compilation.compilationDependencies = params.compilationDependencies; + this.applyPlugins("this-compilation", compilation, params); + this.applyPlugins("compilation", compilation, params); + return compilation; + } -Compiler.prototype.createChildCompiler = function(compilation, compilerName, outputOptions, plugins) { - var childCompiler = new Compiler(); - if(Array.isArray(plugins)) { - plugins.forEach(plugin => childCompiler.apply(plugin)); + createNormalModuleFactory() { + const normalModuleFactory = new NormalModuleFactory(this.options.context, this.resolvers, this.options.module || {}); + this.applyPlugins("normal-module-factory", normalModuleFactory); + return normalModuleFactory; } - for(var name in this._plugins) { - if(["make", "compile", "emit", "after-emit", "invalid", "done", "this-compilation"].indexOf(name) < 0) - childCompiler._plugins[name] = this._plugins[name].slice(); + + createContextModuleFactory() { + const contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem); + this.applyPlugins("context-module-factory", contextModuleFactory); + return contextModuleFactory; } - childCompiler.name = compilerName; - childCompiler.outputPath = this.outputPath; - childCompiler.inputFileSystem = this.inputFileSystem; - childCompiler.outputFileSystem = null; - childCompiler.resolvers = this.resolvers; - childCompiler.fileTimestamps = this.fileTimestamps; - childCompiler.contextTimestamps = this.contextTimestamps; - if(!this.records[compilerName]) this.records[compilerName] = []; - this.records[compilerName].push(childCompiler.records = {}); - childCompiler.options = Object.create(this.options); - childCompiler.options.output = Object.create(childCompiler.options.output); - for(name in outputOptions) { - childCompiler.options.output[name] = outputOptions[name]; + + newCompilationParams() { + const params = { + normalModuleFactory: this.createNormalModuleFactory(), + contextModuleFactory: this.createContextModuleFactory(), + compilationDependencies: [] + }; + return params; } - childCompiler.parentCompilation = compilation; - return childCompiler; -}; - -Compiler.prototype.isChild = function() { - return !!this.parentCompilation; -}; - -Compiler.prototype.createCompilation = function() { - return new Compilation(this); -}; - -Compiler.prototype.newCompilation = function(params) { - var compilation = this.createCompilation(); - compilation.fileTimestamps = this.fileTimestamps; - compilation.contextTimestamps = this.contextTimestamps; - compilation.name = this.name; - compilation.records = this.records; - compilation.compilationDependencies = params.compilationDependencies; - this.applyPlugins("this-compilation", compilation, params); - this.applyPlugins("compilation", compilation, params); - return compilation; -}; - -Compiler.prototype.createNormalModuleFactory = function() { - var normalModuleFactory = new NormalModuleFactory(this.options.context, this.resolvers, this.options.module || {}); - this.applyPlugins("normal-module-factory", normalModuleFactory); - return normalModuleFactory; -}; - -Compiler.prototype.createContextModuleFactory = function() { - var contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem); - this.applyPlugins("context-module-factory", contextModuleFactory); - return contextModuleFactory; -}; - -Compiler.prototype.newCompilationParams = function() { - var params = { - normalModuleFactory: this.createNormalModuleFactory(), - contextModuleFactory: this.createContextModuleFactory(), - compilationDependencies: [] - }; - return params; -}; - -Compiler.prototype.compile = function(callback) { - var self = this; - var params = self.newCompilationParams(); - self.applyPluginsAsync("before-compile", params, function(err) { - if(err) return callback(err); - - self.applyPlugins("compile", params); - - var compilation = self.newCompilation(params); - - self.applyPluginsParallel("make", compilation, function(err) { + + compile(callback) { + const params = this.newCompilationParams(); + this.applyPluginsAsync("before-compile", params, err => { if(err) return callback(err); - compilation.finish(); + this.applyPlugins("compile", params); - compilation.seal(function(err) { + const compilation = this.newCompilation(params); + + this.applyPluginsParallel("make", compilation, err => { if(err) return callback(err); - self.applyPluginsAsync("after-compile", compilation, function(err) { + compilation.finish(); + + compilation.seal(err => { if(err) return callback(err); - return callback(null, compilation); + this.applyPluginsAsync("after-compile", compilation, err => { + if(err) return callback(err); + + return callback(null, compilation); + }); }); }); }); - }); -}; + } +} + +Compiler.Watching = Watching; +module.exports = Compiler; -- cgit v1.2.3