UNPKG

3.5 kBJavaScriptView Raw
1'use strict';
2var assert = require('assert');
3
4var defaultOptions = {
5 publicPath: true
6};
7
8function isObject (v) {
9 return v !== null && v !== undefined && typeof v === 'object';
10}
11
12function isBoolean (v) {
13 return v === true || v === false;
14}
15
16function isString (v) {
17 return v !== null && v !== undefined && (typeof v === 'string' || v instanceof String);
18}
19
20function isArray (v) {
21 return Array.isArray(v);
22}
23
24function endsWith (v, ending) {
25 var lastIndex = v.lastIndexOf(ending);
26 return lastIndex !== -1 && lastIndex === v.length - ending.length;
27}
28
29function HtmlWebpackIncludeAssetsPlugin (options) {
30 assert(isObject(options), 'HtmlWebpackIncludeAssetsPlugin options are required');
31 var assets;
32 if (isString(options.assets)) {
33 assets = [options.assets];
34 } else {
35 assets = options.assets;
36 }
37 assert(isArray(assets), 'HtmlWebpackIncludeAssetsPlugin options must have an assets key with an array or string value');
38 var assetCount = assets.length;
39 var asset;
40 for (var i = 0; i < assetCount; i++) {
41 asset = assets[i];
42 assert(isString(asset), 'HtmlWebpackIncludeAssetsPlugin options assets key array should not contain non-strings (' + asset + ')');
43 assert(endsWith(asset, '.js') || endsWith(asset, '.css'),
44 'HtmlWebpackIncludeAssetsPlugin options assets key array should not contain strings not ending in .js or .css (' + asset + ')');
45 }
46 assert(isBoolean(options.append), 'HtmlWebpackIncludeAssetsPlugin options must have an append key with a boolean value');
47 var publicPath;
48 if (options.publicPath !== undefined) {
49 assert(isBoolean(options.publicPath) || isString(options.publicPath),
50 'HtmlWebpackIncludeAssetsPlugin options should specify a publicPath that is either a boolean or a string');
51 publicPath = options.publicPath;
52 } else {
53 publicPath = defaultOptions.publicPath;
54 }
55 this.options = {
56 assets: assets,
57 append: options.append,
58 publicPath: publicPath
59 };
60}
61
62HtmlWebpackIncludeAssetsPlugin.prototype.apply = function (compiler) {
63 var self = this;
64
65 // Hook into the html-webpack-plugin processing
66 compiler.plugin('compilation', function (compilation) {
67 compilation.plugin('html-webpack-plugin-before-html-generation', function (htmlPluginData, callback) {
68 var includeAssets = self.options.assets;
69 var appendAssets = self.options.append;
70 var publicPath = self.options.publicPath;
71 var assets = htmlPluginData.assets;
72 var includeAssetPrefix = publicPath === true ? assets.publicPath : isString(publicPath) ? publicPath : '';
73
74 if (includeAssets.constructor !== Array) {
75 includeAssets = [includeAssets];
76 }
77
78 var includeAsset;
79 var includeCount = includeAssets.length;
80 for (var i = 0; i < includeCount; i++) {
81 includeAsset = includeAssetPrefix + includeAssets[i];
82 if (endsWith(includeAsset, '.js')) {
83 if (assets.js.indexOf(includeAsset) === -1) {
84 if (appendAssets) {
85 assets.js.push(includeAsset);
86 } else {
87 assets.js.unshift(includeAsset);
88 }
89 }
90 } else if (endsWith(includeAsset, '.css')) {
91 if (assets.css.indexOf(includeAsset) === -1) {
92 if (appendAssets) {
93 assets.css.push(includeAsset);
94 } else {
95 assets.css.unshift(includeAsset);
96 }
97 }
98 }
99 }
100 callback(null);
101 });
102 });
103};
104
105module.exports = HtmlWebpackIncludeAssetsPlugin;