Home / File/ transform-icons.ts — ui Source File

transform-icons.ts — ui Source File

Architecture documentation for transform-icons.ts, a typescript file in the ui codebase. 3 imports, 0 dependents.

Entity Profile

Dependency Diagram

graph LR
  66a6f0fd_f18b_9c39_b420_a7cbf1c73452["transform-icons.ts"]
  21434c25_e4b6_a999_aa4a_fa7cb632e703["libraries"]
  66a6f0fd_f18b_9c39_b420_a7cbf1c73452 --> 21434c25_e4b6_a999_aa4a_fa7cb632e703
  e69863ed_3e2f_ef94_648a_ef0155c386ef["transformers"]
  66a6f0fd_f18b_9c39_b420_a7cbf1c73452 --> e69863ed_3e2f_ef94_648a_ef0155c386ef
  4f6f7e78_23ff_4f5f_c723_474454f64c85["ts-morph"]
  66a6f0fd_f18b_9c39_b420_a7cbf1c73452 --> 4f6f7e78_23ff_4f5f_c723_474454f64c85
  style 66a6f0fd_f18b_9c39_b420_a7cbf1c73452 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { iconLibraries, type IconLibraryName } from "@/src/icons/libraries"
import { Transformer } from "@/src/utils/transformers"
import { SourceFile, SyntaxKind } from "ts-morph"

export const transformIcons: Transformer = async ({ sourceFile, config }) => {
  const iconLibrary = config.iconLibrary

  // Fail silently if the icon library is not supported.
  // This is for legacy icon libraries.
  if (!iconLibrary || !(iconLibrary in iconLibraries)) {
    return sourceFile
  }

  const targetLibrary = iconLibrary as IconLibraryName
  const libraryConfig = iconLibraries[targetLibrary]
  let transformedIcons: string[] = []

  for (const element of sourceFile.getDescendantsOfKind(
    SyntaxKind.JsxSelfClosingElement
  )) {
    if (element.getTagNameNode()?.getText() !== "IconPlaceholder") {
      continue
    }

    // Find the library-specific prop (e.g., "lucide", "tabler", "hugeicons")
    const libraryPropAttr = element.getAttributes().find((attr) => {
      if (attr.getKind() !== SyntaxKind.JsxAttribute) {
        return false
      }
      const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute)
      return jsxAttr.getNameNode().getText() === targetLibrary
    })

    if (!libraryPropAttr) {
      continue // No icon specified for this library
    }

    const jsxIconAttr = libraryPropAttr.asKindOrThrow(SyntaxKind.JsxAttribute)
    const targetIconName = jsxIconAttr
      .getInitializer()
      ?.getText()
      .replace(/^["']|["']$/g, "")

    if (!targetIconName) {
      continue
    }

    if (!transformedIcons.includes(targetIconName)) {
      transformedIcons.push(targetIconName)
    }

    const usage = libraryConfig.usage
    const usageMatch = usage.match(/<(\w+)([^>]*)\s*\/>/)

    // Remove the library-specific prop
    jsxIconAttr.remove()

    // Remove all other library-specific props
    for (const attr of element.getAttributes()) {
      if (attr.getKind() !== SyntaxKind.JsxAttribute) {
// ... (151 more lines)

Subdomains

Dependencies

  • libraries
  • transformers
  • ts-morph

Frequently Asked Questions

What does transform-icons.ts do?
transform-icons.ts is a source file in the ui codebase, written in typescript. It belongs to the FrameworkTooling domain, TemplateSync subdomain.
What functions are defined in transform-icons.ts?
transform-icons.ts defines 2 function(s): _useSemicolon, transformIcons.
What does transform-icons.ts depend on?
transform-icons.ts imports 3 module(s): libraries, transformers, ts-morph.
Where is transform-icons.ts in the architecture?
transform-icons.ts is located at packages/shadcn/src/utils/transformers/transform-icons.ts (domain: FrameworkTooling, subdomain: TemplateSync, directory: packages/shadcn/src/utils/transformers).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free