Skip to content

Commit

Permalink
added tailwind as style
Browse files Browse the repository at this point in the history
  • Loading branch information
Leo5661 committed Sep 29, 2024
1 parent 8d6d124 commit 55d7e62
Show file tree
Hide file tree
Showing 12 changed files with 803 additions and 34 deletions.
1 change: 1 addition & 0 deletions packages/codegen-cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"@clack/prompts": "^0.7.0",
"chalk": "^5.3.0",
"commander": "^12.1.0",
"cosmiconfig": "^9.0.0",
"execa": "^9.4.0",
"figlet": "^1.7.0",
"fs-extra": "^11.2.0",
Expand Down
28 changes: 19 additions & 9 deletions packages/codegen-cli/src/commands/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import pc from "picocolors";
import { z } from "zod";
import { Header } from "@/src/header";
import { isValidPackageName } from "../utits/is-valid-package-name";
import { Framework, templates } from "../utits/template";
import { Framework, StyleProps, templates } from "../utits/template";
import { generatePackage } from "../scripts/package-generator";

export type PromtConfig = {
projectName: string;
framework: Framework;
framework: string;
variant: string;
style: string;
style: StyleProps;
isORM: boolean;
orm: string;
onConfirm: boolean;
Expand Down Expand Up @@ -52,6 +52,17 @@ const variantList = (framework: string) => {
);
};

const styleList = (framework: string) => {
return (
templates
.find((f) => f.name === framework)
?.style?.map((style) => ({
value: style.name,
label: style.color(style.name),
})) || []
);
};

const typeOfFramework = (framework: string) => {
return templates.find((f) => f.name === framework)?.type;
};
Expand Down Expand Up @@ -82,15 +93,14 @@ export async function runInit() {
options: variantList(results.framework as string),
}),
style: ({ results }) => {
if (typeOfFramework(results.framework as string) !== "backend") {
if (
typeOfFramework(results.framework as string) !== "backend" &&
results.variant !== "default-next"
) {
return promt.select({
message: `🎨 What you want for style?`,
initialValue: "CSS",
options: [
{ value: "CSS", label: pc.blue("CSS") },
{ value: "SCSS", label: pc.yellow("SCSS") },
{ value: "Tailwind", label: pc.blueBright("TailwindCSS") },
],
options: styleList(results.framework as string),
});
}
},
Expand Down
16 changes: 11 additions & 5 deletions packages/codegen-cli/src/scripts/package-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { execa } from "execa";
import { writeFiles } from "../utits/io-util";
import { pkgFromUserAgent } from "../utits/get-package-info";
import { logger } from "../utits/logger";
import { setupStyle } from "./setup-style";

const cwd = process.cwd();

Expand Down Expand Up @@ -66,14 +67,19 @@ export const generatePackage = async (results: PromtConfig) => {
logger.error(error);
}

// if onConfirm is true, install dependencies
//Setup Style

if (onConfirm) {
const newDir = path.join(cwd, projectName);
process.chdir(newDir);
await execa`${packageManager} install`;
if (style) {
await setupStyle(root, framework, variant, style);
}

// if onConfirm is true, install dependencies

// if (onConfirm) {
// process.chdir(root);
// await execa`${packageManager} install`;
// }

let nextSteps = `cd ${projectName} \n${onConfirm ? "" : `${packageManager} install\n`}${packageManager} dev`;

promt.note(nextSteps, "🎉 Next steps.");
Expand Down
Empty file.
261 changes: 261 additions & 0 deletions packages/codegen-cli/src/scripts/setup-style.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,261 @@
import fs from "fs-extra";
import { StyleProps } from "../utits/template";
import { logger } from "../utits/logger";
import { execa } from "execa";
import { prependLine, writeFiles } from "../utits/io-util";
import * as styleTemplate from "../utits/style-template";

// const explorer = cosmiconfigSync("tailwind.config.js");

const cwd = process.cwd();

export const setupStyle = async (
rootDir: string,
framework: string,
variant: string,
style: StyleProps,
) => {
if (framework === "next" && style === "Tailwind") {
setTailwindOnNextjs(rootDir, variant);
} else if (framework === "react" && style === "Tailwind") {
setTailwindOnReact(rootDir, variant);
} else if (framework === "vue" && style === "Tailwind") {
setTailwindOnVue(rootDir, variant);
} else if (framework === "rn" && style === "NativewindCSS") {
setNativewindOnExpo(rootDir);
}
};

async function setTailwindOnNextjs(rootDir: string, variant: string) {
let tailwindConfigTemplate: string;
let tailwindFileName: string;
let postcssFileName: string;
let postcssConfigTemplate: string;
if (variant === "js") {
// tailwind
tailwindConfigTemplate = styleTemplate.TAILWIND_CONFIG_NEXT_JS;
tailwindFileName = "tailwind.config.js";

// postcss
postcssConfigTemplate = styleTemplate.POSTCSS_CONFIG_NEXT_JS;
postcssFileName = "postcss.config.js";
} else {
// tailwind
tailwindConfigTemplate = styleTemplate.TAILWIND_CONFIG_NEXT_TS;
tailwindFileName = "tailwind.config.ts";

// postcss
postcssConfigTemplate = styleTemplate.POSTCSS_CONFIG_NEXT_MJS;
postcssFileName = "postcss.config.mjs";
}

try {
process.chdir(rootDir);
await execa("npm", [
"install",
"-D",
"tailwindcss",
"postcss",
"autoprefixer",
]);

await execa("npx", ["tailwindcss", "init", "-p"]);

// update postcss and tailwind
await writeFiles({
root: rootDir,
fileName: postcssFileName,
content: postcssConfigTemplate,
});

await writeFiles({
root: rootDir,
fileName: tailwindFileName,
content: tailwindConfigTemplate,
});

// update global css

await writeFiles({
root: `${rootDir}/app`,
fileName: "globals.css",
content: styleTemplate.TAILWIND_GLOBAL_CSS,
});

if (variant === "js") {
await writeFiles({
root: `${rootDir}/app`,
fileName: "page.js",
content: styleTemplate.NEXT_PAGE_TAILWIND_CONTENT,
});
} else {
await writeFiles({
root: `${rootDir}/app`,
fileName: "page.tsx",
content: styleTemplate.NEXT_PAGE_TAILWIND_CONTENT,
});
}

// remove unneeded files

await fs.remove(`${rootDir}/app/page.module.css`);
} catch (error) {
logger.error(error);
}
}

async function setTailwindOnReact(rootDir: string, variant: string) {
try {
process.chdir(rootDir);
await execa("npm", [
"install",
"-D",
"tailwindcss",
"postcss",
"autoprefixer",
]);

await execa("npx", ["tailwindcss", "init", "-p"]);

// update tailwind

await writeFiles({
root: rootDir,
fileName: "tailwind.config.js",
content: styleTemplate.TAILWIND_CONFIG_REACT,
});

// update index css

await writeFiles({
root: `${rootDir}/src`,
fileName: "index.css",
content: styleTemplate.TAILWIND_GLOBAL_CSS,
});

// update react components

if (variant === "js") {
await writeFiles({
root: `${rootDir}/src`,
fileName: "main.jsx",
content: styleTemplate.REACT_MAIN_PAGE,
});

await writeFiles({
root: `${rootDir}/src`,
fileName: "page.jsx",
content: styleTemplate.REACT_APP_PAGE,
});
} else {
await writeFiles({
root: `${rootDir}/app`,
fileName: "main.tsx",
content: styleTemplate.REACT_MAIN_PAGE,
});

await writeFiles({
root: `${rootDir}/src`,
fileName: "page.tsx",
content: styleTemplate.REACT_APP_PAGE,
});
}

// remove unneeded files

await fs.remove(`${rootDir}/src/App.css`);
} catch (error) {
logger.error(error);
}
}

async function setTailwindOnVue(rootDir: string, variant: string) {
try {
process.chdir(rootDir);

await execa("npm", [
"install",
"-D",
"tailwindcss",
"postcss",
"autoprefixer",
]);

if (variant === "ts") {
await execa("npx", ["tailwindcss", "init", "--ts", "-p"]);

await writeFiles({
root: rootDir,
fileName: "tailwind.config.ts",
content: styleTemplate.TAILWIND_CONFIG_VUE_TS,
});
} else {
await execa("npx", ["tailwindcss", "init", "-p"]);

await writeFiles({
root: rootDir,
fileName: "tailwind.config.js",
content: styleTemplate.TAILWIND_CONFIG_VUE_JS,
});
}

// update index css

await writeFiles({
root: `${rootDir}/src`,
fileName: "style.css",
content: styleTemplate.TAILWIND_GLOBAL_CSS,
});

// update vue components

await writeFiles({
root: `${rootDir}/src`,
fileName: "App.vue",
content: styleTemplate.VUE_APP_PAGE,
});
} catch (error) {
logger.error(error);
}
}

async function setNativewindOnExpo(rootDir: string) {
try {
process.chdir(rootDir);

/* TODO: Update Nativewind as of now using nativewind v2.x and tailwindcss v3.3.2
* as nativewind v4.x get into stable we will use tailwindcss@latest with expo.
*/

// install dependencies
await execa("npm", [
"nativewind@^4.0.1",
"react-native-reanimated",
"tailwindcss",
]);

// if OS is mac run pod install
if (process.platform === "darwin") {
await execa("npx", ["pod-install"]);
}

// update tailwind
await writeFiles({
root: rootDir,
fileName: "tailwind.config.js",
content: styleTemplate.NATIVEWIND_TAILWIND_CONFIG,
});

// update global css
await prependLine(`${rootDir}/global.css`, 'import "../global.css"');

// for typeScript support
await writeFiles({
root: rootDir,
fileName: "nativewind-env.d.ts",
content: styleTemplate.NATIVEWIND_ENV_D_TS,
});
} catch (error) {
logger.error(error);
}
}
16 changes: 16 additions & 0 deletions packages/codegen-cli/src/utits/io-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,19 @@ export const writeFiles = async ({
}
}
};

/**
* Prepend a line to a file.
* @param {string} filePath The path to the file to modify
* @param {string} newLine The line to prepend to the file
*/
export const prependLine = async (filePath: string, newLine: string) => {
try {
const existingContent = await fs.readFile(filePath, "utf8");
const updatedContent = `${newLine}\n${existingContent}`;

await fs.writeFile(filePath, updatedContent, "utf8");
} catch (err) {
console.error("Error:", err);
}
};
Loading

0 comments on commit 55d7e62

Please sign in to comment.