123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- '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) => {
- let 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 (from.hasOwnProperty(key)) {
- to[key] = from[key];
- }
- };
- module.exports = normaliseOptions;
- module.exports.DEFAULT_OPTIONS = DEFAULT_OPTIONS;
|