my-vite-plugin-dynamic-base
Version:
Resolve all resource files dynamic publicPath, like Webpack's __webpack_public_path__
95 lines • 3.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformHtml = exports.transformLegacyHtml = exports.transformAsset = exports.transformChunk = void 0;
const node_html_parser_1 = require("node-html-parser");
const utils_1 = require("./utils");
function transformChunk(format, code, options) {
const { base, publicPath } = options;
let content = (0, utils_1.replaceQuotes)(base, publicPath, code);
if (format === 'system') {
// replace css url
content = (0, utils_1.replaceUrl)(base, publicPath, content);
}
return content;
}
exports.transformChunk = transformChunk;
function transformAsset(code, options) {
const { assetsDir, base } = options;
let content = (0, utils_1.replace)(`${base}${assetsDir}/`, '', code);
content = (0, utils_1.replace)(base, '', content);
return content;
}
exports.transformAsset = transformAsset;
function transformLegacyHtml(code, options) {
const { base, publicPath } = options;
let content = (0, utils_1.replaceSrc)(publicPath, code);
content = (0, utils_1.replace)(base, '/', content);
content = (0, utils_1.replaceImport)(publicPath, content);
const document = (0, node_html_parser_1.parse)(content, { comment: true });
const legacyPolyfill = document.getElementById('vite-legacy-polyfill');
if (legacyPolyfill) {
legacyPolyfill.setAttribute('data-src', legacyPolyfill.getAttribute('src'));
legacyPolyfill.removeAttribute('src');
legacyPolyfill.innerHTML = `!(function() {
var e = document.createElement('script')
e.src = ${publicPath} + document.getElementById('vite-legacy-polyfill').getAttribute('data-src');
e.onload = function() {
System.import(${publicPath}+document.getElementById('vite-legacy-entry').getAttribute('data-src'))
};
document.body.appendChild(e)
})();`;
}
const legacyEntry = document.getElementById('vite-legacy-entry');
if (legacyEntry) {
legacyEntry.innerHTML = '';
}
content = document.outerHTML;
return content;
}
exports.transformLegacyHtml = transformLegacyHtml;
function transformHtml(html, options) {
const { base, publicPath } = options;
const document = (0, node_html_parser_1.parse)(html, { comment: true });
const baseMarker = `${base}`;
const assetsTags = document.querySelectorAll(`head>link[href^="${baseMarker}"],head>script[src^="${baseMarker}"]`);
const preloads = assetsTags.map(o => {
const result = {
parentTagName: o.parentNode.rawTagName,
tagName: o.rawTagName,
attrs: Object.assign({}, o.attrs, o.attrs.src ? { src: o.attrs.src.replace(baseMarker, '/') } : { href: o.attrs.href.replace(baseMarker, '/') })
};
o.parentNode.removeChild(o);
return result;
});
const injectCode = ` <script>
(function(){
var preloads = ${JSON.stringify(preloads)};
function setAttribute(target, attrs) {
for (var key in attrs) {
target.setAttribute(key, attrs[key]);
}
return target;
};
var childNodes = []
for(var i = 0; i < preloads.length; i++){
var item = preloads[i]
var childNode = document.createElement(item.tagName);
setAttribute(childNode, item.attrs)
if(${publicPath}) {
if(item.tagName == 'link') {
setAttribute(childNode, { href: ${publicPath} + item.attrs.href })
} else if (item.tagName == 'script') {
setAttribute(childNode, { src: ${publicPath} + item.attrs.src })
childNode.async = false
}
}
childNodes.push(childNode)
}
document.getElementsByTagName('head')[0].append(...childNodes)
})();
</script>
</head>`;
return document.outerHTML.replace('</head>', injectCode);
}
exports.transformHtml = transformHtml;
//# sourceMappingURL=transform.js.map