Skip to content

Commit 046f4c7

Browse files
authored
fix: add Yarn support to Create React App and implement parallel async file write
add yarn support in create react app. write file async and parallelly to improve performance
2 parents a3e271d + b314ff5 commit 046f4c7

File tree

8 files changed

+47
-25
lines changed

8 files changed

+47
-25
lines changed

src/global/global.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,15 @@ class GlobalStateUtility {
9898
}
9999

100100
setDependencies(dependencies: string) {
101-
this.dependencies += dependencies + " ";
101+
this.dependencies += `${dependencies} `;
102102
}
103103

104104
getDependencies() {
105105
return this.dependencies;
106106
}
107107

108108
setDevDependencies(devDependencies: string) {
109-
this.devDependencies += devDependencies + " ";
109+
this.devDependencies += `${devDependencies} `;
110110
}
111111

112112
getDevDependencies() {

src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import readmeGenerator from "@/operation/readme";
3131
import cmdRunner from "@/utils/cmdRunner";
3232
import { NodePackageManager, SupportedProjectType } from "@/types";
3333
import addTestingInProject from "@/operation/testing";
34-
import { findFileRecursively, writeFile } from "./utils/file/file";
3534

3635
/**
3736
* current we are storing the config with code but if we increase the number of features then we can have plugin dir that has it's own config file
@@ -88,7 +87,7 @@ async function main() {
8887
//getting project types if react then config related to react projects
8988
const projectType = getCurrentProject();
9089
if (projectType === SupportedProjectType.REACT) {
91-
absolutePathConfigAdderInReact(selectedLanguage, selectedProjectType);
90+
await absolutePathConfigAdderInReact(selectedLanguage, selectedProjectType);
9291
await reactRouterAdder();
9392
}
9493
// const result = findFileRecursively(projectName,"page");

src/operation/projectGenerator/projectGenerator.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,25 @@ async function initReactCraProject(
8686
packageManager: NodePackageManager,
8787
selectedLanguage: SupportedLanguage,
8888
) {
89-
const commandLine = ["create-react-app", projectName];
89+
const packageManagerToUse = packageManager === NodePackageManager.NPM ? "npx" : packageManager;
9090

91-
if (selectedLanguage === "ts") commandLine.push("--template", "typescript");
91+
const commandLine = [];
92+
93+
if (packageManager === "npm") {
94+
commandLine.push("create-react-app");
95+
} else {
96+
commandLine.push("create","react-app");
97+
}
98+
commandLine.push(projectName);
99+
100+
if (selectedLanguage === SupportedLanguage.TS) {
101+
commandLine.push("--template","typescript");
102+
}
92103

93104
try {
94-
await cmdRunner("npx", commandLine);
105+
await cmdRunner(packageManagerToUse, commandLine);
95106
} catch (error) {
107+
console.log({ error11: error });
96108
process.exit(1);
97109
}
98110
}
@@ -134,7 +146,7 @@ export async function reactRouterAdder() {
134146
}
135147

136148
//adds absolute path config in tsconfig.json or creates jsconfig.json if js project
137-
export function absolutePathConfigAdderInReact(
149+
export async function absolutePathConfigAdderInReact(
138150
selectedLanguage: SupportedLanguage,
139151
selectedProjectType: SupportedProjectGenerator,
140152
) {
@@ -160,7 +172,7 @@ export function absolutePathConfigAdderInReact(
160172
return extraConfig + match;
161173
});
162174

163-
writeFile(viteConfigFileName, modifiedConfigString);
175+
await writeFile(viteConfigFileName, modifiedConfigString);
164176
}
165177

166178
if (selectedLanguage === SupportedLanguage.TS) {
@@ -194,7 +206,7 @@ export function absolutePathConfigAdderInReact(
194206
},
195207
};
196208

197-
writeFile("jsconfig.json", JSON.stringify(absolutePathConfigForJs));
209+
await writeFile("jsconfig.json", JSON.stringify(absolutePathConfigForJs));
198210
}
199211
} catch (error) {
200212
console.log(error);

src/operation/readme/readme.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,5 @@ export default async function readmeGenerator({
169169
const readmeContent = readme.join("\n");
170170

171171
//writing readme file with the dynamically generated readme content
172-
writeFile("README.md", readmeContent);
172+
await writeFile("README.md", readmeContent);
173173
}

src/operation/stateManagementCachingSol/graphql/graphql.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ async function codegenAdder(currentPackageManager: NodePackageManager) {
7171
...codegenDependencies.split(" "),
7272
]);
7373

74-
writeFile("codegen.ts", reactCodeGenConfig, process.cwd());
74+
await writeFile("codegen.ts", reactCodeGenConfig, process.cwd());
7575

7676
const packageJsonPath = path.join(process.cwd(), "package.json");
7777
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));

src/operation/testing/testing.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ async function addTestingInReactViteProject() {
6262
`/// <reference types="vitest" /> \n` + modifiedViteConfig;
6363

6464
//writing modified content in vite config
65-
writeFile(viteConfigFileName, modifiedViteConfig);
65+
await writeFile(viteConfigFileName, modifiedViteConfig);
6666

6767
//adding type definition if language is typescript
6868
if (selectedLanguage === SupportedLanguage.TS) {
@@ -78,7 +78,7 @@ async function addTestingInReactViteProject() {
7878
viteEnvDeclaration +
7979
`\n/// <reference types="@testing-library/jest-dom" />`;
8080

81-
writeFile(
81+
await writeFile(
8282
viteEnvDeclarationFileName,
8383
modifiedViteEnvDeclarationFile,
8484
path.join(process.cwd(), "src"),

src/operation/tooling/eslint/eslint.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ async function addEslintInNext(currentPackageManager: NodePackageManager) {
3232
);
3333

3434
//adding config file
35-
writeFile(".eslintrc.json", config);
35+
await writeFile(".eslintrc.json", config);
3636

3737
// installing necessary dependencies
3838
await cmdRunner(currentPackageManager, [
@@ -69,7 +69,7 @@ async function addEslintInReact(currentPackageManager: NodePackageManager) {
6969
);
7070

7171
//adding config file
72-
writeFile(".eslintrc.json", config);
72+
await writeFile(".eslintrc.json", config);
7373

7474
// installing necessary dependencies
7575
await cmdRunner(currentPackageManager, [

src/utils/file/file.ts

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import fs, { readdirSync, unlinkSync } from "fs";
2+
import fsPromise from 'fs/promises'
23
import path from "path";
34
import {
45
PluginConfigType,
@@ -107,16 +108,21 @@ export function writeFile(
107108
content: string,
108109
filePath?: string,
109110
) {
111+
return new Promise<string>((resolve,reject) =>{
110112
const writeFilePath = filePath
111113
? path.join(filePath, fileName)
112114
: path.join(process.cwd(), fileName);
113115
try {
114116
filePath && fs.mkdirSync(filePath, { recursive: true });
115117

116-
fs.writeFileSync(writeFilePath, content, "utf8");
118+
fsPromise.writeFile(writeFilePath,content,{encoding: "utf8"}).then(() =>{
119+
resolve('done')
120+
}).catch(err => reject(err))
117121
} catch (error) {
118122
console.log(error);
123+
reject(error)
119124
}
125+
})
120126
}
121127

122128
/**
@@ -182,6 +188,7 @@ export async function writeFileFromConfig(baseConfig: PluginConfigType) {
182188
: { component: "jsx", native: "js" };
183189

184190
//writing file from base config
191+
const writeFilePromises: Promise<string>[] = []
185192
baseConfig.files.forEach((fileDetail) => {
186193
const content =
187194
typeof fileDetail.content === "function"
@@ -193,9 +200,11 @@ export async function writeFileFromConfig(baseConfig: PluginConfigType) {
193200
? `${fileDetail.fileName}.${fileType[fileDetail.fileType]}`
194201
: fileDetail.fileName;
195202

196-
writeFile(fileName, content, path.join(process.cwd(), ...fileDetail.path));
203+
writeFilePromises.push(writeFile(fileName, content, path.join(process.cwd(), ...fileDetail.path)));
197204
});
198205

206+
await Promise.allSettled(writeFilePromises)
207+
199208
// If there are file modifications defined in the configuration, set them in the global state
200209
if (baseConfig?.fileModification) {
201210
globalInstance.setPluginAppEntryConfig(baseConfig.fileModification);
@@ -416,12 +425,13 @@ async function pluginEntryAdderInReact(pluginConfigArr: ReactPluginEntry[]) {
416425
const homePagePath = path.join(process.cwd(), "src", "components", "home");
417426

418427
// Write the home page content and its CSS
428+
await Promise.allSettled([
419429
writeFile(
420430
`Home.${isTsProject ? "tsx" : "jsx"}`,
421431
HomePageContent,
422-
homePagePath,
423-
);
424-
writeFile("Home.module.css", homePageCss, homePagePath);
432+
homePagePath,),
433+
writeFile("Home.module.css", homePageCss, homePagePath)
434+
])
425435
}
426436

427437
/**
@@ -472,10 +482,11 @@ async function pluginEntryAdderInNext(pluginConfigArr: NextPluginEntry[]) {
472482
const isTsProject = isFileExists(process.cwd(), "tsconfig.json");
473483
const homeContent = nextHomePageContent(isTsProject,importAndComponentValues.example);
474484
const homePath = path.join(process.cwd(),"src","app");
475-
writeFile(`page.${isTsProject ? "tsx" : "js"}`,homeContent,homePath);
476-
writeFile("page.module.css",nextHomeCssContent(),homePath)
477-
writeFile("globals.css","",homePath)
478-
485+
await Promise.allSettled([
486+
writeFile(`page.${isTsProject ? "tsx" : "js"}`,homeContent,homePath),
487+
writeFile("page.module.css",nextHomeCssContent(),homePath),
488+
writeFile("globals.css","",homePath),
489+
])
479490
}
480491

481492
/**

0 commit comments

Comments
 (0)