group-props.js 2.5 KB

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