@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
@@ -0,0 +1,85 @@
1
+ import { Node } from 'ts-morph';
2
+ /** Collects all names bound in the file via imports or top-level declarations. */
3
+ export function collectLocallyBoundNames(sourceFile) {
4
+ const names = new Set();
5
+ for (const imp of sourceFile.getImportDeclarations()) {
6
+ const defaultImport = imp.getDefaultImport();
7
+ if (defaultImport)
8
+ names.add(defaultImport.getText());
9
+ const namespaceImport = imp.getNamespaceImport();
10
+ if (namespaceImport)
11
+ names.add(namespaceImport.getText());
12
+ for (const named of imp.getNamedImports()) {
13
+ names.add((named.getAliasNode() ?? named.getNameNode()).getText());
14
+ }
15
+ }
16
+ for (const decl of sourceFile.getVariableDeclarations())
17
+ names.add(decl.getName());
18
+ for (const decl of sourceFile.getFunctions()) {
19
+ const declName = decl.getName();
20
+ if (declName)
21
+ names.add(declName);
22
+ }
23
+ return names;
24
+ }
25
+ /**
26
+ * Returns the tag identifier of the JSX element a callback returns, or
27
+ * `undefined` if the callback doesn't return exactly one identifier-tagged JSX element.
28
+ */
29
+ export function getReturnedJsxTagName(callback) {
30
+ const body = callback.getBody();
31
+ const jsxNode = unwrapReturnedJsx(body);
32
+ if (!jsxNode)
33
+ return undefined;
34
+ if (Node.isJsxSelfClosingElement(jsxNode) || Node.isJsxOpeningElement(jsxNode)) {
35
+ return jsxNode.getTagNameNode().getText();
36
+ }
37
+ if (Node.isJsxElement(jsxNode)) {
38
+ return jsxNode.getOpeningElement().getTagNameNode().getText();
39
+ }
40
+ return undefined;
41
+ }
42
+ /** Unwraps a JSX node from an expression body, block body return, or parenthesized expression. */
43
+ export function unwrapReturnedJsx(bodyOrExpr) {
44
+ if (Node.isJsxElement(bodyOrExpr) ||
45
+ Node.isJsxSelfClosingElement(bodyOrExpr) ||
46
+ Node.isJsxOpeningElement(bodyOrExpr)) {
47
+ return bodyOrExpr;
48
+ }
49
+ if (Node.isJsxFragment(bodyOrExpr)) {
50
+ return unwrapSingleJsxChildOfFragment(bodyOrExpr);
51
+ }
52
+ if (Node.isParenthesizedExpression(bodyOrExpr)) {
53
+ return unwrapReturnedJsx(bodyOrExpr.getExpression());
54
+ }
55
+ if (Node.isBlock(bodyOrExpr)) {
56
+ const returns = bodyOrExpr.getStatements().filter(Node.isReturnStatement);
57
+ if (returns.length !== 1)
58
+ return undefined;
59
+ const expr = returns[0].getExpression();
60
+ if (!expr)
61
+ return undefined;
62
+ return unwrapReturnedJsx(expr);
63
+ }
64
+ return undefined;
65
+ }
66
+ /** Returns the single JSX child of a fragment, or undefined if the fragment has 0 or 2+ children. */
67
+ export function unwrapSingleJsxChildOfFragment(fragment) {
68
+ if (!Node.isJsxFragment(fragment))
69
+ return undefined;
70
+ const jsxChildren = fragment
71
+ .getJsxChildren()
72
+ .filter((child) => Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child));
73
+ if (jsxChildren.length !== 1)
74
+ return undefined;
75
+ return jsxChildren[0];
76
+ }
77
+ const JSX_CARRYING_TYPE_TOKENS = ['ReactNode', 'ReactElement', 'JSX.Element'];
78
+ /** Returns true when the type text refers to a React JSX-carrying type (ReactNode, ReactElement, JSX.Element). */
79
+ export function isJsxCarryingTypeText(typeText) {
80
+ for (const token of JSX_CARRYING_TYPE_TOKENS) {
81
+ if (typeText.includes(token))
82
+ return true;
83
+ }
84
+ return false;
85
+ }
@@ -0,0 +1,5 @@
1
+ import { type SourceFile } from 'ts-morph';
2
+ import { type AllowedComponentsContext } from './collect-allowed-component-names.js';
3
+ export { collectRenderedComponentReferences, collectArrayMapRenderComponentReferences, } from './ast/collect-structural-jsx-evidence.js';
4
+ export declare function collectTypePredicateComponentReferences(sourceFile: SourceFile, ctx: AllowedComponentsContext): string[];
5
+ export declare function collectRuntimeTypeCheckComponentReferences(sourceFile: SourceFile, componentNames: ReadonlySet<string>): string[];
@@ -0,0 +1,52 @@
1
+ import { Node, SyntaxKind, } from 'ts-morph';
2
+ import { extractAllowedComponentsFromTypeText, } from './collect-allowed-component-names.js';
3
+ import { collectLocallyBoundNames } from './ast/get-jsx-ast-data.js';
4
+ export { collectRenderedComponentReferences, collectArrayMapRenderComponentReferences, } from './ast/collect-structural-jsx-evidence.js';
5
+ export function collectTypePredicateComponentReferences(sourceFile, ctx) {
6
+ const found = new Set();
7
+ const candidates = [
8
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.FunctionDeclaration),
9
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.ArrowFunction),
10
+ ...sourceFile.getDescendantsOfKind(SyntaxKind.FunctionExpression),
11
+ ];
12
+ for (const fn of candidates) {
13
+ const returnTypeNode = fn.getReturnTypeNode();
14
+ if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode))
15
+ continue;
16
+ const assertedTypeNode = returnTypeNode.getTypeNode();
17
+ if (!assertedTypeNode)
18
+ continue;
19
+ for (const name of extractAllowedComponentsFromTypeText(assertedTypeNode.getText(), ctx)) {
20
+ found.add(name);
21
+ }
22
+ }
23
+ return [...found].sort();
24
+ }
25
+ export function collectRuntimeTypeCheckComponentReferences(sourceFile, componentNames) {
26
+ const found = new Set();
27
+ const localBindings = collectLocallyBoundNames(sourceFile);
28
+ for (const binary of sourceFile.getDescendantsOfKind(SyntaxKind.BinaryExpression)) {
29
+ const operator = binary.getOperatorToken().getText();
30
+ if (operator !== '===' && operator !== '==')
31
+ continue;
32
+ const left = binary.getLeft();
33
+ const right = binary.getRight();
34
+ const candidateFromTypeAccess = (typeAccessSide, otherSide) => {
35
+ if (!Node.isPropertyAccessExpression(typeAccessSide) || typeAccessSide.getName() !== 'type')
36
+ return undefined;
37
+ if (!Node.isIdentifier(otherSide) && !Node.isPropertyAccessExpression(otherSide))
38
+ return undefined;
39
+ const name = otherSide.getText().split('.').pop();
40
+ if (!name || !componentNames.has(name))
41
+ return undefined;
42
+ const baseIdentifier = Node.isPropertyAccessExpression(otherSide) ? otherSide.getExpression() : otherSide;
43
+ if (!Node.isIdentifier(baseIdentifier) || !localBindings.has(baseIdentifier.getText()))
44
+ return undefined;
45
+ return name;
46
+ };
47
+ const match = candidateFromTypeAccess(left, right) ?? candidateFromTypeAccess(right, left);
48
+ if (match)
49
+ found.add(match);
50
+ }
51
+ return [...found].sort();
52
+ }
@@ -0,0 +1,16 @@
1
+ export { isReactNodeType, isArrayReactNodeType } from './ast/detect-react-node-types.js';
2
+ /**
3
+ * Prop names that should remain as props even when typed as ReactNode.
4
+ * These are typically text-content names, not composable slots.
5
+ */
6
+ export declare const CONTENT_NAME_EXCEPTIONS: Set<string>;
7
+ /**
8
+ * Determines whether a prop should be converted to a slot based on its name and type.
9
+ *
10
+ * Rules:
11
+ * 1. If the type is not a ReactNode type → false
12
+ * 2. If the type is an array ReactNode → true (overrides exception list)
13
+ * 3. If the name is in the content-name exception list → false
14
+ * 4. Otherwise → true
15
+ */
16
+ export declare function shouldBeSlot(propName: string, typeText: string): boolean;
@@ -0,0 +1,39 @@
1
+ export { isReactNodeType, isArrayReactNodeType } from './ast/detect-react-node-types.js';
2
+ import { isReactNodeType, isArrayReactNodeType } from './ast/detect-react-node-types.js';
3
+ /**
4
+ * Prop names that should remain as props even when typed as ReactNode.
5
+ * These are typically text-content names, not composable slots.
6
+ */
7
+ export const CONTENT_NAME_EXCEPTIONS = new Set([
8
+ 'label',
9
+ 'title',
10
+ 'description',
11
+ 'text',
12
+ 'caption',
13
+ 'message',
14
+ 'placeholder',
15
+ 'tooltip',
16
+ 'heading',
17
+ 'subheading',
18
+ 'body',
19
+ 'summary',
20
+ 'excerpt',
21
+ ]);
22
+ /**
23
+ * Determines whether a prop should be converted to a slot based on its name and type.
24
+ *
25
+ * Rules:
26
+ * 1. If the type is not a ReactNode type → false
27
+ * 2. If the type is an array ReactNode → true (overrides exception list)
28
+ * 3. If the name is in the content-name exception list → false
29
+ * 4. Otherwise → true
30
+ */
31
+ export function shouldBeSlot(propName, typeText) {
32
+ if (!isReactNodeType(typeText))
33
+ return false;
34
+ if (isArrayReactNodeType(typeText))
35
+ return true;
36
+ if (CONTENT_NAME_EXCEPTIONS.has(propName))
37
+ return false;
38
+ return true;
39
+ }
@@ -0,0 +1,13 @@
1
+ import type { ExtractorProgress } from '../types/component.js';
2
+ import type { ExtractionEndpointResponse } from '../types/contract.js';
3
+ import type { ExtractorOptions } from '../types/options.js';
4
+ export interface ExtractionOrchestratorRequest extends ExtractorOptions {
5
+ readonly filePaths: readonly string[];
6
+ onProgress?: (progress: ExtractorProgress) => void;
7
+ }
8
+ /**
9
+ * Executes the extraction use case after the controller has validated the
10
+ * public request. Owns extraction-time classification, inspection,
11
+ * quality signals, scoring, and validation, but not transport or persistence.
12
+ */
13
+ export declare function executeExtractionOrchestrator(request: ExtractionOrchestratorRequest): Promise<ExtractionEndpointResponse>;
@@ -0,0 +1,17 @@
1
+ import { extractComponents } from '../services/extraction/extract-components.js';
2
+ import { preClassifyComponent } from '../services/classification/classify-component-props.js';
3
+ import { evaluateExtractionQuality } from '../services/quality/evaluate-extraction-quality.js';
4
+ /**
5
+ * Executes the extraction use case after the controller has validated the
6
+ * public request. Owns extraction-time classification, inspection,
7
+ * quality signals, scoring, and validation, but not transport or persistence.
8
+ */
9
+ export async function executeExtractionOrchestrator(request) {
10
+ const filePaths = [...request.filePaths];
11
+ const extraction = await extractComponents(filePaths, request.onProgress, {
12
+ ...(request.resolveUnreachable !== undefined ? { resolveUnreachable: request.resolveUnreachable } : {}),
13
+ ...(request.projectRoot !== undefined ? { projectRoot: request.projectRoot } : {}),
14
+ });
15
+ const classifiedComponents = extraction.components.map(preClassifyComponent);
16
+ return evaluateExtractionQuality(classifiedComponents, extraction.warnings);
17
+ }
@@ -1,8 +1,6 @@
1
- import type { RawPropDefinition, RawComponentDefinition } from './types.js';
2
- export interface PreClassification {
3
- category: 'content' | 'design' | 'state' | 'exclude';
4
- cdfTypeHint?: 'string' | 'enum' | 'richtext' | 'media' | 'boolean';
5
- }
1
+ import type { RawPropDefinition, RawComponentDefinition } from '../../types/component.js';
2
+ import type { PreClassification } from '../../types/classification.js';
3
+ export type { PreClassification } from '../../types/classification.js';
6
4
  /**
7
5
  * Deterministic pre-classification rule engine.
8
6
  * Applies rules in priority order and returns on the first match.
@@ -1,96 +1,5 @@
1
- /**
2
- * Determines whether a type string represents a simple/primitive type
3
- * (string, boolean, number, or string literal union) vs a complex type
4
- * (object, function, array, generic, etc.).
5
- */
6
- function isSimpleType(type) {
7
- const t = type.trim();
8
- if (t === 'string' || t === 'boolean' || t === 'number')
9
- return true;
10
- // String literal union (e.g., "'a' | 'b'")
11
- if (isStringLiteralUnion(t))
12
- return true;
13
- return false;
14
- }
15
- function isStringLiteralUnion(type) {
16
- return type.includes('|') && type.includes("'");
17
- }
18
- function isBooleanType(type) {
19
- return type.trim() === 'boolean';
20
- }
21
- function isStringType(type) {
22
- return type.trim() === 'string';
23
- }
24
- function isNumberType(type) {
25
- return type.trim() === 'number';
26
- }
27
- function isComplexType(type) {
28
- return !isSimpleType(type);
29
- }
30
- const DOM_PASS_THROUGH_PROPS = new Set([
31
- // Bare HTML / framework styling pass-through
32
- 'className',
33
- 'class',
34
- 'classes',
35
- 'classNames',
36
- 'rootClassName',
37
- 'prefixCls',
38
- 'style',
39
- 'styles',
40
- // Bare HTML attributes
41
- 'id',
42
- 'role',
43
- 'tabIndex',
44
- 'tabindex',
45
- 'htmlFor',
46
- 'for',
47
- 'slot',
48
- 'is',
49
- 'lang',
50
- 'dir',
51
- 'hidden',
52
- 'draggable',
53
- 'spellCheck',
54
- 'spellcheck',
55
- 'contentEditable',
56
- 'contenteditable',
57
- 'inputMode',
58
- 'inputmode',
59
- 'autoComplete',
60
- 'autocomplete',
61
- 'autoFocus',
62
- 'autofocus',
63
- 'translate',
64
- 'part',
65
- 'exportparts',
66
- 'aria',
67
- // Framework theming / pass-through escape hatches — dev-facing, never marketer-configurable
68
- 'dt',
69
- 'pt',
70
- 'ptOptions',
71
- 'unstyled',
72
- 'sx',
73
- // Polymorphic component props — change rendered HTML/component, not marketer-visible behavior
74
- 'as',
75
- 'element',
76
- 'component',
77
- // QA / vendor test attributes
78
- 'dataQa',
79
- 'data-qa',
80
- // Vue v-model internals — framework wiring, never marketer-configurable
81
- 'modelValue',
82
- 'modelModifiers',
83
- ]);
84
- function isDomPassThroughProp(name) {
85
- if (DOM_PASS_THROUGH_PROPS.has(name))
86
- return true;
87
- // aria-label, aria-hidden, ariaLabel, ariaHidden — both kebab and camel forms
88
- if (/^aria[-A-Z]/.test(name))
89
- return true;
90
- if (name.startsWith('data-'))
91
- return true;
92
- return false;
93
- }
1
+ import { isStringLiteralUnion, isBooleanType, isStringType, isNumberType, isComplexType, } from './helpers/check-prop-types.js';
2
+ import { isDomPassThroughProp } from './helpers/detect-dom-props.js';
94
3
  /**
95
4
  * Deterministic pre-classification rule engine.
96
5
  * Applies rules in priority order and returns on the first match.
@@ -98,7 +7,6 @@ function isDomPassThroughProp(name) {
98
7
  export function preClassifyProp(prop) {
99
8
  const { name, type } = prop;
100
9
  // Rule 1: Event handlers
101
- // name starts with `on` + uppercase, OR type contains `=> void` or `EventHandler`
102
10
  if (/^on[A-Z]/.test(name) || type.includes('=> void') || type.includes('EventHandler')) {
103
11
  return { category: 'exclude' };
104
12
  }
@@ -119,9 +27,6 @@ export function preClassifyProp(prop) {
119
27
  return { category: 'exclude' };
120
28
  }
121
29
  // Rule 6: DOM / a11y / framework pass-through props
122
- // These are escape hatches developers use to wire components into the DOM.
123
- // Marketers should never configure them in the ExO editor; exposing them
124
- // generates noise that obscures the props that actually carry intent.
125
30
  if (isDomPassThroughProp(name)) {
126
31
  return { category: 'exclude' };
127
32
  }
@@ -211,15 +116,18 @@ export function preClassifyComponent(component) {
211
116
  // Provenance is extraction-only evidence. Do not add it to the payload
212
117
  // presented to downstream agents.
213
118
  const { domAttribute: _domAttribute, ...authorableProp } = prop;
214
- // If category is already set, leave unchanged
215
119
  if (prop.category) {
216
120
  return [authorableProp];
217
121
  }
218
122
  if (!result) {
219
123
  return [authorableProp];
220
124
  }
221
- // Set category hint
222
- return [{ ...authorableProp, category: result.category }];
125
+ return [
126
+ {
127
+ ...authorableProp,
128
+ category: result.category,
129
+ },
130
+ ];
223
131
  });
224
132
  return { ...component, props };
225
133
  }
@@ -0,0 +1,7 @@
1
+ /** Primitive-type predicates used by the classification rule engine. */
2
+ export declare function isStringLiteralUnion(type: string): boolean;
3
+ export declare function isSimpleType(type: string): boolean;
4
+ export declare function isBooleanType(type: string): boolean;
5
+ export declare function isStringType(type: string): boolean;
6
+ export declare function isNumberType(type: string): boolean;
7
+ export declare function isComplexType(type: string): boolean;
@@ -0,0 +1,22 @@
1
+ /** Primitive-type predicates used by the classification rule engine. */
2
+ export function isStringLiteralUnion(type) {
3
+ return type.includes('|') && type.includes("'");
4
+ }
5
+ export function isSimpleType(type) {
6
+ const t = type.trim();
7
+ if (t === 'string' || t === 'boolean' || t === 'number')
8
+ return true;
9
+ return isStringLiteralUnion(t);
10
+ }
11
+ export function isBooleanType(type) {
12
+ return type.trim() === 'boolean';
13
+ }
14
+ export function isStringType(type) {
15
+ return type.trim() === 'string';
16
+ }
17
+ export function isNumberType(type) {
18
+ return type.trim() === 'number';
19
+ }
20
+ export function isComplexType(type) {
21
+ return !isSimpleType(type);
22
+ }
@@ -0,0 +1,2 @@
1
+ /** Returns true when the prop name is a DOM attribute, a11y attribute, or framework pass-through escape hatch. */
2
+ export declare function isDomPassThroughProp(name: string): boolean;
@@ -0,0 +1,63 @@
1
+ const DOM_PASS_THROUGH_PROPS = new Set([
2
+ // Bare HTML / framework styling pass-through
3
+ 'className',
4
+ 'class',
5
+ 'classes',
6
+ 'classNames',
7
+ 'rootClassName',
8
+ 'prefixCls',
9
+ 'style',
10
+ 'styles',
11
+ // Bare HTML attributes
12
+ 'id',
13
+ 'role',
14
+ 'tabIndex',
15
+ 'tabindex',
16
+ 'htmlFor',
17
+ 'for',
18
+ 'slot',
19
+ 'is',
20
+ 'lang',
21
+ 'dir',
22
+ 'hidden',
23
+ 'draggable',
24
+ 'spellCheck',
25
+ 'spellcheck',
26
+ 'contentEditable',
27
+ 'contenteditable',
28
+ 'inputMode',
29
+ 'inputmode',
30
+ 'autoComplete',
31
+ 'autocomplete',
32
+ 'autoFocus',
33
+ 'autofocus',
34
+ 'translate',
35
+ 'part',
36
+ 'exportparts',
37
+ 'aria',
38
+ // Framework theming / pass-through escape hatches — dev-facing, never marketer-configurable
39
+ 'dt',
40
+ 'pt',
41
+ 'ptOptions',
42
+ 'unstyled',
43
+ 'sx',
44
+ // Polymorphic component props — change rendered HTML/component, not marketer-visible behavior
45
+ 'as',
46
+ 'element',
47
+ 'component',
48
+ // QA / vendor test attributes
49
+ 'dataQa',
50
+ 'data-qa',
51
+ // Vue v-model internals — framework wiring, never marketer-configurable
52
+ 'modelValue',
53
+ 'modelModifiers',
54
+ ]);
55
+ /** Returns true when the prop name is a DOM attribute, a11y attribute, or framework pass-through escape hatch. */
56
+ export function isDomPassThroughProp(name) {
57
+ if (DOM_PASS_THROUGH_PROPS.has(name))
58
+ return true;
59
+ // aria-label, aria-hidden, ariaLabel, ariaHidden — both kebab and camel forms
60
+ if (/^aria[-A-Z]/.test(name))
61
+ return true;
62
+ return name.startsWith('data-');
63
+ }
@@ -0,0 +1,2 @@
1
+ import type { ComponentExtractionResult } from '../../types/component.js';
2
+ export declare function deduplicateComponents(results: readonly ComponentExtractionResult[]): ComponentExtractionResult;
@@ -0,0 +1,58 @@
1
+ import { resolveComponentScopeInfo, resolveTopLevelFamilyName, resolveDeduplicationScopeKey, selectPreferredComponentSource, } from './helpers/component-path-scoring.js';
2
+ export function deduplicateComponents(results) {
3
+ const allWarnings = [];
4
+ const exclusions = [];
5
+ const componentsByKey = new Map();
6
+ const keysByName = new Map();
7
+ const topLevelFamiliesByRoot = new Map();
8
+ for (const result of results) {
9
+ for (const component of result.components) {
10
+ const scopeInfo = resolveComponentScopeInfo(component.source);
11
+ if (!scopeInfo)
12
+ continue;
13
+ const familyName = resolveTopLevelFamilyName(scopeInfo.relativeSegments);
14
+ if (!familyName)
15
+ continue;
16
+ const existingFamilies = topLevelFamiliesByRoot.get(scopeInfo.rootKey) ?? new Set();
17
+ existingFamilies.add(familyName);
18
+ topLevelFamiliesByRoot.set(scopeInfo.rootKey, existingFamilies);
19
+ }
20
+ }
21
+ for (const result of results) {
22
+ allWarnings.push(...result.warnings);
23
+ exclusions.push(...(result.exclusions ?? []));
24
+ for (const component of result.components) {
25
+ const scopeKey = resolveDeduplicationScopeKey(component.source, component.name, topLevelFamiliesByRoot);
26
+ const identityKey = `${component.name}::${scopeKey}`;
27
+ const existing = componentsByKey.get(identityKey);
28
+ if (existing) {
29
+ const selected = selectPreferredComponentSource(existing, component);
30
+ allWarnings.push(`Duplicate component "${component.name}" found in ${component.source} (already seen in ${existing.source}); ${selected.reason}`);
31
+ exclusions.push({
32
+ itemType: 'component',
33
+ name: selected.loser.name,
34
+ source: selected.loser.source,
35
+ reason: `duplicate identity; ${selected.reason}`,
36
+ stage: 'duplicate-filter',
37
+ });
38
+ componentsByKey.set(identityKey, selected.winner);
39
+ continue;
40
+ }
41
+ const existingKeys = keysByName.get(component.name) ?? [];
42
+ const crossPackageKey = existingKeys.find((key) => key !== identityKey);
43
+ if (crossPackageKey) {
44
+ const crossPackageComponent = componentsByKey.get(crossPackageKey);
45
+ if (crossPackageComponent) {
46
+ allWarnings.push(`Component name collision "${component.name}" found in ${component.source} (also seen in ${crossPackageComponent.source})`);
47
+ }
48
+ }
49
+ componentsByKey.set(identityKey, component);
50
+ keysByName.set(component.name, [...existingKeys, identityKey]);
51
+ }
52
+ }
53
+ return {
54
+ components: [...componentsByKey.values()].sort((a, b) => a.name.localeCompare(b.name)),
55
+ warnings: allWarnings,
56
+ exclusions,
57
+ };
58
+ }
@@ -0,0 +1,10 @@
1
+ export declare function scoreComponentSourcePath(filePath: string): number;
2
+ export declare function resolvePackageRootInfo(segments: string[]): {
3
+ rootSegments: string[];
4
+ relativeSegments: string[];
5
+ } | null;
6
+ export declare function resolveComponentScopeInfo(filePath: string): {
7
+ rootKey: string;
8
+ relativeSegments: string[];
9
+ } | null;
10
+ export declare function resolveTopLevelFamilyName(relativeSegments: string[]): string | null;
@@ -0,0 +1,85 @@
1
+ export function scoreComponentSourcePath(filePath) {
2
+ const normalized = filePath.replace(/\\/g, '/');
3
+ const segments = normalized.split('/').filter(Boolean);
4
+ const filename = segments.at(-1) ?? '';
5
+ const basename = filename.replace(/\.[^.]+$/, '');
6
+ let score = 0;
7
+ if (/^index\.[jt]sx?$/.test(filename))
8
+ score += 100;
9
+ if (basename && segments.at(-2) === basename)
10
+ score -= 10;
11
+ score -= segments.filter((segment) => segment === 'components').length * 8;
12
+ score -= segments.length;
13
+ return score;
14
+ }
15
+ export function resolvePackageRootInfo(segments) {
16
+ for (let index = 0; index < segments.length; index += 1) {
17
+ const segment = segments[index];
18
+ if ((segment === '.packages' || segment === 'packages') && segments[index + 1]) {
19
+ return {
20
+ rootSegments: segments.slice(0, index + 2),
21
+ relativeSegments: segments.slice(index + 2),
22
+ };
23
+ }
24
+ }
25
+ const srcIndex = segments.lastIndexOf('src');
26
+ if (srcIndex >= 0) {
27
+ return {
28
+ rootSegments: segments.slice(0, srcIndex),
29
+ relativeSegments: segments.slice(srcIndex),
30
+ };
31
+ }
32
+ return null;
33
+ }
34
+ export function resolveComponentScopeInfo(filePath) {
35
+ const normalized = filePath.replace(/\\/g, '/');
36
+ const segments = normalized.split('/').filter(Boolean);
37
+ const rootInfo = resolvePackageRootInfo(segments);
38
+ if (!rootInfo)
39
+ return null;
40
+ return {
41
+ rootKey: rootInfo.rootSegments.join('/'),
42
+ relativeSegments: rootInfo.relativeSegments,
43
+ };
44
+ }
45
+ export function resolveTopLevelFamilyName(relativeSegments) {
46
+ const [first, second, third] = relativeSegments;
47
+ if (relativeSegments.length === 1 && first)
48
+ return first.replace(/\.[^.]+$/, '');
49
+ if (first === 'src' && second === 'components' && third) {
50
+ const fileSegment = relativeSegments[3];
51
+ if (fileSegment &&
52
+ (fileSegment === `${third}.tsx` ||
53
+ fileSegment === `${third}.ts` ||
54
+ fileSegment === 'index.tsx' ||
55
+ fileSegment === 'index.ts')) {
56
+ return third;
57
+ }
58
+ return null;
59
+ }
60
+ if (first === 'src' && second) {
61
+ const fileSegment = relativeSegments[2];
62
+ if (fileSegment &&
63
+ (fileSegment === `${second}.vue` ||
64
+ fileSegment === `${second}.tsx` ||
65
+ fileSegment === `${second}.ts` ||
66
+ fileSegment === 'index.tsx' ||
67
+ fileSegment === 'index.ts' ||
68
+ fileSegment === 'index.vue')) {
69
+ return second;
70
+ }
71
+ return null;
72
+ }
73
+ if (first) {
74
+ const fileSegment = relativeSegments[1];
75
+ if (fileSegment === `${first}.tsx` ||
76
+ fileSegment === `${first}.ts` ||
77
+ fileSegment === `${first}.vue` ||
78
+ fileSegment === 'index.tsx' ||
79
+ fileSegment === 'index.ts' ||
80
+ fileSegment === 'index.vue') {
81
+ return first;
82
+ }
83
+ }
84
+ return null;
85
+ }
@@ -0,0 +1,10 @@
1
+ import type { RawComponentDefinition } from '../../../types/component.js';
2
+ import { scoreComponentSourcePath, resolvePackageRootInfo, resolveComponentScopeInfo, resolveTopLevelFamilyName } from './component-path-analysis.js';
3
+ export { scoreComponentSourcePath, resolvePackageRootInfo, resolveComponentScopeInfo, resolveTopLevelFamilyName };
4
+ export declare function isWithinComponentFamily(relativeSegments: string[], componentName: string): boolean;
5
+ export declare function resolveDeduplicationScopeKey(filePath: string, componentName: string, topLevelFamiliesByRoot: Map<string, Set<string>>): string;
6
+ export declare function selectPreferredComponentSource(existing: RawComponentDefinition, candidate: RawComponentDefinition): {
7
+ winner: RawComponentDefinition;
8
+ loser: RawComponentDefinition;
9
+ reason: string;
10
+ };