@@ -13,6 +13,11 @@ const sheetify = require('./index')
1313
1414module . exports = transform
1515
16+ function isBabelTemplateDefinition ( node ) {
17+ return node . type === 'CallExpression' &&
18+ node . callee . type === 'Identifier' && node . callee . name === '_taggedTemplateLiteral'
19+ }
20+
1621// inline sheetify transform for browserify
1722// obj -> (str, opts) -> str
1823function transform ( filename , options ) {
@@ -55,6 +60,7 @@ function transform (filename, options) {
5560 // but tough times call for tough measure. Please don't
5661 // judge us too harshly, we'll work on perf ✨soon✨ -yw
5762 const nodes = [ ]
63+ const babelTemplateObjects = { }
5864 const src = Buffer . concat ( bufs ) . toString ( 'utf8' )
5965 var mname = null
6066 var ast
@@ -103,27 +109,57 @@ function transform (filename, options) {
103109 }
104110
105111 function extractTemplateNodes ( node ) {
106- if ( node . type !== 'TemplateLiteral' ) return
107- if ( ! node . parent || ! node . parent . tag ) return
108- if ( node . parent . tag . name !== mname ) return
112+ var css
113+ var elements
114+
115+ if ( node . type === 'VariableDeclarator' && node . init && isBabelTemplateDefinition ( node . init ) ) {
116+ // Babel generates helper calls like
117+ // _taggedTemplateLiteral([":host .class { color: hotpink; }"], [":host .class { color: hotpink; }"])
118+ // we only keep the "cooked" part
119+ babelTemplateObjects [ node . id . name ] = node . init . arguments [ 0 ]
120+ }
109121
110- const css = [ node . quasis . map ( cooked ) ]
111- . concat ( node . expressions . map ( expr ) ) . join ( '' ) . trim ( )
122+ if ( node . type === 'TemplateLiteral' && node . parent && node . parent . tag ) {
123+ if ( node . parent . tag . name !== mname ) return
112124
113- const val = {
114- css : css ,
115- filename : filename ,
116- opts : xtend ( opts ) ,
117- node : node . parent
125+ css = [ node . quasis . map ( cooked ) ]
126+ . concat ( node . expressions . map ( expr ) ) . join ( '' ) . trim ( )
127+
128+ nodes . push ( {
129+ css : css ,
130+ filename : filename ,
131+ opts : xtend ( opts ) ,
132+ node : node . parent
133+ } )
118134 }
119135
120- nodes . push ( val )
136+ if ( node . type === 'CallExpression' && node . callee . type === 'Identifier' && node . callee . name === mname ) {
137+ if ( node . arguments [ 0 ] && node . arguments [ 0 ] . type === 'ArrayExpression' ) {
138+ // Buble generates code like
139+ // sheetify([":host .class { color: hotpink; }"])
140+ elements = node . arguments [ 0 ] . elements
141+ } else if ( node . arguments [ 0 ] && node . arguments [ 0 ] . type === 'Identifier' ) {
142+ // Babel generates code like
143+ // sheetify(_templateObject)
144+ elements = babelTemplateObjects [ node . arguments [ 0 ] . name ] . elements
145+ }
146+
147+ if ( elements ) {
148+ nodes . push ( {
149+ css : elements . map ( function ( part ) { return part . value } ) . join ( '' ) ,
150+ filename : filename ,
151+ opts : xtend ( opts ) ,
152+ node : node
153+ } )
154+ }
155+ }
121156 }
122157
123158 function extractImportNodes ( node ) {
124159 if ( node . type !== 'CallExpression' ) return
125160 if ( ! node . callee || node . callee . type !== 'Identifier' ) return
126161 if ( node . callee . name !== mname ) return
162+ if ( ! node . arguments [ 0 ] || ! node . arguments [ 0 ] . value ) return
127163 var pathOpts = { basedir : path . dirname ( filename ) }
128164 try {
129165 var resolvePath = cssResolve ( node . arguments [ 0 ] . value , pathOpts )
0 commit comments