UNPKG

@open-wc/rollup-plugin-html

Version:

Plugin for generating an html file with rollup

62 lines (52 loc) 1.82 kB
/** @typedef {import('./types').HtmlFile} HtmlFile */ const { findJsScripts, toFilePath } = require('@open-wc/building-utils'); const path = require('path'); const { parse, serialize } = require('parse5'); const { getAttribute, getTextContent, remove, } = require('@open-wc/building-utils/dom5-fork/index.js'); /** * @param {number} inlineModuleIndex * @param {HtmlFile} inputHtmlData * @param {string} inputHtmlName * @param {string} [projectRootDir] */ function extractModules( inlineModuleIndex, inputHtmlData, inputHtmlName, projectRootDir = process.cwd(), ) { const { html, rootDir: htmlRootDir } = inputHtmlData; const documentAst = parse(html); const scriptNodes = findJsScripts(documentAst, { jsScripts: true, inlineJsScripts: true }); /** @type {string[]} */ const moduleImports = []; /** @type {Map<string, string>} */ const inlineModules = new Map(); scriptNodes.forEach((scriptNode, i) => { const src = getAttribute(scriptNode, 'src'); if (!src) { // turn inline module (<script type="module"> ...code ... </script>) const suffix = path.posix.basename(inputHtmlName).split('.')[0]; const importPath = path.posix.join( htmlRootDir, `inline-module-${suffix}-${inlineModuleIndex + i}.js`, ); inlineModules.set(importPath, getTextContent(scriptNode)); } else { // external script <script type="module" src="./foo.js"></script> const importPath = path.join( src.startsWith('/') ? projectRootDir : htmlRootDir, toFilePath(src), ); moduleImports.push(importPath); } remove(scriptNode); }); const updatedHtmlString = serialize(documentAst); return { moduleImports, inlineModules, htmlWithoutModules: updatedHtmlString }; } module.exports = { extractModules };