Home / Function/ parseCandidate() — tailwindcss Function Reference

parseCandidate() — tailwindcss Function Reference

Architecture documentation for the parseCandidate() function in candidate.ts from the tailwindcss codebase.

Function typescript OxideEngine Scanner calls 6 called by 11

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

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