UNPKG

my-vite-plugin-dynamic-base

Version:

Resolve all resource files dynamic publicPath, like Webpack's __webpack_public_path__

95 lines 3.76 kB
"use strict"; 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