Home / Function/ migrateTailwindDirectives() — tailwindcss Function Reference

migrateTailwindDirectives() — tailwindcss Function Reference

Architecture documentation for the migrateTailwindDirectives() function in migrate-tailwind-directives.ts from the tailwindcss codebase.

Entity Profile

Dependency Diagram

graph TD
  bfe5c1d2_37ed_49d0_ef27_f44b54dba6f3["migrateTailwindDirectives()"]
  ab650bb5_df86_6206_c20d_13143f971e6c["migrate-tailwind-directives.ts"]
  bfe5c1d2_37ed_49d0_ef27_f44b54dba6f3 -->|defined in| ab650bb5_df86_6206_c20d_13143f971e6c
  691801e2_532e_484c_34a4_aad4e82d7102["migrate()"]
  691801e2_532e_484c_34a4_aad4e82d7102 -->|calls| bfe5c1d2_37ed_49d0_ef27_f44b54dba6f3
  1be562b7_fe23_7e22_03ec_31b3d101e5e5["migrateContents()"]
  1be562b7_fe23_7e22_03ec_31b3d101e5e5 -->|calls| bfe5c1d2_37ed_49d0_ef27_f44b54dba6f3
  912aae5e_40ba_e3a2_6b46_c0759a6468f8["findTargetNode()"]
  bfe5c1d2_37ed_49d0_ef27_f44b54dba6f3 -->|calls| 912aae5e_40ba_e3a2_6b46_c0759a6468f8
  style bfe5c1d2_37ed_49d0_ef27_f44b54dba6f3 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/@tailwindcss-upgrade/src/codemods/css/migrate-tailwind-directives.ts lines 5–128

export function migrateTailwindDirectives(options: { newPrefix: string | null }): Plugin {
  let prefixParams = options.newPrefix ? ` prefix(${options.newPrefix})` : ''

  function migrate(root: Root) {
    let baseNode = null as AtRule | null
    let utilitiesNode = null as AtRule | null
    let orderedNodes: AtRule[] = []

    let defaultImportNode = null as AtRule | null
    let utilitiesImportNode = null as AtRule | null
    let preflightImportNode = null as AtRule | null
    let themeImportNode = null as AtRule | null

    let layerOrder: string[] = []

    root.walkAtRules((node) => {
      // Migrate legacy `@import "tailwindcss/tailwind.css"`
      if (node.name === 'import' && node.params.match(/^["']tailwindcss\/tailwind\.css["']$/)) {
        node.params = node.params.replace('tailwindcss/tailwind.css', 'tailwindcss')
      }

      // Append any new prefix() param to existing `@import 'tailwindcss'` directives
      if (node.name === 'import' && node.params.match(/^["']tailwindcss["']/)) {
        node.params += prefixParams
      }

      // Track old imports and directives
      else if (
        (node.name === 'tailwind' && node.params === 'base') ||
        (node.name === 'import' && node.params.match(/^["']tailwindcss\/base["']$/))
      ) {
        layerOrder.push('base')
        orderedNodes.push(node)
        baseNode = node
      } else if (
        (node.name === 'tailwind' && node.params === 'utilities') ||
        (node.name === 'import' && node.params.match(/^["']tailwindcss\/utilities["']$/))
      ) {
        layerOrder.push('utilities')
        orderedNodes.push(node)
        utilitiesNode = node
      }

      // Remove directives that are not needed anymore
      else if (
        (node.name === 'tailwind' && node.params === 'components') ||
        (node.name === 'tailwind' && node.params === 'screens') ||
        (node.name === 'tailwind' && node.params === 'variants') ||
        (node.name === 'import' && node.params.match(/^["']tailwindcss\/components["']$/))
      ) {
        node.remove()
      }

      // Replace Tailwind CSS v2 directives that still worked in v3.
      else if (node.name === 'responsive') {
        if (node.nodes) {
          for (let child of node.nodes) {
            child.raws.tailwind_pretty = true
          }
          node.replaceWith(node.nodes)
        } else {
          node.remove()
        }
      }
    })

    // Insert default import if all directives are present
    if (baseNode !== null && utilitiesNode !== null) {
      if (!defaultImportNode) {
        findTargetNode(orderedNodes).before(
          new AtRule({ name: 'import', params: `'tailwindcss'${prefixParams}` }),
        )
      }
      baseNode?.remove()
      utilitiesNode?.remove()
    }

    // Insert individual imports if not all directives are present
    else if (utilitiesNode !== null) {
      if (!utilitiesImportNode) {
        findTargetNode(orderedNodes).before(

Subdomains

Frequently Asked Questions

What does migrateTailwindDirectives() do?
migrateTailwindDirectives() is a function in the tailwindcss codebase, defined in packages/@tailwindcss-upgrade/src/codemods/css/migrate-tailwind-directives.ts.
Where is migrateTailwindDirectives() defined?
migrateTailwindDirectives() is defined in packages/@tailwindcss-upgrade/src/codemods/css/migrate-tailwind-directives.ts at line 5.
What does migrateTailwindDirectives() call?
migrateTailwindDirectives() calls 1 function(s): findTargetNode.
What calls migrateTailwindDirectives()?
migrateTailwindDirectives() 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