123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /* @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
- }
- }
|