UNPKG

hextaui

Version:

Build stunning websites effortlessly. HextaUI CLI tool to easily install components for Next.js, Vite, and Astro projects.

74 lines (73 loc) 2.51 kB
import { COMPONENTS } from "../config/components.js"; /** * Finds a component by name (case-insensitive) */ export function findComponentByName(name) { return COMPONENTS.find((component) => component.name.toLowerCase() === name.toLowerCase()); } /** * Validates component names and returns found components with any invalid names */ export function validateComponentNames(componentNames) { const validComponents = []; const invalidNames = []; for (const name of componentNames) { const component = findComponentByName(name); if (component) { validComponents.push(component); } else { invalidNames.push(name); } } return { validComponents, invalidNames }; } /** * Resolves all required components for a given set of components * Returns a flattened list with no duplicates, in the correct order */ export function resolveRequiredComponents(componentNames) { const resolvedComponents = new Map(); const visited = new Set(); function resolveComponent(componentName) { if (visited.has(componentName)) { return; // Avoid circular dependencies } visited.add(componentName); const component = COMPONENTS.find((c) => c.name === componentName); if (!component) { throw new Error(`Component "${componentName}" not found`); } // First, resolve all required components recursively if (component.requiredComponents) { for (const requiredName of component.requiredComponents) { resolveComponent(requiredName); } } // Then add this component resolvedComponents.set(componentName, component); } // Resolve all requested components for (const componentName of componentNames) { resolveComponent(componentName); } return Array.from(resolvedComponents.values()); } /** * Gets a list of component names that will be installed (including required ones) */ export function getInstallationList(componentNames) { const allComponents = resolveRequiredComponents(componentNames); const requestedSet = new Set(componentNames); const requested = allComponents .filter((c) => requestedSet.has(c.name)) .map((c) => c.name); const required = allComponents .filter((c) => !requestedSet.has(c.name)) .map((c) => c.name); return { requested, required, total: allComponents, }; }