Skip to content

Commit

Permalink
add: option for names
Browse files Browse the repository at this point in the history
  • Loading branch information
futurist committed Dec 22, 2016
1 parent 4d5506f commit d363c09
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 21 deletions.
32 changes: 21 additions & 11 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
// Babel plugin to transform class names into cssobj localized

// imports
var util = require('util')
var converter = require('cssobj-converter')
var yaml = require('js-yaml')
var objutil = require('objutil')
var syntaxJsx = require('babel-plugin-syntax-jsx')

// constants
var templateDelimiter = '_cssobj_template_delimiter_'

function transformObjecctToFunction (babel, code) {
// helpers
function transformObjecctToFunction (babel, code, option) {
var result = babel.transform('!' + code, {
plugins: ['./transform-plugins']
plugins: [['./transform-plugins', option]]
})
// console.log(result.code)
// result.ast.program have: .cssobjConfig, .cssobjImports
Expand All @@ -17,15 +23,17 @@ function transformObjecctToFunction (babel, code) {
module.exports = function (babel) {
var t = babel.types
return {
inherits: require('babel-plugin-syntax-jsx'),
inherits: syntaxJsx,
visitor: {
Program (path) {
// console.log(util.inspect(path, {showHidden: false, depth: 5}))
},
TaggedTemplateExpression (path, state) {
var root = path.hub.file
var source = root.code
var cssobjName = state.cssobjName || (state.opts && state.opts.cssobjName)
var option = state.opts // babel5: state===opts
option = objutil.defaults(option, {
names: {
cssobj: {name: 'cssobj', path: 'cssobj'}
}
})
var node = path.node
// console.log(node)
var yamlRe = /\n\s*---\s*\n/
Expand Down Expand Up @@ -61,7 +69,7 @@ module.exports = function (babel) {
return v + exps.shift()
})
.join('')
cssobjConfigNode = transformObjecctToFunction(babel, cssobjConfig)
cssobjConfigNode = transformObjecctToFunction(babel, cssobjConfig, option)
root.path.unshiftContainer('body', cssobjConfigNode.ast.program.cssobjImports)
config = cssobjConfigNode.code.substr(1).replace(/;+$/, '')
}
Expand All @@ -80,12 +88,14 @@ module.exports = function (babel) {
.join('')
// got css object
// console.log(objStr)
var cssobjNS = option.names['cssobj']
var cssobjName = cssobjNS.name || 'cssobj'
root.path.unshiftContainer('body', t.importDeclaration(
[t.importDefaultSpecifier(t.identifier('cssobj'))],
t.stringLiteral('cssobj')
[t.importDefaultSpecifier(t.identifier(cssobjName))],
t.stringLiteral(cssobjNS.path || 'cssobj')
))

path.replaceWithSourceString(`cssobj(${config}, ${objStr})`)
path.replaceWithSourceString(`${cssobjName} (${config}, ${objStr})`)
}
},
CallExpression (path, state) {
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
"index.js"
],
"scripts": {
"objutil": "rollup -c ./node_modules/objutil/rollup.config.js --api defaults",
"build": "npm run objutil",
"pretest": "npm run build",
"test": "istanbul cover _mocha",
"coveralls": "istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"
},
Expand Down Expand Up @@ -42,6 +45,7 @@
},
"dependencies": {
"babel-plugin-syntax-jsx": "^6.18.0",
"cssobj-converter": "^2.1.6"
"cssobj-converter": "*",
"objutil": "^2.0.6"
}
}
23 changes: 14 additions & 9 deletions transform-plugins.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// transform from object into cssobj config, with plugins transformed
var objutil = require('objutil')

module.exports = function (babel) {
var t = babel.types
Expand All @@ -7,17 +8,21 @@ module.exports = function (babel) {
visitor: {
Program (path, state) {
var firstExp = path.node.body[0]

var option = state.opts
option = objutil.defaults(
option,
{ names: {} }
)
// only transform !{plugins:[]}
if(!t.isExpressionStatement(firstExp)
|| !t.isUnaryExpression(firstExp.expression, {operator: '!'})
|| !t.isObjectExpression(firstExp.expression.argument)) return
if (!t.isExpressionStatement(firstExp)
|| !t.isUnaryExpression(firstExp.expression, {operator: '!'})
|| !t.isObjectExpression(firstExp.expression.argument)) return

// get target expression
var node = firstExp.expression.argument
// get "plugins" prop, it's from JSON.stringify

var pluginsNode = node.properties.filter(function(v) {
var pluginsNode = node.properties.filter(function (v) {
return getKeyValue(v) === 'plugins'
&& t.isArrayExpression(v.value)
}).shift()
Expand All @@ -29,21 +34,22 @@ module.exports = function (babel) {
var cssobjImports = path.node.cssobjImports = []
for (var v, prop, value, i = 0; i < elements.length; i++) {
v = elements[i]
if (t.isLiteral(v) && (value='', prop = v.value)
if (t.isLiteral(v) && (value = '', prop = v.value)
|| t.isObjectExpression(v)
&& v.properties.length == 1
&& (prop = getKeyValue(v.properties[0]))
// plugin name cannot be below keywords
&& ['selector', 'value', 'post'].indexOf(prop) < 0
&& (value = v.properties[0].value)) {
var pluginIden = 'cssobj_plugin_' + prop.replace(/-/g, '_')
var pluginNS = option.names[prop]
var pluginIden = pluginNS && pluginNS.name || 'cssobj_plugin_' + prop.replace(/-/g, '_')
elements[i] = t.callExpression(
t.identifier(pluginIden),
value ? [value] : []
)
cssobjImports.push(t.importDeclaration(
[t.importDefaultSpecifier(t.identifier(pluginIden))],
t.stringLiteral('cssobj-plugin-'+prop)
t.stringLiteral(pluginNS && pluginNS.path || 'cssobj-plugin-' + prop)
))
}
}
Expand All @@ -57,5 +63,4 @@ module.exports = function (babel) {
if (t.isLiteral(v.key)) return v.key.value
if (t.isIdentifier(v.key)) return v.key.name
}

}

0 comments on commit d363c09

Please sign in to comment.