@web/rollup-plugin-html
Version:
Rollup plugin for bundling HTML files
68 lines • 2.95 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractModules = void 0;
const parse5_utils_1 = require("@web/parse5-utils");
const path_1 = __importDefault(require("path"));
const crypto_1 = __importDefault(require("crypto"));
const utils_js_1 = require("../../assets/utils.js");
const parse5_utils_2 = require("@web/parse5-utils");
function createContentHash(content) {
return crypto_1.default.createHash('md5').update(content).digest('hex');
}
function isAbsolute(src) {
try {
new URL(src);
return true;
}
catch (_a) {
return false;
}
}
function extractModules(params) {
const { document, htmlDir, rootDir, absolutePathPrefix } = params;
const scriptNodes = (0, parse5_utils_1.findElements)(document, e => (0, parse5_utils_1.getTagName)(e) === 'script' && (0, parse5_utils_1.getAttribute)(e, 'type') === 'module');
const moduleImports = [];
const inlineModules = [];
for (const scriptNode of scriptNodes) {
const src = (0, parse5_utils_1.getAttribute)(scriptNode, 'src');
const allAttributes = (0, parse5_utils_2.getAttributes)(scriptNode);
const attributes = [];
for (const attributeName of Object.keys(allAttributes)) {
if (attributeName !== 'src' && attributeName !== 'type') {
attributes.push({ name: attributeName, value: allAttributes[attributeName] });
}
}
if (!src) {
// turn inline module (<script type="module"> ...code ... </script>)
const code = (0, parse5_utils_1.getTextContent)(scriptNode);
// inline modules should be relative to the HTML file to resolve relative imports
// we make it unique with a content hash, so that duplicate modules are deduplicated
const importPath = path_1.default.posix.join(htmlDir, `/inline-module-${createContentHash(code)}.js`);
if (!inlineModules.find(tag => tag.importPath === importPath)) {
inlineModules.push({
importPath,
attributes,
code,
});
}
(0, parse5_utils_1.remove)(scriptNode);
}
else {
if (!isAbsolute(src)) {
// external script <script type="module" src="./foo.js"></script>
const importPath = (0, utils_js_1.resolveAssetFilePath)(src, htmlDir, rootDir, absolutePathPrefix);
moduleImports.push({
importPath,
attributes,
});
(0, parse5_utils_1.remove)(scriptNode);
}
}
}
return { moduleImports, inlineModules };
}
exports.extractModules = extractModules;
//# sourceMappingURL=extractModules.js.map
;