diff --git a/.changeset/popular-bugs-draw.md b/.changeset/popular-bugs-draw.md new file mode 100644 index 0000000000..4121082794 --- /dev/null +++ b/.changeset/popular-bugs-draw.md @@ -0,0 +1,5 @@ +--- +"supi": patch +--- + +When updating specs in the lockfile, read the specs from the manifest in the right order: optionalDependencies > dependencies > devDependencies. diff --git a/packages/supi/src/getSpecFromPackageManifest.ts b/packages/supi/src/getSpecFromPackageManifest.ts index ec14a6dced..cbf96811f8 100644 --- a/packages/supi/src/getSpecFromPackageManifest.ts +++ b/packages/supi/src/getSpecFromPackageManifest.ts @@ -4,8 +4,8 @@ export default ( manifest: Pick, depName: string ) => { - return manifest.dependencies?.[depName] ?? + return manifest.optionalDependencies?.[depName] ?? + manifest.dependencies?.[depName] ?? manifest.devDependencies?.[depName] ?? - manifest.optionalDependencies?.[depName] ?? '' } diff --git a/packages/supi/src/install/getWantedDependencies.ts b/packages/supi/src/install/getWantedDependencies.ts index 264f3070e5..ff3cabac18 100644 --- a/packages/supi/src/install/getWantedDependencies.ts +++ b/packages/supi/src/install/getWantedDependencies.ts @@ -31,6 +31,7 @@ export default function getWantedDependencies ( optionalDependencies: true, }) return getWantedDependenciesFromGivenSet(depsToInstall, { + dependencies: pkg.dependencies ?? {}, devDependencies: pkg.devDependencies ?? {}, optionalDependencies: pkg.optionalDependencies ?? {}, updatePref: opts?.updateWorkspaceDependencies === true @@ -46,6 +47,7 @@ function updateWorkspacePref (pref: string) { function getWantedDependenciesFromGivenSet ( deps: Dependencies, opts: { + dependencies: Dependencies devDependencies: Dependencies optionalDependencies: Dependencies updatePref: (pref: string) => string @@ -54,10 +56,14 @@ function getWantedDependenciesFromGivenSet ( if (!deps) return [] return Object.keys(deps).map((alias) => { const pref = opts.updatePref(deps[alias]) + let depType + if (opts.optionalDependencies[alias] != null) depType = 'optional' + else if (opts.dependencies[alias] != null) depType = 'prod' + else if (opts.devDependencies[alias] != null) depType = 'dev' return { alias, - dev: !!opts.devDependencies[alias], - optional: !!opts.optionalDependencies[alias], + dev: depType === 'dev', + optional: depType === 'optional', pinnedVersion: guessPinnedVersionFromExistingSpec(deps[alias]), pref, raw: `${alias}@${pref}`, diff --git a/packages/supi/test/index.ts b/packages/supi/test/index.ts index 3e55778413..2e1f7f5dde 100644 --- a/packages/supi/test/index.ts +++ b/packages/supi/test/index.ts @@ -8,6 +8,7 @@ import './link' import './lockfile' import './offline' import './packageImportMethods' +import './parseWantedDependencies.test' import './prune' import './uninstall' import './unlink' diff --git a/packages/supi/test/parseWantedDependencies.test.ts b/packages/supi/test/parseWantedDependencies.test.ts new file mode 100644 index 0000000000..6ff54fe088 --- /dev/null +++ b/packages/supi/test/parseWantedDependencies.test.ts @@ -0,0 +1,45 @@ +import getSpecFromPackageManifest from 'supi/lib/getSpecFromPackageManifest' +import promisifyTape from 'tape-promise' +import tape = require('tape') + +const test = promisifyTape(tape) + +test('getSpecFromPackageManifest()', (t) => { + t.equal( + getSpecFromPackageManifest({ + dependencies: { + foo: '3.0.0', + }, + devDependencies: { + foo: '2.0.0', + }, + optionalDependencies: { + foo: '1.0.0', + }, + }, 'foo'), + '1.0.0', + 'optionalDependencies is first priority' + ) + t.equal( + getSpecFromPackageManifest({ + dependencies: { + foo: '3.0.0', + }, + devDependencies: { + foo: '2.0.0', + }, + }, 'foo'), + '3.0.0', + 'dependencies is second priority' + ) + t.equal( + getSpecFromPackageManifest({ + devDependencies: { + foo: '2.0.0', + }, + }, 'foo'), + '2.0.0', + 'devDependencies is third priority' + ) + t.end() +})