Skip to content
This repository was archived by the owner on Aug 19, 2025. It is now read-only.

Commit 49ac82c

Browse files
generate components
1 parent d55bb85 commit 49ac82c

File tree

3 files changed

+78
-3
lines changed

3 files changed

+78
-3
lines changed

index.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import { version } from "./package.json";
55
import { parseHookFiles } from "./src/hooks";
66
import { parseMetadataFile } from "./src/metadata";
77
import { parseSupabaseFile } from "./src/supabase";
8+
import { parseComponentFiles } from "./src/components";
89
import { File, HookFile, fetchTypes } from "./src/types";
910
import { DIRECTORY, log, logError } from "./src/utils";
1011

1112
const writeFiles = async (
1213
supabaseFile: File,
1314
hookFiles: HookFile[],
14-
metadataFile: File
15+
metadataFile: File,
16+
componentFiles: File[]
1517
) => {
1618
await writeFile(
1719
`${DIRECTORY}/${supabaseFile.fileName}`,
@@ -27,6 +29,14 @@ const writeFiles = async (
2729
`${DIRECTORY}/${metadataFile.fileName}`,
2830
metadataFile.content
2931
);
32+
await Promise.all(
33+
componentFiles.map((hookFile) => {
34+
return writeFile(
35+
`${DIRECTORY}/components/${hookFile.fileName}`,
36+
hookFile.content
37+
);
38+
})
39+
);
3040
};
3141

3242
const run = async () => {
@@ -35,13 +45,15 @@ const run = async () => {
3545

3646
await remove(DIRECTORY);
3747
await ensureDir(`${DIRECTORY}/hooks`);
48+
await ensureDir(`${DIRECTORY}/components`);
3849
await writeFile(`${DIRECTORY}/${types.fileName}`, types.content);
3950

4051
const supabaseFile = await parseSupabaseFile();
4152
const hookFiles = await parseHookFiles(types);
4253
const metadataFile = await parseMetadataFile(hookFiles);
54+
const componentFiles = await parseComponentFiles(hookFiles);
4355

44-
await writeFiles(supabaseFile, hookFiles, metadataFile);
56+
await writeFiles(supabaseFile, hookFiles, metadataFile, componentFiles);
4557

4658
log(`Generated ${hookFiles.length + 1} files in "${DIRECTORY}"`);
4759
log("Code generation completed 🚀");

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@backengine/codegen",
3-
"version": "1.0.10",
3+
"version": "1.0.11",
44
"description": "Generate code for Backengine projects.",
55
"bin": "build/index.js",
66
"files": [

src/components/index.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import comment from "../comment";
2+
import type { File, HookFile } from "../types";
3+
import prettier from "prettier";
4+
import { parseNameFormats } from "../utils";
5+
6+
const mapHookFileToComponent = async (hookFile: HookFile): Promise<File> => {
7+
const {
8+
file: { fileName },
9+
} = hookFile;
10+
11+
const componentName = fileName.replace("use", "");
12+
const { camelCasePlural } = parseNameFormats(componentName);
13+
14+
const content = `
15+
${comment}
16+
17+
"use client";
18+
19+
import ${fileName} from "../hooks/${fileName}";
20+
21+
export default function ${componentName}() {
22+
const { ${camelCasePlural} } = ${fileName}();
23+
24+
return (
25+
<div
26+
style={{
27+
paddingTop: "20px",
28+
}}
29+
>
30+
<code>${camelCasePlural}</code>
31+
<pre
32+
className="border rounded-md text-xs"
33+
style={{
34+
marginTop: "4px",
35+
padding: "16px",
36+
height: "200px",
37+
overflowY: "auto",
38+
}}
39+
>
40+
{JSON.stringify(${camelCasePlural}, null, 2)}
41+
</pre>
42+
</div>
43+
)
44+
};
45+
`;
46+
47+
const formattedContent = await prettier.format(content, {
48+
parser: "typescript",
49+
});
50+
51+
return {
52+
fileName: `${componentName}.tsx`,
53+
content: formattedContent,
54+
};
55+
};
56+
57+
export const parseComponentFiles = async (
58+
hookFiles: HookFile[]
59+
): Promise<File[]> => {
60+
const componentPromises = hookFiles.map(mapHookFileToComponent);
61+
const files = await Promise.all(componentPromises);
62+
return files;
63+
};

0 commit comments

Comments
 (0)