@@ -18,6 +18,7 @@ import {
18
18
} from '@babel/types'
19
19
import { walk } from 'estree-walker'
20
20
import { RawSourceMap } from 'source-map'
21
+ import { genCssVarsCode , injectCssVarsCalls } from './genCssVars'
21
22
22
23
export interface SFCScriptCompileOptions {
23
24
/**
@@ -49,13 +50,26 @@ export function compileScript(
49
50
)
50
51
}
51
52
52
- const { script, scriptSetup, source, filename } = sfc
53
+ const { script, scriptSetup, styles, source, filename } = sfc
54
+ const hasCssVars = styles . some ( s => typeof s . attrs . vars === 'string' )
55
+
56
+ const isTS =
57
+ ( script && script . lang === 'ts' ) ||
58
+ ( scriptSetup && scriptSetup . lang === 'ts' )
59
+
60
+ const plugins : ParserPlugin [ ] = [
61
+ ...( options . babelParserPlugins || [ ] ) ,
62
+ ...babelParserDefautPlugins ,
63
+ ...( isTS ? ( [ 'typescript' ] as const ) : [ ] )
64
+ ]
65
+
53
66
if ( ! scriptSetup ) {
54
67
if ( ! script ) {
55
68
throw new Error ( `SFC contains no <script> tags.` )
56
69
}
57
70
return {
58
71
...script ,
72
+ content : hasCssVars ? injectCssVarsCalls ( sfc , plugins ) : script . content ,
59
73
bindings : analyzeScriptBindings ( script )
60
74
}
61
75
}
@@ -95,13 +109,6 @@ export function compileScript(
95
109
const scriptStartOffset = script && script . loc . start . offset
96
110
const scriptEndOffset = script && script . loc . end . offset
97
111
98
- const isTS = scriptSetup . lang === 'ts'
99
- const plugins : ParserPlugin [ ] = [
100
- ...( options . babelParserPlugins || [ ] ) ,
101
- ...babelParserDefautPlugins ,
102
- ...( isTS ? ( [ 'typescript' ] as const ) : [ ] )
103
- ]
104
-
105
112
// 1. process normal <script> first if it exists
106
113
if ( script ) {
107
114
// import dedupe between <script> and <script setup>
@@ -496,7 +503,7 @@ export function compileScript(
496
503
// 6. wrap setup code with function.
497
504
// export the content of <script setup> as a named export, `setup`.
498
505
// this allows `import { setup } from '*.vue'` for testing purposes.
499
- s . appendLeft ( startOffset , `\nexport function setup(${ args } ) {\n` )
506
+ s . prependLeft ( startOffset , `\nexport function setup(${ args } ) {\n` )
500
507
501
508
// generate return statement
502
509
let returned = `{ ${ Object . keys ( setupExports ) . join ( ', ' ) } }`
@@ -511,6 +518,20 @@ export function compileScript(
511
518
returned = `Object.assign(\n ${ returned } \n)`
512
519
}
513
520
521
+ // inject `useCSSVars` calls
522
+ if ( hasCssVars ) {
523
+ s . prepend ( `import { useCSSVars as __useCSSVars__ } from 'vue'\n` )
524
+ for ( const style of styles ) {
525
+ const vars = style . attrs . vars
526
+ if ( typeof vars === 'string' ) {
527
+ s . prependRight (
528
+ endOffset ,
529
+ `\n${ genCssVarsCode ( vars , ! ! style . scoped , setupExports ) } `
530
+ )
531
+ }
532
+ }
533
+ }
534
+
514
535
s . appendRight ( endOffset , `\nreturn ${ returned } \n}\n\n` )
515
536
516
537
// 7. finalize default export
0 commit comments