import { parseJsx } from '../__tests__/utils'
import {
getKaioTagNamesMapByPattern,
printAst,
transformSource,
type TransformSourceArgs,
} from '../utils'
import { upgradeIconV1 } from './upgradeIconV1'
const transformIcons = (sourceFile: TransformSourceArgs['sourceFile']): string => {
const kaioTagNamesMap = getKaioTagNamesMapByPattern(sourceFile, 'Icon$')
return transformSource({
sourceFile,
transformers: [upgradeIconV1(kaioTagNamesMap!)],
})
}
describe('upgradeIconV1()', () => {
describe('CaMonogramIcon to Brand', () => {
const transformedBrandProps = 'variant="enso" style={{ width: "20px" }}'
it('updates import from CaMonogramIcon to Brand', () => {
const inputAst = parseJsx(`
import { CaMonogramIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Brand } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('updates import from CaMonogramIcon using alias to Brand', () => {
const inputAst = parseJsx(`
import { CaMonogramIcon as LogoAlias } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Brand } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('does not add another Brand import if it is already imported', () => {
const inputAst = parseJsx(`
import { Brand, CaMonogramIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Brand } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('uses Brand alias for an existing import', () => {
const inputAst = parseJsx(`
import { Brand as KzBrand, CaMonogramIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Brand as KzBrand } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
})
describe('SpinnerIcon to LoadingSpinner', () => {
const transformedLoadingSpinnerProps = 'size="xs" accessibilityLabel="Loading"'
it('updates import from SpinnerIcon to LoadingSpinner', () => {
const inputAst = parseJsx(`
import { SpinnerIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { LoadingSpinner } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('updates import from SpinnerIcon using alias to LoadingSpinner', () => {
const inputAst = parseJsx(`
import { SpinnerIcon as LogoAlias } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { LoadingSpinner } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('does not add another LoadingSpinner import if it is already imported', () => {
const inputAst = parseJsx(`
import { LoadingSpinner, SpinnerIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { LoadingSpinner } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('uses LoadingSpinner alias for an existing import', () => {
const inputAst = parseJsx(`
import { LoadingSpinner as KzLoadingSpinner, SpinnerIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { LoadingSpinner as KzLoadingSpinner } from "@kaizen/components"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
})
it('transforms old Icon', () => {
const inputAst = parseJsx(`
import { FlagOnIcon } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Icon } from "@kaizen/components/next"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('transforms aliased old Icon', () => {
const inputAst = parseJsx(`
import { HamburgerIcon as IconAlias } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Icon } from "@kaizen/components/next"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
describe('import statements', () => {
it('does not update import of components which are not Icons', () => {
const inputAst = parseJsx(`
import { AddIcon, Card } from "@kaizen/components"
export const TestComponent = () =>
`)
const outputAst = parseJsx(`
import { Card } from "@kaizen/components"
import { Icon } from "@kaizen/components/next"
export const TestComponent = () =>
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
it('does not update import of components which are not from KAIO', () => {
const inputAst = parseJsx(`
import { AddIcon, HamburgerIcon as IconAlias } from "@kaizen/components"
import { HamburgerIcon as HamHam } from "somewhere-else"
export const TestComponent = () => (
<>
>
)
`)
const outputAst = parseJsx(`
import { Icon } from "@kaizen/components/next"
import { HamburgerIcon as HamHam } from "somewhere-else"
export const TestComponent = () => (
<>
>
)
`)
expect(transformIcons(inputAst)).toEqual(printAst(outputAst))
})
})
})