@calibrate-ds/core 0.1.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/__tests__/check-component.test.d.ts +2 -0
- package/dist/__tests__/check-component.test.d.ts.map +1 -0
- package/dist/__tests__/check-component.test.js +103 -0
- package/dist/__tests__/check-component.test.js.map +1 -0
- package/dist/__tests__/compare-components.test.d.ts +2 -0
- package/dist/__tests__/compare-components.test.d.ts.map +1 -0
- package/dist/__tests__/compare-components.test.js +145 -0
- package/dist/__tests__/compare-components.test.js.map +1 -0
- package/dist/__tests__/naming-strategy.test.d.ts +2 -0
- package/dist/__tests__/naming-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/naming-strategy.test.js +71 -0
- package/dist/__tests__/naming-strategy.test.js.map +1 -0
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +14 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +63 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/resolve-provider.d.ts +3 -0
- package/dist/ai/resolve-provider.d.ts.map +1 -0
- package/dist/ai/resolve-provider.js +61 -0
- package/dist/ai/resolve-provider.js.map +1 -0
- package/dist/bootstrap/generate-library-files.d.ts +7 -0
- package/dist/bootstrap/generate-library-files.d.ts.map +1 -0
- package/dist/bootstrap/generate-library-files.js +97 -0
- package/dist/bootstrap/generate-library-files.js.map +1 -0
- package/dist/bootstrap/index.d.ts +4 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +4 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/types.d.ts +27 -0
- package/dist/bootstrap/types.d.ts.map +1 -0
- package/dist/bootstrap/types.js +2 -0
- package/dist/bootstrap/types.js.map +1 -0
- package/dist/bootstrap/write-library-bootstrap.d.ts +7 -0
- package/dist/bootstrap/write-library-bootstrap.d.ts.map +1 -0
- package/dist/bootstrap/write-library-bootstrap.js +35 -0
- package/dist/bootstrap/write-library-bootstrap.js.map +1 -0
- package/dist/config/config-schema.d.ts +131 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +93 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load-config.d.ts +7 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +63 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/context/compressed-context.d.ts +3 -0
- package/dist/context/compressed-context.d.ts.map +1 -0
- package/dist/context/compressed-context.js +145 -0
- package/dist/context/compressed-context.js.map +1 -0
- package/dist/context/context-index.d.ts +18 -0
- package/dist/context/context-index.d.ts.map +1 -0
- package/dist/context/context-index.js +59 -0
- package/dist/context/context-index.js.map +1 -0
- package/dist/context/export-context.d.ts +61 -0
- package/dist/context/export-context.d.ts.map +1 -0
- package/dist/context/export-context.js +191 -0
- package/dist/context/export-context.js.map +1 -0
- package/dist/context/get-component-context.d.ts +3 -0
- package/dist/context/get-component-context.d.ts.map +1 -0
- package/dist/context/get-component-context.js +898 -0
- package/dist/context/get-component-context.js.map +1 -0
- package/dist/context/hashing.d.ts +14 -0
- package/dist/context/hashing.d.ts.map +1 -0
- package/dist/context/hashing.js +53 -0
- package/dist/context/hashing.js.map +1 -0
- package/dist/context/metadata-extraction.d.ts +15 -0
- package/dist/context/metadata-extraction.d.ts.map +1 -0
- package/dist/context/metadata-extraction.js +47 -0
- package/dist/context/metadata-extraction.js.map +1 -0
- package/dist/design-tool/figma-adapter.d.ts +20 -0
- package/dist/design-tool/figma-adapter.d.ts.map +1 -0
- package/dist/design-tool/figma-adapter.js +46 -0
- package/dist/design-tool/figma-adapter.js.map +1 -0
- package/dist/design-tool/index.d.ts +4 -0
- package/dist/design-tool/index.d.ts.map +1 -0
- package/dist/design-tool/index.js +3 -0
- package/dist/design-tool/index.js.map +1 -0
- package/dist/design-tool/registry.d.ts +12 -0
- package/dist/design-tool/registry.d.ts.map +1 -0
- package/dist/design-tool/registry.js +23 -0
- package/dist/design-tool/registry.js.map +1 -0
- package/dist/design-tool/types.d.ts +28 -0
- package/dist/design-tool/types.d.ts.map +1 -0
- package/dist/design-tool/types.js +2 -0
- package/dist/design-tool/types.js.map +1 -0
- package/dist/diff/compare-components.d.ts +3 -0
- package/dist/diff/compare-components.d.ts.map +1 -0
- package/dist/diff/compare-components.js +198 -0
- package/dist/diff/compare-components.js.map +1 -0
- package/dist/diff/compare-dependencies.d.ts +3 -0
- package/dist/diff/compare-dependencies.d.ts.map +1 -0
- package/dist/diff/compare-dependencies.js +30 -0
- package/dist/diff/compare-dependencies.js.map +1 -0
- package/dist/diff/compare-tokens.d.ts +3 -0
- package/dist/diff/compare-tokens.d.ts.map +1 -0
- package/dist/diff/compare-tokens.js +52 -0
- package/dist/diff/compare-tokens.js.map +1 -0
- package/dist/diff/compute-design-diff.d.ts +3 -0
- package/dist/diff/compute-design-diff.d.ts.map +1 -0
- package/dist/diff/compute-design-diff.js +27 -0
- package/dist/diff/compute-design-diff.js.map +1 -0
- package/dist/diff/format-diff-summary.d.ts +3 -0
- package/dist/diff/format-diff-summary.d.ts.map +1 -0
- package/dist/diff/format-diff-summary.js +59 -0
- package/dist/diff/format-diff-summary.js.map +1 -0
- package/dist/diff/index.d.ts +6 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +6 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/docs/generate-component-doc.d.ts +34 -0
- package/dist/docs/generate-component-doc.d.ts.map +1 -0
- package/dist/docs/generate-component-doc.js +269 -0
- package/dist/docs/generate-component-doc.js.map +1 -0
- package/dist/docs/generate-component-stories.d.ts +3 -0
- package/dist/docs/generate-component-stories.d.ts.map +1 -0
- package/dist/docs/generate-component-stories.js +116 -0
- package/dist/docs/generate-component-stories.js.map +1 -0
- package/dist/docs/generate-system-doc.d.ts +23 -0
- package/dist/docs/generate-system-doc.d.ts.map +1 -0
- package/dist/docs/generate-system-doc.js +337 -0
- package/dist/docs/generate-system-doc.js.map +1 -0
- package/dist/docs/index.d.ts +5 -0
- package/dist/docs/index.d.ts.map +1 -0
- package/dist/docs/index.js +5 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/setup-storybook.d.ts +26 -0
- package/dist/docs/setup-storybook.d.ts.map +1 -0
- package/dist/docs/setup-storybook.js +216 -0
- package/dist/docs/setup-storybook.js.map +1 -0
- package/dist/doctor/check-component.d.ts +5 -0
- package/dist/doctor/check-component.d.ts.map +1 -0
- package/dist/doctor/check-component.js +120 -0
- package/dist/doctor/check-component.js.map +1 -0
- package/dist/doctor/check-config.d.ts +4 -0
- package/dist/doctor/check-config.d.ts.map +1 -0
- package/dist/doctor/check-config.js +65 -0
- package/dist/doctor/check-config.js.map +1 -0
- package/dist/doctor/check-tokens.d.ts +4 -0
- package/dist/doctor/check-tokens.d.ts.map +1 -0
- package/dist/doctor/check-tokens.js +17 -0
- package/dist/doctor/check-tokens.js.map +1 -0
- package/dist/doctor/index.d.ts +5 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +5 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/types.d.ts +30 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/filesystem/ensure-dir.d.ts +5 -0
- package/dist/filesystem/ensure-dir.d.ts.map +1 -0
- package/dist/filesystem/ensure-dir.js +17 -0
- package/dist/filesystem/ensure-dir.js.map +1 -0
- package/dist/filesystem/index.d.ts +6 -0
- package/dist/filesystem/index.d.ts.map +1 -0
- package/dist/filesystem/index.js +6 -0
- package/dist/filesystem/index.js.map +1 -0
- package/dist/filesystem/resolve-component-path.d.ts +10 -0
- package/dist/filesystem/resolve-component-path.d.ts.map +1 -0
- package/dist/filesystem/resolve-component-path.js +32 -0
- package/dist/filesystem/resolve-component-path.js.map +1 -0
- package/dist/filesystem/resolve-ds-paths.d.ts +15 -0
- package/dist/filesystem/resolve-ds-paths.d.ts.map +1 -0
- package/dist/filesystem/resolve-ds-paths.js +51 -0
- package/dist/filesystem/resolve-ds-paths.js.map +1 -0
- package/dist/filesystem/workspace-root.d.ts +6 -0
- package/dist/filesystem/workspace-root.d.ts.map +1 -0
- package/dist/filesystem/workspace-root.js +21 -0
- package/dist/filesystem/workspace-root.js.map +1 -0
- package/dist/filesystem/write-json.d.ts +6 -0
- package/dist/filesystem/write-json.d.ts.map +1 -0
- package/dist/filesystem/write-json.js +10 -0
- package/dist/filesystem/write-json.js.map +1 -0
- package/dist/filesystem/write-text.d.ts +10 -0
- package/dist/filesystem/write-text.d.ts.map +1 -0
- package/dist/filesystem/write-text.js +22 -0
- package/dist/filesystem/write-text.js.map +1 -0
- package/dist/generators/components/generate-component-css.d.ts +6 -0
- package/dist/generators/components/generate-component-css.d.ts.map +1 -0
- package/dist/generators/components/generate-component-css.js +92 -0
- package/dist/generators/components/generate-component-css.js.map +1 -0
- package/dist/generators/components/generate-component-file.d.ts +8 -0
- package/dist/generators/components/generate-component-file.d.ts.map +1 -0
- package/dist/generators/components/generate-component-file.js +209 -0
- package/dist/generators/components/generate-component-file.js.map +1 -0
- package/dist/generators/components/generate-composite-file.d.ts +3 -0
- package/dist/generators/components/generate-composite-file.d.ts.map +1 -0
- package/dist/generators/components/generate-composite-file.js +77 -0
- package/dist/generators/components/generate-composite-file.js.map +1 -0
- package/dist/generators/components/generate-composite-types.d.ts +7 -0
- package/dist/generators/components/generate-composite-types.d.ts.map +1 -0
- package/dist/generators/components/generate-composite-types.js +43 -0
- package/dist/generators/components/generate-composite-types.js.map +1 -0
- package/dist/generators/components/generate-types-file.d.ts +8 -0
- package/dist/generators/components/generate-types-file.d.ts.map +1 -0
- package/dist/generators/components/generate-types-file.js +64 -0
- package/dist/generators/components/generate-types-file.js.map +1 -0
- package/dist/generators/components/helpers.d.ts +33 -0
- package/dist/generators/components/helpers.d.ts.map +1 -0
- package/dist/generators/components/helpers.js +124 -0
- package/dist/generators/components/helpers.js.map +1 -0
- package/dist/generators/components/index.d.ts +9 -0
- package/dist/generators/components/index.d.ts.map +1 -0
- package/dist/generators/components/index.js +10 -0
- package/dist/generators/components/index.js.map +1 -0
- package/dist/generators/components/layout-jsx.d.ts +14 -0
- package/dist/generators/components/layout-jsx.d.ts.map +1 -0
- package/dist/generators/components/layout-jsx.js +271 -0
- package/dist/generators/components/layout-jsx.js.map +1 -0
- package/dist/generators/components/prune-components.d.ts +15 -0
- package/dist/generators/components/prune-components.d.ts.map +1 -0
- package/dist/generators/components/prune-components.js +88 -0
- package/dist/generators/components/prune-components.js.map +1 -0
- package/dist/generators/components/token-helpers.d.ts +32 -0
- package/dist/generators/components/token-helpers.d.ts.map +1 -0
- package/dist/generators/components/token-helpers.js +188 -0
- package/dist/generators/components/token-helpers.js.map +1 -0
- package/dist/generators/components/write-components.d.ts +17 -0
- package/dist/generators/components/write-components.d.ts.map +1 -0
- package/dist/generators/components/write-components.js +212 -0
- package/dist/generators/components/write-components.js.map +1 -0
- package/dist/generators/components/write-composites.d.ts +4 -0
- package/dist/generators/components/write-composites.d.ts.map +1 -0
- package/dist/generators/components/write-composites.js +116 -0
- package/dist/generators/components/write-composites.js.map +1 -0
- package/dist/generators/composites/generate-composite-file.d.ts +3 -0
- package/dist/generators/composites/generate-composite-file.d.ts.map +1 -0
- package/dist/generators/composites/generate-composite-file.js +101 -0
- package/dist/generators/composites/generate-composite-file.js.map +1 -0
- package/dist/generators/composites/generate-composite-types.d.ts +7 -0
- package/dist/generators/composites/generate-composite-types.d.ts.map +1 -0
- package/dist/generators/composites/generate-composite-types.js +43 -0
- package/dist/generators/composites/generate-composite-types.js.map +1 -0
- package/dist/generators/composites/index.d.ts +4 -0
- package/dist/generators/composites/index.d.ts.map +1 -0
- package/dist/generators/composites/index.js +4 -0
- package/dist/generators/composites/index.js.map +1 -0
- package/dist/generators/composites/write-composites.d.ts +4 -0
- package/dist/generators/composites/write-composites.d.ts.map +1 -0
- package/dist/generators/composites/write-composites.js +116 -0
- package/dist/generators/composites/write-composites.js.map +1 -0
- package/dist/generators/registry.d.ts +9 -0
- package/dist/generators/registry.d.ts.map +1 -0
- package/dist/generators/registry.js +11 -0
- package/dist/generators/registry.js.map +1 -0
- package/dist/generators/scaffold/generate-placeholder-component-content.d.ts +9 -0
- package/dist/generators/scaffold/generate-placeholder-component-content.d.ts.map +1 -0
- package/dist/generators/scaffold/generate-placeholder-component-content.js +68 -0
- package/dist/generators/scaffold/generate-placeholder-component-content.js.map +1 -0
- package/dist/generators/scaffold/index.d.ts +3 -0
- package/dist/generators/scaffold/index.d.ts.map +1 -0
- package/dist/generators/scaffold/index.js +3 -0
- package/dist/generators/scaffold/index.js.map +1 -0
- package/dist/generators/scaffold/write-scaffold.d.ts +14 -0
- package/dist/generators/scaffold/write-scaffold.d.ts.map +1 -0
- package/dist/generators/scaffold/write-scaffold.js +87 -0
- package/dist/generators/scaffold/write-scaffold.js.map +1 -0
- package/dist/generators/tokens/generate-token-css.d.ts +6 -0
- package/dist/generators/tokens/generate-token-css.d.ts.map +1 -0
- package/dist/generators/tokens/generate-token-css.js +31 -0
- package/dist/generators/tokens/generate-token-css.js.map +1 -0
- package/dist/generators/tokens/generate-token-file-content.d.ts +6 -0
- package/dist/generators/tokens/generate-token-file-content.d.ts.map +1 -0
- package/dist/generators/tokens/generate-token-file-content.js +27 -0
- package/dist/generators/tokens/generate-token-file-content.js.map +1 -0
- package/dist/generators/tokens/index.d.ts +3 -0
- package/dist/generators/tokens/index.d.ts.map +1 -0
- package/dist/generators/tokens/index.js +3 -0
- package/dist/generators/tokens/index.js.map +1 -0
- package/dist/generators/tokens/write-tokens.d.ts +14 -0
- package/dist/generators/tokens/write-tokens.d.ts.map +1 -0
- package/dist/generators/tokens/write-tokens.js +96 -0
- package/dist/generators/tokens/write-tokens.js.map +1 -0
- package/dist/generators/types.d.ts +11 -0
- package/dist/generators/types.d.ts.map +1 -0
- package/dist/generators/types.js +2 -0
- package/dist/generators/types.js.map +1 -0
- package/dist/icons/enrich-icon-svgs.d.ts +10 -0
- package/dist/icons/enrich-icon-svgs.d.ts.map +1 -0
- package/dist/icons/enrich-icon-svgs.js +88 -0
- package/dist/icons/enrich-icon-svgs.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/index.d.ts +8 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +80 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/mappings/build-file-mappings.d.ts +6 -0
- package/dist/mappings/build-file-mappings.d.ts.map +1 -0
- package/dist/mappings/build-file-mappings.js +37 -0
- package/dist/mappings/build-file-mappings.js.map +1 -0
- package/dist/mappings/index.d.ts +3 -0
- package/dist/mappings/index.d.ts.map +1 -0
- package/dist/mappings/index.js +3 -0
- package/dist/mappings/index.js.map +1 -0
- package/dist/mappings/naming-strategy.d.ts +20 -0
- package/dist/mappings/naming-strategy.d.ts.map +1 -0
- package/dist/mappings/naming-strategy.js +78 -0
- package/dist/mappings/naming-strategy.js.map +1 -0
- package/dist/model/build-design-system-model.d.ts +7 -0
- package/dist/model/build-design-system-model.d.ts.map +1 -0
- package/dist/model/build-design-system-model.js +78 -0
- package/dist/model/build-design-system-model.js.map +1 -0
- package/dist/model/index.d.ts +2 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +2 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/resolve-component.d.ts +11 -0
- package/dist/model/resolve-component.d.ts.map +1 -0
- package/dist/model/resolve-component.js +110 -0
- package/dist/model/resolve-component.js.map +1 -0
- package/dist/normalizer/classify-entities.d.ts +12 -0
- package/dist/normalizer/classify-entities.d.ts.map +1 -0
- package/dist/normalizer/classify-entities.js +62 -0
- package/dist/normalizer/classify-entities.js.map +1 -0
- package/dist/normalizer/helpers.d.ts +13 -0
- package/dist/normalizer/helpers.d.ts.map +1 -0
- package/dist/normalizer/helpers.js +27 -0
- package/dist/normalizer/helpers.js.map +1 -0
- package/dist/normalizer/index.d.ts +7 -0
- package/dist/normalizer/index.d.ts.map +1 -0
- package/dist/normalizer/index.js +7 -0
- package/dist/normalizer/index.js.map +1 -0
- package/dist/normalizer/instance-resolver.d.ts +13 -0
- package/dist/normalizer/instance-resolver.d.ts.map +1 -0
- package/dist/normalizer/instance-resolver.js +747 -0
- package/dist/normalizer/instance-resolver.js.map +1 -0
- package/dist/normalizer/layout-tree.d.ts +12 -0
- package/dist/normalizer/layout-tree.d.ts.map +1 -0
- package/dist/normalizer/layout-tree.js +312 -0
- package/dist/normalizer/layout-tree.js.map +1 -0
- package/dist/normalizer/naming.d.ts +11 -0
- package/dist/normalizer/naming.d.ts.map +1 -0
- package/dist/normalizer/naming.js +44 -0
- package/dist/normalizer/naming.js.map +1 -0
- package/dist/normalizer/normalize-components.d.ts +13 -0
- package/dist/normalizer/normalize-components.d.ts.map +1 -0
- package/dist/normalizer/normalize-components.js +520 -0
- package/dist/normalizer/normalize-components.js.map +1 -0
- package/dist/normalizer/normalize-composites.d.ts +8 -0
- package/dist/normalizer/normalize-composites.d.ts.map +1 -0
- package/dist/normalizer/normalize-composites.js +22 -0
- package/dist/normalizer/normalize-composites.js.map +1 -0
- package/dist/normalizer/normalize-instances.d.ts +9 -0
- package/dist/normalizer/normalize-instances.d.ts.map +1 -0
- package/dist/normalizer/normalize-instances.js +32 -0
- package/dist/normalizer/normalize-instances.js.map +1 -0
- package/dist/normalizer/types.d.ts +22 -0
- package/dist/normalizer/types.d.ts.map +1 -0
- package/dist/normalizer/types.js +2 -0
- package/dist/normalizer/types.js.map +1 -0
- package/dist/normalizer/variant-diff.d.ts +101 -0
- package/dist/normalizer/variant-diff.d.ts.map +1 -0
- package/dist/normalizer/variant-diff.js +307 -0
- package/dist/normalizer/variant-diff.js.map +1 -0
- package/dist/plan/implementation-plan.d.ts +28 -0
- package/dist/plan/implementation-plan.d.ts.map +1 -0
- package/dist/plan/implementation-plan.js +60 -0
- package/dist/plan/implementation-plan.js.map +1 -0
- package/dist/plan/index.d.ts +3 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +3 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/resolve-affected-files.d.ts +11 -0
- package/dist/plan/resolve-affected-files.d.ts.map +1 -0
- package/dist/plan/resolve-affected-files.js +73 -0
- package/dist/plan/resolve-affected-files.js.map +1 -0
- package/dist/prompt/generate-component-prompt.d.ts +6 -0
- package/dist/prompt/generate-component-prompt.d.ts.map +1 -0
- package/dist/prompt/generate-component-prompt.js +1644 -0
- package/dist/prompt/generate-component-prompt.js.map +1 -0
- package/dist/registry/ai-provider-registry.d.ts +7 -0
- package/dist/registry/ai-provider-registry.d.ts.map +1 -0
- package/dist/registry/ai-provider-registry.js +21 -0
- package/dist/registry/ai-provider-registry.js.map +1 -0
- package/dist/registry/build-component-registry.d.ts +6 -0
- package/dist/registry/build-component-registry.d.ts.map +1 -0
- package/dist/registry/build-component-registry.js +43 -0
- package/dist/registry/build-component-registry.js.map +1 -0
- package/dist/registry/build-dependency-graph.d.ts +7 -0
- package/dist/registry/build-dependency-graph.d.ts.map +1 -0
- package/dist/registry/build-dependency-graph.js +36 -0
- package/dist/registry/build-dependency-graph.js.map +1 -0
- package/dist/registry/generator-registry.d.ts +12 -0
- package/dist/registry/generator-registry.d.ts.map +1 -0
- package/dist/registry/generator-registry.js +22 -0
- package/dist/registry/generator-registry.js.map +1 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +3 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/scaffold-plan/build-scaffold-plan.d.ts +16 -0
- package/dist/scaffold-plan/build-scaffold-plan.d.ts.map +1 -0
- package/dist/scaffold-plan/build-scaffold-plan.js +91 -0
- package/dist/scaffold-plan/build-scaffold-plan.js.map +1 -0
- package/dist/scaffold-plan/index.d.ts +2 -0
- package/dist/scaffold-plan/index.d.ts.map +1 -0
- package/dist/scaffold-plan/index.js +2 -0
- package/dist/scaffold-plan/index.js.map +1 -0
- package/dist/scanner/collect-components.d.ts +10 -0
- package/dist/scanner/collect-components.d.ts.map +1 -0
- package/dist/scanner/collect-components.js +103 -0
- package/dist/scanner/collect-components.js.map +1 -0
- package/dist/scanner/collect-instances.d.ts +6 -0
- package/dist/scanner/collect-instances.d.ts.map +1 -0
- package/dist/scanner/collect-instances.js +31 -0
- package/dist/scanner/collect-instances.js.map +1 -0
- package/dist/scanner/index.d.ts +6 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +6 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/scan-file.d.ts +6 -0
- package/dist/scanner/scan-file.d.ts.map +1 -0
- package/dist/scanner/scan-file.js +28 -0
- package/dist/scanner/scan-file.js.map +1 -0
- package/dist/scanner/traverse-nodes.d.ts +15 -0
- package/dist/scanner/traverse-nodes.d.ts.map +1 -0
- package/dist/scanner/traverse-nodes.js +18 -0
- package/dist/scanner/traverse-nodes.js.map +1 -0
- package/dist/scanner/types.d.ts +89 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +2 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/snapshots/index.d.ts +6 -0
- package/dist/snapshots/index.d.ts.map +1 -0
- package/dist/snapshots/index.js +6 -0
- package/dist/snapshots/index.js.map +1 -0
- package/dist/snapshots/load-imported-tokens.d.ts +8 -0
- package/dist/snapshots/load-imported-tokens.d.ts.map +1 -0
- package/dist/snapshots/load-imported-tokens.js +27 -0
- package/dist/snapshots/load-imported-tokens.js.map +1 -0
- package/dist/snapshots/load-latest-snapshot.d.ts +3 -0
- package/dist/snapshots/load-latest-snapshot.d.ts.map +1 -0
- package/dist/snapshots/load-latest-snapshot.js +16 -0
- package/dist/snapshots/load-latest-snapshot.js.map +1 -0
- package/dist/snapshots/load-previous-snapshot.d.ts +7 -0
- package/dist/snapshots/load-previous-snapshot.d.ts.map +1 -0
- package/dist/snapshots/load-previous-snapshot.js +39 -0
- package/dist/snapshots/load-previous-snapshot.js.map +1 -0
- package/dist/snapshots/save-imported-tokens.d.ts +4 -0
- package/dist/snapshots/save-imported-tokens.d.ts.map +1 -0
- package/dist/snapshots/save-imported-tokens.js +16 -0
- package/dist/snapshots/save-imported-tokens.js.map +1 -0
- package/dist/snapshots/save-snapshot.d.ts +3 -0
- package/dist/snapshots/save-snapshot.d.ts.map +1 -0
- package/dist/snapshots/save-snapshot.js +49 -0
- package/dist/snapshots/save-snapshot.js.map +1 -0
- package/dist/test-null-safety.d.ts +2 -0
- package/dist/test-null-safety.d.ts.map +1 -0
- package/dist/test-null-safety.js +67 -0
- package/dist/test-null-safety.js.map +1 -0
- package/dist/test-regex.d.ts +2 -0
- package/dist/test-regex.d.ts.map +1 -0
- package/dist/test-regex.js +25 -0
- package/dist/test-regex.js.map +1 -0
- package/dist/test-token-resolution.d.ts +2 -0
- package/dist/test-token-resolution.d.ts.map +1 -0
- package/dist/test-token-resolution.js +54 -0
- package/dist/test-token-resolution.js.map +1 -0
- package/dist/test-typography.d.ts +2 -0
- package/dist/test-typography.d.ts.map +1 -0
- package/dist/test-typography.js +69 -0
- package/dist/test-typography.js.map +1 -0
- package/dist/tokens/adapters/generic-adapter.d.ts +13 -0
- package/dist/tokens/adapters/generic-adapter.d.ts.map +1 -0
- package/dist/tokens/adapters/generic-adapter.js +74 -0
- package/dist/tokens/adapters/generic-adapter.js.map +1 -0
- package/dist/tokens/adapters/index.d.ts +3 -0
- package/dist/tokens/adapters/index.d.ts.map +1 -0
- package/dist/tokens/adapters/index.js +3 -0
- package/dist/tokens/adapters/index.js.map +1 -0
- package/dist/tokens/adapters/ptb-adapter.d.ts +13 -0
- package/dist/tokens/adapters/ptb-adapter.d.ts.map +1 -0
- package/dist/tokens/adapters/ptb-adapter.js +13 -0
- package/dist/tokens/adapters/ptb-adapter.js.map +1 -0
- package/dist/tokens/build-token-model.d.ts +12 -0
- package/dist/tokens/build-token-model.d.ts.map +1 -0
- package/dist/tokens/build-token-model.js +50 -0
- package/dist/tokens/build-token-model.js.map +1 -0
- package/dist/tokens/classify-token-kind.d.ts +7 -0
- package/dist/tokens/classify-token-kind.d.ts.map +1 -0
- package/dist/tokens/classify-token-kind.js +24 -0
- package/dist/tokens/classify-token-kind.js.map +1 -0
- package/dist/tokens/detect-format.d.ts +6 -0
- package/dist/tokens/detect-format.d.ts.map +1 -0
- package/dist/tokens/detect-format.js +23 -0
- package/dist/tokens/detect-format.js.map +1 -0
- package/dist/tokens/import-schema.d.ts +111 -0
- package/dist/tokens/import-schema.d.ts.map +1 -0
- package/dist/tokens/import-schema.js +45 -0
- package/dist/tokens/import-schema.js.map +1 -0
- package/dist/tokens/import-tokens.d.ts +16 -0
- package/dist/tokens/import-tokens.d.ts.map +1 -0
- package/dist/tokens/import-tokens.js +40 -0
- package/dist/tokens/import-tokens.js.map +1 -0
- package/dist/tokens/index.d.ts +12 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +12 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/naming.d.ts +19 -0
- package/dist/tokens/naming.d.ts.map +1 -0
- package/dist/tokens/naming.js +27 -0
- package/dist/tokens/naming.js.map +1 -0
- package/dist/tokens/normalize-token-collections.d.ts +7 -0
- package/dist/tokens/normalize-token-collections.d.ts.map +1 -0
- package/dist/tokens/normalize-token-collections.js +68 -0
- package/dist/tokens/normalize-token-collections.js.map +1 -0
- package/dist/tokens/resolution.d.ts +7 -0
- package/dist/tokens/resolution.d.ts.map +1 -0
- package/dist/tokens/resolution.js +223 -0
- package/dist/tokens/resolution.js.map +1 -0
- package/dist/tokens/resolve-token-source.d.ts +12 -0
- package/dist/tokens/resolve-token-source.d.ts.map +1 -0
- package/dist/tokens/resolve-token-source.js +37 -0
- package/dist/tokens/resolve-token-source.js.map +1 -0
- package/dist/tokens/types.d.ts +40 -0
- package/dist/tokens/types.d.ts.map +1 -0
- package/dist/tokens/types.js +2 -0
- package/dist/tokens/types.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,747 @@
|
|
|
1
|
+
import { rgbToHex } from "./helpers.js";
|
|
2
|
+
import { resolveTokenBindingFromIndex } from "../tokens/resolution.js";
|
|
3
|
+
/** Converts any Figma display name to a valid PascalCase React component identifier.
|
|
4
|
+
* "nav-arrow-down" → "NavArrowDown", "homeFilled" → "HomeFilled", "Text field mobile" → "TextFieldMobile"
|
|
5
|
+
*/
|
|
6
|
+
function toPascalCase(name) {
|
|
7
|
+
return name
|
|
8
|
+
.split(/[\s\-_]+/)
|
|
9
|
+
.filter(Boolean)
|
|
10
|
+
.map(p => p.charAt(0).toUpperCase() + p.slice(1))
|
|
11
|
+
.join("");
|
|
12
|
+
}
|
|
13
|
+
/** Figma variant axis names that exist only in the design tool and have no React equivalent.
|
|
14
|
+
* `weight` controls icon stroke thickness in Figma but React SVG icons are static.
|
|
15
|
+
* `theme` / `platform` / `appearance` are Figma presentation-layer concerns only.
|
|
16
|
+
*/
|
|
17
|
+
const FIGMA_ONLY_PROP_NAMES = new Set(["weight", "theme", "platform", "appearance"]);
|
|
18
|
+
/** Figma interaction-state values for the `state` axis that represent hover/focus/press
|
|
19
|
+
* states handled in CSS/event handlers — never passed as static React props.
|
|
20
|
+
*/
|
|
21
|
+
const FIGMA_INTERACTION_STATE_VALUES = new Set([
|
|
22
|
+
"default", "hover", "hovered", "pressed", "focused", "active", "visited",
|
|
23
|
+
]);
|
|
24
|
+
/**
|
|
25
|
+
* Deterministically resolves a usage "recipe" for a nested dependency instance.
|
|
26
|
+
* This helps downstream AI implementation avoid guessing about slot visibility
|
|
27
|
+
* and intended visual configuration.
|
|
28
|
+
*/
|
|
29
|
+
export function resolveInstanceRecipe(node, components = [], tokenIndex) {
|
|
30
|
+
if (!node.componentId)
|
|
31
|
+
return undefined;
|
|
32
|
+
try {
|
|
33
|
+
return doResolveInstanceRecipe(node, components, tokenIndex);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
console.warn(`Failed to enrich recipe for node ${node.name || "unknown"}: ${e.message}`);
|
|
37
|
+
const componentName = (node?.name || "").split('/')[0].trim();
|
|
38
|
+
return {
|
|
39
|
+
standardType: "generic",
|
|
40
|
+
visibleSlots: [],
|
|
41
|
+
hiddenSlots: [],
|
|
42
|
+
textVisible: true,
|
|
43
|
+
leadingIconVisible: false,
|
|
44
|
+
trailingIconVisible: false,
|
|
45
|
+
summary: "Generic fallback component",
|
|
46
|
+
resolvedProps: {},
|
|
47
|
+
implementationMode: "invoke-dependency",
|
|
48
|
+
classification: {
|
|
49
|
+
representable: [],
|
|
50
|
+
derivedButRepresentable: [],
|
|
51
|
+
nonRepresentable: [],
|
|
52
|
+
warnings: [`Enrichment crashed: ${e.message}`]
|
|
53
|
+
},
|
|
54
|
+
invocationHint: `<${toPascalCase(componentName || "Unknown")} />`,
|
|
55
|
+
invocationContract: {
|
|
56
|
+
componentName: toPascalCase(componentName || "Unknown"),
|
|
57
|
+
importName: toPascalCase(componentName || "Unknown"),
|
|
58
|
+
resolvedProps: {},
|
|
59
|
+
propSourceMap: {},
|
|
60
|
+
omitProps: [],
|
|
61
|
+
slotContract: {},
|
|
62
|
+
childrenPolicy: "generic",
|
|
63
|
+
iconBindingPolicy: {},
|
|
64
|
+
renderHint: ""
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function doResolveInstanceRecipe(node, components = [], tokenIndex) {
|
|
70
|
+
// Only resolve recipes for instances (which have componentId)
|
|
71
|
+
if (!node.componentId)
|
|
72
|
+
return undefined;
|
|
73
|
+
// Resolves a Figma node ID (raw "136:594" or PTB "comp_136_594") to a ComponentDefinition.
|
|
74
|
+
// Layout tree nodes already store PTB IDs, but propertyOverrides (INSTANCE_SWAP values) keep raw Figma IDs.
|
|
75
|
+
const findComp = (id, name) => {
|
|
76
|
+
// Phase 1a: exact PTB ID match
|
|
77
|
+
let comp = components.find(c => c.id === id);
|
|
78
|
+
// Phase 1b: designToolNodeId match (catches raw variant IDs stored on the model)
|
|
79
|
+
if (!comp)
|
|
80
|
+
comp = components.find(c => c.designToolNodeId === id);
|
|
81
|
+
// Phase 1c: raw Figma ID → PTB format conversion ("106:390" → "comp_106_390")
|
|
82
|
+
if (!comp && /^\d+:\d+$/.test(id)) {
|
|
83
|
+
comp = components.find(c => c.id === `comp_${id.replace(/:/g, "_")}`);
|
|
84
|
+
}
|
|
85
|
+
// Phase 2: name-based fallback — when IDs diverge (variant ID vs set ID)
|
|
86
|
+
if (!comp && name) {
|
|
87
|
+
const baseName = name.split("/")[0].trim();
|
|
88
|
+
const baseLower = baseName.toLowerCase().replace(/\s+/g, "");
|
|
89
|
+
comp = components.find(c => c.name === baseName ||
|
|
90
|
+
c.name.toLowerCase().replace(/\s+/g, "") === baseLower);
|
|
91
|
+
}
|
|
92
|
+
return comp;
|
|
93
|
+
};
|
|
94
|
+
const dependency = findComp(node.componentId, node.name);
|
|
95
|
+
const visibleSlots = [];
|
|
96
|
+
const hiddenSlots = [];
|
|
97
|
+
const childNodes = [];
|
|
98
|
+
const traverse = (n) => {
|
|
99
|
+
childNodes.push(n);
|
|
100
|
+
if (n.children)
|
|
101
|
+
n.children.forEach(traverse);
|
|
102
|
+
};
|
|
103
|
+
if (node.children)
|
|
104
|
+
node.children.forEach(traverse);
|
|
105
|
+
// 1. Text / Label Analysis
|
|
106
|
+
let textContent = node.textContent;
|
|
107
|
+
let textVisible = node.visible !== false;
|
|
108
|
+
// 2. Props Aggregation
|
|
109
|
+
const resolvedProps = {};
|
|
110
|
+
const propSourceMap = {};
|
|
111
|
+
// Helper to clean property names for implementation-like usage
|
|
112
|
+
const cleanPropName = (name) => {
|
|
113
|
+
return name.trim()
|
|
114
|
+
.replace(/[-_\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : '')
|
|
115
|
+
.replace(/^./, (str) => str.toLowerCase());
|
|
116
|
+
};
|
|
117
|
+
if (node.variantSelection && typeof node.variantSelection === 'object') {
|
|
118
|
+
for (const [key, value] of Object.entries(node.variantSelection)) {
|
|
119
|
+
const cleanKey = cleanPropName(key);
|
|
120
|
+
resolvedProps[cleanKey] = value;
|
|
121
|
+
propSourceMap[key] = cleanKey;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (node.propertyOverrides && typeof node.propertyOverrides === 'object') {
|
|
125
|
+
for (const [key, value] of Object.entries(node.propertyOverrides)) {
|
|
126
|
+
const cleanKey = cleanPropName(key);
|
|
127
|
+
resolvedProps[cleanKey] = value;
|
|
128
|
+
propSourceMap[key] = cleanKey;
|
|
129
|
+
const k = key.toLowerCase();
|
|
130
|
+
// Common Figma property names for text
|
|
131
|
+
if (k === "label" || k === "text" || k === "value" || k === "title") {
|
|
132
|
+
if (typeof value === "string") {
|
|
133
|
+
textContent = value;
|
|
134
|
+
}
|
|
135
|
+
// Booleans often control visibility of text slots
|
|
136
|
+
if (value === false || value === "") {
|
|
137
|
+
textVisible = false;
|
|
138
|
+
}
|
|
139
|
+
if (value === true)
|
|
140
|
+
textVisible = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Resolve instance IDs into dependency contracts
|
|
145
|
+
for (const [key, value] of Object.entries(resolvedProps)) {
|
|
146
|
+
if (typeof value === "string" && /^(\d+:\d+|I\d+:\d+.*)$/.test(value)) {
|
|
147
|
+
const dep = findComp(value);
|
|
148
|
+
if (dep) {
|
|
149
|
+
resolvedProps[key] = {
|
|
150
|
+
kind: "dependency",
|
|
151
|
+
componentId: dep.id,
|
|
152
|
+
componentName: dep.name,
|
|
153
|
+
importName: dep.name
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
resolvedProps[key] = {
|
|
158
|
+
kind: "unknown",
|
|
159
|
+
componentId: value
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// 3. Icon Analysis (Heuristics based on common Figma naming and variant patterns)
|
|
165
|
+
let leadingIconVisible = false;
|
|
166
|
+
let trailingIconVisible = false;
|
|
167
|
+
// Check variant selection (e.g. "Icon=Both", "Leading Icon=On")
|
|
168
|
+
if (node.variantSelection) {
|
|
169
|
+
for (const [key, value] of Object.entries(node.variantSelection)) {
|
|
170
|
+
const k = key.toLowerCase();
|
|
171
|
+
const v = String(value).toLowerCase();
|
|
172
|
+
const isPositive = v === "true" || v === "on" || v === "visible" || v === "yes" || (v !== "none" && v !== "false" && v !== "off");
|
|
173
|
+
if (k.includes("icon")) {
|
|
174
|
+
if (isPositive) {
|
|
175
|
+
if (k.includes("leading") || k.includes("start") || k.includes("left") || k.includes("before")) {
|
|
176
|
+
leadingIconVisible = true;
|
|
177
|
+
}
|
|
178
|
+
else if (k.includes("trailing") || k.includes("end") || k.includes("right") || k.includes("after")) {
|
|
179
|
+
trailingIconVisible = true;
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
leadingIconVisible = true;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (v === "both") {
|
|
186
|
+
leadingIconVisible = true;
|
|
187
|
+
trailingIconVisible = true;
|
|
188
|
+
}
|
|
189
|
+
if (v === "leading" || v === "start" || v === "left")
|
|
190
|
+
leadingIconVisible = true;
|
|
191
|
+
if (v === "trailing" || v === "end" || v === "right")
|
|
192
|
+
trailingIconVisible = true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Check boolean property overrides (e.g. "showIcon": true, "showButtonText": false)
|
|
197
|
+
if (node.propertyOverrides) {
|
|
198
|
+
for (const [key, value] of Object.entries(node.propertyOverrides)) {
|
|
199
|
+
const k = key.toLowerCase();
|
|
200
|
+
if (typeof value === "boolean") {
|
|
201
|
+
if (k.includes("text") || k.includes("label") || k === "show") {
|
|
202
|
+
if (k.includes("show") || k.includes("visible") || k.includes("enabled")) {
|
|
203
|
+
textVisible = value;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (k.includes("icon")) {
|
|
207
|
+
if (k.includes("leading") || k.includes("start") || k.includes("left")) {
|
|
208
|
+
leadingIconVisible = value;
|
|
209
|
+
}
|
|
210
|
+
else if (k.includes("trailing") || k.includes("end") || k.includes("right")) {
|
|
211
|
+
trailingIconVisible = value;
|
|
212
|
+
}
|
|
213
|
+
else if (k.includes("show") || k.includes("visible") || !k.includes("name")) {
|
|
214
|
+
leadingIconVisible = value;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (typeof value === "boolean") {
|
|
219
|
+
if (value)
|
|
220
|
+
visibleSlots.push(key);
|
|
221
|
+
else
|
|
222
|
+
hiddenSlots.push(key);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// 4. Override Classification
|
|
227
|
+
const classification = {
|
|
228
|
+
representable: [],
|
|
229
|
+
derivedButRepresentable: [],
|
|
230
|
+
nonRepresentable: [],
|
|
231
|
+
warnings: []
|
|
232
|
+
};
|
|
233
|
+
if (dependency) {
|
|
234
|
+
const depProps = new Set((dependency.properties || []).map(p => p.name.toLowerCase()));
|
|
235
|
+
const depVariants = new Set((dependency.variantAxes || []).map(v => v.name.toLowerCase()));
|
|
236
|
+
// Check variant selection
|
|
237
|
+
if (node.variantSelection && typeof node.variantSelection === 'object') {
|
|
238
|
+
for (const key of Object.keys(node.variantSelection)) {
|
|
239
|
+
if (depVariants.has(key.toLowerCase())) {
|
|
240
|
+
classification.representable.push(key);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
classification.nonRepresentable.push(key);
|
|
244
|
+
classification.warnings.push(`Variant axis "${key}" not found on dependency "${dependency.name}".`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Check property overrides
|
|
249
|
+
if (node.propertyOverrides && typeof node.propertyOverrides === 'object') {
|
|
250
|
+
for (const key of Object.keys(node.propertyOverrides)) {
|
|
251
|
+
if (depProps.has(key.toLowerCase())) {
|
|
252
|
+
classification.representable.push(key);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Heuristics for derived representable
|
|
256
|
+
const k = key.toLowerCase();
|
|
257
|
+
const v = node.propertyOverrides[key];
|
|
258
|
+
if (typeof v === "object" && v !== null && v.kind === "dependency") {
|
|
259
|
+
classification.derivedButRepresentable.push(key);
|
|
260
|
+
}
|
|
261
|
+
else if (k.includes("label") || k.includes("text") || k.includes("icon") || k.includes("show") || k.includes("visible")) {
|
|
262
|
+
classification.derivedButRepresentable.push(key);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
classification.nonRepresentable.push(key);
|
|
266
|
+
classification.warnings.push(`Override "${key}" doesn't map to a public prop on "${dependency.name}".`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
classification.warnings.push(`Dependency "${node.componentId}" not found in model.`);
|
|
274
|
+
}
|
|
275
|
+
// 4.5 Style Override Detection
|
|
276
|
+
const styleOverrides = {};
|
|
277
|
+
if (node.rawStyles && dependency && dependency.styleMetadata) {
|
|
278
|
+
if (node.rawStyles.fills && dependency.styleMetadata.fills) {
|
|
279
|
+
const instanceFills = JSON.stringify(node.rawStyles.fills);
|
|
280
|
+
const depFills = dependency.styleMetadata.fills;
|
|
281
|
+
if (instanceFills !== depFills) {
|
|
282
|
+
const diff = resolveStyleDiff(String(depFills), instanceFills, tokenIndex);
|
|
283
|
+
if (diff) {
|
|
284
|
+
styleOverrides["fill"] = diff;
|
|
285
|
+
classification.nonRepresentable.push("style:fill");
|
|
286
|
+
classification.warnings.push(`Nested instance has a local fill override not covered by dependency API.`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (node.rawStyles.strokes && dependency.styleMetadata.strokes) {
|
|
291
|
+
const instanceStrokes = JSON.stringify(node.rawStyles.strokes);
|
|
292
|
+
const depStrokes = dependency.styleMetadata.strokes;
|
|
293
|
+
if (instanceStrokes !== depStrokes) {
|
|
294
|
+
const diff = resolveStyleDiff(String(depStrokes), instanceStrokes, tokenIndex);
|
|
295
|
+
if (diff) {
|
|
296
|
+
styleOverrides["stroke"] = diff;
|
|
297
|
+
classification.nonRepresentable.push("style:stroke");
|
|
298
|
+
classification.warnings.push(`Nested instance has a local stroke override not covered by dependency API.`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// 5. Determine Implementation Mode
|
|
304
|
+
let implementationMode = "invoke-dependency";
|
|
305
|
+
if (classification.nonRepresentable.length > 0) {
|
|
306
|
+
implementationMode = "invoke-dependency-with-local-patch";
|
|
307
|
+
if (classification.nonRepresentable.length > 3) {
|
|
308
|
+
implementationMode = "recommend-variant-promotion";
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else if (classification.representable.length > 0 || classification.derivedButRepresentable.length > 0) {
|
|
312
|
+
implementationMode = "invoke-dependency-with-overrides";
|
|
313
|
+
}
|
|
314
|
+
// 7. Determine Standard Functional Type
|
|
315
|
+
let standardType = "generic";
|
|
316
|
+
if (textVisible) {
|
|
317
|
+
if (!leadingIconVisible && !trailingIconVisible)
|
|
318
|
+
standardType = "text-only";
|
|
319
|
+
else if (leadingIconVisible && !trailingIconVisible)
|
|
320
|
+
standardType = "text-with-leading-icon";
|
|
321
|
+
else if (!leadingIconVisible && trailingIconVisible)
|
|
322
|
+
standardType = "text-with-trailing-icon";
|
|
323
|
+
else if (leadingIconVisible && trailingIconVisible)
|
|
324
|
+
standardType = "text-with-both-icons";
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
if (leadingIconVisible || trailingIconVisible)
|
|
328
|
+
standardType = "icon-only";
|
|
329
|
+
}
|
|
330
|
+
// 8. Build Concise Summary
|
|
331
|
+
let summaryParts = [];
|
|
332
|
+
const typeLabels = {
|
|
333
|
+
"text-only": "Text-only",
|
|
334
|
+
"icon-only": "Icon-only",
|
|
335
|
+
"text-with-leading-icon": "Text with leading icon",
|
|
336
|
+
"text-with-trailing-icon": "Text with trailing icon",
|
|
337
|
+
"text-with-both-icons": "Text with both icons",
|
|
338
|
+
"generic": "Generic"
|
|
339
|
+
};
|
|
340
|
+
summaryParts.push(typeLabels[standardType] || "Generic instance");
|
|
341
|
+
if (textVisible && textContent)
|
|
342
|
+
summaryParts.push(`displaying "${textContent}"`);
|
|
343
|
+
else if (textVisible)
|
|
344
|
+
summaryParts.push("displaying default text");
|
|
345
|
+
if (!textVisible && (leadingIconVisible || trailingIconVisible))
|
|
346
|
+
summaryParts.push("as a standalone icon action");
|
|
347
|
+
const summary = summaryParts.join(" ");
|
|
348
|
+
// 9. Generate Invocation Hint & Slot Contracts
|
|
349
|
+
// Build a set of valid prop names from the resolved dep component.
|
|
350
|
+
// When the dep is known, props that don't match any of its variant axes or
|
|
351
|
+
// Figma component properties are stale overrides (renamed/removed in the source)
|
|
352
|
+
// and must not appear in the invocationHint.
|
|
353
|
+
const validDepPropKeys = new Set();
|
|
354
|
+
if (dependency) {
|
|
355
|
+
for (const ax of (dependency.variantAxes || [])) {
|
|
356
|
+
validDepPropKeys.add(cleanPropName(ax.name));
|
|
357
|
+
}
|
|
358
|
+
for (const prop of (dependency.properties || [])) {
|
|
359
|
+
validDepPropKeys.add(cleanPropName(prop.name));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
const componentName = (node.name || "").split('/')[0].trim();
|
|
363
|
+
const propParts = [];
|
|
364
|
+
for (const [k, v] of Object.entries(resolvedProps)) {
|
|
365
|
+
// Always keep dependency-kind values (INSTANCE_SWAP overrides); only validate scalar props.
|
|
366
|
+
const isDep = v && typeof v === "object" && v.kind === "dependency";
|
|
367
|
+
if (!isDep) {
|
|
368
|
+
// Drop Figma-design-only axes (no React equivalent)
|
|
369
|
+
if (FIGMA_ONLY_PROP_NAMES.has(k))
|
|
370
|
+
continue;
|
|
371
|
+
// Drop `state` when its value is a Figma interaction state (hover/pressed/default…)
|
|
372
|
+
if (k === "state" && typeof v === "string" && FIGMA_INTERACTION_STATE_VALUES.has(v.toLowerCase()))
|
|
373
|
+
continue;
|
|
374
|
+
// Drop props that don't exist on the resolved dep's variant axes or component properties
|
|
375
|
+
if (dependency && validDepPropKeys.size > 0 && !validDepPropKeys.has(k))
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
if (isDep) {
|
|
379
|
+
propParts.push(`${k}={<${toPascalCase(v.importName)} />}`);
|
|
380
|
+
}
|
|
381
|
+
else if (typeof v === "string") {
|
|
382
|
+
propParts.push(`${k}="${v}"`);
|
|
383
|
+
}
|
|
384
|
+
else if (v === true) {
|
|
385
|
+
propParts.push(k);
|
|
386
|
+
}
|
|
387
|
+
else if (v === false) {
|
|
388
|
+
propParts.push(`${k}={false}`);
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
propParts.push(`${k}={${JSON.stringify(v)}}`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
const safeCompName = toPascalCase(componentName);
|
|
395
|
+
const invocationHint = propParts.length > 0
|
|
396
|
+
? `<${safeCompName} ${propParts.join(" ")} />`
|
|
397
|
+
: `<${safeCompName} />`;
|
|
398
|
+
// Strict Slot Contract Generation
|
|
399
|
+
const slotContract = {};
|
|
400
|
+
const resolveSlotDep = (slotNode) => {
|
|
401
|
+
if (slotNode?.componentId) {
|
|
402
|
+
const dep = findComp(slotNode.componentId, slotNode.name);
|
|
403
|
+
if (dep) {
|
|
404
|
+
return {
|
|
405
|
+
componentName: dep.name,
|
|
406
|
+
importName: dep.name,
|
|
407
|
+
componentId: dep.id
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
};
|
|
413
|
+
// Identified slots based on common roles and node types
|
|
414
|
+
const textNodes = childNodes.filter(c => (c.role === "text" || c.type === "TEXT" || c.textContent !== undefined || c.rawStyles?.nodeType === "TEXT"));
|
|
415
|
+
const instanceNodes = childNodes.filter(c => (c.role === "instance" || c.type === "INSTANCE"));
|
|
416
|
+
const overrideNames = (node.childOverrides || []).map((o) => o.name);
|
|
417
|
+
// Map content slots (text)
|
|
418
|
+
const processedNames = new Set();
|
|
419
|
+
const computeSlotRender = (kind, visible, prop, textContent, dependency) => {
|
|
420
|
+
const depName = dependency
|
|
421
|
+
? toPascalCase(dependency.componentName || dependency.importName)
|
|
422
|
+
: null;
|
|
423
|
+
if (!visible) {
|
|
424
|
+
return {
|
|
425
|
+
visibilityBehavior: "hidden-by-default",
|
|
426
|
+
renderPattern: prop ? `{${prop} ?? null}` : "null"
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
if (kind === "text") {
|
|
430
|
+
return {
|
|
431
|
+
visibilityBehavior: prop ? "caller-controlled" : "always",
|
|
432
|
+
renderPattern: prop ? `{${prop}}` : (textContent ? `"${textContent}"` : "null")
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
if (kind === "child") {
|
|
436
|
+
return {
|
|
437
|
+
visibilityBehavior: prop ? "caller-controlled" : "always",
|
|
438
|
+
renderPattern: prop ? `{${prop}}` : (depName ? `<${depName} />` : "null")
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
if (kind === "icon" || kind === "asset") {
|
|
442
|
+
if (prop) {
|
|
443
|
+
return {
|
|
444
|
+
visibilityBehavior: "caller-overrideable",
|
|
445
|
+
renderPattern: depName ? `{${prop} ?? <${depName} />}` : `{${prop} ?? null}`
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
return { visibilityBehavior: "always", renderPattern: depName ? `<${depName} />` : "null" };
|
|
449
|
+
}
|
|
450
|
+
// unknown kind
|
|
451
|
+
if (prop)
|
|
452
|
+
return { visibilityBehavior: "caller-controlled", renderPattern: `{${prop}}` };
|
|
453
|
+
return { visibilityBehavior: "always", renderPattern: depName ? `<${depName} />` : "null" };
|
|
454
|
+
};
|
|
455
|
+
const addSlot = (name, kind, visible, prop, textContent, dependency) => {
|
|
456
|
+
const cleanName = cleanPropName(name);
|
|
457
|
+
if (processedNames.has(cleanName))
|
|
458
|
+
return;
|
|
459
|
+
processedNames.add(cleanName);
|
|
460
|
+
const { renderPattern, visibilityBehavior } = computeSlotRender(kind, visible, prop, textContent, dependency);
|
|
461
|
+
slotContract[cleanName] = {
|
|
462
|
+
kind,
|
|
463
|
+
visible,
|
|
464
|
+
prop,
|
|
465
|
+
textContent,
|
|
466
|
+
dependency,
|
|
467
|
+
renderPattern,
|
|
468
|
+
visibilityBehavior
|
|
469
|
+
};
|
|
470
|
+
};
|
|
471
|
+
textNodes.forEach(tn => {
|
|
472
|
+
addSlot(tn.name, "text", tn.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(tn.name) || r === tn.name)?.[1], tn.textContent);
|
|
473
|
+
});
|
|
474
|
+
// Also look at overrides for text slots that might not be in the tree
|
|
475
|
+
(node.childOverrides || []).forEach((o) => {
|
|
476
|
+
if (o.textContent !== undefined) {
|
|
477
|
+
addSlot(o.name, "text", o.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(o.name) || r === o.name)?.[1], o.textContent);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
instanceNodes.forEach(inode => {
|
|
481
|
+
let kind = "unknown";
|
|
482
|
+
const lowerName = inode.name.toLowerCase();
|
|
483
|
+
const ICON_KEYWORDS = ["icon", "chevron", "arrow", "close", "menu", "more", "check", "plus", "minus",
|
|
484
|
+
"search", "add", "delete", "edit", "clear", "back", "forward", "info",
|
|
485
|
+
"warning", "alert", "error", "star", "heart", "bolt", "flag", "dot"];
|
|
486
|
+
const hasDimension = /\d+x\d+/.test(inode.name);
|
|
487
|
+
const hasIconKeyword = ICON_KEYWORDS.some(k => lowerName.includes(k));
|
|
488
|
+
if (hasDimension || hasIconKeyword)
|
|
489
|
+
kind = "icon";
|
|
490
|
+
else if (lowerName.includes("asset") || lowerName.includes("img") || lowerName.includes("avatar"))
|
|
491
|
+
kind = "asset";
|
|
492
|
+
else if (inode.componentId)
|
|
493
|
+
kind = "child";
|
|
494
|
+
addSlot(inode.name, kind, inode.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(inode.name) || r === inode.name)?.[1], undefined, resolveSlotDep(inode));
|
|
495
|
+
});
|
|
496
|
+
// Also look at overrides for instance slots
|
|
497
|
+
(node.childOverrides || []).forEach((o) => {
|
|
498
|
+
if (o.componentId) {
|
|
499
|
+
let kind = "child";
|
|
500
|
+
if (o.name.toLowerCase().includes("icon"))
|
|
501
|
+
kind = "icon";
|
|
502
|
+
addSlot(o.name, kind, o.visible !== false, Object.entries(propSourceMap).find(([r, n]) => n === cleanPropName(o.name) || r === o.name)?.[1], undefined, resolveSlotDep(o));
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
const overrideContract = compileOverrideContract(node.childOverrides || [], components, tokenIndex);
|
|
506
|
+
const instanceSummary = {
|
|
507
|
+
baseComponent: componentName,
|
|
508
|
+
variantSelection: node.variantSelection || {},
|
|
509
|
+
divergenceSummary: {
|
|
510
|
+
contentOverrides: Object.keys(overrideContract.content),
|
|
511
|
+
slotVisibilityOverrides: Object.keys(overrideContract.slotVisibility),
|
|
512
|
+
styleOverrides: Object.keys(overrideContract.style),
|
|
513
|
+
dependencyOverrides: Object.keys(overrideContract.dependency)
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
const designRules = { notes: [] };
|
|
517
|
+
if (dependency) {
|
|
518
|
+
// Intentional border policy
|
|
519
|
+
const baseHasBorder = dependency.styleMetadata && (dependency.styleMetadata.strokes || dependency.styleMetadata.border);
|
|
520
|
+
const instanceHasBorder = node.rawStyles && (node.rawStyles.strokes || node.rawStyles.border);
|
|
521
|
+
if (baseHasBorder && !instanceHasBorder) {
|
|
522
|
+
designRules.border = { policy: "none", reason: "intentional border removal in this instance" };
|
|
523
|
+
designRules.notes?.push("Border intentionally removed; do not re-add from base component defaults.");
|
|
524
|
+
}
|
|
525
|
+
// Slot visibility policy
|
|
526
|
+
if (hiddenSlots.length > 0) {
|
|
527
|
+
designRules.slotVisibilityPolicy = "strict";
|
|
528
|
+
designRules.notes?.push(`Slots [${hiddenSlots.join(", ")}] are intentionally hidden.`);
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
const implementationHints = {
|
|
532
|
+
preferInvocationContract: true,
|
|
533
|
+
preferOverrideContract: true,
|
|
534
|
+
preferSlotContract: true,
|
|
535
|
+
avoidDeepTreeInference: true,
|
|
536
|
+
notes: [
|
|
537
|
+
"Use slotContract to identify icon identities instead of inspecting child nodes.",
|
|
538
|
+
"Follow divergenceSummary for intentional local overrides."
|
|
539
|
+
]
|
|
540
|
+
};
|
|
541
|
+
const recipe = {
|
|
542
|
+
standardType,
|
|
543
|
+
instanceSummary,
|
|
544
|
+
visibleSlots,
|
|
545
|
+
hiddenSlots,
|
|
546
|
+
textVisible,
|
|
547
|
+
textContent,
|
|
548
|
+
leadingIconVisible,
|
|
549
|
+
trailingIconVisible,
|
|
550
|
+
summary,
|
|
551
|
+
resolvedProps,
|
|
552
|
+
styleOverrides: Object.keys(styleOverrides).length > 0 ? styleOverrides : undefined,
|
|
553
|
+
invocationHint,
|
|
554
|
+
implementationMode,
|
|
555
|
+
classification,
|
|
556
|
+
slotContract,
|
|
557
|
+
designRules,
|
|
558
|
+
implementationHints,
|
|
559
|
+
overrideContract
|
|
560
|
+
};
|
|
561
|
+
recipe.invocationContract = resolveInvocationContract(node, recipe);
|
|
562
|
+
return recipe;
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* Re-resolves all instance recipes in a tree once all component definitions are available.
|
|
566
|
+
*/
|
|
567
|
+
export function relinkTreeRecipes(node, components, tokenIndex) {
|
|
568
|
+
if (node.componentId) {
|
|
569
|
+
node.recipe = resolveInstanceRecipe(node, components, tokenIndex);
|
|
570
|
+
}
|
|
571
|
+
if (node.children) {
|
|
572
|
+
for (const child of node.children) {
|
|
573
|
+
relinkTreeRecipes(child, components, tokenIndex);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
if (node.childOverrides) {
|
|
577
|
+
for (const override of node.childOverrides) {
|
|
578
|
+
// Mock a node for recipe resolution
|
|
579
|
+
const mockNode = {
|
|
580
|
+
type: "leaf",
|
|
581
|
+
name: override.name,
|
|
582
|
+
componentId: override.componentId,
|
|
583
|
+
variantSelection: override.variantSelection,
|
|
584
|
+
propertyOverrides: override.propertyOverrides,
|
|
585
|
+
rawStyles: override.rawStyles,
|
|
586
|
+
visible: override.visible !== false
|
|
587
|
+
};
|
|
588
|
+
override.recipe = resolveInstanceRecipe(mockNode, components, tokenIndex);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Resolves a visual style diff between two Figma paint JSON blocks.
|
|
594
|
+
*/
|
|
595
|
+
function resolveStyleDiff(fromRaw, toRaw, tokenIndex) {
|
|
596
|
+
try {
|
|
597
|
+
const from = JSON.parse(fromRaw);
|
|
598
|
+
const to = JSON.parse(toRaw);
|
|
599
|
+
// Only handle simple solid fills for now
|
|
600
|
+
const fromSolid = Array.isArray(from) ? from.find((f) => f.type === "SOLID") : undefined;
|
|
601
|
+
const toSolid = Array.isArray(to) ? to.find((f) => f.type === "SOLID") : undefined;
|
|
602
|
+
if (!toSolid)
|
|
603
|
+
return undefined;
|
|
604
|
+
const res = { resolution: "literal" };
|
|
605
|
+
if (toSolid.color) {
|
|
606
|
+
res.toColor = rgbToHex(toSolid.color.r, toSolid.color.g, toSolid.color.b);
|
|
607
|
+
}
|
|
608
|
+
if (toSolid.boundVariables?.color && tokenIndex) {
|
|
609
|
+
const binding = resolveTokenBindingFromIndex(toSolid.boundVariables.color.id, tokenIndex);
|
|
610
|
+
if (binding) {
|
|
611
|
+
res.toToken = binding.sourceTokenName;
|
|
612
|
+
res.toCssVar = binding.canonicalCssVar;
|
|
613
|
+
res.resolution = "token";
|
|
614
|
+
res.toBinding = binding;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
if (fromSolid) {
|
|
618
|
+
if (fromSolid.color) {
|
|
619
|
+
res.fromColor = rgbToHex(fromSolid.color.r, fromSolid.color.g, fromSolid.color.b);
|
|
620
|
+
}
|
|
621
|
+
if (fromSolid.boundVariables?.color && tokenIndex) {
|
|
622
|
+
const binding = resolveTokenBindingFromIndex(fromSolid.boundVariables.color.id, tokenIndex);
|
|
623
|
+
if (binding) {
|
|
624
|
+
res.fromToken = binding.sourceTokenName;
|
|
625
|
+
res.fromCssVar = binding.canonicalCssVar;
|
|
626
|
+
res.fromBinding = binding;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
return res;
|
|
631
|
+
}
|
|
632
|
+
catch {
|
|
633
|
+
return undefined;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Derives a code-facing invocation contract from design-time usage.
|
|
638
|
+
*/
|
|
639
|
+
function resolveInvocationContract(node, recipe) {
|
|
640
|
+
const componentName = toPascalCase((node?.name || "").split('/')[0].trim());
|
|
641
|
+
const resolvedProps = recipe?.resolvedProps ? { ...recipe.resolvedProps } : {};
|
|
642
|
+
const omitProps = [];
|
|
643
|
+
const iconBindingPolicy = {};
|
|
644
|
+
// Determine children policy
|
|
645
|
+
let childrenPolicy = "generic";
|
|
646
|
+
if (recipe?.standardType === "icon-only")
|
|
647
|
+
childrenPolicy = "none";
|
|
648
|
+
else if (recipe?.standardType === "text-only" || recipe?.textContent)
|
|
649
|
+
childrenPolicy = "text";
|
|
650
|
+
// Handle prop omission (e.g. if text is hidden, omit 'label' prop if it exists)
|
|
651
|
+
if (recipe && !recipe.textVisible) {
|
|
652
|
+
omitProps.push("label", "text", "value", "title");
|
|
653
|
+
}
|
|
654
|
+
// Icon bindings from overrides
|
|
655
|
+
if (node?.propertyOverrides && typeof node.propertyOverrides === 'object') {
|
|
656
|
+
for (const [key, value] of Object.entries(node.propertyOverrides)) {
|
|
657
|
+
const k = (key || "").toLowerCase();
|
|
658
|
+
if (k.includes("icon") && typeof value === "string") {
|
|
659
|
+
iconBindingPolicy[k] = value;
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
return {
|
|
664
|
+
componentName,
|
|
665
|
+
importName: componentName,
|
|
666
|
+
resolvedProps,
|
|
667
|
+
propSourceMap: recipe?.propSourceMap || {},
|
|
668
|
+
omitProps,
|
|
669
|
+
slotContract: recipe?.slotContract || {},
|
|
670
|
+
childrenPolicy,
|
|
671
|
+
iconBindingPolicy,
|
|
672
|
+
renderHint: recipe?.invocationHint || "",
|
|
673
|
+
overrideContract: recipe?.overrideContract
|
|
674
|
+
};
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Compiles low-level child overrides into a code-facing contract.
|
|
678
|
+
*/
|
|
679
|
+
function compileOverrideContract(childOverrides, components, tokenIndex) {
|
|
680
|
+
const contract = {
|
|
681
|
+
slotVisibility: {},
|
|
682
|
+
content: {},
|
|
683
|
+
dependency: {},
|
|
684
|
+
style: {},
|
|
685
|
+
classification: {
|
|
686
|
+
representable: [],
|
|
687
|
+
derivedButRepresentable: [],
|
|
688
|
+
nonRepresentable: [],
|
|
689
|
+
warnings: []
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
const safeArray = (val) => Array.isArray(val) ? val : [];
|
|
693
|
+
for (const override of safeArray(childOverrides)) {
|
|
694
|
+
const name = override.name || "unknown";
|
|
695
|
+
// 1. Visibility Overrides
|
|
696
|
+
if (override.visible === false) {
|
|
697
|
+
contract.slotVisibility[name] = false;
|
|
698
|
+
}
|
|
699
|
+
else if (override.visible === true) {
|
|
700
|
+
contract.slotVisibility[name] = true;
|
|
701
|
+
}
|
|
702
|
+
// 2. Content Overrides
|
|
703
|
+
if (override.textContent !== undefined) {
|
|
704
|
+
contract.content[name] = override.textContent;
|
|
705
|
+
}
|
|
706
|
+
// 3. Dependency Overrides (Swaps)
|
|
707
|
+
if (override.componentId) {
|
|
708
|
+
let dep = components.find(c => c.id === override.componentId);
|
|
709
|
+
if (!dep && /^\d+:\d+$/.test(override.componentId)) {
|
|
710
|
+
dep = components.find(c => c.id === `comp_${override.componentId.replace(/:/g, "_")}`);
|
|
711
|
+
}
|
|
712
|
+
if (dep) {
|
|
713
|
+
contract.dependency[name] = {
|
|
714
|
+
kind: "dependency",
|
|
715
|
+
componentName: dep.name,
|
|
716
|
+
importName: dep.name,
|
|
717
|
+
componentId: dep.id
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
// 4. Style Overrides (Simplistic for now, matches resolveStyleDiff logic)
|
|
722
|
+
if (override.rawStyles && (override.rawStyles.fills || override.rawStyles.strokes)) {
|
|
723
|
+
const styles = {};
|
|
724
|
+
if (override.rawStyles.fills) {
|
|
725
|
+
const fill = resolveStyleDiff("[]", JSON.stringify(override.rawStyles.fills), tokenIndex);
|
|
726
|
+
if (fill)
|
|
727
|
+
styles.fill = fill;
|
|
728
|
+
}
|
|
729
|
+
if (override.rawStyles.strokes) {
|
|
730
|
+
const stroke = resolveStyleDiff("[]", JSON.stringify(override.rawStyles.strokes), tokenIndex);
|
|
731
|
+
if (stroke)
|
|
732
|
+
styles.stroke = stroke;
|
|
733
|
+
}
|
|
734
|
+
if (Object.keys(styles).length > 0) {
|
|
735
|
+
contract.style[name] = styles;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
// Basic classification
|
|
740
|
+
contract.classification.representable = [
|
|
741
|
+
...Object.keys(contract.slotVisibility),
|
|
742
|
+
...Object.keys(contract.content),
|
|
743
|
+
...Object.keys(contract.dependency)
|
|
744
|
+
];
|
|
745
|
+
return contract;
|
|
746
|
+
}
|
|
747
|
+
//# sourceMappingURL=instance-resolver.js.map
|