parseCandidate() — tailwindcss Function Reference
Architecture documentation for the parseCandidate() function in candidate.ts from the tailwindcss codebase.
Entity Profile
Dependency Diagram
graph TD 7d328a86_10c6_b5c1_6390_36f4fffe9c14["parseCandidate()"] ba6fca27_7720_5839_0f92_bc2abb8db636["candidate.ts"] 7d328a86_10c6_b5c1_6390_36f4fffe9c14 -->|defined in| ba6fca27_7720_5839_0f92_bc2abb8db636 6d639fbb_ba96_11f9_311c_de088fe027c4["parseCandidate()"] 6d639fbb_ba96_11f9_311c_de088fe027c4 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 b779d35b_89d6_7939_9231_39f9aa250ab3["isSafeMigration()"] b779d35b_89d6_7939_9231_39f9aa250ab3 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 d9972d7e_4ead_d84f_3f97_3cc5f06273b9["migrateAutomaticVarInjection()"] d9972d7e_4ead_d84f_3f97_3cc5f06273b9 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 e33960a2_fa25_720d_6e49_e29c569295d2["migrateCamelcaseInNamedValue()"] e33960a2_fa25_720d_6e49_e29c569295d2 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 a8ebd8e1_4e38_4a06_28e7_e26261806723["migrateLegacyArbitraryValues()"] a8ebd8e1_4e38_4a06_28e7_e26261806723 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 95e8edc9_45de_ca00_e4d2_601d3ae22f9f["migrateModernizeArbitraryValues()"] 95e8edc9_45de_ca00_e4d2_601d3ae22f9f -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 7a457be5_eaef_02ce_7bc4_4e0317ecd8ce["migratePrefix()"] 7a457be5_eaef_02ce_7bc4_4e0317ecd8ce -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 d6f03aba_eecb_9486_a7b9_25fc0f87915d["migrateVariantOrder()"] d6f03aba_eecb_9486_a7b9_25fc0f87915d -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 bafed062_abf8_7e47_4942_385b21bd9b04["parseCandidate()"] bafed062_abf8_7e47_4942_385b21bd9b04 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 ad08c258_e5c2_4cd4_c935_0925a940458e["compileCandidates()"] ad08c258_e5c2_4cd4_c935_0925a940458e -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 e557c8a4_bb27_ee44_c462_9e238157ad04["buildDesignSystem()"] e557c8a4_bb27_ee44_c462_9e238157ad04 -->|calls| 7d328a86_10c6_b5c1_6390_36f4fffe9c14 c58cbb33_f3cc_0b4f_844a_15bf66a1dc61["segment()"] 7d328a86_10c6_b5c1_6390_36f4fffe9c14 -->|calls| c58cbb33_f3cc_0b4f_844a_15bf66a1dc61 5719096b_0f51_ab16_7fbd_4455f835804c["parseVariant()"] 7d328a86_10c6_b5c1_6390_36f4fffe9c14 -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c style 7d328a86_10c6_b5c1_6390_36f4fffe9c14 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