import { assert, test } from 'vitest' import { parse } from './parse' test('comments', () => { assert.deepEqual( parse(` underline /* multi line comment */ hover:focus:!( sm:(italic why) lg:-(px) -mx-1 ) /* Position */ !top-1 !-bottom-2 text-(xl black) `), [ { n: 'underline', v: [], i: false }, { n: 'italic', v: ['hover', 'focus', 'sm'], i: true }, { n: 'why', v: ['hover', 'focus', 'sm'], i: true }, { n: '-px', v: ['hover', 'focus', 'lg'], i: true }, { n: '-mx-1', v: ['hover', 'focus'], i: true }, { n: 'top-1', v: [], i: true }, { n: '-bottom-2', v: [], i: true }, { n: 'text-xl', v: [], i: false }, { n: 'text-black', v: [], i: false }, ], ) }) test('group with comma', () => { assert.deepEqual(parse(`hover:(!underline,focus:italic)`), [ { n: 'underline', v: ['hover'], i: true }, { n: 'italic', v: ['hover', 'focus'], i: false }, ]) }) test('nested', () => { assert.deepEqual(parse(`hover:~(!underline focus:italic)`), [ { n: '~(!underline,focus:italic)', v: ['hover'], i: false }, ]) }) test('nested with comma', () => { assert.deepEqual(parse(`hover:~(!underline,focus:italic,w-[1,2,theme(x[1.2])])`), [ { n: '~(!underline,focus:italic,w-[1,2,theme(x[1.2])])', v: ['hover'], i: false }, ]) }) test('nested and negative', () => { assert.deepEqual(parse(`rotate(-3 hover:6 md:(3,hover:-6))`), [ { n: '-rotate-3', v: [], i: false }, { n: 'rotate-6', v: ['hover'], i: false }, { n: 'rotate-3', v: ['md'], i: false }, { n: '-rotate-6', v: ['md', 'hover'], i: false }, ]) }) test('arbitray valiue', () => { assert.deepEqual( parse( `grid-cols-[repeat(auto-fit,minmax(150px,1fr))] background-color[#1da1f1] content["whoa"]`, ), [ { n: 'grid-cols-[repeat(auto-fit,minmax(150px,1fr))]', v: [], i: false }, { n: 'background-color[#1da1f1]', v: [], i: false }, { n: 'content["whoa"]', v: [], i: false }, ], ) }) test('attribute selector', () => { assert.deepEqual( parse(` not-[lang]:italic [data-reach-menu-item][data-selected]:bg-red-300 [href^='https'][href$='.org']:hover:bg-green-400 `), [ { n: 'italic', v: ['not-[lang]'], i: false }, { n: 'bg-red-300', v: ['[data-reach-menu-item][data-selected]'], i: false, }, { n: 'bg-green-400', v: [`[href^='https'][href$='.org']`, 'hover'], i: false, }, ], ) }) test('arbitrary properties', () => { assert.deepEqual(parse('![mask-type:luminance] hover:[mask-type:alpha]'), [ { n: '[mask-type:luminance]', v: [], i: true }, { n: '[mask-type:alpha]', v: ['hover'], i: false, }, ]) }) test('pseudo element selector', () => { assert.deepEqual(parse('after::underline'), [ { n: 'underline', v: ['after:'], i: false, }, ]) }) test('named shortcuts', () => { assert.deepEqual(parse('PrimaryButton~(bg-red-500 text-white)'), [ { n: 'PrimaryButton#1wkjmel', v: [], i: false, }, ]) assert.deepEqual(parse('hover:PrimaryButton~(bg-red-500 text-white)'), [ { n: 'PrimaryButton#1wkjmel', v: ['hover'], i: false, }, ]) }) test('named apply', () => { assert.deepEqual(parse('PrimaryButton@(bg-red-500 text-white)'), [ { n: 'PrimaryButton#1athxj9', v: [], i: false, }, ]) assert.deepEqual(parse('hover:PrimaryButton@(bg-red-500 text-white)'), [ { n: 'PrimaryButton#1athxj9', v: ['hover'], i: false, }, ]) }) test('anonymous apply', () => { assert.deepEqual(parse('@(bg-red-500 text-white)'), [ { n: '@(bg-red-500,text-white)', v: [], i: false, }, ]) assert.deepEqual(parse('hover:@(bg-red-500 text-white)'), [ { n: '@(bg-red-500,text-white)', v: ['hover'], i: false, }, ]) }) test('anonymous apply with comma', () => { assert.deepEqual( parse( '@(opacity-50,underline,text-[2rem],bg-blue-500,m-[.2rem],hover:opacity-90,max-w-[500px])', ), [ { n: '@(opacity-50,underline,text-[2rem],bg-blue-500,m-[.2rem],hover:opacity-90,max-w-[500px])', v: [], i: false, }, ], ) }) test('apply with dark in nested with grouping', () => { assert.deepEqual(parse('hover:@(text-blue-400 focus:(text-blue-(600 dark:100)))'), [ { n: '@(text-blue-400,focus:text-blue-600,dark:focus:text-blue-100)', v: ['hover'], i: false, }, ]) assert.deepEqual(parse('hover:dark:@(text-blue-400 focus:(text-blue-(600 dark:100)))'), [ { n: '@(text-blue-400,focus:text-blue-600,focus:text-blue-100)', v: ['dark', 'hover'], i: false, }, ]) }) test('primary-foreground-(light dark:dark)', () => { assert.deepEqual(parse('primary-foreground-(light dark:dark)'), [ { n: 'primary-foreground-light', v: [], i: false }, { n: 'primary-foreground-dark', v: ['dark'], i: false }, ]) }) test('utility grouping', () => { assert.deepEqual(parse('rotate-(-3,hover:6,md:(3 hover:-6))'), [ { n: '-rotate-3', v: [], i: false }, { n: 'rotate-6', v: ['hover'], i: false }, { n: 'rotate-3', v: ['md'], i: false }, { n: '-rotate-6', v: ['md', 'hover'], i: false }, ]) }) test('groups with arbitrary values', () => { assert.deepEqual( parse(` grid-template-( areas["head_head"_"nav_main"_"nav_foot"] columns[150px_1fr] rows[50px_1fr_30px] md:( areas["head"_"nav"_"main"_"foot"] columns[150px_1fr] rows[5rem_auto] ) ) `), [ { n: 'grid-template-areas["head_head"_"nav_main"_"nav_foot"]', v: [], i: false, }, { n: 'grid-template-columns[150px_1fr]', v: [], i: false }, { n: 'grid-template-rows[50px_1fr_30px]', v: [], i: false }, { n: 'grid-template-areas["head"_"nav"_"main"_"foot"]', v: ['md'], i: false, }, { n: 'grid-template-columns[150px_1fr]', v: ['md'], i: false }, { n: 'grid-template-rows[5rem_auto]', v: ['md'], i: false }, ], ) })