Skip to content

Commit dfcaeed

Browse files
committed
dual build
1 parent 648545e commit dfcaeed

File tree

3 files changed

+74
-9
lines changed

3 files changed

+74
-9
lines changed

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"type": "git",
2121
"url": "git://github.com/highlightjs/highlight.js.git"
2222
},
23-
"main": "./lib/index.mjs",
23+
"type": "commonjs",
24+
"main": "./lib/index.js",
2425
"types": "./types/index.d.ts",
2526
"scripts": {
2627
"mocha": "mocha",

tools/build_config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module.exports = {
88
clean_css: {},
99
rollup: {
1010
node: {
11-
output: { format: "es", strict: false, exports: "auto" },
11+
output: { format: "cjs", strict: false, exports: "auto" },
1212
input: {
1313
plugins: [
1414
cjsPlugin(),

tools/build_node.js

+71-7
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ const { filter } = require("./lib/dependencies");
66
const { rollupWrite } = require("./lib/bundling.js");
77
const log = (...args) => console.log(...args);
88

9-
async function buildNodeIndex(name, languages) {
9+
async function buildESMIndex(name, languages) {
1010
const header = `import hljs from './core.mjs';`;
1111
const footer = "export default hljs;";
1212

1313
const registration = languages.map((lang) => {
1414
let out = '';
1515
const importName = "L_" + lang.name.replace("-","_")
16-
let require = `import ${importName} from './languages/${lang.name}.mjs';`;
16+
let require = `import ${importName} from './languages/${lang.name}.js';`;
1717
// TODO: break this with v11? All modules must export default?
1818
if (lang.loader) {
1919
require = require += `.${lang.loader}`;
@@ -25,19 +25,71 @@ async function buildNodeIndex(name, languages) {
2525
});
2626

2727
const index = `${header}\n\n${registration.join("\n")}\n\n${footer}`;
28-
await fs.writeFile(`${process.env.BUILD_DIR}/lib/${name}.mjs`, index);
28+
await fs.writeFile(`${process.env.BUILD_DIR}/es/${name}.js`, index);
29+
}
30+
31+
async function buildCJSIndex(name, languages) {
32+
const header = "var hljs = require('./core');";
33+
const footer = "module.exports = hljs;";
34+
35+
const registration = languages.map((lang) => {
36+
let require = `require('./languages/${lang.name}')`;
37+
if (lang.loader) {
38+
require = require += `.${lang.loader}`;
39+
}
40+
return `hljs.registerLanguage('${lang.name}', ${require});`;
41+
});
42+
43+
const index = `${header}\n\n${registration.join("\n")}\n\n${footer}`;
44+
await fs.writeFile(`${process.env.BUILD_DIR}/lib/${name}.js`, index);
2945
}
3046

3147
async function buildNodeLanguage(language) {
3248
const input = { ...config.rollup.node.input, input: language.path };
33-
const output = { ...config.rollup.node.output, file: `${process.env.BUILD_DIR}/lib/languages/${language.name}.mjs` };
49+
const output = { ...config.rollup.node.output, file: `${process.env.BUILD_DIR}/lib/languages/${language.name}.js` };
3450
await rollupWrite(input, output);
51+
await rollupWrite(input, {...output,
52+
format: "es",
53+
file: output.file.replace("/lib/", "/es/")
54+
});
3555
}
3656

57+
const EXCLUDE = ["join"];
58+
59+
async function buildESMUtils() {
60+
const input = { ...config.rollup.node.input, input: `src/lib/regex.js` };
61+
input.plugins = [...input.plugins, {
62+
transform: (code) => {
63+
EXCLUDE.forEach((fn) => {
64+
code = code.replace(`export function ${fn}(`, `function ${fn}(`);
65+
});
66+
return code;
67+
}
68+
}];
69+
const output = {
70+
...config.rollup.node.output,
71+
format: "es",
72+
file: `${process.env.BUILD_DIR}/es/utils/regex.js`
73+
};
74+
await rollupWrite(input, output);
75+
}
76+
77+
3778
async function buildNodeHighlightJS() {
3879
const input = { ...config.rollup.node.input, input: `src/highlight.js` };
39-
const output = { ...config.rollup.node.output, file: `${process.env.BUILD_DIR}/lib/core.mjs` };
80+
const output = { ...config.rollup.node.output, file: `${process.env.BUILD_DIR}/lib/core.js` };
4081
await rollupWrite(input, output);
82+
await rollupWrite(input, { ...output,
83+
format: "es",
84+
file: `${process.env.BUILD_DIR}/es/core.js`
85+
});
86+
}
87+
88+
function dual(file) {
89+
return {
90+
require: file,
91+
import: file.replace("/lib/", "/es/")
92+
};
4193
}
4294

4395
async function buildPackageJSON() {
@@ -52,6 +104,14 @@ async function buildPackageJSON() {
52104
.filter((matches) => matches)
53105
.map((matches) => matches[1]);
54106

107+
const exports = {
108+
".": dual("./lib/index.js"),
109+
"./lib/common": dual("./lib/common.js"),
110+
"./lib/core": dual("./lib/core.js"),
111+
"./lib/languages/*": dual("./lib/languages/*.js"),
112+
};
113+
packageJson.exports = exports;
114+
55115
await fs.writeFile(`${process.env.BUILD_DIR}/package.json`, JSON.stringify(packageJson, null, 2));
56116
}
57117

@@ -68,6 +128,7 @@ async function buildLanguages(languages) {
68128

69129
async function buildNode(options) {
70130
mkdir("lib/languages");
131+
mkdir("es/languages");
71132
mkdir("scss");
72133
mkdir("styles");
73134
mkdir("types");
@@ -89,8 +150,11 @@ async function buildNode(options) {
89150
// filter languages for inclusion in the highlight.js bundle
90151
languages = filter(languages, options.languages);
91152

92-
await buildNodeIndex("index", languages);
93-
await buildNodeIndex("common", languages.filter(l => l.categories.includes("common")));
153+
await buildESMIndex("index", languages);
154+
await buildESMIndex("common", languages.filter(l => l.categories.includes("common")));
155+
await buildESMUtils();
156+
await buildCJSIndex("index", languages);
157+
await buildCJSIndex("common", languages.filter(l => l.categories.includes("common")));
94158
await buildLanguages(languages);
95159

96160
log("Writing highlight.js");

0 commit comments

Comments
 (0)