93 lines
2.8 KiB
JavaScript
93 lines
2.8 KiB
JavaScript
/*
|
|
* Copyright 2016 The Closure Compiler Authors.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
/**
|
|
* @fileoverview Webpack plugin for Closure Compiler.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
function formatMessage(msg) {
|
|
let formatted = `(${msg.type}) ${msg.description}`;
|
|
|
|
if (msg.file && msg.lineNo >= 0) {
|
|
formatted = `${msg.file}:${msg.lineNo} ${formatted}`;
|
|
}
|
|
|
|
return formatted;
|
|
}
|
|
|
|
module.exports = function(args) {
|
|
const compile = require('../compile');
|
|
const RawSource = require('webpack-core/lib/RawSource');
|
|
const SourceMapSource = require('webpack-core/lib/SourceMapSource');
|
|
|
|
args.test = args && args.test ? new RegExp(args.test) : /\.js($|\?)/i;
|
|
|
|
this.apply = function(compiler) {
|
|
compiler.plugin('compilation', compilation => {
|
|
compilation.plugin('normal-module-loader', context => {
|
|
context.minimize = true;
|
|
});
|
|
|
|
compilation.plugin('optimize-chunk-assets', (chunks, callback) => {
|
|
chunks.forEach(chunk => {
|
|
const files = chunk.files.filter(name => args.test.test(name));
|
|
files.forEach(name => {
|
|
const options = args && args.options ? args.options : {}; // TODO
|
|
|
|
const asset = compilation.assets[name];
|
|
const sourceMap = asset.map();
|
|
const file = {
|
|
path: name,
|
|
src: asset.source(),
|
|
sourceMap: sourceMap ? JSON.stringify(sourceMap) : undefined,
|
|
};
|
|
options.jsCode = [file];
|
|
|
|
const output = compile(options);
|
|
|
|
output.errors.forEach(msg => {
|
|
compilation.errors.push(new Error(formatMessage(msg)));
|
|
});
|
|
|
|
output.warnings.forEach(msg => {
|
|
compilation.warnings.push(new Error(formatMessage(msg)));
|
|
});
|
|
|
|
if (output.errors.length > 0) {
|
|
return; // don't save compilation
|
|
}
|
|
|
|
let result;
|
|
if (output.sourceMap) {
|
|
result = new SourceMapSource(
|
|
output.compiledCode, name, JSON.parse(output.sourceMap), file.src, file.sourceMap);
|
|
} else {
|
|
result = new RawSource(output.compiledCode);
|
|
}
|
|
compilation.assets[name] = result;
|
|
});
|
|
});
|
|
|
|
callback();
|
|
});
|
|
|
|
});
|
|
};
|
|
|
|
};
|