UNPKG

j-vite-plugin-dynamic-base

Version:

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

114 lines 5.04 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; 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"); const ast_1 = require("./ast"); function transformChunk(codeStr, options) { return __awaiter(this, void 0, void 0, function* () { const { base, publicPath } = options; const [spanOffset, ast] = yield (0, ast_1.parseCode)(codeStr); const stringLiterals = (0, ast_1.collectMatchingStringLiterals)(base, ast); if (stringLiterals.length === 0) { return codeStr; } const code = new ast_1.StringAsBytes(codeStr); let lastIdx = 0; let transformedCode = ""; for (const literal of stringLiterals) { const prev = code.slice(lastIdx, literal.span.start - spanOffset); const transformed = (0, utils_1.replaceInStringLiteral)(literal, base, publicPath); lastIdx = literal.span.end - spanOffset; transformedCode += prev + transformed; } transformedCode += code.slice(lastIdx); return transformedCode; }); } 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> window.__filefunc__ = function(){ var preloads = ${JSON.stringify(preloads)}; function setAttribute(target, attrs) { for (var key in attrs) { target.setAttribute(key, attrs[key]); } return target; }; 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 }) } } document.getElementsByTagName(item.parentTagName)[0].appendChild(childNode); } }; </script> </head>`; return document.outerHTML.replace('</head>', injectCode); } exports.transformHtml = transformHtml; //# sourceMappingURL=transform.js.map