Home / Function/ migrateAtLayerUtilities() — tailwindcss Function Reference

migrateAtLayerUtilities() — tailwindcss Function Reference

Architecture documentation for the migrateAtLayerUtilities() function in migrate-at-layer-utilities.ts from the tailwindcss codebase.

Entity Profile

Dependency Diagram

graph TD
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a["migrateAtLayerUtilities()"]
  7de2c7a6_0dcf_0fb9_b7dd_c51f75983852["migrate-at-layer-utilities.ts"]
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a -->|defined in| 7de2c7a6_0dcf_0fb9_b7dd_c51f75983852
  084f6f8b_fe90_a5cf_9cf6_6fcc92cc6163["migrate()"]
  084f6f8b_fe90_a5cf_9cf6_6fcc92cc6163 -->|calls| 9456daf3_1cee_2ab1_7f06_8dc2cedc967a
  1be562b7_fe23_7e22_03ec_31b3d101e5e5["migrateContents()"]
  1be562b7_fe23_7e22_03ec_31b3d101e5e5 -->|calls| 9456daf3_1cee_2ab1_7f06_8dc2cedc967a
  6cf757d4_aaad_b18d_cf21_ade24c6e2a77["isMajor()"]
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a -->|calls| 6cf757d4_aaad_b18d_cf21_ade24c6e2a77
  dd7577d7_bdb0_88c5_438f_51bb090ec42a["walk()"]
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a -->|calls| dd7577d7_bdb0_88c5_438f_51bb090ec42a
  c58cbb33_f3cc_0b4f_844a_15bf66a1dc61["segment()"]
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a -->|calls| c58cbb33_f3cc_0b4f_844a_15bf66a1dc61
  283bbe03_c84a_2fd0_18b3_45f5bfcaa273["layers()"]
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a -->|calls| 283bbe03_c84a_2fd0_18b3_45f5bfcaa273
  8715b857_e3fa_5cb9_0f08_5bd585e387dd["walkDepth()"]
  9456daf3_1cee_2ab1_7f06_8dc2cedc967a -->|calls| 8715b857_e3fa_5cb9_0f08_5bd585e387dd
  style 9456daf3_1cee_2ab1_7f06_8dc2cedc967a fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/@tailwindcss-upgrade/src/codemods/css/migrate-at-layer-utilities.ts lines 8–318

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)
            }
          })
        })
      }).processSync(node.selector, { updateSelector: false })

      return WalkAction.Skip
    })

    // Remove all the nodes from the default `@layer utilities` that we know
    // should be turned into `@utility` at-rules.
    walk(defaultsAtRule, (node) => {
      if (node.type !== 'rule') return

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

            // Remove the node if the class is in the list
            if (selectorNode.type === 'class' && classes.has(selectorNode.value)) {
              node.remove()
              return WalkAction.Stop
            }
          })
        })
      }).processSync(node, { updateSelector: true })
    })

Subdomains

Frequently Asked Questions

What does migrateAtLayerUtilities() do?
migrateAtLayerUtilities() is a function in the tailwindcss codebase, defined in packages/@tailwindcss-upgrade/src/codemods/css/migrate-at-layer-utilities.ts.
Where is migrateAtLayerUtilities() defined?
migrateAtLayerUtilities() is defined in packages/@tailwindcss-upgrade/src/codemods/css/migrate-at-layer-utilities.ts at line 8.
What does migrateAtLayerUtilities() call?
migrateAtLayerUtilities() calls 5 function(s): isMajor, layers, segment, walk, walkDepth.
What calls migrateAtLayerUtilities()?
migrateAtLayerUtilities() is called by 2 function(s): migrate, migrateContents.

Analyze Your Own Codebase

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

Try Supermodel Free