import { transform } from '@babel/core'
import syntaxJSX from 'babel-plugin-syntax-jsx'
import { describe, expect, test } from 'vitest'
import jSXStylePlugin from '../src/index'
describe('jsx style plugin', () => {
function getTransformCode (
source: string,
debug = false,
options: { enableCSSModule?: boolean, enableMultipleClassName?: boolean } = {}
) {
const { enableCSSModule, enableMultipleClassName = false } = options
const result = transform(source, {
plugins: [[jSXStylePlugin, { enableCSSModule, enableMultipleClassName }], syntaxJSX],
configFile: false
})
if (!result || !result.code) {
throw new Error('Babel transform returned no code')
}
const code = result.code
if (debug) {
// eslint-disable-next-line
console.log(source + '\n')
// eslint-disable-next-line
console.log(code)
}
return code
}
test('no stylesheet import', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
class App extends Component {
render() {
return
;
}
}`)).toBe(`import { createElement, Component } from 'rax';
class App extends Component {
render() {
return ;
}
}`)
})
test('transform only one className to style as member', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('transform multiple classNames to style as array', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('transform array, object and expressions', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('combine multiple anonymous css file', () => {
expect(getTransformCode(`import { createElement, Component } from 'rax';
import './app1.css';
import './app2.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('combine the same filename style source', () => {
expect(getTransformCode(`import { createElement, Component } from 'rax';
import './app.css';
import '../a/app.css';
import '../b/app.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('combine one style and className', () => {
expect(getTransformCode(`import { createElement, Component } from 'rax';
import './app.css';
import style from './style.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('combine inline style object and className', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import "./app.css";
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('combine multiple styles and className', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
import style from './style.css';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('do not transform code when no css file', () => {
const code = `import { createElement, Component } from 'rax';
class App extends Component {
render() {
return ;
}
}`
expect(getTransformCode(code)).toBe(code)
})
test('transform scss file', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.scss';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('transform scss file with hyphen(-) in the filename', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app-style.scss';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('transform constant elements in render', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
import './app.css';
render();
`)).toMatchSnapshot()
})
test('transform stylus in render', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
import './app.styl';
render();
`)).toMatchSnapshot()
})
test('transform less in render', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
import './app.less';
render();
`)).toMatchSnapshot()
})
test('combine multiple different extension style sources', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
import './index.css'
import './index.scss'
import '../index.less'
import styl from './index.styl'
render();
`)).toMatchSnapshot()
})
test('transform styleAttribute expression', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
import './app.less';
render();
`)).toMatchSnapshot()
})
test('transform styleAttribute inline string', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
render();
`)).toBe(`import { createElement, render } from 'rax';
render();`)
})
test('transform styleAttribute inline string and exsit classNameAttribute', () => {
expect(getTransformCode(`
import { createElement, render } from 'rax';
import './app.less';
render();
`)).toMatchSnapshot()
})
test('Provide a default stylesheet object when css module enable and import css module sheet only', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import styleSheet from './app.module.scss';
class App extends Component {
render() {
return ;
}
}`, false, { enableCSSModule: true })).toMatchSnapshot()
})
test('Processing module style assignment When css module enable', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.scss';
import styleSheet from './app.module.scss';
class App extends Component {
render() {
const a = styleSheet.red
return ;
}
}`, false, { enableCSSModule: true })).toMatchSnapshot()
})
test('Processing multiple module style When css module enable', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import styleSheet from './app.module.scss';
import styleSheet2 from './app2.module.scss';
class App extends Component {
render() {
const a = styleSheet.red
return ;
}
}`, false, { enableCSSModule: true })).toMatchSnapshot()
})
test('Processing module style spread and assign When css module enable', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.scss';
import styleSheet from './app.module.scss';
class App extends Component {
render() {
const a = { ...styleSheet.red };
const b = a;
return ;
}
}`, false, { enableCSSModule: true })).toMatchSnapshot()
})
test('Processing module style conditional expression When css module enable', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.scss';
import styleSheet from './app.module.scss';
class App extends Component {
render() {
const a = 1 ? styleSheet.red : styleSheet.blue;
return ;
}
}`, false, { enableCSSModule: true })).toMatchSnapshot()
})
test('Processing module style through call expression When css module enable', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import styleSheet from './app.module.scss';
class App extends Component {
render() {
const a = Object.assign({}, styleSheet.red);
const b = Object.assign({}, a);
return
;
}
}`, false, { enableCSSModule: true })).toMatchSnapshot()
})
test('merge stylesheet when css module disable', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.scss';
import styleSheet from './app.module.scss';
class App extends Component {
render() {
return ;
}
}`)).toMatchSnapshot()
})
test('disableMultipleClassName and transform multiple className to multiple style', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`, false, { enableMultipleClassName: false })).toMatchSnapshot()
})
test('enableMultipleClassName and transform multiple className to multiple style', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`, false, { enableMultipleClassName: true })).toMatchSnapshot()
})
test('enableMultipleClassName and transform multiple className to multiple style as array', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`, false, { enableMultipleClassName: true })).toMatchSnapshot()
})
test('enableMultipleClassName and transform error css value', () => {
expect(getTransformCode(`
import { createElement, Component } from 'rax';
import './app.css';
class App extends Component {
render() {
return ;
}
}`, false, { enableMultipleClassName: true })).toMatchSnapshot()
})
})