'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;
|