@barelyhuman/astring-jsx
Version:
astring, with JSX support
106 lines (103 loc) • 2.98 kB
JavaScript
var astring = require('astring')
var extend = require('xtend')
var generator = Object.assign(
{
// <div></div>
JSXElement: function JSXElement(node, state) {
state.write('<')
this[node.openingElement.type](node.openingElement, state)
if (node.closingElement) {
state.write('>')
for (var i = 0; i < node.children.length; i++) {
var child = node.children[i]
this[child.type](child, state)
}
state.write('</')
this[node.closingElement.type](node.closingElement, state)
state.write('>')
} else {
state.write(' />')
}
},
// <div>
JSXOpeningElement: function JSXOpeningElement(node, state) {
this[node.name.type](node.name, state)
for (var i = 0; i < node.attributes.length; i++) {
var attr = node.attributes[i]
this[attr.type](attr, state)
}
},
// </div>
JSXClosingElement: function JSXOpeningElement(node, state) {
this[node.name.type](node.name, state)
},
// div
JSXIdentifier: function JSXOpeningElement(node, state) {
state.write(node.name)
},
// Member.Expression
JSXMemberExpression: function JSXMemberExpression(node, state) {
this[node.object.type](node.object, state)
state.write('.')
this[node.property.type](node.property, state)
},
// attr="something"
JSXAttribute: function JSXAttribute(node, state) {
state.write(' ')
this[node.name.type](node.name, state)
if (node.value) {
state.write('=')
this[node.value.type](node.value, state)
}
},
// namespaced:attr="something"
JSXNamespacedName: function JSXNamespacedName(node, state) {
this[node.namespace.type](node.namespace, state)
state.write(':')
this[node.name.type](node.name, state)
},
// {expression}
JSXExpressionContainer: function JSXExpressionContainer(node, state) {
state.write('{')
this[node.expression.type](node.expression, state)
state.write('}')
},
JSXFragment: function JSXFragment(node, state) {
state.write('<>')
for (child of node.children) {
this[child.type](child, state)
}
state.write('</>')
},
// { }
JSXEmptyExpression: function JSXEmptyExpression() {
// do nothingac
// a single or multiline comment in the expression will be ignores
},
JSXText: function JSXText(node, state) {
state.write(node.value)
},
// {...prop}
// {...prop.v}
// {...func()}
JSXSpreadAttribute: function JSXSpreadAttribute(node, state) {
state.write(` {...`)
this[node.argument.type](node.argument, state)
state.write(`} `)
},
},
astring.GENERATOR
)
module.exports = {
GENERATOR: generator,
generate: (ast, options) =>
astring.generate(
ast,
extend(
{
generator: generator,
},
options
)
),
}