group-props.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. var makeMap = require('./make-map')
  2. var isTopLevel = makeMap('class,staticClass,style,key,ref,refInFor,slot,scopedSlots')
  3. var isNestable = makeMap('domProps,on,nativeOn,hook')
  4. var nestableRE = /^(domProps|on|nativeOn|hook)([\-A-Z])/
  5. var dirRE = /^v-/
  6. var xlinkRE = /^xlink([A-Z])/
  7. module.exports = function groupProps (props, t) {
  8. var newProps = []
  9. var currentNestedObjects = Object.create(null)
  10. props.forEach(function (prop) {
  11. var name = prop.key.value || prop.key.name
  12. if (isTopLevel(name)) {
  13. // top-level special props
  14. newProps.push(prop)
  15. } else {
  16. // nested modules
  17. var nestMatch = name.match(nestableRE)
  18. if (nestMatch) {
  19. var prefix = nestMatch[1]
  20. var suffix = name.replace(nestableRE, function (_, $1, $2) {
  21. return $2 === '-' ? '' : $2.toLowerCase()
  22. })
  23. var nestedProp = t.objectProperty(t.stringLiteral(suffix), prop.value)
  24. var nestedObject = currentNestedObjects[prefix]
  25. if (!nestedObject) {
  26. nestedObject = currentNestedObjects[prefix] = t.objectProperty(
  27. t.identifier(prefix),
  28. t.objectExpression([nestedProp])
  29. )
  30. newProps.push(nestedObject)
  31. } else {
  32. nestedObject.value.properties.push(nestedProp)
  33. }
  34. } else if (dirRE.test(name)) {
  35. // custom directive
  36. name = name.replace(dirRE, '')
  37. var dirs = currentNestedObjects.directives
  38. if (!dirs) {
  39. dirs = currentNestedObjects.directives = t.objectProperty(
  40. t.identifier('directives'),
  41. t.arrayExpression([])
  42. )
  43. newProps.push(dirs)
  44. }
  45. dirs.value.elements.push(t.objectExpression([
  46. t.objectProperty(
  47. t.identifier('name'),
  48. t.stringLiteral(name)
  49. ),
  50. t.objectProperty(
  51. t.identifier('value'),
  52. prop.value
  53. )
  54. ]))
  55. } else {
  56. // rest are nested under attrs
  57. var attrs = currentNestedObjects.attrs
  58. // guard xlink attributes
  59. if (xlinkRE.test(prop.key.name)) {
  60. prop.key.name = JSON.stringify(prop.key.name.replace(xlinkRE, function (m, p1) {
  61. return 'xlink:' + p1.toLowerCase()
  62. }))
  63. }
  64. if (!attrs) {
  65. attrs = currentNestedObjects.attrs = t.objectProperty(
  66. t.identifier('attrs'),
  67. t.objectExpression([prop])
  68. )
  69. newProps.push(attrs)
  70. } else {
  71. attrs.value.properties.push(prop)
  72. }
  73. }
  74. }
  75. })
  76. return t.objectExpression(newProps)
  77. }