8c1a9cea4d44a4d9d686b8d17679c748b29078a0752bf04bdfa5810b8fe0436ce4dacd75886549737ea4870ed6a1d7b0fc06aec51247565cc94e302cb9b191 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /* @flow */
  2. // import { warn } from 'core/util/index'
  3. // this will be preserved during build
  4. // $flow-disable-line
  5. const acorn = require('acorn') // $flow-disable-line
  6. const walk = require('acorn/dist/walk') // $flow-disable-line
  7. const escodegen = require('escodegen')
  8. export function nodeToBinding (node: Object): any {
  9. switch (node.type) {
  10. case 'Literal': return node.value
  11. case 'Identifier':
  12. case 'UnaryExpression':
  13. case 'BinaryExpression':
  14. case 'LogicalExpression':
  15. case 'ConditionalExpression':
  16. case 'MemberExpression': return { '@binding': escodegen.generate(node) }
  17. case 'ArrayExpression': return node.elements.map(_ => nodeToBinding(_))
  18. case 'ObjectExpression': {
  19. const object = {}
  20. node.properties.forEach(prop => {
  21. if (!prop.key || prop.key.type !== 'Identifier') {
  22. return
  23. }
  24. const key = escodegen.generate(prop.key)
  25. const value = nodeToBinding(prop.value)
  26. if (key && value) {
  27. object[key] = value
  28. }
  29. })
  30. return object
  31. }
  32. default: {
  33. // warn(`Not support ${node.type}: "${escodegen.generate(node)}"`)
  34. return ''
  35. }
  36. }
  37. }
  38. export function generateBinding (exp: ?string): any {
  39. if (exp && typeof exp === 'string') {
  40. let ast = null
  41. try {
  42. ast = acorn.parse(`(${exp})`)
  43. } catch (e) {
  44. // warn(`Failed to parse the expression: "${exp}"`)
  45. return ''
  46. }
  47. let output = ''
  48. walk.simple(ast, {
  49. Expression (node) {
  50. output = nodeToBinding(node)
  51. }
  52. })
  53. return output
  54. }
  55. }