@@ -3,10 +3,13 @@ import rspack from '@rspack/core';
33import packageJSON from './package.json' with { type : 'json' } ;
44import path from 'path' ;
55import { fileURLToPath } from 'url' ;
6+ import { createRequire } from 'module' ;
67import { merge } from 'webpack-merge' ;
78import ReactRefreshPlugin from '@rspack/plugin-react-refresh' ;
89import { svgLoader , typescriptLoaderProd , typescriptLoaderDev } from '../../scripts/rspack-common.js' ;
910
11+ const require = createRequire ( import . meta. url ) ;
12+
1013const __filename = fileURLToPath ( import . meta. url ) ;
1114const __dirname = path . dirname ( __filename ) ;
1215
@@ -15,10 +18,12 @@ const isDevelopment = mode => !isProduction(mode);
1518
1619const variants = {
1720 uiBrowser : 'ui.browser' ,
21+ uiLegacyBrowser : 'ui.legacy.browser' ,
1822} ;
1923
2024const variantToSourceFile = {
2125 [ variants . uiBrowser ] : './src/index.browser.ts' ,
26+ [ variants . uiLegacyBrowser ] : './src/index.legacy.browser.ts' ,
2227} ;
2328
2429/**
@@ -126,9 +131,12 @@ const entryForVariant = variant => {
126131
127132/**
128133 * Common production configuration for chunked browser builds
134+ * @param {object } [options]
135+ * @param {string } [options.targets] - Browserslist targets
136+ * @param {boolean } [options.useCoreJs] - Whether to use core-js polyfills
129137 * @returns {import('@rspack/core').Configuration }
130138 */
131- const commonForProdBrowser = ( ) => {
139+ const commonForProdBrowser = ( { targets = 'last 2 years' , useCoreJs = false } = { } ) => {
132140 return {
133141 devtool : false ,
134142 output : {
@@ -138,7 +146,7 @@ const commonForProdBrowser = () => {
138146 globalObject : 'globalThis' ,
139147 } ,
140148 module : {
141- rules : [ svgLoader ( ) , ...typescriptLoaderProd ( { targets : 'last 2 years' } ) ] ,
149+ rules : [ svgLoader ( ) , ...typescriptLoaderProd ( { targets, useCoreJs } ) ] ,
142150 } ,
143151 optimization : {
144152 minimize : true ,
@@ -157,13 +165,22 @@ const commonForProdBrowser = () => {
157165 } ) ,
158166 ] ,
159167 } ,
168+ ...( useCoreJs
169+ ? {
170+ resolve : {
171+ alias : {
172+ 'core-js' : path . dirname ( require . resolve ( 'core-js/package.json' ) ) ,
173+ } ,
174+ } ,
175+ }
176+ : { } ) ,
160177 } ;
161178} ;
162179
163180/**
164- * Production configuration - builds UMD browser variant only
181+ * Production configuration - builds UMD browser variants
165182 * @param {'development'|'production' } mode
166- * @returns {import('@rspack/core').Configuration }
183+ * @returns {import('@rspack/core').Configuration[] }
167184 */
168185const prodConfig = mode => {
169186 // Browser bundle with chunks (UMD)
@@ -173,7 +190,14 @@ const prodConfig = mode => {
173190 commonForProdBrowser ( ) ,
174191 ) ;
175192
176- return uiBrowser ;
193+ // Legacy browser bundle with chunks (UMD) for Safari 12 support
194+ const uiLegacyBrowser = merge (
195+ entryForVariant ( variants . uiLegacyBrowser ) ,
196+ common ( { mode, variant : variants . uiLegacyBrowser } ) ,
197+ commonForProdBrowser ( { targets : packageJSON . browserslistLegacy , useCoreJs : true } ) ,
198+ ) ;
199+
200+ return [ uiBrowser , uiLegacyBrowser ] ;
177201} ;
178202
179203/**
0 commit comments