diff --git a/tools/build_cdn.js b/tools/build_cdn.js index c240508d9a..6400f60afc 100644 --- a/tools/build_cdn.js +++ b/tools/build_cdn.js @@ -125,7 +125,7 @@ async function installLanguages(languages, options) { await Promise.all( languages.filter((l) => l.third_party) - .map(buildDistributable) + .map((lang) => buildDistributable(lang, options)) ); log(""); @@ -148,13 +148,16 @@ function installStyles() { }); } -async function buildDistributable(language) { +async function buildDistributable(language, options) { const filename = `${language.name}.min.js`; const distDir = path.join(language.moduleDir, "dist"); log(`Building ${distDir}/${filename}.`); await fs.mkdir(distDir, { recursive: true }); await fs.writeFile(path.join(language.moduleDir, "dist", filename), language.minified); + if (options.esm) { + await fs.writeFile(path.join(language.moduleDir, "dist", filename.replace(".min.js",".es.min.js")), language.minifiedESM); + } } async function buildCDNLanguage(language, options) { diff --git a/tools/lib/language.js b/tools/lib/language.js index ced7e60926..7b026fb8e2 100644 --- a/tools/lib/language.js +++ b/tools/lib/language.js @@ -85,20 +85,22 @@ class Language { async function compileLanguage (language, options) { - const EXPORT_REGEX = /export default (.*);/; + const IIFE_HEADER_REGEX = /^(var hljsGrammar = )?\(function \(\)/; // TODO: cant we use the source we already have? - const input = { ...build_config.rollup.browser.input, input: language.path }; - const output = { ...build_config.rollup.browser.output, name: `dummyName`, file: "out.js" }; + const input = { ...build_config.rollup.browser_iife.input, input: language.path }; + const output = { ...build_config.rollup.browser_iife.output, name: `hljsGrammar`, file: "out.js" }; + output.footer = null; - const esm = await rollupCode(input, output); - const iife = `hljs.registerLanguage('${language.name}', function (){"use strict";` + esm.replace(EXPORT_REGEX, 'return $1') + '})'; + const data = await rollupCode(input, output); + const iife = data.replace(IIFE_HEADER_REGEX, `hljs.registerLanguage('${language.name}', function ()`); + const esm = `${data};\nexport default hljsGrammar;`; language.module = iife; const miniESM = await Terser.minify(esm, options.terser); const miniIIFE = await Terser.minify(iife, options.terser); - language.minified = miniIIFE.code || iife; - language.minifiedESM = miniESM.code || esm; + language.minified = miniIIFE.code; + language.minifiedESM = miniESM.code; } async function getLanguages() {