@@ -15,6 +15,7 @@ const variants = {
15
15
clerkBrowser : 'clerk.browser' ,
16
16
clerkHeadless : 'clerk.headless' ,
17
17
clerkHeadlessBrowser : 'clerk.headless.browser' ,
18
+ clerkLegacyBrowser : 'clerk.legacy.browser' ,
18
19
} ;
19
20
20
21
const variantToSourceFile = {
@@ -23,16 +24,18 @@ const variantToSourceFile = {
23
24
[ variants . clerkBrowser ] : './src/index.browser.ts' ,
24
25
[ variants . clerkHeadless ] : './src/index.headless.ts' ,
25
26
[ variants . clerkHeadlessBrowser ] : './src/index.headless.browser.ts' ,
27
+ [ variants . clerkLegacyBrowser ] : './src/index.legacy.browser.ts' ,
26
28
} ;
27
29
28
30
/**
29
31
*
30
32
* @param {object } config
31
33
* @param {'development'|'production' } config.mode
34
+ * @param {string } config.variant
32
35
* @param {boolean } [config.disableRHC=false]
33
36
* @returns { import('@rspack/cli').Configuration }
34
37
*/
35
- const common = ( { mode, disableRHC = false } ) => {
38
+ const common = ( { mode, variant , disableRHC = false } ) => {
36
39
return {
37
40
mode,
38
41
resolve : {
@@ -65,7 +68,7 @@ const common = ({ mode, disableRHC = false }) => {
65
68
} ) ,
66
69
] . filter ( Boolean ) ,
67
70
output : {
68
- chunkFilename : `[name]_[fullhash:6]_${ packageJSON . version } .js` ,
71
+ chunkFilename : `[name]_${ variant } _ [fullhash:6]_${ packageJSON . version } .js` ,
69
72
} ,
70
73
/**
71
74
* Remove the Stripe dependencies from the bundle, if RHC is disabled.
@@ -156,8 +159,10 @@ const svgLoader = () => {
156
159
} ;
157
160
} ;
158
161
159
- /** @type { () => (import('@rspack/core').RuleSetRule[]) } */
160
- const typescriptLoaderProd = ( ) => {
162
+ /** @type { (opts?: { targets?: string, useCoreJs?: boolean }) => (import('@rspack/core').RuleSetRule[]) } */
163
+ const typescriptLoaderProd = (
164
+ { targets = packageJSON . browserslist , useCoreJs = false } = { targets : packageJSON . browserslist , useCoreJs : false } ,
165
+ ) => {
161
166
return [
162
167
{
163
168
test : / \. ( j s x ? | t s x ? ) $ / ,
@@ -166,7 +171,13 @@ const typescriptLoaderProd = () => {
166
171
loader : 'builtin:swc-loader' ,
167
172
options : {
168
173
env : {
169
- targets : packageJSON . browserslist ,
174
+ targets,
175
+ ...( useCoreJs
176
+ ? {
177
+ mode : 'usage' ,
178
+ coreJs : require ( 'core-js/package.json' ) . version ,
179
+ }
180
+ : { } ) ,
170
181
} ,
171
182
jsc : {
172
183
parser : {
@@ -188,12 +199,20 @@ const typescriptLoaderProd = () => {
188
199
} ,
189
200
{
190
201
test : / \. m ? j s $ / ,
202
+ exclude : / n o d e _ m o d u l e s [ \\ / ] c o r e - j s / ,
191
203
use : {
192
204
loader : 'builtin:swc-loader' ,
193
205
options : {
194
206
env : {
195
- targets : packageJSON . browserslist ,
207
+ targets,
208
+ ...( useCoreJs
209
+ ? {
210
+ mode : 'usage' ,
211
+ coreJs : '3.41.0' ,
212
+ }
213
+ : { } ) ,
196
214
} ,
215
+ isModule : 'unknown' ,
197
216
} ,
198
217
} ,
199
218
} ,
@@ -231,24 +250,28 @@ const typescriptLoaderDev = () => {
231
250
232
251
/**
233
252
* Used for production builds that have dynamicly loaded chunks.
234
- * @type { () => (import('@rspack/core').Configuration) }
253
+ * @type { (opts?: { targets?: string, useCoreJs?: boolean } ) => (import('@rspack/core').Configuration) }
235
254
* */
236
- const commonForProdChunked = ( ) => {
255
+ const commonForProdChunked = (
256
+ { targets = packageJSON . browserslist , useCoreJs = false } = { targets : packageJSON . browserslist , useCoreJs : false } ,
257
+ ) => {
237
258
return {
238
259
module : {
239
- rules : [ svgLoader ( ) , ...typescriptLoaderProd ( ) ] ,
260
+ rules : [ svgLoader ( ) , ...typescriptLoaderProd ( { targets , useCoreJs } ) ] ,
240
261
} ,
241
262
} ;
242
263
} ;
243
264
244
265
/**
245
266
* Used for production builds that combine all files into one single file (such as for Chrome Extensions).
246
- * @type { () => (import('@rspack/core').Configuration) }
267
+ * @type { (opts?: { targets?: string, useCoreJs?: boolean } ) => (import('@rspack/core').Configuration) }
247
268
* */
248
- const commonForProdBundled = ( ) => {
269
+ const commonForProdBundled = (
270
+ { targets = packageJSON . browserslist , useCoreJs = false } = { targets : packageJSON . browserslist , useCoreJs : false } ,
271
+ ) => {
249
272
return {
250
273
module : {
251
- rules : [ svgLoader ( ) , ...typescriptLoaderProd ( ) ] ,
274
+ rules : [ svgLoader ( ) , ...typescriptLoaderProd ( { targets , useCoreJs } ) ] ,
252
275
} ,
253
276
} ;
254
277
} ;
@@ -288,6 +311,14 @@ const commonForProd = () => {
288
311
// minChunkSize: 10000,
289
312
// })
290
313
] ,
314
+ resolve : {
315
+ alias : {
316
+ // SWC will inject imports to `core-js` into the source files that utilize polyfilled functions. Because we
317
+ // use pnpm, imports from other packages (like `packages/shared`) will not resolve. This alias forces rspack
318
+ // to resolve all `core-js` imports to the version we have installed in `clerk-js`.
319
+ 'core-js' : path . dirname ( require . resolve ( 'core-js/package.json' ) ) ,
320
+ } ,
321
+ } ,
291
322
} ;
292
323
} ;
293
324
@@ -336,14 +367,21 @@ const prodConfig = ({ mode, env, analysis }) => {
336
367
] ,
337
368
}
338
369
: { } ,
339
- common ( { mode } ) ,
370
+ common ( { mode, variant : variants . clerkBrowser } ) ,
340
371
commonForProd ( ) ,
341
372
commonForProdChunked ( ) ,
342
373
) ;
343
374
375
+ const clerkLegacyBrowser = merge (
376
+ entryForVariant ( variants . clerkLegacyBrowser ) ,
377
+ common ( { mode, variant : variants . clerkLegacyBrowser } ) ,
378
+ commonForProd ( ) ,
379
+ commonForProdChunked ( { targets : packageJSON . browserslistLegacy , useCoreJs : true } ) ,
380
+ ) ;
381
+
344
382
const clerkHeadless = merge (
345
383
entryForVariant ( variants . clerkHeadless ) ,
346
- common ( { mode } ) ,
384
+ common ( { mode, variant : variants . clerkHeadless } ) ,
347
385
commonForProd ( ) ,
348
386
commonForProdChunked ( ) ,
349
387
// Disable chunking for the headless variant, since it's meant to be used in a non-browser environment and
@@ -362,50 +400,62 @@ const prodConfig = ({ mode, env, analysis }) => {
362
400
363
401
const clerkHeadlessBrowser = merge (
364
402
entryForVariant ( variants . clerkHeadlessBrowser ) ,
365
- common ( { mode } ) ,
403
+ common ( { mode, variant : variants . clerkHeadlessBrowser } ) ,
366
404
commonForProd ( ) ,
367
405
commonForProdChunked ( ) ,
368
406
// externalsForHeadless(),
369
407
) ;
370
408
371
- const clerkEsm = merge ( entryForVariant ( variants . clerk ) , common ( { mode } ) , commonForProd ( ) , commonForProdBundled ( ) , {
372
- experiments : {
373
- outputModule : true ,
374
- } ,
375
- output : {
376
- filename : '[name].mjs' ,
377
- libraryTarget : 'module' ,
378
- } ,
379
- plugins : [
380
- // Include the lazy chunks in the bundle as well
381
- // so that the final bundle can be imported and bundled again
382
- // by a different bundler, eg the webpack instance used by react-scripts
383
- new rspack . optimize . LimitChunkCountPlugin ( {
384
- maxChunks : 1 ,
385
- } ) ,
386
- ] ,
387
- optimization : {
388
- splitChunks : false ,
409
+ const clerkEsm = merge (
410
+ entryForVariant ( variants . clerk ) ,
411
+ common ( { mode, variant : variants . clerk } ) ,
412
+ commonForProd ( ) ,
413
+ commonForProdBundled ( ) ,
414
+ {
415
+ experiments : {
416
+ outputModule : true ,
417
+ } ,
418
+ output : {
419
+ filename : '[name].mjs' ,
420
+ libraryTarget : 'module' ,
421
+ } ,
422
+ plugins : [
423
+ // Include the lazy chunks in the bundle as well
424
+ // so that the final bundle can be imported and bundled again
425
+ // by a different bundler, eg the webpack instance used by react-scripts
426
+ new rspack . optimize . LimitChunkCountPlugin ( {
427
+ maxChunks : 1 ,
428
+ } ) ,
429
+ ] ,
430
+ optimization : {
431
+ splitChunks : false ,
432
+ } ,
389
433
} ,
390
- } ) ;
434
+ ) ;
391
435
392
- const clerkCjs = merge ( entryForVariant ( variants . clerk ) , common ( { mode } ) , commonForProd ( ) , commonForProdBundled ( ) , {
393
- output : {
394
- filename : '[name].js' ,
395
- libraryTarget : 'commonjs' ,
396
- } ,
397
- plugins : [
398
- // Include the lazy chunks in the bundle as well
399
- // so that the final bundle can be imported and bundled again
400
- // by a different bundler, eg the webpack instance used by react-scripts
401
- new rspack . optimize . LimitChunkCountPlugin ( {
402
- maxChunks : 1 ,
403
- } ) ,
404
- ] ,
405
- optimization : {
406
- splitChunks : false ,
436
+ const clerkCjs = merge (
437
+ entryForVariant ( variants . clerk ) ,
438
+ common ( { mode, variant : variants . clerk } ) ,
439
+ commonForProd ( ) ,
440
+ commonForProdBundled ( ) ,
441
+ {
442
+ output : {
443
+ filename : '[name].js' ,
444
+ libraryTarget : 'commonjs' ,
445
+ } ,
446
+ plugins : [
447
+ // Include the lazy chunks in the bundle as well
448
+ // so that the final bundle can be imported and bundled again
449
+ // by a different bundler, eg the webpack instance used by react-scripts
450
+ new rspack . optimize . LimitChunkCountPlugin ( {
451
+ maxChunks : 1 ,
452
+ } ) ,
453
+ ] ,
454
+ optimization : {
455
+ splitChunks : false ,
456
+ } ,
407
457
} ,
408
- } ) ;
458
+ ) ;
409
459
410
460
/** @type { () => (import('@rspack/core').Configuration) } */
411
461
const commonForNoRHC = ( ) => ( {
@@ -424,7 +474,7 @@ const prodConfig = ({ mode, env, analysis }) => {
424
474
425
475
const clerkEsmNoRHC = merge (
426
476
entryForVariant ( variants . clerkNoRHC ) ,
427
- common ( { mode, disableRHC : true } ) ,
477
+ common ( { mode, disableRHC : true , variant : variants . clerkNoRHC } ) ,
428
478
commonForProd ( ) ,
429
479
commonForProdBundled ( ) ,
430
480
commonForNoRHC ( ) ,
@@ -441,7 +491,7 @@ const prodConfig = ({ mode, env, analysis }) => {
441
491
442
492
const clerkCjsNoRHC = merge (
443
493
entryForVariant ( variants . clerkNoRHC ) ,
444
- common ( { mode, disableRHC : true } ) ,
494
+ common ( { mode, disableRHC : true , variant : variants . clerkNoRHC } ) ,
445
495
commonForProd ( ) ,
446
496
commonForProdBundled ( ) ,
447
497
commonForNoRHC ( ) ,
@@ -458,7 +508,16 @@ const prodConfig = ({ mode, env, analysis }) => {
458
508
return [ clerkBrowser ] ;
459
509
}
460
510
461
- return [ clerkBrowser , clerkHeadless , clerkHeadlessBrowser , clerkEsm , clerkEsmNoRHC , clerkCjs , clerkCjsNoRHC ] ;
511
+ return [
512
+ clerkBrowser ,
513
+ clerkLegacyBrowser ,
514
+ clerkHeadless ,
515
+ clerkHeadlessBrowser ,
516
+ clerkEsm ,
517
+ clerkEsmNoRHC ,
518
+ clerkCjs ,
519
+ clerkCjsNoRHC ,
520
+ ] ;
462
521
} ;
463
522
464
523
/**
@@ -527,31 +586,31 @@ const devConfig = ({ mode, env }) => {
527
586
// prettier-ignore
528
587
[ variants . clerk ] : merge (
529
588
entryForVariant ( variants . clerk ) ,
530
- common ( { mode } ) ,
589
+ common ( { mode, variant : variants . clerk } ) ,
531
590
commonForDev ( ) ,
532
591
) ,
533
592
// prettier-ignore
534
593
[ variants . clerkBrowser ] : merge (
535
594
entryForVariant ( variants . clerkBrowser ) ,
536
595
isSandbox ? { entry : { sandbox : './sandbox/app.ts' } } : { } ,
537
- common ( { mode } ) ,
596
+ common ( { mode, variant : variants . clerkBrowser } ) ,
538
597
commonForDev ( ) ,
539
598
) ,
540
599
// prettier-ignore
541
600
[ variants . clerkBrowserNoRHC ] : merge (
542
601
entryForVariant ( variants . clerkBrowserNoRHC ) ,
543
- common ( { mode, disableRHC : true } ) ,
602
+ common ( { mode, disableRHC : true , variant : variants . clerkBrowserNoRHC } ) ,
544
603
commonForDev ( ) ,
545
604
) ,
546
605
[ variants . clerkHeadless ] : merge (
547
606
entryForVariant ( variants . clerkHeadless ) ,
548
- common ( { mode } ) ,
607
+ common ( { mode, variant : variants . clerkHeadless } ) ,
549
608
commonForDev ( ) ,
550
609
// externalsForHeadless(),
551
610
) ,
552
611
[ variants . clerkHeadlessBrowser ] : merge (
553
612
entryForVariant ( variants . clerkHeadlessBrowser ) ,
554
- common ( { mode } ) ,
613
+ common ( { mode, variant : variants . clerkHeadlessBrowser } ) ,
555
614
commonForDev ( ) ,
556
615
// externalsForHeadless(),
557
616
) ,
0 commit comments