import { parse } from '../src/parse' import { compileStyle, compileStyleAsync } from '../src/compileStyle' test('preprocess less', () => { const style = parse({ source: '\n', filename: 'example.vue', sourceMap: true }).styles[0] const result = compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: style.content, map: style.map, scoped: false, preprocessLang: style.lang }) expect(result.errors.length).toBe(0) expect(result.code).toEqual(expect.stringContaining('color: #ff0000;')) expect(result.map).toBeTruthy() }) test('preprocess scss', () => { const style = parse({ source: '\n', filename: 'example.vue', sourceMap: true }).styles[0] const result = compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: style.content, map: style.map, scoped: false, preprocessLang: style.lang }) expect(result.errors.length).toBe(0) expect(result.code).toMatch('color: red;') expect(result.map).toBeTruthy() }) test('preprocess sass', () => { const style = parse({ source: '\n', filename: 'example.vue', sourceMap: true }).styles[0] const result = compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: style.content, map: style.map, scoped: false, preprocessLang: style.lang }) expect(result.errors.length).toBe(0) expect(result.code).toMatch('color: red;') expect(result.map).toBeTruthy() }) test('preprocess stylus', () => { const style = parse({ source: '\n', filename: 'example.vue', sourceMap: true }).styles[0] const result = compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: style.content, map: style.map, scoped: false, preprocessLang: style.lang }) expect(result.errors.length).toBe(0) expect(result.code).toEqual(expect.stringContaining('color: #f00;')) expect(result.map).toBeTruthy() }) test('custom postcss plugin', () => { const spy = vi.fn() compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: '.foo { color: red }', scoped: false, postcssPlugins: [require('postcss').plugin('test-plugin', () => spy)()] }) expect(spy).toHaveBeenCalled() }) test('custom postcss options', () => { const result = compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: '.foo { color: red }', scoped: false, postcssOptions: { random: 'foo' } }) expect((result.rawResult as any).opts.random).toBe('foo') }) test('async postcss plugin in sync mode', () => { const result = compileStyle({ id: 'v-scope-xxx', filename: 'example.vue', source: '.foo { color: red }', scoped: false, postcssPlugins: [ require('postcss').plugin( 'test-plugin', () => async (result: any) => result ) ] }) expect(result.errors).toHaveLength(1) }) test('async postcss plugin', async () => { const promise = compileStyleAsync({ id: 'v-scope-xxx', filename: 'example.vue', source: '.foo { color: red }', scoped: false, postcssPlugins: [ require('postcss').plugin( 'test-plugin', () => async (result: any) => result ) ] }) expect(promise instanceof Promise).toBe(true) const result = await promise expect(result.errors).toHaveLength(0) expect(result.code).toEqual(expect.stringContaining('color: red')) }) test('media query', () => { const result = compileStyle({ id: 'v-scope-xxx', scoped: true, filename: 'example.vue', source: ` @media print { .foo { color: #000; } }` }) expect(result.errors).toHaveLength(0) expect(result.code).toContain( '@media print {\n.foo[v-scope-xxx] {\n color: #000;\n}\n}' ) }) test('supports query', () => { const result = compileStyle({ id: 'v-scope-xxx', scoped: true, filename: 'example.vue', source: ` @supports ( color: #000 ) { .foo { color: #000; } }` }) expect(result.errors).toHaveLength(0) expect(result.code).toContain( '@supports ( color: #000 ) {\n.foo[v-scope-xxx] {\n color: #000;\n}\n}' ) })