31 lines
1.1 KiB
TypeScript
31 lines
1.1 KiB
TypeScript
import { readFileSync, accessSync } from "node:fs";
|
|
import { resolve, join } from "node:path";
|
|
import type { ComponentRegistry } from "../registry.js";
|
|
|
|
interface AddInput { component: string; targetDir?: string; }
|
|
interface AddResult { files: Array<{ path: string; content: string }>; dependencies: string[]; }
|
|
|
|
function toKebab(str: string): string {
|
|
return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
|
|
}
|
|
|
|
/** Copies a styled component from the registry to the user's project. */
|
|
export function handleAdd(registry: ComponentRegistry, input: AddInput): AddResult | null {
|
|
const comp = registry.getComponent(input.component);
|
|
if (!comp || !comp.hasStyledVersion) return null;
|
|
|
|
const kebab = toKebab(comp.meta.name);
|
|
const registryDir = resolve(import.meta.dirname, "../../../registry/src/components");
|
|
const sourcePath = join(registryDir, `${kebab}.tsx`);
|
|
|
|
try { accessSync(sourcePath); } catch { return null; }
|
|
|
|
const content = readFileSync(sourcePath, "utf-8");
|
|
const targetDir = input.targetDir ?? "src/components/ui";
|
|
|
|
return {
|
|
files: [{ path: join(targetDir, `${kebab}.tsx`), content }],
|
|
dependencies: [comp.exportPath],
|
|
};
|
|
}
|