style-ext-html-webpack-plugin-webpack-4
Version:
adapt style-ext-html-webpack for webpack 4 to extract css to inline style
59 lines (48 loc) • 1.89 kB
JavaScript
;
const common = require('./common.js');
const debug = common.debug;
const error = common.error;
const CSS_REGEX = /\.css$/;
const NO_FILES = {};
const validateCssFile = cssFilename => filename => filename === cssFilename;
const identifyCssFile = cssRegex => filename => (cssRegex || CSS_REGEX).test(filename);
const allFiles = () => true;
const onlyChunkFiles = (chunkNames, htmlWebpackPluginChunks, compilation) => {
// cannot use Array.prototype.includes < node v6
let matchingChunks = compilation.chunks.filter(chunk => chunkNames.indexOf(chunk.name) > -1);
if (htmlWebpackPluginChunks) {
matchingChunks = matchingChunks.filter(chunk => htmlWebpackPluginChunks.indexOf(chunk.name) > -1);
}
return matchingChunks.length > 0
? filename => matchingChunks.some(chunk => chunk.files.indexOf(filename) > -1)
: NO_FILES;
};
const findGeneratedCssFile = (fileMatcher, fileFilter, compilation) => {
const filenames = Object.keys(compilation.assets).filter(fileFilter);
let res = [];
for (let filename of filenames) {
if (fileMatcher(filename)) {
// debug(`CSS file in compilation: '${filename}'`);
// return filename;
res.push(filename);
}
}
// if (!res.length) {
// error(`could not find ExtractTextWebpackPlugin's generated .css file; available files: '${filenames.join()}'`);
// }
return res;
};
const findCssFile = (options, htmlWebpackPluginOptions, compilation) => {
const fileMatcher = (options.cssFilename)
? validateCssFile(options.cssFilename)
: identifyCssFile(options.cssRegExp);
const fileFilter = (options.chunks)
? onlyChunkFiles(options.chunks, htmlWebpackPluginOptions.chunks, compilation)
: allFiles;
if (fileFilter === NO_FILES) {
return null;
} else {
return findGeneratedCssFile(fileMatcher, fileFilter, compilation);
}
};
module.exports = findCssFile;