Skip to content

Commit

Permalink
feat: 馃幐 add IconNameSubset helper type
Browse files Browse the repository at this point in the history
This helper type can be used to generate types for your icons. `type
emojiIcons = IconNameSubset<[typeof myIconSmile, typeof myIconLaugh]>;`
  • Loading branch information
kreuzerk committed Oct 13, 2020
1 parent d21138f commit d56e890
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 6 deletions.
8 changes: 5 additions & 3 deletions src/lib/converters/constants.converter.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import {
generateInterfaceDefinition,
generateSvgConstant,
generateTypeDefinition
generateTypeDefinition,
generateTypeHelper
} from '../generators/code-snippet-generators';
import { writeFile } from '../helpers/file-helpers';
import { error, success, underlineSuccess } from '../helpers/log-helper';
Expand All @@ -17,14 +18,15 @@ const getSvgConstants = svgDefinitions => {
};

export const convertToConstants = async (conversionOptions: ConstantsConversionOptions): Promise<void> => {
const { outputDirectory, fileName } = conversionOptions;
const { outputDirectory, fileName, interfaceName } = conversionOptions;
try {
const svgDefinitions = await filesProcessor(conversionOptions);
if (svgDefinitions.length) {
const svgContants = getSvgConstants(svgDefinitions);
const typeDefinition = generateTypeDefinition(conversionOptions, svgDefinitions);
const interfaceDefinition = generateInterfaceDefinition(conversionOptions);
const fileContent = `${svgContants}${typeDefinition}${interfaceDefinition}`;
const typeHelper = generateTypeHelper(interfaceName);
const fileContent = `${svgContants}${typeDefinition}${interfaceDefinition}${typeHelper}`;
await writeFile(outputDirectory, fileName, fileContent);
success(`Icons file successfully generated under ${underlineSuccess(outputDirectory)}`);
}
Expand Down
8 changes: 5 additions & 3 deletions src/lib/converters/files.converter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import {
generateExportStatement,
generateInterfaceDefinition,
generateSvgConstant,
generateTypeDefinition
generateTypeDefinition,
generateTypeHelperWithImport
} from '../generators/code-snippet-generators';
import { generateCompleteIconSetContent } from '../helpers/complete-icon-set.helper';
import { deleteFiles, deleteFolder, writeFile } from '../helpers/file-helpers';
Expand All @@ -19,6 +20,7 @@ export const convertToFiles = async (conversionOptions: FileConversionOptions):
modelFileName,
additionalModelOutputPath,
iconsFolderName,
interfaceName,
compileSources,
exportCompleteIconSet,
barrelFileName
Expand Down Expand Up @@ -49,10 +51,10 @@ export const convertToFiles = async (conversionOptions: FileConversionOptions):
generatedFileNames.push(completeIconSetFileName);
}

let indexFileContent = generatedFileNames
let indexFileContent = generateTypeHelperWithImport(interfaceName, iconsFolderName, modelFileName);
indexFileContent += generatedFileNames
.map((generatedFileName: string) => generateExportStatement(generatedFileName, iconsFolderName))
.join('');

separatorEnd();

indexFileContent += generateExportStatement(modelFileName, iconsFolderName);
Expand Down
29 changes: 29 additions & 0 deletions src/lib/generators/code-snippet-generators.spec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { SvgDefinition } from '../converters/shared.converter';
import { unformatedString } from '../helpers/test-helpers';
import { ConstantsConversionOptions } from '../options/conversion-options';

import {
Expand All @@ -7,6 +8,8 @@ import {
generateNamedImportStatement,
generateSvgConstant,
generateTypeDefinition,
generateTypeHelper,
generateTypeHelperWithImport,
generateTypeName,
generateVariableName
} from './code-snippet-generators';
Expand Down Expand Up @@ -148,4 +151,30 @@ describe('Generators', () => {
expect(generatedNamedImpoort).toEqual(expectedNamedImport);
});
});

describe('Type helper', () => {
it('should generate the correct type helper statement', () => {
const interfaceName = 'MyIcons';
const expectedStatement = `
export type IconNameSubset<T extends Readonly<${interfaceName}[]>> = T[number]['name'];
`;

const generatedStatement = generateTypeHelper(interfaceName);
expect(unformatedString(generatedStatement)).toEqual(unformatedString(expectedStatement));
});

it('should generate the correct type helper and import statement', () => {
const interfaceName = 'MyIcon';
const modelFileName = 'my-icons';
const iconsFolderName = 'build';

const expectedStatement = `
import {${interfaceName}} from './${iconsFolderName}/${modelFileName}';
export type IconNameSubset<T extends Readonly<${interfaceName}[]>> = T[number]['name'];
`;

const generatedStatement = generateTypeHelperWithImport(interfaceName, iconsFolderName, modelFileName);
expect(unformatedString(generatedStatement)).toEqual(unformatedString(expectedStatement));
});
});
});
13 changes: 13 additions & 0 deletions src/lib/generators/code-snippet-generators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,19 @@ export const generateVariableName = (prefix: string, filenameWithoutEnding): str
return prefix ? `${prefix}${capitalize(camelCased)}` : camelCased;
};

export const generateTypeHelper = (interfaceName: string): string => `
export type IconNameSubset<T extends Readonly<${interfaceName}[]>> = T[number]['name'];
`;

export const generateTypeHelperWithImport = (
interfaceName: string,
iconsFolderName: string,
modelFileName: string
): string => `
import {${interfaceName}} from './${iconsFolderName}/${modelFileName}';
${generateTypeHelper(interfaceName)}
`;

const capitalize = (value: string): string => {
return value.charAt(0).toUpperCase() + value.slice(1);
};

0 comments on commit d56e890

Please sign in to comment.