1- import type { CommonOptions , PackageMeta , RawDep } from '../types'
1+ import type { CommonOptions , DepType , PackageMeta , RawDep } from '../types'
22import { resolve } from 'pathe'
33import { builtinAddons } from '../addons'
44import { dumpDependencies , getByPath , parseDependencies , parseDependency , setByPath } from './dependencies'
55import { readJSON , writeJSON } from './packages'
66
7- const depsFields = [
7+ const allDepsFields = [
88 'dependencies' ,
99 'devDependencies' ,
10+ 'peerDependencies' ,
1011 'optionalDependencies' ,
1112 'packageManager' ,
1213 'pnpm.overrides' ,
1314 'resolutions' ,
1415 'overrides' ,
15- ] as const
16+ ] as const satisfies DepType [ ]
17+
18+ function isDepFieldEnabled ( key : DepType , options : CommonOptions ) : boolean {
19+ if ( options . depFields ?. [ key ] === false )
20+ return false
21+ if ( key === 'peerDependencies' )
22+ return ! ! options . peer
23+ return true
24+ }
1625
1726export async function loadPackageJSON (
1827 relative : string ,
@@ -23,19 +32,20 @@ export async function loadPackageJSON(
2332 const raw = await readJSON ( filepath )
2433 const deps : RawDep [ ] = [ ]
2534
26- for ( const key of depsFields ) {
27- if ( options . depFields ?. [ key ] !== false ) {
28- if ( key === 'packageManager' ) {
29- if ( raw . packageManager ) {
30- const [ name , version ] = raw . packageManager . split ( '@' )
31- // `+` sign can be used to pin the hash of the package manager, we remove it to be semver compatible.
32- deps . push ( parseDependency ( name , `^${ version . split ( '+' ) [ 0 ] } ` , 'packageManager' , shouldUpdate ) )
33- }
34- }
35- else {
36- deps . push ( ...parseDependencies ( raw , key , shouldUpdate ) )
35+ for ( const key of allDepsFields ) {
36+ if ( ! isDepFieldEnabled ( key , options ) )
37+ continue
38+
39+ if ( key === 'packageManager' ) {
40+ if ( raw . packageManager ) {
41+ const [ name , version ] = raw . packageManager . split ( '@' )
42+ // `+` sign can be used to pin the hash of the package manager, we remove it to be semver compatible.
43+ deps . push ( parseDependency ( name , `^${ version . split ( '+' ) [ 0 ] } ` , 'packageManager' , shouldUpdate ) )
3744 }
3845 }
46+ else {
47+ deps . push ( ...parseDependencies ( raw , key , shouldUpdate ) )
48+ }
3949 }
4050
4151 return [
@@ -59,9 +69,10 @@ export async function writePackageJSON(
5969) {
6070 let changed = false
6171
62- depsFields . forEach ( ( key ) => {
63- if ( options . depFields ?. [ key ] === false )
64- return
72+ for ( const key of allDepsFields ) {
73+ if ( ! isDepFieldEnabled ( key , options ) )
74+ continue
75+
6576 if ( key === 'packageManager' ) {
6677 const value = Object . entries ( dumpDependencies ( pkg . resolved , 'packageManager' ) ) [ 0 ]
6778 if ( value ) {
@@ -75,7 +86,7 @@ export async function writePackageJSON(
7586 changed = true
7687 }
7788 }
78- } )
89+ }
7990
8091 if ( changed ) {
8192 for ( const addon of ( options . addons || builtinAddons ) ) {
0 commit comments