/* @flow */ // import { warn } from 'core/util/index' // this will be preserved during build // $flow-disable-line const acorn = require('acorn') // $flow-disable-line const walk = require('acorn/dist/walk') // $flow-disable-line const escodegen = require('escodegen') export function nodeToBinding (node: Object): any { switch (node.type) { case 'Literal': return node.value case 'Identifier': case 'UnaryExpression': case 'BinaryExpression': case 'LogicalExpression': case 'ConditionalExpression': case 'MemberExpression': return { '@binding': escodegen.generate(node) } case 'ArrayExpression': return node.elements.map(_ => nodeToBinding(_)) case 'ObjectExpression': { const object = {} node.properties.forEach(prop => { if (!prop.key || prop.key.type !== 'Identifier') { return } const key = escodegen.generate(prop.key) const value = nodeToBinding(prop.value) if (key && value) { object[key] = value } }) return object } default: { // warn(`Not support ${node.type}: "${escodegen.generate(node)}"`) return '' } } } export function generateBinding (exp: ?string): any { if (exp && typeof exp === 'string') { let ast = null try { ast = acorn.parse(`(${exp})`) } catch (e) { // warn(`Failed to parse the expression: "${exp}"`) return '' } let output = '' walk.simple(ast, { Expression (node) { output = nodeToBinding(node) } }) return output } }