Skip to content

Commit a218149

Browse files
authored
cleanup(misc): refactor cra-to-nx to be faster and smaller (#13038)
1 parent 87b9f7e commit a218149

File tree

10 files changed

+62
-110
lines changed

10 files changed

+62
-110
lines changed

packages/cra-to-nx/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
},
2424
"homepage": "https://nx.dev",
2525
"dependencies": {
26-
"@nrwl/devkit": "file:../devkit",
27-
"@nrwl/workspace": "file:../workspace",
2826
"fs-extra": "^10.1.0",
2927
"nx": "file:../nx",
3028
"tslib": "^2.3.0",

packages/cra-to-nx/src/index.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#!/usr/bin/env node
2+
23
import { createNxWorkspaceForReact } from './lib/cra-to-nx';
34
import * as yargsParser from 'yargs-parser';
45

56
export * from './lib/cra-to-nx';
67

78
const args = yargsParser(process.argv);
89

9-
createNxWorkspaceForReact(args)
10-
.then(() => {
11-
process.exit(0);
12-
})
13-
.catch((e) => {
14-
console.log(e);
15-
process.exit(1);
16-
});
10+
createNxWorkspaceForReact(args).catch((e) => {
11+
console.log(e);
12+
process.exit(1);
13+
});
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { readJsonSync, writeJsonSync } from 'fs-extra';
1+
import { readJsonFile, writeJsonFile } from 'nx/src/utils/fileutils';
22

33
export function addCRAcracoScriptsToPackageJson(appName: string) {
4-
const packageJson = readJsonSync(`apps/${appName}/package.json`);
4+
const packageJson = readJsonFile(`apps/${appName}/package.json`);
55
packageJson.scripts = {
66
...packageJson.scripts,
77
start: 'craco start',
88
serve: 'npm start',
99
build: `cross-env BUILD_PATH=../../dist/apps/${appName} craco build`,
1010
test: 'craco test',
1111
};
12-
writeJsonSync(`apps/${appName}/package.json`, packageJson, { spaces: 2 });
12+
writeJsonFile(`apps/${appName}/package.json`, packageJson);
1313
}
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import { removeSync } from 'fs-extra';
2-
import * as fs from 'fs';
2+
import { readJsonFile, writeJsonFile } from 'nx/src/utils/fileutils';
33

44
export function cleanUpFiles(appName: string) {
55
// Delete targets from project since we delegate to npm scripts.
6-
const data = fs.readFileSync(`apps/${appName}/project.json`);
7-
const json = JSON.parse(data.toString());
6+
const json = readJsonFile(`apps/${appName}/project.json`);
87
delete json.targets;
9-
fs.writeFileSync(
10-
`apps/${appName}/project.json`,
11-
JSON.stringify(json, null, 2)
12-
);
8+
writeJsonFile(`apps/${appName}/project.json`, json);
139

1410
removeSync('temp-workspace');
1511
}

packages/cra-to-nx/src/lib/cra-to-nx.ts

Lines changed: 21 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
#!/usr/bin/env node
2-
import { fileExists } from '@nrwl/workspace/src/utilities/fileutils';
31
import { execSync } from 'child_process';
2+
import { copySync, moveSync, removeSync, readdirSync } from 'fs-extra';
3+
4+
import { fileExists, readJsonFile } from 'nx/src/utils/fileutils';
5+
import { output } from 'nx/src/utils/output';
46
import {
5-
copySync,
6-
existsSync,
7-
moveSync,
8-
readJsonSync,
9-
removeSync,
10-
readdirSync,
11-
} from 'fs-extra';
12-
import { output } from '@nrwl/devkit';
7+
detectPackageManager,
8+
getPackageManagerCommand,
9+
PackageManagerCommands,
10+
} from 'nx/src/utils/package-manager';
1311

1412
import { addCRAcracoScriptsToPackageJson } from './add-cra-commands-to-nx';
1513
import { checkForUncommittedChanges } from './check-for-uncommitted-changes';
@@ -19,31 +17,15 @@ import { setupTsConfig } from './tsconfig-setup';
1917
import { writeCracoConfig } from './write-craco-config';
2018
import { cleanUpFiles } from './clean-up-files';
2119

22-
let packageManager: string;
23-
function checkPackageManager() {
24-
packageManager = existsSync('yarn.lock')
25-
? 'yarn'
26-
: existsSync('pnpm-lock.yaml')
27-
? 'pnpm'
28-
: 'npm';
29-
}
30-
31-
function addDependency(dep: string, dev?: boolean) {
20+
function addDependency(pmc: PackageManagerCommands, dep: string) {
3221
output.log({ title: `📦 Adding dependency: ${dep}` });
33-
if (packageManager === 'yarn') {
34-
execSync(`yarn add ${dev ? '-D ' : ''}${dep}`, { stdio: [0, 1, 2] });
35-
} else if (packageManager === 'pnpm') {
36-
execSync(`pnpm i ${dev ? '--save-dev ' : ''}${dep}`, { stdio: [0, 1, 2] });
37-
} else {
38-
execSync(`npm i --force ${dev ? '--save-dev ' : ''}${dep}`, {
39-
stdio: [0, 1, 2],
40-
});
41-
}
22+
execSync(`${pmc.addDev} ${dep}`, { stdio: [0, 1, 2] });
4223
}
4324

4425
export async function createNxWorkspaceForReact(options: Record<string, any>) {
4526
checkForUncommittedChanges();
46-
checkPackageManager();
27+
const packageManager = detectPackageManager();
28+
const pmc = getPackageManagerCommand(packageManager);
4729

4830
output.log({ title: '🐳 Nx initialization' });
4931

@@ -54,7 +36,7 @@ export async function createNxWorkspaceForReact(options: Record<string, any>) {
5436
}
5537

5638
const reactAppName = readNameFromPackageJson();
57-
const packageJson = readJsonSync('package.json');
39+
const packageJson = readJsonFile('package.json');
5840
const deps = {
5941
...packageJson.dependencies,
6042
...packageJson.devDependencies,
@@ -159,17 +141,15 @@ export async function createNxWorkspaceForReact(options: Record<string, any>) {
159141
title: '🧶 Adding npm packages to your new Nx workspace to support CRA',
160142
});
161143

162-
addDependency('react-scripts', true);
163-
addDependency('@testing-library/jest-dom', true);
164-
addDependency('eslint-config-react-app', true);
165-
addDependency('@craco/craco', true);
166-
addDependency('web-vitals', true);
167-
addDependency('jest-watch-typeahead', true); // Only for ts apps?
168-
addDependency('cross-env', true);
144+
addDependency(pmc, 'react-scripts');
145+
addDependency(pmc, '@testing-library/jest-dom');
146+
addDependency(pmc, 'eslint-config-react-app');
147+
addDependency(pmc, '@craco/craco');
148+
addDependency(pmc, 'web-vitals');
149+
addDependency(pmc, 'jest-watch-typeahead'); // Only for ts apps?
150+
addDependency(pmc, 'cross-env');
169151

170-
output.log({
171-
title: '🎉 Done!',
172-
});
152+
output.log({ title: '🎉 Done!' });
173153
output.note({
174154
title: 'First time using Nx? Check out this interactive Nx tutorial.',
175155
bodyLines: [

packages/cra-to-nx/src/lib/read-name-from-package-json.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import { fileExists } from '@nrwl/workspace/src/utilities/fileutils';
2-
import * as fs from 'fs';
1+
import { fileExists, readJsonFile } from 'nx/src/utils/fileutils';
32

43
export function readNameFromPackageJson(): string {
54
let appName = 'webapp';
65
if (fileExists('package.json')) {
7-
const data = fs.readFileSync('package.json');
8-
const json = JSON.parse(data.toString());
6+
const json = readJsonFile('package.json');
97
if (
108
json['name'] &&
119
json['name'].length &&

packages/cra-to-nx/src/lib/setup-e2e-project.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
import { fileExists } from '@nrwl/workspace/src/utilities/fileutils';
2-
import * as fs from 'fs';
1+
import {
2+
fileExists,
3+
readJsonFile,
4+
writeJsonFile,
5+
} from 'nx/src/utils/fileutils';
6+
import { writeFileSync } from 'fs';
37

48
export function setupE2eProject(appName: string) {
5-
const data = fs.readFileSync(`apps/${appName}-e2e/project.json`);
6-
const json = JSON.parse(data.toString());
9+
const json = readJsonFile(`apps/${appName}-e2e/project.json`);
710
json.targets.e2e = {
811
executor: 'nx:run-commands',
912
options: {
@@ -25,10 +28,7 @@ export function setupE2eProject(appName: string) {
2528
readyWhen: 'can now view',
2629
},
2730
};
28-
fs.writeFileSync(
29-
`apps/${appName}-e2e/project.json`,
30-
JSON.stringify(json, null, 2)
31-
);
31+
writeJsonFile(`apps/${appName}-e2e/project.json`, json);
3232

3333
if (fileExists(`apps/${appName}-e2e/src/integration/app.spec.ts`)) {
3434
const integrationE2eTest = `
@@ -38,7 +38,7 @@ export function setupE2eProject(appName: string) {
3838
cy.get('body').should('exist');
3939
});
4040
});`;
41-
fs.writeFileSync(
41+
writeFileSync(
4242
`apps/${appName}-e2e/src/integration/app.spec.ts`,
4343
integrationE2eTest
4444
);

packages/cra-to-nx/src/lib/tsconfig-setup.ts

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
import { fileExists } from '@nrwl/workspace/src/utilities/fileutils';
2-
import * as fs from 'fs';
1+
import {
2+
fileExists,
3+
readJsonFile,
4+
writeJsonFile,
5+
} from 'nx/src/utils/fileutils';
36

47
const defaultTsConfig = {
58
extends: '../../tsconfig.base.json',
@@ -57,8 +60,7 @@ const defaultTsConfigSpec = {
5760

5861
export function setupTsConfig(appName: string) {
5962
if (fileExists(`apps/${appName}/tsconfig.json`)) {
60-
const data = fs.readFileSync(`apps/${appName}/tsconfig.json`);
61-
const json = JSON.parse(data.toString());
63+
const json = readJsonFile(`apps/${appName}/tsconfig.json`);
6264
json.extends = '../../tsconfig.base.json';
6365
if (json.compilerOptions) {
6466
json.compilerOptions.jsx = 'react';
@@ -70,44 +72,24 @@ export function setupTsConfig(appName: string) {
7072
allowSyntheticDefaultImports: true,
7173
};
7274
}
73-
fs.writeFileSync(
74-
`apps/${appName}/tsconfig.json`,
75-
JSON.stringify(json, null, 2)
76-
);
75+
writeJsonFile(`apps/${appName}/tsconfig.json`, json);
7776
} else {
78-
fs.writeFileSync(
79-
`apps/${appName}/tsconfig.json`,
80-
JSON.stringify(defaultTsConfig, null, 2)
81-
);
77+
writeJsonFile(`apps/${appName}/tsconfig.json`, defaultTsConfig);
8278
}
8379

8480
if (fileExists(`apps/${appName}/tsconfig.app.json`)) {
85-
const data = fs.readFileSync(`apps/${appName}/tsconfig.app.json`);
86-
const json = JSON.parse(data.toString());
81+
const json = readJsonFile(`apps/${appName}/tsconfig.app.json`);
8782
json.extends = './tsconfig.json';
88-
fs.writeFileSync(
89-
`apps/${appName}/tsconfig.app.json`,
90-
JSON.stringify(json, null, 2)
91-
);
83+
writeJsonFile(`apps/${appName}/tsconfig.app.json`, json);
9284
} else {
93-
fs.writeFileSync(
94-
`apps/${appName}/tsconfig.app.json`,
95-
JSON.stringify(defaultTsConfigApp, null, 2)
96-
);
85+
writeJsonFile(`apps/${appName}/tsconfig.app.json`, defaultTsConfigApp);
9786
}
9887

9988
if (fileExists(`apps/${appName}/tsconfig.spec.json`)) {
100-
const data = fs.readFileSync(`apps/${appName}/tsconfig.spec.json`);
101-
const json = JSON.parse(data.toString());
89+
const json = readJsonFile(`apps/${appName}/tsconfig.spec.json`);
10290
json.extends = './tsconfig.json';
103-
fs.writeFileSync(
104-
`apps/${appName}/tsconfig.spec.json`,
105-
JSON.stringify(json, null, 2)
106-
);
91+
writeJsonFile(`apps/${appName}/tsconfig.spec.json`, json);
10792
} else {
108-
fs.writeFileSync(
109-
`apps/${appName}/tsconfig.spec.json`,
110-
JSON.stringify(defaultTsConfigSpec, null, 2)
111-
);
93+
writeJsonFile(`apps/${appName}/tsconfig.spec.json`, defaultTsConfigSpec);
11294
}
11395
}

packages/cra-to-nx/src/lib/write-craco-config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import * as fs from 'fs';
1+
import { writeFileSync } from 'fs';
22

33
export function writeCracoConfig(appName: string, isCRA5: boolean) {
44
const configOverride = `
@@ -57,5 +57,5 @@ export function writeCracoConfig(appName: string, isCRA5: boolean) {
5757
},
5858
};
5959
`;
60-
fs.writeFileSync(`apps/${appName}/craco.config.js`, configOverride);
60+
writeFileSync(`apps/${appName}/craco.config.js`, configOverride);
6161
}

packages/cra-to-nx/tsconfig.lib.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
"compilerOptions": {
44
"module": "commonjs",
55
"outDir": "../../dist/out-tsc",
6-
"declaration": true,
7-
"types": ["node"]
6+
"declaration": false,
7+
"types": ["node"],
8+
"sourceMap": false
89
},
910
"exclude": ["**/*.spec.ts", "jest.config.ts"],
1011
"include": ["**/*.ts"]

0 commit comments

Comments
 (0)