From 21bbc8147b6c6e9889995b8a443e36d50b33d91e Mon Sep 17 00:00:00 2001 From: rxliuli Date: Wed, 14 Jun 2023 16:31:27 +0800 Subject: [PATCH 1/5] feat: Make vite-node parsing behavior consistent with node/tsx/ts-node, ref: https://github.com/vitest-dev/vitest/issues/3571 --- packages/vite-node/src/cli.ts | 28 +++++++++++++++++--- test/vite-node/src/cli-parse-args.js | 2 ++ test/vite-node/test/cli.test.ts | 38 ++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 test/vite-node/src/cli-parse-args.js create mode 100644 test/vite-node/test/cli.test.ts diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index ef8e607e47f0..6a13686ff367 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -12,21 +12,31 @@ import { installSourcemapsSupport } from './source-map' const cli = cac('vite-node') cli - .version(version) .option('-r, --root ', 'Use specified root directory') .option('-c, --config ', 'Use specified config file') .option('-m, --mode ', 'Set env mode') .option('-w, --watch', 'Restart on file changes, similar to "nodemon"') .option('--script', 'Use vite-node as a script runner') .option('--options ', 'Use specified Vite server options') - .help() + .option('-v, --version', 'Output the version number') + .option('-h, --help', 'Display help for command') cli .command('[...files]') .allowUnknownOptions() .action(run) -cli.parse() +cli.parse(process.argv, { run: false }) + +if (cli.args.length === 0) { + cli.runMatchedCommand() +} +else { + const i = cli.rawArgs.indexOf(cli.args[0]) + 1 + const scriptArgs = cli.rawArgs.slice(i).filter(it => it !== '--') + const executeArgs = [...cli.rawArgs.slice(0, i), '--', ...scriptArgs] + cli.parse(executeArgs) +} export interface CliOptions { root?: string @@ -35,10 +45,13 @@ export interface CliOptions { mode?: string watch?: boolean options?: ViteNodeServerOptionsCLI + version?: boolean + help?: boolean '--'?: string[] } async function run(files: string[], options: CliOptions = {}) { + // console.log('run', files, options) if (options.script) { files = [files[0]] options = {} @@ -48,6 +61,15 @@ async function run(files: string[], options: CliOptions = {}) { process.argv = [...process.argv.slice(0, 2), ...(options['--'] || [])] } + if (options.version) { + cli.version(version) + cli.outputVersion() + process.exit(0) + } + if (options.help) { + cli.outputHelp() + process.exit(0) + } if (!files.length) { console.error(c.red('No files specified.')) cli.outputHelp() diff --git a/test/vite-node/src/cli-parse-args.js b/test/vite-node/src/cli-parse-args.js new file mode 100644 index 000000000000..afaf1236eae6 --- /dev/null +++ b/test/vite-node/src/cli-parse-args.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-console +console.log(process.argv) diff --git a/test/vite-node/test/cli.test.ts b/test/vite-node/test/cli.test.ts new file mode 100644 index 000000000000..9e724d1b0f0d --- /dev/null +++ b/test/vite-node/test/cli.test.ts @@ -0,0 +1,38 @@ +import { execa } from 'execa' +import { resolve } from 'pathe' +import { expect, it } from 'vitest' + +const cliPath = resolve(__dirname, '../../../packages/vite-node/src/cli.ts') +const entryPath = resolve(__dirname, '../src/cli-parse-args.js') + +const parseResult = (s: string) => JSON.parse(s.replaceAll('\'', '"')) + +it('basic', async () => { + const result = await execa('npx', ['esno', cliPath, entryPath], { reject: true }) + expect(result.stdout).include('/node') + expect(parseResult(result.stdout)).length(2) +}) + +it('--help', async () => { + const r1 = await execa('npx', ['esno', cliPath, '--help', entryPath], { reject: true }) + expect(r1.stdout).include('help') + const r2 = await execa('npx', ['esno', cliPath, '-h', entryPath], { reject: true }) + expect(r2.stdout).include('help') +}) + +it('--version', async () => { + const r1 = await execa('npx', ['esno', cliPath, '--version', entryPath], { reject: true }) + expect(r1.stdout).include('vite-node/') + const r2 = await execa('npx', ['esno', cliPath, '-v', entryPath], { reject: true }) + expect(r2.stdout).include('vite-node/') +}) + +it('script args', async () => { + const r1 = await execa('npx', ['esno', cliPath, entryPath, '--version', '--help'], { reject: true }) + expect(parseResult(r1.stdout)).include('--version').include('--help') +}) + +it('script args in -- after', async () => { + const r1 = await execa('npx', ['esno', cliPath, entryPath, '--', '--version', '--help'], { reject: true }) + expect(parseResult(r1.stdout)).include('--version').include('--help') +}) From 68968fc3d7f00f83f555691675762214d94ec064 Mon Sep 17 00:00:00 2001 From: rxliuli Date: Wed, 14 Jun 2023 16:43:44 +0800 Subject: [PATCH 2/5] chore: set unit test timeout to 60s --- test/vite-node/test/cli.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/vite-node/test/cli.test.ts b/test/vite-node/test/cli.test.ts index 9e724d1b0f0d..f1c5bf92f90e 100644 --- a/test/vite-node/test/cli.test.ts +++ b/test/vite-node/test/cli.test.ts @@ -11,28 +11,28 @@ it('basic', async () => { const result = await execa('npx', ['esno', cliPath, entryPath], { reject: true }) expect(result.stdout).include('/node') expect(parseResult(result.stdout)).length(2) -}) +}, 60_000) it('--help', async () => { const r1 = await execa('npx', ['esno', cliPath, '--help', entryPath], { reject: true }) expect(r1.stdout).include('help') const r2 = await execa('npx', ['esno', cliPath, '-h', entryPath], { reject: true }) expect(r2.stdout).include('help') -}) +}, 60_000) it('--version', async () => { const r1 = await execa('npx', ['esno', cliPath, '--version', entryPath], { reject: true }) expect(r1.stdout).include('vite-node/') const r2 = await execa('npx', ['esno', cliPath, '-v', entryPath], { reject: true }) expect(r2.stdout).include('vite-node/') -}) +}, 60_000) it('script args', async () => { const r1 = await execa('npx', ['esno', cliPath, entryPath, '--version', '--help'], { reject: true }) expect(parseResult(r1.stdout)).include('--version').include('--help') -}) +}, 60_000) it('script args in -- after', async () => { const r1 = await execa('npx', ['esno', cliPath, entryPath, '--', '--version', '--help'], { reject: true }) expect(parseResult(r1.stdout)).include('--version').include('--help') -}) +}, 60_000) From 4baa4e84775ca371520527f2d6bce99d77d447a8 Mon Sep 17 00:00:00 2001 From: rxliuli Date: Wed, 14 Jun 2023 17:06:23 +0800 Subject: [PATCH 3/5] test: Fix the error that the newline character under windows causes the test to fail --- test/vite-node/test/cli.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/vite-node/test/cli.test.ts b/test/vite-node/test/cli.test.ts index f1c5bf92f90e..600a316cf971 100644 --- a/test/vite-node/test/cli.test.ts +++ b/test/vite-node/test/cli.test.ts @@ -9,7 +9,7 @@ const parseResult = (s: string) => JSON.parse(s.replaceAll('\'', '"')) it('basic', async () => { const result = await execa('npx', ['esno', cliPath, entryPath], { reject: true }) - expect(result.stdout).include('/node') + expect(result.stdout).include('node') expect(parseResult(result.stdout)).length(2) }, 60_000) From 35aa21721ecb8cbaf9e8cbc0d6b11ae75c0449a2 Mon Sep 17 00:00:00 2001 From: rxliuli Date: Thu, 15 Jun 2023 16:31:07 +0800 Subject: [PATCH 4/5] chore: remove redundant debug code --- packages/vite-node/src/cli.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index 6a13686ff367..e527ae96ff4c 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -51,7 +51,6 @@ export interface CliOptions { } async function run(files: string[], options: CliOptions = {}) { - // console.log('run', files, options) if (options.script) { files = [files[0]] options = {} From 7b35bd37b62203cb6e1684f21d8f4edfed53311f Mon Sep 17 00:00:00 2001 From: rxliuli Date: Fri, 28 Jul 2023 20:05:01 +0800 Subject: [PATCH 5/5] fix: update output for --help --- packages/vite-node/src/cli.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite-node/src/cli.ts b/packages/vite-node/src/cli.ts index e527ae96ff4c..77e5900db1e6 100644 --- a/packages/vite-node/src/cli.ts +++ b/packages/vite-node/src/cli.ts @@ -66,12 +66,12 @@ async function run(files: string[], options: CliOptions = {}) { process.exit(0) } if (options.help) { - cli.outputHelp() + cli.version(version).outputHelp() process.exit(0) } if (!files.length) { console.error(c.red('No files specified.')) - cli.outputHelp() + cli.version(version).outputHelp() process.exit(1) }