@@ -185,71 +185,72 @@ async function runDtsBundler(entrypoint, output) {
185
185
* @param {boolean } exportIsTsObject True if this file exports the TS object and should have relevant code injected.
186
186
*/
187
187
function esbuildTask ( entrypoint , outfile , exportIsTsObject = false ) {
188
- // Note: we do not use --minify, as that would hide function names from user backtraces
189
- // (we don't ship our sourcemaps), and would break consumers like monaco which modify
190
- // typescript.js for their own needs. Also, using --sourcesContent=false doesn't help,
191
- // as even though it's a smaller source map that could be shipped to users for better
192
- // stack traces via names, the maps are bigger than the actual source files themselves.
193
- /** @type {esbuild.BuildOptions } */
194
- const options = {
195
- entryPoints : [ entrypoint ] ,
196
- banner : { js : getCopyrightHeader ( ) } ,
197
- bundle : true ,
198
- outfile,
199
- platform : "node" ,
200
- target : "es2018" , // Covers Node 10.
201
- format : "cjs" ,
202
- sourcemap : "linked" ,
203
- external : [ "./node_modules/*" ] ,
204
- conditions : [ "require" ] ,
205
- // legalComments: "none", // If we add copyright headers to the source files, uncomment.
206
- plugins : [
207
- {
208
- name : "fix-require" ,
209
- setup : ( build ) => {
210
- build . onEnd ( async ( ) => {
211
- // esbuild converts calls to "require" to "__require"; this function
212
- // calls the real require if it exists, or throws if it does not (rather than
213
- // throwing an error like "require not defined"). But, since we want typescript
214
- // to be consumable by other bundlers, we need to convert these calls back to
215
- // require so our imports are visible again.
216
- //
217
- // Note that this step breaks source maps, but only for lines that reference
218
- // "__require", which is an okay tradeoff for the performance of not running
219
- // the output through transpileModule/babel/etc.
220
- //
221
- // See: https://github.com/evanw/esbuild/issues/1905
222
- let contents = await fs . promises . readFile ( outfile , "utf-8" ) ;
223
- contents = contents . replace ( / _ _ r e q u i r e \( / g, "require(" ) ;
224
- await fs . promises . writeFile ( outfile , contents ) ;
225
- } ) ;
226
- } ,
227
- }
228
- ]
229
- } ;
230
-
231
- if ( exportIsTsObject ) {
232
- options . format = "iife" ; // We use an IIFE so we can inject the code below.
233
- options . globalName = "ts" ; // Name the variable ts, matching our old big bundle and so we can use the code below.
234
- options . footer = {
235
- // These snippets cannot appear in the actual source files, otherwise they will be rewritten
236
- // to things like exports or requires.
237
- js : `
188
+ return {
189
+ build : async ( ) => {
190
+ // Note: we do not use --minify, as that would hide function names from user backtraces
191
+ // (we don't ship our sourcemaps), and would break consumers like monaco which modify
192
+ // typescript.js for their own needs. Also, using --sourcesContent=false doesn't help,
193
+ // as even though it's a smaller source map that could be shipped to users for better
194
+ // stack traces via names, the maps are bigger than the actual source files themselves.
195
+ /** @type {esbuild.BuildOptions } */
196
+ const options = {
197
+ entryPoints : [ entrypoint ] ,
198
+ banner : { js : getCopyrightHeader ( ) } ,
199
+ bundle : true ,
200
+ outfile,
201
+ platform : "node" ,
202
+ target : "es2018" , // Covers Node 10.
203
+ format : "cjs" ,
204
+ sourcemap : "linked" ,
205
+ external : [ "./node_modules/*" ] ,
206
+ conditions : [ "require" ] ,
207
+ // legalComments: "none", // If we add copyright headers to the source files, uncomment.
208
+ plugins : [
209
+ {
210
+ name : "fix-require" ,
211
+ setup : ( build ) => {
212
+ build . onEnd ( async ( ) => {
213
+ // esbuild converts calls to "require" to "__require"; this function
214
+ // calls the real require if it exists, or throws if it does not (rather than
215
+ // throwing an error like "require not defined"). But, since we want typescript
216
+ // to be consumable by other bundlers, we need to convert these calls back to
217
+ // require so our imports are visible again.
218
+ //
219
+ // Note that this step breaks source maps, but only for lines that reference
220
+ // "__require", which is an okay tradeoff for the performance of not running
221
+ // the output through transpileModule/babel/etc.
222
+ //
223
+ // See: https://github.com/evanw/esbuild/issues/1905
224
+ let contents = await fs . promises . readFile ( outfile , "utf-8" ) ;
225
+ contents = contents . replace ( / _ _ r e q u i r e \( / g, "require(" ) ;
226
+ await fs . promises . writeFile ( outfile , contents ) ;
227
+ } ) ;
228
+ } ,
229
+ }
230
+ ]
231
+ } ;
232
+
233
+ if ( exportIsTsObject ) {
234
+ options . format = "iife" ; // We use an IIFE so we can inject the code below.
235
+ options . globalName = "ts" ; // Name the variable ts, matching our old big bundle and so we can use the code below.
236
+ options . footer = {
237
+ // These snippets cannot appear in the actual source files, otherwise they will be rewritten
238
+ // to things like exports or requires.
239
+ js : `
238
240
if (typeof module !== "undefined" && module.exports) {
239
- // If we are in a CJS context, export the ts namespace.
240
- module.exports = ts;
241
+ // If we are in a CJS context, export the ts namespace.
242
+ module.exports = ts;
241
243
}
242
244
if (ts.server) {
243
- // If we are in a server bundle, inject the dynamicImport function.
244
- ts.server.dynamicImport = id => import(id);
245
+ // If we are in a server bundle, inject the dynamicImport function.
246
+ ts.server.dynamicImport = id => import(id);
245
247
}`
246
- } ;
247
- }
248
+ } ;
249
+ }
248
250
249
- return {
250
- build : ( ) => esbuild . build ( options ) ,
251
+ await esbuild . build ( options ) ;
252
+ } ,
251
253
clean : ( ) => del ( [ outfile , `${ outfile } .map` ] ) ,
252
- watch : ( ) => esbuild . build ( { ...options , watch : true } ) ,
253
254
} ;
254
255
}
255
256
0 commit comments