-
Notifications
You must be signed in to change notification settings - Fork 4.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add CSS codemods for migrating @layer utilities
#14455
Merged
Merged
+1,234
−3
Conversation
This file contains 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
RobinMalfait
force-pushed
the
feat/add-codemod-tooling
branch
from
September 18, 2024 13:49
bc9b0a7
to
330dbff
Compare
RobinMalfait
force-pushed
the
feat/css-codemods-at-layer-utilities
branch
from
September 18, 2024 13:51
c0636e0
to
ebf5a17
Compare
RobinMalfait
changed the title
Add codemods for
Add CSS codemods for migrating Sep 18, 2024
@layer utilities
@layer utilities
RobinMalfait
force-pushed
the
feat/css-codemods-at-layer-utilities
branch
7 times, most recently
from
September 23, 2024 20:24
161b22f
to
e361319
Compare
This was unnecessary. Not related to this PR, but also not worth a separate PR. Can probably move this commit directly to the main branch.
A bit of a vague commit message, but this does a lot of things. I could split it up, but not sure if it's worth it. Instead, let's talk about it. While working on keeping track of comment locations I was running into some issues. Not the end of the world, but we could make things better. Paired with Jordan on this to rework the algorithm. The idea is that we now do multiple passes which is technically slower, but now we can work on separate units of work. - Step #1 is to prepare the at-rule. This means that rules with multiple selectors will be split in multiple nodes with the their own single selector. - Step #2 is to collect all the classes we want to create an `@utility` for. - Step #3 is to create a clone of the main `@layer utilities` for all the non-`@utility` leftover nodes (E.g.: rules with element and ID selectors). - Step #4 is to create a clone of the main `@layer utilities` node for every single `@utility <name>` we want to create. - Step #5 is to go over every clone, and eliminate everything that is not part of the `@utility` in question. So we can remove siblings (except for comments near it) and go up the chain. - Step #6 is now to go over the initial `@layer utilities` clone we set aside, and remove everything that's not part of any of the clones. - Step #7 is cleanup work, where empty nodes are removed, and rules with a selector of `&` are replaced by its children. This is done in a depth-first traversal instead of breadth first. Co-authored-by: Jordan Pittman <jordan@cryptica.me>
E.g.: ```css .foo { .bar { color: red; } } ``` If this becomes: ```css .foo { & { color: red; } } ``` Then this essentially means `.foo & {}`, not `.foo {}`
RobinMalfait
force-pushed
the
feat/css-codemods-at-layer-utilities
branch
from
September 24, 2024 15:59
e361319
to
7abb3fd
Compare
philipp-spiess
approved these changes
Sep 24, 2024
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Love the test cases!
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.
This PR adds CSS codemods for migrating existing
@layer utilities
to@utility
directives.This PR has the ability to migrate the following cases:
The most basic case is when you want to migrate a simple class to a utility directive.
Input:
Output:
You'll notice that the class
foo
will be used as the utility name, the declarations (and the rest of the body of the rule) will become the body of the@utility
definition.In v3, every class in a selector will become a utility. To correctly migrate this to
@utility
directives, we have to register each class in the selector and generaten
utilities.We can use nesting syntax, and replace the current class with
&
to ensure that the final result behaves the same.Input:
Output:
In this case, it could be that you know that some of them will never be used as a utility (e.g.:
hover:bar
), but then you can safely remove them.Even classes inside of
:has(…)
will become a utility. The only exception to the rule is that we don't do it for:not(…)
.Input:
Output:
Notice that there is no
@utility qux
because it was used inside of:not(…)
.When classes are nested inside at-rules, then these classes will also become utilities. However, the
@utility <name>
will be at the top and the at-rules will live inside of it. If there are multiple classes inside a shared at-rule, then the at-rule will be duplicated for each class.Let's look at an example to make it more clear:
Input:
Output:
When classes result in multiple
@utility
directives with the same name, then the definitions will be merged together.Input:
Intermediate representation:
Output: