mirror of https://github.com/vuejs/core.git
wip: update sfc style var injection syntax
ref: https://github.com/vuejs/rfcs/pull/231#issuecomment-728993116
This commit is contained in:
parent
41bb7fa330
commit
6e870f5b30
|
@ -2,52 +2,12 @@ import { compileStyle } from '../src'
|
||||||
import { compileSFCScript, assertCode } from './utils'
|
import { compileSFCScript, assertCode } from './utils'
|
||||||
|
|
||||||
describe('CSS vars injection', () => {
|
describe('CSS vars injection', () => {
|
||||||
describe('codegen', () => {
|
|
||||||
test('<script> w/ no default export', () => {
|
|
||||||
assertCode(
|
|
||||||
compileSFCScript(
|
|
||||||
`<script>const a = 1</script>\n` +
|
|
||||||
`<style>div{ color: var(--v-bind:color); }</style>`
|
|
||||||
).content
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('<script> w/ default export', () => {
|
|
||||||
assertCode(
|
|
||||||
compileSFCScript(
|
|
||||||
`<script>export default { setup() {} }</script>\n` +
|
|
||||||
`<style>div{ color: var(--:color); }</style>`
|
|
||||||
).content
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('<script> w/ default export in strings/comments', () => {
|
|
||||||
assertCode(
|
|
||||||
compileSFCScript(
|
|
||||||
`<script>
|
|
||||||
// export default {}
|
|
||||||
export default {}
|
|
||||||
</script>\n` + `<style>div{ color: var(--:color); }</style>`
|
|
||||||
).content
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
test('w/ <script setup>', () => {
|
|
||||||
assertCode(
|
|
||||||
compileSFCScript(
|
|
||||||
`<script setup>const color = 'red'</script>\n` +
|
|
||||||
`<style>div{ color: var(--:color); }</style>`
|
|
||||||
).content
|
|
||||||
)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
test('generating correct code for nested paths', () => {
|
test('generating correct code for nested paths', () => {
|
||||||
const { content } = compileSFCScript(
|
const { content } = compileSFCScript(
|
||||||
`<script>const a = 1</script>\n` +
|
`<script>const a = 1</script>\n` +
|
||||||
`<style>div{
|
`<style>div{
|
||||||
color: var(--v-bind:color);
|
color: v-bind(color);
|
||||||
color: var(--v-bind:font.size);
|
font-size: v-bind('font.size');
|
||||||
}</style>`
|
}</style>`
|
||||||
)
|
)
|
||||||
expect(content).toMatch(`_useCssVars(_ctx => ({
|
expect(content).toMatch(`_useCssVars(_ctx => ({
|
||||||
|
@ -71,9 +31,9 @@ describe('CSS vars injection', () => {
|
||||||
</script>\n` +
|
</script>\n` +
|
||||||
`<style>
|
`<style>
|
||||||
div {
|
div {
|
||||||
color: var(--:color);
|
color: v-bind(color);
|
||||||
font-size: var(--:size);
|
font-size: v-bind(size);
|
||||||
border: var(--:foo);
|
border: v-bind(foo);
|
||||||
}
|
}
|
||||||
</style>`
|
</style>`
|
||||||
)
|
)
|
||||||
|
@ -95,8 +55,8 @@ describe('CSS vars injection', () => {
|
||||||
test('should rewrite CSS vars in scoped mode', () => {
|
test('should rewrite CSS vars in scoped mode', () => {
|
||||||
const { code } = compileStyle({
|
const { code } = compileStyle({
|
||||||
source: `.foo {
|
source: `.foo {
|
||||||
color: var(--v-bind:color);
|
color: v-bind(color);
|
||||||
font-size: var(--:font.size);
|
font-size: v-bind('font.size');
|
||||||
}`,
|
}`,
|
||||||
filename: 'test.css',
|
filename: 'test.css',
|
||||||
id: 'data-v-test'
|
id: 'data-v-test'
|
||||||
|
@ -108,4 +68,44 @@ describe('CSS vars injection', () => {
|
||||||
}"
|
}"
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('codegen', () => {
|
||||||
|
test('<script> w/ no default export', () => {
|
||||||
|
assertCode(
|
||||||
|
compileSFCScript(
|
||||||
|
`<script>const a = 1</script>\n` +
|
||||||
|
`<style>div{ color: v-bind(color); }</style>`
|
||||||
|
).content
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('<script> w/ default export', () => {
|
||||||
|
assertCode(
|
||||||
|
compileSFCScript(
|
||||||
|
`<script>export default { setup() {} }</script>\n` +
|
||||||
|
`<style>div{ color: v-bind(color); }</style>`
|
||||||
|
).content
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('<script> w/ default export in strings/comments', () => {
|
||||||
|
assertCode(
|
||||||
|
compileSFCScript(
|
||||||
|
`<script>
|
||||||
|
// export default {}
|
||||||
|
export default {}
|
||||||
|
</script>\n` + `<style>div{ color: v-bind(color); }</style>`
|
||||||
|
).content
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('w/ <script setup>', () => {
|
||||||
|
assertCode(
|
||||||
|
compileSFCScript(
|
||||||
|
`<script setup>const color = 'red'</script>\n` +
|
||||||
|
`<style>div{ color: v-bind(color); }</style>`
|
||||||
|
).content
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -13,7 +13,7 @@ import { ParserPlugin } from '@babel/parser'
|
||||||
import postcss, { Root } from 'postcss'
|
import postcss, { Root } from 'postcss'
|
||||||
|
|
||||||
export const CSS_VARS_HELPER = `useCssVars`
|
export const CSS_VARS_HELPER = `useCssVars`
|
||||||
export const cssVarRE = /\bvar\(--(?:v-bind)?:([^)]+)\)/g
|
export const cssVarRE = /\bv-bind\(\s*(?:'([^']+)'|"([^"]+)"|([^'"][^)]*))\s*\)/g
|
||||||
|
|
||||||
export function convertCssVarCasing(raw: string): string {
|
export function convertCssVarCasing(raw: string): string {
|
||||||
return raw.replace(/([^\w-])/g, '_')
|
return raw.replace(/([^\w-])/g, '_')
|
||||||
|
@ -24,7 +24,7 @@ export function parseCssVars(sfc: SFCDescriptor): string[] {
|
||||||
sfc.styles.forEach(style => {
|
sfc.styles.forEach(style => {
|
||||||
let match
|
let match
|
||||||
while ((match = cssVarRE.exec(style.content))) {
|
while ((match = cssVarRE.exec(style.content))) {
|
||||||
vars.push(match[1])
|
vars.push(match[1] || match[2] || match[3])
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return vars
|
return vars
|
||||||
|
@ -38,8 +38,8 @@ export const cssVarsPlugin = postcss.plugin(
|
||||||
root.walkDecls(decl => {
|
root.walkDecls(decl => {
|
||||||
// rewrite CSS variables
|
// rewrite CSS variables
|
||||||
if (cssVarRE.test(decl.value)) {
|
if (cssVarRE.test(decl.value)) {
|
||||||
decl.value = decl.value.replace(cssVarRE, (_, $1) => {
|
decl.value = decl.value.replace(cssVarRE, (_, $1, $2, $3) => {
|
||||||
return `var(--${shortId}-${convertCssVarCasing($1)})`
|
return `var(--${shortId}-${convertCssVarCasing($1 || $2 || $3)})`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue