'use strict';
|
|
const debug = require('debug')('ScriptExt');
|
const separator = '/';
|
|
const isScript = (tag) => tag.tagName === 'script';
|
|
const isResourceLink = (tag) => tag.tagName === 'link' && tag.attributes && tag.attributes.as === 'script';
|
|
const hasScriptName = tag => {
|
if (isScript(tag)) {
|
return tag.attributes && tag.attributes.src;
|
} else if (isResourceLink(tag)) {
|
return tag.attributes && tag.attributes.href;
|
} else {
|
return false;
|
}
|
};
|
|
const getRawScriptName = tag => {
|
if (isScript(tag)) {
|
return (tag.attributes && tag.attributes.src) || '';
|
} else if (isResourceLink(tag)) {
|
return (tag.attributes && tag.attributes.href) || '';
|
} else {
|
return '';
|
}
|
};
|
|
const getPublicPath = options => {
|
const output = options.compilationOptions.output;
|
if (output) {
|
const publicPath = output.publicPath;
|
if (publicPath) {
|
return publicPath.endsWith(separator) ? publicPath : publicPath + separator;
|
}
|
}
|
};
|
|
const getScriptName = (options, tag) => {
|
let scriptName = getRawScriptName(tag);
|
const publicPath = getPublicPath(options);
|
if (publicPath) {
|
scriptName = scriptName.replace(publicPath, '');
|
}
|
if (options.htmlWebpackOptions.hash) {
|
scriptName = scriptName.split('?', 1)[0];
|
}
|
return scriptName;
|
};
|
|
const matches = (toMatch, matchers) => {
|
return matchers.some((matcher) => {
|
if (matcher instanceof RegExp) {
|
return matcher.test(toMatch);
|
} else {
|
return toMatch.includes(matcher);
|
}
|
});
|
};
|
|
module.exports = {
|
debug,
|
getPublicPath,
|
getRawScriptName,
|
getScriptName,
|
hasScriptName,
|
isResourceLink,
|
isScript,
|
matches
|
};
|