@@ -248,26 +248,47 @@ export class PrecompiledBinaryDownloader {
248
248
private async downloadManifest ( ) : Promise < BinaryManifest > {
249
249
console . log ( '📋 Downloading precompiled binary manifest...' )
250
250
251
- const manifestUrl = `${ this . GITHUB_API } /repos/${ this . GITHUB_REPO } /releases/latest`
251
+ // First, get all releases to find the latest binaries release
252
+ const releasesUrl = `${ this . GITHUB_API } /repos/${ this . GITHUB_REPO } /releases`
252
253
253
254
try {
254
- const response = await fetch ( manifestUrl , {
255
+ const releasesResponse = await fetch ( releasesUrl , {
255
256
headers : {
256
257
'User-Agent' : 'Launchpad Binary Downloader' ,
257
258
'Accept' : 'application/vnd.github.v3+json' ,
258
259
} ,
259
260
} )
260
261
261
- if ( ! response . ok ) {
262
- throw new Error ( `GitHub API error: ${ response . status } ${ response . statusText } ` )
262
+ if ( ! releasesResponse . ok ) {
263
+ if ( releasesResponse . status === 403 ) {
264
+ throw new Error ( 'GitHub API rate limit exceeded. Please try again later.' )
265
+ }
266
+ throw new Error ( `GitHub API error: ${ releasesResponse . status } ${ releasesResponse . statusText } ` )
263
267
}
264
268
265
- const release = await response . json ( ) as GitHubRelease
269
+ const releases = await releasesResponse . json ( ) as GitHubRelease [ ]
270
+
271
+ // Find the latest release with binaries- prefix
272
+ const binariesReleases = releases . filter ( release =>
273
+ release . tag_name . startsWith ( 'binaries-' ) ,
274
+ ) . sort ( ( a , b ) => {
275
+ // Sort by release number (binaries-1234)
276
+ const aNum = Number . parseInt ( a . tag_name . replace ( 'binaries-' , '' ) , 10 )
277
+ const bNum = Number . parseInt ( b . tag_name . replace ( 'binaries-' , '' ) , 10 )
278
+ return bNum - aNum // Latest first
279
+ } )
280
+
281
+ if ( binariesReleases . length === 0 ) {
282
+ throw new Error ( 'No binaries releases found. The precompile workflow may not have run yet.' )
283
+ }
284
+
285
+ const binariesRelease = binariesReleases [ 0 ]
286
+ console . log ( `📦 Found binaries release: ${ binariesRelease . tag_name } ` )
266
287
267
288
// Find manifest.json in release assets
268
- const manifestAsset = release . assets ?. find ( asset => asset . name === 'manifest.json' )
289
+ const manifestAsset = binariesRelease . assets ?. find ( asset => asset . name === 'manifest.json' )
269
290
if ( ! manifestAsset ) {
270
- throw new Error ( 'No manifest.json found in latest release' )
291
+ throw new Error ( 'No manifest.json found in binaries release' )
271
292
}
272
293
273
294
// Download manifest content
@@ -280,12 +301,21 @@ export class PrecompiledBinaryDownloader {
280
301
281
302
// Add download URLs to binaries
282
303
manifest . binaries = manifest . binaries . map ( ( binary ) => {
283
- const asset = release . assets ?. find ( asset => asset . name === binary . filename )
304
+ const asset = binariesRelease . assets ?. find ( asset => asset . name === binary . filename )
305
+ if ( ! asset ) {
306
+ console . warn ( `⚠️ No asset found for binary: ${ binary . filename } ` )
307
+ }
284
308
return {
285
309
...binary ,
286
310
download_url : asset ?. browser_download_url || '' ,
287
311
}
288
- } )
312
+ } ) . filter ( binary => binary . download_url ) // Remove binaries without download URLs
313
+
314
+ console . log ( `📋 Manifest loaded: ${ manifest . binaries . length } binaries available` )
315
+
316
+ if ( manifest . binaries . length === 0 ) {
317
+ throw new Error ( 'No valid binaries found in manifest. The release may be incomplete.' )
318
+ }
289
319
290
320
return manifest
291
321
}
@@ -391,7 +421,7 @@ export class PrecompiledBinaryDownloader {
391
421
*/
392
422
private generateDiscordErrorMessage ( detectedConfig : string , platform : string , architecture : string ) : string {
393
423
return `
394
- 🚨 **Unsupported PHP Configuration Detected **
424
+ 🚨 **PHP Binary Not Available **
395
425
396
426
We don't have a precompiled binary for your setup yet. Please help us improve!
397
427
@@ -405,9 +435,19 @@ We don't have a precompiled binary for your setup yet. Please help us improve!
405
435
2. Share this error in the #launchpad channel
406
436
3. Tell us about your project setup so we can add support
407
437
408
- **Workaround:**
409
- - Launchpad will automatically fall back to source compilation
410
- - This will take longer but will work for your configuration
438
+ **Available Configurations:**
439
+ - laravel-mysql: Laravel with MySQL/MariaDB
440
+ - laravel-postgres: Laravel with PostgreSQL
441
+ - laravel-sqlite: Laravel with SQLite
442
+ - api-only: Minimal API applications
443
+ - enterprise: Full-featured enterprise build
444
+ - wordpress: WordPress-optimized
445
+ - full-stack: Complete PHP with all major extensions
446
+
447
+ **Next Steps:**
448
+ - Try a different PHP version if available
449
+ - Check if your platform/architecture is supported
450
+ - Request support for your specific configuration
411
451
412
452
Thanks for helping us make Launchpad better! 🙏
413
453
` . trim ( )
@@ -549,16 +589,31 @@ Thanks for helping us make Launchpad better! 🙏
549
589
if ( ! binary ) {
550
590
const platform = this . getPlatform ( )
551
591
const arch = this . getArchitecture ( )
552
- const detectedConfig = this . detectFrameworkAndDatabase ( )
592
+ const detectedConfig = await this . detectFrameworkAndDatabase ( )
593
+
594
+ // Show available binaries for debugging
595
+ const availableBinaries = manifest . binaries . filter ( b =>
596
+ b . platform === platform && b . architecture === arch ,
597
+ )
598
+
599
+ console . log ( `\n🔍 Available binaries for ${ platform } -${ arch } :` )
600
+ if ( availableBinaries . length > 0 ) {
601
+ availableBinaries . forEach ( ( b ) => {
602
+ console . log ( ` - PHP ${ b . php_version } (${ b . configuration } )` )
603
+ } )
604
+ }
605
+ else {
606
+ console . log ( ` ❌ No binaries available for ${ platform } -${ arch } ` )
607
+ }
553
608
554
609
// Generate helpful Discord error message
555
- const discordMessage = this . generateDiscordErrorMessage ( await detectedConfig , platform , arch )
610
+ const discordMessage = this . generateDiscordErrorMessage ( detectedConfig , platform , arch )
556
611
console . log ( `\n${ discordMessage } \n` )
557
612
558
613
throw new Error (
559
614
`No precompiled binary found for ${ platform } -${ arch } with ${ detectedConfig } configuration${
560
615
requestedVersion ? ` and PHP ${ requestedVersion } ` : ''
561
- } . See Discord message above for help.`,
616
+ } . See available binaries above and Discord message for help.`,
562
617
)
563
618
}
564
619
0 commit comments