@@ -126,61 +126,40 @@ async function writePackageJson(packagePath, packageJson) {
126
126
await fs . writeFile ( path . join ( packagePath , 'package.json' ) , content ) ;
127
127
}
128
128
129
- /**
130
- * Update dependencies to point to canary versions
131
- */
132
- function updateDependenciesToCanary ( dependencies , canaryVersions ) {
133
- if ( ! dependencies ) {
134
- return dependencies ;
135
- }
136
-
137
- const updated = { ...dependencies } ;
138
-
139
- for ( const [ depName , depVersion ] of Object . entries ( dependencies ) ) {
140
- if ( canaryVersions . has ( depName ) ) {
141
- updated [ depName ] = canaryVersions . get ( depName ) ;
142
- } else if ( depVersion === 'workspace:*' ) {
143
- if ( ! canaryVersions . has ( depName ) ) {
144
- throw new Error (
145
- `Cannot resolve workspace dependency "${ depName } " - no canary version available` ,
146
- ) ;
147
- }
148
- updated [ depName ] = canaryVersions . get ( depName ) ;
149
- }
150
- }
151
-
152
- return updated ;
153
- }
154
129
155
- /**
156
- * Publish a package
157
- */
158
- async function publishPackage ( packagePath , tag , options = { } ) {
159
- const { provenance = false , dryRun = false } = options ;
160
- const provenanceArgs = provenance ? [ '--provenance' ] : [ ] ;
161
-
162
- await runCmd ( { cwd : packagePath , dryRun } ) `pnpm publish --tag ${ tag } ${ provenanceArgs } ` ;
163
- }
164
130
165
131
/**
166
132
* Publish regular versions that don't exist on npm
167
133
*/
168
134
async function publishRegularVersions ( packages , packageVersionInfo , options = { } ) {
169
135
console . log ( '\n📦 Checking for unpublished regular versions...' ) ;
170
136
171
- // run sequentially to avoid any rate limiting issues
172
- for ( const pkg of packages ) {
137
+ const packagesToPublish = packages . filter ( pkg => {
173
138
const { currentVersionExists } = packageVersionInfo . get ( pkg . name ) ;
174
-
175
139
if ( ! currentVersionExists ) {
176
- console . log ( `📤 Publishing ${ pkg . name } @${ pkg . version } ...` ) ;
177
- // eslint-disable-next-line no-await-in-loop
178
- await publishPackage ( pkg . path , 'latest' , options ) ;
179
- console . log ( `✅ Published ${ pkg . name } @${ pkg . version } ` ) ;
140
+ console . log ( `📤 Will publish ${ pkg . name } @${ pkg . version } ` ) ;
141
+ return true ;
180
142
} else {
181
143
console . log ( `⏭️ ${ pkg . name } @${ pkg . version } already exists, skipping` ) ;
144
+ return false ;
182
145
}
146
+ } ) ;
147
+
148
+ if ( packagesToPublish . length === 0 ) {
149
+ console . log ( 'No packages need to be published' ) ;
150
+ return ;
183
151
}
152
+
153
+ // Use pnpm recursive publish with filters for specific packages
154
+ const filterArgs = packagesToPublish . map ( pkg => `--filter=${ pkg . name } ` ) ;
155
+ const provenanceArgs = options . provenance ? [ '--provenance' ] : [ ] ;
156
+
157
+ console . log ( `Publishing ${ packagesToPublish . length } packages...` ) ;
158
+ await runCmd ( options ) `pnpm -r publish --tag=latest ${ filterArgs } ${ provenanceArgs } ` ;
159
+
160
+ packagesToPublish . forEach ( pkg => {
161
+ console . log ( `✅ Published ${ pkg . name } @${ pkg . version } ` ) ;
162
+ } ) ;
184
163
}
185
164
186
165
/**
@@ -219,28 +198,6 @@ async function publishCanaryVersions(packages, packageVersionInfo, options = {})
219
198
gitSha,
220
199
} ;
221
200
222
- // Update dependencies to point to canary versions
223
- if ( updatedPackageJson . dependencies ) {
224
- updatedPackageJson . dependencies = updateDependenciesToCanary (
225
- originalPackageJson . dependencies ,
226
- canaryVersions ,
227
- ) ;
228
- }
229
-
230
- if ( updatedPackageJson . devDependencies ) {
231
- updatedPackageJson . devDependencies = updateDependenciesToCanary (
232
- originalPackageJson . devDependencies ,
233
- canaryVersions ,
234
- ) ;
235
- }
236
-
237
- if ( updatedPackageJson . peerDependencies ) {
238
- updatedPackageJson . peerDependencies = updateDependenciesToCanary (
239
- originalPackageJson . peerDependencies ,
240
- canaryVersions ,
241
- ) ;
242
- }
243
-
244
201
await writePackageJson ( pkg . path , updatedPackageJson ) ;
245
202
246
203
console . log ( `📝 Updated ${ pkg . name } package.json for canary release` ) ;
@@ -254,16 +211,20 @@ async function publishCanaryVersions(packages, packageVersionInfo, options = {})
254
211
originalPackageJsons . set ( pkg . name , originalPackageJson ) ;
255
212
}
256
213
257
- // Third pass: publish all canary versions sequentially to avoid rate limits
214
+ // Third pass: publish all canary versions using recursive publish
258
215
let publishSuccess = false ;
259
216
try {
260
- for ( const pkg of packages ) {
217
+ const filterArgs = packages . map ( pkg => `--filter=${ pkg . name } ` ) ;
218
+ const provenanceArgs = options . provenance ? [ '--provenance' ] : [ ] ;
219
+ const gitChecksArgs = [ '--no-git-checks' ] ;
220
+
221
+ console . log ( '📤 Publishing all canary versions...' ) ;
222
+ await runCmd ( options ) `pnpm -r publish --tag=canary ${ filterArgs } ${ provenanceArgs } ${ gitChecksArgs } ` ;
223
+
224
+ packages . forEach ( pkg => {
261
225
const canaryVersion = canaryVersions . get ( pkg . name ) ;
262
- console . log ( `📤 Publishing ${ pkg . name } @${ canaryVersion } with canary tag...` ) ;
263
- // eslint-disable-next-line no-await-in-loop
264
- await publishPackage ( pkg . path , 'canary' , options ) ;
265
226
console . log ( `✅ Published ${ pkg . name } @${ canaryVersion } ` ) ;
266
- }
227
+ } ) ;
267
228
publishSuccess = true ;
268
229
} finally {
269
230
// Always restore original package.json files in parallel
0 commit comments