Skip to content

Commit 4dd2079

Browse files
committed
transform-plugins.js work right
1 parent 753aa15 commit 4dd2079

File tree

3 files changed

+87
-11
lines changed

3 files changed

+87
-11
lines changed

.babelrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"plugins": ["./index"],
2+
"plugins": ["./transform-plugins"],
33
"ignore": ["node_modules"]
44
}

test/test.js

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,34 @@
11
const {expect} = require('chai')
22
const {transform} = require('babel-core')
33

4+
describe('transform-plugins', () => {
5+
var lib = function (code) {
6+
return transform(code, {
7+
plugins: ['./transform-plugins']
8+
}).code
9+
}
10+
11+
it('should transform plugins literal, should not transform non-literal', () => {
12+
let node = `!{plugins: [{'default-unit-234': 'px'}, {selector: abc}]}`
13+
expect(lib(node)).to.equal(`import cssobj_plugin_default_unit_234 from 'cssobj-plugin-default-unit-234';
14+
!{ plugins: [cssobj_plugin_default_unit_234('px'), { selector: abc }] };`)
15+
16+
node = `!{plugins: [{'default-unit-234': 'px'}, {'localize': {space:'_my_'}}]}`
17+
expect(lib(node)).to.equal(`import cssobj_plugin_localize from 'cssobj-plugin-localize';
18+
import cssobj_plugin_default_unit_234 from 'cssobj-plugin-default-unit-234';
19+
!{ plugins: [cssobj_plugin_default_unit_234('px'), cssobj_plugin_localize({ space: '_my_' })] };`)
20+
})
21+
22+
it('should work with empty or non-plugins', () => {
23+
let node = `!{plugins: null}`
24+
expect(lib(node)).to.equal(`!{ plugins: null };`)
25+
node = `!{plugins: []}`
26+
expect(lib(node)).to.equal(`!{ plugins: [] };`)
27+
node = `!{plugins: {abc: 'def'}}`
28+
expect(lib(node)).to.equal(`!{ plugins: { abc: 'def' } };`)
29+
})
30+
})
31+
432
describe('babel-plugin-transform-cssobj-jsx', () => {
533
var lib = function (code) {
634
return transform(code, {
@@ -9,32 +37,32 @@ describe('babel-plugin-transform-cssobj-jsx', () => {
937
}
1038

1139
it('should mapClass for string literal', () => {
12-
const node = `var d= result.mapClass(<div className='a b c'><p class='abc' shouldNotMap='cde'>test</p></div>)`
40+
let node = `var d= result.mapClass(<div className='a b c'><p class='abc' shouldNotMap='cde'>test</p></div>)`
1341
expect(lib(node)).to.equal(`var d = <div className={result.mapClass('a b c')}><p class={result.mapClass('abc')} shouldNotMap="cde">test</p></div>;`)
1442
})
1543

1644
it('should mapClass for expression container', () => {
17-
const node = `var d= result.mapClass(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
45+
let node = `var d= result.mapClass(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
1846
expect(lib(node)).to.equal(`var d = <div className={result.mapClass('a b c')}><p class={result.mapClass(getClass())}>test</p></div>;`)
1947
})
2048

2149
it('should mapClass using complex cssobj result', () => {
22-
const node = `var d= state.result().mapClass(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
50+
let node = `var d= state.result().mapClass(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
2351
expect(lib(node)).to.equal(`var d = <div className={state.result().mapClass('a b c')}><p class={state.result().mapClass(getClass())}>test</p></div>;`)
2452
})
2553

2654
it('should not work with computed object', () => {
27-
const node = `var d= result['mapClass'](<div className='a b c'><p class='abc'>test</p></div>)`
55+
let node = `var d= result['mapClass'](<div className='a b c'><p class='abc'>test</p></div>)`
2856
expect(lib(node)).to.equal(`var d = result['mapClass'](<div className="a b c"><p class="abc">test</p></div>);`)
2957
})
3058

3159
it('should not work with non-member func call', () => {
32-
const node = `var d= mapClass(<div className='a b c'><p class='abc'>test</p></div>)`
60+
let node = `var d= mapClass(<div className='a b c'><p class='abc'>test</p></div>)`
3361
expect(lib(node)).to.equal(`var d = mapClass(<div className="a b c"><p class="abc">test</p></div>);`)
3462
})
3563

3664
it('should not work with non-jsx args', () => {
37-
const node = `var d= result.mapClass('abc')`
65+
let node = `var d= result.mapClass('abc')`
3866
expect(lib(node)).to.equal(`var d = result.mapClass('abc');`)
3967
})
4068

@@ -48,22 +76,22 @@ describe('babel-plugin-transform-cssobj-jsx with mapName option', () => {
4876
}).code
4977
}
5078
it('should mapClass for string literal', () => {
51-
const node = `var d= result.makeLocal(<div className='a b c'><p class='abc'>test</p></div>)`
79+
let node = `var d= result.makeLocal(<div className='a b c'><p class='abc'>test</p></div>)`
5280
expect(lib(node)).to.equal(`var d = <div className={result.mapClass('a b c')}><p class={result.mapClass('abc')}>test</p></div>;`)
5381
})
5482

5583
it('should mapClass for expression container', () => {
56-
const node = `var d= result.makeLocal(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
84+
let node = `var d= result.makeLocal(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
5785
expect(lib(node)).to.equal(`var d = <div className={result.mapClass('a b c')}><p class={result.mapClass(getClass())}>test</p></div>;`)
5886
})
5987

6088
it('should mapClass using complex cssobj result', () => {
61-
const node = `var d= state.result().makeLocal(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
89+
let node = `var d= state.result().makeLocal(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
6290
expect(lib(node)).to.equal(`var d = <div className={state.result().mapClass('a b c')}><p class={state.result().mapClass(getClass())}>test</p></div>;`)
6391
})
6492

6593
it('should accept makeLocal only, without result', () => {
66-
const node = `var d= makeLocal(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
94+
let node = `var d= makeLocal(<div className={'a b c'}><p class={getClass()}>test</p></div>)`
6795
expect(lib(node)).to.equal(`var d = <div className={makeLocal('a b c')}><p class={makeLocal(getClass())}>test</p></div>;`)
6896
})
6997
})

transform-plugins.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
module.exports = function (babel) {
2+
var t = babel.types
3+
4+
return {
5+
visitor: {
6+
Program (path) {
7+
var firstExp = path.node.body[0]
8+
if(!t.isExpressionStatement(firstExp)
9+
|| !t.isUnaryExpression(firstExp.expression, {operator: '!'})
10+
|| !t.isObjectExpression(firstExp.expression.argument)) return
11+
// get target expression
12+
var node = firstExp.expression.argument
13+
// get plugins prop
14+
var pluginsNode = node.properties.filter(function(v) {
15+
return t.isIdentifier(v.key, {name: 'plugins'})
16+
&& t.isArrayExpression(v.value)
17+
}).shift()
18+
if(!pluginsNode) return
19+
// only transform literal keys with plugin names
20+
var elements = pluginsNode.value.elements
21+
for (var v, i = 0; i < elements.length; i++) {
22+
v = elements[i]
23+
if (t.isObjectExpression(v)
24+
&& v.properties.length == 1
25+
&& t.isLiteral(v.properties[0].key)
26+
// plugin name cannot be below keywords
27+
&& ['selector', 'value', 'post'].indexOf(v.properties[0].key.value) < 0) {
28+
var prop = v.properties[0].key.value
29+
var pluginIden = 'cssobj_plugin_' + prop.replace(/-/g, '_')
30+
var value = v.properties[0].value
31+
elements[i] = t.callExpression(
32+
t.identifier(pluginIden),
33+
value ? [value] : []
34+
)
35+
path.unshiftContainer(
36+
'body',
37+
t.importDeclaration(
38+
[t.importDefaultSpecifier(t.identifier(pluginIden))],
39+
t.stringLiteral('cssobj-plugin-'+prop)
40+
)
41+
)
42+
}
43+
}
44+
45+
}
46+
}
47+
}
48+
}

0 commit comments

Comments
 (0)