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))
})
})
})