import ts from 'typescript'
import { parseJsx } from '../__tests__/utils'
import { createJsxElementWithChildren, printAst } from '../utils'
import { transformV1ButtonAttributes } from './transformV1ButtonAttributes'
export const mockedTransformer =
(kaioComponentName: string) =>
(context: ts.TransformationContext) =>
(rootNode: ts.Node): ts.Node => {
const visit = (node: ts.Node): ts.Node => {
if (ts.isJsxSelfClosingElement(node)) {
const { targetComponentName, newAttributes, childrenValue } = transformV1ButtonAttributes(
node,
kaioComponentName,
)
return createJsxElementWithChildren(targetComponentName, newAttributes, childrenValue)
}
return ts.visitEachChild(node, visit, context)
}
return ts.visitNode(rootNode, visit)
}
const transformInput = (
sourceFile: ts.SourceFile,
kaioComponentName: string = 'Button',
): string => {
const result = ts.transform(sourceFile, [mockedTransformer(kaioComponentName)])
const transformedSource = result.transformed[0] as ts.SourceFile
return printAst(transformedSource)
}
describe('transformV1ButtonAttributes()', () => {
it('changes label to children', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('replaces IconButton with Button and changes label to children and adds hasHiddenLabel', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'',
)
expect(transformInput(inputAst, 'IconButton')).toEqual(printAst(outputAst))
})
it('replaces V1 Buttons with LinkButton if href exists', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'Pancakes',
)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('replaces V1 Buttons with LinkButton if component prop exists', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'Pancakes',
)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('will remove usage of `disableTabFocusAndIUnderstandTheAccessibilityImplications`', () => {
const inputAst = parseJsx(
'',
)
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
describe('transform existing props', () => {
it('changes onClick to onPress', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'',
)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes reversed to isReversed', () => {
const inputAst = parseJsx(`
<>
>
`)
const outputAst = parseJsx(`
<>
>
`)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes classNameOverride to className', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'',
)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes data-automation-id to data-testid', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'',
)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes disabled to isDisabled', () => {
const inputAst = parseJsx(`
<>
>
`)
const outputAst = parseJsx(`
<>
>
`)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes newTabAndIUnderstandTheAccessibilityImplications to target="_blank" and rel="noopener noreferrer"', () => {
const inputAst = parseJsx(
'',
)
const outputAst = parseJsx(
'Pancakes',
)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
describe('transform variant', () => {
it('changes default (undefined) for Button to variant secondary', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes default (undefined) for IconButton to variant tertiary', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx(
'',
)
expect(transformInput(inputAst, 'IconButton')).toEqual(printAst(outputAst))
})
it('changes primary to variant primary', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes secondary to variant tertiary', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('removes destructive', () => {
const inputAst = parseJsx(`
<>
>
`)
const outputAst = parseJsx(`
<>
>
`)
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
})
describe('transform size', () => {
it('changes default (undefined) to large', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes small to medium', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('changes regular to large', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
it('does not change a non-string value', () => {
const inputAst = parseJsx('')
const outputAst = parseJsx('')
expect(transformInput(inputAst)).toEqual(printAst(outputAst))
})
})
})
})