From a218149bca289e07537f5c7b9c43943a1f64d65f Mon Sep 17 00:00:00 2001 From: Phillip Barta Date: Tue, 8 Nov 2022 23:02:55 +0100 Subject: [PATCH] cleanup(misc): refactor cra-to-nx to be faster and smaller (#13038) --- packages/cra-to-nx/package.json | 2 - packages/cra-to-nx/src/index.ts | 13 ++-- .../src/lib/add-cra-commands-to-nx.ts | 6 +- packages/cra-to-nx/src/lib/clean-up-files.ts | 10 +-- packages/cra-to-nx/src/lib/cra-to-nx.ts | 62 +++++++------------ .../src/lib/read-name-from-package-json.ts | 6 +- .../cra-to-nx/src/lib/setup-e2e-project.ts | 18 +++--- packages/cra-to-nx/src/lib/tsconfig-setup.ts | 46 +++++--------- .../cra-to-nx/src/lib/write-craco-config.ts | 4 +- packages/cra-to-nx/tsconfig.lib.json | 5 +- 10 files changed, 62 insertions(+), 110 deletions(-) diff --git a/packages/cra-to-nx/package.json b/packages/cra-to-nx/package.json index f816dfe4fe..bdb91882a4 100644 --- a/packages/cra-to-nx/package.json +++ b/packages/cra-to-nx/package.json @@ -23,8 +23,6 @@ }, "homepage": "https://nx.dev", "dependencies": { - "@nrwl/devkit": "file:../devkit", - "@nrwl/workspace": "file:../workspace", "fs-extra": "^10.1.0", "nx": "file:../nx", "tslib": "^2.3.0", diff --git a/packages/cra-to-nx/src/index.ts b/packages/cra-to-nx/src/index.ts index 943ca63d31..1d71ba18bc 100644 --- a/packages/cra-to-nx/src/index.ts +++ b/packages/cra-to-nx/src/index.ts @@ -1,4 +1,5 @@ #!/usr/bin/env node + import { createNxWorkspaceForReact } from './lib/cra-to-nx'; import * as yargsParser from 'yargs-parser'; @@ -6,11 +7,7 @@ export * from './lib/cra-to-nx'; const args = yargsParser(process.argv); -createNxWorkspaceForReact(args) - .then(() => { - process.exit(0); - }) - .catch((e) => { - console.log(e); - process.exit(1); - }); +createNxWorkspaceForReact(args).catch((e) => { + console.log(e); + process.exit(1); +}); diff --git a/packages/cra-to-nx/src/lib/add-cra-commands-to-nx.ts b/packages/cra-to-nx/src/lib/add-cra-commands-to-nx.ts index 7a5362df45..10a2366794 100644 --- a/packages/cra-to-nx/src/lib/add-cra-commands-to-nx.ts +++ b/packages/cra-to-nx/src/lib/add-cra-commands-to-nx.ts @@ -1,7 +1,7 @@ -import { readJsonSync, writeJsonSync } from 'fs-extra'; +import { readJsonFile, writeJsonFile } from 'nx/src/utils/fileutils'; export function addCRAcracoScriptsToPackageJson(appName: string) { - const packageJson = readJsonSync(`apps/${appName}/package.json`); + const packageJson = readJsonFile(`apps/${appName}/package.json`); packageJson.scripts = { ...packageJson.scripts, start: 'craco start', @@ -9,5 +9,5 @@ export function addCRAcracoScriptsToPackageJson(appName: string) { build: `cross-env BUILD_PATH=../../dist/apps/${appName} craco build`, test: 'craco test', }; - writeJsonSync(`apps/${appName}/package.json`, packageJson, { spaces: 2 }); + writeJsonFile(`apps/${appName}/package.json`, packageJson); } diff --git a/packages/cra-to-nx/src/lib/clean-up-files.ts b/packages/cra-to-nx/src/lib/clean-up-files.ts index d770433388..5a8623aa4b 100644 --- a/packages/cra-to-nx/src/lib/clean-up-files.ts +++ b/packages/cra-to-nx/src/lib/clean-up-files.ts @@ -1,15 +1,11 @@ import { removeSync } from 'fs-extra'; -import * as fs from 'fs'; +import { readJsonFile, writeJsonFile } from 'nx/src/utils/fileutils'; export function cleanUpFiles(appName: string) { // Delete targets from project since we delegate to npm scripts. - const data = fs.readFileSync(`apps/${appName}/project.json`); - const json = JSON.parse(data.toString()); + const json = readJsonFile(`apps/${appName}/project.json`); delete json.targets; - fs.writeFileSync( - `apps/${appName}/project.json`, - JSON.stringify(json, null, 2) - ); + writeJsonFile(`apps/${appName}/project.json`, json); removeSync('temp-workspace'); } diff --git a/packages/cra-to-nx/src/lib/cra-to-nx.ts b/packages/cra-to-nx/src/lib/cra-to-nx.ts index b2a808b76d..9719816875 100644 --- a/packages/cra-to-nx/src/lib/cra-to-nx.ts +++ b/packages/cra-to-nx/src/lib/cra-to-nx.ts @@ -1,15 +1,13 @@ -#!/usr/bin/env node -import { fileExists } from '@nrwl/workspace/src/utilities/fileutils'; import { execSync } from 'child_process'; +import { copySync, moveSync, removeSync, readdirSync } from 'fs-extra'; + +import { fileExists, readJsonFile } from 'nx/src/utils/fileutils'; +import { output } from 'nx/src/utils/output'; import { - copySync, - existsSync, - moveSync, - readJsonSync, - removeSync, - readdirSync, -} from 'fs-extra'; -import { output } from '@nrwl/devkit'; + detectPackageManager, + getPackageManagerCommand, + PackageManagerCommands, +} from 'nx/src/utils/package-manager'; import { addCRAcracoScriptsToPackageJson } from './add-cra-commands-to-nx'; import { checkForUncommittedChanges } from './check-for-uncommitted-changes'; @@ -19,31 +17,15 @@ import { setupTsConfig } from './tsconfig-setup'; import { writeCracoConfig } from './write-craco-config'; import { cleanUpFiles } from './clean-up-files'; -let packageManager: string; -function checkPackageManager() { - packageManager = existsSync('yarn.lock') - ? 'yarn' - : existsSync('pnpm-lock.yaml') - ? 'pnpm' - : 'npm'; -} - -function addDependency(dep: string, dev?: boolean) { +function addDependency(pmc: PackageManagerCommands, dep: string) { output.log({ title: `๐Ÿ“ฆ Adding dependency: ${dep}` }); - if (packageManager === 'yarn') { - execSync(`yarn add ${dev ? '-D ' : ''}${dep}`, { stdio: [0, 1, 2] }); - } else if (packageManager === 'pnpm') { - execSync(`pnpm i ${dev ? '--save-dev ' : ''}${dep}`, { stdio: [0, 1, 2] }); - } else { - execSync(`npm i --force ${dev ? '--save-dev ' : ''}${dep}`, { - stdio: [0, 1, 2], - }); - } + execSync(`${pmc.addDev} ${dep}`, { stdio: [0, 1, 2] }); } export async function createNxWorkspaceForReact(options: Record) { checkForUncommittedChanges(); - checkPackageManager(); + const packageManager = detectPackageManager(); + const pmc = getPackageManagerCommand(packageManager); output.log({ title: '๐Ÿณ Nx initialization' }); @@ -54,7 +36,7 @@ export async function createNxWorkspaceForReact(options: Record) { } const reactAppName = readNameFromPackageJson(); - const packageJson = readJsonSync('package.json'); + const packageJson = readJsonFile('package.json'); const deps = { ...packageJson.dependencies, ...packageJson.devDependencies, @@ -159,17 +141,15 @@ export async function createNxWorkspaceForReact(options: Record) { title: '๐Ÿงถ Adding npm packages to your new Nx workspace to support CRA', }); - addDependency('react-scripts', true); - addDependency('@testing-library/jest-dom', true); - addDependency('eslint-config-react-app', true); - addDependency('@craco/craco', true); - addDependency('web-vitals', true); - addDependency('jest-watch-typeahead', true); // Only for ts apps? - addDependency('cross-env', true); + addDependency(pmc, 'react-scripts'); + addDependency(pmc, '@testing-library/jest-dom'); + addDependency(pmc, 'eslint-config-react-app'); + addDependency(pmc, '@craco/craco'); + addDependency(pmc, 'web-vitals'); + addDependency(pmc, 'jest-watch-typeahead'); // Only for ts apps? + addDependency(pmc, 'cross-env'); - output.log({ - title: '๐ŸŽ‰ Done!', - }); + output.log({ title: '๐ŸŽ‰ Done!' }); output.note({ title: 'First time using Nx? Check out this interactive Nx tutorial.', bodyLines: [ diff --git a/packages/cra-to-nx/src/lib/read-name-from-package-json.ts b/packages/cra-to-nx/src/lib/read-name-from-package-json.ts index 3719bd324c..c52be1039a 100644 --- a/packages/cra-to-nx/src/lib/read-name-from-package-json.ts +++ b/packages/cra-to-nx/src/lib/read-name-from-package-json.ts @@ -1,11 +1,9 @@ -import { fileExists } from '@nrwl/workspace/src/utilities/fileutils'; -import * as fs from 'fs'; +import { fileExists, readJsonFile } from 'nx/src/utils/fileutils'; export function readNameFromPackageJson(): string { let appName = 'webapp'; if (fileExists('package.json')) { - const data = fs.readFileSync('package.json'); - const json = JSON.parse(data.toString()); + const json = readJsonFile('package.json'); if ( json['name'] && json['name'].length && diff --git a/packages/cra-to-nx/src/lib/setup-e2e-project.ts b/packages/cra-to-nx/src/lib/setup-e2e-project.ts index efcf218b27..f4b8b7cfb1 100644 --- a/packages/cra-to-nx/src/lib/setup-e2e-project.ts +++ b/packages/cra-to-nx/src/lib/setup-e2e-project.ts @@ -1,9 +1,12 @@ -import { fileExists } from '@nrwl/workspace/src/utilities/fileutils'; -import * as fs from 'fs'; +import { + fileExists, + readJsonFile, + writeJsonFile, +} from 'nx/src/utils/fileutils'; +import { writeFileSync } from 'fs'; export function setupE2eProject(appName: string) { - const data = fs.readFileSync(`apps/${appName}-e2e/project.json`); - const json = JSON.parse(data.toString()); + const json = readJsonFile(`apps/${appName}-e2e/project.json`); json.targets.e2e = { executor: 'nx:run-commands', options: { @@ -25,10 +28,7 @@ export function setupE2eProject(appName: string) { readyWhen: 'can now view', }, }; - fs.writeFileSync( - `apps/${appName}-e2e/project.json`, - JSON.stringify(json, null, 2) - ); + writeJsonFile(`apps/${appName}-e2e/project.json`, json); if (fileExists(`apps/${appName}-e2e/src/integration/app.spec.ts`)) { const integrationE2eTest = ` @@ -38,7 +38,7 @@ export function setupE2eProject(appName: string) { cy.get('body').should('exist'); }); });`; - fs.writeFileSync( + writeFileSync( `apps/${appName}-e2e/src/integration/app.spec.ts`, integrationE2eTest ); diff --git a/packages/cra-to-nx/src/lib/tsconfig-setup.ts b/packages/cra-to-nx/src/lib/tsconfig-setup.ts index 9a898b62d3..c8e89a2a62 100644 --- a/packages/cra-to-nx/src/lib/tsconfig-setup.ts +++ b/packages/cra-to-nx/src/lib/tsconfig-setup.ts @@ -1,5 +1,8 @@ -import { fileExists } from '@nrwl/workspace/src/utilities/fileutils'; -import * as fs from 'fs'; +import { + fileExists, + readJsonFile, + writeJsonFile, +} from 'nx/src/utils/fileutils'; const defaultTsConfig = { extends: '../../tsconfig.base.json', @@ -57,8 +60,7 @@ const defaultTsConfigSpec = { export function setupTsConfig(appName: string) { if (fileExists(`apps/${appName}/tsconfig.json`)) { - const data = fs.readFileSync(`apps/${appName}/tsconfig.json`); - const json = JSON.parse(data.toString()); + const json = readJsonFile(`apps/${appName}/tsconfig.json`); json.extends = '../../tsconfig.base.json'; if (json.compilerOptions) { json.compilerOptions.jsx = 'react'; @@ -70,44 +72,24 @@ export function setupTsConfig(appName: string) { allowSyntheticDefaultImports: true, }; } - fs.writeFileSync( - `apps/${appName}/tsconfig.json`, - JSON.stringify(json, null, 2) - ); + writeJsonFile(`apps/${appName}/tsconfig.json`, json); } else { - fs.writeFileSync( - `apps/${appName}/tsconfig.json`, - JSON.stringify(defaultTsConfig, null, 2) - ); + writeJsonFile(`apps/${appName}/tsconfig.json`, defaultTsConfig); } if (fileExists(`apps/${appName}/tsconfig.app.json`)) { - const data = fs.readFileSync(`apps/${appName}/tsconfig.app.json`); - const json = JSON.parse(data.toString()); + const json = readJsonFile(`apps/${appName}/tsconfig.app.json`); json.extends = './tsconfig.json'; - fs.writeFileSync( - `apps/${appName}/tsconfig.app.json`, - JSON.stringify(json, null, 2) - ); + writeJsonFile(`apps/${appName}/tsconfig.app.json`, json); } else { - fs.writeFileSync( - `apps/${appName}/tsconfig.app.json`, - JSON.stringify(defaultTsConfigApp, null, 2) - ); + writeJsonFile(`apps/${appName}/tsconfig.app.json`, defaultTsConfigApp); } if (fileExists(`apps/${appName}/tsconfig.spec.json`)) { - const data = fs.readFileSync(`apps/${appName}/tsconfig.spec.json`); - const json = JSON.parse(data.toString()); + const json = readJsonFile(`apps/${appName}/tsconfig.spec.json`); json.extends = './tsconfig.json'; - fs.writeFileSync( - `apps/${appName}/tsconfig.spec.json`, - JSON.stringify(json, null, 2) - ); + writeJsonFile(`apps/${appName}/tsconfig.spec.json`, json); } else { - fs.writeFileSync( - `apps/${appName}/tsconfig.spec.json`, - JSON.stringify(defaultTsConfigSpec, null, 2) - ); + writeJsonFile(`apps/${appName}/tsconfig.spec.json`, defaultTsConfigSpec); } } diff --git a/packages/cra-to-nx/src/lib/write-craco-config.ts b/packages/cra-to-nx/src/lib/write-craco-config.ts index 2e789b5e8b..90412e3d7c 100644 --- a/packages/cra-to-nx/src/lib/write-craco-config.ts +++ b/packages/cra-to-nx/src/lib/write-craco-config.ts @@ -1,4 +1,4 @@ -import * as fs from 'fs'; +import { writeFileSync } from 'fs'; export function writeCracoConfig(appName: string, isCRA5: boolean) { const configOverride = ` @@ -57,5 +57,5 @@ export function writeCracoConfig(appName: string, isCRA5: boolean) { }, }; `; - fs.writeFileSync(`apps/${appName}/craco.config.js`, configOverride); + writeFileSync(`apps/${appName}/craco.config.js`, configOverride); } diff --git a/packages/cra-to-nx/tsconfig.lib.json b/packages/cra-to-nx/tsconfig.lib.json index 3ce6be94ee..89d635c567 100644 --- a/packages/cra-to-nx/tsconfig.lib.json +++ b/packages/cra-to-nx/tsconfig.lib.json @@ -3,8 +3,9 @@ "compilerOptions": { "module": "commonjs", "outDir": "../../dist/out-tsc", - "declaration": true, - "types": ["node"] + "declaration": false, + "types": ["node"], + "sourceMap": false }, "exclude": ["**/*.spec.ts", "jest.config.ts"], "include": ["**/*.ts"]