Skip to content

Commit 664beba

Browse files
committed
fix: error for too many icons in completeIconSet
When generating a complete icon set with a large number of icons. Typescript build fails with error: "Expression produces a union type that is too complex to represent"
1 parent 0b2ff27 commit 664beba

3 files changed

Lines changed: 79 additions & 18 deletions

File tree

src/lib/converters/files.converter.ts

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ async function generateTSXFiles(conversionOptions: FilesConversionOptions) {
3636
iconsFolderName,
3737
exportCompleteIconSet,
3838
completeIconSetName,
39-
barrelFileName
39+
barrelFileName,
40+
interfaceName,
41+
generateType
4042
} = conversionOptions;
4143

4244
const svgDefinitions = await callAndMonitorAsync<SvgDefinition[]>(
@@ -51,7 +53,14 @@ async function generateTSXFiles(conversionOptions: FilesConversionOptions) {
5153

5254
if (exportCompleteIconSet) {
5355
await callAndMonitorAsync<void>(
54-
generateCompleteIconSet.bind({}, svgDefinitions, outputDirectory, iconsFolderName, completeIconSetName),
56+
generateCompleteIconSet.bind(
57+
{},
58+
svgDefinitions,
59+
outputDirectory,
60+
iconsFolderName,
61+
completeIconSetName,
62+
generateType && interfaceName
63+
),
5564
'Export complete icon set'
5665
);
5766
generatedFileNames.push(completeIconSetName);
@@ -80,7 +89,8 @@ async function generateTSFiles(conversionOptions: FilesConversionOptions) {
8089
exportCompleteIconSet,
8190
completeIconSetName,
8291
compilationOutput,
83-
barrelFileName
92+
barrelFileName,
93+
generateType
8494
} = conversionOptions;
8595
await callAndMonitorAsync<void>(
8696
deleteFolder.bind({}, `${outputDirectory}/${iconsFolderName}`),
@@ -98,7 +108,14 @@ async function generateTSFiles(conversionOptions: FilesConversionOptions) {
98108

99109
if (exportCompleteIconSet) {
100110
await callAndMonitorAsync<void>(
101-
generateCompleteIconSet.bind({}, svgDefinitions, outputDirectory, iconsFolderName, completeIconSetName),
111+
generateCompleteIconSet.bind(
112+
{},
113+
svgDefinitions,
114+
outputDirectory,
115+
iconsFolderName,
116+
completeIconSetName,
117+
generateType && interfaceName
118+
),
102119
'Export complete icon set'
103120
);
104121
generatedFileNames.push(completeIconSetName);
@@ -182,9 +199,16 @@ const generateCompleteIconSet = async (
182199
svgDefinitions: SvgDefinition[],
183200
outputDirectory: string,
184201
iconsFolderName: string,
185-
completeIconSetName: string
202+
completeIconSetName: string,
203+
interfaceName?: string,
204+
modelFileName?: string
186205
): Promise<void> => {
187-
const completeIconSetContent = generateCompleteIconSetContent(svgDefinitions, completeIconSetName);
206+
const completeIconSetContent = generateCompleteIconSetContent(
207+
svgDefinitions,
208+
completeIconSetName,
209+
interfaceName,
210+
modelFileName
211+
);
188212
await writeFile(`${outputDirectory}/${iconsFolderName}`, completeIconSetName, completeIconSetContent);
189213
};
190214

src/lib/helpers/complete-icon-set-helper.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,27 @@ describe('Complete Iconset-helper', () => {
1919
const generatedContent = generateCompleteIconSetContent(fileNamesWithDefinitions, completeIconSetName);
2020
expect(unformatedString(expectedContent)).toEqual(unformatedString(generatedContent));
2121
});
22+
it('should add interface when specified', () => {
23+
let completeIconSetName = 'all-icons';
24+
const fileNamesWithDefinitions = [
25+
{ variableName: 'foo', prefix: 'sampleIcon', filenameWithoutEnding: 'foo' },
26+
{ variableName: 'bar', prefix: 'sampleIcon', filenameWithoutEnding: 'bar' },
27+
{ variableName: 'baz', prefix: 'sampleIcon', filenameWithoutEnding: 'baz' }
28+
] as any;
29+
const expectedContent = `
30+
import {MyIcon} from './my-icons';
31+
import {foo} from './sampleIcon-foo.icon';
32+
import {bar} from './sampleIcon-bar.icon';
33+
import {baz} from './sampleIcon-baz.icon';
34+
35+
export const allIcons:MyIcon[] = [foo as MyIcon, bar as MyIcon, baz as MyIcon];`;
36+
37+
const generatedContent = generateCompleteIconSetContent(
38+
fileNamesWithDefinitions,
39+
completeIconSetName,
40+
'MyIcon',
41+
'my-icons'
42+
);
43+
expect(unformatedString(expectedContent)).toEqual(unformatedString(generatedContent));
44+
});
2245
});

src/lib/helpers/complete-icon-set.helper.ts

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,51 @@ import { FILE_TYPE } from '../shared/file-type.model';
66

77
export const generateCompleteIconSetContent = (
88
svgDefinitions: SvgDefinition[],
9-
completeIconSetName: string
9+
completeIconSetName: string,
10+
interfaceName?: string,
11+
modelFileName?: string
1012
): string => {
11-
const importSection = generateImportSection(svgDefinitions);
12-
const exportSection = generateExportSection(svgDefinitions, completeIconSetName);
13+
const importSection = generateImportSection(svgDefinitions, interfaceName, modelFileName);
14+
const exportSection = generateExportSection(svgDefinitions, completeIconSetName, FILE_TYPE.TS, interfaceName);
1315
return `${importSection}${exportSection}`;
1416
};
1517

16-
const generateImportSection = (svgDefinitions: SvgDefinition[]): string =>
17-
svgDefinitions.reduce((acc: string, svgDefinition: SvgDefinition) => {
18+
const generateImportSection = (
19+
svgDefinitions: SvgDefinition[],
20+
interfaceName?: string,
21+
modelFileName?: string
22+
): string => {
23+
const imports =
24+
interfaceName && modelFileName ? generateNamedImportStatement(interfaceName, `./${modelFileName}`) : '';
25+
return svgDefinitions.reduce((acc: string, svgDefinition: SvgDefinition) => {
1826
acc += generateNamedImportStatement(
1927
svgDefinition.variableName,
2028
`./${svgDefinition.prefix}-${svgDefinition.filenameWithoutEnding}.icon`
2129
);
2230
return acc;
23-
}, '');
31+
}, imports);
32+
};
2433

2534
export const generateExportSection = (
2635
svgDefinitions: SvgDefinition[],
2736
completeIconSetName: string,
28-
fileType = FILE_TYPE.TS
29-
): string =>
30-
svgDefinitions.reduce((acc: string, svgDefinition: SvgDefinition, index: number) => {
37+
fileType = FILE_TYPE.TS,
38+
interfaceName?: string
39+
): string => {
40+
const interfaceSuffix = interfaceName ? `:${interfaceName}[]` : '';
41+
return svgDefinitions.reduce((acc: string, svgDefinition: SvgDefinition, index: number) => {
3142
const variableName =
3243
fileType === FILE_TYPE.TSX
3344
? svgDefinition.variableName.charAt(0).toUpperCase() + svgDefinition.variableName.slice(1)
3445
: svgDefinition.variableName;
3546

47+
const interfaceSuffix = interfaceName ? ` as ${interfaceName}` : '';
48+
3649
if (index === svgDefinitions.length - 1) {
37-
acc += `${variableName}];`;
50+
acc += `${variableName}${interfaceSuffix}];`;
3851
} else {
39-
acc += `${variableName},`;
52+
acc += `${variableName}${interfaceSuffix},`;
4053
}
4154
return acc;
42-
}, `export const ${camelCase(completeIconSetName)} = [`);
55+
}, `export const ${camelCase(completeIconSetName)}${interfaceSuffix} = [`);
56+
};

0 commit comments

Comments
 (0)