import ts from 'typescript' import { parseJsx } from '../__tests__/utils' import { printAst } from '../utils' import { getNewIconPropsFromOldIconName } from './getNewIconPropsFromOldIconName' import { transformIcon } from './transformIcon' export const mockedTransformer = (context: ts.TransformationContext) => (rootNode: ts.Node): ts.Node => { const visit = (node: ts.Node): ts.Node => { if (ts.isJsxOpeningElement(node) || ts.isJsxSelfClosingElement(node)) { const oldIconName = node.tagName.getText() const newIconProps = getNewIconPropsFromOldIconName(oldIconName) return transformIcon(node, newIconProps!.name, newIconProps!.isFilled) } return ts.visitEachChild(node, visit, context) } return ts.visitNode(rootNode, visit) } const transformInput = (sourceFile: ts.SourceFile): string => { const result = ts.transform(sourceFile, [mockedTransformer]) const transformedSource = result.transformed[0] as ts.SourceFile return printAst(transformedSource) } describe('transformIcon()', () => { it('renames component and adds equivalent props', () => { const inputAst = parseJsx(` export const TestComponent = () => ( <> ) `) const outputAst = parseJsx(` export const TestComponent = () => ( <> ) `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) describe('transform existing props', () => { it('replaces role and aria-label with equivalent prop', () => { const inputAst = parseJsx(` export const TestComponent = () => ( <> ) `) const outputAst = parseJsx(` export const TestComponent = () => ( <> ) `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('replaces classNameOverride with className prop', () => { const inputAst = parseJsx(` export const TestComponent = () => `) const outputAst = parseJsx(` export const TestComponent = () => `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('leaves inheritSize - this should throw a TS error for the consumer', () => { const inputAst = parseJsx(` export const TestComponent = () => `) const outputAst = parseJsx(` export const TestComponent = () => `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('removes aria-hidden', () => { const inputAst = parseJsx(` export const TestComponent = () => `) const outputAst = parseJsx(` export const TestComponent = () => `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('removes fontSize', () => { const inputAst = parseJsx(` export const TestComponent = () => `) const outputAst = parseJsx(` export const TestComponent = () => `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('removes viewBox', () => { const inputAst = parseJsx(` export const TestComponent = () => `) const outputAst = parseJsx(` export const TestComponent = () => `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) describe('color prop to style', () => { it('transforms a string value', () => { const inputAst = parseJsx(` export const TestComponent = () => ( <> ) `) const outputAst = parseJsx(` export const TestComponent = () => ( <> ) `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) it('transforms a variable', () => { const inputAst = parseJsx(` export const TestComponent = () => ( <> ) `) const outputAst = parseJsx(` export const TestComponent = () => ( <> ) `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) }) it('transforms height and width to style', () => { const inputAst = parseJsx(` export const TestComponent = () => `) const outputAst = parseJsx(` export const TestComponent = () => `) expect(transformInput(inputAst)).toEqual(printAst(outputAst)) }) }) })