index.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. const {
  2. isTypeNode,
  3. extractRuntimeProps,
  4. isTSTypeLiteral,
  5. isTSTypeLiteralOrTSFunctionType,
  6. extractRuntimeEmits,
  7. flattenTypeNodes,
  8. isTSInterfaceBody,
  9. extractRuntimeSlots
  10. } = require('./ts-ast')
  11. const {
  12. getComponentPropsFromTypeDefineTypes,
  13. getComponentEmitsFromTypeDefineTypes,
  14. getComponentSlotsFromTypeDefineTypes
  15. } = require('./ts-types')
  16. /**
  17. * @typedef {import('@typescript-eslint/types').TSESTree.TypeNode} TSESTreeTypeNode
  18. */
  19. /**
  20. * @typedef {import('../index').ComponentTypeProp} ComponentTypeProp
  21. * @typedef {import('../index').ComponentInferTypeProp} ComponentInferTypeProp
  22. * @typedef {import('../index').ComponentUnknownProp} ComponentUnknownProp
  23. * @typedef {import('../index').ComponentTypeEmit} ComponentTypeEmit
  24. * @typedef {import('../index').ComponentInferTypeEmit} ComponentInferTypeEmit
  25. * @typedef {import('../index').ComponentUnknownEmit} ComponentUnknownEmit
  26. * @typedef {import('../index').ComponentTypeSlot} ComponentTypeSlot
  27. * @typedef {import('../index').ComponentInferTypeSlot} ComponentInferTypeSlot
  28. * @typedef {import('../index').ComponentUnknownSlot} ComponentUnknownSlot
  29. */
  30. module.exports = {
  31. isTypeNode,
  32. getComponentPropsFromTypeDefine,
  33. getComponentEmitsFromTypeDefine,
  34. getComponentSlotsFromTypeDefine
  35. }
  36. /**
  37. * Get all props by looking at all component's properties
  38. * @param {RuleContext} context The ESLint rule context object.
  39. * @param {TypeNode} propsNode Type with props definition
  40. * @return {(ComponentTypeProp|ComponentInferTypeProp|ComponentUnknownProp)[]} Array of component props
  41. */
  42. function getComponentPropsFromTypeDefine(context, propsNode) {
  43. /** @type {(ComponentTypeProp|ComponentInferTypeProp|ComponentUnknownProp)[]} */
  44. const result = []
  45. for (const defNode of flattenTypeNodes(
  46. context,
  47. /** @type {TSESTreeTypeNode} */ (propsNode)
  48. )) {
  49. if (isTSInterfaceBody(defNode) || isTSTypeLiteral(defNode)) {
  50. result.push(...extractRuntimeProps(context, defNode))
  51. } else {
  52. result.push(
  53. ...getComponentPropsFromTypeDefineTypes(
  54. context,
  55. /** @type {TypeNode} */ (defNode)
  56. )
  57. )
  58. }
  59. }
  60. return result
  61. }
  62. /**
  63. * Get all emits by looking at all component's properties
  64. * @param {RuleContext} context The ESLint rule context object.
  65. * @param {TypeNode} emitsNode Type with emits definition
  66. * @return {(ComponentTypeEmit|ComponentInferTypeEmit|ComponentUnknownEmit)[]} Array of component emits
  67. */
  68. function getComponentEmitsFromTypeDefine(context, emitsNode) {
  69. /** @type {(ComponentTypeEmit|ComponentInferTypeEmit|ComponentUnknownEmit)[]} */
  70. const result = []
  71. for (const defNode of flattenTypeNodes(
  72. context,
  73. /** @type {TSESTreeTypeNode} */ (emitsNode)
  74. )) {
  75. if (
  76. isTSInterfaceBody(defNode) ||
  77. isTSTypeLiteralOrTSFunctionType(defNode)
  78. ) {
  79. result.push(...extractRuntimeEmits(defNode))
  80. } else {
  81. result.push(
  82. ...getComponentEmitsFromTypeDefineTypes(
  83. context,
  84. /** @type {TypeNode} */ (defNode)
  85. )
  86. )
  87. }
  88. }
  89. return result
  90. }
  91. /**
  92. * Get all slots by looking at all component's properties
  93. * @param {RuleContext} context The ESLint rule context object.
  94. * @param {TypeNode} slotsNode Type with slots definition
  95. * @return {(ComponentTypeSlot|ComponentInferTypeSlot|ComponentUnknownSlot)[]} Array of component slots
  96. */
  97. function getComponentSlotsFromTypeDefine(context, slotsNode) {
  98. /** @type {(ComponentTypeSlot|ComponentInferTypeSlot|ComponentUnknownSlot)[]} */
  99. const result = []
  100. for (const defNode of flattenTypeNodes(
  101. context,
  102. /** @type {TSESTreeTypeNode} */ (slotsNode)
  103. )) {
  104. if (isTSInterfaceBody(defNode) || isTSTypeLiteral(defNode)) {
  105. result.push(...extractRuntimeSlots(defNode))
  106. } else {
  107. result.push(
  108. ...getComponentSlotsFromTypeDefineTypes(
  109. context,
  110. /** @type {TypeNode} */ (defNode)
  111. )
  112. )
  113. }
  114. }
  115. return result
  116. }