@@ -29,13 +29,18 @@ export async function createExportableManifest (
29
29
if ( originalManifest . scripts != null ) {
30
30
publishManifest . scripts = omit ( PREPUBLISH_SCRIPTS , originalManifest . scripts )
31
31
}
32
- await Promise . all ( ( [ 'dependencies' , 'devDependencies' , 'optionalDependencies' , 'peerDependencies' ] as const ) . map ( async ( depsField ) => {
33
- const deps = await makePublishDependencies ( dir , originalManifest [ depsField ] , opts ?. modulesDir )
32
+ await Promise . all ( ( [ 'dependencies' , 'devDependencies' , 'optionalDependencies' ] as const ) . map ( async ( depsField ) => {
33
+ const deps = await makePublishDependencies ( dir , originalManifest [ depsField ] , { modulesDir : opts ?. modulesDir } )
34
34
if ( deps != null ) {
35
35
publishManifest [ depsField ] = deps
36
36
}
37
37
} ) )
38
38
39
+ const peerDependencies = originalManifest . peerDependencies
40
+ if ( peerDependencies ) {
41
+ publishManifest . peerDependencies = await makePublishDependencies ( dir , peerDependencies , { modulesDir : opts ?. modulesDir , convertDependencyForPublish : makePublishPeerDependency } )
42
+ }
43
+
39
44
overridePublishConfig ( publishManifest )
40
45
41
46
if ( opts ?. readmeFile ) {
@@ -48,16 +53,32 @@ export async function createExportableManifest (
48
53
async function makePublishDependencies (
49
54
dir : string ,
50
55
dependencies : Dependencies | undefined ,
51
- modulesDir ?: string
56
+ { modulesDir, convertDependencyForPublish = makePublishDependency } : {
57
+ modulesDir ?: string
58
+ convertDependencyForPublish ?: ( depName : string , depSpec : string , dir : string , modulesDir ?: string ) => Promise < string >
59
+ } = { }
52
60
) : Promise < Dependencies | undefined > {
53
61
if ( dependencies == null ) return dependencies
54
62
const publishDependencies = await pMapValues (
55
- ( depSpec , depName ) => makePublishDependency ( depName , depSpec , dir , modulesDir ) ,
63
+ ( depSpec , depName ) => convertDependencyForPublish ( depName , depSpec , dir , modulesDir ) ,
56
64
dependencies
57
65
)
58
66
return publishDependencies
59
67
}
60
68
69
+ async function resolveManifest ( depName : string , modulesDir : string ) : Promise < ProjectManifest > {
70
+ const { manifest } = await tryReadProjectManifest ( path . join ( modulesDir , depName ) )
71
+ if ( ! manifest ?. name || ! manifest ?. version ) {
72
+ throw new PnpmError (
73
+ 'CANNOT_RESOLVE_WORKSPACE_PROTOCOL' ,
74
+ `Cannot resolve workspace protocol of dependency "${ depName } " ` +
75
+ 'because this dependency is not installed. Try running "pnpm install".'
76
+ )
77
+ }
78
+
79
+ return manifest
80
+ }
81
+
61
82
async function makePublishDependency ( depName : string , depSpec : string , dir : string , modulesDir ?: string ) : Promise < string > {
62
83
if ( ! depSpec . startsWith ( 'workspace:' ) ) {
63
84
return depSpec
@@ -67,14 +88,7 @@ async function makePublishDependency (depName: string, depSpec: string, dir: str
67
88
const versionAliasSpecParts = / ^ w o r k s p a c e : ( .* ?) @ ? ( [ \^ ~ * ] ) $ / . exec ( depSpec )
68
89
if ( versionAliasSpecParts != null ) {
69
90
modulesDir = modulesDir ?? path . join ( dir , 'node_modules' )
70
- const { manifest } = await tryReadProjectManifest ( path . join ( modulesDir , depName ) )
71
- if ( ! manifest ?. version ) {
72
- throw new PnpmError (
73
- 'CANNOT_RESOLVE_WORKSPACE_PROTOCOL' ,
74
- `Cannot resolve workspace protocol of dependency "${ depName } " ` +
75
- 'because this dependency is not installed. Try running "pnpm install".'
76
- )
77
- }
91
+ const manifest = await resolveManifest ( depName , modulesDir )
78
92
79
93
const semverRangeToken = versionAliasSpecParts [ 2 ] !== '*' ? versionAliasSpecParts [ 2 ] : ''
80
94
if ( depName !== manifest . name ) {
@@ -83,14 +97,8 @@ async function makePublishDependency (depName: string, depSpec: string, dir: str
83
97
return `${ semverRangeToken } ${ manifest . version } `
84
98
}
85
99
if ( depSpec . startsWith ( 'workspace:./' ) || depSpec . startsWith ( 'workspace:../' ) ) {
86
- const { manifest } = await tryReadProjectManifest ( path . join ( dir , depSpec . slice ( 10 ) ) )
87
- if ( ! manifest ?. name || ! manifest ?. version ) {
88
- throw new PnpmError (
89
- 'CANNOT_RESOLVE_WORKSPACE_PROTOCOL' ,
90
- `Cannot resolve workspace protocol of dependency "${ depName } " ` +
91
- 'because this dependency is not installed. Try running "pnpm install".'
92
- )
93
- }
100
+ const manifest = await resolveManifest ( depName , path . join ( dir , depSpec . slice ( 10 ) ) )
101
+
94
102
if ( manifest . name === depName ) return `${ manifest . version } `
95
103
return `npm:${ manifest . name } @${ manifest . version } `
96
104
}
@@ -100,3 +108,28 @@ async function makePublishDependency (depName: string, depSpec: string, dir: str
100
108
}
101
109
return depSpec
102
110
}
111
+
112
+ async function makePublishPeerDependency ( depName : string , depSpec : string , dir : string , modulesDir ?: string ) {
113
+ if ( ! depSpec . includes ( 'workspace:' ) ) {
114
+ return depSpec
115
+ }
116
+
117
+ // Dependencies with bare "*", "^", "~",">=",">","<=",< versions
118
+ const workspaceSemverRegex = / w o r k s p a c e : ( [ \^ ~ * ] | > = | > | < = | < ) /
119
+ const versionAliasSpecParts = workspaceSemverRegex . exec ( depSpec )
120
+
121
+ if ( versionAliasSpecParts != null ) {
122
+ modulesDir = modulesDir ?? path . join ( dir , 'node_modules' )
123
+ const manifest = await resolveManifest ( depName , modulesDir )
124
+
125
+ const [ , semverRangGroup ] = versionAliasSpecParts
126
+
127
+ const semverRangeToken = semverRangGroup !== '*' ? semverRangGroup : ''
128
+
129
+ return depSpec . replace ( workspaceSemverRegex , `${ semverRangeToken } ${ manifest . version } ` )
130
+ }
131
+
132
+ depSpec = depSpec . replace ( 'workspace:' , '' )
133
+
134
+ return depSpec
135
+ }
0 commit comments