import _locreq from "locreq"; import { promises as fs } from "fs"; import { formatWithPrettier } from "./utils/prettier.js"; import recursive from "recursive-readdir"; import path from "path"; import { toKebabCase, toPascalCase } from "js-convert-case"; import { mkdir } from "fs/promises"; const target_locreq = _locreq(process.cwd()); export async function generateComponents(): Promise { const components_dir = target_locreq.resolve("src/back/jdd-components"); await mkdir(components_dir, { recursive: true }); const component_names = (await recursive(components_dir)) .filter((c) => c.endsWith(".jdd.tsx")) .sort(); const component_data = component_names .map( (p) => "./" + path.relative(components_dir, p).replace(/\.[tj]sx?$/, ".js") ) .map((relative_path) => { const name = relative_path.match(/\/([^/]+).jdd/)?.[1]; return { name, relative_path }; }); const content = `// DO NOT EDIT! This file is generated automaticaly with 'npm run generate-components' import { Registry } from "@sealcode/jdd"; export const registry = new Registry(); ${component_data .map( (c) => ` import { ${toPascalCase(c.name)} } from "${c.relative_path}"; registry.add("${toKebabCase(c.name)}", ${toPascalCase(c.name)});` ) .join("\n")}`; const target = "src/back/jdd-components/components.ts"; await fs.writeFile( target_locreq.resolve(target), await formatWithPrettier(content) ); // eslint-disable-next-line no-console console.log(`Successfuly generated new ${target} file`); }