123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- var fs = require("fs");
- var loaderUtils = require("loader-utils");
- var NodeTemplatePlugin = require("webpack/lib/node/NodeTemplatePlugin");
- var NodeTargetPlugin = require("webpack/lib/node/NodeTargetPlugin");
- var LibraryTemplatePlugin = require("webpack/lib/LibraryTemplatePlugin");
- var SingleEntryPlugin = require("webpack/lib/SingleEntryPlugin");
- var LimitChunkCountPlugin = require("webpack/lib/optimize/LimitChunkCountPlugin");
- var NS = fs.realpathSync(__dirname);
- module.exports = function(source) {
- if(this.cacheable) this.cacheable();
- return source;
- };
- module.exports.pitch = function(request) {
- if(this.cacheable) this.cacheable();
- var query = loaderUtils.getOptions(this) || {};
- var loaders = this.loaders.slice(this.loaderIndex + 1);
- this.addDependency(this.resourcePath);
- // We already in child compiler, return empty bundle
- if(this[NS] === undefined) {
- throw new Error(
- '"extract-text-webpack-plugin" loader is used without the corresponding plugin, ' +
- 'refer to https://github.com/webpack/extract-text-webpack-plugin for the usage example'
- );
- } else if(this[NS] === false) {
- return "";
- } else if(this[NS](null, query)) {
- if(query.omit) {
- this.loaderIndex += +query.omit + 1;
- request = request.split("!").slice(+query.omit).join("!");
- loaders = loaders.slice(+query.omit);
- }
- var resultSource;
- if(query.remove) {
- resultSource = "// removed by extract-text-webpack-plugin";
- } else {
- resultSource = undefined;
- }
- var childFilename = "extract-text-webpack-plugin-output-filename"; // eslint-disable-line no-path-concat
- var publicPath = typeof query.publicPath === "string" ? query.publicPath : this._compilation.outputOptions.publicPath;
- var outputOptions = {
- filename: childFilename,
- publicPath: publicPath
- };
- var childCompiler = this._compilation.createChildCompiler("extract-text-webpack-plugin", outputOptions);
- childCompiler.apply(new NodeTemplatePlugin(outputOptions));
- childCompiler.apply(new LibraryTemplatePlugin(null, "commonjs2"));
- childCompiler.apply(new NodeTargetPlugin());
- childCompiler.apply(new SingleEntryPlugin(this.context, "!!" + request));
- childCompiler.apply(new LimitChunkCountPlugin({ maxChunks: 1 }));
- var subCache = "subcache " + NS + " " + request; // eslint-disable-line no-path-concat
- childCompiler.plugin("compilation", function(compilation) {
- if(compilation.cache) {
- if(!compilation.cache[subCache])
- compilation.cache[subCache] = {};
- compilation.cache = compilation.cache[subCache];
- }
- });
- // We set loaderContext[NS] = false to indicate we already in
- // a child compiler so we don't spawn another child compilers from there.
- childCompiler.plugin("this-compilation", function(compilation) {
- compilation.plugin("normal-module-loader", function(loaderContext, module) {
- loaderContext[NS] = false;
- if (module.request === request) {
- module.loaders = loaders.map(function(loader) {
- return {
- loader: loader.path,
- options: loader.options
- };
- });
- }
- });
- });
- var source;
- childCompiler.plugin("after-compile", function(compilation, callback) {
- source = compilation.assets[childFilename] && compilation.assets[childFilename].source();
- // Remove all chunk assets
- compilation.chunks.forEach(function(chunk) {
- chunk.files.forEach(function(file) {
- delete compilation.assets[file];
- });
- });
- callback();
- });
- var callback = this.async();
- childCompiler.runAsChild(function(err, entries, compilation) {
- if(err) return callback(err);
- if(compilation.errors.length > 0) {
- return callback(compilation.errors[0]);
- }
- compilation.fileDependencies.forEach(function(dep) {
- this.addDependency(dep);
- }, this);
- compilation.contextDependencies.forEach(function(dep) {
- this.addContextDependency(dep);
- }, this);
- if(!source) {
- return callback(new Error("Didn't get a result from child compiler"));
- }
- try {
- var text = this.exec(source, request);
- if(typeof text === "string")
- text = [[0, text]];
- text.forEach(function(item) {
- var id = item[0];
- compilation.modules.forEach(function(module) {
- if(module.id === id)
- item[0] = module.identifier();
- });
- });
- this[NS](text, query);
- if(text.locals && typeof resultSource !== "undefined") {
- resultSource += "\nmodule.exports = " + JSON.stringify(text.locals) + ";";
- }
- } catch(e) {
- return callback(e);
- }
- if(resultSource)
- callback(null, resultSource);
- else
- callback();
- }.bind(this));
- }
- };
|