Skip to content

Commit 7312695

Browse files
committed
first commit
1 parent e23753e commit 7312695

File tree

6 files changed

+179
-1
lines changed

6 files changed

+179
-1
lines changed

.babelrc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"plugins": ["./index"],
3+
"ignore": ["node_modules"]
4+
}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

README.md

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,74 @@
11
# babel-plugin-transform-cssobj-jsx
2-
Babel plugin to transform class names into cssobj localized
2+
Babel plugin to transform class names into cssobj localized names, easily transform existing code into cssobj.
3+
4+
## Usage
5+
6+
1. Install
7+
8+
``` bash
9+
npm install --save-dev babel-plugin-syntax-jsx babel-plugin-transform-cssobj-jsx
10+
```
11+
12+
2. In your `.babelrc`:
13+
14+
``` json
15+
{
16+
"plugins": ["transform-cssobj-jsx"]
17+
}
18+
```
19+
20+
3. In you JSX, consume cssobj result as below:
21+
22+
``` javascript
23+
const style = cssobj(obj)
24+
25+
const html = (
26+
<div className={'nav', style}>
27+
<p className={'!news item active', style}> </p></div>
28+
)
29+
```
30+
31+
Which transform into below code:
32+
33+
``` javascript
34+
const html = (
35+
<div className={result.mapClass('nav')}>
36+
<p className={result.mapClass('!news item active')}> </p></div>
37+
)
38+
```
39+
40+
Note: According to **cssobj** `mapClass` rule, the `news` will not localized (aka keep AS IS).
41+
42+
## More Usage
43+
44+
- **Case 1** Your existing code already use Sequence Expression
45+
46+
Use below to prevent this plugin to transform:
47+
48+
```Javascript
49+
// existing code
50+
<div className={init(), get()}>
51+
52+
// prevent transform
53+
<div className={init(), get(), true}>
54+
55+
// will result as (same as existing code)
56+
<div className={init(), get()}>
57+
```
58+
59+
- **Case 2** You are debugging, want temp disable the transform
60+
61+
Use below to keep you class names untouched (not mapped)
62+
63+
```Javascript
64+
// pass null as last object
65+
<div className={'a b c', null}>
66+
67+
// will result as
68+
<div className={'a b c'}>
69+
```
70+
71+
## TODO
72+
73+
- [ ] Support JSX Spread
74+
- [ ] Child element should regard to parent cssobj scope

index.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Babel plugin to transform class names into cssobj localized
2+
module.exports = function (babel) {
3+
var t = babel.types
4+
5+
return {
6+
inherits: require('babel-plugin-syntax-jsx'),
7+
visitor: {
8+
JSXAttribute: function (path) {
9+
var node = path.node
10+
if (!node.name || !node.value || ['className', 'class'].indexOf(node.name.name)<0) return
11+
if (t.isJSXExpressionContainer(node.value)) {
12+
if(t.isSequenceExpression(node.value.expression)) {
13+
var values = node.value.expression.expressions
14+
var resultObj = values[values.length-1]
15+
var classStr = values[0]
16+
var exp = /Literal$/.test(resultObj.type)
17+
? (resultObj.value == null
18+
? classStr
19+
: t.sequenceExpression(node.value.expression.expressions.slice(0,-1)))
20+
: t.callExpression(
21+
t.memberExpression(resultObj, t.identifier('mapClass')),
22+
[classStr]
23+
)
24+
node.value = t.jSXExpressionContainer(exp)
25+
}
26+
}
27+
}
28+
}
29+
}
30+
}

package.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
"name": "babel-plugin-transform-cssobj-jsx",
3+
"version": "1.0.0",
4+
"description": "Babel plugin to transform class names into cssobj localized",
5+
"main": "index.js",
6+
"directories": {
7+
"test": "test"
8+
},
9+
"files": [
10+
"index.js"
11+
],
12+
"scripts": {
13+
"test": "mocha --compilers js:babel-register"
14+
},
15+
"repository": {
16+
"type": "git",
17+
"url": "git+https://github.com/cssobj/babel-plugin-transform-cssobj-jsx.git"
18+
},
19+
"keywords": [
20+
"babel",
21+
"plugin",
22+
"cssobj",
23+
"transform",
24+
"mapClass",
25+
"jsx"
26+
],
27+
"author": "James Yang <jamesyang999@gmail.com>",
28+
"license": "MIT",
29+
"bugs": {
30+
"url": "https://github.com/cssobj/babel-plugin-transform-cssobj-jsx/issues"
31+
},
32+
"homepage": "https://github.com/cssobj/babel-plugin-transform-cssobj-jsx#readme",
33+
"devDependencies": {
34+
"babel-cli": "^6.18.0",
35+
"babel-plugin-syntax-jsx": "^6.18.0",
36+
"babel-preset-es2015": "^6.18.0",
37+
"babel-register": "^6.18.0",
38+
"chai": "^3.5.0",
39+
"mocha": "^3.2.0"
40+
},
41+
"dependencies": {
42+
"babel-plugin-syntax-jsx": "^6.18.0"
43+
}
44+
}

test/test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const {expect} = require('chai')
2+
const {transform} = require('babel-core')
3+
4+
function lib (code) {
5+
return transform(code, {
6+
plugins: ['./index']
7+
}).code
8+
}
9+
10+
describe('babel-plugin-transform-cssobj-jsx', () => {
11+
describe('single level test', () => {
12+
it('should add mapClass', () => {
13+
const node = `var d=<div className={'a b c', result}>test</div>`
14+
expect(lib(node)).to.equal(`var d = <div className={result.mapClass('a b c')}>test</div>;`)
15+
})
16+
17+
it('should not mapClass (use global)', () => {
18+
const node = `var d=<div className={'a b c', null}>test</div>`
19+
expect(lib(node)).to.equal(`var d = <div className={'a b c'}>test</div>;`)
20+
})
21+
22+
it('should regard to existing SequenceExpression', () => {
23+
const node = `var d=<div className={init(), get(), true}>test</div>`
24+
expect(lib(node)).to.equal(`var d = <div className={(init(), get())}>test</div>;`)
25+
})
26+
})
27+
})

0 commit comments

Comments
 (0)