From 35b2172fabdaca8ac8c51db6265fd46dc34c75bb Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 17:34:14 +0900 Subject: [PATCH 1/7] fix(pm): support npm 6 dependency filter options Use legacy npm flags for dependency filtering before npm 7. Reject list filters without equivalent npm 6 semantics, and preserve native npm 7+ behavior and raw pass-through arguments. --- .../optional-parent/package.json | 7 + .../fixtures/command_add_npm10/snapshots.toml | 42 ++++++ .../snapshots/npm10_dependency_filters_add.md | 61 ++++++++ .../snapshots/npm6_dependency_filters_add.md | 78 +++++++++++ .../command_install_npm11/snapshots.toml | 30 ++++ .../npm6_dependency_filters_install.md | 130 ++++++++++++++++++ .../command_list_npm10/snapshots.toml | 12 ++ .../snapshots/npm6_dependency_filters_list.md | 45 ++++++ .../command_prune_npm10/snapshots.toml | 14 ++ .../npm6_dependency_filters_prune.md | 37 +++++ .../command_update_npm10/snapshots.toml | 14 ++ .../npm6_dependency_filters_update.md | 34 +++++ .../vp_pm_cli/src/resolution/commands/add.rs | 15 +- .../src/resolution/commands/audit.rs | 27 +++- .../src/resolution/commands/install.rs | 38 ++++- .../vp_pm_cli/src/resolution/commands/list.rs | 62 +++++++-- .../src/resolution/commands/prune.rs | 19 ++- .../src/resolution/commands/update.rs | 18 ++- crates/vp_pm_cli/src/resolution/dialect.rs | 5 + 19 files changed, 663 insertions(+), 25 deletions(-) create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/optional-parent/package.json create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm10_dependency_filters_add.md create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm6_dependency_filters_add.md create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm6_dependency_filters_install.md create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/npm6_dependency_filters_prune.md create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/optional-parent/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/optional-parent/package.json new file mode 100644 index 0000000000..b2c9d1e9e6 --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/optional-parent/package.json @@ -0,0 +1,7 @@ +{ + "name": "optional-parent", + "version": "1.0.0", + "optionalDependencies": { + "is-number": "7.0.0" + } +} diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots.toml index cc7eb6fe1e..84e52a00b0 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots.toml @@ -15,3 +15,45 @@ steps = [ { argv = ["vp", "add", "test-vite-plus-package-optional", "--", "--loglevel=warn", "--no-audit"], comment = "support pass through arguments" }, { argv = ["vpt", "print-file", "package.json"], continue-on-failure = true }, ] + +[[case]] +name = "npm6_dependency_filters_add" +vp = "global" +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, + { argv = ["vpt", "json-edit", "package.json", "dependencies.is-number", "6.0.0"], snapshot = false }, + { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, + { argv = ["vp", "pm", "pack", "--", "./optional-parent", "--ignore-scripts"], snapshot = false }, + { argv = ["vp", "add", "./optional-parent-1.0.0.tgz", "--ignore-scripts", "--silent"], comment = "without a filter, the optional dependency is installed inside the added package" }, + ["vpt", "stat-file", "node_modules/optional-parent/node_modules/is-number/package.json", "--assert", "file"], + { argv = ["vpt", "rm", "-rf", "node_modules/optional-parent", "package-lock.json"], snapshot = false }, + ["vp", "add", "./optional-parent-1.0.0.tgz", "--no-optional", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/optional-parent/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/optional-parent/node_modules/is-number/package.json", "--assert", "missing"], + { argv = ["vpt", "rm", "-rf", "node_modules/optional-parent", "package-lock.json"], snapshot = false }, + ["vp", "install", "./optional-parent-1.0.0.tgz", "--no-optional", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/optional-parent/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/optional-parent/node_modules/is-number/package.json", "--assert", "missing"], + ["vpt", "stat-file", "node_modules/is-number/package.json", "--assert", "file"], +] + +[[case]] +name = "npm10_dependency_filters_add" +vp = "global" +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "dependencies.is-number", "6.0.0"], snapshot = false }, + { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, + { argv = ["vp", "pm", "pack", "--", "./optional-parent", "--ignore-scripts"], snapshot = false }, + ["vp", "add", "./optional-parent-1.0.0.tgz", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/optional-parent/node_modules/is-number/package.json", "--assert", "file"], + { argv = ["vpt", "rm", "-rf", "node_modules/optional-parent", "package-lock.json"], snapshot = false }, + ["vp", "add", "./optional-parent-1.0.0.tgz", "--no-optional", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/optional-parent/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/optional-parent/node_modules/is-number/package.json", "--assert", "missing"], + { argv = ["vpt", "rm", "-rf", "node_modules/optional-parent", "package-lock.json"], snapshot = false }, + ["vp", "install", "./optional-parent-1.0.0.tgz", "--no-optional", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/optional-parent/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/optional-parent/node_modules/is-number/package.json", "--assert", "missing"], +] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm10_dependency_filters_add.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm10_dependency_filters_add.md new file mode 100644 index 0000000000..5ed94b6c48 --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm10_dependency_filters_add.md @@ -0,0 +1,61 @@ +# npm10_dependency_filters_add + +## `vpt json-edit package.json dependencies.is-number 6.0.0` + + +## `vp install --ignore-scripts --silent` + + +## `vp pm pack -- ./optional-parent --ignore-scripts` + + +## `vp add ./optional-parent-1.0.0.tgz --ignore-scripts --silent` + +``` +``` + +## `vpt stat-file node_modules/optional-parent/node_modules/is-number/package.json --assert file` + +``` +node_modules/optional-parent/node_modules/is-number/package.json: file +``` + +## `vpt rm -rf node_modules/optional-parent package-lock.json` + + +## `vp add ./optional-parent-1.0.0.tgz --no-optional --ignore-scripts --silent` + +``` +``` + +## `vpt stat-file node_modules/optional-parent/package.json --assert file` + +``` +node_modules/optional-parent/package.json: file +``` + +## `vpt stat-file node_modules/optional-parent/node_modules/is-number/package.json --assert missing` + +``` +node_modules/optional-parent/node_modules/is-number/package.json: missing +``` + +## `vpt rm -rf node_modules/optional-parent package-lock.json` + + +## `vp install ./optional-parent-1.0.0.tgz --no-optional --ignore-scripts --silent` + +``` +``` + +## `vpt stat-file node_modules/optional-parent/package.json --assert file` + +``` +node_modules/optional-parent/package.json: file +``` + +## `vpt stat-file node_modules/optional-parent/node_modules/is-number/package.json --assert missing` + +``` +node_modules/optional-parent/node_modules/is-number/package.json: missing +``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm6_dependency_filters_add.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm6_dependency_filters_add.md new file mode 100644 index 0000000000..6ccaa90316 --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm6_dependency_filters_add.md @@ -0,0 +1,78 @@ +# npm6_dependency_filters_add + +## `vpt json-edit package.json packageManager npm@6.14.18` + + +## `vpt json-edit package.json dependencies.is-number 6.0.0` + + +## `vp install --ignore-scripts --silent` + + +## `vp pm pack -- ./optional-parent --ignore-scripts` + + +## `vp add ./optional-parent-1.0.0.tgz --ignore-scripts --silent` + +without a filter, the optional dependency is installed inside the added package + +``` + optional-parent@1.0.0 +added 2 packages from 3 contributors in +``` + +## `vpt stat-file node_modules/optional-parent/node_modules/is-number/package.json --assert file` + +``` +node_modules/optional-parent/node_modules/is-number/package.json: file +``` + +## `vpt rm -rf node_modules/optional-parent package-lock.json` + + +## `vp add ./optional-parent-1.0.0.tgz --no-optional --ignore-scripts --silent` + +``` + optional-parent@1.0.0 +added 1 package in +``` + +## `vpt stat-file node_modules/optional-parent/package.json --assert file` + +``` +node_modules/optional-parent/package.json: file +``` + +## `vpt stat-file node_modules/optional-parent/node_modules/is-number/package.json --assert missing` + +``` +node_modules/optional-parent/node_modules/is-number/package.json: missing +``` + +## `vpt rm -rf node_modules/optional-parent package-lock.json` + + +## `vp install ./optional-parent-1.0.0.tgz --no-optional --ignore-scripts --silent` + +``` + optional-parent@1.0.0 +added 1 package in +``` + +## `vpt stat-file node_modules/optional-parent/package.json --assert file` + +``` +node_modules/optional-parent/package.json: file +``` + +## `vpt stat-file node_modules/optional-parent/node_modules/is-number/package.json --assert missing` + +``` +node_modules/optional-parent/node_modules/is-number/package.json: missing +``` + +## `vpt stat-file node_modules/is-number/package.json --assert file` + +``` +node_modules/is-number/package.json: file +``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots.toml index 1ac217ebb0..8436913f84 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots.toml @@ -14,3 +14,33 @@ steps = [ ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "file"], ["vpt", "print-file", "package.json", "package-lock.json"], ] + +[[case]] +name = "npm6_dependency_filters_install" +vp = "global" +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, + { argv = ["vpt", "json-edit", "package.json", "dependencies.prod-only-fixture", "file:./prod-dep"], snapshot = false }, + { argv = ["vpt", "json-edit", "package.json", "devDependencies.dev-only-fixture", "file:./dev-dep"], snapshot = false }, + { argv = ["vpt", "json-edit", "package.json", "optionalDependencies.is-number", "6.0.0"], snapshot = false }, + { argv = ["vp", "install", "-P", "--ignore-scripts", "--silent"], comment = "npm 6 uses --production to omit dev dependencies" }, + ["vpt", "stat-file", "node_modules/prod-only-fixture/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "missing"], + ["vpt", "stat-file", "node_modules/is-number/package.json", "--assert", "file"], + { argv = ["vp", "install", "-D", "--frozen-lockfile", "--ignore-scripts", "--silent"], envs = [["NODE_ENV", "production"], ["npm_config_production", "true"]], comment = "npm 6 ci includes dev dependencies despite production settings" }, + ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "file"], + { argv = ["vpt", "rm", "-rf", "node_modules"], snapshot = false }, + ["vp", "install", "--no-optional", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/is-number/package.json", "--assert", "missing"], + ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "file"], + ["vp", "install", "-P", "--no-optional", "--frozen-lockfile", "--ignore-scripts", "--silent"], + ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "missing"], + ["vpt", "stat-file", "node_modules/is-number/package.json", "--assert", "missing"], + { argv = ["vp", "install", "-P", "-D", "--ignore-scripts", "--silent"], envs = [["NODE_ENV", "production"]], comment = "explicit inclusion wins when both dependency flags are supplied" }, + ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "file"], + { argv = ["vp", "install", "-P", "-D", "--no-optional", "--frozen-lockfile", "--ignore-scripts", "--silent"], envs = [["NODE_ENV", "production"]] }, + ["vpt", "stat-file", "node_modules/prod-only-fixture/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/dev-only-fixture/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/is-number/package.json", "--assert", "missing"], +] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm6_dependency_filters_install.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm6_dependency_filters_install.md new file mode 100644 index 0000000000..5259a8425b --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm6_dependency_filters_install.md @@ -0,0 +1,130 @@ +# npm6_dependency_filters_install + +## `vpt json-edit package.json packageManager npm@6.14.18` + + +## `vpt json-edit package.json dependencies.prod-only-fixture file:./prod-dep` + + +## `vpt json-edit package.json devDependencies.dev-only-fixture file:./dev-dep` + + +## `vpt json-edit package.json optionalDependencies.is-number 6.0.0` + + +## `vp install -P --ignore-scripts --silent` + +npm 6 uses --production to omit dev dependencies + +``` +added 2 packages from 3 contributors in +``` + +## `vpt stat-file node_modules/prod-only-fixture/package.json --assert file` + +``` +node_modules/prod-only-fixture/package.json: file +``` + +## `vpt stat-file node_modules/dev-only-fixture/package.json --assert missing` + +``` +node_modules/dev-only-fixture/package.json: missing +``` + +## `vpt stat-file node_modules/is-number/package.json --assert file` + +``` +node_modules/is-number/package.json: file +``` + +## `NODE_ENV=production npm_config_production=true vp install -D --frozen-lockfile --ignore-scripts --silent` + +npm 6 ci includes dev dependencies despite production settings + +``` +added 3 packages in +``` + +## `vpt stat-file node_modules/dev-only-fixture/package.json --assert file` + +``` +node_modules/dev-only-fixture/package.json: file +``` + +## `vpt rm -rf node_modules` + + +## `vp install --no-optional --ignore-scripts --silent` + +``` +added 2 packages in +``` + +## `vpt stat-file node_modules/is-number/package.json --assert missing` + +``` +node_modules/is-number/package.json: missing +``` + +## `vpt stat-file node_modules/dev-only-fixture/package.json --assert file` + +``` +node_modules/dev-only-fixture/package.json: file +``` + +## `vp install -P --no-optional --frozen-lockfile --ignore-scripts --silent` + +``` +added 1 packages in +``` + +## `vpt stat-file node_modules/dev-only-fixture/package.json --assert missing` + +``` +node_modules/dev-only-fixture/package.json: missing +``` + +## `vpt stat-file node_modules/is-number/package.json --assert missing` + +``` +node_modules/is-number/package.json: missing +``` + +## `NODE_ENV=production vp install -P -D --ignore-scripts --silent` + +explicit inclusion wins when both dependency flags are supplied + +``` +added 2 packages from 3 contributors in +``` + +## `vpt stat-file node_modules/dev-only-fixture/package.json --assert file` + +``` +node_modules/dev-only-fixture/package.json: file +``` + +## `NODE_ENV=production vp install -P -D --no-optional --frozen-lockfile --ignore-scripts --silent` + +``` +added 2 packages in +``` + +## `vpt stat-file node_modules/prod-only-fixture/package.json --assert file` + +``` +node_modules/prod-only-fixture/package.json: file +``` + +## `vpt stat-file node_modules/dev-only-fixture/package.json --assert file` + +``` +node_modules/dev-only-fixture/package.json: file +``` + +## `vpt stat-file node_modules/is-number/package.json --assert missing` + +``` +node_modules/is-number/package.json: missing +``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml index eaf6060a06..ba12511498 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml @@ -29,3 +29,15 @@ steps = [ { argv = ["vp", "pm", "list", "--dev", "--json"], envs = [["NODE_ENV", "production"]], comment = "include installed dev dependencies without excluding other dependency types" }, { argv = ["vp", "pm", "list", "--", "--include=dev", "--json"], comment = "raw native include remains available and lists all four dependency types" }, ] + +[[case]] +name = "npm6_dependency_filters_list" +vp = "global" +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, + { argv = ["vpt", "json-edit", "package.json", "peerDependencies", "{}"], snapshot = false }, + { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, + { argv = ["vp", "pm", "list", "-D", "--json"], envs = [["NODE_ENV", "production"]], comment = "npm 6 lists both production and development dependencies" }, + { argv = ["vp", "pm", "list", "-P", "--no-optional", "--exclude-peers"], comment = "reject omit filters without equivalent npm 6 options" }, +] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md new file mode 100644 index 0000000000..bc15b9c468 --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md @@ -0,0 +1,45 @@ +# npm6_dependency_filters_list + +## `vpt json-edit package.json packageManager npm@6.14.18` + + +## `vpt json-edit package.json peerDependencies {}` + + +## `vp install --ignore-scripts --silent` + + +## `NODE_ENV=production vp pm list -D --json` + +npm 6 lists both production and development dependencies + +``` +{ + "name": "command-list-npm10", + "version": "1.0.0", + "dependencies": { + "test-vite-plus-package": { + "version": "1.0.0", + "from": "test-vite-plus-package@1.0.0", + "resolved": "http://127.0.0.1:/test-vite-plus-package/-/test-vite-plus-package-1.0.0.tgz" + }, + "testnpm2": { + "version": "1.0.1", + "from": "testnpm2@1.0.1", + "resolved": "http://127.0.0.1:/testnpm2/-/testnpm2-1.0.1.tgz" + } + } +} +``` + +## `vp pm list -P --no-optional --exclude-peers` + +reject omit filters without equivalent npm 6 options + +**Exit code:** 1 + +``` +npm < 7 does not support --prod. +npm < 7 does not support --no-optional. +npm < 7 does not support --exclude-peers. +``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots.toml index f7d2a54acc..4d92b8efce 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots.toml @@ -11,3 +11,17 @@ steps = [ { argv = ["vp", "pm", "prune", "--prod", "--no-optional"], comment = "should prune both dev and optional dependencies", continue-on-failure = true }, { argv = ["vp", "pm", "prune", "--", "--loglevel=warn"], comment = "should support pass through arguments", continue-on-failure = true }, ] + +[[case]] +name = "npm6_dependency_filters_prune" +vp = "global" +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, + { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, + ["vpt", "stat-file", "node_modules/test-vite-plus-package/package.json", "--assert", "file"], + ["vp", "pm", "prune", "--prod", "--", "--silent"], + ["vpt", "stat-file", "node_modules/test-vite-plus-package/package.json", "--assert", "missing"], + ["vpt", "stat-file", "node_modules/testnpm2/package.json", "--assert", "file"], + ["vpt", "stat-file", "node_modules/test-vite-plus-package-optional/package.json", "--assert", "file"], +] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/npm6_dependency_filters_prune.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/npm6_dependency_filters_prune.md new file mode 100644 index 0000000000..0541d8268d --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/npm6_dependency_filters_prune.md @@ -0,0 +1,37 @@ +# npm6_dependency_filters_prune + +## `vpt json-edit package.json packageManager npm@6.14.18` + + +## `vp install --ignore-scripts --silent` + + +## `vpt stat-file node_modules/test-vite-plus-package/package.json --assert file` + +``` +node_modules/test-vite-plus-package/package.json: file +``` + +## `vp pm prune --prod -- --silent` + +``` +removed 1 package in +``` + +## `vpt stat-file node_modules/test-vite-plus-package/package.json --assert missing` + +``` +node_modules/test-vite-plus-package/package.json: missing +``` + +## `vpt stat-file node_modules/testnpm2/package.json --assert file` + +``` +node_modules/testnpm2/package.json: file +``` + +## `vpt stat-file node_modules/test-vite-plus-package-optional/package.json --assert file` + +``` +node_modules/test-vite-plus-package-optional/package.json: file +``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml index 03d4f6dc75..3cf8b92a48 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml @@ -18,3 +18,17 @@ steps = [ { argv = ["vp", "update", "--", "--no-audit"], comment = "should update all packages but won't change the package.json" }, { argv = ["vpt", "print-file", "package.json"], continue-on-failure = true }, ] + +[[case]] +name = "npm6_dependency_filters_update" +vp = "global" +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, + { argv = ["vpt", "json-edit", "package.json", "devDependencies", '{"yocto-queue":"1.0.0"}'], snapshot = false }, + { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, + ["vpt", "grep-file", "node_modules/yocto-queue/package.json", '"version": "1.0.0"'], + { argv = ["vpt", "json-edit", "package.json", "devDependencies.yocto-queue", "^1.0.0"], snapshot = false }, + { argv = ["vp", "update", "-D", "--", "--ignore-scripts", "--silent"], envs = [["NODE_ENV", "production"]], comment = "npm 6 uses --also=dev to include development updates" }, + ["vpt", "grep-file", "node_modules/yocto-queue/package.json", '"version": "1.2.2"'], +] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md new file mode 100644 index 0000000000..bdd148f14e --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md @@ -0,0 +1,34 @@ +# npm6_dependency_filters_update + +## `vpt json-edit package.json packageManager npm@6.14.18` + + +## `vpt json-edit package.json devDependencies '{"yocto-queue":"1.0.0"}'` + + +## `vp install --ignore-scripts --silent` + + +## `vpt grep-file node_modules/yocto-queue/package.json '"version": "1.0.0"'` + +``` +node_modules/yocto-queue/package.json: found "\"version\": \"1.0.0\"" +``` + +## `vpt json-edit package.json devDependencies.yocto-queue ^1.0.0` + + +## `NODE_ENV=production vp update -D -- --ignore-scripts --silent` + +npm 6 uses --also=dev to include development updates + +``` + yocto-queue@1.2.2 +updated 1 package in +``` + +## `vpt grep-file node_modules/yocto-queue/package.json '"version": "1.2.2"'` + +``` +node_modules/yocto-queue/package.json: found "\"version\": \"1.2.2\"" +``` diff --git a/crates/vp_pm_cli/src/resolution/commands/add.rs b/crates/vp_pm_cli/src/resolution/commands/add.rs index 5d77e989a4..9f48c74e15 100644 --- a/crates/vp_pm_cli/src/resolution/commands/add.rs +++ b/crates/vp_pm_cli/src/resolution/commands/add.rs @@ -166,7 +166,7 @@ impl SaveDependencyArgs { impl Resolve for Pnpm { fn resolve(&self, args: &AddArgs, _diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_add(args); + return Npm::unknown_version().resolve_add(args); } let mut cmd = CommandBuilder::new("pnpm"); cmd.repeated("--filter", args.filter.iter()); @@ -216,7 +216,7 @@ impl Resolve for Pnpm { } impl Npm { - fn resolve_add(args: &AddArgs) -> CommandResolution { + fn resolve_add(&self, args: &AddArgs) -> CommandResolution { let mut cmd = CommandBuilder::new("npm"); if args.global { cmd.arg("install") @@ -247,7 +247,10 @@ impl Npm { } cmd.arg_if("--save-exact", args.save_exact) .arg_if("--ignore-scripts", args.ignore_scripts) - .arg_if("--omit=optional", args.no_optional) + .arg_if( + if self.supports_v7_commands() { "--omit=optional" } else { "--no-optional" }, + args.no_optional, + ) .arg_if("--package-lock-only", args.lockfile_only) .arg_if("--prefer-offline", args.prefer_offline) .arg_if("--offline", args.offline) @@ -263,14 +266,14 @@ impl Npm { impl Resolve for Npm { fn resolve(&self, args: &AddArgs, _diag: &mut Diagnostics) -> CommandResolution { - Self::resolve_add(args) + self.resolve_add(args) } } impl Resolve for Yarn { fn resolve(&self, args: &AddArgs, diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_add(args); + return Npm::unknown_version().resolve_add(args); } let mut cmd = CommandBuilder::new("yarn"); @@ -312,7 +315,7 @@ impl Resolve for Yarn { impl Resolve for Bun { fn resolve(&self, args: &AddArgs, _diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_add(args); + return Npm::unknown_version().resolve_add(args); } let mut cmd = CommandBuilder::new("bun"); cmd.arg("add").repeated("--filter", args.filter.iter()); diff --git a/crates/vp_pm_cli/src/resolution/commands/audit.rs b/crates/vp_pm_cli/src/resolution/commands/audit.rs index 5eba525fc9..48e25841ca 100644 --- a/crates/vp_pm_cli/src/resolution/commands/audit.rs +++ b/crates/vp_pm_cli/src/resolution/commands/audit.rs @@ -38,7 +38,10 @@ impl Resolve for Npm { cmd.arg("fix"); } cmd.option("--audit-level", args.level.as_ref()) - .arg_if("--omit=dev", args.production) + .arg_if( + if self.supports_v7_commands() { "--omit=dev" } else { "--production" }, + args.production, + ) .arg_if("--json", args.json) .extend(args.pass_through_args.iter()); cmd.into() @@ -298,6 +301,28 @@ mod tests { assert_eq!(command.args, vec!["npm", "audit", "--severity", "high"]); } + #[test] + fn npm_dependency_filter_version_boundaries() { + for (version, flag) in [("6.14.18", "--production"), ("7.0.0", "--omit=dev")] { + for fix in [false, true] { + let args = AuditArgs { + production: true, + fix, + pass_through_args: vec!["--json".into()], + ..Default::default() + }; + let resolution = resolve(&npm(version), args); + assert!(resolution.diagnostics.is_empty()); + let expected = if fix { + vec!["audit", "fix", flag, "--json"] + } else { + vec!["audit", flag, "--json"] + }; + assert_eq!(expect_run(resolution.outcome).args, expected); + } + } + } + #[test] fn test_production_flag_maps_per_package_manager() { let npm_resolution = diff --git a/crates/vp_pm_cli/src/resolution/commands/install.rs b/crates/vp_pm_cli/src/resolution/commands/install.rs index bc9d5c7af3..78789b9c87 100644 --- a/crates/vp_pm_cli/src/resolution/commands/install.rs +++ b/crates/vp_pm_cli/src/resolution/commands/install.rs @@ -241,9 +241,15 @@ impl Resolve for Npm { let use_ci = args.frozen_lockfile && !args.no_frozen_lockfile; let mut cmd = CommandBuilder::new("npm"); cmd.arg(if use_ci { "ci" } else { "install" }); - cmd.arg_if("--omit=dev", args.prod) - .arg_if("--include=dev", args.dev) - .arg_if("--omit=optional", args.no_optional); + if self.supports_v7_commands() { + cmd.arg_if("--omit=dev", args.prod) + .arg_if("--include=dev", args.dev) + .arg_if("--omit=optional", args.no_optional); + } else { + cmd.arg_if("--production", args.prod) + .arg_if("--production=false", args.dev) + .arg_if("--no-optional", args.no_optional); + } cmd.arg_if("--package-lock-only", args.lockfile_only && !use_ci) .arg_if("--prefer-offline", args.prefer_offline) .arg_if("--offline", args.offline) @@ -583,6 +589,32 @@ mod tests { assert_eq!(command.args, vec!["install", "--omit=dev"]); } + #[test] + fn npm_dependency_filter_version_boundaries() { + for (version, filters) in [ + ("6.14.18", vec!["--production", "--production=false", "--no-optional"]), + ("7.0.0", vec!["--omit=dev", "--include=dev", "--omit=optional"]), + ("12.2.1", vec!["--omit=dev", "--include=dev", "--omit=optional"]), + ] { + for frozen_lockfile in [false, true] { + let args = InstallArgs { + prod: true, + dev: true, + no_optional: true, + frozen_lockfile, + pass_through_args: vec!["--production=true".into()], + ..Default::default() + }; + let resolution = resolve(&npm(version), args); + assert!(resolution.diagnostics.is_empty()); + let mut expected = vec![if frozen_lockfile { "ci" } else { "install" }]; + expected.extend(&filters); + expected.push("--production=true"); + assert_eq!(expect_run(resolution.outcome).args, expected, "npm {version}"); + } + } + } + #[test] fn npm_install_includes_dev_dependencies() { for frozen_lockfile in [false, true] { diff --git a/crates/vp_pm_cli/src/resolution/commands/list.rs b/crates/vp_pm_cli/src/resolution/commands/list.rs index d2ca54016b..bf2f506b0d 100644 --- a/crates/vp_pm_cli/src/resolution/commands/list.rs +++ b/crates/vp_pm_cli/src/resolution/commands/list.rs @@ -27,7 +27,8 @@ pub struct ListArgs { pub(crate) parseable: bool, /// Only production dependencies - #[arg(short = 'P', long, not_supported(yarn >= "2", bun))] + // Legacy npm --production also excludes peers, unlike --omit=dev. + #[arg(short = 'P', long, not_supported(npm < "7", yarn >= "2", bun))] pub(crate) prod: bool, /// Include dev dependencies @@ -35,11 +36,11 @@ pub struct ListArgs { pub(crate) dev: bool, /// Exclude optional dependencies - #[arg(long, not_supported(yarn, bun))] + #[arg(long, not_supported(npm < "7", yarn, bun))] pub(crate) no_optional: bool, /// Exclude peer dependencies - #[arg(long, not_supported(yarn, bun))] + #[arg(long, not_supported(npm < "7", yarn, bun))] pub(crate) exclude_peers: bool, /// Show only project packages @@ -70,7 +71,7 @@ pub struct ListArgs { impl Resolve for Pnpm { fn resolve(&self, args: &ListArgs, _diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_list(args); + return Npm::unknown_version().resolve_list(args); } let mut cmd = CommandBuilder::new("pnpm"); @@ -94,7 +95,7 @@ impl Resolve for Pnpm { } impl Npm { - fn resolve_list(args: &ListArgs) -> CommandResolution { + fn resolve_list(&self, args: &ListArgs) -> CommandResolution { let mut cmd = CommandBuilder::new("npm"); cmd.arg("list"); if let Some(pattern) = &args.pattern { @@ -106,7 +107,11 @@ impl Npm { cmd.arg("--omit").arg("dev"); } if args.dev { - cmd.arg("--include").arg("dev"); + if self.supports_v7_commands() { + cmd.arg("--include").arg("dev"); + } else { + cmd.arg("--production=false"); + } } if args.no_optional { cmd.arg("--omit").arg("optional"); @@ -125,7 +130,7 @@ impl Npm { impl Resolve for Npm { fn resolve(&self, args: &ListArgs, _diag: &mut Diagnostics) -> CommandResolution { - Self::resolve_list(args) + self.resolve_list(args) } } @@ -140,7 +145,7 @@ impl Resolve for Yarn { } if args.global { - return Npm::resolve_list(args); + return Npm::unknown_version().resolve_list(args); } let mut cmd = CommandBuilder::new("yarn"); @@ -160,7 +165,7 @@ impl Resolve for Yarn { impl Resolve for Bun { fn resolve(&self, args: &ListArgs, _diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_list(args); + return Npm::unknown_version().resolve_list(args); } let mut cmd = CommandBuilder::new("bun"); @@ -435,10 +440,41 @@ mod tests { } #[test] - fn test_npm_list_dev_includes_dev_dependencies() { - let args = parse_args::(["--dev", "--json"]).unwrap(); - let command = expect_run(resolve(&npm("11.16.0"), args).outcome); - assert_eq!(command.args, vec!["list", "--json", "--include", "dev"]); + fn npm_dependency_filter_version_boundaries() { + for version in ["6.14.18", "7.0.0", "11.16.0"] { + let args = parse_args::(["--dev", "--json"]).unwrap(); + let resolution = resolve(&npm(version), args); + assert!(resolution.diagnostics.is_empty()); + let expected = if version == "6.14.18" { + vec!["list", "--json", "--production=false"] + } else { + vec!["list", "--json", "--include", "dev"] + }; + assert_eq!(expect_run(resolution.outcome).args, expected); + + let args = parse_args::(["-P", "--no-optional", "--exclude-peers"]).unwrap(); + let resolution = resolve(&npm(version), args); + if version == "6.14.18" { + expect_unsupported( + resolution, + &[ + "npm < 7 does not support --prod.", + "npm < 7 does not support --no-optional.", + "npm < 7 does not support --exclude-peers.", + ], + ); + } else { + assert!(resolution.diagnostics.is_empty()); + assert_eq!( + expect_run(resolution.outcome).args, + ["list", "--omit", "dev", "--omit", "optional", "--omit", "peer"] + ); + } + } + let args = parse_args::(["--", "--omit", "peer"]).unwrap(); + let resolution = resolve(&npm("6.14.18"), args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, ["list", "--omit", "peer"]); } #[test] diff --git a/crates/vp_pm_cli/src/resolution/commands/prune.rs b/crates/vp_pm_cli/src/resolution/commands/prune.rs index 890417e5ce..84e61b39ec 100644 --- a/crates/vp_pm_cli/src/resolution/commands/prune.rs +++ b/crates/vp_pm_cli/src/resolution/commands/prune.rs @@ -35,7 +35,10 @@ impl Resolve for Npm { fn resolve(&self, args: &PruneArgs, _diag: &mut Diagnostics) -> CommandResolution { let mut cmd = CommandBuilder::new("npm"); cmd.arg("prune") - .arg_if("--omit=dev", args.prod) + .arg_if( + if self.supports_v7_commands() { "--omit=dev" } else { "--production" }, + args.prod, + ) .arg_if("--omit=optional", args.no_optional) .extend(args.pass_through_args.iter()); cmd.into() @@ -109,6 +112,20 @@ mod tests { assert_eq!(command.args, vec!["prune"]); } + #[test] + fn npm_dependency_filter_version_boundaries() { + for (version, flag) in [("6.14.18", "--production"), ("7.0.0", "--omit=dev")] { + let args = PruneArgs { + prod: true, + pass_through_args: vec!["--no-audit".into()], + ..Default::default() + }; + let resolution = resolve(&npm(version), args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, ["prune", flag, "--no-audit"]); + } + } + #[test] fn test_npm_prune_prod() { let command = expect_run( diff --git a/crates/vp_pm_cli/src/resolution/commands/update.rs b/crates/vp_pm_cli/src/resolution/commands/update.rs index 16104a71e0..f94be4f72f 100644 --- a/crates/vp_pm_cli/src/resolution/commands/update.rs +++ b/crates/vp_pm_cli/src/resolution/commands/update.rs @@ -100,7 +100,10 @@ impl Resolve for Npm { cmd.arg("--include-workspace-root"); } cmd.arg_if("--workspaces", args.recursive) - .arg_if("--include=dev", args.dev) + .arg_if( + if self.supports_v7_commands() { "--include=dev" } else { "--also=dev" }, + args.dev, + ) .arg_if("--include=prod", args.prod) .arg_if("--no-optional", args.no_optional) .arg_if("--no-save", args.no_save) @@ -607,6 +610,19 @@ mod tests { assert_eq!(command.args, vec!["update", "--include-workspace-root", "--workspaces"]); } + #[test] + fn npm_dependency_filter_version_boundaries() { + for (version, flag) in [("6.14.18", "--also=dev"), ("7.0.0", "--include=dev")] { + let args = parse_args::(["-D", "react", "--", "--no-audit"]).unwrap(); + let resolution = resolve(&npm(version), args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!( + expect_run(resolution.outcome).args, + ["update", flag, "--no-audit", "react"] + ); + } + } + #[test] fn test_npm_update_preserves_native_selectors() { for (flag, native_flag) in diff --git a/crates/vp_pm_cli/src/resolution/dialect.rs b/crates/vp_pm_cli/src/resolution/dialect.rs index 5d0b5b770b..77494e29b6 100644 --- a/crates/vp_pm_cli/src/resolution/dialect.rs +++ b/crates/vp_pm_cli/src/resolution/dialect.rs @@ -57,6 +57,11 @@ impl Npm { Self { version: None } } + /// `--omit` and `--include` landed in npm 7. Unknown versions are treated as current. + pub(crate) fn supports_v7_commands(&self) -> bool { + self.version.as_ref().is_none_or(|version| version >= &Version::new(7, 0, 0)) + } + /// `pkg get`, `pkg set`, and `pkg delete` landed in npm 7.20.0. /// Unknown versions are treated as current. pub(crate) fn supports_v7_20_commands(&self) -> bool { From 7e28a8966e83def4602e2c0439dda536adcd3331 Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 17:49:18 +0900 Subject: [PATCH 2/7] chore(pm): retain original list production filter comment --- crates/vp_pm_cli/src/resolution/commands/list.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/vp_pm_cli/src/resolution/commands/list.rs b/crates/vp_pm_cli/src/resolution/commands/list.rs index bf2f506b0d..f76703c8c7 100644 --- a/crates/vp_pm_cli/src/resolution/commands/list.rs +++ b/crates/vp_pm_cli/src/resolution/commands/list.rs @@ -27,7 +27,6 @@ pub struct ListArgs { pub(crate) parseable: bool, /// Only production dependencies - // Legacy npm --production also excludes peers, unlike --omit=dev. #[arg(short = 'P', long, not_supported(npm < "7", yarn >= "2", bun))] pub(crate) prod: bool, From 3109b3fcda25f86350fc0d4c0cce8f7fb4acb1f5 Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 18:49:09 +0900 Subject: [PATCH 3/7] fix(pm): reject prune --no-optional on npm 6 npm 6 prune has no optional dependency filter and silently ignores --omit=optional, so report it as unsupported like list does. --- crates/vp_pm_cli/src/resolution/commands/prune.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/vp_pm_cli/src/resolution/commands/prune.rs b/crates/vp_pm_cli/src/resolution/commands/prune.rs index 84e61b39ec..fc823011e7 100644 --- a/crates/vp_pm_cli/src/resolution/commands/prune.rs +++ b/crates/vp_pm_cli/src/resolution/commands/prune.rs @@ -12,7 +12,7 @@ pub struct PruneArgs { pub(crate) prod: bool, /// Remove optional dependencies - #[arg(long, not_supported(yarn, bun < "1.4"))] + #[arg(long, not_supported(npm < "7", yarn, bun < "1.4"))] pub(crate) no_optional: bool, /// Additional arguments @@ -124,6 +124,16 @@ mod tests { assert!(resolution.diagnostics.is_empty()); assert_eq!(expect_run(resolution.outcome).args, ["prune", flag, "--no-audit"]); } + + let args = parse_args::(["--no-optional"]).unwrap(); + expect_unsupported( + resolve(&npm("6.14.18"), args), + &["npm < 7 does not support --no-optional."], + ); + let args = parse_args::(["--no-optional"]).unwrap(); + let resolution = resolve(&npm("7.0.0"), args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, ["prune", "--omit=optional"]); } #[test] From 5f3589c0f22fd4f56b1aeb388a4b79a341329bc1 Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 23:10:58 +0900 Subject: [PATCH 4/7] fix(pm): align list, update, and outdated filters with npm 6 Map list --prod to --production on npm 6, accepting that legacy production listing omits peers. Gate outdated and update dependency filters by npm version, and reject --prod there because npm 6 outdated still reports installed devDependencies with --production. Use --omit=optional for update on npm 7+ instead of the deprecated --no-optional. --- .../command_list_npm10/snapshots.toml | 3 +- .../snapshots/npm6_dependency_filters_list.md | 21 +++++++- .../command_outdated_npm10/snapshots.toml | 12 +++++ .../npm6_dependency_filters_outdated.md | 31 +++++++++++ .../command_update_npm10/snapshots.toml | 1 + .../snapshots/command_update_npm10.md | 4 -- .../npm6_dependency_filters_update.md | 10 ++++ .../vp_pm_cli/src/resolution/commands/list.rs | 19 +++++-- .../src/resolution/commands/outdated.rs | 54 +++++++++++++++---- .../src/resolution/commands/update.rs | 35 ++++++++++-- 10 files changed, 166 insertions(+), 24 deletions(-) create mode 100644 crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml index ba12511498..a631f89b9c 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml @@ -39,5 +39,6 @@ steps = [ { argv = ["vpt", "json-edit", "package.json", "peerDependencies", "{}"], snapshot = false }, { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, { argv = ["vp", "pm", "list", "-D", "--json"], envs = [["NODE_ENV", "production"]], comment = "npm 6 lists both production and development dependencies" }, - { argv = ["vp", "pm", "list", "-P", "--no-optional", "--exclude-peers"], comment = "reject omit filters without equivalent npm 6 options" }, + { argv = ["vp", "pm", "list", "-P", "--json"], comment = "npm 6 uses --production to list only production dependencies" }, + { argv = ["vp", "pm", "list", "--no-optional", "--exclude-peers"], comment = "reject omit filters without equivalent npm 6 options" }, ] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md index bc15b9c468..af73ce37e4 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md @@ -32,14 +32,31 @@ npm 6 lists both production and development dependencies } ``` -## `vp pm list -P --no-optional --exclude-peers` +## `vp pm list -P --json` + +npm 6 uses --production to list only production dependencies + +``` +{ + "name": "command-list-npm10", + "version": "1.0.0", + "dependencies": { + "testnpm2": { + "version": "1.0.1", + "from": "testnpm2@1.0.1", + "resolved": "http://127.0.0.1:/testnpm2/-/testnpm2-1.0.1.tgz" + } + } +} +``` + +## `vp pm list --no-optional --exclude-peers` reject omit filters without equivalent npm 6 options **Exit code:** 1 ``` -npm < 7 does not support --prod. npm < 7 does not support --no-optional. npm < 7 does not support --exclude-peers. ``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots.toml index 863f7f62bc..91500cb6f8 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots.toml @@ -17,3 +17,15 @@ steps = [ { argv = ["vp", "outdated", "--compatible"], comment = "should reject unsupported --compatible", continue-on-failure = true }, { argv = ["vp", "outdated", "--sort-by", "name"], comment = "should reject unsupported --sort-by", continue-on-failure = true }, ] + +[[case]] +name = "npm6_dependency_filters_outdated" +vp = "global" +skip-platforms = ["windows"] +env = { npm_config_audit = "false", npm_config_fund = "false" } +steps = [ + { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, + { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, + { argv = ["vp", "outdated", "-D"], envs = [["NODE_ENV", "production"]], comment = "npm 6 uses --also=dev to include development dependencies", continue-on-failure = true }, + { argv = ["vp", "outdated", "-r", "-P", "--no-optional"], comment = "reject options without equivalent npm 6 options because npm 6 --production still reports installed devDependencies" }, +] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md new file mode 100644 index 0000000000..d565cb48b4 --- /dev/null +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md @@ -0,0 +1,31 @@ +# npm6_dependency_filters_outdated + +## `vpt json-edit package.json packageManager npm@6.14.18` + + +## `vp install --ignore-scripts --silent` + + +## `NODE_ENV=production vp outdated -D` + +npm 6 uses --also=dev to include development dependencies + +**Exit code:** 1 + +``` +Package Current Wanted Latest Location +test-vite-plus-top-package 1.0.0 1.0.0 1.1.0 command-outdated-npm10 +testnpm2 1.0.0 1.0.0 1.0.1 command-outdated-npm10 +``` + +## `vp outdated -r -P --no-optional` + +reject options without equivalent npm 6 options because npm 6 --production still reports installed devDependencies + +**Exit code:** 1 + +``` +npm < 7 does not support --recursive. +npm < 7 does not support --prod. +npm < 7 does not support --no-optional. +``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml index 3cf8b92a48..1c18bef5f1 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml @@ -31,4 +31,5 @@ steps = [ { argv = ["vpt", "json-edit", "package.json", "devDependencies.yocto-queue", "^1.0.0"], snapshot = false }, { argv = ["vp", "update", "-D", "--", "--ignore-scripts", "--silent"], envs = [["NODE_ENV", "production"]], comment = "npm 6 uses --also=dev to include development updates" }, ["vpt", "grep-file", "node_modules/yocto-queue/package.json", '"version": "1.2.2"'], + { argv = ["vp", "update", "-P"], comment = "reject --prod because npm 6 selects updates through outdated, whose --production still reports installed devDependencies" }, ] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md index c8d35a21f6..4ec7397a0e 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md @@ -136,10 +136,6 @@ added 1 package in preserve npm's native optional dependency exclusion ``` -npm warn config optional Use `--omit=optional` to exclude optional dependencies, or -npm warn config `--include=optional` to include them. -npm warn config -npm warn config Default value does install optional deps unless otherwise omitted. changed 1 package in ``` diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md index bdd148f14e..e41b594b75 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md @@ -32,3 +32,13 @@ updated 1 package in ``` node_modules/yocto-queue/package.json: found "\"version\": \"1.2.2\"" ``` + +## `vp update -P` + +reject --prod because npm 6 selects updates through outdated, whose --production still reports installed devDependencies + +**Exit code:** 1 + +``` +npm < 7 does not support --prod. +``` diff --git a/crates/vp_pm_cli/src/resolution/commands/list.rs b/crates/vp_pm_cli/src/resolution/commands/list.rs index f76703c8c7..3a82c98013 100644 --- a/crates/vp_pm_cli/src/resolution/commands/list.rs +++ b/crates/vp_pm_cli/src/resolution/commands/list.rs @@ -27,7 +27,7 @@ pub struct ListArgs { pub(crate) parseable: bool, /// Only production dependencies - #[arg(short = 'P', long, not_supported(npm < "7", yarn >= "2", bun))] + #[arg(short = 'P', long, not_supported(yarn >= "2", bun))] pub(crate) prod: bool, /// Include dev dependencies @@ -103,7 +103,11 @@ impl Npm { cmd.option("--depth", args.depth).arg_if("--json", args.json); cmd.arg_if("--long", args.long).arg_if("--parseable", args.parseable); if args.prod { - cmd.arg("--omit").arg("dev"); + if self.supports_v7_commands() { + cmd.arg("--omit").arg("dev"); + } else { + cmd.arg("--production"); + } } if args.dev { if self.supports_v7_commands() { @@ -457,7 +461,6 @@ mod tests { expect_unsupported( resolution, &[ - "npm < 7 does not support --prod.", "npm < 7 does not support --no-optional.", "npm < 7 does not support --exclude-peers.", ], @@ -470,6 +473,16 @@ mod tests { ); } } + for (dialect, flags) in [ + (npm("6.14.18"), vec!["--production"]), + (npm("7.0.0"), vec!["--omit", "dev"]), + (Npm::unknown_version(), vec!["--omit", "dev"]), + ] { + let args = parse_args::(["-P"]).unwrap(); + let resolution = resolve(&dialect, args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, [vec!["list"], flags].concat()); + } let args = parse_args::(["--", "--omit", "peer"]).unwrap(); let resolution = resolve(&npm("6.14.18"), args); assert!(resolution.diagnostics.is_empty()); diff --git a/crates/vp_pm_cli/src/resolution/commands/outdated.rs b/crates/vp_pm_cli/src/resolution/commands/outdated.rs index d5dc701f96..318e2b6d48 100644 --- a/crates/vp_pm_cli/src/resolution/commands/outdated.rs +++ b/crates/vp_pm_cli/src/resolution/commands/outdated.rs @@ -60,7 +60,7 @@ pub struct OutdatedArgs { pub(crate) format: Option, /// Check recursively across all workspaces - #[arg(short = 'r', long, not_supported(yarn))] + #[arg(short = 'r', long, not_supported(npm < "7", yarn))] pub(crate) recursive: bool, /// Filter packages in monorepo @@ -72,7 +72,7 @@ pub struct OutdatedArgs { pub(crate) workspace_root: bool, /// Only production and optional dependencies - #[arg(short = 'P', long, not_supported(yarn))] + #[arg(short = 'P', long, not_supported(npm < "7", yarn))] pub(crate) prod: bool, /// Include dev dependencies @@ -80,7 +80,7 @@ pub struct OutdatedArgs { pub(crate) dev: bool, /// Exclude optional dependencies - #[arg(long, not_supported(yarn))] + #[arg(long, not_supported(npm < "7", yarn))] pub(crate) no_optional: bool, /// Only show compatible versions @@ -107,7 +107,7 @@ pub struct OutdatedArgs { impl Resolve for Pnpm { fn resolve(&self, args: &OutdatedArgs, _diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_outdated(args); + return Npm::unknown_version().resolve_outdated(args); } let mut cmd = CommandBuilder::new("pnpm"); @@ -130,7 +130,7 @@ impl Resolve for Pnpm { } impl Npm { - fn resolve_outdated(args: &OutdatedArgs) -> CommandResolution { + fn resolve_outdated(&self, args: &OutdatedArgs) -> CommandResolution { let mut cmd = CommandBuilder::new("npm"); cmd.arg("outdated"); match args.format { @@ -148,7 +148,10 @@ impl Npm { .arg_if("--all", args.recursive) .extend(args.packages.iter()); cmd.arg_if("--omit=dev", args.prod) - .arg_if("--include=dev", args.dev) + .arg_if( + if self.supports_v7_commands() { "--include=dev" } else { "--also=dev" }, + args.dev, + ) .arg_if("--omit=optional", args.no_optional) .extend(args.pass_through_args.iter()); if args.global { @@ -160,14 +163,14 @@ impl Npm { impl Resolve for Npm { fn resolve(&self, args: &OutdatedArgs, _diag: &mut Diagnostics) -> CommandResolution { - Self::resolve_outdated(args) + self.resolve_outdated(args) } } impl Resolve for Yarn { fn resolve(&self, args: &OutdatedArgs, diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_outdated(args); + return Npm::unknown_version().resolve_outdated(args); } if self.is_berry() { @@ -201,7 +204,7 @@ impl Resolve for Yarn { impl Resolve for Bun { fn resolve(&self, args: &OutdatedArgs, _diag: &mut Diagnostics) -> CommandResolution { if args.global { - return Npm::resolve_outdated(args); + return Npm::unknown_version().resolve_outdated(args); } let mut cmd = CommandBuilder::new("bun"); @@ -233,6 +236,39 @@ mod tests { } } + #[test] + fn npm_dependency_filter_version_boundaries() { + for (dialect, flag) in [ + (npm("6.14.18"), "--also=dev"), + (npm("7.0.0"), "--include=dev"), + (Npm::unknown_version(), "--include=dev"), + ] { + let args = parse_args::(["-D", "react", "--", "--json"]).unwrap(); + let resolution = resolve(&dialect, args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, ["outdated", "react", flag, "--json"]); + } + + let args = parse_args::(["-r", "-P", "--no-optional"]).unwrap(); + expect_unsupported( + resolve(&npm("6.14.18"), args), + &[ + "npm < 7 does not support --recursive.", + "npm < 7 does not support --prod.", + "npm < 7 does not support --no-optional.", + ], + ); + for dialect in [npm("7.0.0"), Npm::unknown_version()] { + let args = parse_args::(["-r", "-P", "--no-optional"]).unwrap(); + let resolution = resolve(&dialect, args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!( + expect_run(resolution.outcome).args, + ["outdated", "--all", "--omit=dev", "--omit=optional"] + ); + } + } + #[test] fn format_parser_accepts_known_values() { let args = parse_args::(["--format", "json"]).unwrap(); diff --git a/crates/vp_pm_cli/src/resolution/commands/update.rs b/crates/vp_pm_cli/src/resolution/commands/update.rs index f94be4f72f..01594b771c 100644 --- a/crates/vp_pm_cli/src/resolution/commands/update.rs +++ b/crates/vp_pm_cli/src/resolution/commands/update.rs @@ -45,7 +45,7 @@ pub struct UpdateArgs { pub(crate) dev: bool, /// Update dependencies (production) - #[arg(short = 'P', long, not_supported(yarn >= "2", bun < "1.4"))] + #[arg(short = 'P', long, not_supported(npm < "7", yarn >= "2", bun < "1.4"))] pub(crate) prod: bool, /// Interactive mode @@ -105,7 +105,10 @@ impl Resolve for Npm { args.dev, ) .arg_if("--include=prod", args.prod) - .arg_if("--no-optional", args.no_optional) + .arg_if( + if self.supports_v7_commands() { "--omit=optional" } else { "--no-optional" }, + args.no_optional, + ) .arg_if("--no-save", args.no_save) .extend(args.pass_through_args.iter()) .extend(args.packages.iter()); @@ -621,13 +624,35 @@ mod tests { ["update", flag, "--no-audit", "react"] ); } + + for (dialect, flag) in [ + (npm("6.14.18"), "--no-optional"), + (npm("7.0.0"), "--omit=optional"), + (Npm::unknown_version(), "--omit=optional"), + ] { + let args = parse_args::(["--no-optional", "react"]).unwrap(); + let resolution = resolve(&dialect, args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, ["update", flag, "react"]); + } + + let args = parse_args::(["-P", "react"]).unwrap(); + expect_unsupported(resolve(&npm("6.14.18"), args), &["npm < 7 does not support --prod."]); + for dialect in [npm("7.0.0"), Npm::unknown_version()] { + let args = parse_args::(["-P", "react"]).unwrap(); + let resolution = resolve(&dialect, args); + assert!(resolution.diagnostics.is_empty()); + assert_eq!(expect_run(resolution.outcome).args, ["update", "--include=prod", "react"]); + } } #[test] fn test_npm_update_preserves_native_selectors() { - for (flag, native_flag) in - [("-D", "--include=dev"), ("-P", "--include=prod"), ("--no-optional", "--no-optional")] - { + for (flag, native_flag) in [ + ("-D", "--include=dev"), + ("-P", "--include=prod"), + ("--no-optional", "--omit=optional"), + ] { let args = parse_args::([flag, "react"]).unwrap(); let resolution = resolve(&npm("11.16.0"), args); assert!(resolution.diagnostics.is_empty()); From fba5800ee89e6b178b6c7087899a09a3799b059c Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 23:12:31 +0900 Subject: [PATCH 5/7] test(pm): rename npm outdated fixture to cover multiple npm versions The fixture now holds both npm 10 and npm 6 cases, so drop the version suffix from the directory and package name. --- .../package.json | 2 +- .../snapshots.toml | 0 .../snapshots/command_outdated_npm10.md | 0 .../snapshots/npm6_dependency_filters_outdated.md | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_outdated_npm10 => command_outdated_npm}/package.json (87%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_outdated_npm10 => command_outdated_npm}/snapshots.toml (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_outdated_npm10 => command_outdated_npm}/snapshots/command_outdated_npm10.md (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_outdated_npm10 => command_outdated_npm}/snapshots/npm6_dependency_filters_outdated.md (96%) diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/package.json similarity index 87% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/package.json index 57f817c3a3..a5ddb2147e 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/package.json +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/package.json @@ -1,5 +1,5 @@ { - "name": "command-outdated-npm10", + "name": "command-outdated-npm", "version": "1.0.0", "dependencies": { "testnpm2": "1.0.0" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots.toml similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots.toml rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots.toml diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/command_outdated_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/command_outdated_npm10.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/command_outdated_npm10.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/command_outdated_npm10.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md similarity index 96% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md index d565cb48b4..9da3266bf3 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm10/snapshots/npm6_dependency_filters_outdated.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md @@ -14,8 +14,8 @@ npm 6 uses --also=dev to include development dependencies ``` Package Current Wanted Latest Location -test-vite-plus-top-package 1.0.0 1.0.0 1.1.0 command-outdated-npm10 -testnpm2 1.0.0 1.0.0 1.0.1 command-outdated-npm10 +test-vite-plus-top-package 1.0.0 1.0.0 1.1.0 command-outdated-npm +testnpm2 1.0.0 1.0.0 1.0.1 command-outdated-npm ``` ## `vp outdated -r -P --no-optional` From efdf5899d7fcf6e229276d32755d7ad6db3657db Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 23:14:33 +0900 Subject: [PATCH 6/7] test(pm): drop npm version suffixes from mixed-version fixtures The add, install, list, prune, and update fixtures now include npm 6 cases alongside npm 10 or npm 11 cases, so name them by package manager only. Case names still state the npm version each case exercises. --- .../optional-parent/package.json | 0 .../package.json | 2 +- .../snapshots.toml | 0 .../snapshots/command_add_npm10.md | 10 ++++----- .../snapshots/npm10_dependency_filters_add.md | 0 .../snapshots/npm6_dependency_filters_add.md | 0 .../dev-dep/package.json | 0 .../package.json | 2 +- .../prod-dep/package.json | 0 .../snapshots.toml | 0 .../npm6_dependency_filters_install.md | 0 .../snapshots/npm_install_includes_dev.md | 6 ++--- .../package.json | 2 +- .../snapshots.toml | 0 .../snapshots/command_list_npm10.md | 22 +++++++++---------- .../snapshots/npm6_dependency_filters_list.md | 4 ++-- .../npm_list_dependency_selection.md | 8 +++---- .../package.json | 2 +- .../snapshots.toml | 0 .../snapshots/command_prune_npm10.md | 0 .../npm6_dependency_filters_prune.md | 0 .../package.json | 2 +- .../snapshots.toml | 0 .../snapshots/command_update_npm10.md | 12 +++++----- .../npm6_dependency_filters_update.md | 0 25 files changed, 36 insertions(+), 36 deletions(-) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_add_npm10 => command_add_npm}/optional-parent/package.json (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_add_npm10 => command_add_npm}/package.json (65%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_add_npm10 => command_add_npm}/snapshots.toml (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_add_npm10 => command_add_npm}/snapshots/command_add_npm10.md (96%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_add_npm10 => command_add_npm}/snapshots/npm10_dependency_filters_add.md (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_add_npm10 => command_add_npm}/snapshots/npm6_dependency_filters_add.md (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_install_npm11 => command_install_npm}/dev-dep/package.json (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_install_npm11 => command_install_npm}/package.json (69%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_install_npm11 => command_install_npm}/prod-dep/package.json (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_install_npm11 => command_install_npm}/snapshots.toml (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_install_npm11 => command_install_npm}/snapshots/npm6_dependency_filters_install.md (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_install_npm11 => command_install_npm}/snapshots/npm_install_includes_dev.md (95%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_list_npm10 => command_list_npm}/package.json (88%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_list_npm10 => command_list_npm}/snapshots.toml (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_list_npm10 => command_list_npm}/snapshots/command_list_npm10.md (95%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_list_npm10 => command_list_npm}/snapshots/npm6_dependency_filters_list.md (95%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_list_npm10 => command_list_npm}/snapshots/npm_list_dependency_selection.md (95%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_prune_npm10 => command_prune_npm}/package.json (88%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_prune_npm10 => command_prune_npm}/snapshots.toml (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_prune_npm10 => command_prune_npm}/snapshots/command_prune_npm10.md (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_prune_npm10 => command_prune_npm}/snapshots/npm6_dependency_filters_prune.md (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_update_npm10 => command_update_npm}/package.json (87%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_update_npm10 => command_update_npm}/snapshots.toml (100%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_update_npm10 => command_update_npm}/snapshots/command_update_npm10.md (93%) rename crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/{command_update_npm10 => command_update_npm}/snapshots/npm6_dependency_filters_update.md (100%) diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/optional-parent/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/optional-parent/package.json similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/optional-parent/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/optional-parent/package.json diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/package.json similarity index 65% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/package.json index 685d3aeb89..99355d8a91 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/package.json +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/package.json @@ -1,5 +1,5 @@ { - "name": "command-add-npm10", + "name": "command-add-npm", "version": "1.0.0", "packageManager": "npm@10.9.4" } diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots.toml similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots.toml rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots.toml diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/command_add_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/command_add_npm10.md similarity index 96% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/command_add_npm10.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/command_add_npm10.md index 16cd196922..ba8b71ed32 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/command_add_npm10.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/command_add_npm10.md @@ -59,7 +59,7 @@ added 1 package in ``` { - "name": "command-add-npm10", + "name": "command-add-npm", "version": "1.0.0", "packageManager": "npm@10.9.4", "devDependencies": { @@ -82,7 +82,7 @@ npm does not support --allow-build. ``` { - "name": "command-add-npm10", + "name": "command-add-npm", "version": "1.0.0", "packageManager": "npm@10.9.4", "devDependencies": { @@ -105,7 +105,7 @@ added 1 package in ``` { - "name": "command-add-npm10", + "name": "command-add-npm", "version": "1.0.0", "packageManager": "npm@10.9.4", "devDependencies": { @@ -130,7 +130,7 @@ added 1 package in ``` { - "name": "command-add-npm10", + "name": "command-add-npm", "version": "1.0.0", "packageManager": "npm@10.9.4", "devDependencies": { @@ -158,7 +158,7 @@ up to date in ``` { - "name": "command-add-npm10", + "name": "command-add-npm", "version": "1.0.0", "packageManager": "npm@10.9.4", "devDependencies": { diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm10_dependency_filters_add.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/npm10_dependency_filters_add.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm10_dependency_filters_add.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/npm10_dependency_filters_add.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm6_dependency_filters_add.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/npm6_dependency_filters_add.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm10/snapshots/npm6_dependency_filters_add.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_add_npm/snapshots/npm6_dependency_filters_add.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/dev-dep/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/dev-dep/package.json similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/dev-dep/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/dev-dep/package.json diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/package.json similarity index 69% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/package.json index e599c17259..cab3cd626b 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/package.json +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/package.json @@ -1,5 +1,5 @@ { - "name": "command-install-npm11", + "name": "command-install-npm", "version": "1.0.0", "private": true, "packageManager": "npm@11.16.0" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/prod-dep/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/prod-dep/package.json similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/prod-dep/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/prod-dep/package.json diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots.toml similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots.toml rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots.toml diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm6_dependency_filters_install.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots/npm6_dependency_filters_install.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm6_dependency_filters_install.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots/npm6_dependency_filters_install.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm_install_includes_dev.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots/npm_install_includes_dev.md similarity index 95% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm_install_includes_dev.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots/npm_install_includes_dev.md index 1cacf6e210..142e5db877 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm11/snapshots/npm_install_includes_dev.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_install_npm/snapshots/npm_install_includes_dev.md @@ -60,19 +60,19 @@ node_modules/dev-only-fixture/package.json: file "devDependencies": { "dev-only-fixture": "file:./dev-dep" }, - "name": "command-install-npm11", + "name": "command-install-npm", "packageManager": "npm@11.16.0", "private": true, "version": "1.0.0" } { - "name": "command-install-npm11", + "name": "command-install-npm", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "command-install-npm11", + "name": "command-install-npm", "version": "1.0.0", "dependencies": { "prod-only-fixture": "file:./prod-dep" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/package.json similarity index 88% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/package.json index cd01ac35e1..ae0620d954 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/package.json +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/package.json @@ -1,5 +1,5 @@ { - "name": "command-list-npm10", + "name": "command-list-npm", "version": "1.0.0", "dependencies": { "testnpm2": "1.0.1" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots.toml similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots.toml rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots.toml diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/command_list_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/command_list_npm10.md similarity index 95% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/command_list_npm10.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/command_list_npm10.md index 1d3780aa33..cddc51c2bb 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/command_list_npm10.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/command_list_npm10.md @@ -19,7 +19,7 @@ should list installed packages ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -47,7 +47,7 @@ should list specific package ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "testnpm2": { "version": "1.0.1", @@ -65,7 +65,7 @@ should list packages with depth limit ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -93,7 +93,7 @@ should list packages with extended info ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "devDependencies": { "test-vite-plus-package": "1.0.0" }, @@ -101,7 +101,7 @@ should list packages with extended info "test-vite-plus-package-optional": "1.0.0" }, "packageManager": "npm@10.8.0", - "_id": "command-list-npm10@1.0.0", + "_id": "command-list-npm@1.0.0", "extraneous": false, "path": "", "_dependencies": { @@ -163,7 +163,7 @@ should list packages in parseable format ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -191,7 +191,7 @@ should exclude dev dependencies using --omit dev ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -214,7 +214,7 @@ include installed dev dependencies in a production environment ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -242,7 +242,7 @@ should exclude optional dependencies (uses --omit optional) ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -270,7 +270,7 @@ should exclude peer dependencies (uses --omit peer) ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package": { "version": "1.0.0", @@ -293,7 +293,7 @@ should support pass through arguments ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/npm6_dependency_filters_list.md similarity index 95% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/npm6_dependency_filters_list.md index af73ce37e4..ab2188aaa8 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm6_dependency_filters_list.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/npm6_dependency_filters_list.md @@ -15,7 +15,7 @@ npm 6 lists both production and development dependencies ``` { - "name": "command-list-npm10", + "name": "command-list-npm", "version": "1.0.0", "dependencies": { "test-vite-plus-package": { @@ -38,7 +38,7 @@ npm 6 uses --production to list only production dependencies ``` { - "name": "command-list-npm10", + "name": "command-list-npm", "version": "1.0.0", "dependencies": { "testnpm2": { diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm_list_dependency_selection.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/npm_list_dependency_selection.md similarity index 95% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm_list_dependency_selection.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/npm_list_dependency_selection.md index cf8dae202d..4150146ec4 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm10/snapshots/npm_list_dependency_selection.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_list_npm/snapshots/npm_list_dependency_selection.md @@ -13,7 +13,7 @@ production listing excludes dev but keeps optional and peer dependencies ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -41,7 +41,7 @@ production listing respects both exclusions ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "testnpm2": { "version": "1.0.1", @@ -59,7 +59,7 @@ include installed dev dependencies without excluding other dependency types ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", @@ -92,7 +92,7 @@ raw native include remains available and lists all four dependency types ``` { "version": "1.0.0", - "name": "command-list-npm10", + "name": "command-list-npm", "dependencies": { "test-vite-plus-package-optional": { "version": "1.0.0", diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/package.json similarity index 88% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/package.json index b50e1b1609..74cbb4bdbb 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/package.json +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/package.json @@ -1,5 +1,5 @@ { - "name": "command-prune-npm10", + "name": "command-prune-npm", "version": "1.0.0", "dependencies": { "testnpm2": "1.0.1" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/snapshots.toml similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots.toml rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/snapshots.toml diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/command_prune_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/snapshots/command_prune_npm10.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/command_prune_npm10.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/snapshots/command_prune_npm10.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/npm6_dependency_filters_prune.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/snapshots/npm6_dependency_filters_prune.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm10/snapshots/npm6_dependency_filters_prune.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_prune_npm/snapshots/npm6_dependency_filters_prune.md diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/package.json b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/package.json similarity index 87% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/package.json rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/package.json index 578d276f26..ba2e43fd17 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/package.json +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/package.json @@ -1,5 +1,5 @@ { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "dependencies": { "testnpm2": "*" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots.toml similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots.toml rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots.toml diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md similarity index 93% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md index 4ec7397a0e..8e4e42a38a 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/command_update_npm10.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md @@ -13,7 +13,7 @@ added 3 packages in ``` { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "dependencies": { "testnpm2": "*" @@ -42,7 +42,7 @@ npm does not support --latest. ``` { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "dependencies": { "testnpm2": "*" @@ -70,7 +70,7 @@ up to date in ``` { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "dependencies": { "testnpm2": "*" @@ -98,7 +98,7 @@ up to date in ``` { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "dependencies": { "testnpm2": "*" @@ -144,7 +144,7 @@ changed 1 package in ``` { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "devDependencies": { "test-vite-plus-package": "*" @@ -170,7 +170,7 @@ added 2 packages in ``` { - "name": "command-update-npm10", + "name": "command-update-npm", "version": "1.0.0", "devDependencies": { "test-vite-plus-package": "*" diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/npm6_dependency_filters_update.md similarity index 100% rename from crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm10/snapshots/npm6_dependency_filters_update.md rename to crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/npm6_dependency_filters_update.md From a41700deccc4c3e26cd41f3a0b78d0855145bb6b Mon Sep 17 00:00:00 2001 From: JongKyung Lee Date: Tue, 27 Oct 2026 23:38:50 +0900 Subject: [PATCH 7/7] fix(pm): keep configured omissions for npm update --no-optional A command-line --omit=optional replaces the configured omit list, so NODE_ENV=production or an .npmrc omit=dev stopped excluding development dependencies. Keep --no-optional, which npm adds to the configured list. --- .../command_outdated_npm/snapshots.toml | 2 +- .../npm6_dependency_filters_outdated.md | 2 +- .../snapshots/command_update_npm10.md | 4 ++++ .../src/resolution/commands/update.rs | 21 ++++++------------- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots.toml b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots.toml index 91500cb6f8..4feffa62d7 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots.toml +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots.toml @@ -26,6 +26,6 @@ env = { npm_config_audit = "false", npm_config_fund = "false" } steps = [ { argv = ["vpt", "json-edit", "package.json", "packageManager", "npm@6.14.18"], snapshot = false }, { argv = ["vp", "install", "--ignore-scripts", "--silent"], snapshot = false }, - { argv = ["vp", "outdated", "-D"], envs = [["NODE_ENV", "production"]], comment = "npm 6 uses --also=dev to include development dependencies", continue-on-failure = true }, + { argv = ["vp", "outdated", "-D"], envs = [["NODE_ENV", "production"]], comment = "npm 6 reports installed development dependencies", continue-on-failure = true }, { argv = ["vp", "outdated", "-r", "-P", "--no-optional"], comment = "reject options without equivalent npm 6 options because npm 6 --production still reports installed devDependencies" }, ] diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md index 9da3266bf3..05782cf6e2 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_outdated_npm/snapshots/npm6_dependency_filters_outdated.md @@ -8,7 +8,7 @@ ## `NODE_ENV=production vp outdated -D` -npm 6 uses --also=dev to include development dependencies +npm 6 reports installed development dependencies **Exit code:** 1 diff --git a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md index 8e4e42a38a..a86b47b78f 100644 --- a/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md +++ b/crates/vp_cli_snapshots/tests/cli_snapshots/fixtures/command_update_npm/snapshots/command_update_npm10.md @@ -136,6 +136,10 @@ added 1 package in preserve npm's native optional dependency exclusion ``` +npm warn config optional Use `--omit=optional` to exclude optional dependencies, or +npm warn config `--include=optional` to include them. +npm warn config +npm warn config Default value does install optional deps unless otherwise omitted. changed 1 package in ``` diff --git a/crates/vp_pm_cli/src/resolution/commands/update.rs b/crates/vp_pm_cli/src/resolution/commands/update.rs index 01594b771c..a0732a588b 100644 --- a/crates/vp_pm_cli/src/resolution/commands/update.rs +++ b/crates/vp_pm_cli/src/resolution/commands/update.rs @@ -105,10 +105,7 @@ impl Resolve for Npm { args.dev, ) .arg_if("--include=prod", args.prod) - .arg_if( - if self.supports_v7_commands() { "--omit=optional" } else { "--no-optional" }, - args.no_optional, - ) + .arg_if("--no-optional", args.no_optional) .arg_if("--no-save", args.no_save) .extend(args.pass_through_args.iter()) .extend(args.packages.iter()); @@ -625,15 +622,11 @@ mod tests { ); } - for (dialect, flag) in [ - (npm("6.14.18"), "--no-optional"), - (npm("7.0.0"), "--omit=optional"), - (Npm::unknown_version(), "--omit=optional"), - ] { + for dialect in [npm("6.14.18"), npm("7.0.0"), Npm::unknown_version()] { let args = parse_args::(["--no-optional", "react"]).unwrap(); let resolution = resolve(&dialect, args); assert!(resolution.diagnostics.is_empty()); - assert_eq!(expect_run(resolution.outcome).args, ["update", flag, "react"]); + assert_eq!(expect_run(resolution.outcome).args, ["update", "--no-optional", "react"]); } let args = parse_args::(["-P", "react"]).unwrap(); @@ -648,11 +641,9 @@ mod tests { #[test] fn test_npm_update_preserves_native_selectors() { - for (flag, native_flag) in [ - ("-D", "--include=dev"), - ("-P", "--include=prod"), - ("--no-optional", "--omit=optional"), - ] { + for (flag, native_flag) in + [("-D", "--include=dev"), ("-P", "--include=prod"), ("--no-optional", "--no-optional")] + { let args = parse_args::([flag, "react"]).unwrap(); let resolution = resolve(&npm("11.16.0"), args); assert!(resolution.diagnostics.is_empty());