#1144876 highlight.js: Rollup change breaks hljs.registerLanguage calls

#1144876#5
Date:
2026-08-19 16:13:31 UTC
From:
To:
Dear Maintainer,

Due to a breaking change in behavior from Rollup 2 to 3, IIFE regex replacement
for `hljs.registerLanguage` calls breaks.

Rollup 2, which this version of hljs targeted, generates this:

var dummyName = (function () { /* ... */ }());

which is replaced by hljs to:

hljs.registerLanguage('${language.name}', function () { /* ... */ }());

while Rollup 3 generates this:

var dummyName = (function () { /* ... */ })();

which is replaced by hljs to:

hljs.registerLanguage('${language.name}', function () { /* ... */ })();

You can see that while the previous replacement calls the function *inside*,
current replacement calls the "result" of the `hljs.registerLanguage` call.

The following patch fixes it by calling `hljs.registerLanguage` in a separate
statement.

Note, it's intended to be in the debian/patches series, not a debdiff.
--- a/tools/lib/language.js
+++ b/tools/lib/language.js
@@ -86,14 +86,14 @@

 async function compileLanguage (language, options) {
   const EXPORT_REGEX = /export default (.*);/;
-  const IIFE_HEADER_REGEX = /^(var dummyName = )?\(function \(\)/;
+  //const IIFE_HEADER_REGEX = /^(var dummyName = )?\(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" };
   var data = await rollupCode(input, output)

-  data = data.replace(IIFE_HEADER_REGEX, `hljs.registerLanguage('${language.name}', function ()`)
+  data = `(function() {\n${data}\nhljs.registerLanguage('${language.name}', dummyName);\n})();` //data = data.replace(IIFE_HEADER_REGEX, `hljs.registerLanguage('${language.name}', function ()`)

   var original = data;
   language.module = data;