Skip to content

PLASMA-7803: styles-API aggregator - #497

Merged
vkaltyrin merged 1 commit into
developfrom
feature/vakaltyrin/api-style-aggregator
Jul 30, 2026
Merged

PLASMA-7803: styles-API aggregator#497
vkaltyrin merged 1 commit into
developfrom
feature/vakaltyrin/api-style-aggregator

Conversation

@vkaltyrin

@vkaltyrin vkaltyrin commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

  • New Features
    • Expanded editable-field appearance customization with icon colors (default/readonly), cursor color, disabled-state transparency, typography, and sizing options (with an explicit initializer and defaults).
  • Documentation
    • Improved and expanded API metadata annotations across many component appearance definitions to keep naming and discovery consistent.
  • Chores
    • Added an automated API-metadata generator tool and script, and updated the generated iOS theme appearance metadata (including marking previously-unmapped params).

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@vkaltyrin, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 56 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 7937a723-e99c-4f95-ad30-7dbfb2846be1

📥 Commits

Reviewing files that changed from the base of the PR and between 52313d5 and 093ff4b.

⛔ Files ignored due to path filters (1)
  • Tools/SDDSApiInfoGenerator/Package.resolved is excluded by !**/Package.resolved
📒 Files selected for processing (83)
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAccordion/AccordionAppearance/AccordionAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAccordionItem/AccordionItemAppearance/AccordionItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAutocomplete/AutocompleteAppearance/AutocompleteAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatar/AvatarAppearance/AvatarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatarGroup/AvatarGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatarGroup/SDDSAvatarGroup.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSBadge/BadgeAppearance/BadgeAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSBadge/BadgeAppearance/BadgeSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSBottomSheet/BottomSheetAppearance/BottomSheetAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSButton/ButtonAppearance/ButtonAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSButton/ButtonAppearance/ButtonSize.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSButtonGroup/ButtonGroupAppearance/ButtonGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCard/CardAppearance/CardAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCarousel/CarouselAppearance/CarouselAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCell/CellAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCheckbox/CheckboxAppearance/CheckboxAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCheckboxGroup/CheckboxGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCheckboxGroup/SDDSCheckboxGroup.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSChip/ChipAppearance/ChipAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSChip/ChipAppearance/ChipSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSChipGroup/ChipGroupAppearance/ChipGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCircularProgressBar/CircularProgressBarAppearance/CircularProgressBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCodeField/CodeFieldAppearance/CodeFieldAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCodeInput/CodeInputAppearance/CodeInputAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCollapsingNavigationBar/CollapsingNavigationBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCounter/CounterAppearance/CounterAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCounter/CounterAppearance/CounterSize.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSDivider/DividerAppearance/DividerAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSDrawer/DrawerAppearance/DrawerAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSDropdownMenu/DropdownMenuAppearance/DropdownMenuAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSEditable/EditableAppearance/EditableAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSFormItem/FormItemAppearance/FormItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSImage/ImageAppearance/ImageAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSIndicator/IndicatorAppearance/IndicatorAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSList/ListAppearance/ListAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSListItem/ListItemAppearance/ListItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSLoader/LoaderAppearance/LoaderAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSModal/ModalAppearance/ModalAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNavigationBarInternalPage/NavigationBarInternalPageAppearance/NavigationBarInternalPageAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNavigationBarMainPage/NavigationBarMainPageAppearance/NavigationBarMainPageAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNote/NoteAppearance/NoteAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNoteCompact/NoteCompactAppearance/NoteCompactAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNotification/NotificationAppearance/NotificationAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNotificationContent/NotificationContentAppearance/NotificationContentAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSOverlay/OverlayAppearance/OverlayAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSPaginationDots/PaginationDotsAppearance/PaginationDotsAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSPopover/PopoverAppearance/PopoverAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSProgressBar/ProgressBarAppearance/ProgressBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSProgressBar/ProgressBarAppearance/ProgressBarSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRadiobox/RadioboxAppearance/RadioboxAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRadioboxGroup/Appearance/RadioboxGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRadioboxGroup/SDDSRadioboxGroup.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRectSkeleton/SkeletonAppearance/SkeletonAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSScrollbar/ScrollbarAppearance/ScrollbarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSegment/SegmentAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSegmentItem/SegmentItemAppearance/SegmentItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSelect/SelectAppearance/SelectAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSelectItem/SelectItemAppearance/SelectItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSpinner/SpinnerAppearance/SpinnerAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSwitch/SwitchAppearance/SwitchAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabBar/TabBarAppearance/TabBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabBar/TabBarIslandAppearance/TabBarIslandAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabBar/TabBarItemAppearance/TabBarItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabs/TabItemAppearance/TabItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabs/TabsAppearance/TabsAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTextArea/TextAreaAppearance/TextAreaAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTextField/TextFieldAppearance/TextFieldAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTextField/TextFieldAppearance/TextFieldSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSToast/ToastAppearance/ToastAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSToolbar/ToolbarAppearance/ToolbarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTooltip/TooltipAppearance/TooltipAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSWheel/WheelAppearance/WheelAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Views/SelectionControl/SelectionControlSizeConfiguration.swift
  • SDDSThemeBuilder/.sdds/ios-api-meta.json
  • Tools/SDDSApiInfoGenerator/Package.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Meta.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/PropsCatalog.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Reconciler.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Scanner.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/SymbolTable.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/TypeCategory.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift
  • scripts/generate_api_meta.sh
📝 Walkthrough

Walkthrough

Adds SDDS API metadata markers across component appearance declarations, introduces a SwiftSyntax-based generator with Props reconciliation and marker-plan support, and updates generated iOS appearance metadata with explicit unmapped parameters.

Changes

iOS API metadata generation

Layer / File(s) Summary
Component API markers
SDDSComponents/Sources/SDDSComponents/Components/...
Adds sdds:apiInfo and sdds:apiName comments across appearance and size configurations; expands EditableAppearance with additional properties and an explicit initializer.
Metadata models and symbol extraction
Tools/SDDSApiInfoGenerator/Package.swift, Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/*
Adds Codable metadata models, SwiftSyntax symbol extraction, type categorization, and Props field cataloging.
Scanning, reconciliation, and CLI generation
Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/*, scripts/generate_api_meta.sh
Scans annotated components, expands properties, reconciles Appearance parameters with Props fields, supports marker-plan/report modes, and provides a generation script.
Generated metadata
SDDSThemeBuilder/.sdds/ios-api-meta.json
Marks generated parameters without Appearance mappings using unmapped: true.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GenerationScript
  participant MetadataGenerator
  participant SymbolTable
  participant Scanner
  participant Reconciler
  participant MetadataJSON
  GenerationScript->>MetadataGenerator: build and run
  MetadataGenerator->>SymbolTable: parse Swift sources
  MetadataGenerator->>Scanner: scan annotated components
  Scanner->>Reconciler: match component fields and appearance params
  Reconciler-->>MetadataGenerator: return reconciled metadata
  MetadataGenerator->>MetadataJSON: serialize generated components
Loading

Possibly related PRs

Suggested reviewers: angirb

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main change: introducing an API metadata/style aggregation pipeline and related generator tooling.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/vakaltyrin/api-style-aggregator

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatarGroup/SDDSAvatarGroup.swift`:
- Around line 132-135: Correct the sdds:apiName annotations in
AvatarGroupSizeConfiguration so itemSpacing maps to the borderWidth property and
itemOffset maps to the spacing property as intended, then regenerate the
associated API metadata file.

In `@Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift`:
- Around line 147-159: The generator must reject --output generation when
reconciliation reports contain gaps, unless the explicit override option is
enabled; add this validation to the flow using reports before writing output. In
Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift lines
147-159, preserve report collection while ensuring unresolved gaps fail
generation. In SDDSThemeBuilder/.sdds/ios-api-meta.json lines 274-283, fix the
Avatar mapping and regenerate the metadata to remove the unresolved placeholder.

In `@Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Reconciler.swift`:
- Around line 62-95: The reconciliation flow in Reconciler.swift must reserve
each matched parameter identity across marker, override, and bestMatch
selections; reject or skip candidates whose normalized methodName is already in
usedParamKeys, and report duplicate claims. Apply this consistently to all three
matching paths so incompatible config IDs cannot share one target. Regenerate
SDDSThemeBuilder/.sdds/ios-api-meta.json for lines 2957-3004 after correcting
the duplicate textTypography mapping.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 391d0932-a443-4e00-8d03-00da97b06b8e

📥 Commits

Reviewing files that changed from the base of the PR and between 8ea2eab and 1a1fed9.

⛔ Files ignored due to path filters (1)
  • Tools/SDDSApiInfoGenerator/Package.resolved is excluded by !**/Package.resolved
📒 Files selected for processing (83)
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAccordion/AccordionAppearance/AccordionAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAccordionItem/AccordionItemAppearance/AccordionItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAutocomplete/AutocompleteAppearance/AutocompleteAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatar/AvatarAppearance/AvatarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatarGroup/AvatarGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSAvatarGroup/SDDSAvatarGroup.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSBadge/BadgeAppearance/BadgeAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSBadge/BadgeAppearance/BadgeSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSBottomSheet/BottomSheetAppearance/BottomSheetAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSButton/ButtonAppearance/ButtonAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSButton/ButtonAppearance/ButtonSize.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSButtonGroup/ButtonGroupAppearance/ButtonGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCard/CardAppearance/CardAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCarousel/CarouselAppearance/CarouselAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCell/CellAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCheckbox/CheckboxAppearance/CheckboxAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCheckboxGroup/CheckboxGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCheckboxGroup/SDDSCheckboxGroup.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSChip/ChipAppearance/ChipAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSChip/ChipAppearance/ChipSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSChipGroup/ChipGroupAppearance/ChipGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCircularProgressBar/CircularProgressBarAppearance/CircularProgressBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCodeField/CodeFieldAppearance/CodeFieldAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCodeInput/CodeInputAppearance/CodeInputAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCollapsingNavigationBar/CollapsingNavigationBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCounter/CounterAppearance/CounterAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSCounter/CounterAppearance/CounterSize.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSDivider/DividerAppearance/DividerAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSDrawer/DrawerAppearance/DrawerAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSDropdownMenu/DropdownMenuAppearance/DropdownMenuAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSEditable/EditableAppearance/EditableAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSFormItem/FormItemAppearance/FormItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSImage/ImageAppearance/ImageAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSIndicator/IndicatorAppearance/IndicatorAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSList/ListAppearance/ListAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSListItem/ListItemAppearance/ListItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSLoader/LoaderAppearance/LoaderAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSModal/ModalAppearance/ModalAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNavigationBarInternalPage/NavigationBarInternalPageAppearance/NavigationBarInternalPageAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNavigationBarMainPage/NavigationBarMainPageAppearance/NavigationBarMainPageAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNote/NoteAppearance/NoteAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNoteCompact/NoteCompactAppearance/NoteCompactAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNotification/NotificationAppearance/NotificationAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSNotificationContent/NotificationContentAppearance/NotificationContentAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSOverlay/OverlayAppearance/OverlayAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSPaginationDots/PaginationDotsAppearance/PaginationDotsAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSPopover/PopoverAppearance/PopoverAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSProgressBar/ProgressBarAppearance/ProgressBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSProgressBar/ProgressBarAppearance/ProgressBarSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRadiobox/RadioboxAppearance/RadioboxAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRadioboxGroup/Appearance/RadioboxGroupAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRadioboxGroup/SDDSRadioboxGroup.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSRectSkeleton/SkeletonAppearance/SkeletonAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSScrollbar/ScrollbarAppearance/ScrollbarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSegment/SegmentAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSegmentItem/SegmentItemAppearance/SegmentItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSelect/SelectAppearance/SelectAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSelectItem/SelectItemAppearance/SelectItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSpinner/SpinnerAppearance/SpinnerAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSSwitch/SwitchAppearance/SwitchAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabBar/TabBarAppearance/TabBarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabBar/TabBarIslandAppearance/TabBarIslandAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabBar/TabBarItemAppearance/TabBarItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabs/TabItemAppearance/TabItemAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTabs/TabsAppearance/TabsAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTextArea/TextAreaAppearance/TextAreaAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTextField/TextFieldAppearance/TextFieldAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTextField/TextFieldAppearance/TextFieldSizeConfiguration.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSToast/ToastAppearance/ToastAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSToolbar/ToolbarAppearance/ToolbarAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSTooltip/TooltipAppearance/TooltipAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Components/SDDSWheel/WheelAppearance/WheelAppearance.swift
  • SDDSComponents/Sources/SDDSComponents/Views/SelectionControl/SelectionControlSizeConfiguration.swift
  • SDDSThemeBuilder/.sdds/ios-api-meta.json
  • Tools/SDDSApiInfoGenerator/Package.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Meta.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/PropsCatalog.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Reconciler.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Scanner.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/SymbolTable.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/TypeCategory.swift
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift
  • scripts/generate_api_meta.sh

Comment on lines +147 to +159
for meta in scanned {
if let fields = propsCatalog?.fields(forComponent: meta.componentName), !fields.isEmpty {
let (reconciled, report) = reconciler.reconcile(
meta: meta,
fields: fields,
overrides: overrides[meta.componentName] ?? [:]
)
components.append(reconciled)
reports.append(report)
} else {
components.append(meta)
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

The generator publishes unresolved reconciliation gaps. Gaps only reach stderr reporting, while output generation succeeds and writes metadata with empty targets.

  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift#L147-L159: reject --output generation when reports contain gaps, unless explicitly overridden.
  • SDDSThemeBuilder/.sdds/ios-api-meta.json#L274-L283: remove the unresolved Avatar placeholder by fixing its mapping and regenerating.
📍 Affects 2 files
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift#L147-L159 (this comment)
  • SDDSThemeBuilder/.sdds/ios-api-meta.json#L274-L283
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift` around
lines 147 - 159, The generator must reject --output generation when
reconciliation reports contain gaps, unless the explicit override option is
enabled; add this validation to the flow using reports before writing output. In
Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/main.swift lines
147-159, preserve report collection while ensuring unresolved gaps fail
generation. In SDDSThemeBuilder/.sdds/ios-api-meta.json lines 274-283, fix the
Avatar mapping and regenerate the metadata to remove the unresolved placeholder.

Comment on lines +62 to +95
if let match = index[Self.normalize(field.id)]?.first(where: {
Self.normalize($0.id) == Self.normalize(field.id) && $0.id != $0.methodName
}) {
usedParamKeys.insert(Self.normalize(match.methodName))
newParams.append(Param(
type: match.type, id: field.id, methodName: match.methodName, paramName: match.paramName,
paramQualifiedType: match.paramQualifiedType, paramSimpleType: match.paramSimpleType,
valueQualifiedType: match.valueQualifiedType, group: match.group
))
continue
}
// Курируемый override (sidecar) — для структурных исключений, если заданы.
if let target = overrides[field.id],
let match = index[Self.normalize(target)]?.first {
usedParamKeys.insert(Self.normalize(match.methodName))
newParams.append(Param(
type: match.type, id: field.id, methodName: match.methodName, paramName: match.paramName,
paramQualifiedType: match.paramQualifiedType, paramSimpleType: match.paramSimpleType,
valueQualifiedType: match.valueQualifiedType, group: match.group
))
continue
}
if let match = bestMatch(for: field, in: index) {
usedParamKeys.insert(Self.normalize(match.methodName))
newParams.append(Param(
type: match.type,
id: field.id,
methodName: match.methodName,
paramName: match.paramName,
paramQualifiedType: match.paramQualifiedType,
paramSimpleType: match.paramSimpleType,
valueQualifiedType: match.valueQualifiedType,
group: match.group
))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Reconciliation permits duplicate Appearance targets. Selected params are tracked only for drift reporting, not excluded from subsequent matches, allowing incompatible config IDs to share one target.

  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Reconciler.swift#L62-L95: reserve a unique parameter identity across marker, override, and heuristic matching; report duplicate claims.
  • SDDSThemeBuilder/.sdds/ios-api-meta.json#L2957-L3004: regenerate after correcting the duplicate textTypography mapping.
📍 Affects 2 files
  • Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Reconciler.swift#L62-L95 (this comment)
  • SDDSThemeBuilder/.sdds/ios-api-meta.json#L2957-L3004
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Tools/SDDSApiInfoGenerator/Sources/SDDSApiInfoGenerator/Reconciler.swift`
around lines 62 - 95, The reconciliation flow in Reconciler.swift must reserve
each matched parameter identity across marker, override, and bestMatch
selections; reject or skip candidates whose normalized methodName is already in
usedParamKeys, and report duplicate claims. Apply this consistently to all three
matching paths so incompatible config IDs cannot share one target. Regenerate
SDDSThemeBuilder/.sdds/ios-api-meta.json for lines 2957-3004 after correcting
the duplicate textTypography mapping.

@vkaltyrin vkaltyrin changed the title feat(sdds-icore/theme-builder): add iOS styles-API aggregator (annota… PLASMA-7803: iOS styles-API aggregator Jul 29, 2026
@vkaltyrin vkaltyrin changed the title PLASMA-7803: iOS styles-API aggregator PLASMA-7803: styles-API aggregator Jul 29, 2026
@@ -0,0 +1,32 @@
#!/usr/bin/env bash

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это просто скрипт?
не часть cli?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Надо держать в голове, что все инструменты по генерации кода, сборке документации, демо-приложений будут использоваться общей CLI. Поэтому возможно стоит подумать, чтобы собирать iOS tools как один общий бинарь

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ага, пока отдельный SPM-бинарь + скрипт-обёртка. отдельно от ThemeBuilder, тк он на xcodebuild и swift-syntax через SPM не подтянуть. сведу iOS-тулы в общий CLI в рамках задачи на универсальный генератор 👍

@@ -0,0 +1,9193 @@
[

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Результат выглядит норм. Теперь главное, чтобы его хватило универсальному генератору стилей)

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

схема параметров как раз под контракт генератора. разводку сделаем в задаче на универсальный генератор, там и проверим на реальной генерации

"group" : "root",
"id" : "shape",
"methodName" : "",
"paramName" : "",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут данных почему-то нет

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это намеренно, у таких id нет пары в iOS Appearance: либо ручки на iOS вообще нет (как shape у BottomSheet), либо структурный кейс, где iOS схлопывает в одно свойство (paddingStart/End → EdgeInsets, offsetX/Y → CGPoint). добавил таким записям unmapped: true, чтоб не читалось как баг (пустой methodName = «id известен, прямого свойства нет», генератор их обрабатывает особо)

"group" : "root",
"id" : "minWidth",
"methodName" : "",
"paramName" : "",

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

тут и выше/ниже тоже нет

@vkaltyrin vkaltyrin Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

то же самое, пометил unmapped: true

@vkaltyrin
vkaltyrin force-pushed the feature/vakaltyrin/api-style-aggregator branch from 52313d5 to 093ff4b Compare July 30, 2026 06:54
@vkaltyrin
vkaltyrin merged commit d3537b9 into develop Jul 30, 2026
3 of 4 checks passed
@vkaltyrin
vkaltyrin deleted the feature/vakaltyrin/api-style-aggregator branch July 30, 2026 06:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

changelog-skip Skip this PR in changelog

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants