sortBuckets() — tailwindcss Function Reference
Architecture documentation for the sortBuckets() function in sort-buckets.ts from the tailwindcss codebase.
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
Calls
Source
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