xiaofu-ruoyi-vue/node_modules/script-ext-html-webpack-plugin/lib/config.js

117 lines
2.9 KiB
JavaScript

'use strict';
const PLUGIN = require('./constants.js').PLUGIN;
const DEFAULT_HASH = {
test: []
};
const DEFAULT_RESOURCE_HINT_HASH = {
test: [],
chunks: 'initial'
};
const DEFAULT_CUSTOM_HASH = {
test: [],
attribute: '',
value: true
};
const DEFAULT_OPTIONS = {
inline: DEFAULT_HASH,
sync: DEFAULT_HASH,
async: DEFAULT_HASH,
defer: DEFAULT_HASH,
module: DEFAULT_HASH,
prefetch: DEFAULT_RESOURCE_HINT_HASH,
preload: DEFAULT_RESOURCE_HINT_HASH,
defaultAttribute: 'sync',
removeInlinedAssets: true,
custom: []
};
const POSSIBLE_VALUES = ['chunks', 'attribute', 'value'];
const normaliseOptions = options => {
if (!options) return DEFAULT_OPTIONS;
validate(options);
const normalised = Object.assign({}, DEFAULT_OPTIONS, options);
// now overwrite values which are not of DEFAULT_HASH form
Object.keys(options).forEach(key => {
const value = options[key];
switch (key) {
case 'inline':
case 'sync':
case 'async':
case 'defer':
case 'module':
normalised[key] = normaliseAttribute(value);
break;
case 'prefetch':
case 'preload':
normalised[key] = normaliseResourceHint(value);
break;
case 'custom':
normalised[key] = normaliseCustomArray(value);
break;
default:
break;
}
});
return normalised;
};
const validate = options => {
const failureTests = []; // TODO!
if (failureTests.some(test => test(options))) error();
};
const error = () => {
throw new Error(`${PLUGIN}: invalid configuration - please see https://github.com/numical/script-ext-html-webpack-plugin#configuration`);
};
const normaliseValue = (defaultProps, value) => {
const normalised = Object.assign({}, defaultProps);
if (value) {
normalised.test = convertToArray(value, () => {
if (typeof value === 'object') {
POSSIBLE_VALUES.forEach(key => copyValue(key, normalised, value));
if (value.test) {
return convertToArray(value.test, error);
} else {
error();
}
}
});
}
return normalised;
};
const normaliseAttribute = normaliseValue.bind(null, DEFAULT_HASH);
const normaliseResourceHint = normaliseValue.bind(null, DEFAULT_RESOURCE_HINT_HASH);
const normaliseCustomAttribute = normaliseValue.bind(null, DEFAULT_CUSTOM_HASH);
const normaliseCustomArray = value => {
const array = Array.isArray(value) ? value : [value];
return array.map(normaliseCustomAttribute);
};
const convertToArray = (value, elseFn) => {
if (typeof value === 'string') {
return [value];
} else if (value instanceof RegExp) {
return [value];
} else if (Array.isArray(value)) {
return value;
} else {
return elseFn();
}
};
const copyValue = (key, to, from) => {
if (Object.prototype.hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
};
module.exports = normaliseOptions;
module.exports.DEFAULT_OPTIONS = DEFAULT_OPTIONS;