feat: MUI 4 to BUI migration - form control codemods (#122, #123, #124, #125, #126)#131
Open
schultzp2020 wants to merge 6 commits into
Open
feat: MUI 4 to BUI migration - form control codemods (#122, #123, #124, #125, #126)#131schultzp2020 wants to merge 6 commits into
schultzp2020 wants to merge 6 commits into
Conversation
Add 5 form control codemods: - migrate-mui-select-family-to-bui-select (#122) - migrate-mui-textfield-to-bui-textfield (#123) - migrate-mui-accordion-to-bui-accordion (#124) - migrate-mui-radio-checkbox-groups-to-bui-groups (#125) - migrate-mui-slider-to-bui-slider (#126) Closes #122, #123, #124, #125, #126
Use Promise.resolve returns and remove non-null assertions to satisfy oxlint --deny-warnings in CI. Co-authored-by: Cursor <cursoragent@cursor.com>
Rename @backstage/migrate-mui-radio-checkbox-groups-to-bui-groups (58 chars) to @backstage/migrate-mui-radio-checkbox-to-bui (44 chars) and regenerate README. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Pull request overview
Adds five new AST-based codemods under codemods/misc/ to support the Backstage MUI v4 → BUI form-control migration (Select family, TextField, Accordion, Radio/Checkbox groups, Slider), along with tests, workflows, and repository documentation/changesets.
Changes:
- Introduces new codemod packages (scripts, workflows, metadata) for the five form-control migrations.
- Adds fixture-based tests + metrics snapshots for each codemod’s expected transformations/TODO behavior.
- Updates root documentation and workspace metadata (README, changeset, yarn.lock) to include the new codemods.
Reviewed changes
Copilot reviewed 132 out of 133 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| yarn.lock | Adds workspace entries for the five new misc codemod packages. |
| README.md | Lists the new misc codemods in the repository index. |
| .changeset/mui-to-bui-form-controls.md | Changeset covering initial minor releases for the five new codemod packages. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/workflow.yaml | Workflow definition for the TextField codemod. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tsconfig.json | TypeScript config for the TextField codemod scripts. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/noop-no-import/input.tsx | No-op fixture when already using BUI TextField (input). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/noop-no-import/expected.tsx | No-op fixture when already using BUI TextField (expected). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/multiline-todo/metrics.json | Metrics snapshot for multiline TODO behavior. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/multiline-todo/input.tsx | Multiline TextField fixture (input). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/multiline-todo/expected.tsx | Multiline TextField fixture with TODO marker (expected). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/merge-existing-bui/metrics.json | Metrics snapshot for merging into existing @backstage/ui import. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/merge-existing-bui/input.tsx | Fixture for merging BUI import and rewriting onChange (input). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/merge-existing-bui/expected.tsx | Fixture for merging BUI import and rewriting onChange (expected). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/disabled-and-fullwidth/metrics.json | Metrics snapshot for disabled/fullWidth handling. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/disabled-and-fullwidth/input.tsx | Disabled + fullWidth fixture (input). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/disabled-and-fullwidth/expected.tsx | Disabled + fullWidth fixture w/ TODO and prop rename (expected). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/complex-on-change-todo/metrics.json | Metrics snapshot for complex onChange TODO behavior. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/complex-on-change-todo/input.tsx | Complex onChange fixture (input). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/complex-on-change-todo/expected.tsx | Complex onChange fixture with TODO marker (expected). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/basic-controlled/metrics.json | Metrics snapshot for basic controlled TextField migration. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/basic-controlled/input.tsx | Basic controlled TextField fixture (input). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/tests/basic-controlled/expected.tsx | Basic controlled TextField fixture (expected). |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/scripts/codemod.ts | AST-based transform for migrating MUI TextField → BUI TextField. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/package.json | Declares the TextField codemod workspace package and test script. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/codemod.yaml | Codemod registry metadata for the TextField migration. |
| codemods/misc/migrate-mui-textfield-to-bui-textfield/CHANGELOG.md | Initializes changelog for the TextField codemod. |
| codemods/misc/migrate-mui-slider-to-bui-slider/workflow.yaml | Workflow definition for the Slider codemod. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tsconfig.json | TypeScript config for the Slider codemod scripts. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/value-label-todo/metrics.json | Metrics snapshot for value label TODO behavior. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/value-label-todo/input.tsx | Slider with valueLabelDisplay fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/value-label-todo/expected.tsx | Slider with valueLabelDisplay fixture w/ TODO (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/step-and-default-value/metrics.json | Metrics snapshot for min/max rename and step/defaultValue passthrough. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/step-and-default-value/input.tsx | Slider step/defaultValue fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/step-and-default-value/expected.tsx | Slider step/defaultValue fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/on-change-committed-todo/metrics.json | Metrics snapshot for onChangeCommitted → onChangeEnd rewrite. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/on-change-committed-todo/input.tsx | onChangeCommitted fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/on-change-committed-todo/expected.tsx | onChangeCommitted → onChangeEnd fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/noop-no-import/input.tsx | No-op fixture when already using BUI Slider (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/noop-no-import/expected.tsx | No-op fixture when already using BUI Slider (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/no-min-max/metrics.json | Metrics snapshot for slider migration without min/max. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/no-min-max/input.tsx | Slider without min/max fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/no-min-max/expected.tsx | Slider without min/max fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/named-barrel-import/metrics.json | Metrics snapshot for named barrel import case. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/named-barrel-import/input.tsx | Named barrel import fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/named-barrel-import/expected.tsx | Named barrel import fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/merge-existing-bui/metrics.json | Metrics snapshot for merging into existing @backstage/ui import. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/merge-existing-bui/input.tsx | Merge-existing-bui fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/merge-existing-bui/expected.tsx | Merge-existing-bui fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/marks-todo/metrics.json | Metrics snapshot for marks TODO behavior. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/marks-todo/input.tsx | Slider marks fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/marks-todo/expected.tsx | Slider marks fixture w/ TODO (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/disabled-and-aria/metrics.json | Metrics snapshot for disabled + aria passthrough. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/disabled-and-aria/input.tsx | Disabled + aria fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/disabled-and-aria/expected.tsx | Disabled + aria fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/complex-on-change-todo/metrics.json | Metrics snapshot for complex onChange TODO behavior. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/complex-on-change-todo/input.tsx | Complex onChange fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/complex-on-change-todo/expected.tsx | Complex onChange fixture w/ TODO (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/basic-slider/metrics.json | Metrics snapshot for basic slider migration. |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/basic-slider/input.tsx | Basic slider fixture (input). |
| codemods/misc/migrate-mui-slider-to-bui-slider/tests/basic-slider/expected.tsx | Basic slider fixture (expected). |
| codemods/misc/migrate-mui-slider-to-bui-slider/scripts/codemod.ts | AST-based transform for migrating MUI Slider → BUI Slider. |
| codemods/misc/migrate-mui-slider-to-bui-slider/package.json | Declares the Slider codemod workspace package and test script. |
| codemods/misc/migrate-mui-slider-to-bui-slider/codemod.yaml | Codemod registry metadata for the Slider migration. |
| codemods/misc/migrate-mui-slider-to-bui-slider/CHANGELOG.md | Initializes changelog for the Slider codemod. |
| codemods/misc/migrate-mui-select-family-to-bui-select/workflow.yaml | Workflow definition for the Select-family codemod. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tsconfig.json | TypeScript config for the Select-family codemod scripts. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/noop-no-import/input.tsx | No-op fixture when already using BUI Select (input). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/noop-no-import/expected.tsx | No-op fixture when already using BUI Select (expected). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/named-barrel-import/metrics.json | Metrics snapshot for named barrel import migration. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/named-barrel-import/input.tsx | Named barrel import Select-wrapper fixture (input). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/named-barrel-import/expected.tsx | Named barrel import Select-wrapper fixture (expected). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/multiple-select-todo/metrics.json | Metrics snapshot for multiple-select TODO behavior. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/multiple-select-todo/input.tsx | Multiple-select fixture (input). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/multiple-select-todo/expected.tsx | Multiple-select fixture w/ TODO marker (expected). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/merge-existing-bui/metrics.json | Metrics snapshot for merging into existing @backstage/ui import. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/merge-existing-bui/input.tsx | Merge-existing-bui Select-wrapper fixture (input). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/merge-existing-bui/expected.tsx | Merge-existing-bui Select-wrapper fixture (expected). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/helper-text-todo/metrics.json | Metrics snapshot for helper-text TODO behavior. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/helper-text-todo/input.tsx | Helper text wrapper fixture (input). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/helper-text-todo/expected.tsx | Helper text wrapper fixture w/ TODO marker (expected). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/basic-form-control/metrics.json | Metrics snapshot for basic wrapper migration. |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/basic-form-control/input.tsx | Basic wrapper migration fixture (input). |
| codemods/misc/migrate-mui-select-family-to-bui-select/tests/basic-form-control/expected.tsx | Basic wrapper migration fixture (expected). |
| codemods/misc/migrate-mui-select-family-to-bui-select/scripts/codemod.ts | AST-based transform for collapsing MUI Select wrappers into BUI Select. |
| codemods/misc/migrate-mui-select-family-to-bui-select/package.json | Declares the Select-family codemod workspace package and test script. |
| codemods/misc/migrate-mui-select-family-to-bui-select/codemod.yaml | Codemod registry metadata for the Select-family migration. |
| codemods/misc/migrate-mui-select-family-to-bui-select/CHANGELOG.md | Initializes changelog for the Select-family codemod. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/workflow.yaml | Workflow definition for radio/checkbox group codemod. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tsconfig.json | TypeScript config for radio/checkbox group codemod scripts. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/simple-radio-group/metrics.json | Metrics snapshot for simple RadioGroup migration. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/simple-radio-group/input.tsx | Simple RadioGroup fixture (input). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/simple-radio-group/expected.tsx | Simple RadioGroup fixture (expected). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/simple-checkbox-group/metrics.json | Metrics snapshot for simple FormGroup→CheckboxGroup migration. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/simple-checkbox-group/input.tsx | Simple checkbox group fixture (input). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/simple-checkbox-group/expected.tsx | Simple checkbox group fixture (expected). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/noop-no-import/input.tsx | No-op fixture when already using BUI RadioGroup/Radio (input). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/noop-no-import/expected.tsx | No-op fixture when already using BUI RadioGroup/Radio (expected). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/named-barrel-import/metrics.json | Metrics snapshot for named barrel import case. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/named-barrel-import/input.tsx | Named barrel import RadioGroup fixture (input). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/named-barrel-import/expected.tsx | Named barrel import RadioGroup fixture (expected). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/merge-existing-bui/metrics.json | Metrics snapshot for merging into existing @backstage/ui import. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/merge-existing-bui/input.tsx | Merge-existing-bui RadioGroup fixture (input). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/merge-existing-bui/expected.tsx | Merge-existing-bui RadioGroup fixture (expected). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/complex-form-group-todo/metrics.json | Metrics snapshot for complex form group TODO behavior. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/complex-form-group-todo/input.tsx | Complex FormGroup fixture (input). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/tests/complex-form-group-todo/expected.tsx | Complex FormGroup fixture w/ TODO marker (expected). |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/scripts/codemod.ts | AST-based transform for migrating MUI choice groups to BUI groups. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/package.json | Declares the radio/checkbox group codemod workspace package and test script. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/codemod.yaml | Codemod registry metadata for the radio/checkbox group migration. |
| codemods/misc/migrate-mui-radio-checkbox-groups-to-bui-groups/CHANGELOG.md | Initializes changelog for the radio/checkbox group codemod. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/workflow.yaml | Workflow definition for the Accordion codemod. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tsconfig.json | TypeScript config for the Accordion codemod scripts. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/simple-accordion/metrics.json | Metrics snapshot for simple Accordion migration. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/simple-accordion/input.tsx | Simple Accordion fixture (input). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/simple-accordion/expected.tsx | Simple Accordion fixture (expected). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/noop-no-import/input.tsx | No-op fixture when already using BUI Accordion (input). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/noop-no-import/expected.tsx | No-op fixture when already using BUI Accordion (expected). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/named-barrel-import/metrics.json | Metrics snapshot for named barrel import case. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/named-barrel-import/input.tsx | Named barrel import Accordion fixture (input). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/named-barrel-import/expected.tsx | Named barrel import Accordion fixture (expected). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/merge-existing-bui/metrics.json | Metrics snapshot for merging into existing @backstage/ui import. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/merge-existing-bui/input.tsx | Merge-existing-bui Accordion fixture (input). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/merge-existing-bui/expected.tsx | Merge-existing-bui Accordion fixture (expected). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/controlled-todo/metrics.json | Metrics snapshot for controlled Accordion TODO behavior. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/controlled-todo/input.tsx | Controlled Accordion fixture (input). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/controlled-todo/expected.tsx | Controlled Accordion fixture w/ TODO marker (expected). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/complex-summary-todo/metrics.json | Metrics snapshot for complex summary TODO behavior. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/complex-summary-todo/input.tsx | Complex summary fixture (input). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/tests/complex-summary-todo/expected.tsx | Complex summary fixture w/ TODO marker (expected). |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/scripts/codemod.ts | AST-based transform for migrating MUI Accordion → BUI Accordion components. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/package.json | Declares the Accordion codemod workspace package and test script. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/codemod.yaml | Codemod registry metadata for the Accordion migration. |
| codemods/misc/migrate-mui-accordion-to-bui-accordion/CHANGELOG.md | Initializes changelog for the Accordion codemod. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace removable MUI imports with BUI imports when no anchor exists, escape accordion/select string attrs via JSON.stringify, and update fixtures for clean import removal. Co-authored-by: Cursor <cursoragent@cursor.com>
Comment on lines
+375
to
+378
| const checkedRaw = getPropRawValue(controlEl, 'checked') | ||
| if (checkedRaw !== null) { | ||
| props.push(`isSelected=${checkedRaw}`) | ||
| } |
Comment on lines
+274
to
+281
| const valueText = valueParam.text() | ||
| const body = arrow.field('body') | ||
| if (!body) { | ||
| return null | ||
| } | ||
|
|
||
| const bodyText = body.text() | ||
| return `{${valueText} => ${bodyText}}` |
Handle bare Checkbox checked attributes, extract slider handler param identifiers without type annotations, and dedupe codemod.yaml keywords. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add 5 form control codemods for the MUI 4 to BUI migration:
@backstage/migrate-mui-select-family-to-bui-select@backstage/migrate-mui-textfield-to-bui-textfield@backstage/migrate-mui-accordion-to-bui-accordion@backstage/migrate-mui-radio-checkbox-to-bui@backstage/migrate-mui-slider-to-bui-sliderNote: the radio/checkbox codemod package is intentionally named
@backstage/migrate-mui-radio-checkbox-to-bui(not...-groups-to-bui-groups) to satisfy npm's 50-character package name limit.All codemods use AST-based transforms (JSSG/ast-grep). All tests pass. All workflows validate.
Closes #122
Closes #123
Closes #124
Closes #125
Closes #126