'use strict'; const CHUNK_OPTIONS = ['all', 'async']; const getPublicPath = require('./common.js').getPublicPath; const createResourceHint = require('./resource-hints.js').createResourceHint; const matches = require('./common.js').matches; const addAsyncChunkResourceHints = (chunks, options) => { const getRef = generateRef(options); const hints = []; chunks .filter(chunk => !isInitial(chunk)) .reduce( (files, chunk) => files.concat(chunk.files), []) .forEach(file => { if (optionsMatch(options.preload, file)) { hints.push(createResourceHint('preload', getRef(file))); } else if (optionsMatch(options.prefetch, file)) { hints.push(createResourceHint('prefetch', getRef(file))); } }); return hints; }; const isInitial = chunk => chunk.canBeInitial ? chunk.canBeInitial() : chunk.isInitial ? chunk.isInitial() : chunk.isInitial; const optionsMatch = (option, file) => { return matches(option.chunks, CHUNK_OPTIONS) && matches(file, option.test); }; const generateRef = options => { const publicPath = getPublicPath(options); return publicPath ? file => publicPath + file : file => file; }; module.exports = addAsyncChunkResourceHints;