@@ -6,86 +6,193 @@ const { filter } = require("./lib/dependencies");
6
6
const { rollupWrite } = require ( "./lib/bundling.js" ) ;
7
7
const log = ( ...args ) => console . log ( ...args ) ;
8
8
9
- async function buildNodeIndex ( languages ) {
9
+ const safeImportName = ( s ) => {
10
+ s = s . replace ( / - / g, "_" ) ;
11
+ if ( / ^ \d / . test ( s ) ) s = `L_${ s } ` ;
12
+ return s ;
13
+ } ;
14
+
15
+ async function buildESMIndex ( name , languages ) {
16
+ const header = `import hljs from './core.js';` ;
17
+ const footer = "export default hljs;" ;
18
+
19
+
20
+ const registration = languages . map ( ( lang ) => {
21
+ const importName = safeImportName ( lang . name ) ;
22
+ return `import ${ importName } from './languages/${ lang . name } .js';\n` +
23
+ `hljs.registerLanguage('${ lang . name } ', ${ importName } );` ;
24
+ } ) ;
25
+
26
+ const index = `${ header } \n\n${ registration . join ( "\n" ) } \n\n${ footer } ` ;
27
+ await fs . writeFile ( `${ process . env . BUILD_DIR } /es/${ name } .js` , index ) ;
28
+ }
29
+
30
+ async function buildCJSIndex ( name , languages ) {
10
31
const header = "var hljs = require('./core');" ;
11
32
const footer = "module.exports = hljs;" ;
12
33
13
34
const registration = languages . map ( ( lang ) => {
14
- let require = `require('./languages/${ lang . name } ')` ;
15
- if ( lang . loader ) {
16
- require = require += `.${ lang . loader } ` ;
17
- }
35
+ const require = `require('./languages/${ lang . name } ')` ;
18
36
return `hljs.registerLanguage('${ lang . name } ', ${ require } );` ;
19
37
} ) ;
20
38
21
- // legacy
22
- await fs . writeFile ( `${ process . env . BUILD_DIR } /lib/highlight.js` ,
23
- "// This file has been deprecated in favor of core.js\n" +
24
- "var hljs = require('./core');\n"
25
- ) ;
26
-
27
39
const index = `${ header } \n\n${ registration . join ( "\n" ) } \n\n${ footer } ` ;
28
- await fs . writeFile ( `${ process . env . BUILD_DIR } /lib/index .js` , index ) ;
40
+ await fs . writeFile ( `${ process . env . BUILD_DIR } /lib/${ name } .js` , index ) ;
29
41
}
30
42
31
- async function buildNodeLanguage ( language ) {
43
+ async function buildNodeLanguage ( language , options ) {
44
+ const EMIT = `function emitWarning() {
45
+ if (!emitWarning.warned) {
46
+ emitWarning.warned = true;
47
+ process.emitWarning(
48
+ 'Using file extension in specifier is deprecated, use "highlight.js/lib/languages/%%%%" instead of "highlight.js/lib/languages/%%%%.js"',
49
+ 'DeprecationWarning'
50
+ );
51
+ }
52
+ }
53
+ emitWarning();` ;
54
+ const CJS_STUB = `${ EMIT }
55
+ module.exports = require('./%%%%.js');` ;
56
+ const ES_STUB = `${ EMIT }
57
+ import lang from './%%%%.js';
58
+ export default lang;` ;
32
59
const input = { ...config . rollup . node . input , input : language . path } ;
33
60
const output = { ...config . rollup . node . output , file : `${ process . env . BUILD_DIR } /lib/languages/${ language . name } .js` } ;
34
61
await rollupWrite ( input , output ) ;
62
+ await fs . writeFile ( `${ process . env . BUILD_DIR } /lib/languages/${ language . name } .js.js` ,
63
+ CJS_STUB . replace ( / % % % % / g, language . name ) ) ;
64
+ if ( options . esm ) {
65
+ await fs . writeFile ( `${ process . env . BUILD_DIR } /es/languages/${ language . name } .js.js` ,
66
+ ES_STUB . replace ( / % % % % / g, language . name ) ) ;
67
+ await rollupWrite ( input , { ...output ,
68
+ format : "es" ,
69
+ file : output . file . replace ( "/lib/" , "/es/" )
70
+ } ) ;
71
+ }
35
72
}
36
73
37
- async function buildNodeHighlightJS ( ) {
74
+ const EXCLUDE = [ "join" ] ;
75
+
76
+ async function buildESMUtils ( ) {
77
+ const input = { ...config . rollup . node . input , input : `src/lib/regex.js` } ;
78
+ input . plugins = [ ...input . plugins , {
79
+ transform : ( code ) => {
80
+ EXCLUDE . forEach ( ( fn ) => {
81
+ code = code . replace ( `export function ${ fn } (` , `function ${ fn } (` ) ;
82
+ } ) ;
83
+ return code ;
84
+ }
85
+ } ] ;
86
+ await rollupWrite ( input , {
87
+ ...config . rollup . node . output ,
88
+ format : "es" ,
89
+ file : `${ process . env . BUILD_DIR } /es/utils/regex.js`
90
+ } ) ;
91
+ }
92
+
93
+ async function buildNodeHighlightJS ( options ) {
38
94
const input = { ...config . rollup . node . input , input : `src/highlight.js` } ;
39
95
const output = { ...config . rollup . node . output , file : `${ process . env . BUILD_DIR } /lib/core.js` } ;
40
96
await rollupWrite ( input , output ) ;
97
+ if ( options . esm ) {
98
+ await rollupWrite ( input , {
99
+ ...output ,
100
+ format : "es" ,
101
+ file : `${ process . env . BUILD_DIR } /es/core.js`
102
+ } ) ;
103
+ }
41
104
}
42
105
43
- async function buildPackageJSON ( ) {
106
+ function dual ( file ) {
107
+ return {
108
+ require : file ,
109
+ import : file . replace ( "/lib/" , "/es/" )
110
+ } ;
111
+ }
112
+
113
+ async function buildPackageJSON ( options ) {
44
114
const packageJson = require ( "../package" ) ;
115
+
116
+ const exports = {
117
+ "." : dual ( "./lib/index.js" ) ,
118
+ "./package.json" : "./package.json" ,
119
+ "./lib/common" : dual ( "./lib/common.js" ) ,
120
+ "./lib/core" : dual ( "./lib/core.js" ) ,
121
+ "./lib/languages/*" : dual ( "./lib/languages/*.js" ) ,
122
+ } ;
123
+ if ( options . esm ) packageJson . exports = exports ;
124
+
45
125
await fs . writeFile ( `${ process . env . BUILD_DIR } /package.json` , JSON . stringify ( packageJson , null , 2 ) ) ;
46
126
}
47
127
48
- async function buildLanguages ( languages ) {
128
+ async function buildLanguages ( languages , options ) {
49
129
log ( "Writing languages." ) ;
50
130
await Promise . all (
51
131
languages . map ( async ( lang ) => {
52
- await buildNodeLanguage ( lang ) ;
132
+ await buildNodeLanguage ( lang , options ) ;
53
133
process . stdout . write ( "." ) ;
54
134
} )
55
135
) ;
56
136
log ( "" ) ;
57
137
}
58
138
139
+ const CORE_FILES = [
140
+ "LICENSE" ,
141
+ "README.md" ,
142
+ "VERSION_10_UPGRADE.md" ,
143
+ "VERSION_11_UPGRADE.md" ,
144
+ "SUPPORTED_LANGUAGES.md" ,
145
+ "SECURITY.md" ,
146
+ "CHANGES.md" ,
147
+ "types/index.d.ts"
148
+ ] ;
149
+
59
150
async function buildNode ( options ) {
60
151
mkdir ( "lib/languages" ) ;
61
152
mkdir ( "scss" ) ;
62
153
mkdir ( "styles" ) ;
63
154
mkdir ( "types" ) ;
64
155
65
- install ( "./LICENSE" , "LICENSE" ) ;
66
- install ( "./README.md" , "README.md" ) ;
67
- install ( "./types/index.d.ts" , "types/index.d.ts" ) ;
68
- install ( "./src/core.d.ts" , "lib/core.d.ts" ) ;
156
+
157
+ CORE_FILES . forEach ( file => {
158
+ install ( `./${ file } ` , file ) ;
159
+ } ) ;
160
+ install ( "./src/core.d.ts" , "lib/core.d.ts" ) ;
161
+ install ( "./src/core.d.ts" , "lib/common.d.ts" ) ;
162
+
163
+ if ( options . esm ) {
164
+ mkdir ( "es/languages" ) ;
165
+ install ( "./src/core.d.ts" , "es/core.d.ts" ) ;
166
+ install ( "./src/core.d.ts" , "es/common.d.ts" ) ;
167
+ }
69
168
70
169
log ( "Writing styles." ) ;
71
170
const styles = await fs . readdir ( "./src/styles/" ) ;
72
171
styles . forEach ( ( file ) => {
73
172
install ( `./src/styles/${ file } ` , `styles/${ file } ` ) ;
74
173
install ( `./src/styles/${ file } ` , `scss/${ file . replace ( ".css" , ".scss" ) } ` ) ;
75
174
} ) ;
76
- log ( "Writing package.json." ) ;
77
- await buildPackageJSON ( ) ;
78
175
79
176
let languages = await getLanguages ( ) ;
80
177
// filter languages for inclusion in the highlight.js bundle
81
178
languages = filter ( languages , options . languages ) ;
179
+ const common = languages . filter ( l => l . categories . includes ( "common" ) ) ;
82
180
83
- await buildNodeIndex ( languages ) ;
84
- await buildLanguages ( languages ) ;
181
+ log ( "Writing package.json." ) ;
182
+ await buildPackageJSON ( options ) ;
183
+
184
+ if ( options . esm ) {
185
+ await fs . writeFile ( `${ process . env . BUILD_DIR } /es/package.json` , `{ "type": "module" }` ) ;
186
+ await buildESMIndex ( "index" , languages ) ;
187
+ await buildESMIndex ( "common" , common ) ;
188
+ await buildESMUtils ( ) ;
189
+ }
190
+ await buildCJSIndex ( "index" , languages ) ;
191
+ await buildCJSIndex ( "common" , common ) ;
192
+ await buildLanguages ( languages , options ) ;
85
193
86
194
log ( "Writing highlight.js" ) ;
87
- await buildNodeHighlightJS ( ) ;
88
-
195
+ await buildNodeHighlightJS ( options ) ;
89
196
}
90
197
91
198
module . exports . build = buildNode ;
0 commit comments