@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.
- package/dist/package.json +1 -1
- package/dist/src/extract/controller/extract-controller.d.ts +10 -0
- package/dist/src/extract/controller/extract-controller.js +33 -0
- package/dist/src/extract/controller/helpers/validate-endpoint-request.d.ts +2 -0
- package/dist/src/extract/controller/helpers/validate-endpoint-request.js +24 -0
- package/dist/src/extract/{astro.d.ts → framework-adapters/astro/extractor.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/astro/extractor.js +45 -0
- package/dist/src/extract/framework-adapters/astro/frontmatter.d.ts +11 -0
- package/dist/src/extract/framework-adapters/astro/frontmatter.js +96 -0
- package/dist/src/extract/framework-adapters/astro/helpers/collect-astro-props-bindings.d.ts +4 -0
- package/dist/src/extract/framework-adapters/astro/helpers/collect-astro-props-bindings.js +47 -0
- package/dist/src/extract/framework-adapters/astro/slots.d.ts +7 -0
- package/dist/src/extract/framework-adapters/astro/slots.js +44 -0
- package/dist/src/extract/{react.d.ts → framework-adapters/react/extractor.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/react/extractor.js +31 -0
- package/dist/src/extract/framework-adapters/react/helpers/collect-dom-wrapper-contexts.d.ts +4 -0
- package/dist/src/extract/framework-adapters/react/helpers/collect-dom-wrapper-contexts.js +73 -0
- package/dist/src/extract/framework-adapters/react/helpers/collect-prop-dataflow.d.ts +14 -0
- package/dist/src/extract/framework-adapters/react/helpers/collect-prop-dataflow.js +220 -0
- package/dist/src/extract/framework-adapters/react/helpers/collect-react-impl-hints.d.ts +5 -0
- package/dist/src/extract/framework-adapters/react/helpers/collect-react-impl-hints.js +32 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-dom-is-pure-wrapper.d.ts +2 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-dom-is-pure-wrapper.js +59 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-dom-type-patterns.d.ts +8 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-dom-type-patterns.js +29 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-omit-wrapped-custom-props.d.ts +2 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-omit-wrapped-custom-props.js +64 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-pick-type-patterns.d.ts +4 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-pick-type-patterns.js +64 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-react-polymorphic.d.ts +5 -0
- package/dist/src/extract/framework-adapters/react/helpers/detect-react-polymorphic.js +170 -0
- package/dist/src/extract/framework-adapters/react/helpers/dom-attribute-surfaces.d.ts +15 -0
- package/dist/src/extract/framework-adapters/react/helpers/dom-attribute-surfaces.js +231 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-binding-fallback-props.d.ts +4 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-binding-fallback-props.js +50 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-from-react-source-file.d.ts +5 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-from-react-source-file.js +23 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-allowed-components.d.ts +2 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-allowed-components.js +25 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-binding-defaults.d.ts +6 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-binding-defaults.js +48 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-component-from-export.d.ts +15 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-component-from-export.js +106 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-prop-types.d.ts +3 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-prop-types.js +64 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-props-from-type.d.ts +15 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-props-from-type.js +318 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-slots.d.ts +6 -0
- package/dist/src/extract/framework-adapters/react/helpers/extract-react-slots.js +44 -0
- package/dist/src/extract/framework-adapters/react/helpers/filter-impl-alias-props.d.ts +4 -0
- package/dist/src/extract/framework-adapters/react/helpers/filter-impl-alias-props.js +52 -0
- package/dist/src/extract/framework-adapters/react/helpers/infer-primitive-dom-props.d.ts +6 -0
- package/dist/src/extract/framework-adapters/react/helpers/infer-primitive-dom-props.js +69 -0
- package/dist/src/extract/framework-adapters/react/helpers/resolve-component-function.d.ts +4 -0
- package/dist/src/extract/framework-adapters/react/helpers/resolve-component-function.js +131 -0
- package/dist/src/extract/framework-adapters/react/helpers/resolve-react-prop-forwarding.d.ts +8 -0
- package/dist/src/extract/framework-adapters/react/helpers/resolve-react-prop-forwarding.js +22 -0
- package/dist/src/extract/framework-adapters/react/helpers/resolve-react-props-type.d.ts +14 -0
- package/dist/src/extract/framework-adapters/react/helpers/resolve-react-props-type.js +86 -0
- package/dist/src/extract/framework-adapters/react/helpers/synthesize-react-structural-slots.d.ts +8 -0
- package/dist/src/extract/framework-adapters/react/helpers/synthesize-react-structural-slots.js +44 -0
- package/dist/src/extract/framework-adapters/shared/helpers/build-component-lookup-maps.d.ts +5 -0
- package/dist/src/extract/framework-adapters/shared/helpers/build-component-lookup-maps.js +10 -0
- package/dist/src/extract/framework-adapters/shared/helpers/collect-jsdoc-slot-comments.d.ts +2 -0
- package/dist/src/extract/framework-adapters/shared/helpers/collect-jsdoc-slot-comments.js +13 -0
- package/dist/src/extract/{file-extraction-workers.d.ts → framework-adapters/shared/helpers/file-processing/file-workers.d.ts} +1 -13
- package/dist/src/extract/{file-extraction-workers.js → framework-adapters/shared/helpers/file-processing/file-workers.js} +0 -19
- package/dist/src/extract/framework-adapters/shared/helpers/file-processing/project-source-files.d.ts +5 -0
- package/dist/src/extract/framework-adapters/shared/helpers/file-processing/project-source-files.js +13 -0
- package/dist/src/extract/framework-adapters/shared/helpers/file-processing/result-normalizer.d.ts +6 -0
- package/dist/src/extract/framework-adapters/shared/helpers/file-processing/result-normalizer.js +6 -0
- package/dist/src/extract/framework-adapters/shared/helpers/find-tsx-workspace-package.d.ts +2 -0
- package/dist/src/extract/framework-adapters/shared/helpers/find-tsx-workspace-package.js +62 -0
- package/dist/src/extract/{source-line-metadata.d.ts → framework-adapters/shared/helpers/get-node-source-lines.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-tsconfig-path.d.ts +7 -0
- package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-tsconfig-path.js +93 -0
- package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-workspace-imports.d.ts +6 -0
- package/dist/src/extract/framework-adapters/shared/helpers/resolve-tsx-workspace-imports.js +58 -0
- package/dist/src/extract/framework-adapters/shared/helpers/tsx-node-utils.d.ts +13 -0
- package/dist/src/extract/framework-adapters/shared/helpers/tsx-node-utils.js +76 -0
- package/dist/src/extract/framework-adapters/shared/helpers/tsx-renderable-exports.d.ts +12 -0
- package/dist/src/extract/framework-adapters/shared/helpers/tsx-renderable-exports.js +35 -0
- package/dist/src/extract/framework-adapters/shared/helpers/tsx-shared.d.ts +14 -0
- package/dist/src/extract/framework-adapters/shared/helpers/tsx-shared.js +54 -0
- package/dist/src/extract/{stencil.d.ts → framework-adapters/stencil/extractor.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/stencil/extractor.js +82 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/detect-stencil-class.d.ts +7 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/detect-stencil-class.js +32 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-props.d.ts +5 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-props.js +62 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-slots.d.ts +6 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/extract-stencil-slots.js +87 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/stencil-prop-helpers.d.ts +5 -0
- package/dist/src/extract/framework-adapters/stencil/helpers/stencil-prop-helpers.js +39 -0
- package/dist/src/extract/{svelte.d.ts → framework-adapters/svelte/extractor.d.ts} +2 -1
- package/dist/src/extract/framework-adapters/svelte/extractor.js +27 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/classify-svelte-props-annotation.d.ts +6 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/classify-svelte-props-annotation.js +51 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/collect-svelte-type-references.d.ts +3 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/collect-svelte-type-references.js +52 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-from-svelte-file.d.ts +7 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-from-svelte-file.js +90 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-ast-type-members.d.ts +15 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-ast-type-members.js +46 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-declaration-data.d.ts +7 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-declaration-data.js +64 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-external-type-members.d.ts +4 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-external-type-members.js +58 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-from-destructure.d.ts +4 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-from-destructure.js +85 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-props.d.ts +22 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-props.js +55 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-template-slots.d.ts +7 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-template-slots.js +63 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-type-member-props.d.ts +3 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/extract-svelte-type-member-props.js +31 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/find-svelte-script-declarations.d.ts +8 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/find-svelte-script-declarations.js +91 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/get-svelte-component-name.d.ts +1 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/get-svelte-component-name.js +26 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type-strings.d.ts +3 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type-strings.js +91 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type.d.ts +11 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/render-svelte-type.js +68 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-dts-location.d.ts +1 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-dts-location.js +90 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-allowed-components.d.ts +2 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-allowed-components.js +20 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-external-type-readers.d.ts +3 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-external-type-readers.js +68 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-checker.d.ts +4 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-checker.js +68 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-members.d.ts +6 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-type-members.js +30 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-unresolved-retry.d.ts +13 -0
- package/dist/src/extract/framework-adapters/svelte/helpers/resolve-svelte-unresolved-retry.js +192 -0
- package/dist/src/extract/framework-adapters/svelte/types/svelte-ast-node.d.ts +12 -0
- package/dist/src/extract/framework-adapters/svelte/types/svelte-ast-node.js +1 -0
- package/dist/src/extract/{vue.d.ts → framework-adapters/vue/extractor.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/vue/extractor.js +61 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-object-props.d.ts +3 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-object-props.js +67 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-options-props.d.ts +4 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-options-props.js +72 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-object-props.d.ts +8 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-object-props.js +64 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-props.d.ts +2 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-setup-props.js +66 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-slots.d.ts +24 -0
- package/dist/src/extract/framework-adapters/vue/helpers/extract-vue-slots.js +56 -0
- package/dist/src/extract/framework-adapters/vue/helpers/resolve-vue-component-name.d.ts +2 -0
- package/dist/src/extract/framework-adapters/vue/helpers/resolve-vue-component-name.js +9 -0
- package/dist/src/extract/framework-adapters/vue/helpers/resolve-workspace-module.d.ts +1 -0
- package/dist/src/extract/framework-adapters/vue/helpers/resolve-workspace-module.js +76 -0
- package/dist/src/extract/framework-adapters/vue/helpers/workspace-package-dirs.d.ts +2 -0
- package/dist/src/extract/framework-adapters/vue/helpers/workspace-package-dirs.js +77 -0
- package/dist/src/extract/{vue-tsx.d.ts → framework-adapters/vue-tsx/extractor.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/vue-tsx/extractor.js +82 -0
- package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-props.d.ts +5 -0
- package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-props.js +189 -0
- package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-slots.d.ts +4 -0
- package/dist/src/extract/framework-adapters/vue-tsx/helpers/extract-vue-tsx-slots.js +91 -0
- package/dist/src/extract/framework-adapters/vue-tsx/helpers/resolve-ast-object.d.ts +11 -0
- package/dist/src/extract/framework-adapters/vue-tsx/helpers/resolve-ast-object.js +95 -0
- package/dist/src/extract/{web-components.d.ts → framework-adapters/web-components/extractor.d.ts} +1 -1
- package/dist/src/extract/framework-adapters/web-components/extractor.js +55 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/collect-wc-html-templates.d.ts +4 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/collect-wc-html-templates.js +67 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/detect-wc-non-public-members.d.ts +9 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/detect-wc-non-public-members.js +11 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-accessor-props.d.ts +3 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-accessor-props.js +65 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-class-properties.d.ts +3 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-class-properties.js +60 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-inheritance.d.ts +4 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-inheritance.js +16 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-jsdoc-attr-props.d.ts +3 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-jsdoc-attr-props.js +24 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-observed-attrs.d.ts +3 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-observed-attrs.js +27 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-slots.d.ts +6 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-slots.js +56 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-template-content.d.ts +4 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/extract-wc-template-content.js +49 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/merge-wc-prop-lists.d.ts +9 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/merge-wc-prop-lists.js +19 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-base-class.d.ts +2 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-base-class.js +59 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-decorator-tag.d.ts +2 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-decorator-tag.js +54 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import-source.d.ts +7 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import-source.js +47 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import.d.ts +4 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-import.js +93 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-sibling-definition.d.ts +4 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-sibling-definition.js +79 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-tag-name.d.ts +7 -0
- package/dist/src/extract/framework-adapters/web-components/helpers/resolve-wc-tag-name.js +62 -0
- package/dist/src/extract/helpers/evidence/ast/collect-structural-jsx-evidence.d.ts +5 -0
- package/dist/src/extract/helpers/evidence/ast/collect-structural-jsx-evidence.js +63 -0
- package/dist/src/extract/helpers/evidence/ast/detect-react-node-types.d.ts +2 -0
- package/dist/src/extract/helpers/evidence/ast/detect-react-node-types.js +24 -0
- package/dist/src/extract/helpers/evidence/ast/get-jsx-ast-data.d.ts +14 -0
- package/dist/src/extract/helpers/evidence/ast/get-jsx-ast-data.js +85 -0
- package/dist/src/extract/helpers/evidence/collect-jsx-component-references.d.ts +5 -0
- package/dist/src/extract/helpers/evidence/collect-jsx-component-references.js +52 -0
- package/dist/src/extract/helpers/evidence/detect-slot-from-prop.d.ts +16 -0
- package/dist/src/extract/helpers/evidence/detect-slot-from-prop.js +39 -0
- package/dist/src/extract/orchestrator/execute-extraction-orchestrator.d.ts +13 -0
- package/dist/src/extract/orchestrator/execute-extraction-orchestrator.js +17 -0
- package/dist/src/{pre-classify.d.ts → extract/services/classification/classify-component-props.d.ts} +3 -5
- package/dist/src/{pre-classify.js → extract/services/classification/classify-component-props.js} +8 -100
- package/dist/src/extract/services/classification/helpers/check-prop-types.d.ts +7 -0
- package/dist/src/extract/services/classification/helpers/check-prop-types.js +22 -0
- package/dist/src/extract/services/classification/helpers/detect-dom-props.d.ts +2 -0
- package/dist/src/extract/services/classification/helpers/detect-dom-props.js +63 -0
- package/dist/src/extract/services/deduplication/deduplicate-components.d.ts +2 -0
- package/dist/src/extract/services/deduplication/deduplicate-components.js +58 -0
- package/dist/src/extract/services/deduplication/helpers/component-path-analysis.d.ts +10 -0
- package/dist/src/extract/services/deduplication/helpers/component-path-analysis.js +85 -0
- package/dist/src/extract/services/deduplication/helpers/component-path-scoring.d.ts +10 -0
- package/dist/src/extract/services/deduplication/helpers/component-path-scoring.js +73 -0
- package/dist/src/extract/services/extraction/extract-components.d.ts +3 -0
- package/dist/src/extract/services/extraction/extract-components.js +19 -0
- package/dist/src/extract/services/extraction/helpers/collect-sveltekit-route-exclusions.d.ts +2 -0
- package/dist/src/extract/services/extraction/helpers/collect-sveltekit-route-exclusions.js +18 -0
- package/dist/src/extract/services/extraction/helpers/filter-hook-components.d.ts +6 -0
- package/dist/src/extract/services/extraction/helpers/filter-hook-components.js +18 -0
- package/dist/src/extract/services/extraction/helpers/register-extractors.d.ts +8 -0
- package/dist/src/extract/services/extraction/helpers/register-extractors.js +71 -0
- package/dist/src/extract/services/extraction/helpers/run-extractor-batches.d.ts +4 -0
- package/dist/src/extract/services/extraction/helpers/run-extractor-batches.js +24 -0
- package/dist/src/extract/services/quality/evaluate-extraction-quality.d.ts +4 -0
- package/dist/src/extract/services/quality/evaluate-extraction-quality.js +61 -0
- package/dist/src/extract/services/quality/helpers/authorability/evaluate-authorability.d.ts +28 -0
- package/dist/src/extract/services/quality/helpers/authorability/evaluate-authorability.js +67 -0
- package/dist/src/extract/services/quality/helpers/inspection/detect-data-wrapper-patterns.d.ts +16 -0
- package/dist/src/extract/services/quality/helpers/inspection/detect-data-wrapper-patterns.js +63 -0
- package/dist/src/extract/{source-inspection.d.ts → services/quality/helpers/inspection/inspect-component-source.d.ts} +3 -6
- package/dist/src/extract/{source-inspection.js → services/quality/helpers/inspection/inspect-component-source.js} +5 -65
- package/dist/src/extract/{validate.d.ts → services/quality/helpers/inspection/validate-extracted-components.d.ts} +1 -1
- package/dist/src/extract/services/quality/helpers/scoring/collect-scoring-inputs.d.ts +14 -0
- package/dist/src/extract/{scoring.js → services/quality/helpers/scoring/collect-scoring-inputs.js} +10 -24
- package/dist/src/extract/services/quality/helpers/scoring/compute-extraction-score.d.ts +6 -0
- package/dist/src/extract/services/quality/helpers/scoring/compute-extraction-score.js +12 -0
- package/dist/src/extract/types/classification.d.ts +4 -0
- package/dist/src/extract/types/classification.js +1 -0
- package/dist/src/extract/types/component-extractor.d.ts +7 -0
- package/dist/src/extract/types/component-extractor.js +1 -0
- package/dist/src/{types.d.ts → extract/types/component.d.ts} +0 -22
- package/dist/src/extract/types/component.js +1 -0
- package/dist/src/extract/types/contract.d.ts +16 -0
- package/dist/src/extract/types/contract.js +1 -0
- package/dist/src/extract/types/display.d.ts +3 -0
- package/dist/src/{types.js → extract/types/display.js} +1 -1
- package/dist/src/extract/types/options.d.ts +15 -0
- package/dist/src/extract/types/options.js +1 -0
- package/dist/src/extract/types/scoring.d.ts +9 -0
- package/dist/src/extract/types/scoring.js +1 -0
- package/dist/src/extract/types/source-inspection.d.ts +5 -0
- package/dist/src/extract/types/source-inspection.js +1 -0
- package/dist/src/index.d.ts +27 -21
- package/dist/src/index.js +21 -17
- package/package.json +1 -1
- package/dist/src/extract/astro.js +0 -226
- package/dist/src/extract/non-authorable-filter.d.ts +0 -17
- package/dist/src/extract/non-authorable-filter.js +0 -60
- package/dist/src/extract/pipeline.d.ts +0 -7
- package/dist/src/extract/pipeline.js +0 -343
- package/dist/src/extract/react.js +0 -2069
- package/dist/src/extract/scoring.d.ts +0 -12
- package/dist/src/extract/slot-detection.d.ts +0 -35
- package/dist/src/extract/slot-detection.js +0 -98
- package/dist/src/extract/stencil.js +0 -312
- package/dist/src/extract/structural-slot-evidence.d.ts +0 -63
- package/dist/src/extract/structural-slot-evidence.js +0 -278
- package/dist/src/extract/svelte.js +0 -1309
- package/dist/src/extract/tsx-shared.d.ts +0 -37
- package/dist/src/extract/tsx-shared.js +0 -368
- package/dist/src/extract/vue-tsx.js +0 -449
- package/dist/src/extract/vue.js +0 -605
- package/dist/src/extract/web-components.js +0 -863
- /package/dist/src/extract/{source-line-metadata.js → framework-adapters/shared/helpers/get-node-source-lines.js} +0 -0
- /package/dist/src/extract/{resolve-local-module.d.ts → framework-adapters/shared/helpers/resolve-import-file-path.d.ts} +0 -0
- /package/dist/src/extract/{resolve-local-module.js → framework-adapters/shared/helpers/resolve-import-file-path.js} +0 -0
- /package/dist/src/extract/{resolve-type-property.d.ts → framework-adapters/shared/helpers/resolve-type-symbol.d.ts} +0 -0
- /package/dist/src/extract/{resolve-type-property.js → framework-adapters/shared/helpers/resolve-type-symbol.js} +0 -0
- /package/dist/src/extract/{slot-allowed-components.d.ts → helpers/evidence/collect-allowed-component-names.d.ts} +0 -0
- /package/dist/src/extract/{slot-allowed-components.js → helpers/evidence/collect-allowed-component-names.js} +0 -0
- /package/dist/src/extract/{parse-imported-names.d.ts → helpers/evidence/parse-source-imports.d.ts} +0 -0
- /package/dist/src/extract/{parse-imported-names.js → helpers/evidence/parse-source-imports.js} +0 -0
- /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
|
+
}
|
package/dist/src/{pre-classify.d.ts → extract/services/classification/classify-component-props.d.ts}
RENAMED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import type { RawPropDefinition, RawComponentDefinition } from '
|
|
2
|
-
|
|
3
|
-
|
|
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.
|
package/dist/src/{pre-classify.js → extract/services/classification/classify-component-props.js}
RENAMED
|
@@ -1,96 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
-
|
|
222
|
-
|
|
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,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,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
|
+
};
|