From ea1b19391ffa47987f91d0fc8fd3d0fbc6e9c7dd Mon Sep 17 00:00:00 2001 From: James <5511220+Zamiell@users.noreply.github.com> Date: Fri, 3 Nov 2023 12:11:15 -0400 Subject: [PATCH] fix(cli): createProject with no lockfiles --- .../src/commands/init/createProject.ts | 5 ++++- .../src/functions/updatePackageJSON.ts | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/isaacscript-cli/src/commands/init/createProject.ts b/packages/isaacscript-cli/src/commands/init/createProject.ts index f2ea327f1..537a9acd1 100644 --- a/packages/isaacscript-cli/src/commands/init/createProject.ts +++ b/packages/isaacscript-cli/src/commands/init/createProject.ts @@ -71,7 +71,10 @@ export async function createProject( typeScript, ); upgradeYarn(projectPath, packageManager, verbose); - await updatePackageJSON(projectPath); + + // There is no package manager lock files yet, so we have to pass "false" to this function. + await updatePackageJSON(projectPath, false); + installNodeModules(projectPath, skipInstall, packageManager, verbose); formatFiles(projectPath, packageManager, verbose); diff --git a/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts b/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts index a0684a8ca..f6b662e24 100644 --- a/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts +++ b/packages/isaacscript-common-node/src/functions/updatePackageJSON.ts @@ -4,7 +4,10 @@ import { PackageManager } from "../enums/PackageManager.js"; import { $s, $sq } from "./execa.js"; import { getFilePath, readFile } from "./file.js"; import { PACKAGE_JSON } from "./packageJSON.js"; -import { getPackageManagerForProject } from "./packageManager.js"; +import { + getPackageManagerForProject, + getPackageManagersForProject, +} from "./packageManager.js"; import { diff } from "./utils.js"; /** @@ -17,17 +20,20 @@ import { diff } from "./utils.js"; * @param filePathOrDirPath Either the path to a "package.json" file or the path to a directory * which contains a "package.json" file. If undefined is passed, the * current working directory will be used. + * @param installAfterUpdate Optional. Whether to install the new dependencies afterward, if any. + * Defaults to true. * @returns Whether any dependencies were updated. */ export async function updatePackageJSON( filePathOrDirPath: string | undefined, + installAfterUpdate = true, ): Promise { const packageJSONPath = getFilePath(PACKAGE_JSON, filePathOrDirPath); const packageRoot = path.dirname(packageJSONPath); - const packageManager = getPackageManagerForProject(packageRoot); + const packageManagers = getPackageManagersForProject(packageRoot); const oldPackageJSONString = readFile(packageJSONPath); - if (packageManager === PackageManager.yarn) { + if (packageManagers.includes(PackageManager.yarn)) { // Yarn does not have a quiet flag, so we use the `$sq` helper function. $sq`yarn set version latest`; } @@ -49,7 +55,12 @@ export async function updatePackageJSON( diff(oldPackageJSONString, newPackageJSONString); console.log(); - $s`${packageManager} install`; + if (installAfterUpdate) { + // Since `getPackageManagerForProject` can cause a fatal error, we only invoke it if we need + // to install the new dependencies. + const packageManager = getPackageManagerForProject(packageRoot); + $s`${packageManager} install`; + } } return hasNewDependencies;