1
+ const path = require ( 'path' )
2
+ const fs = require ( 'fs' )
1
3
const getVueJestConfig = require ( './utils' ) . getVueJestConfig
4
+ const warn = require ( './utils' ) . warn
2
5
const cssExtract = require ( 'extract-from-css' )
3
6
4
7
module . exports = function processStyle ( stylePart , filePath , jestConfig = { } ) {
5
8
const vueJestConfig = getVueJestConfig ( jestConfig )
9
+ let cssTransform =
10
+ vueJestConfig [ 'cssTransform' ] &&
11
+ vueJestConfig [ 'cssTransform' ] [ stylePart . lang ]
12
+ const validTransforms = cssTransform && ( cssTransform . pre || cssTransform . post )
13
+ cssTransform = cssTransform || { }
6
14
7
15
if ( ! stylePart || vueJestConfig . experimentalCSSCompile === false ) {
8
16
return { }
9
17
}
10
18
11
- const processStyleByLang = lang =>
12
- require ( './compilers/' + lang + '-compiler' ) (
13
- stylePart . content ,
19
+ const globaResources = lang => {
20
+ let globalResources = ''
21
+ if ( vueJestConfig . resources && vueJestConfig . resources [ lang ] ) {
22
+ globalResources = vueJestConfig . resources [ lang ]
23
+ . map ( resource => path . resolve ( process . cwd ( ) , resource ) )
24
+ . filter ( resourcePath => fs . existsSync ( resourcePath ) )
25
+ . map ( resourcePath => fs . readFileSync ( resourcePath ) . toString ( ) )
26
+ . join ( '\n' )
27
+ }
28
+ return globalResources
29
+ }
30
+
31
+ const cssTransfomer = ( transform , content ) => {
32
+ if ( ! validTransforms || ! transform || typeof transform !== 'string' ) {
33
+ return content
34
+ }
35
+
36
+ const transformPath = / ^ ( \. \. \/ | \. \/ | \/ ) / . test ( transform ) ? path . resolve ( process . cwd ( ) , transform ) : transform
37
+ return require ( transformPath ) (
38
+ content ,
39
+ vueJestConfig ,
40
+ stylePart . attrs
41
+ )
42
+ }
43
+
44
+ const processStyleByLang = lang => {
45
+ const content = globaResources ( lang ) + stylePart . content
46
+ const preProcessedContent = cssTransfomer ( cssTransform . pre , content )
47
+ return require ( './compilers/' + lang + '-compiler' ) (
48
+ preProcessedContent ,
14
49
filePath ,
15
50
jestConfig
16
51
)
52
+ }
53
+
54
+ const extractClassMap = cssCode => {
55
+ const cssNames = cssExtract . extractClasses ( cssCode )
56
+ const obj = { }
57
+ for ( let i = 0 , l = cssNames . length ; i < l ; i ++ ) {
58
+ obj [ cssNames [ i ] ] = cssNames [ i ]
59
+ }
60
+
61
+ return obj
62
+ }
17
63
18
64
let cssCode = stylePart . content
19
65
switch ( stylePart . lang ) {
@@ -29,12 +75,17 @@ module.exports = function processStyle(stylePart, filePath, jestConfig = {}) {
29
75
break
30
76
}
31
77
32
- const cssNames = cssExtract . extractClasses ( cssCode )
33
-
34
- const obj = { }
35
- for ( let i = 0 , l = cssNames . length ; i < l ; i ++ ) {
36
- obj [ cssNames [ i ] ] = cssNames [ i ]
78
+ if ( validTransforms ) {
79
+ let locals = cssTransfomer ( cssTransform . post , cssCode )
80
+ if ( typeof locals !== 'object' ) {
81
+ ! vueJestConfig . hideStyleWarn &&
82
+ warn (
83
+ 'post-transformers are expected to return an object with key value pair as class names of the component'
84
+ )
85
+ locals = extractClassMap ( locals )
86
+ }
87
+ return locals
88
+ } else {
89
+ return extractClassMap ( cssCode )
37
90
}
38
-
39
- return obj
40
91
}
0 commit comments