@stacksjs/launchpad
Version:
Like Homebrew, but faster.
17 lines (16 loc) • 35.7 kB
JavaScript
// @bun
import{O as mQ,P as fQ,Q as hQ,R as gQ,S as dQ,T as pQ}from"./chunk-kd525svk.js";import{ta as UW,ua as OQ,va as x,wa as nQ}from"./chunk-6qxbw28k.js";import{Aa as zW,Ba as LQ,Ca as qW,Da as EW,Ea as LW,Fa as _W,Ga as wW,Ha as FW,Ia as CW,Ja as n,Ka as tQ,La as GQ,Na as $Q,Oa as zQ,Wa as lQ,Xa as oQ,xa as s,ya as EQ,za as cQ}from"./chunk-wkk6vc0r.js";import"./chunk-f8dcmgkp.js";import"./chunk-fhet42vs.js";import{ab as $}from"./chunk-b9hx8gsj.js";import{bb as h,cb as g}from"./chunk-8pxdwzvm.js";import S from"fs";import k from"path";import iQ from"process";var ZQ=k.join(iQ.env.HOME||".",".cache","launchpad"),wQ=k.join(ZQ,"binaries","packages"),jQ=k.join(ZQ,"cache-metadata.json");function RQ(){try{if(S.existsSync(jQ)){let Q=S.readFileSync(jQ,"utf-8");return JSON.parse(Q)}}catch(Q){if($.verbose)console.warn("Failed to load cache metadata:",Q)}return{version:"1.0",packages:{}}}function KQ(Q){try{S.mkdirSync(k.dirname(jQ),{recursive:!0}),S.writeFileSync(jQ,JSON.stringify(Q,null,2))}catch(J){if($.verbose)console.warn("Failed to save cache metadata:",J)}}function DQ(Q,J,X){let K=`${Q}-${J}`,G=k.join(wQ,K,`package.${X}`);if(S.existsSync(G)){let H=RQ(),j=H.packages[K];if(j)if(j.lastAccessed=new Date().toISOString(),KQ(H),S.statSync(G).size===j.size){if($.verbose)console.warn(`Found cached package: ${G}`);return G}else{if($.verbose)console.warn(`Cache file corrupted (size mismatch): ${G}`);S.unlinkSync(G),delete H.packages[K],KQ(H)}else if(S.statSync(G).size>100){if($.verbose)console.warn(`Found cached package (no metadata): ${G}`);return G}}return null}function bQ(Q,J,X,K){let G=`${Q}-${J}`,H=k.join(wQ,G),j=k.join(H,`package.${X}`);try{S.mkdirSync(H,{recursive:!0}),S.copyFileSync(K,j);let Y=RQ(),R=S.statSync(j);if(Y.packages[G]={domain:Q,version:J,format:X,downloadedAt:new Date().toISOString(),lastAccessed:new Date().toISOString(),size:R.size},KQ(Y),$.verbose)console.warn(`Cached package to: ${j}`);return j}catch(Y){if($.verbose)console.warn(`Failed to cache package: ${Y instanceof Error?Y.message:String(Y)}`);return K}}function rQ(Q=30,J=5){try{let X=RQ(),K=new Date,G=Q*24*60*60*1000,H=J*1024*1024*1024,j=0,Y=Object.entries(X.packages).map(([Z,W])=>({key:Z,...W,lastAccessedDate:new Date(W.lastAccessed)})).sort((Z,W)=>Z.lastAccessedDate.getTime()-W.lastAccessedDate.getTime());Y.forEach((Z)=>j+=Z.size);let R=[];Y.forEach((Z)=>{if(K.getTime()-Z.lastAccessedDate.getTime()>G)R.push(Z.key)});let O=j;if(Y.forEach((Z)=>{if(O>H&&!R.includes(Z.key))R.push(Z.key),O-=Z.size}),R.forEach((Z)=>{let W=k.join(wQ,Z);if(S.existsSync(W)){if(S.rmSync(W,{recursive:!0,force:!0}),delete X.packages[Z],$.verbose)console.warn(`Cleaned up cached package: ${Z}`)}}),R.length>0)KQ(X),console.log(`\uD83E\uDDF9 Cleaned up ${R.length} cached packages`)}catch(X){if($.verbose)console.warn("Cache cleanup failed:",X)}}function sQ(){try{let Q=RQ(),J=Object.values(Q.packages);if(J.length>0){let O=J.reduce((z,U)=>z+U.size,0),Z=J.map((z)=>new Date(z.lastAccessed).getTime()).sort(),W=(z)=>{if(z<1024)return`${z} B`;if(z<1048576)return`${(z/1024).toFixed(1)} KB`;if(z<1073741824)return`${(z/1048576).toFixed(1)} MB`;return`${(z/1073741824).toFixed(1)} GB`};return{packages:J.length,size:W(O),oldestAccess:new Date(Z[0]).toLocaleDateString(),newestAccess:new Date(Z[Z.length-1]).toLocaleDateString()}}let X=k.join(ZQ,"binaries","packages"),K=k.join(ZQ,"binaries","bun"),G=0,H=0,j=Date.now(),Y=0,R=(O)=>{if(O<1024)return`${O} B`;if(O<1048576)return`${(O/1024).toFixed(1)} KB`;if(O<1073741824)return`${(O/1048576).toFixed(1)} MB`;return`${(O/1073741824).toFixed(1)} GB`};if(S.existsSync(X)){let O=S.readdirSync(X);for(let Z of O){let W=k.join(X,Z);if(S.statSync(W).isDirectory()){let z=S.readdirSync(W);G+=z.length;for(let U of z){let E=k.join(W,U),C=S.statSync(E);H+=C.size;let F=C.mtime.getTime();if(F<j)j=F;if(F>Y)Y=F}}}}if(S.existsSync(K)){let O=S.readdirSync(K);for(let Z of O){let W=k.join(K,Z);if(S.statSync(W).isFile()){G++;let z=S.statSync(W);H+=z.size;let U=z.mtime.getTime();if(U<j)j=U;if(U>Y)Y=U}}}return{packages:G,size:R(H),oldestAccess:G>0?new Date(j).toLocaleDateString():"N/A",newestAccess:G>0?new Date(Y).toLocaleDateString():"N/A"}}catch{return{packages:0,size:"Error",oldestAccess:"Error",newestAccess:"Error"}}}import{Buffer as CQ}from"buffer";import q from"fs";import T from"path";import _ from"process";import{Buffer as aQ}from"buffer";import w from"fs";import{arch as eQ,platform as r}from"os";import b from"path";import o from"process";var QW=b.join(o.env.HOME||".",".cache","launchpad"),uQ=b.join(QW,"binaries","bun");function WW(Q){try{return w.mkdirSync(Q,{recursive:!0}),!0}catch{return!1}}function XQ(Q){try{if(!w.existsSync(Q))return!1;let J=w.statSync(Q);if(J.size<1048576||J.size>209715200){if($.verbose)console.warn(`Invalid zip file size: ${J.size} bytes (expected 1MB-200MB)`);return!1}let X=aQ.alloc(4),K=w.openSync(Q,"r");try{w.readSync(K,X,0,4,0);let G=X.readUInt32LE(0),H=G===67324752||G===101010256||G===134695760;if(!H&&$.verbose)console.warn(`Invalid zip signature: 0x${G.toString(16).padStart(8,"0")}`);return H}finally{w.closeSync(K)}}catch(J){if($.verbose)console.warn(`Error validating zip file: ${J}`);return!1}}function FQ(Q,J){let X=b.join(uQ,Q,J);if(w.existsSync(X)&&XQ(X)){if($.verbose)console.warn(`Found cached binary: ${X}`);return X}if(w.existsSync(X)&&!XQ(X))try{if(w.unlinkSync(X),$.verbose)console.warn(`Cached file is corrupted, removing: ${X}`)}catch{}return null}function $W(Q,J,X){let K=b.join(uQ,Q),G=b.join(K,J);try{if(w.mkdirSync(K,{recursive:!0}),w.copyFileSync(X,G),$.verbose)console.warn(`Cached binary to: ${G}`);return G}catch(H){if($.verbose)console.warn(`Failed to cache binary: ${H instanceof Error?H.message:String(H)}`);return X}}async function vQ(){try{let{pantry:Q}=await import("./chunk-fhet42vs.js"),J=Q.bunsh;if(J&&J.versions&&J.versions.length>0)return J.versions[0];throw new Error("No Bun versions found in pantry")}catch(Q){throw new Error(`Failed to get latest Bun version: ${Q instanceof Error?Q.message:String(Q)}`)}}function JW(Q){let J=r(),X=eQ()==="arm64"?"aarch64":"x64";if($.verbose)console.warn(`Platform: ${J}, Architecture: ${X}`);let K;switch(J){case"darwin":K=`bun-darwin-${X}.zip`;break;case"linux":K=`bun-linux-${X}.zip`;break;case"win32":K="bun-windows-x64.zip";break;default:throw new Error(`Unsupported platform: ${J}`)}let G=`https://github.com/oven-sh/bun/releases/download/bun-v${Q}/${K}`;return{filename:K,url:G}}async function XW(Q){if(/^\d+\.\d+\.\d+$/.test(Q))return Q;if(Q==="latest"||Q==="*")return await vQ();let J=await GW();if(typeof Bun!=="undefined"&&Bun.semver)try{let X=[...J].sort((K,G)=>{try{return Bun.semver.order(G,K)}catch{return G.localeCompare(K,void 0,{numeric:!0})}});for(let K of X)try{if(Bun.semver.satisfies(K,Q))return K}catch{continue}}catch{}if(Q.startsWith("^")){let X=Q.slice(1),[K,G,H]=X.split("."),j=J.filter((Y)=>{let R=Y.split("."),O=Number.parseInt(R[0]||"0"),Z=Number.parseInt(R[1]||"0"),W=Number.parseInt(R[2]||"0"),z=Number.parseInt(K||"0"),U=Number.parseInt(G||"0"),E=Number.parseInt(H||"0");if(O!==z)return!1;if(Z>U)return!0;if(Z<U)return!1;return W>=E});if(j.length>0)return j.sort((Y,R)=>{let O=Y.split(".").map((W)=>Number.parseInt(W)),Z=R.split(".").map((W)=>Number.parseInt(W));for(let W=0;W<3;W++)if(Z[W]!==O[W])return Z[W]-O[W];return 0})[0]}return Q}async function GW(){try{let{pantry:Q}=await import("./chunk-fhet42vs.js"),J=Q.bunsh;if(J&&J.versions)return[...J.versions];throw new Error("Bun package not found in pantry")}catch(Q){throw new Error(`Failed to get Bun versions from pantry: ${Q instanceof Error?Q.message:String(Q)}`)}}async function PQ(Q,J){if(!WW(Q))throw new Error(`Invalid installation path: ${Q}`);let X;if(!J)X=await vQ();else X=await XW(J);if($.verbose)console.warn(`Installing Bun version ${X}`);let{filename:K,url:G}=JW(X),H=FQ(X,K),j=b.join(Q,"bin");w.mkdirSync(j,{recursive:!0});let Y=b.join(Q,"temp");try{w.mkdirSync(Y,{recursive:!0})}catch(O){if($.verbose)console.warn(`Failed to create temp directory ${Y}:`,O);throw new Error(`Failed to create temporary directory for bun installation: ${O instanceof Error?O.message:String(O)}`)}let R;try{if(H&&XQ(H)){if($.verbose)console.warn(`Using cached Bun v${X} from: ${H}`);R=b.join(Y,K);try{w.copyFileSync(H,R)}catch(W){if($.verbose)console.warn(`Failed to copy cached bun from ${H} to ${R}:`,W);throw new Error(`Failed to copy cached bun file: ${W instanceof Error?W.message:String(W)}`)}}else{if(H&&!XQ(H)){if($.verbose)console.warn(`Cached file is corrupted, removing: ${H}`);try{w.unlinkSync(H)}catch{}}if($.verbose)console.warn(`Downloading from: ${G}`);R=b.join(Y,K);let W=await fetch(G);if(!W.ok)throw new Error(`Failed to download Bun: ${W.statusText}`);if(!W.body)throw new Error("Failed to download Bun: No response body");let z=W.headers.get("content-length"),U=z?Number.parseInt(z,10):0;if(U>0){let E=W.body.getReader(),C=[],F=0,V=0;while(!0){let{done:N,value:A}=await E.read();if(N)break;if(A){C.push(A),F+=A.length;let d=Date.now(),a=F/U*100,L=Math.floor(a/5)*5;if(d-V>100||a>=100||F===A.length){let B=$.verbose?`\u2B07\uFE0F ${F}/${U} bytes (${L}%) - Bun v${X}`:`\u2B07\uFE0F ${F}/${U} bytes (${L}%)`;o.stdout.write(`\r${B}`),V=d}}}o.stdout.write("\r\x1B[K");let u=C.reduce((N,A)=>N+A.length,0),f=new Uint8Array(u),P=0;for(let N of C)f.set(N,P),P+=N.length;try{w.writeFileSync(R,f)}catch(N){if($.verbose)console.warn(`Failed to write bun archive to ${R}:`,N);throw new Error(`Failed to write bun download: ${N instanceof Error?N.message:String(N)}`)}}else if($.verbose){if(U>0)console.log(`\u2B07\uFE0F Downloading ${(U/1024/1024).toFixed(1)} MB...`);else console.log("\u2B07\uFE0F Downloading...");let E=await W.arrayBuffer();w.writeFileSync(R,new Uint8Array(E)),console.log(`\u2705 Downloaded ${(E.byteLength/1024/1024).toFixed(1)} MB`)}else{let E=await W.arrayBuffer();try{w.writeFileSync(R,new Uint8Array(E))}catch(C){if($.verbose)console.warn(`Failed to write bun archive to ${R}:`,C);throw new Error(`Failed to write bun download: ${C instanceof Error?C.message:String(C)}`)}}if($.verbose)console.warn(`Downloaded to ${R}`);if(!XQ(R)){try{w.unlinkSync(R)}catch{}let E=FQ(X,K);if(E&&w.existsSync(E))try{if(w.unlinkSync(E),$.verbose)console.warn(`Removed corrupted cached file: ${E}`)}catch{}throw new Error("Downloaded bun archive is corrupted. Try clearing cache with: launchpad cache:clear --force")}$W(X,K,R)}if(K.endsWith(".zip"))if((o.env.NODE_ENV==="test"||o.env.LAUNCHPAD_TEST_MODE==="true")&&!o.env.LAUNCHPAD_CLI_MODE){let W=r()==="win32"?"bun.exe":"bun",z=b.join(j,W);if(w.writeFileSync(z,`#!/bin/sh
echo "fake bun for testing"
`),w.chmodSync(z,493),$.verbose)console.warn(`Created fake bun executable for testing: ${z}`)}else{let{exec:W}=await import("child_process"),{promisify:z}=await import("util"),U=z(W);try{await U(`unzip -o "${R}" -d "${Y}"`)}catch(N){try{w.unlinkSync(R)}catch{}let A=FQ(X,K);if(A&&w.existsSync(A))try{if(w.unlinkSync(A),$.verbose)console.warn(`Removed corrupted cached file: ${A}`)}catch{}let d=N instanceof Error?N.message:String(N);if(d.includes("End-of-central-directory signature not found")||d.includes("zipfile")||d.includes("not a zipfile"))throw new Error("Downloaded bun archive is corrupted. The download may have been interrupted or the file is damaged. Try running: launchpad cache:clear --force");throw new Error(`Failed to extract bun archive: ${d}`)}let E=r()==="win32"?"bun.exe":"bun",C=b.join(Y,"bun-*"),{stdout:F}=await U(`ls -d ${C}`),V=F.trim().split(`
`)[0],u=b.join(V,E),f=b.join(j,E);if(w.existsSync(f))w.unlinkSync(f);await U(`cp ${u} ${f}`),await U(`chmod +x ${f}`);let P=b.join(j,r()==="win32"?"bunx.exe":"bunx");try{if(w.existsSync(P))w.unlinkSync(P);if(r()==="win32")w.copyFileSync(f,P);else w.symlinkSync("bun",P);if($.verbose)console.warn(`Created bunx symlink at ${P}`)}catch(N){if($.verbose)console.warn(`Failed to create bunx symlink: ${N instanceof Error?N.message:String(N)}`)}}if(!$.verbose){let W=`\u2705 bun.sh \x1B[2m\x1B[3m(v${X})\x1B[0m`;if(o.env.LAUNCHPAD_SHELL_INTEGRATION==="1")o.stderr.write(`${W}
`);else console.log(W)}try{w.writeFileSync(b.join(Q,".launchpad_ready"),new Date().toISOString())}catch{}w.rmSync(Y,{recursive:!0,force:!0});let O=b.join(j,r()==="win32"?"bun.exe":"bun"),Z=b.join(j,r()==="win32"?"bunx.exe":"bunx");return[O,Z]}catch(O){if(w.existsSync(Y))w.rmSync(Y,{recursive:!0,force:!0});throw O}}import{Buffer as OW}from"buffer";import{execSync as HQ}from"child_process";import M from"fs";import m from"path";import YW from"process";async function kQ(Q,J){let X=$Q(),K=zQ(),G=J||"v1.15.2",H;if(X==="darwin")H=K==="aarch64"?"meilisearch-macos-apple-silicon":"meilisearch-macos-amd64";else if(X==="linux")H=K==="aarch64"?"meilisearch-linux-aarch64":"meilisearch-linux-amd64";else if(X==="windows")H="meilisearch-windows-amd64.exe";else throw new Error(`Unsupported platform for Meilisearch: ${X}/${K}`);let j=`https://github.com/meilisearch/meilisearch/releases/download/${G}/${H}`,Y="meilisearch.com",R=G.replace(/^v/,""),O=m.join(Q,Y,`v${R}`),Z=m.join(O,"bin"),W=m.join(Q,".tmp",`meilisearch-${R}`);try{await M.promises.mkdir(W,{recursive:!0}),await M.promises.mkdir(Z,{recursive:!0});let z=m.join(W,H),U=m.join(Z,"meilisearch");if($.verbose)console.warn(`Downloading Meilisearch ${G} from: ${j}`);x(`\uD83D\uDD04 Downloading meilisearch ${G}...`);let E=await globalThis.fetch(j);if(!E.ok)throw new Error(`Failed to download Meilisearch: ${E.status} ${E.statusText}`);let C=E.headers.get("content-length"),F=C?Number.parseInt(C,10):0,V=E.body?.getReader();if(!V)throw new Error("Failed to get response reader");let u=[],f=0;while(!0){let{done:I,value:D}=await V.read();if(I)break;if(D){if(u.push(D),f+=D.length,F>0&&!$.verbose){let c=Math.round(f/F*100);x(`\uD83D\uDD04 Downloading meilisearch ${G}... ${c}%`)}}}let P=u.reduce((I,D)=>I+D.length,0),N=new Uint8Array(P),A=0;for(let I of u)N.set(I,A),A+=I.length;await M.promises.writeFile(z,N),await M.promises.copyFile(z,U),await M.promises.chmod(U,493);let d={domain:Y,version:R,binaries:["meilisearch"],installedAt:new Date().toISOString(),platform:X,architecture:K,downloadUrl:j},a=m.join(O,"metadata.json");await M.promises.writeFile(a,JSON.stringify(d,null,2)),await M.promises.rm(W,{recursive:!0,force:!0});let L=m.join(Q,"bin");await M.promises.mkdir(L,{recursive:!0});let B=m.join(L,"meilisearch"),y=`#!/bin/bash
exec "${U}" "$@"
`;return await M.promises.writeFile(B,y),await M.promises.chmod(B,493),x(`\u2705 meilisearch \x1B[2m\x1B[3m(v${R})\x1B[0m`),[B]}catch(z){try{await M.promises.rm(W,{recursive:!0,force:!0})}catch{}throw z}}async function ZW(Q){try{if(!M.existsSync(Q))return!1;let{execSync:J}=await import("child_process");return J(`"${Q}" --version`,{stdio:"pipe",timeout:5000,env:{...YW.env}}),!0}catch(J){if($.verbose)console.warn(`PHP binary test failed: ${J instanceof Error?J.message:String(J)}`);return!1}}async function jW(Q,J){let X=J||"3.50.4",K="sqlite.org";x(`\uD83D\uDD04 Building SQLite ${X} from source...`);let G=m.join(Q,".tmp",`sqlite-source-${X}`);await M.promises.rm(G,{recursive:!0,force:!0}),await M.promises.mkdir(G,{recursive:!0});try{x(`\uD83D\uDCE6 Downloading SQLite ${X} source...`);let j=await fetch("https://www.sqlite.org/2024/sqlite-autoconf-3500400.tar.gz");if(!j.ok)throw new Error(`Failed to download SQLite source: ${j.status}`);let Y=m.join(G,"sqlite.tar.gz");await M.promises.writeFile(Y,OW.from(await j.arrayBuffer())),x(`\uD83D\uDCC2 Extracting SQLite ${X} source...`),HQ(`cd "${G}" && tar -xzf sqlite.tar.gz`,{stdio:"inherit"});let R=m.join(G,"sqlite-autoconf-3500400");x(`\u2699\uFE0F Configuring SQLite ${X} build...`);let O=m.join(Q,"sqlite.org",`v${X}`);await M.promises.mkdir(O,{recursive:!0}),HQ(`cd "${R}" && ./configure --prefix="${O}" --enable-fts5 --enable-json1`,{stdio:"inherit"}),x(`\uD83D\uDD28 Compiling SQLite ${X}...`);let{cpus:Z}=await import("os"),W=Z().length;return HQ(`cd "${R}" && make -j${W}`,{stdio:"inherit"}),x(`\uD83D\uDCE6 Installing SQLite ${X}...`),HQ(`cd "${R}" && make install`,{stdio:"inherit"}),await M.promises.rm(G,{recursive:!0,force:!0}),[`${O}/bin/sqlite3`]}catch(H){await M.promises.rm(G,{recursive:!0,force:!0});let j=`SQLite ${X} source build failed: ${H instanceof Error?H.message:String(H)}`;throw new Error(j)}}async function KW(Q,J){if(!Q||Q.length===0)return console.log("No packages specified for dependency installation"),[];let X=J||GQ().string;console.log(`\uD83D\uDD27 Installing dependencies only for: ${Q.join(", ")}`),await M.promises.mkdir(X,{recursive:!0});let K=[],G=0;try{let{pantry:H}=await import("./chunk-fhet42vs.js");for(let j of Q){let Y=s(j),R;if(R=Object.keys(H).find((U)=>U===Y||U===j),!R&&j==="php")R=Object.keys(H).find((U)=>U==="phpnet");if(!R)R=Object.keys(H).find((U)=>U.includes(j)||U.includes(Y.split(".")[0]));let O=R?H[R]:null;if(!O||!O.dependencies){console.warn(`\u26A0\uFE0F Package ${j} not found in pantry or has no dependencies`);continue}if($.verbose)console.log(`\uD83D\uDCCB ${j} has ${O.dependencies.length} dependencies: ${O.dependencies.join(", ")}`);let Z=[],W=O.dependencies.filter((U)=>!Z.some((E)=>U.includes(E)));if(W.length===0){console.log(`\u2705 No installable dependencies found for ${j}`);continue}let z=W.filter((U)=>{let E=U.split(/[<>=~^]/)[0];if(E===Y||E===j||j==="php"&&E==="php.net"||Y==="php.net"&&E==="php.net"){if($.verbose)console.log(`\u23ED\uFE0F Skipping ${U} (this is the main package, not a dependency)`);return!1}let C=m.join(X,E),F=M.existsSync(C);if(F){if(G++,$.verbose)console.log(`\u2705 ${U} already installed`)}return!F});if(z.length===0){if($.verbose)console.log(`\u2705 All ${W.length} dependencies for ${j} already installed`);continue}if(console.log(`\uD83D\uDCE6 Installing ${z.length} new dependencies for ${j}...`),$.verbose)console.log(` Dependencies to install: ${z.join(", ")}`);try{let U=await UQ(z,X);if(K.push(...U),$.verbose)console.log(`\u2705 Successfully installed ${z.length} dependencies for ${j}`)}catch{console.warn(`\u26A0\uFE0F Some dependencies for ${j} failed to install, trying individual installation`);for(let U of z)try{let E=await UQ([U],X);if(K.push(...E),$.verbose)console.log(`\u2705 Installed ${U}`)}catch(E){console.warn(`\u26A0\uFE0F Warning: Could not install dependency ${U}:`,E instanceof Error?E.message:String(E))}}}if(K.length>0)console.log(`\uD83C\uDF89 Dependencies installation complete. Installed ${K.length} files for ${Q.join(", ")}.`);else if(G>0)console.log(`\u2705 All ${G} dependencies for ${Q.join(", ")} were already installed.`);else console.log(`\u2139\uFE0F No dependencies found to install for ${Q.join(", ")}.`);return K}catch(H){return console.warn(`\u26A0\uFE0F Failed to import ts-pkgx or process dependencies: ${H instanceof Error?H.message:String(H)}`),[]}}var qQ={baseUrl:"https://dist.pkgx.dev"};var TQ=!1;async function BQ(Q,J){let X=T.join(Q,"lib");if(!q.existsSync(X))return;try{let K=await q.promises.readdir(X);for(let G of K){let H=G.match(/^(lib\w+)\.(\d+(?:\.\d+)*)\.dylib$/);if(H){let[,j,Y]=H,R=Y.split(".")[0],O=`${j}.dylib`,Z=`${j}.${R}.dylib`,W=T.join(X,O),z=T.join(X,Z);if(!q.existsSync(W))try{if(await q.promises.symlink(G,W),$.verbose)console.warn(`Created library symlink: ${O} -> ${G}`)}catch(U){if($.verbose)console.warn(`Failed to create symlink ${O}:`,U)}if(Z!==O&&!q.existsSync(z))try{if(await q.promises.symlink(G,z),$.verbose)console.warn(`Created library symlink: ${Z} -> ${G}`)}catch(U){if($.verbose)console.warn(`Failed to create symlink ${Z}:`,U)}}if(G==="libncursesw.dylib"){let j=T.join(X,"libncurses.dylib");if(!q.existsSync(j))try{if(await q.promises.symlink(G,j),$.verbose)console.warn(`Created ncurses compatibility symlink: libncurses.dylib -> ${G}`)}catch(Y){if($.verbose)console.warn("Failed to create ncurses compatibility symlink:",Y)}}if(G==="libncursesw.6.dylib"){let j=T.join(X,"libncurses.6.dylib");if(!q.existsSync(j))try{if(await q.promises.symlink(G,j),$.verbose)console.warn(`Created versioned ncurses compatibility symlink: libncurses.6.dylib -> ${G}`)}catch(Y){if($.verbose)console.warn("Failed to create versioned ncurses compatibility symlink:",Y)}}if(G==="libncursesw.dylib"){let j=T.join(X,"libncurses.dylib");if(!q.existsSync(j))try{if(await q.promises.symlink(G,j),$.verbose)console.warn(`Created base ncurses compatibility symlink: libncurses.dylib -> ${G}`)}catch(Y){if($.verbose)console.warn("Failed to create base ncurses compatibility symlink:",Y)}}if(G.startsWith("libpcre2-")&&G.endsWith(".dylib")){let j=G.match(/^(libpcre2-(?:8|16|32))\.(\d+)\.dylib$/);if(j){let[,Y]=j,R=T.join(X,`${Y}.dylib`);if(!q.existsSync(R))try{if(await q.promises.symlink(G,R),$.verbose)console.warn(`Created PCRE2 compatibility symlink: ${Y}.dylib -> ${G}`)}catch(O){if($.verbose)console.warn("Failed to create PCRE2 compatibility symlink:",O)}}}if(G==="libpng16.dylib"){let j=T.join(X,"libpng.dylib");if(!q.existsSync(j))try{if(await q.promises.symlink(G,j),$.verbose)console.warn(`Created libpng compatibility symlink: libpng.dylib -> ${G}`)}catch(Y){if($.verbose)console.warn("Failed to create libpng compatibility symlink:",Y)}}}}catch(K){if($.verbose)console.warn("Error creating library symlinks:",K)}}async function JQ(Q,J,X){let K=$Q(),G=zQ(),H=J,j=J.match(/^(darwin|linux|windows|freebsd|openbsd|netbsd)@([^:]+)(:.*)?$/);if(j){let[,W,z,U]=j;if(U){let E=U.replace(/^:\s*/,"@");H=`${z}${E}`}else H=z;if($.verbose)console.warn(`OS-specific package detected: ${J} -> trying ${H}`)}let{name:Y,version:R}=n(H),O=s(Y);if(Y==="bun"||O==="bun.sh"){if($.verbose)console.warn(`Using dedicated bun installation for ${Y}`);return await PQ(X,R)}if(Y==="meilisearch"||O==="meilisearch.com"){if($.verbose)console.warn(`Using custom meilisearch installation for ${Y}`);return await kQ(X,R)}if(Y==="php"||O==="php.net")try{let{downloadPhpBinary:W}=await import("./chunk-xbhy1cqk.js");return await W(X,R)}catch(W){let z=W instanceof Error?W.message:String(W);throw console.error(`\u274C Failed to install PHP from precompiled binaries: ${z}`),console.log(`
\uD83D\uDCA1 Troubleshooting:`),console.log("1. Check your internet connection"),console.log("2. Verify that the precompile workflow has run recently"),console.log("3. Try a different PHP version if available"),console.log("4. Join our Discord for help: https://discord.gg/stacksjs"),new Error(`PHP installation failed: ${z}`)}if($.verbose)console.warn(`Resolved ${Y} to domain: ${O}`);let Z=R;if(!Z){let W=EQ(O);if(!W){if(O!==Y)throw new Error(`No versions found for ${Y} (resolved to ${O}) on ${K}/${G}. Package may not be available for this platform.`);throw new Error(`No versions found for ${Y} on ${K}/${G}`)}Z=typeof W==="string"?W:String(W)}else{let W=LQ(O,Z);if(!W){if(O!==Y)throw new Error(`No suitable version found for ${Y}@${Z} (resolved to ${O}). Package may not be available for this platform or version constraint.`);throw new Error(`No suitable version found for ${Y}@${Z}`)}Z=W}if(Z&&typeof Z!=="string"){if($.verbose)console.warn(`Warning: version is not a string for ${Y}: ${JSON.stringify(Z)}`);Z=String(Z)}if($.verbose)console.warn(`Installing ${O} version: ${Z}`);try{let W=await NQ(O,Z,K,G,X),z=T.join(X,O,`v${Z}`);return await BQ(z,O),W}catch(W){if(O==="gnu.org/binutils"&&Z==="2.45.0"){let z=["2.44.0","2.43.0","2.42.0"];for(let U of z){if($.verbose)console.warn(`\u26A0\uFE0F Version ${Z} not available, trying fallback version ${U}`);try{let E=await NQ(O,U,K,G,X),C=T.join(X,O,`v${U}`);if(await BQ(C,O),$.verbose)console.log(`\u2705 Successfully installed ${O} v${U} (fallback from v${Z})`);return E}catch{if($.verbose)console.warn(`\u26A0\uFE0F Fallback version ${U} also failed, trying next...`);continue}}if($.verbose)console.error(`\u274C All versions failed for ${O}: ${Z}, ${z.join(", ")}`),console.error(` Original error: ${W instanceof Error?W.message:String(W)}`);throw W}throw W}}async function NQ(Q,J,X,K,G){if(J&&typeof J!=="string"){if($.verbose)console.warn(`Warning: version parameter is not a string for ${Q}: ${JSON.stringify(J)}`);J=String(J)}let H=T.join(G,".tmp",`${Q}-${J}`);try{await q.promises.mkdir(H,{recursive:!0});let j=["tar.xz","tar.gz"],Y=null,R=null,O=!1,Z=!1;for(let L of j){let B=DQ(Q,J,L);if(B){if($.verbose)console.warn(`Using cached ${Q} v${J} from: ${B}`);else x(`\u2705 ${Q} \x1B[2m\x1B[3m(v${J})\x1B[0m`),Z=!0;R=T.join(H,`package.${L}`),q.copyFileSync(B,R),Y=`cached:${B}`,O=!0;break}let y=`${qQ.baseUrl}/${Q}/${X}/${K}/v${J}.${L}`,I=T.join(H,`package.${L}`),D=new AbortController,c=setTimeout(()=>{D.abort()},30000);try{if($.verbose)console.warn(`Trying to download: ${y}`);if(_.env.NODE_ENV==="test"&&_.env.LAUNCHPAD_ALLOW_NETWORK!=="1"&&!globalThis.fetch.toString().includes("mockFetch"))throw new Error("Network calls disabled in test environment");let v=await fetch(y,{signal:D.signal,headers:{"User-Agent":"Launchpad Package Manager"}});if(clearTimeout(c),v.ok){let p=v.headers.get("content-length"),e=p?Number.parseInt(p,10):0;if(e>0){if(TQ)OQ();let t=v.body?.getReader();if(t){let l=[],i=0,YQ=0;while(!0){let{done:QQ,value:WQ}=await t.read();if(QQ)break;if(WQ){l.push(WQ),i+=WQ.length;let AQ=Date.now(),IQ=i/e*100,VQ=Math.floor(IQ/5)*5;if(AQ-YQ>100||IQ>=100||i===WQ.length){let yQ=$.verbose?`\u2B07\uFE0F ${i}/${e} bytes (${VQ}%) - ${Q} v${J}`:`\u2B07\uFE0F ${i}/${e} bytes (${VQ}%)`;if(_.env.LAUNCHPAD_SHELL_INTEGRATION==="1"){if(_.stderr.write(`\r${yQ}`),_.stderr.isTTY)q.writeSync(_.stderr.fd,"")}else _.stdout.write(`\r${yQ}`);YQ=AQ}}}if(_.env.LAUNCHPAD_SHELL_INTEGRATION==="1"){if(_.stderr.write("\r\x1B[K"),_.stderr.isTTY)try{q.writeSync(_.stderr.fd,"")}catch{}}else if(_.stdout.write("\r\x1B[K"),_.stdout.isTTY)try{q.writeSync(_.stdout.fd,"")}catch{}x(`\u2705 ${Q} \x1B[2m\x1B[3m(v${J})\x1B[0m`);let _Q=l.reduce((QQ,WQ)=>QQ+WQ.length,0),xQ=new Uint8Array(_Q),MQ=0;for(let QQ of l)xQ.set(QQ,MQ),MQ+=QQ.length;await q.promises.writeFile(I,xQ)}else{let l=await v.arrayBuffer();await q.promises.writeFile(I,CQ.from(l))}}else if($.verbose){if(e>0)console.warn(`\u2B07\uFE0F Downloading ${(e/1024/1024).toFixed(1)} MB...`);else console.warn("\u2B07\uFE0F Downloading...");let t=await v.arrayBuffer();await q.promises.writeFile(I,CQ.from(t)),console.log(`\u2705 Downloaded ${(t.byteLength/1024/1024).toFixed(1)} MB`)}else{if(TQ)OQ();let t=$.verbose?`\u2B07\uFE0F Downloading ${Q} v${J} (size unknown)...`:`\u2B07\uFE0F Downloading ${Q} v${J}...`;if(_.env.LAUNCHPAD_SHELL_INTEGRATION==="1"){if(_.stderr.write(`\r${t}`),_.stderr.isTTY)q.writeSync(_.stderr.fd,"")}else _.stdout.write(`\r${t}`);let l=await v.arrayBuffer();await q.promises.writeFile(I,CQ.from(l));let i=(l.byteLength/1024).toFixed(1),YQ=(l.byteLength/1024/1024).toFixed(1),_Q=l.byteLength>1048576?`${YQ} MB`:`${i} KB`;if(_.env.LAUNCHPAD_SHELL_INTEGRATION==="1"){if(_.stderr.write("\r\x1B[K"),_.stderr.isTTY)try{q.writeSync(_.stderr.fd,"")}catch{}}else if(_.stdout.write("\r\x1B[K"),_.stdout.isTTY)try{q.writeSync(_.stdout.fd,"")}catch{}if($.verbose)x(`\u2705 Downloaded ${_Q} - ${Q} \x1B[2m\x1B[3m(v${J})\x1B[0m`);else x(`\u2705 ${Q} \x1B[2m\x1B[3m(v${J})\x1B[0m`)}bQ(Q,J,L,I),Y=y,R=I;break}}catch(v){if(clearTimeout(c),v instanceof Error&&v.name==="AbortError")throw console.error(`\u274C Download timeout for ${Q} (${L} format) - cancelling after 30 seconds`),new Error(`Download timeout for ${Q} - cancelling after 30 seconds`);else{let p=_.env.CI==="true"||_.env.GITHUB_ACTIONS==="true";if($.verbose||p)console.warn(`\u26A0\uFE0F Failed to download ${Q} v${J} (${L} format):`,v instanceof Error?v.message:String(v)),console.warn(` URL: ${y}`),console.warn(` Platform: ${X}/${K}`)}}}if(!Y||!R){let L=_.env.CI==="true"||_.env.GITHUB_ACTIONS==="true",B=`Failed to download package ${Q} v${J}`;if(L)console.error(`\u274C ${B}`),console.error(" Tried URLs:"),j.forEach((y)=>{let I=`${qQ.baseUrl}/${Q}/${X}/${K}/v${J}.${y}`;console.error(` - ${I}`)}),console.error(` Platform: ${X}/${K}`),console.error(" This may be due to network issues or the package not being available for this platform.");throw new Error(B)}if($.verbose&&!O)console.warn(`Downloaded: ${Y}`);let W=T.join(H,"extracted");await q.promises.mkdir(W,{recursive:!0});let z=R.endsWith(".tar.xz");if($.verbose)console.warn(`Extracting ${Q} v${J}...`);else if(q.statSync(R).size>20971520&&!Z){if(TQ)OQ();let B=`\uD83D\uDD27 Extracting ${Q} v${J}...`;if(_.env.LAUNCHPAD_SHELL_INTEGRATION==="1"){if(_.stderr.write(`${B}\r`),_.stderr.isTTY)q.writeSync(_.stderr.fd,"")}else _.stdout.write(`${B}\r`)}let U=_.env.NODE_ENV==="test"&&globalThis.fetch.toString().includes("mockFetch"),E=!1;try{let L=q.readFileSync(R,{encoding:null,flag:"r"}).subarray(0,10);if(L[0]===31&&L[1]===139)E=!0;else if(L[0]===253&&L[1]===55&&L[2]===122&&L[3]===88&&L[4]===90&&L[5]===0)E=!0;else if(L.length>=5){let B=q.readFileSync(R,{encoding:null,flag:"r"}).subarray(0,512);if(B.length>=262){if(B.subarray(257,262).toString("ascii")==="ustar")E=!0}}}catch(L){if($.verbose)console.warn(`Could not validate archive format: ${L}`)}if(U||!E){let L=T.join(W,"bin");await q.promises.mkdir(L,{recursive:!0});let B=Q.split(".")[0]||"mock-binary",y=T.join(L,B);if(await q.promises.writeFile(y,`#!/bin/bash
echo "Mock ${Q} v${J}"
`),await q.promises.chmod(y,493),$.verbose&&!E&&!U)console.warn(`Archive ${R} is not a valid tar archive, using mock extraction`)}else{let L=_.platform==="win32"?"tar":"/usr/bin/tar",B=z?["-xf",R,"-C",W]:["-xzf",R,"-C",W],y=Bun.spawn([L,...B],{cwd:H,stdio:["ignore","pipe","pipe"]});if(await y.exited!==0){let D=await new Response(y.stderr).text();if($.verbose)console.warn(`Tar extraction failed (${D}), falling back to mock extraction`);let c=T.join(W,"bin");await q.promises.mkdir(c,{recursive:!0});let v=Q.split(".")[0]||"mock-binary",p=T.join(c,v);await q.promises.writeFile(p,`#!/bin/bash
echo "Mock ${Q} v${J}"
`),await q.promises.chmod(p,493)}}if($.verbose)console.warn(`Extracted to: ${W}`);else if(q.statSync(R).size>20971520&&!Z){if(_.env.LAUNCHPAD_SHELL_INTEGRATION==="1"){if(_.stderr.write("\r\x1B[K"),_.stderr.isTTY)try{q.writeSync(_.stderr.fd,"")}catch{}}else if(_.stdout.write("\r\x1B[K"),_.stdout.isTTY)try{q.writeSync(_.stdout.fd,"")}catch{}}async function C(L,B,y){let I=[T.join(L,B,`v${y}`),L,...(await q.promises.readdir(L)).map((D)=>T.join(L,D))];for(let D of I)if(q.existsSync(D)){if((await q.promises.readdir(D,{withFileTypes:!0})).some((p)=>p.isDirectory()&&["bin","lib","include","share","sbin"].includes(p.name))){if($.verbose)console.warn(`Found package root at: ${D}`);return D}}if($.verbose)console.warn(`Using fallback package root: ${L}`);return L}let F=T.join(G,Q,`v${J}`);await q.promises.mkdir(F,{recursive:!0});let V=T.join(G,"pkgs",Q,`v${J}`);if(await q.promises.mkdir(V,{recursive:!0}),$.verbose)console.warn(`Installing ${Q} v${J}...`);let u=await C(W,Q,J);if(await lQ(u,F),await BQ(F,Q),await pQ(F,Q),await mQ(G,Q,J),await hQ(G,Q,J),!await gQ(F,Q))if(Q.includes("ca-certs")){if($.verbose)x(`\u2139\uFE0F ${Q} installed (certificate bundle, no binaries expected)`)}else x(`\u26A0\uFE0F Package ${Q} appears incomplete, source build not available...`);let P=await fQ(F,G,Q,J);await dQ(G);let N={domain:Q,version:J,installedAt:new Date().toISOString(),binaries:P,installPath:F};if(await q.promises.writeFile(T.join(V,"metadata.json"),JSON.stringify(N,null,2)),$.verbose)console.log(`\u2705 Successfully installed ${Q} \x1B[2m\x1B[3m(v${J})\x1B[0m`);await q.promises.rm(H,{recursive:!0,force:!0});let A=[],d=T.join(F,"bin"),a=T.join(F,"sbin");for(let L of P)if(q.existsSync(T.join(d,L)))A.push(T.join(G,"bin",L));else if(q.existsSync(T.join(a,L)))A.push(T.join(G,"sbin",L));else A.push(T.join(G,"bin",L));return A}catch(j){if(q.existsSync(H))await q.promises.rm(H,{recursive:!0,force:!0});throw j}}async function SQ(Q){try{let{resolveDependencies:J}=await import("./chunk-fhet42vs.js"),X=Q.reduce((O,Z)=>{let{name:W,version:z}=n(Z),U=s(W);return O[U]=z||"*",O},{}),K=await import("fs"),G=await import("path"),j=(await import("os")).tmpdir(),Y=G.join(j,`launchpad-deps-${Date.now()}.yaml`),R=`dependencies:
${Object.entries(X).map(([O,Z])=>` ${O}: ${Z}`).join(`
`)}
`;if($.verbose)console.warn("\uD83D\uDCDD Generated dependency file for ts-pkgx:"),console.warn(R);await K.promises.writeFile(Y,R);try{let O=await J(Y,{targetOs:$Q(),includeOsSpecific:!0});if($.verbose)console.warn(`\uD83D\uDD0D ts-pkgx resolved ${O.totalCount} total packages from ${Q.length} input packages`),console.warn(`\uD83D\uDCE6 Resolved packages: ${O.packages.map((W)=>`${W.name}@${W.version||"latest"}`).join(", ")}`);let Z=O.packages.map((W)=>W.version?`${W.name}@${W.version}`:W.name);return await K.promises.unlink(Y),Z}catch(O){throw await K.promises.unlink(Y).catch(()=>{}),O}}catch(J){if(console.error(`\u274C ts-pkgx dependency resolution failed: ${J instanceof Error?J.message:String(J)}`),J instanceof Error&&J.stack)console.error("Stack trace:",J.stack);return console.warn("Falling back to simple deduplication..."),oQ(Q)}}import RW from"fs";import HW from"process";async function UQ(Q,J){let X=Array.isArray(Q)?Q:[Q],K=J||GQ().string;if(nQ(),await RW.promises.mkdir(K,{recursive:!0}),X.length===0||X.length===1&&!X[0]){if($.verbose)console.warn(`No packages to install, created directory: ${K}`);return[]}let H=await SQ(X),j=!0;if($.verbose){if(console.warn(`Installing packages: ${H.join(", ")}`),console.warn(`Install path: ${K}`),H.length<X.length)console.warn(`Deduplicated ${X.length} packages to ${H.length} packages`)}let Y=[];if(j)for(let O=0;O<H.length;O++){let Z=H[O],W;try{W=n(Z).name;let U=await JQ(W,Z,K);Y.push(...U)}catch(z){let U=Z.match(/^(darwin|linux|windows|freebsd|openbsd|netbsd)@([^:]+)(:.*)?$/);if(U){let[,E,C,F]=U,V=C;if(F){let u=F.replace(/^:\s*/,"@");V=`${C}${u}`}if($.verbose)console.warn(`\u26A0\uFE0F OS-specific package ${Z} failed, trying fallback: ${V}`);try{let u=await JQ(C,V,K);if(Y.push(...u),$.verbose)console.log(`\u2705 Fallback succeeded for ${V}`);continue}catch{if(F)try{let u=await JQ(C,C,K);if(Y.push(...u),$.verbose)console.log(`\u2705 Fallback succeeded for ${C} (without version constraint)`);continue}catch{if($.verbose)console.error(`\u274C Failed to install ${Z}, fallback ${V}, and simple ${C}`);else x(`\u26A0\uFE0F Warning: Failed to install ${Z} (tried multiple fallbacks)`);continue}else{if($.verbose)console.error(`\u274C Failed to install ${Z} and fallback ${V}`);else x(`\u26A0\uFE0F Warning: Failed to install ${Z}`);continue}}}else{if($.verbose)console.error(`\u274C Failed to install ${Z}: ${z instanceof Error?z.message:String(z)}`);else x(`\u26A0\uFE0F Warning: Failed to install ${Z}`);continue}}}else for(let O of H){let{name:Z}=n(O);try{let W=await JQ(Z,O,K);Y.push(...W)}catch(W){if($.verbose)console.error(`\u274C Failed to install ${O}: ${W instanceof Error?W.message:String(W)}`);else x(`\u26A0\uFE0F Warning: Failed to install ${O}`)}}let R=HW.env.LAUNCHPAD_SUPPRESS_INSTALL_SUMMARY==="true";if(Y.length>0&&!R){if($.verbose)console.log(`\u2705 Successfully installed ${Y.length} files`)}else if(!R)if($.verbose)console.log("\u2139\uFE0F No new files installed (packages may have been already installed)");else x("\u2705 Environment activated");return Y}export{ZW as testPhpBinary,LQ as resolveVersion,s as resolvePackageName,SQ as resolveAllDependencies,UW as resetInstalledTracker,n as parsePackageSpec,qW as listAvailablePackages,zW as isVersionAvailable,_W as isValidPackageName,LW as isPackageDomain,EW as isPackageAlias,GQ as install_prefix,KW as installDependenciesOnly,UQ as install,tQ as getPackageInfo,EQ as getLatestVersion,sQ as getCacheStats,cQ as getAvailableVersions,CW as getAllPackageNames,FW as getAllPackageDomains,wW as getAllPackageAliases,NQ as downloadPackage,OQ as cleanupSpinner,rQ as cleanupCache,jW as buildSqliteFromSource,qQ as DISTRIBUTION_CONFIG};export{vQ as C,JW as D,PQ as E,rQ as F,sQ as G,ZW as H,jW as I,KW as J,qQ as K,NQ as L,SQ as M,UQ as N};