Home / Function/ sortBuckets() — tailwindcss Function Reference

sortBuckets() — tailwindcss Function Reference

Architecture documentation for the sortBuckets() function in sort-buckets.ts from the tailwindcss codebase.

Function typescript OxideCore Extractor calls 3 called by 10

Entity Profile

Dependency Diagram

graph TD
  e043f45b_85cc_a577_dfe0_8d4c73200c27["sortBuckets()"]
  43d27c33_63b0_12b0_510a_e3bcd5373f81["migrate()"]
  43d27c33_63b0_12b0_510a_e3bcd5373f81 -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  98dfdcac_ec22_e7a5_912e_7d87eb45892c["migrate()"]
  98dfdcac_ec22_e7a5_912e_7d87eb45892c -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  57138d88_d90d_e321_2fb5_cca1ce215644["migrate()"]
  57138d88_d90d_e321_2fb5_cca1ce215644 -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  e7c4824a_90a6_ecd4_ccb5_dbcb8e7d4a47["migrate()"]
  e7c4824a_90a6_ecd4_ccb5_dbcb8e7d4a47 -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  51773c2e_bb3d_63e0_1017_2196c25f1acb["migrate()"]
  51773c2e_bb3d_63e0_1017_2196c25f1acb -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  c8a04bfa_6610_ee54_24b2_9c037c187fbb["migrate()"]
  c8a04bfa_6610_ee54_24b2_9c037c187fbb -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  52eccd67_a1a1_1568_397e_4f4e39b2a252["migrate()"]
  52eccd67_a1a1_1568_397e_4f4e39b2a252 -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  d07539e7_2238_f7ed_f9de_f1fe2e0501cc["migrate()"]
  d07539e7_2238_f7ed_f9de_f1fe2e0501cc -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  1384a7a2_8488_cf52_f804_aafd8b87a44b["migrate()"]
  1384a7a2_8488_cf52_f804_aafd8b87a44b -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  eb8ababf_fa35_08e1_76f8_c2b2cea868b8["run()"]
  eb8ababf_fa35_08e1_76f8_c2b2cea868b8 -->|calls| e043f45b_85cc_a577_dfe0_8d4c73200c27
  0aa64a1c_efd8_a69d_48ed_649b7a86c854["get()"]
  e043f45b_85cc_a577_dfe0_8d4c73200c27 -->|calls| 0aa64a1c_efd8_a69d_48ed_649b7a86c854
  862af4dc_ad02_1198_1156_1e2a5a5540a7["walk()"]
  e043f45b_85cc_a577_dfe0_8d4c73200c27 -->|calls| 862af4dc_ad02_1198_1156_1e2a5a5540a7
  90a499aa_8b0d_b1e9_a745_5565e744ac90["distance()"]
  e043f45b_85cc_a577_dfe0_8d4c73200c27 -->|calls| 90a499aa_8b0d_b1e9_a745_5565e744ac90
  style e043f45b_85cc_a577_dfe0_8d4c73200c27 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/@tailwindcss-upgrade/src/codemods/css/sort-buckets.ts lines 24–150

export function sortBuckets(): Plugin {
  async function migrate(root: Root) {
    // 1. Move items that are not in a bucket, into a bucket
    {
      let comments: Comment[] = []

      let buckets = new DefaultMap<string, AtRule>((name) => {
        let bucket = postcss.atRule({ name: 'tw-bucket', params: name, nodes: [] })
        root.append(bucket)
        return bucket
      })

      // Seed the buckets with existing buckets
      root.walkAtRules('tw-bucket', (node) => {
        buckets.set(node.params, node)
      })

      let lastLayer = 'user'
      function injectInto(name: string, ...nodes: ChildNode[]) {
        lastLayer = name
        buckets.get(name).nodes?.push(...comments.splice(0), ...nodes)
      }

      walk(root, (node) => {
        // Already in a bucket, skip it
        if (node.type === 'atrule' && node.name === 'tw-bucket') {
          return WalkAction.Skip
        }

        // Comments belong to the bucket of the nearest node, which is typically
        // in the "next" bucket.
        if (node.type === 'comment') {
          // We already have comments, which means that we already have nodes
          // that belong in the next bucket, so we should move the current
          // comment into the next bucket as well.
          if (comments.length > 0) {
            comments.push(node)
            return
          }

          // Figure out the closest node to the comment
          let prevDistance = distance(node.prev(), node) ?? Infinity
          let nextDistance = distance(node, node.next()) ?? Infinity

          if (prevDistance < nextDistance) {
            buckets.get(lastLayer).nodes?.push(node)
          } else {
            comments.push(node)
          }
        }

        // Known at-rules
        else if (
          node.type === 'atrule' &&
          ['config', 'plugin', 'source', 'theme', 'utility', 'custom-variant'].includes(node.name)
        ) {
          injectInto(node.name, node)
        }

        // Imports bucket, which also contains the `@charset` and body-less `@layer`
        else if (
          (node.type === 'atrule' && node.name === 'layer' && !node.nodes) || // @layer foo, bar;
          (node.type === 'atrule' && node.name === 'import') ||
          (node.type === 'atrule' && node.name === 'charset') || // @charset "UTF-8";
          (node.type === 'atrule' && node.name === 'tailwind')
        ) {
          injectInto('import', node)
        }

        // User CSS
        else if (node.type === 'rule' || node.type === 'atrule') {
          injectInto('user', node)
        }

        // Fallback
        else {
          injectInto('user', node)
        }

        return WalkAction.Skip
      })

      if (comments.length > 0) {
        injectInto(lastLayer)
      }
    }

    // 2. Merge `@tw-bucket` with the same name together
    let firstBuckets = new Map<string, AtRule>()
    root.walkAtRules('tw-bucket', (node) => {
      let firstBucket = firstBuckets.get(node.params)
      if (!firstBucket) {
        firstBuckets.set(node.params, node)
        return
      }

      if (node.nodes) {
        firstBucket.append(...node.nodes)
      }
    })

    // 3. Remove empty `@tw-bucket`
    root.walkAtRules('tw-bucket', (node) => {
      if (!node.nodes?.length) {
        node.remove()
      }
    })

    // 4. Sort the `@tw-bucket` themselves
    {
      let sorted = Array.from(firstBuckets.values()).sort((a, z) => {
        let aIndex = BUCKET_ORDER.indexOf(a.params)
        let zIndex = BUCKET_ORDER.indexOf(z.params)
        return aIndex - zIndex
      })

      // Re-inject the sorted buckets
      root.removeAll()
      root.append(sorted)
    }
  }

  return {
    postcssPlugin: '@tailwindcss/upgrade/sort-buckets',
    OnceExit: migrate,
  }
}

Domain

Subdomains

Frequently Asked Questions

What does sortBuckets() do?
sortBuckets() is a function in the tailwindcss codebase.
What does sortBuckets() call?
sortBuckets() calls 3 function(s): distance, get, walk.
What calls sortBuckets()?
sortBuckets() is called by 10 function(s): migrate, migrate, migrate, migrate, migrate, migrate, migrate, migrate, and 2 more.

Analyze Your Own Codebase

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

Try Supermodel Free