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 Oxide Extractor calls 6 called by 11

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

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