parseCandidate() — tailwindcss Function Reference
Architecture documentation for the parseCandidate() function in candidate.ts from the tailwindcss codebase.
Entity Profile
Dependency Diagram
graph TD d4b90da0_01b5_b21d_ff05_b37798744576["parseCandidate()"] 669e6a28_c71f_3c5e_9c53_915cede7da78["candidate.ts"] d4b90da0_01b5_b21d_ff05_b37798744576 -->|defined in| 669e6a28_c71f_3c5e_9c53_915cede7da78 4430ae86_7b45_9a73_d25b_0bbdd1cc59ac["parseCandidate()"] 4430ae86_7b45_9a73_d25b_0bbdd1cc59ac -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 aa2e93eb_f211_d616_3736_f2a6e60dfa72["isSafeMigration()"] aa2e93eb_f211_d616_3736_f2a6e60dfa72 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 aeb7589b_9d5b_312e_4558_4df754cbb905["migrateAutomaticVarInjection()"] aeb7589b_9d5b_312e_4558_4df754cbb905 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 32c3141d_1d0a_d72e_1a76_a960011fba35["migrateCamelcaseInNamedValue()"] 32c3141d_1d0a_d72e_1a76_a960011fba35 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 2d17c912_6324_fc2c_8ab3_065595647555["migrateLegacyArbitraryValues()"] 2d17c912_6324_fc2c_8ab3_065595647555 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 9f73b711_0f71_129f_7fdb_764a3c0df282["migrateModernizeArbitraryValues()"] 9f73b711_0f71_129f_7fdb_764a3c0df282 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 087d2224_9aa6_c6e5_3a75_d99cf251cb04["migratePrefix()"] 087d2224_9aa6_c6e5_3a75_d99cf251cb04 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 4b9b4a6d_0786_22dc_60cb_a53dc01dd582["migrateVariantOrder()"] 4b9b4a6d_0786_22dc_60cb_a53dc01dd582 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 ef9ad758_33f4_0d23_fff8_8eeaf71d00d8["parseCandidate()"] ef9ad758_33f4_0d23_fff8_8eeaf71d00d8 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 f611bd99_74d3_1161_f7f5_4c1d73c377e5["compileCandidates()"] f611bd99_74d3_1161_f7f5_4c1d73c377e5 -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 9b965fd7_d8e9_0b43_cd5d_c9294ab598ed["buildDesignSystem()"] 9b965fd7_d8e9_0b43_cd5d_c9294ab598ed -->|calls| d4b90da0_01b5_b21d_ff05_b37798744576 f712ed47_45d4_4e5a_dd73_fdefa1da71da["segment()"] d4b90da0_01b5_b21d_ff05_b37798744576 -->|calls| f712ed47_45d4_4e5a_dd73_fdefa1da71da 7ba77268_84c7_7083_8f22_251a4a791d25["parseVariant()"] d4b90da0_01b5_b21d_ff05_b37798744576 -->|calls| 7ba77268_84c7_7083_8f22_251a4a791d25 style d4b90da0_01b5_b21d_ff05_b37798744576 fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
packages/tailwindcss/src/candidate.ts lines 316–612
export function* parseCandidate(input: string, designSystem: DesignSystem): Iterable<Candidate> {
// hover:focus:underline
// ^^^^^ ^^^^^^ -> Variants
// ^^^^^^^^^ -> Base
let rawVariants = segment(input, ':')
// A prefix is a special variant used to prefix all utilities. When present,
// all utilities must start with that variant which we will then remove from
// the variant list so no other part of the codebase has to know about it.
if (designSystem.theme.prefix) {
if (rawVariants.length === 1) return null
if (rawVariants[0] !== designSystem.theme.prefix) return null
rawVariants.shift()
}
// Safety: At this point it is safe to use TypeScript's non-null assertion
// operator because even if the `input` was an empty string, splitting an
// empty string by `:` will always result in an array with at least one
// element.
let base = rawVariants.pop()!
let parsedCandidateVariants: Variant[] = []
for (let i = rawVariants.length - 1; i >= 0; --i) {
let parsedVariant = designSystem.parseVariant(rawVariants[i])
if (parsedVariant === null) return
parsedCandidateVariants.push(parsedVariant)
}
let important = false
// Candidates that end with an exclamation mark are the important version with
// higher specificity of the non-important candidate, e.g. `mx-4!`.
if (base[base.length - 1] === '!') {
important = true
base = base.slice(0, -1)
}
// Legacy syntax with leading `!`, e.g. `!mx-4`.
else if (base[0] === '!') {
important = true
base = base.slice(1)
}
// Check for an exact match of a static utility first as long as it does not
// look like an arbitrary value.
if (designSystem.utilities.has(base, 'static') && !base.includes('[')) {
yield {
kind: 'static',
root: base,
variants: parsedCandidateVariants,
important,
raw: input,
}
}
// Figure out the new base and the modifier segment if present.
//
// E.g.:
//
// ```
// bg-red-500/50
// ^^^^^^^^^^ -> Base without modifier
// ^^ -> Modifier segment
// ```
let [baseWithoutModifier, modifierSegment = null, additionalModifier] = segment(base, '/')
// If there's more than one modifier, the utility is invalid.
//
// E.g.:
//
// - `bg-red-500/50/50`
if (additionalModifier) return
let parsedModifier = modifierSegment === null ? null : parseModifier(modifierSegment)
// Empty arbitrary values are invalid. E.g.: `[color:red]/[]` or `[color:red]/()`.
// ^^ ^^
// `bg-[#0088cc]/[]` or `bg-[#0088cc]/()`.
Domain
Subdomains
Defined In
Called By
Source
Frequently Asked Questions
What does parseCandidate() do?
parseCandidate() is a function in the tailwindcss codebase, defined in packages/tailwindcss/src/candidate.ts.
Where is parseCandidate() defined?
parseCandidate() is defined in packages/tailwindcss/src/candidate.ts at line 316.
What does parseCandidate() call?
parseCandidate() calls 6 function(s): decodeArbitraryValue, findRoots, isValidArbitrary, parseModifier, parseVariant, segment.
What calls parseCandidate()?
parseCandidate() is called by 11 function(s): buildDesignSystem, compileCandidates, isSafeMigration, migrateAutomaticVarInjection, migrateCamelcaseInNamedValue, migrateLegacyArbitraryValues, migrateModernizeArbitraryValues, migratePrefix, and 3 more.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free