Skip to content

fix(upgrade): don't migrate variant prop values in expressions or comments - #20535

Draft
Dextheking1 wants to merge 2 commits into
tailwindlabs:mainfrom
Dextheking1:fix/upgrade-codemod-variant-conditional
Draft

Dextheking1 wants to merge 2 commits into
tailwindlabs:mainfrom
Dextheking1:fix/upgrade-codemod-variant-conditional

Conversation

@Dextheking1

Copy link
Copy Markdown
Contributor

Fixes #20435.

The is-safe-migration guard for shadcn/ui variant props only looked at the text right before the candidate, so any conditional between the prop and the string defeated it. variant={isActive ? "outline" : "ghost"} had outline rewritten to outline-solid, breaking typed variant props loudly and untyped ones silently.

The guard now scans the prop value as an expression: strings inside ternaries, ??, and comparisons are left alone, while a sibling prop after the variant value (e.g. className="outline") still migrates. Candidates inside // and /* */ comments are skipped too; comment prose is not a class name.

Verified: added 11 cases to is-safe-migration.test.ts. 9 fail on pristine code, all 79 pass with the fix. Prettier clean.

…omments

The is-safe-migration guard for shadcn/ui `variant` props only looked at
the text immediately before the candidate, so a conditional between the
prop and the string (e.g. `variant={isActive ? "outline" : "ghost"}`)
defeated it and the codemod rewrote variant names like `outline` to
`outline-solid`. Scan the prop value as an expression instead, so strings
inside ternaries, `??`, and comparisons are left alone. Also skip
candidates inside `//` and `/* */` comments, which are prose, not classes.

Fixes tailwindlabs#20435.
…omments

The is-safe-migration guard for shadcn/ui `variant` props only looked at
the text immediately before the candidate, so a conditional between the
prop and the string (e.g. `variant={isActive ? "outline" : "ghost"}`)
defeated it and the codemod rewrote variant names like `outline` to
`outline-solid`. Scan the prop value as an expression instead, so strings
inside ternaries, `??`, and comparisons are left alone. Also skip
candidates inside `//` and `/* */` comments, which are prose, not classes.

Fixes tailwindlabs#20435.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Upgrade codemod rewrites variant="outline" to "outline-solid" inside conditional expressions

1 participant