Skip to content

Commit f024369

Browse files
committed
Treeshake Carbon React icons
1 parent 4702a5f commit f024369

File tree

1 file changed

+45
-3
lines changed

1 file changed

+45
-3
lines changed

packages/common/babel.config.js

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ const pascalToKebabCase = (name) =>
3737
.replace(/([A-Z])/, '-$1')
3838
.toLowerCase();
3939

40+
const pascalToKebabCaseCarbonIcons = (name) =>
41+
name.charAt(0).toLowerCase() +
42+
name
43+
.slice(1)
44+
.replace(/([A-Z])/g, '--$1')
45+
.toLowerCase();
46+
4047
const createSuirCJSTransform = (env = 'commonjs') => [
4148
'transform-imports',
4249
{
@@ -168,13 +175,20 @@ const createAntTransform = (env) => [
168175
`ant-${env}`
169176
]
170177

178+
const carbonMapper = (importName) => ({
179+
StructuredListWrapper: 'StructuredList',
180+
StructuredListBody: 'StructuredList',
181+
StructuredListRow: 'StructuredList',
182+
StructuredListCell: 'StructuredList',
183+
}[importName] || importName)
184+
171185
const createCarbonCJSTransform = (env) => [
172186
'transform-imports',
173187
{
174188
'carbon-components-react': {
175189
transform: (importName) => {
176190
let res;
177-
const files = glob.sync(path.resolve(__dirname, `../../node_modules/carbon-components-react/${env === 'cjs' ? 'lib' : 'es' }/**/${importName}.js`));
191+
const files = glob.sync(path.resolve(__dirname, `../../node_modules/carbon-components-react/${env === 'cjs' ? 'lib' : 'es' }/**/${carbonMapper(importName)}.js`));
178192
if (files.length > 0) {
179193
res = files[0];
180194
} else {
@@ -191,6 +205,32 @@ const createCarbonCJSTransform = (env) => [
191205
`carbon-components-react-${env}`
192206
];
193207

208+
const createCarbonIconsCJSTransform = (env) => [
209+
'transform-imports',
210+
{
211+
'@carbon/icons-react': {
212+
transform: (importName) => {
213+
let size = importName.match(/\d+/)[0];
214+
let iconName = pascalToKebabCaseCarbonIcons(importName.replace(/\d+/, ''));
215+
216+
let res;
217+
const files = glob.sync(path.resolve(__dirname, `../../node_modules/@carbon/icons-react/${env === 'cjs' ? 'lib' : 'es' }/${iconName}/${size}.js`));
218+
if (files.length > 0) {
219+
res = files[0];
220+
} else {
221+
throw new Error(`File with importName ${importName} does not exist`);
222+
}
223+
res = res.replace(path.resolve(__dirname, '../../node_modules/'), '');
224+
res = res.replace(/^\//, '');
225+
return res;
226+
},
227+
preventFullImport: false,
228+
skipDefaultConversion: false
229+
}
230+
},
231+
`@carbon/icons-react-${env}`
232+
];
233+
194234
module.exports = {
195235
extends: '../../babel.config.js',
196236
env: {
@@ -201,7 +241,8 @@ module.exports = {
201241
createPfReactTransform('js'),
202242
createBluePrintTransform('cjs'),
203243
createAntTransform('cjs'),
204-
createCarbonCJSTransform('cjs')
244+
createCarbonCJSTransform('cjs'),
245+
createCarbonIconsCJSTransform('cjs')
205246
]
206247
},
207248
esm: {
@@ -211,7 +252,8 @@ module.exports = {
211252
createPfReactTransform('esm'),
212253
createBluePrintTransform('esm'),
213254
createAntTransform('esm'),
214-
createCarbonCJSTransform('esm')
255+
createCarbonCJSTransform('esm'),
256+
createCarbonIconsCJSTransform('esm')
215257
]
216258
}
217259
}

0 commit comments

Comments
 (0)