Home / File/ build.ts — ui Source File

build.ts — ui Source File

Architecture documentation for build.ts, a typescript file in the ui codebase. 10 imports, 0 dependents.

File typescript FrameworkTooling TemplateSync 10 imports 1 functions

Entity Profile

Dependency Diagram

graph LR
  60e84aa7_59a8_dec8_e6ff_bc217496a380["build.ts"]
  85d52bbd_4b11_bf06_ed3a_d8f77f5fee6d["promises"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 85d52bbd_4b11_bf06_ed3a_d8f77f5fee6d
  d05ec4ea_7a68_3a36_bfa4_9ba7f8409ee5["path"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> d05ec4ea_7a68_3a36_bfa4_9ba7f8409ee5
  733bbbcd_6f22_5f0d_0ee1_b46a6a058a6a["preflight-build"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 733bbbcd_6f22_5f0d_0ee1_b46a6a058a6a
  a3b2545e_3d8c_699d_ef11_6ab18db14666["schema"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> a3b2545e_3d8c_699d_ef11_6ab18db14666
  6be7d8a9_c93c_8743_3ef7_968efff25479["handle-error"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 6be7d8a9_c93c_8743_3ef7_968efff25479
  15e8bad0_00cc_3d96_8e33_2f062120ea7f["highlighter"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 15e8bad0_00cc_3d96_8e33_2f062120ea7f
  1df8bbed_5110_29f0_12f0_996fc7a1eda1["logger"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 1df8bbed_5110_29f0_12f0_996fc7a1eda1
  a3e9bc4e_1faf_6261_a1db_396981c7761d["spinner"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> a3e9bc4e_1faf_6261_a1db_396981c7761d
  7d629454_eee6_73fe_2526_919af8d00ef9["commander"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 7d629454_eee6_73fe_2526_919af8d00ef9
  6802ce19_522d_e5fb_e458_8826d9f6952e["zod"]
  60e84aa7_59a8_dec8_e6ff_bc217496a380 --> 6802ce19_522d_e5fb_e458_8826d9f6952e
  style 60e84aa7_59a8_dec8_e6ff_bc217496a380 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import * as fs from "fs/promises"
import * as path from "path"
import { preFlightBuild } from "@/src/preflights/preflight-build"
import { registryItemSchema, registrySchema } from "@/src/schema"
import { handleError } from "@/src/utils/handle-error"
import { highlighter } from "@/src/utils/highlighter"
import { logger } from "@/src/utils/logger"
import { spinner } from "@/src/utils/spinner"
import { Command } from "commander"
import { z } from "zod"

export const buildOptionsSchema = z.object({
  cwd: z.string(),
  registryFile: z.string(),
  outputDir: z.string(),
})

export const build = new Command()
  .name("build")
  .description("build components for a shadcn registry")
  .argument("[registry]", "path to registry.json file", "./registry.json")
  .option(
    "-o, --output <path>",
    "destination directory for json files",
    "./public/r"
  )
  .option(
    "-c, --cwd <cwd>",
    "the working directory. defaults to the current directory.",
    process.cwd()
  )
  .action(async (registry: string, opts) => {
    try {
      const options = buildOptionsSchema.parse({
        cwd: path.resolve(opts.cwd),
        registryFile: registry,
        outputDir: opts.output,
      })

      const { resolvePaths } = await preFlightBuild(options)
      const content = await fs.readFile(resolvePaths.registryFile, "utf-8")

      const result = registrySchema.safeParse(JSON.parse(content))

      if (!result.success) {
        logger.error(
          `Invalid registry file found at ${highlighter.info(
            resolvePaths.registryFile
          )}.`
        )
        process.exit(1)
      }

      const buildSpinner = spinner("Building registry...")
      for (const registryItem of result.data.items) {
        buildSpinner.start(`Building ${registryItem.name}...`)

        // Add the schema to the registry item.
        registryItem["$schema"] =
          "https://ui.shadcn.com/schema/registry-item.json"

        // Loop through each file in the files array.
        for (const file of registryItem.files ?? []) {
          file["content"] = await fs.readFile(
            path.resolve(resolvePaths.cwd, file.path),
            "utf-8"
          )
        }

        // Validate the registry item.
        const result = registryItemSchema.safeParse(registryItem)
        if (!result.success) {
          logger.error(
            `Invalid registry item found for ${highlighter.info(
              registryItem.name
            )}.`
          )
          continue
        }

        // Write the registry item to the output directory.
        await fs.writeFile(
          path.resolve(resolvePaths.outputDir, `${result.data.name}.json`),
          JSON.stringify(result.data, null, 2)
        )
      }

      // Copy registry.json to the output directory.
      await fs.copyFile(
        resolvePaths.registryFile,
        path.resolve(resolvePaths.outputDir, "registry.json")
      )

      buildSpinner.succeed("Building registry.")
    } catch (error) {
      logger.break()
      handleError(error)
    }
  })

Subdomains

Functions

Dependencies

  • commander
  • handle-error
  • highlighter
  • logger
  • path
  • preflight-build
  • promises
  • schema
  • spinner
  • zod

Frequently Asked Questions

What does build.ts do?
build.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 build.ts?
build.ts defines 1 function(s): build.
What does build.ts depend on?
build.ts imports 10 module(s): commander, handle-error, highlighter, logger, path, preflight-build, promises, schema, and 2 more.
Where is build.ts in the architecture?
build.ts is located at packages/shadcn/src/commands/build.ts (domain: FrameworkTooling, subdomain: TemplateSync, directory: packages/shadcn/src/commands).

Analyze Your Own Codebase

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

Try Supermodel Free