@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,66 @@
|
|
|
1
|
+
import { Project, Node } from 'ts-morph';
|
|
2
|
+
import { resolveTypeProperty } from '../../shared/helpers/resolve-type-symbol.js';
|
|
3
|
+
import { collectSetupImportedObjectRefs, mergeSetupObjectProps } from './extract-vue-setup-object-props.js';
|
|
4
|
+
function extractGenericSetupProps(typeText) {
|
|
5
|
+
const project = new Project({
|
|
6
|
+
compilerOptions: { strict: true, target: 99, module: 99 },
|
|
7
|
+
useInMemoryFileSystem: true,
|
|
8
|
+
skipAddingFilesFromTsConfig: true,
|
|
9
|
+
});
|
|
10
|
+
const sf = project.createSourceFile('__props__.ts', `type __Props__ = ${typeText};`);
|
|
11
|
+
const typeAlias = sf.getTypeAlias('__Props__');
|
|
12
|
+
if (!typeAlias)
|
|
13
|
+
return [];
|
|
14
|
+
const props = [];
|
|
15
|
+
for (const property of typeAlias.getType().getProperties()) {
|
|
16
|
+
const resolved = resolveTypeProperty(property);
|
|
17
|
+
if (!resolved)
|
|
18
|
+
continue;
|
|
19
|
+
let { typeText: resolvedTypeText } = resolved;
|
|
20
|
+
if (!resolved.required) {
|
|
21
|
+
resolvedTypeText = resolvedTypeText.replace(/\s*\|\s*undefined$/, '').replace(/^undefined\s*\|\s*/, '');
|
|
22
|
+
}
|
|
23
|
+
props.push({
|
|
24
|
+
name: resolved.name,
|
|
25
|
+
type: resolvedTypeText,
|
|
26
|
+
required: resolved.required,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return props.sort((a, b) => a.name.localeCompare(b.name));
|
|
30
|
+
}
|
|
31
|
+
export async function extractVueSetupProps(filePath, scriptSetupContent) {
|
|
32
|
+
const project = new Project({
|
|
33
|
+
compilerOptions: { strict: false, target: 99, module: 99, allowJs: true },
|
|
34
|
+
useInMemoryFileSystem: true,
|
|
35
|
+
skipAddingFilesFromTsConfig: true,
|
|
36
|
+
});
|
|
37
|
+
const sf = project.createSourceFile('__setup__.ts', scriptSetupContent);
|
|
38
|
+
let genericTypeText = null;
|
|
39
|
+
sf.forEachDescendant((node) => {
|
|
40
|
+
if (genericTypeText !== null)
|
|
41
|
+
return;
|
|
42
|
+
if (Node.isCallExpression(node) &&
|
|
43
|
+
node.getExpression().getText() === 'defineProps' &&
|
|
44
|
+
node.getTypeArguments().length > 0) {
|
|
45
|
+
genericTypeText = node.getTypeArguments()[0].getText();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
if (genericTypeText !== null)
|
|
49
|
+
return extractGenericSetupProps(genericTypeText);
|
|
50
|
+
const importedObjectRefs = collectSetupImportedObjectRefs(sf, filePath);
|
|
51
|
+
let objectProps = null;
|
|
52
|
+
const visitedImports = new Set();
|
|
53
|
+
for (const node of sf.getDescendants()) {
|
|
54
|
+
if (objectProps !== null)
|
|
55
|
+
break;
|
|
56
|
+
if (Node.isCallExpression(node) &&
|
|
57
|
+
node.getExpression().getText() === 'defineProps' &&
|
|
58
|
+
node.getTypeArguments().length === 0) {
|
|
59
|
+
const args = node.getArguments();
|
|
60
|
+
if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {
|
|
61
|
+
objectProps = await mergeSetupObjectProps(args[0], importedObjectRefs, visitedImports);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return objectProps;
|
|
66
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { RawSlotDefinition } from '../../../types/component.js';
|
|
2
|
+
interface TemplateAttrNode {
|
|
3
|
+
type: number;
|
|
4
|
+
name?: string;
|
|
5
|
+
value?: {
|
|
6
|
+
content?: string;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
interface TemplateAstNode {
|
|
10
|
+
type: number;
|
|
11
|
+
tag?: string;
|
|
12
|
+
props?: TemplateAttrNode[];
|
|
13
|
+
children?: (TemplateAstNode | unknown)[];
|
|
14
|
+
}
|
|
15
|
+
/** Walks the Vue template AST and collects all `<slot>` elements. */
|
|
16
|
+
export declare function extractSlotsFromVueTemplate(ast: TemplateAstNode): RawSlotDefinition[];
|
|
17
|
+
/**
|
|
18
|
+
* Detects slots referenced via `$slots.name` or `$slots['name']` in template or
|
|
19
|
+
* script content that aren't declared as `<slot>` tags.
|
|
20
|
+
*/
|
|
21
|
+
export declare function collectRuntimeAccessSlots(source: string): RawSlotDefinition[];
|
|
22
|
+
/** Merges two slot arrays, keeping the first occurrence of each slot name. */
|
|
23
|
+
export declare function mergeVueSlots(base: RawSlotDefinition[], extra: RawSlotDefinition[]): RawSlotDefinition[];
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// @vue/compiler-core NodeTypes enum values (stable since Vue 3.0)
|
|
2
|
+
const ELEMENT_TYPE = 1;
|
|
3
|
+
const ATTRIBUTE_TYPE = 6;
|
|
4
|
+
/** Walks the Vue template AST and collects all `<slot>` elements. */
|
|
5
|
+
export function extractSlotsFromVueTemplate(ast) {
|
|
6
|
+
const slots = [];
|
|
7
|
+
function walk(node) {
|
|
8
|
+
if (node.type === ELEMENT_TYPE && node.tag === 'slot') {
|
|
9
|
+
const nameProp = node.props?.find((p) => p.type === ATTRIBUTE_TYPE && p.name === 'name');
|
|
10
|
+
const slotName = nameProp?.value?.content ?? 'default';
|
|
11
|
+
if (!slots.some((s) => s.name === slotName)) {
|
|
12
|
+
slots.push({ name: slotName, isDefault: slotName === 'default' });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (node.children) {
|
|
16
|
+
for (const child of node.children) {
|
|
17
|
+
if (typeof child === 'object' && child !== null && 'type' in child) {
|
|
18
|
+
walk(child);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
walk(ast);
|
|
24
|
+
return slots;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Detects slots referenced via `$slots.name` or `$slots['name']` in template or
|
|
28
|
+
* script content that aren't declared as `<slot>` tags.
|
|
29
|
+
*/
|
|
30
|
+
export function collectRuntimeAccessSlots(source) {
|
|
31
|
+
const slots = [];
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const dotPattern = /\$slots\.([a-zA-Z_]\w*)/g;
|
|
34
|
+
const bracketPattern = /\$slots\[['"]([a-zA-Z_][\w-]*)['"]\]/g;
|
|
35
|
+
for (const pattern of [dotPattern, bracketPattern]) {
|
|
36
|
+
let match;
|
|
37
|
+
while ((match = pattern.exec(source)) !== null) {
|
|
38
|
+
const name = match[1];
|
|
39
|
+
if (!seen.has(name)) {
|
|
40
|
+
seen.add(name);
|
|
41
|
+
slots.push({ name, isDefault: name === 'default' });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return slots;
|
|
46
|
+
}
|
|
47
|
+
/** Merges two slot arrays, keeping the first occurrence of each slot name. */
|
|
48
|
+
export function mergeVueSlots(base, extra) {
|
|
49
|
+
const merged = [...base];
|
|
50
|
+
for (const slot of extra) {
|
|
51
|
+
if (!merged.some((s) => s.name === slot.name)) {
|
|
52
|
+
merged.push(slot);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return merged;
|
|
56
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { basename, dirname } from 'node:path';
|
|
2
|
+
/** Derives the component name from its .vue file path (uses parent directory name for index.vue files). */
|
|
3
|
+
export function resolveVueComponentName(filePath) {
|
|
4
|
+
const fileName = basename(filePath, '.vue');
|
|
5
|
+
if (fileName !== 'index') {
|
|
6
|
+
return fileName;
|
|
7
|
+
}
|
|
8
|
+
return basename(dirname(filePath)) || fileName;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveWorkspaceVueImport(specifier: string, importingFilePath: string): string | null;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { dirname, join, resolve } from 'node:path';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { findWorkspaceRoot, collectWorkspacePackageDirs } from './workspace-package-dirs.js';
|
|
4
|
+
export function resolveWorkspaceVueImport(specifier, importingFilePath) {
|
|
5
|
+
const workspaceRoot = findWorkspaceRoot(dirname(importingFilePath));
|
|
6
|
+
if (!workspaceRoot)
|
|
7
|
+
return null;
|
|
8
|
+
const packageDirs = collectWorkspacePackageDirs(workspaceRoot);
|
|
9
|
+
let packageName;
|
|
10
|
+
let subpath;
|
|
11
|
+
if (specifier.startsWith('@')) {
|
|
12
|
+
const parts = specifier.split('/');
|
|
13
|
+
if (parts.length < 2)
|
|
14
|
+
return null;
|
|
15
|
+
packageName = `${parts[0]}/${parts[1]}`;
|
|
16
|
+
subpath = parts.length > 2 ? './' + parts.slice(2).join('/') : '.';
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const slashIndex = specifier.indexOf('/');
|
|
20
|
+
if (slashIndex === -1) {
|
|
21
|
+
packageName = specifier;
|
|
22
|
+
subpath = '.';
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
packageName = specifier.substring(0, slashIndex);
|
|
26
|
+
subpath = './' + specifier.substring(slashIndex + 1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const packageDir = packageDirs.get(packageName);
|
|
30
|
+
if (!packageDir)
|
|
31
|
+
return null;
|
|
32
|
+
const pkgJsonPath = join(packageDir, 'package.json');
|
|
33
|
+
try {
|
|
34
|
+
const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
35
|
+
if (pkg.exports && subpath !== '.') {
|
|
36
|
+
const exportValue = pkg.exports[subpath];
|
|
37
|
+
if (typeof exportValue === 'string' && exportValue.endsWith('.vue')) {
|
|
38
|
+
const resolved = resolve(packageDir, exportValue);
|
|
39
|
+
if (existsSync(resolved))
|
|
40
|
+
return resolved;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (subpath !== '.') {
|
|
44
|
+
const subDir = resolve(packageDir, subpath.replace(/^\.\//, ''));
|
|
45
|
+
for (const base of [join(packageDir, 'src', subpath.replace(/^\.\//, '')), subDir]) {
|
|
46
|
+
const subPkgPath = join(base, 'package.json');
|
|
47
|
+
if (existsSync(subPkgPath)) {
|
|
48
|
+
try {
|
|
49
|
+
const subPkg = JSON.parse(readFileSync(subPkgPath, 'utf8'));
|
|
50
|
+
const main = subPkg.main || subPkg.module;
|
|
51
|
+
if (typeof main === 'string' && main.endsWith('.vue')) {
|
|
52
|
+
const resolved = resolve(base, main);
|
|
53
|
+
if (existsSync(resolved))
|
|
54
|
+
return resolved;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* skip */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (subpath === '.') {
|
|
64
|
+
const main = pkg.main || pkg.module;
|
|
65
|
+
if (typeof main === 'string' && main.endsWith('.vue')) {
|
|
66
|
+
const resolved = resolve(packageDir, main);
|
|
67
|
+
if (existsSync(resolved))
|
|
68
|
+
return resolved;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
/* skip malformed */
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { dirname, join } from 'node:path';
|
|
2
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
+
const workspaceRootCache = new Map();
|
|
4
|
+
export function findWorkspaceRoot(startDir) {
|
|
5
|
+
if (workspaceRootCache.has(startDir))
|
|
6
|
+
return workspaceRootCache.get(startDir);
|
|
7
|
+
let dir = startDir;
|
|
8
|
+
while (true) {
|
|
9
|
+
const pkgJsonPath = join(dir, 'package.json');
|
|
10
|
+
if (existsSync(pkgJsonPath)) {
|
|
11
|
+
try {
|
|
12
|
+
const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
13
|
+
if (pkg.workspaces || existsSync(join(dir, 'pnpm-workspace.yaml'))) {
|
|
14
|
+
workspaceRootCache.set(startDir, dir);
|
|
15
|
+
return dir;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
/* skip malformed */
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const parent = dirname(dir);
|
|
23
|
+
if (parent === dir) {
|
|
24
|
+
workspaceRootCache.set(startDir, null);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
dir = parent;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const workspacePackageDirsCache = new Map();
|
|
31
|
+
export function collectWorkspacePackageDirs(workspaceRoot) {
|
|
32
|
+
if (workspacePackageDirsCache.has(workspaceRoot))
|
|
33
|
+
return workspacePackageDirsCache.get(workspaceRoot);
|
|
34
|
+
const packageMap = new Map();
|
|
35
|
+
const packagesDir = join(workspaceRoot, 'packages');
|
|
36
|
+
if (!existsSync(packagesDir)) {
|
|
37
|
+
workspacePackageDirsCache.set(workspaceRoot, packageMap);
|
|
38
|
+
return packageMap;
|
|
39
|
+
}
|
|
40
|
+
function scanDir(dir, depth) {
|
|
41
|
+
if (depth > 3)
|
|
42
|
+
return;
|
|
43
|
+
let entries;
|
|
44
|
+
try {
|
|
45
|
+
entries = readdirSync(dir);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const pkgJsonPath = join(dir, 'package.json');
|
|
51
|
+
if (existsSync(pkgJsonPath)) {
|
|
52
|
+
try {
|
|
53
|
+
const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
|
|
54
|
+
if (typeof pkg.name === 'string')
|
|
55
|
+
packageMap.set(pkg.name, dir);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* skip */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
if (entry === 'node_modules' || entry === '.git' || entry.startsWith('.'))
|
|
63
|
+
continue;
|
|
64
|
+
const entryPath = join(dir, entry);
|
|
65
|
+
try {
|
|
66
|
+
if (statSync(entryPath).isDirectory())
|
|
67
|
+
scanDir(entryPath, depth + 1);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* skip */
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
scanDir(packagesDir, 0);
|
|
75
|
+
workspacePackageDirsCache.set(workspaceRoot, packageMap);
|
|
76
|
+
return packageMap;
|
|
77
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ComponentExtractionResult } from '
|
|
1
|
+
import type { ComponentExtractionResult } from '../../types/component.js';
|
|
2
2
|
export declare function extractVueTsxComponents(filePaths: string[]): Promise<ComponentExtractionResult>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Node } from 'ts-morph';
|
|
2
|
+
import { extractTsxComponents, getRenderableExports } from '../shared/helpers/tsx-shared.js';
|
|
3
|
+
import { extractVueTsxComponentProps } from './helpers/extract-vue-tsx-props.js';
|
|
4
|
+
import { extractVueTsxComponentSlots } from './helpers/extract-vue-tsx-slots.js';
|
|
5
|
+
export async function extractVueTsxComponents(filePaths) {
|
|
6
|
+
const { components, warnings, exclusions } = extractTsxComponents(filePaths, /\.tsx$/, extractFromSourceFile);
|
|
7
|
+
return {
|
|
8
|
+
components: components.sort((a, b) => a.name.localeCompare(b.name)),
|
|
9
|
+
warnings,
|
|
10
|
+
exclusions,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function extractFromSourceFile(sourceFile, exclusions) {
|
|
14
|
+
const components = [];
|
|
15
|
+
for (const { name, declarations } of getRenderableExports(sourceFile, exclusions, {
|
|
16
|
+
hookReason: 'Vue composition hook names are not renderable components',
|
|
17
|
+
})) {
|
|
18
|
+
const component = extractVueTsxComponent(declarations, name, sourceFile);
|
|
19
|
+
if (component)
|
|
20
|
+
components.push(component);
|
|
21
|
+
}
|
|
22
|
+
return components;
|
|
23
|
+
}
|
|
24
|
+
function extractVueTsxComponent(declarations, exportName, sourceFile) {
|
|
25
|
+
for (const declaration of declarations) {
|
|
26
|
+
if (!Node.isVariableDeclaration(declaration))
|
|
27
|
+
continue;
|
|
28
|
+
if (declaration.getSourceFile().getFilePath() !== sourceFile.getFilePath())
|
|
29
|
+
continue;
|
|
30
|
+
const resolved = resolveDefineComponentCall(declaration.getInitializer());
|
|
31
|
+
if (!resolved)
|
|
32
|
+
continue;
|
|
33
|
+
const name = readComponentName(resolved.options) ?? exportName;
|
|
34
|
+
const props = extractVueTsxComponentProps(resolved.options);
|
|
35
|
+
const slots = extractVueTsxComponentSlots(resolved.options, resolved.slotsTypeNode);
|
|
36
|
+
return {
|
|
37
|
+
name,
|
|
38
|
+
source: sourceFile.getFilePath(),
|
|
39
|
+
framework: 'vue',
|
|
40
|
+
props,
|
|
41
|
+
slots,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
function resolveDefineComponentCall(node) {
|
|
47
|
+
if (!node || !Node.isCallExpression(node))
|
|
48
|
+
return undefined;
|
|
49
|
+
const directExpressionText = node.getExpression().getText();
|
|
50
|
+
if (/(^|\.)defineComponent$/.test(directExpressionText)) {
|
|
51
|
+
const optionsArg = node.getArguments()[0];
|
|
52
|
+
if (!optionsArg || !Node.isObjectLiteralExpression(optionsArg))
|
|
53
|
+
return undefined;
|
|
54
|
+
return { options: optionsArg };
|
|
55
|
+
}
|
|
56
|
+
if (!Node.isCallExpression(node.getExpression()))
|
|
57
|
+
return undefined;
|
|
58
|
+
const outerArgs = node.getArguments();
|
|
59
|
+
if (outerArgs.length !== 1)
|
|
60
|
+
return undefined;
|
|
61
|
+
const optionsArg = outerArgs[0];
|
|
62
|
+
if (!Node.isObjectLiteralExpression(optionsArg))
|
|
63
|
+
return undefined;
|
|
64
|
+
const innerCall = node.getExpression();
|
|
65
|
+
if (!Node.isCallExpression(innerCall))
|
|
66
|
+
return undefined;
|
|
67
|
+
if (!/(^|\.)genericComponent$/.test(innerCall.getExpression().getText()))
|
|
68
|
+
return undefined;
|
|
69
|
+
return {
|
|
70
|
+
options: optionsArg,
|
|
71
|
+
slotsTypeNode: innerCall.getTypeArguments()[0],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function readComponentName(options) {
|
|
75
|
+
const nameProp = options.getProperty('name');
|
|
76
|
+
if (!nameProp || !Node.isPropertyAssignment(nameProp))
|
|
77
|
+
return undefined;
|
|
78
|
+
const initializer = nameProp.getInitializer();
|
|
79
|
+
if (!initializer || !Node.isStringLiteral(initializer))
|
|
80
|
+
return undefined;
|
|
81
|
+
return initializer.getLiteralText();
|
|
82
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Node } from 'ts-morph';
|
|
2
|
+
import type { RawPropDefinition } from '../../../types/component.js';
|
|
3
|
+
export declare function extractPropsFromExpression(node: Node, seen: Set<Node>): RawPropDefinition[];
|
|
4
|
+
/** Extracts all props from a `defineComponent({ props: ... })` options object. */
|
|
5
|
+
export declare function extractVueTsxComponentProps(options: import('ts-morph').ObjectLiteralExpression): RawPropDefinition[];
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { Node } from 'ts-morph';
|
|
2
|
+
import { extractAllowedValues, getTypeReferenceName, getValueTargetDeclarations, } from '../../shared/helpers/tsx-shared.js';
|
|
3
|
+
import { resolveReturnedObjectLiteral, resolveObjectLiteralFromCallExpression, getExpressionTerminalName, extractStringArrayLiteralValues, } from './resolve-ast-object.js';
|
|
4
|
+
const VUE_PROP_VALUE_TYPE_MAP = {
|
|
5
|
+
String: 'string',
|
|
6
|
+
Number: 'number',
|
|
7
|
+
Boolean: 'boolean',
|
|
8
|
+
Array: 'any[]',
|
|
9
|
+
Object: 'object',
|
|
10
|
+
Function: 'function',
|
|
11
|
+
};
|
|
12
|
+
function extractPropTypeArgument(typeNode) {
|
|
13
|
+
if (!typeNode || !Node.isTypeReference(typeNode))
|
|
14
|
+
return undefined;
|
|
15
|
+
if (getTypeReferenceName(typeNode) !== 'PropType')
|
|
16
|
+
return undefined;
|
|
17
|
+
return typeNode.getTypeArguments()[0]?.getText();
|
|
18
|
+
}
|
|
19
|
+
function resolveVueTsxPropType(node) {
|
|
20
|
+
if (Node.isAsExpression(node) || Node.isTypeAssertion(node)) {
|
|
21
|
+
const typeNode = node.getTypeNode();
|
|
22
|
+
const propTypeArg = extractPropTypeArgument(typeNode);
|
|
23
|
+
if (propTypeArg)
|
|
24
|
+
return propTypeArg;
|
|
25
|
+
return resolveVueTsxPropType(node.getExpression());
|
|
26
|
+
}
|
|
27
|
+
if (Node.isParenthesizedExpression(node)) {
|
|
28
|
+
return resolveVueTsxPropType(node.getExpression());
|
|
29
|
+
}
|
|
30
|
+
if (Node.isArrayLiteralExpression(node)) {
|
|
31
|
+
const memberTypes = node.getElements().flatMap((element) => {
|
|
32
|
+
const memberType = resolveVueTsxPropType(element);
|
|
33
|
+
return memberType === 'any' ? [] : [memberType];
|
|
34
|
+
});
|
|
35
|
+
return memberTypes.length > 0 ? [...new Set(memberTypes)].sort().join(' | ') : 'any';
|
|
36
|
+
}
|
|
37
|
+
if (Node.isIdentifier(node)) {
|
|
38
|
+
return VUE_PROP_VALUE_TYPE_MAP[node.getText()] ?? node.getText();
|
|
39
|
+
}
|
|
40
|
+
if (Node.isNullLiteral(node))
|
|
41
|
+
return 'any';
|
|
42
|
+
return node.getType().getText(node);
|
|
43
|
+
}
|
|
44
|
+
function readVueTsxObjectPropertyName(property) {
|
|
45
|
+
const nameNode = property.getNameNode();
|
|
46
|
+
if (Node.isIdentifier(nameNode) || Node.isPrivateIdentifier(nameNode))
|
|
47
|
+
return nameNode.getText();
|
|
48
|
+
if (Node.isStringLiteral(nameNode) || Node.isNoSubstitutionTemplateLiteral(nameNode))
|
|
49
|
+
return nameNode.getLiteralText();
|
|
50
|
+
if (Node.isComputedPropertyName(nameNode)) {
|
|
51
|
+
const expression = nameNode.getExpression();
|
|
52
|
+
if (Node.isStringLiteral(expression) || Node.isNoSubstitutionTemplateLiteral(expression)) {
|
|
53
|
+
return expression.getLiteralText();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return property.getName();
|
|
57
|
+
}
|
|
58
|
+
function buildPropFromObjectLiteral(propName, initializer) {
|
|
59
|
+
let type = 'any';
|
|
60
|
+
let required = false;
|
|
61
|
+
let defaultValue;
|
|
62
|
+
let allowedValues;
|
|
63
|
+
for (const property of initializer.getProperties()) {
|
|
64
|
+
if (!Node.isPropertyAssignment(property))
|
|
65
|
+
continue;
|
|
66
|
+
const name = property.getName();
|
|
67
|
+
const value = property.getInitializer();
|
|
68
|
+
if (!value)
|
|
69
|
+
continue;
|
|
70
|
+
if (name === 'type') {
|
|
71
|
+
type = resolveVueTsxPropType(value);
|
|
72
|
+
allowedValues = extractAllowedValues(value.getType());
|
|
73
|
+
}
|
|
74
|
+
else if (name === 'required') {
|
|
75
|
+
required = value.getText() === 'true';
|
|
76
|
+
}
|
|
77
|
+
else if (name === 'default') {
|
|
78
|
+
defaultValue = value.getText();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
name: propName,
|
|
83
|
+
type,
|
|
84
|
+
required,
|
|
85
|
+
...(defaultValue !== undefined && { defaultValue }),
|
|
86
|
+
...(allowedValues && { allowedValues }),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function buildPropFromInitializer(propName, initializer) {
|
|
90
|
+
if (!initializer)
|
|
91
|
+
return undefined;
|
|
92
|
+
if (Node.isObjectLiteralExpression(initializer)) {
|
|
93
|
+
return buildPropFromObjectLiteral(propName, initializer);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
name: propName,
|
|
97
|
+
type: resolveVueTsxPropType(initializer),
|
|
98
|
+
required: false,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function extractPropsFromObjectLiteral(objectLiteral, seen) {
|
|
102
|
+
const propsByName = new Map();
|
|
103
|
+
for (const property of objectLiteral.getProperties()) {
|
|
104
|
+
if (Node.isPropertyAssignment(property)) {
|
|
105
|
+
const propName = readVueTsxObjectPropertyName(property);
|
|
106
|
+
if (!propName)
|
|
107
|
+
continue;
|
|
108
|
+
const definition = buildPropFromInitializer(propName, property.getInitializer());
|
|
109
|
+
if (definition)
|
|
110
|
+
propsByName.set(definition.name, definition);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (Node.isSpreadAssignment(property)) {
|
|
114
|
+
for (const definition of extractPropsFromExpression(property.getExpression(), seen)) {
|
|
115
|
+
propsByName.set(definition.name, definition);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return [...propsByName.values()];
|
|
120
|
+
}
|
|
121
|
+
function resolvePropsObjectLiteral(node) {
|
|
122
|
+
if (Node.isObjectLiteralExpression(node))
|
|
123
|
+
return node;
|
|
124
|
+
if (!Node.isCallExpression(node))
|
|
125
|
+
return undefined;
|
|
126
|
+
const returnedObject = resolveObjectLiteralFromCallExpression(node, new Set());
|
|
127
|
+
if (returnedObject)
|
|
128
|
+
return returnedObject;
|
|
129
|
+
const expression = node.getExpression();
|
|
130
|
+
if (Node.isIdentifier(expression)) {
|
|
131
|
+
for (const declaration of getValueTargetDeclarations(expression)) {
|
|
132
|
+
if (!Node.isVariableDeclaration(declaration))
|
|
133
|
+
continue;
|
|
134
|
+
const initializer = declaration.getInitializer();
|
|
135
|
+
if (!initializer || !Node.isCallExpression(initializer))
|
|
136
|
+
continue;
|
|
137
|
+
if (!/(^|\.)propsFactory$/.test(initializer.getExpression().getText()))
|
|
138
|
+
continue;
|
|
139
|
+
const propsArg = initializer.getArguments()[0];
|
|
140
|
+
if (propsArg && Node.isObjectLiteralExpression(propsArg))
|
|
141
|
+
return propsArg;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
export function extractPropsFromExpression(node, seen) {
|
|
147
|
+
if (seen.has(node))
|
|
148
|
+
return [];
|
|
149
|
+
seen.add(node);
|
|
150
|
+
if (Node.isObjectLiteralExpression(node)) {
|
|
151
|
+
return extractPropsFromObjectLiteral(node, seen);
|
|
152
|
+
}
|
|
153
|
+
if (Node.isCallExpression(node)) {
|
|
154
|
+
const expressionName = getExpressionTerminalName(node.getExpression());
|
|
155
|
+
if (expressionName === 'pick' || expressionName === 'omit') {
|
|
156
|
+
const sourceArg = node.getArguments()[0];
|
|
157
|
+
const keyArg = node.getArguments()[1];
|
|
158
|
+
if (!sourceArg || !keyArg)
|
|
159
|
+
return [];
|
|
160
|
+
const keys = extractStringArrayLiteralValues(keyArg);
|
|
161
|
+
if (!keys)
|
|
162
|
+
return [];
|
|
163
|
+
const sourceProps = extractPropsFromExpression(sourceArg, seen);
|
|
164
|
+
const keySet = new Set(keys);
|
|
165
|
+
return sourceProps.filter((p) => (expressionName === 'pick' ? keySet.has(p.name) : !keySet.has(p.name)));
|
|
166
|
+
}
|
|
167
|
+
const propsObject = resolvePropsObjectLiteral(node);
|
|
168
|
+
if (propsObject)
|
|
169
|
+
return extractPropsFromObjectLiteral(propsObject, seen);
|
|
170
|
+
}
|
|
171
|
+
if (Node.isIdentifier(node)) {
|
|
172
|
+
for (const declaration of getValueTargetDeclarations(node)) {
|
|
173
|
+
const resolved = resolveReturnedObjectLiteral(declaration, seen);
|
|
174
|
+
if (resolved)
|
|
175
|
+
return extractPropsFromObjectLiteral(resolved, seen);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
/** Extracts all props from a `defineComponent({ props: ... })` options object. */
|
|
181
|
+
export function extractVueTsxComponentProps(options) {
|
|
182
|
+
const propsProp = options.getProperty('props');
|
|
183
|
+
if (!propsProp || !Node.isPropertyAssignment(propsProp))
|
|
184
|
+
return [];
|
|
185
|
+
const initializer = propsProp.getInitializer();
|
|
186
|
+
if (!initializer)
|
|
187
|
+
return [];
|
|
188
|
+
return extractPropsFromExpression(initializer, new Set()).sort((a, b) => a.name.localeCompare(b.name));
|
|
189
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Node } from 'ts-morph';
|
|
2
|
+
import type { RawSlotDefinition } from '../../../types/component.js';
|
|
3
|
+
/** Extracts slots from a `defineComponent` options object, preferring type-level declarations over setup access. */
|
|
4
|
+
export declare function extractVueTsxComponentSlots(options: import('ts-morph').ObjectLiteralExpression, slotsTypeNode: Node | undefined): RawSlotDefinition[];
|