Home / File/ migrate-at-layer-utilities.ts — tailwindcss Source File

migrate-at-layer-utilities.ts — tailwindcss Source File

Architecture documentation for migrate-at-layer-utilities.ts, a typescript file in the tailwindcss codebase. 11 imports, 2 dependents.

File typescript CommandLineInterface Codemods 11 imports 2 dependents 1 functions

Entity Profile

Dependency Diagram

graph LR
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852["migrate-at-layer-utilities.ts"]
  bb9924cc_8308_a1f9_0e30_76de45a64970["segment.ts"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> bb9924cc_8308_a1f9_0e30_76de45a64970
  c58cbb33_f3cc_0b4f_844a_15bf66a1dc61["segment"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> c58cbb33_f3cc_0b4f_844a_15bf66a1dc61
  bc267e18_3e03_cc17_3da0_cbc39f148f44["stylesheet.ts"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> bc267e18_3e03_cc17_3da0_cbc39f148f44
  b9897393_3e36_7806_d172_b9debcd215f6["Stylesheet"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> b9897393_3e36_7806_d172_b9debcd215f6
  472e1b98_afcf_f1f2_ad91_916d742bb731["version.ts"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> 472e1b98_afcf_f1f2_ad91_916d742bb731
  8c8c71d8_c9b0_02ac_73ec_950510adcf7a["walk.ts"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> 8c8c71d8_c9b0_02ac_73ec_950510adcf7a
  dd7577d7_bdb0_88c5_438f_51bb090ec42a["walk"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> dd7577d7_bdb0_88c5_438f_51bb090ec42a
  df3a8122_6d4c_d7b5_82c0_a0aa72c62ab9["WalkAction"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> df3a8122_6d4c_d7b5_82c0_a0aa72c62ab9
  8715b857_e3fa_5cb9_0f08_5bd585e387dd["walkDepth"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> 8715b857_e3fa_5cb9_0f08_5bd585e387dd
  7c3c22f8_be1a_4490_9f3e_622280887fe1["postcss"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> 7c3c22f8_be1a_4490_9f3e_622280887fe1
  c88bd8a7_3318_89a2_c1a8_05449ad9e353["postcss-selector-parser"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 --> c88bd8a7_3318_89a2_c1a8_05449ad9e353
  2cb5ef1d_43c0_4377_fe5a_941d800f83c7["migrate-at-layer-utilities.test.ts"]
  2cb5ef1d_43c0_4377_fe5a_941d800f83c7 --> 7de2c7a6_0dcf_0fb9_b7dd_c51f75983852
  9e542b1f_db4d_cc7b_b37d_1324d5719263["migrate.ts"]
  9e542b1f_db4d_cc7b_b37d_1324d5719263 --> 7de2c7a6_0dcf_0fb9_b7dd_c51f75983852
  style 7de2c7a6_0dcf_0fb9_b7dd_c51f75983852 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { type AtRule, type Comment, type Plugin, type Rule } from 'postcss'
import SelectorParser from 'postcss-selector-parser'
import { segment } from '../../../../tailwindcss/src/utils/segment'
import { Stylesheet } from '../../stylesheet'
import * as version from '../../utils/version'
import { walk, WalkAction, walkDepth } from '../../utils/walk'

export function migrateAtLayerUtilities(stylesheet: Stylesheet): Plugin {
  function migrate(atRule: AtRule) {
    // Migrating `@layer utilities` to `@utility` is only supported in Tailwind
    // CSS v3 projects. Tailwind CSS v4 projects could also have `@layer
    // utilities` but those aren't actual utilities.
    if (!version.isMajor(3)) return

    // Only migrate `@layer utilities` and `@layer components`.
    if (atRule.params !== 'utilities' && atRule.params !== 'components') return

    // Keep rules that should not be turned into utilities as is. This will
    // include rules with element or ID selectors.
    let defaultsAtRule = atRule.clone()

    // Clone each rule with multiple selectors into their own rule with a single
    // selector.
    walk(atRule, (node) => {
      if (node.type !== 'rule') return

      // Clone the node for each selector
      let selectors = segment(node.selector, ',')
      if (selectors.length > 1) {
        let clonedNodes: Rule[] = []
        for (let selector of selectors) {
          let clone = node.clone({ selector })
          clonedNodes.push(clone)
        }
        node.replaceWith(clonedNodes)
      }

      return WalkAction.Skip
    })

    // Track all the classes that we want to create an `@utility` for.
    let classes = new Set<string>()

    walk(atRule, (node) => {
      if (node.type !== 'rule') return

      // Find all the classes in the selector
      SelectorParser((selectors) => {
        selectors.each((selector) => {
          walk(selector, (selectorNode) => {
            // Ignore everything in `:not(…)`
            if (selectorNode.type === 'pseudo' && selectorNode.value === ':not') {
              return WalkAction.Skip
            }

            if (selectorNode.type === 'class') {
              classes.add(selectorNode.value)
            }
          })
        })
// ... (259 more lines)

Subdomains

Types

Frequently Asked Questions

What does migrate-at-layer-utilities.ts do?
migrate-at-layer-utilities.ts is a source file in the tailwindcss codebase, written in typescript. It belongs to the CommandLineInterface domain, Codemods subdomain.
What functions are defined in migrate-at-layer-utilities.ts?
migrate-at-layer-utilities.ts defines 1 function(s): migrateAtLayerUtilities.
What does migrate-at-layer-utilities.ts depend on?
migrate-at-layer-utilities.ts imports 11 module(s): Stylesheet, WalkAction, postcss, postcss-selector-parser, segment, segment.ts, stylesheet.ts, version.ts, and 3 more.
What files import migrate-at-layer-utilities.ts?
migrate-at-layer-utilities.ts is imported by 2 file(s): migrate-at-layer-utilities.test.ts, migrate.ts.
Where is migrate-at-layer-utilities.ts in the architecture?
migrate-at-layer-utilities.ts is located at packages/@tailwindcss-upgrade/src/codemods/css/migrate-at-layer-utilities.ts (domain: CommandLineInterface, subdomain: Codemods, directory: packages/@tailwindcss-upgrade/src/codemods/css).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free