UNPKG

@open-wc/rollup-plugin-html

Version:

Plugin for generating an html file with rollup

116 lines (103 loc) 3.02 kB
/** @typedef {import('rollup').InputOptions} InputOptions */ /** @typedef {import('./types').PluginOptions} PluginOptions */ /** @typedef {import('./types').HtmlFile} HtmlFile */ const fs = require('fs-extra'); const path = require('path'); const glob = require('glob'); const { createError } = require('./utils'); /** * Lists all files using the specified glob, starting from the given root directory. * * Will return all matching file paths fully resolved. * @param {string} fromGlob * @param {string} rootDir * @return {string[]} */ function listFiles(fromGlob, rootDir) { const files = glob.sync(fromGlob, { cwd: rootDir, absolute: true }); return ( files // filter out directories .filter(filePath => !fs.lstatSync(filePath).isDirectory()) ); } /** * @param {string} globs * @param {string} rootDir */ function globsToFiles(globs, rootDir) { const patterns = typeof globs === 'string' ? [globs] : globs; /** @type {string[]} */ let files = []; for (const pattern of patterns) { files = [...files, ...listFiles(pattern, rootDir)]; } return files; } /** * @param {string} filePath * @param {string} rootDir * @param {boolean} flatten */ function getName(filePath, rootDir, flatten = true) { if (flatten) { return path.basename(filePath); } return path.relative(rootDir, filePath); } /** * @param {PluginOptions} pluginOptions * @param {string} [rollupInput] * @returns {HtmlFile[]} */ function getInputHtmlData(pluginOptions, rollupInput) { // backward compatibility if (pluginOptions.inputHtml) { // eslint-disable-next-line no-param-reassign pluginOptions.html = pluginOptions.inputHtml; } if (pluginOptions.inputPath) { // eslint-disable-next-line no-param-reassign pluginOptions.files = pluginOptions.inputPath; } const { html, rootDir = process.cwd(), name, files, flatten } = pluginOptions; if (typeof html === 'string') { return [ { name, rootDir, html, }, ]; } if (Array.isArray(html)) { const result = []; for (const htmlFile of html) { let localRootDir = rootDir; const dirname = path.dirname(htmlFile.name); if (dirname !== '.') { localRootDir = path.join(rootDir, dirname); } result.push({ rootDir: localRootDir, ...htmlFile }); } return result; } if (!files && !rollupInput) { throw createError('Internal plugin error, missing input while getInputHtmlData is called.'); } const rawPath = /** @type {string} */ (files || rollupInput); const filePaths = globsToFiles(rawPath, rootDir); if (filePaths.length === 0) { throw createError(`Could not find a HTML input file: ${rawPath}`); } const result = []; for (const filePath of filePaths) { result.push({ name: name || getName(filePath, rootDir, flatten), rootDir: path.dirname(filePath), html: fs.readFileSync(filePath, 'utf-8'), }); } return result; } module.exports = { getInputHtmlData };