@johnmusans/arcadia-ui-style-engine
Version:
Shared style system logic and types for Arcadia UI components
64 lines (54 loc) • 1.79 kB
text/typescript
import { promises as fs } from "fs";
import path from "path";
import type { RegistryItem } from "shadcn/registry";
import { transform } from "../transformers";
import { transformIcons } from "../transformers/transform-icons";
import { transformImport } from "../transformers/transform-imports";
import type { Style } from "../../types";
export const updateFiles = async (
registryItem: RegistryItem,
options: {
registryBasePath: string;
baseUrl: string;
style: Style;
},
): Promise<RegistryItem> => {
if (!registryItem.files) {
return registryItem;
}
for (const file of registryItem.files) {
// Load file content from filesystem if not already present
if (!file.content && file.path) {
try {
const filePath = path.join(options.registryBasePath, file.path);
const content = await fs.readFile(filePath, "utf-8");
file.content = content;
file.path = file.path.replace(options.registryBasePath, "");
const hasVariant = !!registryItem.name.split(":")[1];
if (hasVariant) {
const pathRegex = /^components\/([^/]+)\/([^/]+)\.tsx?$/;
const pathMatch = pathRegex.exec(file.path);
if (pathMatch) {
file.path = `components/${pathMatch[1]}.${file.path.split(".").pop()}`;
}
}
} catch (error) {
console.error(`Failed to read file ${file.path}:`, error);
continue;
}
}
if (!file.content) {
continue;
}
const transformedContent = await transform(
{
filename: `${options.registryBasePath}/${file.path}`,
raw: file.content,
style: options.style,
},
[transformImport, transformIcons],
);
file.content = transformedContent;
}
return registryItem;
};