diff --git a/.changeset/real-panthers-compete.md b/.changeset/real-panthers-compete.md new file mode 100644 index 0000000000..aa019e461f --- /dev/null +++ b/.changeset/real-panthers-compete.md @@ -0,0 +1,5 @@ +--- +"create-t3-app": patch +--- + +fix(cli): make `installDependencies` step async to make loader spin diff --git a/cli/package.json b/cli/package.json index 058676edbc..9da1416f68 100644 --- a/cli/package.json +++ b/cli/package.json @@ -42,6 +42,7 @@ "dependencies": { "chalk": "5.0.1", "commander": "^9.4.1", + "execa": "^6.1.0", "fs-extra": "^10.1.0", "gradient-string": "^2.0.2", "inquirer": "^9.1.2", diff --git a/cli/src/helpers/git.ts b/cli/src/helpers/git.ts index 7dd9ae15f3..808be90c7c 100644 --- a/cli/src/helpers/git.ts +++ b/cli/src/helpers/git.ts @@ -1,10 +1,11 @@ import chalk from "chalk"; -import ora from "ora"; import { execSync } from "child_process"; -import { logger } from "~/utils/logger.js"; +import { execa } from "execa"; import fs from "fs-extra"; -import path from "path"; import inquirer from "inquirer"; +import ora from "ora"; +import path from "path"; +import { logger } from "~/utils/logger.js"; const isGitInstalled = (dir: string): boolean => { try { @@ -32,6 +33,14 @@ const isInsideGitRepo = (dir: string): boolean => { } }; +const getGitVersion = () => { + const stdout = execSync("git --version").toString().trim(); + const gitVersionTag = stdout.split(" ")[2]; + const major = gitVersionTag?.split(".")[0]; + const minor = gitVersionTag?.split(".")[1]; + return { major: Number(major), minor: Number(minor) }; +}; + // This initializes the Git-repository for the project export const initializeGit = async (projectDir: string) => { logger.info("Initializing Git..."); @@ -87,17 +96,16 @@ export const initializeGit = async (projectDir: string) => { // We're good to go, initializing the git repo try { - let initCmd = "git init --initial-branch=main"; // --initial-branch flag was added in git v2.28.0 - const gitVersionOutput = execSync("git --version").toString(); // git version 2.32.0 ... - const gitVersionTag = gitVersionOutput.split(" ")[2]; - const major = gitVersionTag?.split(".")[0]; - const minor = gitVersionTag?.split(".")[1]; - if (Number(major) < 2 || Number(minor) < 28) { - initCmd = "git init && git branch -m main"; + const { major, minor } = getGitVersion(); + if (major < 2 || minor < 28) { + await execa("git", ["init"], { cwd: projectDir }); + await execa("git", ["branch", "-m", "main"], { cwd: projectDir }); + } else { + await execa("git", ["init", "--initial-branch=main"], { + cwd: projectDir, + }); } - - execSync(initCmd, { cwd: projectDir }); spinner.succeed( `${chalk.green("Successfully initialized")} ${chalk.green.bold("git")}\n`, ); diff --git a/cli/src/helpers/installDependencies.ts b/cli/src/helpers/installDependencies.ts index e2adb10989..67a30e1dba 100644 --- a/cli/src/helpers/installDependencies.ts +++ b/cli/src/helpers/installDependencies.ts @@ -1,15 +1,14 @@ -import { execSync } from "child_process"; +import { execa } from "execa"; import ora from "ora"; import { getUserPkgManager } from "~/utils/getUserPkgManager.js"; import { logger } from "~/utils/logger.js"; -export const installDependencies = (projectDir: string) => { +export const installDependencies = async (projectDir: string) => { logger.info("Installing dependencies..."); const pkgManager = getUserPkgManager(); - const command = `${pkgManager} install`; - const spinner = ora(`Running ${command}...\n`).start(); + const spinner = ora(`Running ${pkgManager} install...\n`).start(); - execSync(command, { cwd: projectDir }); + await execa(pkgManager, ["install"], { cwd: projectDir }); spinner.succeed("Successfully installed dependencies!\n"); }; diff --git a/cli/src/index.ts b/cli/src/index.ts index 134b9bfe95..eeb99e21b7 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -40,7 +40,7 @@ const main = async () => { }); if (!noInstall) { - installDependencies(projectDir); + await installDependencies(projectDir); } if (!noGit) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ecb98c4403..2d172803aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,6 +46,7 @@ importers: '@types/node': ^18.8.0 chalk: 5.0.1 commander: ^9.4.1 + execa: ^6.1.0 fs-extra: ^10.1.0 gradient-string: ^2.0.2 inquirer: ^9.1.2 @@ -59,6 +60,7 @@ importers: dependencies: chalk: 5.0.1 commander: 9.4.1 + execa: 6.1.0 fs-extra: 10.1.0 gradient-string: 2.0.2 inquirer: 9.1.2 @@ -3184,7 +3186,6 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true /expand-template/2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} @@ -3402,7 +3403,6 @@ packages: /get-stream/6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - dev: true /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} @@ -3728,7 +3728,6 @@ packages: /human-signals/3.0.1: resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} engines: {node: '>=12.20.0'} - dev: true /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -3975,7 +3974,6 @@ packages: /is-stream/3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true /is-string/1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} @@ -4423,7 +4421,6 @@ packages: /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true /merge2/1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -4740,7 +4737,6 @@ packages: /mimic-fn/4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - dev: true /mimic-response/1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} @@ -4906,7 +4902,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 - dev: true /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -4982,7 +4977,6 @@ packages: engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 - dev: true /open/8.4.0: resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} @@ -5148,7 +5142,6 @@ packages: /path-key/4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} - dev: true /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -6102,7 +6095,6 @@ packages: /strip-final-newline/3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - dev: true /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}