import { __unstable__loadDesignSystem } from '@tailwindcss/node'
import { expect, test } from 'vitest'
import { migrateThemeToVar } from './migrate-theme-to-var'
let css = String.raw
test.each([
['[color:red]', '[color:red]'],
['[--value:theme(spacing.1)]', '[--value:--spacing(1)]'],
['[--value:theme(fontSize.xs.1.lineHeight)]', '[--value:var(--text-xs--line-height)]'],
['[--value:theme(spacing[1.25])]', '[--value:--spacing(1.25)]'],
['[--value:theme(spacing[1.1])]', '[--value:theme(spacing[1.1])]'],
['[color:theme(colors.red.500)]', '[color:var(--color-red-500)]'],
['[color:theme(colors.red.500)]/50', '[color:var(--color-red-500)]/50'],
['bg-[theme(colors.red.500)]', 'bg-(--color-red-500)'],
['bg-[size:theme(spacing.4)]', 'bg-[size:--spacing(4)]'],
['w-[calc(100dvh-theme(spacing.2))]', 'w-[calc(100dvh-(--spacing(2)))]'],
['w-[calc(100dvh+theme(spacing.2))]', 'w-[calc(100dvh+(--spacing(2)))]'],
['w-[calc(100dvh/theme(spacing.2))]', 'w-[calc(100dvh/(--spacing(2)))]'],
['w-[calc(100dvh*theme(spacing.2))]', 'w-[calc(100dvh*(--spacing(2)))]'],
['bg-[theme(colors.red.500,red)]', 'bg-(--color-red-500,red)'],
['bg-[theme(colors.foo.1000)]', 'bg-[theme(colors.foo.1000)]'],
[
'bg-[theme(colors.foo.1000,theme(colors.red.500))]',
'bg-[theme(colors.foo.1000,var(--color-red-500))]',
],
['text-[calc(theme(fontSize.xs)*2)]', 'text-[calc(var(--text-xs)*2)]'],
[
'[color:theme(colors.red.500/50,theme(colors.blue.500/50))]',
'[color:--theme(--color-red-500/50,--theme(--color-blue-500/50))]',
],
[
'[color:theme(colors.red.500/50,theme(colors.blue.500/50))]/50',
'[color:--theme(--color-red-500/50,--theme(--color-blue-500/50))]/50',
],
['[color:theme(colors.red.500/75%)]', '[color:var(--color-red-500)]/75'],
['[color:theme(colors.red.500/.12)]', '[color:var(--color-red-500)]/12'],
['[color:theme(colors.red.500/0.12)]', '[color:var(--color-red-500)]/12'],
['[color:theme(colors.red.500/12.34%)]', '[color:var(--color-red-500)]/[12.34%]'],
['[color:theme(colors.red.500/var(--opacity))]', '[color:var(--color-red-500)]/(--opacity)'],
['[color:theme(colors.red.500/.12345)]', '[color:var(--color-red-500)]/[12.345]'],
['[color:theme(colors.red.500/50.25%)]', '[color:var(--color-red-500)]/[50.25%]'],
['bg-[theme(colors.red.500/75%)]', 'bg-(--color-red-500)/75'],
['bg-[theme(colors.red.500/12.34%)]', 'bg-(--color-red-500)/[12.34%]'],
['[color:theme(colors.red.500/50%)]/50', '[color:--theme(--color-red-500/50%)]/50'],
[
'shadow-[shadow:inset_0px_1px_theme(colors.white/15%)]',
'shadow-[shadow:inset_0px_1px_--theme(--color-white/15%)]',
],
['bg-[theme(colors.red.500/50%)]/50', 'bg-[--theme(--color-red-500/50%)]/50'],
['max-[theme(screens.lg)]:flex', 'max-[--theme(--breakpoint-lg)]:flex'],
['max-[theme(spacing.4)]:flex', 'max-[theme(spacing.4)]:flex'],
['max-[theme(spacing.4/50)]:flex', 'max-[theme(spacing.4/50)]:flex'],
['grid-cols-[min(50%_,_theme(spacing.80))_auto]', 'grid-cols-[min(50%,--spacing(80))_auto]'],
['[--foo:theme(transitionDuration.500)]', '[--foo:theme(transitionDuration.500)]'],
['max-w-[theme(screens.md)]', 'max-w-(--breakpoint-md)'],
['w-[theme(maxWidth.md)]', 'w-(--container-md)'],
['[--foo:theme(colors.red.500/50/50)]', '[--foo:theme(colors.red.500/50/50)]'],
['[--foo:theme(colors.red.500/50/50)]/50', '[--foo:theme(colors.red.500/50/50)]/50'],
[
'[--foo:theme(colors.red.500/50/50)_theme(colors.blue.200)]',
'[--foo:theme(colors.red.500/50/50)_var(--color-blue-200)]',
],
[
'[--foo:theme(colors.red.500/50/50)_theme(colors.blue.200)]/50',
'[--foo:theme(colors.red.500/50/50)_var(--color-blue-200)]/50',
],
])('%s => %s', async (candidate, result) => {
let designSystem = await __unstable__loadDesignSystem(
css`
@import 'tailwindcss';
`,
{
base: __dirname,
},
)
expect(migrateThemeToVar(designSystem, {}, candidate)).toEqual(result)
})
test('extended space scale converts to var or calc', async () => {
let designSystem = await __unstable__loadDesignSystem(
css`
@import 'tailwindcss';
@theme {
--spacing-2: 2px;
--spacing-miami: 0.875rem;
}
`,
{
base: __dirname,
},
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.1)]')).toEqual(
'[--value:--spacing(1)]',
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.2)]')).toEqual(
'[--value:var(--spacing-2)]',
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.miami)]')).toEqual(
'[--value:var(--spacing-miami)]',
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.nyc)]')).toEqual(
'[--value:theme(spacing.nyc)]',
)
})
test('custom space scale converts to var', async () => {
let designSystem = await __unstable__loadDesignSystem(
css`
@import 'tailwindcss';
@theme {
--spacing-*: initial;
--spacing-1: 0.25rem;
--spacing-2: 0.5rem;
}
`,
{
base: __dirname,
},
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.1)]')).toEqual(
'[--value:var(--spacing-1)]',
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.2)]')).toEqual(
'[--value:var(--spacing-2)]',
)
expect(migrateThemeToVar(designSystem, {}, '[--value:theme(spacing.3)]')).toEqual(
'[--value:theme(spacing.3)]',
)
})