diff --git a/package.json b/package.json index 411c77601..3d4489bc2 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ "consola": "^3.3.3", "defu": "^6.1.4", "eslint": "^9.17.0", - "execa": "^9.5.2", "fuse.js": "^7.0.0", "giget": "^1.2.3", "h3": "^1.13.0", @@ -76,6 +75,7 @@ "scule": "^1.3.0", "semver": "^7.6.3", "std-env": "^3.8.0", + "tinyexec": "^0.3.2", "typescript": "^5.7.2", "ufo": "^1.5.4", "unbuild": "^3.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14192e1a4..53bc11029 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,9 +58,6 @@ importers: eslint: specifier: ^9.17.0 version: 9.17.0(jiti@2.4.2) - execa: - specifier: ^9.5.2 - version: 9.5.2 fuse.js: specifier: ^7.0.0 version: 7.0.0 @@ -127,6 +124,9 @@ importers: std-env: specifier: ^3.8.0 version: 3.8.0 + tinyexec: + specifier: ^0.3.2 + version: 0.3.2 typescript: specifier: ^5.7.2 version: 5.7.2 @@ -1166,17 +1166,10 @@ packages: cpu: [x64] os: [win32] - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@snyk/github-codeowners@1.1.0': resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==} engines: {node: '>=8.10'} @@ -2190,10 +2183,6 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - execa@9.5.2: - resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} - engines: {node: ^18.19.0 || >=20.5.0} - expect-type@1.1.0: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} @@ -2235,10 +2224,6 @@ packages: picomatch: optional: true - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2326,10 +2311,6 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -2448,10 +2429,6 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} - human-signals@8.0.0: - resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} - engines: {node: '>=18.18.0'} - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2563,10 +2540,6 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} @@ -2581,14 +2554,6 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -2993,10 +2958,6 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -3725,10 +3686,6 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3932,10 +3889,6 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - unimport@3.14.5: resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==} @@ -4376,10 +4329,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} - engines: {node: '>=18'} - zhead@2.2.4: resolution: {integrity: sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==} @@ -5477,12 +5426,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.30.0': optional: true - '@sec-ant/readable-stream@0.4.1': {} - '@sindresorhus/merge-streams@2.3.0': {} - '@sindresorhus/merge-streams@4.0.0': {} - '@snyk/github-codeowners@1.1.0': dependencies: commander: 4.1.1 @@ -6748,21 +6693,6 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - execa@9.5.2: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.0 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.2.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.1 - expect-type@1.1.0: {} externality@1.0.2: @@ -6800,10 +6730,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -6873,11 +6799,6 @@ snapshots: get-stream@8.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -7014,8 +6935,6 @@ snapshots: human-signals@5.0.0: {} - human-signals@8.0.0: {} - ieee754@1.2.1: {} ignore@5.3.2: {} @@ -7113,8 +7032,6 @@ snapshots: is-path-inside@4.0.0: {} - is-plain-obj@4.1.0: {} - is-reference@1.2.1: dependencies: '@types/estree': 1.0.6 @@ -7127,10 +7044,6 @@ snapshots: is-stream@3.0.0: {} - is-stream@4.0.1: {} - - is-unicode-supported@2.1.0: {} - is-what@4.1.16: {} is-wsl@2.2.0: @@ -7580,11 +7493,6 @@ snapshots: dependencies: path-key: 4.0.0 - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -8438,8 +8346,6 @@ snapshots: strip-final-newline@3.0.0: {} - strip-final-newline@4.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -8653,8 +8559,6 @@ snapshots: unicorn-magic@0.1.0: {} - unicorn-magic@0.3.0: {} - unimport@3.14.5(rollup@4.30.0): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.30.0) @@ -9093,8 +8997,6 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors@2.1.1: {} - zhead@2.2.4: {} zip-stream@6.0.1: diff --git a/src/commands/build-module.ts b/src/commands/build-module.ts index ee9854c9c..7c1bb63d3 100644 --- a/src/commands/build-module.ts +++ b/src/commands/build-module.ts @@ -1,4 +1,4 @@ -import { execa } from 'execa' +import { x } from 'tinyexec' import { consola } from 'consola' import { resolve } from 'pathe' import { defineCommand } from 'citty' @@ -52,10 +52,11 @@ export default defineCommand({ execArgs.unshift(MODULE_BUILDER_PKG) } - await execa(cmd, execArgs, { - cwd, - preferLocal: true, - stdio: 'inherit', + await x(cmd, execArgs, { + nodeOptions: { + cwd, + stdio: 'inherit', + }, }) }, }) diff --git a/src/commands/devtools.ts b/src/commands/devtools.ts index 3fc9d72c9..0483c5321 100644 --- a/src/commands/devtools.ts +++ b/src/commands/devtools.ts @@ -1,5 +1,5 @@ import { resolve } from 'pathe' -import { execa } from 'execa' +import { x } from 'tinyexec' import { defineCommand } from 'citty' import { cwdArgs, legacyRootDirArgs } from './_shared' @@ -26,12 +26,14 @@ export default defineCommand({ process.exit(1) } - await execa( + await x( 'npx', ['@nuxt/devtools-wizard@latest', ctx.args.command, cwd], { - stdio: 'inherit', - cwd, + nodeOptions: { + stdio: 'inherit', + cwd, + }, }, ) }, diff --git a/src/commands/init.ts b/src/commands/init.ts index e96dac564..da2e195d7 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -3,6 +3,7 @@ import type { DownloadTemplateResult } from 'giget' import { relative, resolve } from 'pathe' import { consola } from 'consola' import { installDependencies } from 'nypm' +import { x } from 'tinyexec' import type { PackageManagerName } from 'nypm' import { defineCommand } from 'citty' @@ -145,12 +146,17 @@ export default defineCommand({ } if (ctx.args.gitInit) { consola.info('Initializing git repository...\n') - const { execa } = await import('execa') - await execa('git', ['init', template.dir], { - stdio: 'inherit', - }).catch((err) => { + try { + await x('git', ['init', template.dir], { + throwOnError: true, + nodeOptions: { + stdio: 'inherit', + }, + }) + } + catch (err) { consola.warn(`Failed to initialize git repository: ${err}`) - }) + } } // Display next steps diff --git a/src/commands/preview.ts b/src/commands/preview.ts index a8b9a94c7..d88094b45 100644 --- a/src/commands/preview.ts +++ b/src/commands/preview.ts @@ -1,6 +1,6 @@ import { existsSync, promises as fsp } from 'node:fs' import { dirname, relative } from 'node:path' -import { execa } from 'execa' +import { x } from 'tinyexec' import { setupDotenv } from 'c12' import { resolve } from 'pathe' import { consola } from 'consola' @@ -100,6 +100,6 @@ export default defineCommand({ consola.info(`Starting preview command: \`${nitroJSON.commands.preview}\``) const [command, ...commandArgs] = nitroJSON.commands.preview.split(' ') consola.log('') - await execa(command, commandArgs, { stdio: 'inherit', cwd: outputPath }) + await x(command, commandArgs, { nodeOptions: { stdio: 'inherit', cwd: outputPath } }) }, }) diff --git a/src/commands/typecheck.ts b/src/commands/typecheck.ts index 9ce031f78..e8cba01bf 100644 --- a/src/commands/typecheck.ts +++ b/src/commands/typecheck.ts @@ -1,5 +1,5 @@ import { fileURLToPath } from 'node:url' -import { execa } from 'execa' +import { x } from 'tinyexec' import { resolve } from 'pathe' import { defineCommand } from 'citty' import { isBun } from 'std-env' @@ -49,30 +49,33 @@ export default defineCommand({ jiti.esmResolve('vue-tsc/bin/vue-tsc.js', { try: true }), ]) if (resolvedTypeScript && resolvedVueTsc) { - await execa(fileURLToPath(resolvedVueTsc), ['--noEmit'], { - preferLocal: true, - stdio: 'inherit', - cwd, + await x(fileURLToPath(resolvedVueTsc), ['--noEmit'], { + nodeOptions: { + stdio: 'inherit', + cwd, + }, }) } else { if (isBun) { - await execa( + await x( 'bun', 'install typescript vue-tsc --global --silent'.split(' '), - { stdio: 'inherit', cwd }, + { nodeOptions: { stdio: 'inherit', cwd } }, ) - await execa('bunx', 'vue-tsc --noEmit'.split(' '), { - stdio: 'inherit', - cwd, + await x('bunx', 'vue-tsc --noEmit'.split(' '), { + nodeOptions: { + stdio: 'inherit', + cwd, + }, }) } else { - await execa( + await x( 'npx', '-p vue-tsc -p typescript vue-tsc --noEmit'.split(' '), - { stdio: 'inherit', cwd }, + { nodeOptions: { stdio: 'inherit', cwd } }, ) } }