@contentful/experience-design-system-extraction 2.36.2-dev-build-a6f80ae6.0 → 2.36.2-dev-build-7907fec3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/extract/controller/extract-controller.d.ts +10 -0
  3. package/dist/src/extract/controller/extract-controller.js +33 -0
  4. package/dist/src/extract/controller/helpers/validate-endpoint-request.d.ts +2 -0
  5. package/dist/src/extract/controller/helpers/validate-endpoint-request.js +24 -0
  6. package/dist/src/extract/{astro.d.ts → framework-adapters/astro/extractor.d.ts} +1 -1
  7. package/dist/src/extract/framework-adapters/astro/extractor.js +45 -0
  8. package/dist/src/extract/framework-adapters/astro/frontmatter.d.ts +11 -0
  9. package/dist/src/extract/framework-adapters/astro/frontmatter.js +96 -0
  10. package/dist/src/extract/framework-adapters/astro/helpers/collect-astro-props-bindings.d.ts +4 -0
  11. package/dist/src/extract/framework-adapters/astro/helpers/collect-astro-props-bindings.js +47 -0
  12. package/dist/src/extract/framework-adapters/astro/slots.d.ts +7 -0
  13. package/dist/src/extract/framework-adapters/astro/slots.js +44 -0
  14. package/dist/src/extract/{react.d.ts → framework-adapters/react/extractor.d.ts} +1 -1
  15. package/dist/src/extract/framework-adapters/react/extractor.js +31 -0
  16. package/dist/src/extract/framework-adapters/react/helpers/collect-dom-wrapper-contexts.d.ts +4 -0
  17. package/dist/src/extract/framework-adapters/react/helpers/collect-dom-wrapper-contexts.js +73 -0
  18. package/dist/src/extract/framework-adapters/react/helpers/collect-prop-dataflow.d.ts +14 -0
  19. package/dist/src/extract/framework-adapters/react/helpers/collect-prop-dataflow.js +220 -0
  20. package/dist/src/extract/framework-adapters/react/helpers/collect-react-impl-hints.d.ts +5 -0
  21. package/dist/src/extract/framework-adapters/react/helpers/collect-react-impl-hints.js +32 -0
  22. package/dist/src/extract/framework-adapters/react/helpers/detect-dom-is-pure-wrapper.d.ts +2 -0
  23. package/dist/src/extract/framework-adapters/react/helpers/detect-dom-is-pure-wrapper.js +59 -0
  24. package/dist/src/extract/framework-adapters/react/helpers/detect-dom-type-patterns.d.ts +8 -0
  25. package/dist/src/extract/framework-adapters/react/helpers/detect-dom-type-patterns.js +29 -0
  26. package/dist/src/extract/framework-adapters/react/helpers/detect-omit-wrapped-custom-props.d.ts +2 -0
  27. package/dist/src/extract/framework-adapters/react/helpers/detect-omit-wrapped-custom-props.js +64 -0
  28. package/dist/src/extract/framework-adapters/react/helpers/detect-pick-type-patterns.d.ts +4 -0
  29. package/dist/src/extract/framework-adapters/react/helpers/detect-pick-type-patterns.js +64 -0
  30. package/dist/src/extract/framework-adapters/react/helpers/detect-react-polymorphic.d.ts +5 -0
  31. package/dist/src/extract/framework-adapters/react/helpers/detect-react-polymorphic.js +170 -0
  32. package/dist/src/extract/framework-adapters/react/helpers/dom-attribute-surfaces.d.ts +15 -0
  33. package/dist/src/extract/framework-adapters/react/helpers/dom-attribute-surfaces.js +231 -0
  34. package/dist/src/extract/framework-adapters/react/helpers/extract-binding-fallback-props.d.ts +4 -0
  35. package/dist/src/extract/framework-adapters/react/helpers/extract-binding-fallback-props.js +50 -0
  36. package/dist/src/extract/framework-adapters/react/helpers/extract-from-react-source-file.d.ts +5 -0
  37. package/dist/src/extract/framework-adapters/react/helpers/extract-from-react-source-file.js +23 -0
  38. package/dist/src/extract/framework-adapters/react/helpers/extract-react-allowed-components.d.ts +2 -0
  39. package/dist/src/extract/framework-adapters/react/helpers/extract-react-allowed-components.js +25 -0
  40. package/dist/src/extract/framework-adapters/react/helpers/extract-react-binding-defaults.d.ts +6 -0
  41. package/dist/src/extract/framework-adapters/react/helpers/extract-react-binding-defaults.js +48 -0
  42. package/dist/src/extract/framework-adapters/react/helpers/extract-react-component-from-export.d.ts +15 -0
  43. package/dist/src/extract/framework-adapters/react/helpers/extract-react-component-from-export.js +106 -0
  44. package/dist/src/extract/framework-adapters/react/helpers/extract-react-prop-types.d.ts +3 -0
  45. package/dist/src/extract/framework-adapters/react/helpers/extract-react-prop-types.js +64 -0
  46. package/dist/src/extract/framework-adapters/react/helpers/extract-react-props-from-type.d.ts +15 -0
  47. package/dist/src/extract/framework-adapters/react/helpers/extract-react-props-from-type.js +318 -0
  48. package/dist/src/extract/framework-adapters/react/helpers/extract-react-slots.d.ts +6 -0
  49. package/dist/src/extract/framework-adapters/react/helpers/extract-react-slots.js +44 -0
  50. package/dist/src/extract/framework-adapters/react/helpers/filter-impl-alias-props.d.ts +4 -0
  51. package/dist/src/extract/framework-adapters/react/helpers/filter-impl-alias-props.js +52 -0
  52. package/dist/src/extract/framework-adapters/react/helpers/infer-primitive-dom-props.d.ts +6 -0
  53. package/dist/src/extract/framework-adapters/react/helpers/infer-primitive-dom-props.js +69 -0
  54. package/dist/src/extract/framework-adapters/react/helpers/resolve-component-function.d.ts +4 -0
  55. package/dist/src/extract/framework-adapters/react/helpers/resolve-component-function.js +131 -0
  56. package/dist/src/extract/framework-adapters/react/helpers/resolve-react-prop-forwarding.d.ts +8 -0
  57. package/dist/src/extract/framework-adapters/react/helpers/resolve-react-prop-forwarding.js +22 -0
  58. package/dist/src/extract/framework-adapters/react/helpers/resolve-react-props-type.d.ts +14 -0
  59. package/dist/src/extract/framework-adapters/react/helpers/resolve-react-props-type.js +86 -0
  60. package/dist/src/extract/framework-adapters/react/helpers/synthesize-react-structural-slots.d.ts +8 -0
  61. package/dist/src/extract/framework-adapters/react/helpers/synthesize-react-structural-slots.js +44 -0
  62. package/dist/src/extract/framework-adapters/shared/helpers/build-component-lookup-maps.d.ts +5 -0
  63. package/dist/src/extract/framework-adapters/shared/helpers/build-component-lookup-maps.js +10 -0
  64. package/dist/src/extract/framework-adapters/shared/helpers/collect-jsdoc-slot-comments.d.ts +2 -0
  65. package/dist/src/extract/framework-adapters/shared/helpers/collect-jsdoc-slot-comments.js +13 -0
  66. package/dist/src/extract/{file-extraction-workers.d.ts → framework-adapters/shared/helpers/file-processing/file-workers.d.ts} +1 -13
  67. package/dist/src/extract/{file-extraction-workers.js → framework-adapters/shared/helpers/file-processing/file-workers.js} +0 -19
  68. package/dist/src/extract/framework-adapters/shared/helpers/file-processing/project-source-files.d.ts +5 -0
  69. package/dist/src/extract/framework-adapters/shared/helpers/file-processing/project-source-files.js +13 -0
  70. package/dist/src/extract/framework-adapters/shared/helpers/file-processing/result-normalizer.d.ts +6 -0
  71. package/dist/src/extract/framework-adapters/shared/helpers/file-processing/result-normalizer.js +6 -0
  72. package/dist/src/extract/framework-adapters/shared/helpers/find-tsx-workspace-package.d.ts +2 -0
  73. package/dist/src/extract/framework-adapters/shared/helpers/find-tsx-workspace-package.js +62 -0
  74. package/dist/src/extract/{source-line-metadata.d.ts → framework-adapters/shared/helpers/get-node-source-lines.d.ts} +1 -1
  75. package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-tsconfig-path.d.ts +7 -0
  76. package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-tsconfig-path.js +93 -0
  77. package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-workspace-imports.d.ts +6 -0
  78. package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-workspace-imports.js +58 -0
  79. package/dist/src/extract/framework-adapters/shared/helpers/tsx-node-utils.d.ts +13 -0
  80. package/dist/src/extract/framework-adapters/shared/helpers/tsx-node-utils.js +76 -0
  81. package/dist/src/extract/framework-adapters/shared/helpers/tsx-renderable-exports.d.ts +12 -0
  82. package/dist/src/extract/framework-adapters/shared/helpers/tsx-renderable-exports.js +35 -0
  83. package/dist/src/extract/framework-adapters/shared/helpers/tsx-shared.d.ts +14 -0
  84. package/dist/src/extract/framework-adapters/shared/helpers/tsx-shared.js +54 -0
  85. package/dist/src/extract/{stencil.d.ts → framework-adapters/stencil/extractor.d.ts} +1 -1
  86. package/dist/src/extract/framework-adapters/stencil/extractor.js +82 -0
  87. package/dist/src/extract/framework-adapters/stencil/helpers/detect-stencil-class.d.ts +7 -0
  88. package/dist/src/extract/framework-adapters/stencil/helpers/detect-stencil-class.js +32 -0
  89. package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-props.d.ts +5 -0
  90. package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-props.js +62 -0
  91. package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-slots.d.ts +6 -0
  92. package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-slots.js +87 -0
  93. package/dist/src/extract/framework-adapters/stencil/helpers/stencil-prop-helpers.d.ts +5 -0
  94. package/dist/src/extract/framework-adapters/stencil/helpers/stencil-prop-helpers.js +39 -0
  95. package/dist/src/extract/{svelte.d.ts → framework-adapters/svelte/extractor.d.ts} +2 -1
  96. package/dist/src/extract/framework-adapters/svelte/extractor.js +27 -0
  97. package/dist/src/extract/framework-adapters/svelte/helpers/classify-svelte-props-annotation.d.ts +6 -0
  98. package/dist/src/extract/framework-adapters/svelte/helpers/classify-svelte-props-annotation.js +51 -0
  99. package/dist/src/extract/framework-adapters/svelte/helpers/collect-svelte-type-references.d.ts +3 -0
  100. package/dist/src/extract/framework-adapters/svelte/helpers/collect-svelte-type-references.js +52 -0
  101. package/dist/src/extract/framework-adapters/svelte/helpers/extract-from-svelte-file.d.ts +7 -0
  102. package/dist/src/extract/framework-adapters/svelte/helpers/extract-from-svelte-file.js +90 -0
  103. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-ast-type-members.d.ts +15 -0
  104. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-ast-type-members.js +46 -0
  105. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-declaration-data.d.ts +7 -0
  106. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-declaration-data.js +64 -0
  107. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-external-type-members.d.ts +4 -0
  108. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-external-type-members.js +58 -0
  109. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-from-destructure.d.ts +4 -0
  110. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-from-destructure.js +85 -0
  111. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-props.d.ts +22 -0
  112. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-props.js +55 -0
  113. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-template-slots.d.ts +7 -0
  114. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-template-slots.js +63 -0
  115. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-type-member-props.d.ts +3 -0
  116. package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-type-member-props.js +31 -0
  117. package/dist/src/extract/framework-adapters/svelte/helpers/find-svelte-script-declarations.d.ts +8 -0
  118. package/dist/src/extract/framework-adapters/svelte/helpers/find-svelte-script-declarations.js +91 -0
  119. package/dist/src/extract/framework-adapters/svelte/helpers/get-svelte-component-name.d.ts +1 -0
  120. package/dist/src/extract/framework-adapters/svelte/helpers/get-svelte-component-name.js +26 -0
  121. package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type-strings.d.ts +3 -0
  122. package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type-strings.js +91 -0
  123. package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type.d.ts +11 -0
  124. package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type.js +68 -0
  125. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-dts-location.d.ts +1 -0
  126. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-dts-location.js +90 -0
  127. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-allowed-components.d.ts +2 -0
  128. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-allowed-components.js +20 -0
  129. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-external-type-readers.d.ts +3 -0
  130. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-external-type-readers.js +68 -0
  131. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-checker.d.ts +4 -0
  132. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-checker.js +68 -0
  133. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-members.d.ts +6 -0
  134. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-members.js +30 -0
  135. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-unresolved-retry.d.ts +13 -0
  136. package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-unresolved-retry.js +192 -0
  137. package/dist/src/extract/framework-adapters/svelte/types/svelte-ast-node.d.ts +12 -0
  138. package/dist/src/extract/framework-adapters/svelte/types/svelte-ast-node.js +1 -0
  139. package/dist/src/extract/{vue.d.ts → framework-adapters/vue/extractor.d.ts} +1 -1
  140. package/dist/src/extract/framework-adapters/vue/extractor.js +61 -0
  141. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-object-props.d.ts +3 -0
  142. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-object-props.js +67 -0
  143. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-options-props.d.ts +4 -0
  144. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-options-props.js +72 -0
  145. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-object-props.d.ts +8 -0
  146. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-object-props.js +64 -0
  147. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-props.d.ts +2 -0
  148. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-props.js +66 -0
  149. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-slots.d.ts +24 -0
  150. package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-slots.js +56 -0
  151. package/dist/src/extract/framework-adapters/vue/helpers/resolve-vue-component-name.d.ts +2 -0
  152. package/dist/src/extract/framework-adapters/vue/helpers/resolve-vue-component-name.js +9 -0
  153. package/dist/src/extract/framework-adapters/vue/helpers/resolve-workspace-module.d.ts +1 -0
  154. package/dist/src/extract/framework-adapters/vue/helpers/resolve-workspace-module.js +76 -0
  155. package/dist/src/extract/framework-adapters/vue/helpers/workspace-package-dirs.d.ts +2 -0
  156. package/dist/src/extract/framework-adapters/vue/helpers/workspace-package-dirs.js +77 -0
  157. package/dist/src/extract/{vue-tsx.d.ts → framework-adapters/vue-tsx/extractor.d.ts} +1 -1
  158. package/dist/src/extract/framework-adapters/vue-tsx/extractor.js +82 -0
  159. package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-props.d.ts +5 -0
  160. package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-props.js +189 -0
  161. package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-slots.d.ts +4 -0
  162. package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-slots.js +91 -0
  163. package/dist/src/extract/framework-adapters/vue-tsx/helpers/resolve-ast-object.d.ts +11 -0
  164. package/dist/src/extract/framework-adapters/vue-tsx/helpers/resolve-ast-object.js +95 -0
  165. package/dist/src/extract/{web-components.d.ts → framework-adapters/web-components/extractor.d.ts} +1 -1
  166. package/dist/src/extract/framework-adapters/web-components/extractor.js +55 -0
  167. package/dist/src/extract/framework-adapters/web-components/helpers/collect-wc-html-templates.d.ts +4 -0
  168. package/dist/src/extract/framework-adapters/web-components/helpers/collect-wc-html-templates.js +67 -0
  169. package/dist/src/extract/framework-adapters/web-components/helpers/detect-wc-non-public-members.d.ts +9 -0
  170. package/dist/src/extract/framework-adapters/web-components/helpers/detect-wc-non-public-members.js +11 -0
  171. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-accessor-props.d.ts +3 -0
  172. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-accessor-props.js +65 -0
  173. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-class-properties.d.ts +3 -0
  174. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-class-properties.js +60 -0
  175. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-inheritance.d.ts +4 -0
  176. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-inheritance.js +16 -0
  177. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-jsdoc-attr-props.d.ts +3 -0
  178. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-jsdoc-attr-props.js +24 -0
  179. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-observed-attrs.d.ts +3 -0
  180. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-observed-attrs.js +27 -0
  181. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-slots.d.ts +6 -0
  182. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-slots.js +56 -0
  183. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-template-content.d.ts +4 -0
  184. package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-template-content.js +49 -0
  185. package/dist/src/extract/framework-adapters/web-components/helpers/merge-wc-prop-lists.d.ts +9 -0
  186. package/dist/src/extract/framework-adapters/web-components/helpers/merge-wc-prop-lists.js +19 -0
  187. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-base-class.d.ts +2 -0
  188. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-base-class.js +59 -0
  189. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-decorator-tag.d.ts +2 -0
  190. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-decorator-tag.js +54 -0
  191. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import-source.d.ts +7 -0
  192. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import-source.js +47 -0
  193. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import.d.ts +4 -0
  194. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import.js +93 -0
  195. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-sibling-definition.d.ts +4 -0
  196. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-sibling-definition.js +79 -0
  197. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-tag-name.d.ts +7 -0
  198. package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-tag-name.js +62 -0
  199. package/dist/src/extract/helpers/evidence/ast/collect-structural-jsx-evidence.d.ts +5 -0
  200. package/dist/src/extract/helpers/evidence/ast/collect-structural-jsx-evidence.js +63 -0
  201. package/dist/src/extract/helpers/evidence/ast/detect-react-node-types.d.ts +2 -0
  202. package/dist/src/extract/helpers/evidence/ast/detect-react-node-types.js +24 -0
  203. package/dist/src/extract/helpers/evidence/ast/get-jsx-ast-data.d.ts +14 -0
  204. package/dist/src/extract/helpers/evidence/ast/get-jsx-ast-data.js +85 -0
  205. package/dist/src/extract/helpers/evidence/collect-jsx-component-references.d.ts +5 -0
  206. package/dist/src/extract/helpers/evidence/collect-jsx-component-references.js +52 -0
  207. package/dist/src/extract/helpers/evidence/detect-slot-from-prop.d.ts +16 -0
  208. package/dist/src/extract/helpers/evidence/detect-slot-from-prop.js +39 -0
  209. package/dist/src/extract/orchestrator/execute-extraction-orchestrator.d.ts +13 -0
  210. package/dist/src/extract/orchestrator/execute-extraction-orchestrator.js +17 -0
  211. package/dist/src/{pre-classify.d.ts → extract/services/classification/classify-component-props.d.ts} +3 -5
  212. package/dist/src/{pre-classify.js → extract/services/classification/classify-component-props.js} +8 -100
  213. package/dist/src/extract/services/classification/helpers/check-prop-types.d.ts +7 -0
  214. package/dist/src/extract/services/classification/helpers/check-prop-types.js +22 -0
  215. package/dist/src/extract/services/classification/helpers/detect-dom-props.d.ts +2 -0
  216. package/dist/src/extract/services/classification/helpers/detect-dom-props.js +63 -0
  217. package/dist/src/extract/services/deduplication/deduplicate-components.d.ts +2 -0
  218. package/dist/src/extract/services/deduplication/deduplicate-components.js +58 -0
  219. package/dist/src/extract/services/deduplication/helpers/component-path-analysis.d.ts +10 -0
  220. package/dist/src/extract/services/deduplication/helpers/component-path-analysis.js +85 -0
  221. package/dist/src/extract/services/deduplication/helpers/component-path-scoring.d.ts +10 -0
  222. package/dist/src/extract/services/deduplication/helpers/component-path-scoring.js +73 -0
  223. package/dist/src/extract/services/extraction/extract-components.d.ts +3 -0
  224. package/dist/src/extract/services/extraction/extract-components.js +19 -0
  225. package/dist/src/extract/services/extraction/helpers/collect-sveltekit-route-exclusions.d.ts +2 -0
  226. package/dist/src/extract/services/extraction/helpers/collect-sveltekit-route-exclusions.js +18 -0
  227. package/dist/src/extract/services/extraction/helpers/filter-hook-components.d.ts +6 -0
  228. package/dist/src/extract/services/extraction/helpers/filter-hook-components.js +18 -0
  229. package/dist/src/extract/services/extraction/helpers/register-extractors.d.ts +8 -0
  230. package/dist/src/extract/services/extraction/helpers/register-extractors.js +71 -0
  231. package/dist/src/extract/services/extraction/helpers/run-extractor-batches.d.ts +4 -0
  232. package/dist/src/extract/services/extraction/helpers/run-extractor-batches.js +24 -0
  233. package/dist/src/extract/services/quality/evaluate-extraction-quality.d.ts +4 -0
  234. package/dist/src/extract/services/quality/evaluate-extraction-quality.js +61 -0
  235. package/dist/src/extract/services/quality/helpers/authorability/evaluate-authorability.d.ts +28 -0
  236. package/dist/src/extract/services/quality/helpers/authorability/evaluate-authorability.js +67 -0
  237. package/dist/src/extract/services/quality/helpers/inspection/detect-data-wrapper-patterns.d.ts +16 -0
  238. package/dist/src/extract/services/quality/helpers/inspection/detect-data-wrapper-patterns.js +63 -0
  239. package/dist/src/extract/{source-inspection.d.ts → services/quality/helpers/inspection/inspect-component-source.d.ts} +3 -6
  240. package/dist/src/extract/{source-inspection.js → services/quality/helpers/inspection/inspect-component-source.js} +5 -65
  241. package/dist/src/extract/{validate.d.ts → services/quality/helpers/inspection/validate-extracted-components.d.ts} +1 -1
  242. package/dist/src/extract/services/quality/helpers/scoring/collect-scoring-inputs.d.ts +14 -0
  243. package/dist/src/extract/{scoring.js → services/quality/helpers/scoring/collect-scoring-inputs.js} +10 -24
  244. package/dist/src/extract/services/quality/helpers/scoring/compute-extraction-score.d.ts +6 -0
  245. package/dist/src/extract/services/quality/helpers/scoring/compute-extraction-score.js +12 -0
  246. package/dist/src/extract/types/classification.d.ts +4 -0
  247. package/dist/src/extract/types/classification.js +1 -0
  248. package/dist/src/extract/types/component-extractor.d.ts +7 -0
  249. package/dist/src/extract/types/component-extractor.js +1 -0
  250. package/dist/src/{types.d.ts → extract/types/component.d.ts} +0 -22
  251. package/dist/src/extract/types/component.js +1 -0
  252. package/dist/src/extract/types/contract.d.ts +16 -0
  253. package/dist/src/extract/types/contract.js +1 -0
  254. package/dist/src/extract/types/display.d.ts +3 -0
  255. package/dist/src/{types.js → extract/types/display.js} +1 -1
  256. package/dist/src/extract/types/options.d.ts +15 -0
  257. package/dist/src/extract/types/options.js +1 -0
  258. package/dist/src/extract/types/scoring.d.ts +9 -0
  259. package/dist/src/extract/types/scoring.js +1 -0
  260. package/dist/src/extract/types/source-inspection.d.ts +5 -0
  261. package/dist/src/extract/types/source-inspection.js +1 -0
  262. package/dist/src/index.d.ts +27 -21
  263. package/dist/src/index.js +21 -17
  264. package/package.json +1 -1
  265. package/dist/src/extract/astro.js +0 -226
  266. package/dist/src/extract/non-authorable-filter.d.ts +0 -17
  267. package/dist/src/extract/non-authorable-filter.js +0 -60
  268. package/dist/src/extract/pipeline.d.ts +0 -7
  269. package/dist/src/extract/pipeline.js +0 -343
  270. package/dist/src/extract/react.js +0 -2069
  271. package/dist/src/extract/scoring.d.ts +0 -12
  272. package/dist/src/extract/slot-detection.d.ts +0 -35
  273. package/dist/src/extract/slot-detection.js +0 -98
  274. package/dist/src/extract/stencil.js +0 -312
  275. package/dist/src/extract/structural-slot-evidence.d.ts +0 -63
  276. package/dist/src/extract/structural-slot-evidence.js +0 -278
  277. package/dist/src/extract/svelte.js +0 -1309
  278. package/dist/src/extract/tsx-shared.d.ts +0 -37
  279. package/dist/src/extract/tsx-shared.js +0 -368
  280. package/dist/src/extract/vue-tsx.js +0 -449
  281. package/dist/src/extract/vue.js +0 -605
  282. package/dist/src/extract/web-components.js +0 -863
  283. /package/dist/src/extract/{source-line-metadata.js → framework-adapters/shared/helpers/get-node-source-lines.js} +0 -0
  284. /package/dist/src/extract/{resolve-local-module.d.ts → framework-adapters/shared/helpers/resolve-import-file-path.d.ts} +0 -0
  285. /package/dist/src/extract/{resolve-local-module.js → framework-adapters/shared/helpers/resolve-import-file-path.js} +0 -0
  286. /package/dist/src/extract/{resolve-type-property.d.ts → framework-adapters/shared/helpers/resolve-type-symbol.d.ts} +0 -0
  287. /package/dist/src/extract/{resolve-type-property.js → framework-adapters/shared/helpers/resolve-type-symbol.js} +0 -0
  288. /package/dist/src/extract/{slot-allowed-components.d.ts → helpers/evidence/collect-allowed-component-names.d.ts} +0 -0
  289. /package/dist/src/extract/{slot-allowed-components.js → helpers/evidence/collect-allowed-component-names.js} +0 -0
  290. /package/dist/src/extract/{parse-imported-names.d.ts → helpers/evidence/parse-source-imports.d.ts} +0 -0
  291. /package/dist/src/extract/{parse-imported-names.js → helpers/evidence/parse-source-imports.js} +0 -0
  292. /package/dist/src/extract/{validate.js → services/quality/helpers/inspection/validate-extracted-components.js} +0 -0
@@ -1,605 +0,0 @@
1
- import os from 'node:os';
2
- import { basename, dirname, resolve, join } from 'node:path';
3
- import { readFile } from 'node:fs/promises';
4
- import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
5
- import { parse as parseSFC } from '@vue/compiler-sfc';
6
- import { Project, Node } from 'ts-morph';
7
- import { createSortedExtractionResult, runFileExtractionWorkers } from './file-extraction-workers.js';
8
- import { resolveLocalModule } from './resolve-local-module.js';
9
- import { resolveTypeProperty } from './resolve-type-property.js';
10
- // @vue/compiler-core NodeTypes enum values (stable since Vue 3.0)
11
- const ELEMENT_TYPE = 1;
12
- const ATTRIBUTE_TYPE = 6;
13
- const VUE_TYPE_MAP = {
14
- String: 'string',
15
- Number: 'number',
16
- Boolean: 'boolean',
17
- Array: 'any[]',
18
- Object: 'object',
19
- Function: 'function',
20
- Date: 'Date',
21
- Symbol: 'symbol',
22
- };
23
- export async function extractVueComponents(filePaths, onProgress) {
24
- const vueFiles = filePaths.filter((f) => f.endsWith('.vue'));
25
- const { items: components, warnings } = await runFileExtractionWorkers(vueFiles, os.cpus().length, async (filePath, source) => {
26
- const { component, warnings: fileWarnings } = await extractFromVueSFC(filePath, source);
27
- return { item: component, warnings: fileWarnings };
28
- }, (filePath, error) => `Failed to extract from ${filePath}: ${error instanceof Error ? error.message : String(error)}`, onProgress);
29
- return createSortedExtractionResult(components, warnings);
30
- }
31
- async function extractFromVueSFC(filePath, source) {
32
- const { descriptor, errors } = parseSFC(source);
33
- const fileWarnings = errors.map((e) => `Parse error in ${filePath}: ${e instanceof Error ? e.message : String(e)}`);
34
- const name = getVueComponentName(filePath);
35
- // Props: <script setup> wins over Options API <script>
36
- let props = [];
37
- const setupProps = descriptor.scriptSetup ? await extractSetupProps(filePath, descriptor.scriptSetup.content) : null;
38
- if (setupProps !== null) {
39
- props = setupProps;
40
- }
41
- else if (descriptor.script) {
42
- return extractOptionsComponent(filePath, descriptor.script.content, fileWarnings, name, descriptor.template?.ast, source);
43
- }
44
- // Slots: from template AST + runtime $slots access
45
- let slots = descriptor.template?.ast
46
- ? extractSlotsFromTemplate(descriptor.template.ast)
47
- : [];
48
- const runtimeSlots = extractSlotsFromRuntimeAccess(source);
49
- slots = mergeSlotsDedup(slots, runtimeSlots);
50
- return {
51
- component: {
52
- name,
53
- source: filePath,
54
- sourcePath: filePath,
55
- framework: 'vue',
56
- props,
57
- slots,
58
- },
59
- warnings: fileWarnings,
60
- };
61
- }
62
- function getVueComponentName(filePath) {
63
- const fileName = basename(filePath, '.vue');
64
- if (fileName !== 'index') {
65
- return fileName;
66
- }
67
- const parentDirName = basename(dirname(filePath));
68
- return parentDirName || fileName;
69
- }
70
- async function extractOptionsComponent(filePath, scriptContent, fileWarnings, name, templateAst, sfcSource) {
71
- const props = await extractOptionsProps(filePath, scriptContent);
72
- let slots = templateAst ? extractSlotsFromTemplate(templateAst) : [];
73
- if (sfcSource) {
74
- const runtimeSlots = extractSlotsFromRuntimeAccess(sfcSource);
75
- slots = mergeSlotsDedup(slots, runtimeSlots);
76
- }
77
- return {
78
- component: {
79
- name,
80
- source: filePath,
81
- sourcePath: filePath,
82
- framework: 'vue',
83
- props,
84
- slots,
85
- },
86
- warnings: fileWarnings,
87
- };
88
- }
89
- async function extractSetupProps(filePath, scriptSetupContent) {
90
- const project = new Project({
91
- compilerOptions: {
92
- strict: false,
93
- target: 99, // ESNext
94
- module: 99, // ESNext
95
- allowJs: true,
96
- },
97
- useInMemoryFileSystem: true,
98
- skipAddingFilesFromTsConfig: true,
99
- });
100
- const sf = project.createSourceFile('__setup__.ts', scriptSetupContent);
101
- // Try generic syntax: defineProps<{...}>()
102
- let genericTypeText = null;
103
- sf.forEachDescendant((node) => {
104
- if (genericTypeText !== null)
105
- return;
106
- if (Node.isCallExpression(node) &&
107
- node.getExpression().getText() === 'defineProps' &&
108
- node.getTypeArguments().length > 0) {
109
- genericTypeText = node.getTypeArguments()[0].getText();
110
- }
111
- });
112
- if (genericTypeText !== null) {
113
- return extractGenericProps(genericTypeText);
114
- }
115
- const importedObjectRefs = collectSetupImportedObjectRefs(sf, filePath);
116
- // Try object syntax: defineProps({...})
117
- let objectProps = null;
118
- const visitedImports = new Set();
119
- for (const node of sf.getDescendants()) {
120
- if (objectProps !== null)
121
- break;
122
- if (Node.isCallExpression(node) &&
123
- node.getExpression().getText() === 'defineProps' &&
124
- node.getTypeArguments().length === 0) {
125
- const args = node.getArguments();
126
- if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {
127
- objectProps = await parseSetupObjectProps(args[0], importedObjectRefs, visitedImports);
128
- }
129
- }
130
- }
131
- if (objectProps !== null) {
132
- return objectProps;
133
- }
134
- // No defineProps found in setup script
135
- return null;
136
- }
137
- function extractGenericProps(typeText) {
138
- const project = new Project({
139
- compilerOptions: {
140
- strict: true,
141
- target: 99,
142
- module: 99,
143
- },
144
- useInMemoryFileSystem: true,
145
- skipAddingFilesFromTsConfig: true,
146
- });
147
- // Wrap in a type alias so we can resolve it
148
- const sf = project.createSourceFile('__props__.ts', `type __Props__ = ${typeText};`);
149
- const typeAlias = sf.getTypeAlias('__Props__');
150
- if (!typeAlias)
151
- return [];
152
- const type = typeAlias.getType();
153
- const props = [];
154
- for (const property of type.getProperties()) {
155
- const resolved = resolveTypeProperty(property);
156
- if (!resolved)
157
- continue;
158
- const { name, typeText: resolvedTypeText, required } = resolved;
159
- // Strip `| undefined` from optional types for clean output
160
- let typeText = resolvedTypeText;
161
- if (!required) {
162
- typeText = typeText.replace(/\s*\|\s*undefined$/, '').replace(/^undefined\s*\|\s*/, '');
163
- }
164
- props.push({
165
- name,
166
- type: typeText,
167
- required,
168
- });
169
- }
170
- return props.sort((a, b) => a.name.localeCompare(b.name));
171
- }
172
- function collectSetupImportedObjectRefs(sf, filePath) {
173
- const refs = new Map();
174
- for (const importDecl of sf.getImportDeclarations()) {
175
- const specifier = importDecl.getModuleSpecifierValue();
176
- if (!specifier.startsWith('.'))
177
- continue;
178
- const resolvedImportPath = resolveLocalModule(filePath, specifier);
179
- if (!resolvedImportPath)
180
- continue;
181
- for (const namedImport of importDecl.getNamedImports()) {
182
- refs.set(namedImport.getAliasNode()?.getText() ?? namedImport.getName(), {
183
- filePath: resolvedImportPath,
184
- exportName: namedImport.getName(),
185
- });
186
- }
187
- }
188
- return refs;
189
- }
190
- async function parseSetupObjectProps(obj, importedObjectRefs, visitedImports) {
191
- const mergedProps = new Map();
192
- for (const prop of parseObjectProps(obj)) {
193
- mergedProps.set(prop.name, prop);
194
- }
195
- for (const prop of obj.getProperties()) {
196
- if (!Node.isSpreadAssignment(prop))
197
- continue;
198
- const expression = prop.getExpression();
199
- if (!Node.isIdentifier(expression))
200
- continue;
201
- const importedRef = importedObjectRefs.get(expression.getText());
202
- if (!importedRef)
203
- continue;
204
- const importedProps = await extractNamedObjectExportProps(importedRef, visitedImports);
205
- for (const importedProp of importedProps) {
206
- if (!mergedProps.has(importedProp.name)) {
207
- mergedProps.set(importedProp.name, importedProp);
208
- }
209
- }
210
- }
211
- return [...mergedProps.values()].sort((a, b) => a.name.localeCompare(b.name));
212
- }
213
- async function extractNamedObjectExportProps(importedRef, visitedImports) {
214
- const visitKey = `${importedRef.filePath}:${importedRef.exportName}`;
215
- if (visitedImports.has(visitKey))
216
- return [];
217
- visitedImports.add(visitKey);
218
- const source = await readFile(importedRef.filePath, 'utf-8');
219
- const project = new Project({
220
- compilerOptions: {
221
- strict: false,
222
- target: 99,
223
- module: 99,
224
- allowJs: true,
225
- },
226
- useInMemoryFileSystem: true,
227
- skipAddingFilesFromTsConfig: true,
228
- });
229
- const sf = project.createSourceFile('__imported_object__.ts', source);
230
- for (const declaration of sf.getVariableDeclarations()) {
231
- if (declaration.getName() !== importedRef.exportName)
232
- continue;
233
- const initializer = declaration.getInitializer();
234
- if (!initializer || !Node.isObjectLiteralExpression(initializer))
235
- continue;
236
- return parseObjectProps(initializer);
237
- }
238
- return [];
239
- }
240
- /**
241
- * Resolve a bare module specifier (e.g. "primevue/select", "@primevue/core/baseeditableholder")
242
- * to a .vue source file within the same monorepo workspace.
243
- *
244
- * Strategy:
245
- * 1. Walk up from the importing file to find the monorepo root (directory with a
246
- * root package.json that contains "workspaces" or a pnpm-workspace.yaml).
247
- * 2. Scan workspace package directories for a package.json whose "name" matches
248
- * the package portion of the specifier.
249
- * 3. Use the package.json "exports" field (or "main") to resolve the subpath to
250
- * an absolute .vue file path.
251
- */
252
- const workspaceRootCache = new Map();
253
- function findWorkspaceRoot(startDir) {
254
- if (workspaceRootCache.has(startDir))
255
- return workspaceRootCache.get(startDir);
256
- let dir = startDir;
257
- while (true) {
258
- const pkgJsonPath = join(dir, 'package.json');
259
- if (existsSync(pkgJsonPath)) {
260
- try {
261
- const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
262
- if (pkg.workspaces || existsSync(join(dir, 'pnpm-workspace.yaml'))) {
263
- workspaceRootCache.set(startDir, dir);
264
- return dir;
265
- }
266
- }
267
- catch {
268
- /* skip malformed */
269
- }
270
- }
271
- const parent = dirname(dir);
272
- if (parent === dir) {
273
- workspaceRootCache.set(startDir, null);
274
- return null;
275
- }
276
- dir = parent;
277
- }
278
- }
279
- const workspacePackageDirsCache = new Map();
280
- function getWorkspacePackageDirs(workspaceRoot) {
281
- if (workspacePackageDirsCache.has(workspaceRoot)) {
282
- return workspacePackageDirsCache.get(workspaceRoot);
283
- }
284
- const packageMap = new Map();
285
- const packagesDir = join(workspaceRoot, 'packages');
286
- if (!existsSync(packagesDir)) {
287
- workspacePackageDirsCache.set(workspaceRoot, packageMap);
288
- return packageMap;
289
- }
290
- function scanDir(dir, depth) {
291
- if (depth > 3)
292
- return;
293
- let entries;
294
- try {
295
- entries = readdirSync(dir);
296
- }
297
- catch {
298
- return;
299
- }
300
- const pkgJsonPath = join(dir, 'package.json');
301
- if (existsSync(pkgJsonPath)) {
302
- try {
303
- const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
304
- if (typeof pkg.name === 'string') {
305
- packageMap.set(pkg.name, dir);
306
- }
307
- }
308
- catch {
309
- /* skip */
310
- }
311
- }
312
- for (const entry of entries) {
313
- if (entry === 'node_modules' || entry === '.git' || entry.startsWith('.'))
314
- continue;
315
- const entryPath = join(dir, entry);
316
- try {
317
- const stat = statSync(entryPath);
318
- if (stat.isDirectory()) {
319
- scanDir(entryPath, depth + 1);
320
- }
321
- }
322
- catch {
323
- /* skip */
324
- }
325
- }
326
- }
327
- scanDir(packagesDir, 0);
328
- workspacePackageDirsCache.set(workspaceRoot, packageMap);
329
- return packageMap;
330
- }
331
- function resolveWorkspaceVueImport(specifier, importingFilePath) {
332
- const workspaceRoot = findWorkspaceRoot(dirname(importingFilePath));
333
- if (!workspaceRoot)
334
- return null;
335
- const packageDirs = getWorkspacePackageDirs(workspaceRoot);
336
- // Parse the specifier into package name and subpath
337
- // e.g. "primevue/select" → packageName="primevue", subpath="./select"
338
- // e.g. "@primevue/core/baseeditableholder" → packageName="@primevue/core", subpath="./baseeditableholder"
339
- let packageName;
340
- let subpath;
341
- if (specifier.startsWith('@')) {
342
- // Scoped package: @scope/name or @scope/name/subpath
343
- const parts = specifier.split('/');
344
- if (parts.length < 2)
345
- return null;
346
- packageName = `${parts[0]}/${parts[1]}`;
347
- subpath = parts.length > 2 ? './' + parts.slice(2).join('/') : '.';
348
- }
349
- else {
350
- const slashIndex = specifier.indexOf('/');
351
- if (slashIndex === -1) {
352
- packageName = specifier;
353
- subpath = '.';
354
- }
355
- else {
356
- packageName = specifier.substring(0, slashIndex);
357
- subpath = './' + specifier.substring(slashIndex + 1);
358
- }
359
- }
360
- const packageDir = packageDirs.get(packageName);
361
- if (!packageDir)
362
- return null;
363
- // Try package.json exports field first
364
- const pkgJsonPath = join(packageDir, 'package.json');
365
- try {
366
- const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
367
- if (pkg.exports && subpath !== '.') {
368
- const exportValue = pkg.exports[subpath];
369
- if (typeof exportValue === 'string' && exportValue.endsWith('.vue')) {
370
- const resolved = resolve(packageDir, exportValue);
371
- if (existsSync(resolved))
372
- return resolved;
373
- }
374
- }
375
- // Try subpath as a directory with its own package.json
376
- if (subpath !== '.') {
377
- const subDir = resolve(packageDir, subpath.replace(/^\.\//, ''));
378
- // Check in src/ first (common pattern)
379
- for (const base of [join(packageDir, 'src', subpath.replace(/^\.\//, '')), subDir]) {
380
- const subPkgPath = join(base, 'package.json');
381
- if (existsSync(subPkgPath)) {
382
- try {
383
- const subPkg = JSON.parse(readFileSync(subPkgPath, 'utf8'));
384
- const main = subPkg.main || subPkg.module;
385
- if (typeof main === 'string' && main.endsWith('.vue')) {
386
- const resolved = resolve(base, main);
387
- if (existsSync(resolved))
388
- return resolved;
389
- }
390
- }
391
- catch {
392
- /* skip */
393
- }
394
- }
395
- }
396
- }
397
- // Fallback: try main/module field for root imports
398
- if (subpath === '.') {
399
- const main = pkg.main || pkg.module;
400
- if (typeof main === 'string' && main.endsWith('.vue')) {
401
- const resolved = resolve(packageDir, main);
402
- if (existsSync(resolved))
403
- return resolved;
404
- }
405
- }
406
- }
407
- catch {
408
- /* skip malformed */
409
- }
410
- return null;
411
- }
412
- async function extractOptionsProps(filePath, scriptContent, visited = new Set()) {
413
- const resolvedFilePath = resolve(filePath);
414
- if (visited.has(resolvedFilePath)) {
415
- return [];
416
- }
417
- visited.add(resolvedFilePath);
418
- const project = new Project({
419
- compilerOptions: {
420
- strict: false,
421
- target: 99,
422
- module: 99,
423
- allowJs: true,
424
- },
425
- useInMemoryFileSystem: true,
426
- skipAddingFilesFromTsConfig: true,
427
- });
428
- const sf = project.createSourceFile('__options__.ts', scriptContent);
429
- const localImports = new Map();
430
- for (const importDecl of sf.getImportDeclarations()) {
431
- const specifier = importDecl.getModuleSpecifierValue();
432
- const defaultImport = importDecl.getDefaultImport();
433
- if (!defaultImport)
434
- continue;
435
- if (specifier.startsWith('.')) {
436
- if (!specifier.endsWith('.vue'))
437
- continue;
438
- localImports.set(defaultImport.getText(), resolve(dirname(resolvedFilePath), specifier));
439
- }
440
- else {
441
- // Try resolving bare module specifier to a .vue file in the workspace
442
- const resolvedVuePath = resolveWorkspaceVueImport(specifier, resolvedFilePath);
443
- if (resolvedVuePath) {
444
- localImports.set(defaultImport.getText(), resolvedVuePath);
445
- }
446
- }
447
- }
448
- for (const node of sf.getDescendants()) {
449
- if (!Node.isExportAssignment(node))
450
- continue;
451
- const expr = node.getExpression();
452
- if (!Node.isObjectLiteralExpression(expr))
453
- continue;
454
- const mergedProps = new Map();
455
- const extendsProp = expr.getProperty('extends');
456
- if (extendsProp && Node.isPropertyAssignment(extendsProp)) {
457
- const extendsInit = extendsProp.getInitializer();
458
- if (extendsInit && Node.isIdentifier(extendsInit)) {
459
- const extendsPath = localImports.get(extendsInit.getText());
460
- if (extendsPath) {
461
- const inheritedProps = await extractInheritedVueProps(extendsPath, visited);
462
- for (const prop of inheritedProps) {
463
- mergedProps.set(prop.name, prop);
464
- }
465
- }
466
- }
467
- }
468
- const propsProp = expr.getProperty('props');
469
- if (!propsProp || !Node.isPropertyAssignment(propsProp)) {
470
- return [...mergedProps.values()].sort((a, b) => a.name.localeCompare(b.name));
471
- }
472
- const propsInit = propsProp.getInitializer();
473
- if (!propsInit || !Node.isObjectLiteralExpression(propsInit)) {
474
- return [...mergedProps.values()].sort((a, b) => a.name.localeCompare(b.name));
475
- }
476
- for (const prop of parseObjectProps(propsInit)) {
477
- mergedProps.set(prop.name, prop);
478
- }
479
- return [...mergedProps.values()].sort((a, b) => a.name.localeCompare(b.name));
480
- }
481
- return [];
482
- }
483
- async function extractInheritedVueProps(filePath, visited) {
484
- const source = await readFile(filePath, 'utf-8');
485
- const { descriptor } = parseSFC(source);
486
- if (!descriptor.script) {
487
- return [];
488
- }
489
- return extractOptionsProps(filePath, descriptor.script.content, visited);
490
- }
491
- function parseObjectProps(obj) {
492
- if (!Node.isObjectLiteralExpression(obj))
493
- return [];
494
- const result = [];
495
- for (const prop of obj.getProperties()) {
496
- if (!Node.isPropertyAssignment(prop))
497
- continue;
498
- const name = prop.getName();
499
- if (!isPublicVuePropName(name))
500
- continue;
501
- const init = prop.getInitializer();
502
- if (!init || !Node.isObjectLiteralExpression(init)) {
503
- // Bare constructor reference like `propName: String`
504
- const initText = init?.getText() ?? 'any';
505
- result.push({
506
- name,
507
- type: VUE_TYPE_MAP[initText] ?? 'any',
508
- required: false,
509
- sourceStartLine: prop.getStartLineNumber(),
510
- sourceEndLine: prop.getEndLineNumber(),
511
- });
512
- continue;
513
- }
514
- // { type: X, required: bool, default: val }
515
- const typeProp = init.getProperty('type');
516
- const requiredProp = init.getProperty('required');
517
- const defaultProp = init.getProperty('default');
518
- let type = 'any';
519
- if (typeProp && Node.isPropertyAssignment(typeProp)) {
520
- const typeInit = typeProp.getInitializer();
521
- if (typeInit) {
522
- type = VUE_TYPE_MAP[typeInit.getText()] ?? 'any';
523
- }
524
- }
525
- let required = false;
526
- if (requiredProp && Node.isPropertyAssignment(requiredProp)) {
527
- const reqInit = requiredProp.getInitializer();
528
- if (reqInit) {
529
- required = reqInit.getText() === 'true';
530
- }
531
- }
532
- let defaultValue;
533
- if (defaultProp && Node.isPropertyAssignment(defaultProp)) {
534
- const defInit = defaultProp.getInitializer();
535
- if (defInit) {
536
- defaultValue = defInit.getText().replace(/^['"]|['"]$/g, '');
537
- }
538
- }
539
- result.push({
540
- name,
541
- type,
542
- required,
543
- ...(defaultValue !== undefined && { defaultValue }),
544
- sourceStartLine: prop.getStartLineNumber(),
545
- sourceEndLine: prop.getEndLineNumber(),
546
- });
547
- }
548
- return result;
549
- }
550
- function isPublicVuePropName(name) {
551
- return !/^[_$]/.test(name);
552
- }
553
- function extractSlotsFromTemplate(ast) {
554
- const slots = [];
555
- function walk(node) {
556
- if (node.type === ELEMENT_TYPE && node.tag === 'slot') {
557
- const nameProp = node.props?.find((p) => p.type === ATTRIBUTE_TYPE && p.name === 'name');
558
- const slotName = nameProp?.value?.content ?? 'default';
559
- const isDefault = slotName === 'default';
560
- if (!slots.some((s) => s.name === slotName)) {
561
- slots.push({ name: slotName, isDefault });
562
- }
563
- }
564
- if (node.children) {
565
- for (const child of node.children) {
566
- if (typeof child === 'object' && child !== null && 'type' in child) {
567
- walk(child);
568
- }
569
- }
570
- }
571
- }
572
- walk(ast);
573
- return slots;
574
- }
575
- /**
576
- * Detect slots referenced via runtime `$slots.name` or `$slots['name']` access
577
- * in template expressions or script content that aren't declared as `<slot>` tags.
578
- */
579
- function extractSlotsFromRuntimeAccess(source) {
580
- const slots = [];
581
- const seen = new Set();
582
- // Match $slots.name (dot access) and $slots['name'] / $slots["name"] (bracket access)
583
- const dotPattern = /\$slots\.([a-zA-Z_]\w*)/g;
584
- const bracketPattern = /\$slots\[['"]([a-zA-Z_][\w-]*)['"]\]/g;
585
- for (const pattern of [dotPattern, bracketPattern]) {
586
- let match;
587
- while ((match = pattern.exec(source)) !== null) {
588
- const name = match[1];
589
- if (!seen.has(name)) {
590
- seen.add(name);
591
- slots.push({ name, isDefault: name === 'default' });
592
- }
593
- }
594
- }
595
- return slots;
596
- }
597
- function mergeSlotsDedup(base, extra) {
598
- const merged = [...base];
599
- for (const slot of extra) {
600
- if (!merged.some((s) => s.name === slot.name)) {
601
- merged.push(slot);
602
- }
603
- }
604
- return merged;
605
- }