ts-pantry 0.11.148 → 0.11.152

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/bin/cli.js +7 -7
  2. package/dist/bin/desktop.js +1 -1
  3. package/dist/{chunk-ghf9cbt0.js → chunk-1e7d8cfn.js} +2 -2
  4. package/dist/chunk-64ceqzm1.js +1 -0
  5. package/dist/chunk-76p8qggm.js +1 -0
  6. package/dist/{chunk-jbjnzfb1.js → chunk-aedkpjse.js} +14 -14
  7. package/dist/{chunk-r8bxccnt.js → chunk-dkr3wvjw.js} +1 -1
  8. package/dist/chunk-jr738552.js +1 -0
  9. package/dist/{chunk-kyakwzhh.js → chunk-m0wa29w0.js} +2 -2
  10. package/dist/chunk-m4g1ntwt.js +1 -0
  11. package/dist/chunk-m7xtpq1x.js +1 -0
  12. package/dist/chunk-nz438pxa.js +1 -0
  13. package/dist/{chunk-9he46t5k.js → chunk-tfd285s6.js} +2 -2
  14. package/dist/{chunk-mgdech8n.js → chunk-tvtdwcr8.js} +1 -1
  15. package/dist/chunk-x2y7f62z.js +531 -0
  16. package/dist/{chunk-8teqa39h.js → chunk-xrxz3107.js} +2 -2
  17. package/dist/chunk-ybf3yfq2.js +1 -0
  18. package/dist/generated-package-names.d.ts +23 -23
  19. package/dist/src/catalog/client.js +1 -1
  20. package/dist/src/desktop/service.js +1 -1
  21. package/dist/src/index.js +1 -1
  22. package/dist/src/native/index.js +2 -2
  23. package/dist/src/native/pipeline.d.ts +2 -0
  24. package/dist/src/native/release.js +1 -1
  25. package/dist/src/packages/apps/linearapp.d.ts +2 -2
  26. package/dist/src/packages/apps/whatsappcom.d.ts +2 -2
  27. package/dist/src/packages/aux4io.d.ts +3 -3
  28. package/dist/src/packages/codercom.d.ts +3 -3
  29. package/dist/src/packages/diggerdev.d.ts +3 -3
  30. package/dist/src/packages/getcomposerorg.d.ts +3 -3
  31. package/dist/src/packages/github.com/ggerganov/llama.cpp.d.ts +3 -3
  32. package/dist/src/packages/github.com/router-for-me/CLIProxyAPI.d.ts +3 -3
  33. package/dist/src/packages/grpcio.d.ts +3 -3
  34. package/dist/src/packages/jbangdev.d.ts +3 -3
  35. package/dist/src/packages/libarchiveorg.d.ts +3 -3
  36. package/dist/src/packages/materializecom.d.ts +3 -3
  37. package/dist/src/packages/opencodeai.d.ts +3 -3
  38. package/dist/src/packages/openexrcom.d.ts +3 -3
  39. package/dist/src/packages/pnpmio.d.ts +3 -3
  40. package/dist/src/packages/projenio.d.ts +3 -3
  41. package/dist/src/packages/spacetimedbcom.d.ts +2 -2
  42. package/dist/src/packages/sqlfluffcom.d.ts +3 -3
  43. package/dist/src/packages/stripecom.d.ts +3 -3
  44. package/dist/src/packages/vclustercom.d.ts +3 -3
  45. package/dist/src/packages/vimorg.d.ts +3 -3
  46. package/dist/src/packages/virtualenvpypaio.d.ts +3 -3
  47. package/dist/src/packages/zookeeperapacheorg.d.ts +1 -1
  48. package/dist/src/testing/index.js +1 -1
  49. package/package.json +1 -1
  50. package/dist/chunk-8p0an7s4.js +0 -1
  51. package/dist/chunk-eq5gx35p.js +0 -1
  52. package/dist/chunk-hc6a67ty.js +0 -1
  53. package/dist/chunk-ksrrd784.js +0 -1
  54. package/dist/chunk-mjdrz996.js +0 -1
  55. package/dist/chunk-r508vt8c.js +0 -531
  56. package/dist/chunk-t5ns33pq.js +0 -1
  57. package/dist/chunk-wwhw2ye4.js +0 -1
package/dist/bin/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{T,B}from"../chunk-r8bxccnt.js";import{a,j,r,h,f,S,J,ye,y,q,A,R,X,ke,ve,n,Z,I,d,ae,z,E,L,O,l,te,Ce,je,Se,ha,fa}from"../chunk-r508vt8c.js";import"../chunk-mgdech8n.js";import"../chunk-8teqa39h.js";import{Sa}from"../chunk-9he46t5k.js";import g from"node:fs";import v from"node:path";import s from"node:process";j();async function se(t="src/pantry"){if(!g.existsSync(t))throw Error(`Pantry directory not found: ${t}. Please run 'bun ./bin/cli.ts update-pantry' first.`);let e=[];function o(i,c=""){let u=g.readdirSync(i,{withFileTypes:!0}),p=v.join(i,"package.yml");if(c&&g.existsSync(p))e.push(c);for(let x of u)if(x.isDirectory()&&!x.name.startsWith(".")){let w=c?`${c}/${x.name}`:x.name,b=v.join(i,x.name);o(b,w)}}return o(t),console.log(`\uD83D\uDCE6 Found ${e.length} packages in local pantry`),e.sort()}async function ce(t=!1){async function e(p){let x=new URL("https://s3.amazonaws.com/dist.tea.xyz/");if(x.searchParams.set("list-type","2"),x.searchParams.set("prefix",""),x.searchParams.set("max-keys","1000"),p)x.searchParams.set("continuation-token",p);let w=await fetch(x.toString());if(!w.ok)throw Error(`Failed to fetch S3 listing: ${w.status}`);let b=await w.text(),U=[],G=b.match(/<Key>([^<]+)<\/Key>/g);if(G)for(let H of G){let _=H.replace(/<Key>([^<]+)<\/Key>/,"$1");U.push({Key:_})}let k=b.includes("<IsTruncated>true</IsTruncated>"),N=b.match(/<NextContinuationToken>([^<]+)<\/NextContinuationToken>/),m=N?N[1]:void 0;return{IsTruncated:k,NextContinuationToken:m,Contents:U}}console.log("Scraping packages from S3 registry...");let o=new Set,i;do{let p=await e(i);for(let x of p.Contents){let w=x.Key,b=w.split("/");if(b.length===0)continue;if(b[0].startsWith(".")||b[0].includes(" ")||w.match(/\.(md|txt|yml|yaml|json)$/i))continue;let U=["darwin","linux","windows"],G=-1;for(let k=1;k<b.length;k++)if(U.includes(b[k])){G=k;break}if(G>0){let k=b.slice(0,G).join("/");if(k.includes("."))o.add(k)}else if(b.length>=2&&b[0].includes(".")&&!b[1].startsWith("v")&&!b[1].match(/^\d/)){let k=`${b[0]}/${b[1]}`;o.add(k)}else if(b.length>=1&&b[0].includes("."))o.add(b[0])}i=p.NextContinuationToken,console.log(`Found ${o.size} packages so far...`)}while(i);let c=Array.from(o).sort(),u=[];for(let p of c){if(!p.includes(".")||p.match(/^[a-z0-9.-]+\.[a-z]{2,}(\/[\w.-]+){0,20}$/i)===null)continue;if(p.endsWith("/README.rst")||p.endsWith("/README")||p.includes("/docs/"))continue;if(p.endsWith("/.pkgroot"))continue;if(["amazon.com/aws","charm.sh","code.videolan.org","crates.io"].includes(p))continue;u.push(p)}return console.log(`\uD83D\uDCE6 Found ${u.length} valid packages in registry`),u}async function le(t,e){let i=`/**
2
+ import{T,B}from"../chunk-dkr3wvjw.js";import{a,j,r,h,f,S,J,ye,y,q,A,R,X,ke,ve,n,Z,I,d,ae,z,E,O,L,l,te,Ce,je,Se,ha,fa}from"../chunk-x2y7f62z.js";import"../chunk-tvtdwcr8.js";import"../chunk-xrxz3107.js";import{Sa}from"../chunk-tfd285s6.js";import g from"node:fs";import v from"node:path";import s from"node:process";j();async function se(t="src/pantry"){if(!g.existsSync(t))throw Error(`Pantry directory not found: ${t}. Please run 'bun ./bin/cli.ts update-pantry' first.`);let e=[];function o(i,c=""){let u=g.readdirSync(i,{withFileTypes:!0}),p=v.join(i,"package.yml");if(c&&g.existsSync(p))e.push(c);for(let x of u)if(x.isDirectory()&&!x.name.startsWith(".")){let w=c?`${c}/${x.name}`:x.name,b=v.join(i,x.name);o(b,w)}}return o(t),console.log(`\uD83D\uDCE6 Found ${e.length} packages in local pantry`),e.sort()}async function ce(t=!1){async function e(p){let x=new URL("https://s3.amazonaws.com/dist.tea.xyz/");if(x.searchParams.set("list-type","2"),x.searchParams.set("prefix",""),x.searchParams.set("max-keys","1000"),p)x.searchParams.set("continuation-token",p);let w=await fetch(x.toString());if(!w.ok)throw Error(`Failed to fetch S3 listing: ${w.status}`);let b=await w.text(),U=[],G=b.match(/<Key>([^<]+)<\/Key>/g);if(G)for(let H of G){let _=H.replace(/<Key>([^<]+)<\/Key>/,"$1");U.push({Key:_})}let k=b.includes("<IsTruncated>true</IsTruncated>"),N=b.match(/<NextContinuationToken>([^<]+)<\/NextContinuationToken>/),m=N?N[1]:void 0;return{IsTruncated:k,NextContinuationToken:m,Contents:U}}console.log("Scraping packages from S3 registry...");let o=new Set,i;do{let p=await e(i);for(let x of p.Contents){let w=x.Key,b=w.split("/");if(b.length===0)continue;if(b[0].startsWith(".")||b[0].includes(" ")||w.match(/\.(md|txt|yml|yaml|json)$/i))continue;let U=["darwin","linux","windows"],G=-1;for(let k=1;k<b.length;k++)if(U.includes(b[k])){G=k;break}if(G>0){let k=b.slice(0,G).join("/");if(k.includes("."))o.add(k)}else if(b.length>=2&&b[0].includes(".")&&!b[1].startsWith("v")&&!b[1].match(/^\d/)){let k=`${b[0]}/${b[1]}`;o.add(k)}else if(b.length>=1&&b[0].includes("."))o.add(b[0])}i=p.NextContinuationToken,console.log(`Found ${o.size} packages so far...`)}while(i);let c=Array.from(o).sort(),u=[];for(let p of c){if(!p.includes(".")||p.match(/^[a-z0-9.-]+\.[a-z]{2,}(\/[\w.-]+){0,20}$/i)===null)continue;if(p.endsWith("/README.rst")||p.endsWith("/README")||p.includes("/docs/"))continue;if(p.endsWith("/.pkgroot"))continue;if(["amazon.com/aws","charm.sh","code.videolan.org","crates.io"].includes(p))continue;u.push(p)}return console.log(`\uD83D\uDCE6 Found ${u.length} valid packages in registry`),u}async function le(t,e){let i=`/**
3
3
  * Constants used throughout the ts-pantry package
4
4
  * This file is auto-generated from ${e}. Do not edit manually.
5
5
  * Generated on ${new Date().toISOString()}
@@ -52,7 +52,7 @@ ${t.map((c)=>` '${c}',`).join(`
52
52
  `)}
53
53
  ] as const
54
54
  `;g.writeFileSync("src/consts.ts",i,"utf-8")}function pe(t){if(!t)return;let o=t.toLowerCase().replace(/_/g,"-").match(/^(darwin|macos|linux|windows|win32)-(x86-64|x64|amd64|aarch64|arm64)$/),i=o?.[1],c=o?.[2],u=i==="macos"||i==="darwin"?"darwin":i==="linux"?"linux":i==="windows"||i==="win32"?"windows":void 0,p=c==="x64"||c==="x86-64"||c==="amd64"?"x86_64":c==="arm64"||c==="aarch64"?"aarch64":void 0;if(!u||!p)throw Error(`Invalid platform "${t}". Use linux-x86_64, linux-aarch64, macos-x86_64, macos-aarch64, or windows-x86_64.`);return{os:u,arch:p}}var F=new T("ts-pantry"),de=1500000,Q=setTimeout(()=>{console.error("Force exiting after timeout - process may have hung"),s.exit(1)},de);s.on("exit",()=>{clearTimeout(Q)});async function ie(t){console.log(`
55
- Received ${t} signal. Cleaning up resources...`),clearTimeout(Q);try{await d(),console.log("Resources cleaned up. Exiting.")}catch(e){console.error("Error during cleanup:",e)}setTimeout(()=>{console.log("Forcing process exit..."),s.exit(0)},1000)}s.on("SIGINT",()=>ie("SIGINT"));s.on("SIGTERM",()=>ie("SIGTERM"));function ne(t){let e={};for(let[o,i]of Object.entries(a))if(typeof i==="string")e[i]=o;return e[t]||t}function oe(t){let e=t.map(ne),o=t.map((i)=>{let c=ne(i);return c===i?i:c});return{friendlyNames:e,mixedNames:o}}F.command("fetch [packageName]","Fetch package information from pkgx.dev").option("-a, --all","Fetch all packages").option("-p, --pkg <packageNames>","Comma-separated list of package names to fetch").option("-o, --output-dir <dir>","Directory to save package data",{default:"src/packages"}).option("-c, --cache-dir <dir>","Directory to cache package data",{default:r}).option("-n, --no-cache","Disable caching").option("-e, --cache-expiration <minutes>","Cache expiration time in minutes",{default:h}).option("-l, --limit <count>","Limit the number of packages to fetch (use with --all)").option("-t, --timeout <ms>","Timeout for network requests in milliseconds",{default:f}).option("-r, --max-retries <count>","Maximum number of retry attempts for failed requests",{default:3}).option("-j, --json","Save as JSON instead of TypeScript").option("-d, --debug","Enable debug mode (save screenshots)").option("-v, --verbose","Enable verbose output").option("-y, --concurrency <count>","Number of packages to fetch concurrently (default: 8)",{default:8}).option("--output-json","Output results as JSON (for CI integration)").action(async(t,e)=>{let{all:o,outputDir:i="src/packages",cacheDir:c=r,cache:u=!0,cacheExpiration:p=h,limit:x,timeout:w=f,json:b=!1,debug:U=!1,verbose:G=!1,concurrency:k=8,pkg:N,outputJson:m=!1}=e,H=v.resolve(s.cwd(),i);if(!g.existsSync(H))g.mkdirSync(H,{recursive:!0});let _=v.resolve(s.cwd(),c);if(u){if(!g.existsSync(_))g.mkdirSync(_,{recursive:!0})}try{let P=[],M=[];if(o){if(!m)console.log("Fetching all packages...");let D={outputDir:i,cacheDir:c,cache:u,cacheExpirationMinutes:p,timeout:Number.parseInt(String(w),10),debug:U,limit:x?Number.parseInt(String(x),10):void 0,concurrency:Math.min(Number.parseInt(String(k),10),12),outputJson:m};P=await ae(D),M=[...P]}else if(N){let D=N.split(",").map((C)=>C.trim());if(!m)console.log(`Fetching ${D.length} packages: ${D.join(", ")}`);for(let C of D)try{let K=v.join(c,`${C.replace(/\//g,"-")}.json`),W=!1;if(u&&g.existsSync(K)){let V=g.statSync(K),Y=(Date.now()-V.mtime.getTime())/60000;if(Y<p){if(!m)console.log(`Using cached data for ${C} (age: ${Math.round(Y)} minutes)`);try{let ee=JSON.parse(g.readFileSync(K,"utf-8"));delete ee.fetchedAt;let re=n(i,C,ee);if(G&&!m)console.log(`Using cached data for ${C} (saved to ${re})`);P.push(C),W=!0;continue}catch{console.warn(`Cache file corrupted for ${C}, will refetch`)}}}if(!W){let V=await z(C,{timeout:Number.parseInt(String(w),10),debug:U,outputJson:m,cacheDir:c,cache:u,cacheExpirationMinutes:p});if(V){let{outputPath:Y}=I(C,V.packageInfo,{cacheDir:c,outputDir:i,cache:u});if(P.push(C),M.push(C),G&&!m)console.log(`Successfully saved ${C} to ${Y}`)}}}catch(K){console.error(`Error processing ${C}:`,K)}}else if(t){if(!m)console.log(`Fetching package: ${t}`);try{let D=v.join(_,`${t.replace(/\//g,"-")}.json`),C=!1;if(u&&g.existsSync(D)){let K=g.statSync(D),W=(Date.now()-K.mtime.getTime())/60000;if(W<p){if(!m)console.log(`Using cached data for ${t} (age: ${Math.round(W)} minutes)`);try{let V=JSON.parse(g.readFileSync(D,"utf-8"));delete V.fetchedAt;let Y=n(H,t,V);if(G&&!m)console.log(`Using cached data for ${t} (saved to ${Y})`);P.push(t),C=!0}catch{console.warn(`Cache file corrupted for ${t}, will refetch`)}}}if(!C){let K=await z(t,{timeout:Number.parseInt(String(w),10),debug:U,outputJson:m,cacheDir:c,cache:u,cacheExpirationMinutes:p});if(K){let{outputPath:W}=I(t,K.packageInfo,{cacheDir:c,outputDir:i,cache:u});if(P.push(t),M.push(t),G&&!m)console.log(`Successfully saved ${t} to ${W}`)}}}catch(D){console.error(`Error processing ${t}:`,D)}}else{if(!m)console.error("Error: Please specify a package name, use --pkg, or use --all");s.exit(1)}if(!b&&P.length>0){let D=await E();if(!m)console.log(`Successfully generated ${D}`)}if(o&&P.length>0){let D=Z(H,P);if(D.length>0&&!m)console.log(`Cleaned up ${D.length} stale generated file(s)`)}if(m){let{friendlyNames:D,mixedNames:C}=oe(M),{friendlyNames:K,mixedNames:W}=oe(P),V={success:!0,updatedPackages:M,updatedPackagesFriendly:D,updatedPackagesMixed:C,allProcessedPackages:P,allProcessedFriendly:K,allProcessedMixed:W,totalUpdated:M.length,totalProcessed:P.length,timestamp:new Date().toISOString()};console.log(JSON.stringify(V))}else console.log(`Processed ${P.length} packages.`);clearTimeout(Q),await d(),setTimeout(()=>s.exit(0),1000)}catch(P){if(m){let M={success:!1,error:String(P),timestamp:new Date().toISOString()};console.log(JSON.stringify(M))}else console.error("Error:",P);await d(),setTimeout(()=>s.exit(1),1000)}});F.command("generate-index","Generate TypeScript index file for packages").option("-o, --output-dir <dir>","Directory containing package files",{default:"src/packages"}).action(async(t)=>{let{outputDir:e="src/packages"}=t,o=v.resolve(s.cwd(),e);if(!g.existsSync(o))console.error(`Error: Directory ${o} does not exist`),s.exit(1);try{let i=await E();console.log(`Successfully generated ${i}`),setTimeout(()=>s.exit(0),500)}catch(i){console.error("Error generating index:",i),s.exit(1)}});F.command("generate-ts","Generate TypeScript files from cached JSON files").option("--cache-dir <dir>","Directory with cached JSON files",{default:r}).option("--output-dir <dir>","Output directory for TypeScript files",{default:"packages"}).action(async(t)=>{try{console.log("Generating TypeScript files from cached JSON...");let{cacheDir:e,outputDir:o}=t;if(!g.existsSync(e))console.error(`Cache directory ${e} does not exist!`),s.exit(1);if(!g.existsSync(o))g.mkdirSync(o,{recursive:!0});let i=g.readdirSync(e).filter((u)=>u.endsWith(".json"));console.log(`Found ${i.length} JSON files in cache directory`);let c=0;for(let u of i)try{let p=g.readFileSync(v.join(e,u),"utf-8"),x=JSON.parse(p);delete x.fetchedAt;let w=u.replace(/\.json$/,""),b=n(o,x.fullPath||x.domain||w,x);console.log(`Generated ${b}`),c++}catch(p){console.error(`Error processing ${u}:`,p)}console.log(`Successfully generated ${c} TypeScript files from JSON cache`)}catch(e){console.error("Error generating TypeScript files:",e),s.exit(1)}});F.command("generate-aliases","Generate TypeScript aliases file for packages").action(async()=>{try{let t=await L();console.log(`Successfully generated ${t}`),setTimeout(()=>s.exit(0),500)}catch(t){console.error("Error generating aliases:",t),s.exit(1)}});F.command("generate-docs","Generate comprehensive BunPress documentation for all packages").option("-o, --output-dir <dir>","Output directory for documentation",{default:"docs"}).action(async(t)=>{try{let{outputDir:e="docs"}=t;await O(e),setTimeout(()=>s.exit(0),500)}catch(e){console.error("Error generating documentation:",e),s.exit(1)}});F.command("update-pantry","Download and extract the latest pantry.tgz file").option("-d, --pantry-dir <dir>","Directory to extract pantry files",{default:"src/pantry"}).action(async(t)=>{try{let{pantryDir:e="src/pantry"}=t,o=v.resolve(s.cwd(),e);console.log("Downloading pantry.tgz...");let i=await fetch("https://s3.amazonaws.com/dist.tea.xyz/pantry.tgz");if(!i.ok)throw Error(`Failed to download pantry.tgz: ${i.statusText}`);let c=await i.arrayBuffer(),u=v.join(s.cwd(),"pantry.tgz");g.writeFileSync(u,new Uint8Array(c)),console.log(`Downloaded ${c.byteLength} bytes`),g.mkdirSync(o,{recursive:!0});let p=v.join(s.cwd(),"temp-pantry"),{spawn:x}=await import("node:child_process");if(g.existsSync(p))g.rmSync(p,{recursive:!0,force:!0});g.mkdirSync(p,{recursive:!0});let w=x("tar",["-xzf",u,"-C",p,"--strip-components=1"],{stdio:"inherit"});await new Promise((k,N)=>{w.on("close",(m)=>{if(m===0)k(m);else N(Error(`tar extraction failed with code ${m}`))}),w.on("error",N)});let b=v.join(p,"projects");if(g.existsSync(b)){let k=g.readdirSync(b),N=0,m=0,H=(_,P)=>{if(!g.existsSync(P))g.mkdirSync(P,{recursive:!0});for(let M of g.readdirSync(_,{withFileTypes:!0})){let D=v.join(_,M.name),C=v.join(P,M.name);if(M.isDirectory())H(D,C);else if(M.name==="package.yml")if(g.existsSync(C))m++;else g.renameSync(D,C),N++;else if(!g.existsSync(C))g.renameSync(D,C)}};console.log(`Merging ${k.length} projects from upstream...`);for(let _ of k){let P=v.join(b,_),M=v.join(o,_);if(g.statSync(P).isDirectory())H(P,M)}console.log(`Merged upstream pantry: ${N} new packages added, ${m} existing preserved`)}else console.log("Warning: No projects directory found in extracted pantry");if(g.unlinkSync(u),g.existsSync(p))g.rmSync(p,{recursive:!0,force:!0});console.log(`
55
+ Received ${t} signal. Cleaning up resources...`),clearTimeout(Q);try{await d(),console.log("Resources cleaned up. Exiting.")}catch(e){console.error("Error during cleanup:",e)}setTimeout(()=>{console.log("Forcing process exit..."),s.exit(0)},1000)}s.on("SIGINT",()=>ie("SIGINT"));s.on("SIGTERM",()=>ie("SIGTERM"));function ne(t){let e={};for(let[o,i]of Object.entries(a))if(typeof i==="string")e[i]=o;return e[t]||t}function oe(t){let e=t.map(ne),o=t.map((i)=>{let c=ne(i);return c===i?i:c});return{friendlyNames:e,mixedNames:o}}F.command("fetch [packageName]","Fetch package information from pkgx.dev").option("-a, --all","Fetch all packages").option("-p, --pkg <packageNames>","Comma-separated list of package names to fetch").option("-o, --output-dir <dir>","Directory to save package data",{default:"src/packages"}).option("-c, --cache-dir <dir>","Directory to cache package data",{default:r}).option("-n, --no-cache","Disable caching").option("-e, --cache-expiration <minutes>","Cache expiration time in minutes",{default:h}).option("-l, --limit <count>","Limit the number of packages to fetch (use with --all)").option("-t, --timeout <ms>","Timeout for network requests in milliseconds",{default:f}).option("-r, --max-retries <count>","Maximum number of retry attempts for failed requests",{default:3}).option("-j, --json","Save as JSON instead of TypeScript").option("-d, --debug","Enable debug mode (save screenshots)").option("-v, --verbose","Enable verbose output").option("-y, --concurrency <count>","Number of packages to fetch concurrently (default: 8)",{default:8}).option("--output-json","Output results as JSON (for CI integration)").action(async(t,e)=>{let{all:o,outputDir:i="src/packages",cacheDir:c=r,cache:u=!0,cacheExpiration:p=h,limit:x,timeout:w=f,json:b=!1,debug:U=!1,verbose:G=!1,concurrency:k=8,pkg:N,outputJson:m=!1}=e,H=v.resolve(s.cwd(),i);if(!g.existsSync(H))g.mkdirSync(H,{recursive:!0});let _=v.resolve(s.cwd(),c);if(u){if(!g.existsSync(_))g.mkdirSync(_,{recursive:!0})}try{let P=[],M=[];if(o){if(!m)console.log("Fetching all packages...");let D={outputDir:i,cacheDir:c,cache:u,cacheExpirationMinutes:p,timeout:Number.parseInt(String(w),10),debug:U,limit:x?Number.parseInt(String(x),10):void 0,concurrency:Math.min(Number.parseInt(String(k),10),12),outputJson:m};P=await ae(D),M=[...P]}else if(N){let D=N.split(",").map((C)=>C.trim());if(!m)console.log(`Fetching ${D.length} packages: ${D.join(", ")}`);for(let C of D)try{let K=v.join(c,`${C.replace(/\//g,"-")}.json`),W=!1;if(u&&g.existsSync(K)){let V=g.statSync(K),Y=(Date.now()-V.mtime.getTime())/60000;if(Y<p){if(!m)console.log(`Using cached data for ${C} (age: ${Math.round(Y)} minutes)`);try{let ee=JSON.parse(g.readFileSync(K,"utf-8"));delete ee.fetchedAt;let re=n(i,C,ee);if(G&&!m)console.log(`Using cached data for ${C} (saved to ${re})`);P.push(C),W=!0;continue}catch{console.warn(`Cache file corrupted for ${C}, will refetch`)}}}if(!W){let V=await z(C,{timeout:Number.parseInt(String(w),10),debug:U,outputJson:m,cacheDir:c,cache:u,cacheExpirationMinutes:p});if(V){let{outputPath:Y}=I(C,V.packageInfo,{cacheDir:c,outputDir:i,cache:u});if(P.push(C),M.push(C),G&&!m)console.log(`Successfully saved ${C} to ${Y}`)}}}catch(K){console.error(`Error processing ${C}:`,K)}}else if(t){if(!m)console.log(`Fetching package: ${t}`);try{let D=v.join(_,`${t.replace(/\//g,"-")}.json`),C=!1;if(u&&g.existsSync(D)){let K=g.statSync(D),W=(Date.now()-K.mtime.getTime())/60000;if(W<p){if(!m)console.log(`Using cached data for ${t} (age: ${Math.round(W)} minutes)`);try{let V=JSON.parse(g.readFileSync(D,"utf-8"));delete V.fetchedAt;let Y=n(H,t,V);if(G&&!m)console.log(`Using cached data for ${t} (saved to ${Y})`);P.push(t),C=!0}catch{console.warn(`Cache file corrupted for ${t}, will refetch`)}}}if(!C){let K=await z(t,{timeout:Number.parseInt(String(w),10),debug:U,outputJson:m,cacheDir:c,cache:u,cacheExpirationMinutes:p});if(K){let{outputPath:W}=I(t,K.packageInfo,{cacheDir:c,outputDir:i,cache:u});if(P.push(t),M.push(t),G&&!m)console.log(`Successfully saved ${t} to ${W}`)}}}catch(D){console.error(`Error processing ${t}:`,D)}}else{if(!m)console.error("Error: Please specify a package name, use --pkg, or use --all");s.exit(1)}if(!b&&P.length>0){let D=await E();if(!m)console.log(`Successfully generated ${D}`)}if(o&&P.length>0){let D=Z(H,P);if(D.length>0&&!m)console.log(`Cleaned up ${D.length} stale generated file(s)`)}if(m){let{friendlyNames:D,mixedNames:C}=oe(M),{friendlyNames:K,mixedNames:W}=oe(P),V={success:!0,updatedPackages:M,updatedPackagesFriendly:D,updatedPackagesMixed:C,allProcessedPackages:P,allProcessedFriendly:K,allProcessedMixed:W,totalUpdated:M.length,totalProcessed:P.length,timestamp:new Date().toISOString()};console.log(JSON.stringify(V))}else console.log(`Processed ${P.length} packages.`);clearTimeout(Q),await d(),setTimeout(()=>s.exit(0),1000)}catch(P){if(m){let M={success:!1,error:String(P),timestamp:new Date().toISOString()};console.log(JSON.stringify(M))}else console.error("Error:",P);await d(),setTimeout(()=>s.exit(1),1000)}});F.command("generate-index","Generate TypeScript index file for packages").option("-o, --output-dir <dir>","Directory containing package files",{default:"src/packages"}).action(async(t)=>{let{outputDir:e="src/packages"}=t,o=v.resolve(s.cwd(),e);if(!g.existsSync(o))console.error(`Error: Directory ${o} does not exist`),s.exit(1);try{let i=await E();console.log(`Successfully generated ${i}`),setTimeout(()=>s.exit(0),500)}catch(i){console.error("Error generating index:",i),s.exit(1)}});F.command("generate-ts","Generate TypeScript files from cached JSON files").option("--cache-dir <dir>","Directory with cached JSON files",{default:r}).option("--output-dir <dir>","Output directory for TypeScript files",{default:"packages"}).action(async(t)=>{try{console.log("Generating TypeScript files from cached JSON...");let{cacheDir:e,outputDir:o}=t;if(!g.existsSync(e))console.error(`Cache directory ${e} does not exist!`),s.exit(1);if(!g.existsSync(o))g.mkdirSync(o,{recursive:!0});let i=g.readdirSync(e).filter((u)=>u.endsWith(".json"));console.log(`Found ${i.length} JSON files in cache directory`);let c=0;for(let u of i)try{let p=g.readFileSync(v.join(e,u),"utf-8"),x=JSON.parse(p);delete x.fetchedAt;let w=u.replace(/\.json$/,""),b=n(o,x.fullPath||x.domain||w,x);console.log(`Generated ${b}`),c++}catch(p){console.error(`Error processing ${u}:`,p)}console.log(`Successfully generated ${c} TypeScript files from JSON cache`)}catch(e){console.error("Error generating TypeScript files:",e),s.exit(1)}});F.command("generate-aliases","Generate TypeScript aliases file for packages").action(async()=>{try{let t=await O();console.log(`Successfully generated ${t}`),setTimeout(()=>s.exit(0),500)}catch(t){console.error("Error generating aliases:",t),s.exit(1)}});F.command("generate-docs","Generate comprehensive BunPress documentation for all packages").option("-o, --output-dir <dir>","Output directory for documentation",{default:"docs"}).action(async(t)=>{try{let{outputDir:e="docs"}=t;await L(e),setTimeout(()=>s.exit(0),500)}catch(e){console.error("Error generating documentation:",e),s.exit(1)}});F.command("update-pantry","Download and extract the latest pantry.tgz file").option("-d, --pantry-dir <dir>","Directory to extract pantry files",{default:"src/pantry"}).action(async(t)=>{try{let{pantryDir:e="src/pantry"}=t,o=v.resolve(s.cwd(),e);console.log("Downloading pantry.tgz...");let i=await fetch("https://s3.amazonaws.com/dist.tea.xyz/pantry.tgz");if(!i.ok)throw Error(`Failed to download pantry.tgz: ${i.statusText}`);let c=await i.arrayBuffer(),u=v.join(s.cwd(),"pantry.tgz");g.writeFileSync(u,new Uint8Array(c)),console.log(`Downloaded ${c.byteLength} bytes`),g.mkdirSync(o,{recursive:!0});let p=v.join(s.cwd(),"temp-pantry"),{spawn:x}=await import("node:child_process");if(g.existsSync(p))g.rmSync(p,{recursive:!0,force:!0});g.mkdirSync(p,{recursive:!0});let w=x("tar",["-xzf",u,"-C",p,"--strip-components=1"],{stdio:"inherit"});await new Promise((k,N)=>{w.on("close",(m)=>{if(m===0)k(m);else N(Error(`tar extraction failed with code ${m}`))}),w.on("error",N)});let b=v.join(p,"projects");if(g.existsSync(b)){let k=g.readdirSync(b),N=0,m=0,H=(_,P)=>{if(!g.existsSync(P))g.mkdirSync(P,{recursive:!0});for(let M of g.readdirSync(_,{withFileTypes:!0})){let D=v.join(_,M.name),C=v.join(P,M.name);if(M.isDirectory())H(D,C);else if(M.name==="package.yml")if(g.existsSync(C))m++;else g.renameSync(D,C),N++;else if(!g.existsSync(C))g.renameSync(D,C)}};console.log(`Merging ${k.length} projects from upstream...`);for(let _ of k){let P=v.join(b,_),M=v.join(o,_);if(g.statSync(P).isDirectory())H(P,M)}console.log(`Merged upstream pantry: ${N} new packages added, ${m} existing preserved`)}else console.log("Warning: No projects directory found in extracted pantry");if(g.unlinkSync(u),g.existsSync(p))g.rmSync(p,{recursive:!0,force:!0});console.log(`
56
56
  Downloading props files from pkgx/pantry GitHub repo...`);let G=await fetch("https://github.com/pkgxdev/pantry/archive/refs/heads/main.tar.gz");if(G.ok){let k=await G.arrayBuffer(),N=v.join(s.cwd(),"pantry-gh.tar.gz"),m=v.join(s.cwd(),"temp-pantry-gh");if(g.writeFileSync(N,new Uint8Array(k)),console.log(`Downloaded GitHub archive: ${(k.byteLength/1024/1024).toFixed(1)} MB`),g.existsSync(m))g.rmSync(m,{recursive:!0,force:!0});g.mkdirSync(m,{recursive:!0});let H=x("tar",["-xzf",N,"-C",m,"--strip-components=1"],{stdio:"inherit"});await new Promise((P,M)=>{H.on("close",(D)=>D===0?P(D):M(Error(`tar failed: ${D}`))),H.on("error",M)});let _=v.join(m,"projects");if(g.existsSync(_)){let P=0,M=0,D=(C,K)=>{if(!g.existsSync(C))return;for(let W of g.readdirSync(C,{withFileTypes:!0})){let V=v.join(C,W.name),Y=v.join(K,W.name);if(W.isDirectory())D(V,Y);else if(W.name!=="package.yml")if(g.mkdirSync(K,{recursive:!0}),g.copyFileSync(V,Y),g.existsSync(Y))M++;else P++}};D(_,o),console.log(`Props files: ${P+M} synced (${P} new, ${M} updated)`)}if(g.unlinkSync(N),g.existsSync(m))g.rmSync(m,{recursive:!0,force:!0})}else console.log(`Warning: Could not download GitHub archive (${G.status}), props files will be missing`);if(console.log("Cleaned up temporary files"),g.existsSync(o)){let k=g.readdirSync(o).filter((N)=>{let m=v.join(o,N);return g.statSync(m).isDirectory()&&!N.startsWith(".")});console.log(`Final result: ${k.length} projects in ${o}`)}s.exit(0)}catch(e){console.error("Error updating pantry:",e),s.exit(1)}});F.command("generate-consts","Generate or update the consts.ts file with all known packages").option("-s, --source <source>",'Source for packages: "pantry" (default) or "registry"',{default:"pantry"}).option("--pantry-dir <dir>","Directory containing pantry files",{default:"src/pantry"}).option("--validate","Validate a sample of packages (slower but more accurate)").action(async(t)=>{try{let{source:e="pantry",pantryDir:o="src/pantry",validate:i=!1}=t;console.log(`\uD83D\uDE80 Generating consts.ts file using ${e} as source...`);let c=[];if(e==="pantry")c=await se(o);else if(e==="registry")c=await ce(i);else console.error('Invalid source. Use "pantry" or "registry"'),s.exit(1);await le(c,e),console.log("✅ Successfully updated consts.ts"),console.log(`\uD83D\uDCCA Total packages: ${c.length}`);let u=new Date().toISOString(),p=`Generated from ${e} at ${u}
57
57
  Total packages: ${c.length}
58
58
 
@@ -62,17 +62,17 @@ ${c.join(`
62
62
  Conflicts found:`),k.conflicts.forEach((m)=>{console.log(` ${m.package}: ${m.versions.join(", ")}`)});if(console.log(`
63
63
  \uD83D\uDCCB All unique packages to install:`),k.uniquePackages.forEach((m,H)=>{let _=k.allDependencies.find((M)=>M.name===m),P=_&&_.version&&_.version!=="latest"?` (${_.version})`:"";console.log(` ${H+1}. ${m}${P}`)}),b)console.log(`
64
64
  \uD83D\uDE80 Install command:`),console.log(`pantry install ${k.uniquePackages.join(" ")}`);if(Object.values(k.osSpecificDeps).reduce((m,H)=>m+H.length,0)>0)console.log(`
65
- \uD83D\uDDA5️ OS-specific dependencies:`),Object.entries(k.osSpecificDeps).forEach(([m,H])=>{if(H.length>0)console.log(` ${m}: ${H.map((_)=>_.name).join(", ")}`)})}s.exit(0)}catch(o){if(e.json){let i={success:!1,error:String(o),timestamp:new Date().toISOString()};console.log(JSON.stringify(i))}else console.error("Error resolving dependencies:",o);s.exit(1)}});F.command("get-php-versions","Get PHP versions suitable for CI/CD workflows").option("--format <type>","Output format: json (default), yaml, or csv",{default:"json"}).option("--branches <branches>","Comma-separated list of PHP branches to include (e.g., 8.4,8.3,8.2)").option("--fallback <versions>","Comma-separated list of fallback versions if detection fails").action(async(t)=>{try{let{getPhpVersionsForWorkflow:e}=await import("../chunk-hc6a67ty.js"),o={};if(t.branches)o.supportedBranches=t.branches.split(",").map((c)=>c.trim());if(t.fallback)o.fallbackVersions=t.fallback.split(",").map((c)=>c.trim());let i=e(o);switch(t.format.toLowerCase()){case"yaml":console.log(`php_versions:
65
+ \uD83D\uDDA5️ OS-specific dependencies:`),Object.entries(k.osSpecificDeps).forEach(([m,H])=>{if(H.length>0)console.log(` ${m}: ${H.map((_)=>_.name).join(", ")}`)})}s.exit(0)}catch(o){if(e.json){let i={success:!1,error:String(o),timestamp:new Date().toISOString()};console.log(JSON.stringify(i))}else console.error("Error resolving dependencies:",o);s.exit(1)}});F.command("get-php-versions","Get PHP versions suitable for CI/CD workflows").option("--format <type>","Output format: json (default), yaml, or csv",{default:"json"}).option("--branches <branches>","Comma-separated list of PHP branches to include (e.g., 8.4,8.3,8.2)").option("--fallback <versions>","Comma-separated list of fallback versions if detection fails").action(async(t)=>{try{let{getPhpVersionsForWorkflow:e}=await import("../chunk-64ceqzm1.js"),o={};if(t.branches)o.supportedBranches=t.branches.split(",").map((c)=>c.trim());if(t.fallback)o.fallbackVersions=t.fallback.split(",").map((c)=>c.trim());let i=e(o);switch(t.format.toLowerCase()){case"yaml":console.log(`php_versions:
66
66
  ${i.map((c)=>` - "${c}"`).join(`
67
- `)}`);break;case"csv":console.log(i.join(","));break;case"json":default:console.log(JSON.stringify(i));break}s.exit(0)}catch(e){console.error("Error getting PHP versions:",e),s.exit(1)}});F.command("generate-zig","Generate Zig package definitions from TypeScript packages").option("--packages-dir <dir>","Directory containing TypeScript package files",{default:"src/packages"}).option("--output <file>","Output Zig file path",{default:"packages.zig"}).option("--aliases","Also generate aliases file").option("--aliases-output <file>","Output file for Zig aliases",{default:"aliases.zig"}).action(async(t)=>{try{let{generateZigDefinitions:e,generateZigAliases:o}=await import("../chunk-ksrrd784.js"),{packagesDir:i="src/packages",output:c="packages.zig",aliases:u=!1,aliasesOutput:p="aliases.zig"}=t;if(console.log("\uD83D\uDE80 Generating Zig package definitions..."),await e(i,c),u)console.log(`
67
+ `)}`);break;case"csv":console.log(i.join(","));break;case"json":default:console.log(JSON.stringify(i));break}s.exit(0)}catch(e){console.error("Error getting PHP versions:",e),s.exit(1)}});F.command("generate-zig","Generate Zig package definitions from TypeScript packages").option("--packages-dir <dir>","Directory containing TypeScript package files",{default:"src/packages"}).option("--output <file>","Output Zig file path",{default:"packages.zig"}).option("--aliases","Also generate aliases file").option("--aliases-output <file>","Output file for Zig aliases",{default:"aliases.zig"}).action(async(t)=>{try{let{generateZigDefinitions:e,generateZigAliases:o}=await import("../chunk-m7xtpq1x.js"),{packagesDir:i="src/packages",output:c="packages.zig",aliases:u=!1,aliasesOutput:p="aliases.zig"}=t;if(console.log("\uD83D\uDE80 Generating Zig package definitions..."),await e(i,c),u)console.log(`
68
68
  \uD83D\uDE80 Generating Zig package aliases...`),await o(i,p);console.log(`
69
- ✅ Zig code generation complete!`),s.exit(0)}catch(e){console.error("Error generating Zig definitions:",e),s.exit(1)}});F.command("release [type]","Release a Zig package (changelog, bump, commit, tag, push, publish)").option("-y, --yes","Non-interactive mode (skip confirmation prompts)").option("--dry-run","Preview the release without changing anything").option("--no-changelog","Skip changelog generation").option("--no-push","Skip pushing the commit and tag").option("--no-publish","Skip publishing to the pantry registry").action(async(t,e)=>{let o=(t??"patch").toLowerCase();if(!["patch","minor","major"].includes(o))console.error(`error: invalid release type "${o}" (expected: patch | minor | major)`),s.exit(1);let{runRelease:i}=await import("../chunk-cwa30yjr.js"),c=await i({type:o,yes:e.yes,dryRun:e.dryRun,noChangelog:e.changelog===!1,noPush:e.push===!1,noPublish:e.publish===!1});s.exit(c.exitCode)});F.command("apps","List installed desktop applications with version info").option("-j, --json","Output as JSON").action(async(t)=>{try{let{scanInstalledApps:e}=await import("../chunk-mjdrz996.js"),o=e();if(t.json)console.log(JSON.stringify({success:!0,apps:o,total:o.length}));else{console.log(`
69
+ ✅ Zig code generation complete!`),s.exit(0)}catch(e){console.error("Error generating Zig definitions:",e),s.exit(1)}});F.command("release [type]","Release a Zig package (changelog, bump, commit, tag, push, publish)").option("-y, --yes","Non-interactive mode (skip confirmation prompts)").option("--dry-run","Preview the release without changing anything").option("--no-changelog","Skip changelog generation").option("--no-push","Skip pushing the commit and tag").option("--no-publish","Skip publishing to the pantry registry").action(async(t,e)=>{let o=(t??"patch").toLowerCase();if(!["patch","minor","major"].includes(o))console.error(`error: invalid release type "${o}" (expected: patch | minor | major)`),s.exit(1);let{runRelease:i}=await import("../chunk-cwa30yjr.js"),c=await i({type:o,yes:e.yes,dryRun:e.dryRun,noChangelog:e.changelog===!1,noPush:e.push===!1,noPublish:e.publish===!1});s.exit(c.exitCode)});F.command("apps","List installed desktop applications with version info").option("-j, --json","Output as JSON").action(async(t)=>{try{let{scanInstalledApps:e}=await import("../chunk-ybf3yfq2.js"),o=e();if(t.json)console.log(JSON.stringify({success:!0,apps:o,total:o.length}));else{console.log(`
70
70
  Installed Desktop Apps (${o.length}):
71
- `),console.log("Application".padEnd(40)+"Version"),console.log("-".repeat(60));for(let i of o)console.log(`${i.name.padEnd(40)}${i.version}`)}s.exit(0)}catch(e){console.error("Error listing apps:",e),s.exit(1)}});F.command("apps-outdated","Check for outdated desktop applications").option("-j, --json","Output as JSON").action(async(t)=>{try{let{checkAppUpdates:e}=await import("../chunk-mjdrz996.js");if(!t.json)console.log("Checking desktop apps for updates...");let o=await e(),i=o.filter((c)=>c.updateAvailable);if(t.json)console.log(JSON.stringify({success:!0,apps:o,outdated:i.length,total:o.length,timestamp:new Date().toISOString()}));else{if(i.length>0){console.log(`
71
+ `),console.log("Application".padEnd(40)+"Version"),console.log("-".repeat(60));for(let i of o)console.log(`${i.name.padEnd(40)}${i.version}`)}s.exit(0)}catch(e){console.error("Error listing apps:",e),s.exit(1)}});F.command("apps-outdated","Check for outdated desktop applications").option("-j, --json","Output as JSON").action(async(t)=>{try{let{checkAppUpdates:e}=await import("../chunk-ybf3yfq2.js");if(!t.json)console.log("Checking desktop apps for updates...");let o=await e(),i=o.filter((c)=>c.updateAvailable);if(t.json)console.log(JSON.stringify({success:!0,apps:o,outdated:i.length,total:o.length,timestamp:new Date().toISOString()}));else{if(i.length>0){console.log(`
72
72
  Outdated Apps (${i.length}):
73
73
  `),console.log("Application".padEnd(30)+"Current".padEnd(16)+"Latest".padEnd(16)+"Source"),console.log("-".repeat(75));for(let u of i)console.log(`${u.name.padEnd(30)}${u.currentVersion.padEnd(16)}${(u.latestVersion||"?").padEnd(16)}${u.source}`)}else console.log(`
74
74
  All desktop apps are up to date!`);let c=o.filter((u)=>!u.updateAvailable&&u.source!=="system"&&u.source!=="unknown");if(c.length>0)console.log(`
75
- ${c.length} app(s) up to date, ${o.filter((u)=>u.source==="unknown").length} unchecked`)}s.exit(0)}catch(e){console.error("Error checking app updates:",e),s.exit(1)}});F.command("apps-update <name>","Update a desktop application from the pantry registry").action(async(t)=>{try{let{updateApp:e}=await import("../chunk-mjdrz996.js");console.log(`Updating ${t} from the pantry registry...`);let o=await e(t);if(o.success)console.log(`Successfully updated ${t} to ${o.version}`);else console.error(`Failed to update ${t}: ${o.error}`),s.exit(1);s.exit(0)}catch(e){console.error("Error updating app:",e),s.exit(1)}});F.command("install <pkg>","Install a system package (e.g. ziglang.org@0.17.0-dev)").option("--global","Link binaries into the user-level global bin so they appear on PATH").option("--install-dir <dir>","Where to download into (default: ./pantry)").option("--platform <target>","Install for a target platform (e.g. linux-x86_64)").option("--no-bin-links","Skip creating local .bin/ symlinks").option("--quiet","Suppress progress output").action(async(t,e)=>{let o=t.lastIndexOf("@"),i=o>0,c=i?t.slice(0,o):t,u=i?t.slice(o+1):"latest";try{let p=await q(c,u,{installDir:e.installDir,platform:pe(e.platform),createBinLinks:e.binLinks!==!1,quiet:e.quiet,globalBin:e.global?!0:void 0});if(!e.quiet){if(console.log(`
75
+ ${c.length} app(s) up to date, ${o.filter((u)=>u.source==="unknown").length} unchecked`)}s.exit(0)}catch(e){console.error("Error checking app updates:",e),s.exit(1)}});F.command("apps-update <name>","Update a desktop application from the pantry registry").action(async(t)=>{try{let{updateApp:e}=await import("../chunk-ybf3yfq2.js");console.log(`Updating ${t} from the pantry registry...`);let o=await e(t);if(o.success)console.log(`Successfully updated ${t} to ${o.version}`);else console.error(`Failed to update ${t}: ${o.error}`),s.exit(1);s.exit(0)}catch(e){console.error("Error updating app:",e),s.exit(1)}});F.command("install <pkg>","Install a system package (e.g. ziglang.org@0.17.0-dev)").option("--global","Link binaries into the user-level global bin so they appear on PATH").option("--install-dir <dir>","Where to download into (default: ./pantry)").option("--platform <target>","Install for a target platform (e.g. linux-x86_64)").option("--no-bin-links","Skip creating local .bin/ symlinks").option("--quiet","Suppress progress output").action(async(t,e)=>{let o=t.lastIndexOf("@"),i=o>0,c=i?t.slice(0,o):t,u=i?t.slice(o+1):"latest";try{let p=await q(c,u,{installDir:e.installDir,platform:pe(e.platform),createBinLinks:e.binLinks!==!1,quiet:e.quiet,globalBin:e.global?!0:void 0});if(!e.quiet){if(console.log(`
76
76
  ✓ ${p.name}@${p.version}`),console.log(` installed to: ${p.installPath}`),p.globalLinks&&p.globalLinks.length>0){if(console.log(` linked into: ${v.dirname(p.globalLinks[0])}`),!s.env.PATH?.split(v.delimiter).includes(v.dirname(p.globalLinks[0])))console.log(`
77
77
  ⚠ ${v.dirname(p.globalLinks[0])} is not on your PATH yet.`),console.log(" Run `ts-pantry shell-init --install` once to fix that.")}}s.exit(0)}catch(p){console.error(`Error installing ${t}:`,p instanceof Error?p.message:p),s.exit(1)}});function ue(t){let e=ye(t);if(e.length===0)return[];try{return S(e[0]).map((o)=>o.version&&o.version!=="latest"?`${o.name}@${String(o.version).replace(/^[\^~>=<]+/,"")}`:o.name)}catch{return[]}}F.command("env","Print the environment pantry-installed packages need, for a program to consume").option("--json","Print JSON instead of shell assignments").option("--dir <path>","A project directory, whose dependency file is included (default: cwd)").option("--install","Install anything the dependency file names that is missing").action(async(t)=>{let e=v.resolve(t.dir??s.cwd()),o=ue(e);if(t.install&&o.length>0)for(let u of o){let p=u.lastIndexOf("@"),x=p>0;await q(x?u.slice(0,p):u,x?u.slice(p+1):"latest",{globalBin:!0,quiet:!0}).catch((w)=>{console.error(`# could not install ${u}: ${w instanceof Error?w.message:w}`)})}let i=y(),c=[v.join(e,".bin"),i].filter((u)=>g.existsSync(u));if(t.json)console.log(JSON.stringify({path:c,PATH:[...c,s.env.PATH??""].filter(Boolean).join(v.delimiter),dependencies:o,globalBin:i},null,2)),s.exit(0);console.log(`export PATH="${[...c,"$PATH"].join(v.delimiter)}"`),s.exit(0)});F.command("shell-init","Print the shell snippet that puts pantry-installed packages on PATH").option("--install","Append the snippet to your shell rc file (idempotent)").option("--uninstall","Remove a previously installed snippet").option("--shell <shell>","Force a shell (zsh|bash|fish) instead of autodetect").action(async(t)=>{let e=t.shell??A();try{if(t.uninstall){let i=ve({shell:e});console.log(i.changed?`✓ Removed pantry shell-init from ${i.rcFile}`:`Nothing to remove (no pantry shell-init block in ${i.rcFile})`),s.exit(0)}if(t.install){let i=ke({shell:e});if(i.changed)console.log(`✓ Added pantry shell-init to ${i.rcFile}`),console.log(` Restart your shell or run: source ${i.rcFile}`);else console.log(`✓ Already integrated in ${i.rcFile}`);s.exit(0)}let o=R(e);if(s.stdout.isTTY){if(console.log(`# Detected shell: ${e}`),console.log(`# Global bin dir: ${y()}`),o)console.log(`# Append this to: ${o}`);console.log("# Or run: ts-pantry shell-init --install"),console.log()}s.stdout.write(X({shell:e})),s.exit(0)}catch(o){console.error("Error:",o instanceof Error?o.message:o),s.exit(1)}});F.command("build [context]","Build a Dockerfile into an OCI image (no Docker daemon required)").option("-f, --file <path>","Path to the Dockerfile (default: <context>/Dockerfile)").option("-t, --tag <tag>","Image tag, e.g. myapp:latest (repeatable)").option("--target <stage>","Target stage for a multi-stage build").option("--build-arg <kv>","Set a build arg KEY=VALUE (repeatable)").option("--platform <os/arch>","Target platform (default: linux/<host-arch>)").option("--output <dir>","Where to write the image archive + OCI layout (default: <context>/.pantry/images)").option("--run-mode <mode>","How to run RUN steps: auto|chroot|host|skip (default: auto)").option("--push","Push the built image to the pantry registry after building").option("--quiet","Suppress step output").action(async(t,e)=>{try{let o=[].concat(e.tag??[]),i={};for(let u of[].concat(e.buildArg??[])){let p=u.indexOf("=");if(p!==-1)i[u.slice(0,p)]=u.slice(p+1)}let c=await je({context:t??".",dockerfile:e.file,tags:o,target:e.target,buildArgs:i,platform:e.platform,outputDir:e.output,runMode:e.runMode,quiet:e.quiet});if(!e.quiet){if(console.log(`
78
78
  ✓ Built ${c.imageId}`),o.length)console.log(` tags: ${o.join(", ")}`);console.log(` archive: ${c.archivePath}`),console.log(` oci layout: ${c.ociLayoutPath}`)}if(e.push){let u=te(o[0]||"app:latest");if(!e.quiet)console.log(`
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bun
2
- import{T,B}from"../chunk-r8bxccnt.js";import"../chunk-8teqa39h.js";import"../chunk-kyakwzhh.js";import{F,Y,ue,Re}from"../chunk-ghf9cbt0.js";import{chmodSync as h,mkdirSync as m,renameSync as v,rmSync as P,writeFileSync as k}from"node:fs";import{homedir as b}from"node:os";import{isAbsolute as S,join as s}from"node:path";var a=(t)=>t.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;");function x(t,e,r){return`<?xml version="1.0" encoding="UTF-8"?>
2
+ import{T,B}from"../chunk-dkr3wvjw.js";import"../chunk-xrxz3107.js";import"../chunk-m0wa29w0.js";import{F,Y,ue,Re}from"../chunk-1e7d8cfn.js";import{chmodSync as h,mkdirSync as m,renameSync as v,rmSync as P,writeFileSync as k}from"node:fs";import{homedir as b}from"node:os";import{isAbsolute as S,join as s}from"node:path";var a=(t)=>t.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;");function x(t,e,r){return`<?xml version="1.0" encoding="UTF-8"?>
3
3
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
4
  <plist version="1.0"><dict>
5
5
  <key>Label</key><string>dev.pantry.desktop</string>
@@ -1,2 +1,2 @@
1
- import{ge}from"./chunk-8teqa39h.js";import{Le}from"./chunk-kyakwzhh.js";import{createHash as U,randomBytes as H,randomInt as N,timingSafeEqual as q}from"node:crypto";import{chmodSync as G,existsSync as O,lstatSync as J,mkdirSync as M,readFileSync as _,renameSync as V,writeFileSync as W}from"node:fs";import{homedir as z}from"node:os";import{isAbsolute as X,join as h}from"node:path";var v=(r)=>U("sha256").update(r).digest("hex"),Z=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;function F(){return h(process.env.XDG_DATA_HOME||h(z(),".local/share"),"pantry/desktop")}function Y(r){M(r,{recursive:!0,mode:448});let n=J(r);if(n.isSymbolicLink()||!n.isDirectory()||process.getuid&&n.uid!==process.getuid()||n.mode&63)throw Error("Pantry Desktop state must be an owner-only directory")}function T(r){let n=J(r);if(!n.isFile()||n.isSymbolicLink()||n.nlink!==1||n.size>40000000||process.getuid&&n.uid!==process.getuid()||n.mode&63)throw Error("Pantry Desktop state must be an owner-only file");return JSON.parse(_(r,"utf8"))}function A(r,n){let d=`${r}.${crypto.randomUUID()}.tmp`;W(d,JSON.stringify(n),{mode:384,flag:"wx"}),V(d,r),G(r,384)}function ue(r=F(),n=Date.now()){Y(r);let d=String(N(1e7,1e8));return A(h(r,"pairing.json"),{hash:v(d),expiresAt:n+300000}),d}function B(r,n){return/^[a-f0-9]{64}$/.test(r)&&/^[a-f0-9]{64}$/.test(n)&&q(Buffer.from(r,"hex"),Buffer.from(n,"hex"))}function w(r){let{clientId:n,...d}=r;return d}function Ct(r){if(process.platform!=="darwin")return[];let n=(s)=>s.toLowerCase().replace(/[^a-z0-9]/g,""),d=new Map(r.filter((s)=>s.kind==="app").map((s)=>[n(s.name),s.domain]));return["/Applications",h(z(),"Applications")].flatMap((s)=>ge(s)).flatMap((s)=>{let a=d.get(n(s.name));return a?[{name:a,version:s.version,applicationPath:s.path}]:[]})}function Re(r={}){let n=r.now??Date.now,d=r.stateDirectory??F();Y(d);let s=h(d,"state.json"),a=O(s)?T(s):{clients:[],jobs:[]};if(!Array.isArray(a.clients)||!Array.isArray(a.jobs))throw Error("Invalid Pantry Desktop state");let m=()=>A(s,a);for(let e of a.jobs)if(e.status==="queued"||e.status==="running")e.status="failed",e.error="Pantry restarted before this installation completed. Check installed packages before retrying.",e.finishedAt=new Date(n()).toISOString(),e.timezoneOffset=new Date(n()).getTimezoneOffset();m();let E=r.catalog??Le(),D=new Map(E.map((e)=>[e.domain,e])),P=r.pantryExecutable??Bun.which("pantry");if(!r.run&&(!P||!X(P)))throw Error("Install the Pantry CLI before starting its desktop bridge");let I,L=r.run??(async(e,c)=>{let i=Bun.spawn([P,...e],{cwd:d,stdin:"ignore",stdout:"pipe",stderr:"pipe",env:{...process.env,NO_COLOR:"1",CI:"1"}});I=i;let p=async(g)=>{let t=g.getReader(),f=new TextDecoder;try{while(!0){let l=await t.read();if(l.done)break;c(f.decode(l.value,{stream:!0}))}}finally{t.releaseLock()}};try{return await Promise.all([p(i.stdout),p(i.stderr)]),await i.exited}finally{I=void 0}}),S=Promise.resolve(),C=(e,c)=>{let i=S.then(()=>{if(b)throw Error("Pantry Desktop is stopping");return L(e,c)});return S=i.catch(()=>{}),i},k=!1,b=!1,j;async function R(){if(k||b)return;k=!0;try{while(!b){let e=a.jobs.find((i)=>i.status==="queued");if(!e)break;e.status="running",e.startedAt=new Date(n()).toISOString(),m();try{let i=D.get(e.domain).kind,p=await C(["install","--user",...["app","font"].includes(i)?["--kind",i]:[],e.domain],(g)=>{e.output=(e.output+g).slice(-32000)});if(e.status=p===0?"succeeded":"failed",p)e.error=`Pantry installation exited with code ${p}`}catch(i){e.status="failed",e.error=i instanceof Error?i.message:"Pantry installation failed"}let c=new Date(n());e.finishedAt=c.toISOString(),e.timezoneOffset=c.getTimezoneOffset(),m()}}finally{k=!1}}let o=(e,c=200)=>Response.json(e,{status:c,headers:{"cache-control":"no-store"}}),y=[],x=Bun.serve({hostname:"127.0.0.1",port:r.port??46473,maxRequestBodySize:4096,async fetch(e){let c=new URL(e.url);if(e.headers.has("origin")||e.headers.get("host")!==`127.0.0.1:${x.port}`)return o({error:"Forbidden origin or host"},403);if(c.pathname==="/health"&&e.method==="GET")return o({protocolVersion:1,service:"pantry-desktop",capabilities:["install:user","installed","jobs"]});if(c.pathname==="/pair"&&e.method==="POST"){while(y.length&&y[0]<n()-60000)y.shift();if(y.length>=10)return o({error:"Too many pairing attempts. Try again in a minute."},429);y.push(n());let t=await e.json().catch(()=>null);if(!t||typeof t.code!=="string"||!/^\d{8}$/.test(t.code)||typeof t.name!=="string"||!t.name.trim()||t.name.length>80)return o({error:"Provide the pairing code and application name."},422);let f=h(d,"pairing.json");if(!O(f))return o({error:"Create a pairing code from the Pantry CLI first."},401);let l=T(f);if(l.expiresAt<=n()||!B(l.hash,v(t.code)))return o({error:"The Pantry pairing code is invalid or expired."},401);if(a.clients.length>=100)return o({error:"Remove unused Pantry Desktop connections before pairing another app."},409);let u=H(32).toString("base64url");return a.clients.push({id:crypto.randomUUID(),name:t.name.trim(),tokenHash:v(u)}),A(f,{hash:"",expiresAt:0}),m(),o({token:u},201)}let i=e.headers.get("authorization")?.match(/^Bearer ([A-Za-z0-9_-]{43})$/)?.[1],p=i?a.clients.find((t)=>B(t.tokenHash,v(i))):void 0;if(!p)return o({error:"Connect this application to Pantry first."},401);if(c.pathname==="/v1/connection"&&e.method==="DELETE")return a.clients=a.clients.filter((t)=>t.id!==p.id),m(),o({disconnected:!0});if(c.pathname==="/v1/installed"&&e.method==="GET"){let t="";if(await C(["list","--format","json"],(l)=>{if(t.length<4000000)t+=l}))return o({error:"Pantry could not list installed packages."},502);try{let l=JSON.parse(t);if(!Array.isArray(l)||l.some((u)=>typeof u.name!=="string"||typeof u.version!=="string"))throw Error("Invalid installed package list");return o({packages:[...l.map((u)=>({name:u.name,version:u.version})),...r.run?[]:Ct(E)]})}catch{return o({error:"Pantry returned an invalid installed package list."},502)}}if(c.pathname==="/v1/install"&&e.method==="POST"){let t=await e.json().catch(()=>null);if(!t||typeof t.domain!=="string"||!D.has(t.domain)||typeof t.requestId!=="string"||!Z.test(t.requestId))return o({error:"Choose a package from the Pantry catalog and provide a request ID."},422);let f=a.jobs.find((u)=>u.clientId===p.id&&u.requestId===t.requestId);if(f)return f.domain===t.domain?o({job:w(f)},202):o({error:"This request ID already belongs to another package."},409);if(a.jobs.filter((u)=>u.status==="queued"||u.status==="running").length>=3)return o({error:"Wait for current Pantry installations to finish."},429);let l={id:crypto.randomUUID(),requestId:t.requestId,clientId:p.id,domain:t.domain,kind:D.get(t.domain).kind,status:"queued",output:"",createdAt:new Date(n()).toISOString()};if(a.jobs.push(l),a.jobs.length>1000)a.jobs.splice(0,a.jobs.length-1000);if(m(),!k)j=R();return o({job:w(l)},202)}if(c.pathname==="/v1/jobs"&&e.method==="GET")return o({jobs:a.jobs.filter((t)=>t.clientId===p.id).slice(-50).reverse().map(w)});let g=c.pathname.match(/^\/v1\/jobs\/([a-f0-9-]{36})$/i);if(g&&e.method==="GET"){let t=a.jobs.find((f)=>f.id===g[1]&&f.clientId===p.id);return t?o({job:w(t)}):o({error:"Pantry installation was not found."},404)}return o({error:"Not found"},404)},error(){return o({error:"Pantry Desktop could not complete this request."},500)}});return{server:x,async close(){b=!0,I?.kill(),await j,await S,await x.stop(!0)}}}
2
- export{F,Y,ue,Ct,Re};
1
+ import{ge}from"./chunk-xrxz3107.js";import{Oe}from"./chunk-m0wa29w0.js";import{createHash as U,randomBytes as H,randomInt as N,timingSafeEqual as q}from"node:crypto";import{chmodSync as G,existsSync as O,lstatSync as J,mkdirSync as M,readFileSync as _,renameSync as V,writeFileSync as W}from"node:fs";import{homedir as z}from"node:os";import{isAbsolute as X,join as h}from"node:path";var v=(r)=>U("sha256").update(r).digest("hex"),Z=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i;function F(){return h(process.env.XDG_DATA_HOME||h(z(),".local/share"),"pantry/desktop")}function Y(r){M(r,{recursive:!0,mode:448});let n=J(r);if(n.isSymbolicLink()||!n.isDirectory()||process.getuid&&n.uid!==process.getuid()||n.mode&63)throw Error("Pantry Desktop state must be an owner-only directory")}function T(r){let n=J(r);if(!n.isFile()||n.isSymbolicLink()||n.nlink!==1||n.size>40000000||process.getuid&&n.uid!==process.getuid()||n.mode&63)throw Error("Pantry Desktop state must be an owner-only file");return JSON.parse(_(r,"utf8"))}function A(r,n){let d=`${r}.${crypto.randomUUID()}.tmp`;W(d,JSON.stringify(n),{mode:384,flag:"wx"}),V(d,r),G(r,384)}function ue(r=F(),n=Date.now()){Y(r);let d=String(N(1e7,1e8));return A(h(r,"pairing.json"),{hash:v(d),expiresAt:n+300000}),d}function B(r,n){return/^[a-f0-9]{64}$/.test(r)&&/^[a-f0-9]{64}$/.test(n)&&q(Buffer.from(r,"hex"),Buffer.from(n,"hex"))}function w(r){let{clientId:n,...d}=r;return d}function jt(r){if(process.platform!=="darwin")return[];let n=(s)=>s.toLowerCase().replace(/[^a-z0-9]/g,""),d=new Map(r.filter((s)=>s.kind==="app").map((s)=>[n(s.name),s.domain]));return["/Applications",h(z(),"Applications")].flatMap((s)=>ge(s)).flatMap((s)=>{let a=d.get(n(s.name));return a?[{name:a,version:s.version,applicationPath:s.path}]:[]})}function Re(r={}){let n=r.now??Date.now,d=r.stateDirectory??F();Y(d);let s=h(d,"state.json"),a=O(s)?T(s):{clients:[],jobs:[]};if(!Array.isArray(a.clients)||!Array.isArray(a.jobs))throw Error("Invalid Pantry Desktop state");let m=()=>A(s,a);for(let e of a.jobs)if(e.status==="queued"||e.status==="running")e.status="failed",e.error="Pantry restarted before this installation completed. Check installed packages before retrying.",e.finishedAt=new Date(n()).toISOString(),e.timezoneOffset=new Date(n()).getTimezoneOffset();m();let E=r.catalog??Oe(),D=new Map(E.map((e)=>[e.domain,e])),P=r.pantryExecutable??Bun.which("pantry");if(!r.run&&(!P||!X(P)))throw Error("Install the Pantry CLI before starting its desktop bridge");let I,L=r.run??(async(e,c)=>{let i=Bun.spawn([P,...e],{cwd:d,stdin:"ignore",stdout:"pipe",stderr:"pipe",env:{...process.env,NO_COLOR:"1",CI:"1"}});I=i;let p=async(g)=>{let t=g.getReader(),f=new TextDecoder;try{while(!0){let l=await t.read();if(l.done)break;c(f.decode(l.value,{stream:!0}))}}finally{t.releaseLock()}};try{return await Promise.all([p(i.stdout),p(i.stderr)]),await i.exited}finally{I=void 0}}),S=Promise.resolve(),C=(e,c)=>{let i=S.then(()=>{if(b)throw Error("Pantry Desktop is stopping");return L(e,c)});return S=i.catch(()=>{}),i},k=!1,b=!1,j;async function R(){if(k||b)return;k=!0;try{while(!b){let e=a.jobs.find((i)=>i.status==="queued");if(!e)break;e.status="running",e.startedAt=new Date(n()).toISOString(),m();try{let i=D.get(e.domain).kind,p=await C(["install","--user",...["app","font"].includes(i)?["--kind",i]:[],e.domain],(g)=>{e.output=(e.output+g).slice(-32000)});if(e.status=p===0?"succeeded":"failed",p)e.error=`Pantry installation exited with code ${p}`}catch(i){e.status="failed",e.error=i instanceof Error?i.message:"Pantry installation failed"}let c=new Date(n());e.finishedAt=c.toISOString(),e.timezoneOffset=c.getTimezoneOffset(),m()}}finally{k=!1}}let o=(e,c=200)=>Response.json(e,{status:c,headers:{"cache-control":"no-store"}}),y=[],x=Bun.serve({hostname:"127.0.0.1",port:r.port??46473,maxRequestBodySize:4096,async fetch(e){let c=new URL(e.url);if(e.headers.has("origin")||e.headers.get("host")!==`127.0.0.1:${x.port}`)return o({error:"Forbidden origin or host"},403);if(c.pathname==="/health"&&e.method==="GET")return o({protocolVersion:1,service:"pantry-desktop",capabilities:["install:user","installed","jobs"]});if(c.pathname==="/pair"&&e.method==="POST"){while(y.length&&y[0]<n()-60000)y.shift();if(y.length>=10)return o({error:"Too many pairing attempts. Try again in a minute."},429);y.push(n());let t=await e.json().catch(()=>null);if(!t||typeof t.code!=="string"||!/^\d{8}$/.test(t.code)||typeof t.name!=="string"||!t.name.trim()||t.name.length>80)return o({error:"Provide the pairing code and application name."},422);let f=h(d,"pairing.json");if(!O(f))return o({error:"Create a pairing code from the Pantry CLI first."},401);let l=T(f);if(l.expiresAt<=n()||!B(l.hash,v(t.code)))return o({error:"The Pantry pairing code is invalid or expired."},401);if(a.clients.length>=100)return o({error:"Remove unused Pantry Desktop connections before pairing another app."},409);let u=H(32).toString("base64url");return a.clients.push({id:crypto.randomUUID(),name:t.name.trim(),tokenHash:v(u)}),A(f,{hash:"",expiresAt:0}),m(),o({token:u},201)}let i=e.headers.get("authorization")?.match(/^Bearer ([A-Za-z0-9_-]{43})$/)?.[1],p=i?a.clients.find((t)=>B(t.tokenHash,v(i))):void 0;if(!p)return o({error:"Connect this application to Pantry first."},401);if(c.pathname==="/v1/connection"&&e.method==="DELETE")return a.clients=a.clients.filter((t)=>t.id!==p.id),m(),o({disconnected:!0});if(c.pathname==="/v1/installed"&&e.method==="GET"){let t="";if(await C(["list","--format","json"],(l)=>{if(t.length<4000000)t+=l}))return o({error:"Pantry could not list installed packages."},502);try{let l=JSON.parse(t);if(!Array.isArray(l)||l.some((u)=>typeof u.name!=="string"||typeof u.version!=="string"))throw Error("Invalid installed package list");return o({packages:[...l.map((u)=>({name:u.name,version:u.version})),...r.run?[]:jt(E)]})}catch{return o({error:"Pantry returned an invalid installed package list."},502)}}if(c.pathname==="/v1/install"&&e.method==="POST"){let t=await e.json().catch(()=>null);if(!t||typeof t.domain!=="string"||!D.has(t.domain)||typeof t.requestId!=="string"||!Z.test(t.requestId))return o({error:"Choose a package from the Pantry catalog and provide a request ID."},422);let f=a.jobs.find((u)=>u.clientId===p.id&&u.requestId===t.requestId);if(f)return f.domain===t.domain?o({job:w(f)},202):o({error:"This request ID already belongs to another package."},409);if(a.jobs.filter((u)=>u.status==="queued"||u.status==="running").length>=3)return o({error:"Wait for current Pantry installations to finish."},429);let l={id:crypto.randomUUID(),requestId:t.requestId,clientId:p.id,domain:t.domain,kind:D.get(t.domain).kind,status:"queued",output:"",createdAt:new Date(n()).toISOString()};if(a.jobs.push(l),a.jobs.length>1000)a.jobs.splice(0,a.jobs.length-1000);if(m(),!k)j=R();return o({job:w(l)},202)}if(c.pathname==="/v1/jobs"&&e.method==="GET")return o({jobs:a.jobs.filter((t)=>t.clientId===p.id).slice(-50).reverse().map(w)});let g=c.pathname.match(/^\/v1\/jobs\/([a-f0-9-]{36})$/i);if(g&&e.method==="GET"){let t=a.jobs.find((f)=>f.id===g[1]&&f.clientId===p.id);return t?o({job:w(t)}):o({error:"Pantry installation was not found."},404)}return o({error:"Not found"},404)},error(){return o({error:"Pantry Desktop could not complete this request."},500)}});return{server:x,async close(){b=!0,I?.kill(),await j,await S,await x.stop(!0)}}}
2
+ export{F,Y,ue,jt,Re};
@@ -0,0 +1 @@
1
+ import{V,K,At,Ka,Ne,u,H,Fe,It,he,Ye,fe,W,Be,zt}from"./chunk-x2y7f62z.js";export{Be as compareVersionsDesc,Ye as getActivePackages,K as getAvailableVersions,V as getLatestVersion,u as getPackageInfo,It as getPackagesByPattern,At as getPhpVersionsForWorkflow,he as getPopularPackages,Ka as isVersionAvailable,W as parseVersion,H as resolvePackageDomain,Ne as resolveVersion,zt as resolveVersionFromMetadata,Fe as searchPackages,fe as validatePackageSpec};
@@ -0,0 +1 @@
1
+ import{xe,we,Xe,Pe,ot,st,Ue,i,nt,rt,Q,Qe,it,ct,lt}from"./chunk-x2y7f62z.js";export{rt as convertDomainToFileName,i as convertDomainToVarName,ot as fetchPackageListFromGitHub,Ue as formatObjectWithoutQuotedKeys,lt as getCanonicalDomain,Xe as getGitHubPackageCache,it as getPackageAliases,Q as guessOriginalDomain,ct as isKnownAlias,st as logPkgxProjects,Qe as resolvePackageDomain,Pe as saveGitHubPackageCache,xe as saveRateLimitInfo,we as shouldProceedWithGitHubRequest,nt as toPropertyKey};
@@ -1,17 +1,17 @@
1
- import{existsSync as je,readFileSync as ze}from"node:fs";import{join as Ue,resolve as G,sep as Ge}from"node:path";var po={revision:"e1d6e40100ae2c35c96f9d96ed826f08ddf1f48b",version:"0.0.367"};function Ee(r){let i=r.split(".");return i.length>1&&i.every((o)=>/^[A-Za-z]\w*$/.test(o))}function s(r,i){let o=G(r,i);if(o===G(r)||!o.startsWith(`${G(r)}${Ge}`))throw Error(`Native output must be inside the project: ${i}`);return o}function p(r,i=!1){let o=Ue(r,"pantry.json");if(!je(o)){if(i)throw Error("Native publishing requires pantry.json with a native configuration");return}let n=JSON.parse(ze(o,"utf8")).native;if(!n){if(i)throw Error("pantry.json must declare native app settings");return}if(n.environment!==void 0&&(typeof n.environment!=="string"||!/^[a-z][a-z0-9-]*$/.test(n.environment)))throw Error("Invalid native release environment name");if(n.runtime&&(!/^[a-f0-9]{40}$/.test(n.runtime.revision)||!/^\d+\.\d+\.\d+$/.test(n.runtime.version)))throw Error("Craft requires an immutable 40-character Git revision and an exact version");for(let a of[n.build,...n.checks?.before??[],...n.checks?.after??[]])if(a!==void 0&&(!Array.isArray(a)||!a.length||a.some((c)=>typeof c!=="string"||!c)))throw Error("Native commands must be nonempty argument arrays");if(n.macos?.maxBundleSize!==void 0&&(!Number.isSafeInteger(n.macos.maxBundleSize)||n.macos.maxBundleSize<=0))throw Error("maxBundleSize must be a positive byte count");if(n.registry){if(typeof n.registry.domain!=="string"||!/^[a-z0-9](?:[a-z0-9._-]|\/(?=[a-z0-9])){0,213}$/i.test(n.registry.domain)||n.registry.domain.includes("..")||n.registry.domain.endsWith("/"))throw Error("Native registry publishing requires an exact package domain");if(n.registry.url){let a=new URL(n.registry.url);if(a.username||a.password||a.search||a.hash||a.protocol!=="https:"&&!(a.protocol==="http:"&&["127.0.0.1","localhost","[::1]"].includes(a.hostname)))throw Error("Native registry URL must use HTTPS, or HTTP on loopback for testing")}if(!n.macos?.notarize)throw Error("Native registry apps require notarized macOS distribution")}if(n.android){if(s(r,n.android.bundle),!Ee(n.android.packageName)||!n.android.track||!["draft","completed","inProgress"].includes(n.android.status))throw Error("Android publishing requires a package name, track and explicit release status");let a=n.android.userFraction;if(n.android.status==="inProgress"?!(typeof a==="number"&&a>0&&a<1):a!==void 0)throw Error("Only an inProgress rollout requires userFraction between zero and one")}return n}import Me from"node:process";import{spawn as Je}from"node:child_process";var t=(r,i,o={})=>new Promise((n,a)=>{let c=Je(r,i,{cwd:o.cwd,env:o.env??Me.env,stdio:o.inherit?"inherit":[o.input===void 0?"ignore":"pipe","pipe","pipe"]});if(o.input!==void 0)c.stdin?.end(o.input);let u="",l="";c.stdout?.on("data",(f)=>{u+=f.toString()}),c.stderr?.on("data",(f)=>{l+=f.toString()}),c.once("error",a),c.once("close",(f)=>n({exitCode:f??1,stdout:u,stderr:l}))});function e(r,i){if(i.exitCode!==0)throw Error(`${r} failed (${i.exitCode}): ${i.stdout}
2
- ${i.stderr}`.trim());return i}import B from"node:process";import{createHash as He}from"node:crypto";import{existsSync as O,mkdirSync as Xe,readFileSync as q,rmSync as Ze,writeFileSync as Qe}from"node:fs";import{join as P,resolve as et}from"node:path";function $a(r,i,o=B.arch){if(!/^[a-f0-9]{40}$/.test(r))throw Error("Craft revision must be immutable");if(!/^\d+\.\d+(?:\.\d+)?$/.test(i))throw Error("A valid minimum macOS version is required");let n=o==="arm64"?"aarch64":o==="x64"?"x86_64":void 0;if(!n)throw Error(`Unsupported native architecture: ${o}`);return`revision=${r};ReleaseSmall;js-runtime=false;target=${n}-macos.${i}`}function vt(r,i,o=B.arch){if(!r.runtime)throw Error("No Craft runtime configured");return He("sha256").update(`${$a(r.runtime.revision,i,o)};version=${r.runtime.version};schema=1`).digest("hex")}function xt(r){let i=r.workspaces?.[""]?.system?.["ziglang.org"];if(typeof i!=="string"||!/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(i))throw Error("Craft must lock an exact Zig compiler version");return i}function wt(r){if(!O(P(r,"packages/zig/build.zig.zon")))throw Error("Craft dependency manifest is missing");let i=P(r,".github/actions/first-party-zig-deps/pins.env");if(!O(i))return{kind:"manifest"};let o=q(i,"utf8");return{kind:"legacy-pins",sources:[["zig-js","zig_js"],["zig-regex","zig_regex"],["zig-gc","zig_gc"]].map(([a,c])=>{let u=o.match(new RegExp(`^${c}=([a-f0-9]{40})$`,"m"))?.[1];if(!u)throw Error(`Missing upstream dependency pin: ${c}`);return{repository:`zig-utils/${a}`,revision:u,directory:a}})}}async function Ea(r,i,o,n={}){let a=n.env??B.env;if(a.CRAFT_BIN){let E=et(r,a.CRAFT_BIN);if(!O(E))throw Error(`CRAFT_BIN does not exist: ${E}`);return E}if(!i.runtime)return;if(B.platform!=="darwin")throw Error("The configured macOS Craft runtime must be built on macOS");let c=n.command??t,{revision:u,version:l}=i.runtime,f=$a(u,o),y=P(r,".pantry/native/runtimes",vt(i,o)),d=P(y,"Tools/craft"),m=P(d,"packages/zig/zig-out/bin/craft"),h=P(d,".pantry-runtime-profile"),g=async(E,b,w=a,T=!1)=>e(E[0],await c(E[0],E.slice(1),{cwd:b,env:w,inherit:T})),v=async(E,b,w)=>{if(!/^[a-f0-9]{40}$/.test(b))throw Error(`Missing immutable dependency pin: ${E}`);if(Xe(w,{recursive:!0}),!O(P(w,".git")))await g(["git","init","--quiet"],w),await g(["git","remote","add","origin",`https://github.com/${E}.git`],w),await g(["git","fetch","--quiet","--depth","1","origin",b],w),await g(["git","checkout","--quiet","--detach","FETCH_HEAD"],w);let T=(await g(["git","rev-parse","HEAD"],w)).stdout.trim();if(T!==b)throw Error(`Unexpected source revision in ${w}: ${T}`);if((await g(["git","status","--porcelain","--untracked-files=no"],w)).stdout.trim())throw Error(`Modified runtime source in ${w}`)};await v("craft-native/craft",u,d);let _=wt(d);if(_.kind==="legacy-pins")for(let E of _.sources)await v(E.repository,E.revision,P(y,"Libraries",E.directory));if(!O(m)||!O(h)||q(h,"utf8")!==f){Ze(h,{force:!0});let E=JSON.parse(q(P(d,"pantry.lock"),"utf8")),b=xt(E);await g(["pantry","install",`ziglang.org@${b}`,"--no-save","--ignore-scripts"],d,a,!0);let w=P(d,"pantry/ziglang.org",`v${b}`,"bin/zig");if(!O(w))throw Error(`Locked Zig compiler is missing: ${w}`);let T={...a,CRAFT_ZIG:w};if(_.kind==="manifest")await g(["bun","scripts/zig.ts","--core","build","--fetch"],d,T,!0);let z=(await g(["xcrun","--sdk","macosx","--show-sdk-path"],d)).stdout.trim();if(!z)throw Error("The macOS SDK is required");let We=f.split("target=")[1];await g(["bun","scripts/zig.ts","--core","--versioned","build","-Doptimize=ReleaseSmall","-Djs-runtime=false",`-Dtarget=${We}`,`-Dmacos-sdk=${z}`],d,T,!0),Qe(h,f)}let D=await g([m,"--version"],d);if(!`${D.stdout}${D.stderr}`.includes(`craft version ${l}`))throw Error(`Craft does not match configured version ${l}`);return m}import tt from"node:process";import{existsSync as ie,mkdirSync as rt,mkdtempSync as it,readFileSync as nt,rmSync as re,writeFileSync as ne}from"node:fs";import{tmpdir as ot}from"node:os";import{join as K,resolve as st}from"node:path";function J(r){return r.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function Pt(r){let i=(o)=>typeof o==="boolean"?`<${o}/>`:typeof o==="string"?`<string>${J(o)}</string>`:Array.isArray(o)&&o.every((n)=>typeof n==="string")?`<array>${o.map((n)=>`<string>${J(n)}</string>`).join("")}</array>`:(()=>{throw Error("Unsupported entitlement value")})();return`<?xml version="1.0" encoding="UTF-8"?>
1
+ import{existsSync as je,readFileSync as ze}from"node:fs";import{join as Ue,resolve as q,sep as Ge}from"node:path";var go={revision:"e1d6e40100ae2c35c96f9d96ed826f08ddf1f48b",version:"0.0.367"};function Ee(r){let i=r.split(".");return i.length>1&&i.every((o)=>/^[A-Za-z]\w*$/.test(o))}function s(r,i){let o=q(r,i);if(o===q(r)||!o.startsWith(`${q(r)}${Ge}`))throw Error(`Native output must be inside the project: ${i}`);return o}function p(r,i=!1){let o=Ue(r,"pantry.json");if(!je(o)){if(i)throw Error("Native publishing requires pantry.json with a native configuration");return}let n=JSON.parse(ze(o,"utf8")).native;if(!n){if(i)throw Error("pantry.json must declare native app settings");return}if(n.environment!==void 0&&(typeof n.environment!=="string"||!/^[a-z][a-z0-9-]*$/.test(n.environment)))throw Error("Invalid native release environment name");if(n.runtime&&(!/^[a-f0-9]{40}$/.test(n.runtime.revision)||!/^\d+\.\d+\.\d+$/.test(n.runtime.version)))throw Error("Craft requires an immutable 40-character Git revision and an exact version");for(let a of[n.build,...n.checks?.before??[],...n.checks?.after??[]])if(a!==void 0&&(!Array.isArray(a)||!a.length||a.some((c)=>typeof c!=="string"||!c)))throw Error("Native commands must be nonempty argument arrays");if(n.macos?.maxBundleSize!==void 0&&(!Number.isSafeInteger(n.macos.maxBundleSize)||n.macos.maxBundleSize<=0))throw Error("maxBundleSize must be a positive byte count");if(n.registry){if(typeof n.registry.domain!=="string"||!/^[a-z0-9](?:[a-z0-9._-]|\/(?=[a-z0-9])){0,213}$/i.test(n.registry.domain)||n.registry.domain.includes("..")||n.registry.domain.endsWith("/"))throw Error("Native registry publishing requires an exact package domain");if(n.registry.url){let a=new URL(n.registry.url);if(a.username||a.password||a.search||a.hash||a.protocol!=="https:"&&!(a.protocol==="http:"&&["127.0.0.1","localhost","[::1]"].includes(a.hostname)))throw Error("Native registry URL must use HTTPS, or HTTP on loopback for testing")}if(!n.macos?.notarize)throw Error("Native registry apps require notarized macOS distribution")}if(n.android){if(s(r,n.android.bundle),!Ee(n.android.packageName)||!n.android.track||!["draft","completed","inProgress"].includes(n.android.status))throw Error("Android publishing requires a package name, track and explicit release status");let a=n.android.userFraction;if(n.android.status==="inProgress"?!(typeof a==="number"&&a>0&&a<1):a!==void 0)throw Error("Only an inProgress rollout requires userFraction between zero and one")}return n}import Me from"node:process";import{spawn as Je}from"node:child_process";var t=(r,i,o={})=>new Promise((n,a)=>{let c=Je(r,i,{cwd:o.cwd,env:o.env??Me.env,stdio:o.inherit?"inherit":[o.input===void 0?"ignore":"pipe","pipe","pipe"]});if(o.input!==void 0)c.stdin?.end(o.input);let u="",m="";c.stdout?.on("data",(f)=>{u+=f.toString()}),c.stderr?.on("data",(f)=>{m+=f.toString()}),c.once("error",a),c.once("close",(f)=>n({exitCode:f??1,stdout:u,stderr:m}))});function e(r,i){if(i.exitCode!==0)throw Error(`${r} failed (${i.exitCode}): ${i.stdout}
2
+ ${i.stderr}`.trim());return i}import Y from"node:process";import{createHash as He}from"node:crypto";import{existsSync as O,mkdirSync as Xe,readFileSync as J,rmSync as Ze,writeFileSync as Qe}from"node:fs";import{join as A,resolve as et}from"node:path";function $a(r,i,o=Y.arch){if(!/^[a-f0-9]{40}$/.test(r))throw Error("Craft revision must be immutable");if(!/^\d+\.\d+(?:\.\d+)?$/.test(i))throw Error("A valid minimum macOS version is required");let n=o==="arm64"?"aarch64":o==="x64"?"x86_64":void 0;if(!n)throw Error(`Unsupported native architecture: ${o}`);return`revision=${r};ReleaseSmall;js-runtime=false;target=${n}-macos.${i}`}function xt(r,i,o=Y.arch){if(!r.runtime)throw Error("No Craft runtime configured");return He("sha256").update(`${$a(r.runtime.revision,i,o)};version=${r.runtime.version};schema=1`).digest("hex")}function wt(r){let i=r.workspaces?.[""]?.system?.["ziglang.org"];if(typeof i!=="string"||!/^\d+\.\d+\.\d+(?:-[\w.-]+)?(?:\+[\w.-]+)?$/.test(i))throw Error("Craft must lock an exact Zig compiler version");return i}function Pt(r){if(!O(A(r,"packages/zig/build.zig.zon")))throw Error("Craft dependency manifest is missing");let i=A(r,".github/actions/first-party-zig-deps/pins.env");if(!O(i))return{kind:"manifest"};let o=J(i,"utf8");return{kind:"legacy-pins",sources:[["zig-js","zig_js"],["zig-regex","zig_regex"],["zig-gc","zig_gc"]].map(([a,c])=>{let u=o.match(new RegExp(`^${c}=([a-f0-9]{40})$`,"m"))?.[1];if(!u)throw Error(`Missing upstream dependency pin: ${c}`);return{repository:`zig-utils/${a}`,revision:u,directory:a}})}}async function Ea(r,i,o,n={}){let a=n.env??Y.env;if(a.CRAFT_BIN){let E=et(r,a.CRAFT_BIN);if(!O(E))throw Error(`CRAFT_BIN does not exist: ${E}`);return E}if(!i.runtime)return;if(Y.platform!=="darwin")throw Error("The configured macOS Craft runtime must be built on macOS");let c=n.command??t,{revision:u,version:m}=i.runtime,f=$a(u,o),y=A(r,".pantry/native/runtimes",xt(i,o)),d=A(y,"Tools/craft"),l=A(d,"packages/zig/zig-out/bin/craft"),h=A(d,".pantry-runtime-profile"),g=async(E,b,w=a,T=!1)=>e(E[0],await c(E[0],E.slice(1),{cwd:b,env:w,inherit:T})),v=async(E,b,w)=>{if(!/^[a-f0-9]{40}$/.test(b))throw Error(`Missing immutable dependency pin: ${E}`);if(Xe(w,{recursive:!0}),!O(A(w,".git")))await g(["git","init","--quiet"],w),await g(["git","remote","add","origin",`https://github.com/${E}.git`],w),await g(["git","fetch","--quiet","--depth","1","origin",b],w),await g(["git","checkout","--quiet","--detach","FETCH_HEAD"],w);let T=(await g(["git","rev-parse","HEAD"],w)).stdout.trim();if(T!==b)throw Error(`Unexpected source revision in ${w}: ${T}`);if((await g(["git","status","--porcelain","--untracked-files=no"],w)).stdout.trim())throw Error(`Modified runtime source in ${w}`)};await v("craft-native/craft",u,d);let _=Pt(d);if(_.kind==="legacy-pins")for(let E of _.sources)await v(E.repository,E.revision,A(y,"Libraries",E.directory));if(!O(l)||!O(h)||J(h,"utf8")!==f){Ze(h,{force:!0});let E=JSON.parse(J(A(d,"pantry.lock"),"utf8")),b=wt(E);await g(["pantry","install",`ziglang.org@${b}`,"--no-save","--ignore-scripts"],d,a,!0);let w=A(d,"pantry/ziglang.org",`v${b}`,"bin/zig");if(!O(w))throw Error(`Locked Zig compiler is missing: ${w}`);let T={...a,CRAFT_ZIG:w};if(_.kind==="manifest")await g(["bun","scripts/zig.ts","--core","build","--fetch"],d,T,!0);let G=(await g(["xcrun","--sdk","macosx","--show-sdk-path"],d)).stdout.trim();if(!G)throw Error("The macOS SDK is required");let We=f.split("target=")[1];await g(["bun","scripts/zig.ts","--core","--versioned","build","-Doptimize=ReleaseSmall","-Djs-runtime=false",`-Dtarget=${We}`,`-Dmacos-sdk=${G}`],d,T,!0),Qe(h,f)}let K=await g([l,"--version"],d);if(!`${K.stdout}${K.stderr}`.includes(`craft version ${m}`))throw Error(`Craft does not match configured version ${m}`);return l}import tt from"node:process";import{existsSync as ie,mkdirSync as rt,mkdtempSync as it,readFileSync as nt,rmSync as re,writeFileSync as ne}from"node:fs";import{tmpdir as ot}from"node:os";import{join as D,resolve as st}from"node:path";function H(r){return r.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&apos;")}function Ut(r){let i=(o)=>typeof o==="boolean"?`<${o}/>`:typeof o==="string"?`<string>${H(o)}</string>`:Array.isArray(o)&&o.every((n)=>typeof n==="string")?`<array>${o.map((n)=>`<string>${H(n)}</string>`).join("")}</array>`:(()=>{throw Error("Unsupported entitlement value")})();return`<?xml version="1.0" encoding="UTF-8"?>
3
3
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
4
- <plist version="1.0"><dict>${Object.entries(r).map(([o,n])=>`<key>${J(o)}</key>${i(n)}`).join("")}</dict></plist>
5
- `}async function go(r,i={}){let o=p(r),n=i.env??tt.env;if(!o)return{overrides:{},cleanup(){}};let a=await Ea(r,o,i.minimumSystemVersion??"13.0",{env:n}),c=n.PANTRY_DISTRIBUTION==="app-store",u=c?o.macos?.entitlements?.appStore:o.macos?.entitlements?.direct,l=n.APPLE_SIGNING_IDENTITY,f=n.APPLE_PROVISIONING_PROFILE_PATH||n.APPLE_PROVISIONING_PROFILE,y=it(K(ot(),"pantry-native-build-"));try{let d=K(y,"entitlements.plist");if(u)ne(d,Pt(u),{mode:384});if(f&&!ie(f))throw Error("APPLE_PROVISIONING_PROFILE must name a local profile file");if(c&&(!l||!f||u?.["com.apple.security.app-sandbox"]!==!0))throw Error("App Store builds require a signing identity, provisioning profile and sandbox entitlement");return{overrides:{...a?{craftPath:a}:{},...c?{output:s(r,".pantry/native/app-store")}:{},...l?{macosSigning:{identity:l,...f?{provisioningProfile:st(f)}:{},...u?{entitlements:d}:{},hardenedRuntime:!c}}:{}},cleanup(){re(y,{recursive:!0,force:!0})}}}catch(d){throw re(y,{recursive:!0,force:!0}),d}}function mo(r,i){s(r,i.path);let o=K(r,".pantry/native");rt(o,{recursive:!0}),ne(K(o,"artifact.json"),`${JSON.stringify(i,null,2)}
6
- `)}function _e(r){let i=JSON.parse(nt(K(r,".pantry/native/artifact.json"),"utf8"));if(s(r,i.path),!i.name||!i.bundleId||!i.version||!i.buildNumber||!ie(i.path))throw Error("The native build did not produce a complete artifact manifest");return i}import at from"node:process";import{createHash as ct}from"node:crypto";import{existsSync as x,mkdtempSync as oe,readFileSync as se,rmSync as ae,writeFileSync as ce}from"node:fs";import{tmpdir as pe}from"node:os";import{basename as pt,dirname as ut,join as V}from"node:path";import{setTimeout as dt}from"node:timers/promises";function _a(r=at.env){if(r.APPLE_NOTARY_KEYCHAIN_PROFILE)return{keychainProfile:r.APPLE_NOTARY_KEYCHAIN_PROFILE};let i=r.APP_STORE_CONNECT_API_KEY_ID,o=r.APP_STORE_CONNECT_ISSUER_ID||r.APP_STORE_CONNECT_API_ISSUER_ID,n=r.APP_STORE_CONNECT_PRIVATE_KEY||(r.APP_STORE_CONNECT_API_KEY_PATH?se(r.APP_STORE_CONNECT_API_KEY_PATH,"utf8"):void 0);if(i||o||n){if(!i||!o||!n)throw Error("Notarization requires complete App Store Connect API credentials");if(!/^[A-Z0-9]+$/.test(i))throw Error("Invalid App Store Connect API key ID");return{apiKeyId:i,issuerId:o,privateKey:n}}if(r.APPLE_ID&&r.APPLE_APP_SPECIFIC_PASSWORD&&r.APPLE_TEAM_ID)return{appleId:r.APPLE_ID,password:r.APPLE_APP_SPECIFIC_PASSWORD,teamId:r.APPLE_TEAM_ID};throw Error("Notarization requires an existing keychain profile, App Store Connect API key, or Apple ID credentials")}async function Ta(r,i,o=t){if(!x(r)||!r.toLowerCase().endsWith(".dmg")||!i)throw Error("Disk image signing requires an existing DMG and a Developer ID Application identity");e("Sign disk image",await o("codesign",["--force","--sign",i,"--timestamp",r])),e("Disk image signature",await o("codesign",["--verify","--strict",r]));let n=e("Disk image identity",await o("codesign",["-dv","--verbose=4",r])),a=`${n.stdout}
4
+ <plist version="1.0"><dict>${Object.entries(r).map(([o,n])=>`<key>${H(o)}</key>${i(n)}`).join("")}</dict></plist>
5
+ `}async function mo(r,i={}){let o=p(r),n=i.env??tt.env;if(!o)return{overrides:{},cleanup(){}};let a=await Ea(r,o,i.minimumSystemVersion??"13.0",{env:n}),c=n.PANTRY_DISTRIBUTION==="app-store",u=c?o.macos?.entitlements?.appStore:o.macos?.entitlements?.direct,m=n.APPLE_SIGNING_IDENTITY,f=n.APPLE_PROVISIONING_PROFILE_PATH||n.APPLE_PROVISIONING_PROFILE,y=it(D(ot(),"pantry-native-build-"));try{let d=D(y,"entitlements.plist");if(u)ne(d,Ut(u),{mode:384});if(f&&!ie(f))throw Error("APPLE_PROVISIONING_PROFILE must name a local profile file");if(c&&(!m||!f||u?.["com.apple.security.app-sandbox"]!==!0))throw Error("App Store builds require a signing identity, provisioning profile and sandbox entitlement");return{overrides:{...a?{craftPath:a}:{},...c?{output:s(r,".pantry/native/app-store")}:{},...m?{macosSigning:{identity:m,...f?{provisioningProfile:st(f)}:{},...u?{entitlements:d}:{},hardenedRuntime:!c}}:{}},cleanup(){re(y,{recursive:!0,force:!0})}}}catch(d){throw re(y,{recursive:!0,force:!0}),d}}function uo(r,i){s(r,i.path);let o=D(r,".pantry/native");rt(o,{recursive:!0}),ne(D(o,"artifact.json"),`${JSON.stringify(i,null,2)}
6
+ `)}function _e(r){let i=JSON.parse(nt(D(r,".pantry/native/artifact.json"),"utf8"));if(s(r,i.path),!i.name||!i.bundleId||!i.version||!i.buildNumber||!ie(i.path))throw Error("The native build did not produce a complete artifact manifest");return i}import at from"node:process";import{createHash as ct}from"node:crypto";import{existsSync as x,mkdtempSync as oe,readFileSync as se,rmSync as ae,writeFileSync as ce}from"node:fs";import{tmpdir as pe}from"node:os";import{basename as pt,dirname as ut,join as V}from"node:path";import{setTimeout as dt}from"node:timers/promises";function _a(r=at.env){if(r.APPLE_NOTARY_KEYCHAIN_PROFILE)return{keychainProfile:r.APPLE_NOTARY_KEYCHAIN_PROFILE};let i=r.APP_STORE_CONNECT_API_KEY_ID,o=r.APP_STORE_CONNECT_ISSUER_ID||r.APP_STORE_CONNECT_API_ISSUER_ID,n=r.APP_STORE_CONNECT_PRIVATE_KEY||(r.APP_STORE_CONNECT_API_KEY_PATH?se(r.APP_STORE_CONNECT_API_KEY_PATH,"utf8"):void 0);if(i||o||n){if(!i||!o||!n)throw Error("Notarization requires complete App Store Connect API credentials");if(!/^[A-Z0-9]+$/.test(i))throw Error("Invalid App Store Connect API key ID");return{apiKeyId:i,issuerId:o,privateKey:n}}if(r.APPLE_ID&&r.APPLE_APP_SPECIFIC_PASSWORD&&r.APPLE_TEAM_ID)return{appleId:r.APPLE_ID,password:r.APPLE_APP_SPECIFIC_PASSWORD,teamId:r.APPLE_TEAM_ID};throw Error("Notarization requires an existing keychain profile, App Store Connect API key, or Apple ID credentials")}async function Ta(r,i,o=t){if(!x(r)||!r.toLowerCase().endsWith(".dmg")||!i)throw Error("Disk image signing requires an existing DMG and a Developer ID Application identity");e("Sign disk image",await o("codesign",["--force","--sign",i,"--timestamp",r])),e("Disk image signature",await o("codesign",["--verify","--strict",r]));let n=e("Disk image identity",await o("codesign",["-dv","--verbose=4",r])),a=`${n.stdout}
7
7
  ${n.stderr}`;if(!a.includes("Authority=Developer ID Application:")||!/^Timestamp=/m.test(a))throw Error("Disk image requires a timestamped Developer ID Application signature")}async function M(r,i=t){let o=r.toLowerCase().endsWith(".dmg")?["--type","open","--context","context:primary-signature"]:r.toLowerCase().endsWith(".app")?["--type","exec"]:r.toLowerCase().endsWith(".pkg")?["--type","install"]:void 0;if(!x(r)||!o)throw Error("Gatekeeper assessment requires an existing app, DMG or PKG");let n=e("Gatekeeper assessment",await i("spctl",["--assess",...o,"--verbose=2",r]));if(!`${n.stdout}
8
8
  ${n.stderr}`.includes("source=Notarized Developer ID"))throw Error("Gatekeeper did not recognize the notarized Developer ID distribution")}async function N(r,i,o){let n=r==="staple"?"Staple notarization":"Validate notarization";for(let a=0;;a++){let c=await o("xcrun",["stapler",r,i]),u=/NSURLErrorDomain\s+Code=-(?:1001|1003|1004|1005|1009)\b/.test(`${c.stdout}
9
- ${c.stderr}`);if(c.exitCode===0||!u||a===4){e(n,c);return}await dt(1000*2**a)}}async function Va(r,i,o=t){if(!x(r)||!/\.(dmg|pkg|zip)$/i.test(r))throw Error("Notarization requires an existing DMG, PKG or ZIP");let n=oe(V(pe(),"pantry-notary-"));try{let a;if("keychainProfile"in i)a=["--keychain-profile",i.keychainProfile];else if("apiKeyId"in i){let l=V(n,"AuthKey.p8");ce(l,i.privateKey,{mode:384}),a=["--key",l,"--key-id",i.apiKeyId,"--issuer",i.issuerId]}else a=["--apple-id",i.appleId,"--password",i.password,"--team-id",i.teamId];let c=e("Apple notarization",await o("xcrun",["notarytool","submit",r,...a,"--wait","--timeout","30m","--output-format","json"])),u=JSON.parse(c.stdout);if(!u.id||u.status!=="Accepted")throw Error(`Apple did not accept notarization: ${u.status??"unknown status"} (${u.id??"no submission ID"})`);if(!r.toLowerCase().endsWith(".zip"))await N("staple",r,o),await N("validate",r,o);return{schemaVersion:1,file:pt(r),submissionId:u.id,status:u.status,sha256:ct("sha256").update(se(r)).digest("hex"),completedAt:new Date().toISOString()}}finally{ae(n,{recursive:!0,force:!0})}}async function qa(r,i,o,n=t){if(!r.endsWith(".app")||!x(r)||!i.endsWith(".pkg")||!o)throw Error("App Store packaging requires an app, .pkg output and installer identity");if(x(i))throw Error(`Refusing to overwrite an existing package: ${i}`);if(!x(V(r,"Contents/embedded.provisionprofile")))throw Error("App Store app is missing its provisioning profile");e("App signature",await n("codesign",["--verify","--deep","--strict",r]));let a=e("Read signed entitlements",await n("codesign",["-d","--entitlements",":-",r])),c=oe(V(pe(),"pantry-app-store-package-"));try{let u=V(c,"entitlements.plist");if(ce(u,a.stdout||a.stderr),JSON.parse(e("App sandbox entitlement",await n("plutil",["-convert","json","-o","-",u])).stdout)["com.apple.security.app-sandbox"]!==!0)throw Error("App Store app sandbox must be enabled");if(e("Create signed App Store package",await n("productbuild",["--component",r,"/Applications","--sign",o,i],{cwd:ut(i)})),e("Installer signature",await n("pkgutil",["--check-signature",i])),!x(i))throw Error("productbuild did not produce the requested package");return i}finally{ae(c,{recursive:!0,force:!0})}}import ft from"node:process";import{existsSync as ue,mkdtempSync as lt,renameSync as mt,rmSync as fe,writeFileSync as yt}from"node:fs";import{tmpdir as gt}from"node:os";import{join as le}from"node:path";async function Ra(r,i=ft.env,o=t){if(!r.endsWith(".aab")||!ue(r))throw Error("Android signing requires an existing .aab");let n=[i.ANDROID_KEYSTORE_BASE64,i.ANDROID_KEYSTORE_PASSWORD,i.ANDROID_KEY_ALIAS,i.ANDROID_KEY_PASSWORD];if(n.some(Boolean)&&!n.every(Boolean))throw Error("Android signing requires a keystore, alias, store password and key password");let a=lt(le(gt(),"pantry-android-signing-")),c=`${r}.pantry-signed.aab`,u=async(l)=>{let f=e("Android bundle signature",await o("jarsigner",["-J-Duser.language=en","-J-Duser.country=US","-verify",l]));if(!/jar verified\./i.test(f.stdout)||/jar is unsigned/i.test(`${f.stdout}${f.stderr}`))throw Error("Android bundle is not signed")};try{if(n.every(Boolean)){if(ue(c))throw Error("A previous Android signing artifact still exists");let l=le(a,"release.keystore");yt(l,Buffer.from(i.ANDROID_KEYSTORE_BASE64,"base64"),{mode:384}),e("Android bundle signing",await o("jarsigner",["-J-Duser.language=en","-J-Duser.country=US","-keystore",l,"-storepass:env","PANTRY_ANDROID_STORE_PASSWORD","-keypass:env","PANTRY_ANDROID_KEY_PASSWORD","-signedjar",c,r,i.ANDROID_KEY_ALIAS],{env:{...i,PANTRY_ANDROID_STORE_PASSWORD:i.ANDROID_KEYSTORE_PASSWORD,PANTRY_ANDROID_KEY_PASSWORD:i.ANDROID_KEY_PASSWORD}})),await u(c),mt(c,r)}else await u(r)}finally{fe(c,{force:!0}),fe(a,{recursive:!0,force:!0})}}import{existsSync as Zt,readFileSync as Qt}from"node:fs";import{join as er}from"node:path";import{chmodSync as ii,existsSync as Se,readFileSync as be,renameSync as ni,rmSync as oi,writeFileSync as si}from"node:fs";import{basename as ci,dirname as pi,resolve as Ie}from"node:path";import{createCipheriv as Br,createDecipheriv as ge,createHash as H,createPrivateKey as ht,createPublicKey as X,diffieHellman as Et,generateKeyPairSync as Yr,hkdfSync as Nt,randomBytes as Wr}from"node:crypto";var Y="x25519-public:",ye="x25519-private:",he="encrypted:v2:",ve="encrypted:",At=Buffer.from("stacks-env:v2","utf8"),we="Environment decryption failed: authentication or format error";function _t(r){if(r.length===32)return r;return H("sha256").update(r).digest()}function St(r,i,o,n){try{let a=ge("aes-256-gcm",_t(i),Buffer.from(o,"hex"));return a.setAuthTag(Buffer.from(n,"hex")),Buffer.concat([a.update(Buffer.from(r,"hex")),a.final()]).toString("utf8")}catch{throw Error("Decryption failed: authentication or format error")}}function Z(r){return r.toString("base64url")}function I(r,i,o){if(typeof r!=="string"||r.length>0&&!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`${i} is not canonical base64url`);let n=Buffer.from(r,"base64url");if(Z(n)!==r)throw Error(`${i} is not canonical base64url`);if(o!==void 0&&n.length!==o)throw Error(`${i} has an invalid length`);return n}function bt(r){if(!r.startsWith(Y))throw Error("Legacy or invalid public key. Run buddy env:rotate before creating new ciphertext.");let i=X({key:I(r.slice(Y.length),"public key"),format:"der",type:"spki"});if(i.asymmetricKeyType!=="x25519")throw Error("Public key is not X25519");return i}function L(r){if(typeof r!=="string")return!1;try{let i=bt(r);return r===`${Y}${Z(i.export({format:"der",type:"spki"}))}`}catch{return!1}}function Pe(r){if(!r.startsWith(ye))throw Error("Private key is not a version 2 X25519 key");let i=ht({key:I(r.slice(ye.length),"private key"),format:"der",type:"pkcs8"});if(i.asymmetricKeyType!=="x25519")throw Error("Private key is not X25519");return i}function W(r,i){if(!L(r)||typeof i!=="string")return!1;try{let o=X(Pe(i));return r===`${Y}${Z(o.export({format:"der",type:"spki"}))}`}catch{return!1}}function It(r){return Buffer.from(`stacks-env:v2;${r.epk};${r.salt};${r.nonce}`,"utf8")}function kt(r){let i=I(r.slice(he.length),"envelope").toString("utf8"),o=JSON.parse(i);if(!o||typeof o!=="object"||Array.isArray(o))throw Error("envelope is not an object");let n=Object.keys(o).sort(),a=["ciphertext","epk","nonce","salt","tag","v"];if(n.length!==a.length||n.some((c,u)=>c!==a[u]))throw Error("envelope fields are invalid");if(o.v!==2)throw Error("envelope version is unsupported");for(let c of["epk","salt","nonce","ciphertext","tag"])if(typeof o[c]!=="string")throw Error(`${c} is invalid`);return o}function $t(r,i){try{let o=kt(r),n=Pe(i),a=X({key:I(o.epk,"ephemeral public key"),format:"der",type:"spki"});if(a.asymmetricKeyType!=="x25519")throw Error("ephemeral key is not X25519");let c=I(o.salt,"salt",16),u=I(o.nonce,"nonce",12),l=I(o.ciphertext,"ciphertext"),f=I(o.tag,"tag",16),y=Et({privateKey:n,publicKey:a}),d=Buffer.from(Nt("sha256",y,c,At,32));try{let m=ge("aes-256-gcm",d,u);return m.setAAD(It(o)),m.setAuthTag(f),Buffer.concat([m.update(l),m.final()]).toString("utf8")}finally{y.fill(0),d.fill(0)}}catch{throw Error(we)}}function Ct(r,i){try{if(!/^[0-9a-f]{64}$/.test(i))throw Error("invalid legacy private key");let o=Buffer.from(r.slice(ve.length),"base64");if(o.length<32)throw Error("invalid legacy payload");let n=H("sha256").update(Buffer.from(i,"hex")).digest(),a=H("sha256").update(n).digest();return St(o.subarray(32).toString("hex"),a,o.subarray(0,16).toString("hex"),o.subarray(16,32).toString("hex"))}catch{throw Error(we)}}function Q(r,i){if(!r.startsWith(ve))return r;return r.startsWith(he)?$t(r,i):Ct(r,i)}import{spawnSync as Tt}from"node:child_process";import{readFileSync as Ot}from"node:fs";import{arch as Rt,hostname as Dt,platform as Ae,release as Kt,userInfo as Vt}from"node:os";import{basename as Lt,dirname as Ft,resolve as Bt}from"node:path";function j(r){return typeof r==="string"&&(r.startsWith("encrypted:")||r.startsWith("enc:"))}function Ne(r,i=Object.keys(r)){let o=i.map((n)=>r[n]).filter((n)=>j(n));return Object.fromEntries(Object.entries(r).filter(([,n])=>n===void 0||!o.some((a)=>n.includes(a))))}function F(r,i={}){let o={},n=[],a=[],c=r.split(`
10
- `),u=Ne(i.processEnv||process.env);for(let l of c){let f=l.trim();if(!f||f.startsWith("#"))continue;if(f.startsWith("DOTENV_PUBLIC_KEY=")){let h=f.match(/^DOTENV_PUBLIC_KEY=["']?([^"'\n]+)["']?/);if(h&&h[1]!==void 0)o.DOTENV_PUBLIC_KEY=h[1];continue}let y=f.match(/^([^=]+)=(.*)$/);if(!y||y[1]===void 0||y[2]===void 0)continue;let d=y[1].trim(),m=y[2].trim();if(m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'")){if(m=m.slice(1,-1),m.includes("\\n"))m=m.replace(/\\n/g,`
11
- `)}if(m.startsWith("encrypted:")||m.startsWith("enc:")){if(!i.privateKey){a.push(d);continue}try{let h=m.startsWith("enc:")?`encrypted:${m.slice(4)}`:m;m=Q(h,i.privateKey)}catch(h){n.push(`Failed to decrypt ${d}: ${h instanceof Error?h.message:"Unknown error"}`),a.push(d);continue}}m=Yt(m,{...u,...o}),m=Gt(m),o[d]=m}return{parsed:o,errors:n,skippedEncrypted:a}}function Yt(r,i){return r.replace(/\$\{([^}]+)\}/g,(o,n)=>{let a=n.match(/^([^:\-+]+)(:-|-)(.+)$/);if(a){let[,u,l,f]=a,y=i[u];if(l===":-")return y||f;else return y!==void 0?y:f}let c=n.match(/^([^:\-+]+)(:?\+)(.+)$/);if(c){let[,u,l,f]=c,y=i[u];if(l===":+")return y?f:"";else return y!==void 0?f:""}return i[n]||""})}var Wt=new Set(["date","hostname","whoami","uname","pwd","echo","printf","cat","basename","dirname"]);function jt(r){let i=[],o="",n=null,a=!1;for(let c of r.trim()){if(a){o+=c,a=!1;continue}if(c==="\\"&&n!=="'"){a=!0;continue}if(n){if(c===n)n=null;else o+=c;continue}if(c==='"'||c==="'"){n=c;continue}if(/\s/.test(c)){if(o)i.push(o),o="";continue}o+=c}if(a||n)throw Error("Command substitution contains an unterminated escape or quote");if(o)i.push(o);return i}function zt(r){let[i,...o]=r,n=o.some((a)=>a.startsWith("-"));if(i==="echo"&&!n)return o.join(" ");if(i==="printf"&&o.length===1&&!o[0]?.includes("%"))return o[0];if(i==="hostname"&&o.length===0)return Dt();if(i==="whoami"&&o.length===0)return Vt().username;if(i==="pwd"&&o.length===0)return process.cwd();if(i==="basename"&&o.length===1)return Lt(o[0]??"");if(i==="dirname"&&o.length===1)return Ft(o[0]??"");if(i==="cat"&&o.length>0&&!n)return o.map((a)=>Ot(Bt(process.cwd(),a),"utf8")).join("");if(i==="uname"){let a=o[0]??"-s";if(o.length<=1&&a==="-m")return Rt();if(o.length<=1&&a==="-r")return Kt();if(o.length<=1&&a==="-s")return{aix:"AIX",android:"Android",cygwin:"CYGWIN",darwin:"Darwin",freebsd:"FreeBSD",haiku:"Haiku",linux:"Linux",netbsd:"NetBSD",openbsd:"OpenBSD",sunos:"SunOS",win32:"Windows_NT"}[Ae()]??Ae()}return}function Gt(r){return r.replace(/\$\(([^)]+)\)/g,(i,o)=>{try{let n=jt(o),a=n[0];if(!a||!Wt.has(a))return console.warn(`[env] Blocked command substitution for disallowed command: ${a}`),"";let c=zt(n);if(c!==void 0)return c.trim();let u=Tt(a,n.slice(1),{encoding:"utf8",env:process.env});if(u.status===0)return u.stdout.trim();let l=u.stderr.trim();console.warn(`[env] Command substitution failed (exit code ${u.status??"unknown"}): ${a}${l?`: ${l}`:""}`)}catch(n){console.warn(`[env] Command substitution error: ${n instanceof Error?n.message:String(n)}`)}return""})}function ke(r){let i=((r||".env").split("/").pop()||"").replace(/^\.env\./,"").replace(/^\.env$/,"").toUpperCase();return{publicKeyName:i?`DOTENV_PUBLIC_KEY_${i}`:"DOTENV_PUBLIC_KEY",privateKeyName:i?`DOTENV_PRIVATE_KEY_${i}`:"DOTENV_PRIVATE_KEY"}}function qt(r){let{publicKeyName:i}=ke(r);return i==="DOTENV_PUBLIC_KEY"?[i]:[i,"DOTENV_PUBLIC_KEY"]}function $e(r){let{privateKeyName:i}=ke(r);return i==="DOTENV_PRIVATE_KEY"?[i]:[i,"DOTENV_PRIVATE_KEY"]}function ee(r={}){let i=Ie(r.cwd||process.cwd(),r.keysFile||".env.keys"),o=Se(i)?F(be(i,"utf8")).parsed:{};for(let n of $e(r.file)){let a=o[n]||process.env[n];if(a)return a}return}function Mt(r,i,o,n){let a=n.file||".env",c=n.keysFile||".env.keys",[u]=$e(n.file),l=`${r.length===1?"Value":"Values"} that cannot be decrypted: ${r.join(", ")}.`;if(!o)return[`Cannot read ${a}: no private key for it.`,` Expected ${u} in ${c} or the environment, and found neither.`,` ${l}`].join(`
12
- `);let f=qt(n.file).find((m)=>i[m]),y=f?i[f]:void 0,d=y&&!W(y,o)?` The private key found for it does not match ${f} in the file, so it belongs to a different key pair.`:" The private key found for it did not decrypt them. It may belong to a different key pair, or the values may be damaged.";return[`Cannot read ${a}: its private key does not decrypt it.`,d,` ${l}`].join(`
13
- `)}function Ce(r,i={}){let o=i.cwd||process.cwd(),n=Ie(o,i.file||".env");if(!Se(n))return{success:!1,error:`File not found: ${n}`};try{let a=ee(i),c=be(n,"utf-8"),{parsed:u,skippedEncrypted:l}=F(c,{privateKey:a}),f=r&&!i.all?l.filter((m)=>m===r):l;if(f.length>0)return{success:!1,error:Mt(f,u,a,i)};if(r&&!i.all){let m=u[r];if(m===void 0)return{success:!1,error:`Key not found: ${r}`};return{success:!0,output:m}}let y=u,d;switch(i.format){case"shell":d=Object.entries(y).map(([m,h])=>`${m}=${h}`).join(" ");break;case"eval":d=Object.entries(y).map(([m,h])=>`${m}="${h}"`).join(`
14
- `);break;case"json":default:d=i.prettyPrint?JSON.stringify(y,null,2):JSON.stringify(y);break}return{success:!0,output:d}}catch(a){return{success:!1,error:`Failed to get: ${a instanceof Error?a.message:"Unknown error"}`}}}var Jt=/(?:^|_)(?:PASSWORD|PASSWD|SECRET|TOKEN|APIKEY|API_KEY|CREDENTIAL|CREDENTIALS|PRIVATE|SALT|DSN|CERT|CIPHER|SIGNATURE|WEBHOOK)(?:_|$)|(?:^|_)(?:ACCESS|SECRET)_KEY(?:_|$)|_KEY$/,Ht=/^DOTENV_(?:PUBLIC|PRIVATE)_KEY/,Xt=/^\$\{[^}]+\}$/;function Oe(r,i={}){let{placeholders:o={},strict:n=!1}=i,a=[];for(let[c,u]of Object.entries(r)){if(n&&c.startsWith("DOTENV_PUBLIC_KEY")){if(!L(u))a.push({key:c,reason:"invalid-public-key"});continue}if(n&&c.startsWith("DOTENV_PRIVATE_KEY")){if(u.trim())a.push({key:c,reason:"private-key-material"});continue}if(!u||u.trim()==="")continue;if(j(u))continue;if(Ht.test(c))continue;if(Xt.test(u.trim()))continue;let l=Jt.test(c),f=Object.prototype.hasOwnProperty.call(o,c)&&o[c]===u;if(l&&!f){a.push({key:c,reason:"plaintext-secret"});continue}if(n)a.push({key:c,reason:"plaintext-value"})}return a}function Te(r,i){if(!/^[a-z][a-z0-9-]*$/.test(i))throw Error("Invalid native release environment name");let o=er(r,`.env.${i}`);if(!Zt(o))throw Error(`Native release environment is missing: .env.${i}`);let{parsed:n,skippedEncrypted:a}=F(Qt(o,"utf8"),{processEnv:{}});if([...Object.keys(n),...a].some((l)=>l.startsWith("DOTENV_PRIVATE_KEY")))throw Error("Private decryption keys must never be committed in environment files");let c=Oe(n,{strict:!0});if(c.length)throw Error(`Native release environment must be Buddy-encrypted: ${c.map((l)=>l.key).join(", ")}`);let u=n[`DOTENV_PUBLIC_KEY_${i.toUpperCase()}`]||n.DOTENV_PUBLIC_KEY;if(!L(u))throw Error("Native release environment requires valid Buddy public-key metadata")}function U(r,i,o=()=>{}){Te(r,i);let n=`.env.${i}`,a=Ce(void 0,{cwd:r,file:n,all:!0,format:"json"});if(!a.success||!a.output)throw Error(a.error||`Could not read ${n}`);let c=JSON.parse(a.output),u=c[`DOTENV_PUBLIC_KEY_${i.toUpperCase()}`]||c.DOTENV_PUBLIC_KEY;if(!W(u,ee({cwd:r,file:n})))throw Error("Native release environment key does not match its public metadata");for(let[l,f]of Object.entries(c)){if(l.startsWith("DOTENV_PRIVATE_KEY")&&f)throw Error("Private decryption keys must never be committed in environment files");if(!l.startsWith("DOTENV_PUBLIC_KEY")&&f)o(f)}return Object.fromEntries(Object.entries(c).filter(([l])=>!l.startsWith("DOTENV_")))}import tr from"node:process";import{existsSync as te,lstatSync as rr,readdirSync as ir,readFileSync as Ye,rmSync as Fe,writeFileSync as nr}from"node:fs";import{basename as or,dirname as Be,join as A}from"node:path";import*as De from"node:crypto";import*as k from"node:fs";import*as Ke from"node:os";import*as R from"node:path";function La(r){return[...r.matchAll(/^\s*\d+\)\s+[0-9A-F]+\s+"([^"]+)"/gim)].map((i)=>i[1])}function xe(r,i){let o=new Set([...r.matchAll(/^\s*\d+\)\s+([0-9A-F]{40})\s+"([^"]+)"/gim)].filter((n)=>n[2]===i).map((n)=>n[1].toUpperCase()));if(o.size!==1)throw Error(`Imported signing identity requires a unique certificate fingerprint: ${i}`);return[...o][0]}function Ve(r,i){let o=i==="application"?["3rd Party Mac Developer Application","Apple Distribution","Developer ID Application"]:["3rd Party Mac Developer Installer","Developer ID Installer"];for(let n of o){let a=r.find((c)=>c.startsWith(n));if(a)return a}return}async function Le(r,i){return t(r,i)}function S(r,i){if(i.exitCode===0)return;let o=`${i.stdout}
15
- ${i.stderr}`.trim();throw Error(`${r} failed${o?`: ${o}`:` with exit code ${i.exitCode}`}`)}function Re(r,i,o){let n=R.join(r,i);return k.writeFileSync(n,Buffer.from(o.trim(),"base64"),{mode:384}),n}async function me(r,i={}){if((i.platform||process.platform)!=="darwin")throw Error("Apple code signing requires a macOS runner");if(!r.applicationCertificate)throw Error("Apple code signing requires an application certificate");if(!r.certificatePassword)throw Error("Apple code signing requires the password protecting the .p12 certificates");let n=i.runCommand||Le,a=k.mkdtempSync(R.join(i.tempDirectory||Ke.tmpdir(),"pantry-signing-")),c=De.randomBytes(24).toString("base64"),u=R.join(a,"pantry-signing.keychain-db");try{S("Keychain creation",await n("security",["create-keychain","-p",c,u])),S("Keychain configuration",await n("security",["set-keychain-settings","-lut","21600",u])),S("Keychain unlock",await n("security",["unlock-keychain","-p",c,u]));let l=[{name:"application.p12",content:r.applicationCertificate},...r.installerCertificate?[{name:"installer.p12",content:r.installerCertificate}]:[]];for(let _ of l){let D=Re(a,_.name,_.content);S(`Import of ${_.name}`,await n("security",["import",D,"-k",u,"-P",r.certificatePassword,"-T","/usr/bin/codesign","-T","/usr/bin/productbuild","-f","pkcs12","-A"])),k.rmSync(D,{force:!0})}S("Keychain partition list",await n("security",["set-key-partition-list","-S","apple-tool:,apple:,codesign:","-s","-k",c,u]));let f=await n("security",["list-keychains","-d","user"]);S("Keychain search list",f);let y=[...f.stdout.matchAll(/"([^"]+)"/g)].map((_)=>_[1]);S("Keychain search list update",await n("security",["list-keychains","-d","user","-s",u,...y]));let d=await n("security",["find-identity","-v",u]);S("Identity lookup",d);let m=La(d.stdout),h=Ve(m,"application");if(!h)throw Error(`No application signing identity found in the imported certificates (found: ${m.join(", ")||"none"})`);let g=Ve(m,"installer");if(r.installerCertificate&&!g)throw Error(`No installer signing identity found in the imported certificates (found: ${m.join(", ")})`);let v=r.provisioningProfile?Re(r.outputDirectory||a,"embedded.provisionprofile",r.provisioningProfile):void 0;return{keychainPath:u,applicationIdentity:h,applicationFingerprint:xe(d.stdout,h),...g?{installerIdentity:g,installerFingerprint:xe(d.stdout,g)}:{},...v?{provisioningProfilePath:v}:{}}}catch(l){try{await n("security",["delete-keychain",u])}catch(f){throw AggregateError([l,f],"Apple signing failed and its temporary keychain could not be removed")}finally{k.rmSync(a,{recursive:!0,force:!0})}throw l}}async function qe(r,i={}){let o=i.runCommand||Le;try{S("Keychain removal",await o("security",["delete-keychain",r]))}finally{k.rmSync(R.dirname(r),{recursive:!0,force:!0})}}function Oa(r){let i=rr(r);if(i.isSymbolicLink())throw Error(`Native app must not contain symbolic links: ${r}`);return i.isDirectory()?ir(r).reduce((o,n)=>o+Oa(A(r,n)),0):i.size}async function de(r,i,o=t){let n=r.appPath??r.path;if(!n.endsWith(".app")||!te(n))throw Error("Native build must produce a macOS application bundle");let a=A(n,"Contents/Info.plist"),c=A(n,"Contents/MacOS",r.name);for(let y of[a,c,A(n,"Contents/Resources/index.html"),A(n,"Contents/Resources/craft.json")])if(!te(y))throw Error(`Native app is incomplete: ${y}`);let u=Ye(c).subarray(0,4).toString("hex");if(!["cffaedfe","cefaedfe","cafebabe","bebafeca","cafebabf","bfbafeca"].includes(u))throw Error("Native app executable must be Mach-O");let l=Oa(n);if(i!==void 0&&l>=i)throw Error(`Native bundle is ${l} bytes; it must be below ${i}`);let f=JSON.parse(e("Read bundle metadata",await o("plutil",["-convert","json","-o","-",a])).stdout);if(f.CFBundleIdentifier!==r.bundleId||f.CFBundleShortVersionString!==r.version||String(f.CFBundleVersion)!==r.buildNumber)throw Error("Built app identity/version does not match the release manifest")}async function Ut(r,i,o=t){await de(r,i,o);let n=A(r.appPath??r.path,"Contents/MacOS",r.name),a=e("Native launch check",await o(n,["--benchmark"]));if(!`${a.stdout}${a.stderr}`.includes("ready"))throw Error("Native app did not report ready")}async function C(r,i,o={}){let n=p(r,!0),a=o.command??t,c={...o.env??tr.env};if(n.environment){if(Te(r,n.environment),i==="release"){let d=U(r,n.environment,o.onSecret);Object.assign(c,d,{APP_ENV:n.environment,NODE_ENV:n.environment,DOTENV_ENV:n.environment}),o.onEnvironment?.(d)}}let u=JSON.parse(Ye(A(r,"package.json"),"utf8"));if(!u.version||!/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(u.version))throw Error("A native release requires a semantic package version");if(c.PANTRY_BUILD_NUMBER=c.PANTRY_BUILD_NUMBER||c.GITHUB_RUN_NUMBER||u.version,i==="release"&&c.GITHUB_REF_TYPE==="tag"&&c.GITHUB_REF_NAME!==`v${u.version}`)throw Error("Release tag must match package.json version");if(i==="release"&&c.CRAFT_BIN)throw Error("Release builds must use the configured immutable runtime; CRAFT_BIN is a development override");let l=i==="release"&&n.macos?.notarize?_a(c):void 0;if(i==="release"&&n.registry&&!(c.PANTRY_REGISTRY_TOKEN||c.PANTRY_TOKEN))throw Error("Native registry publishing requires a Pantry publishing token");if(i==="release"&&n.android&&!c.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON)throw Error("Google Play publishing requires GOOGLE_PLAY_SERVICE_ACCOUNT_JSON");if(i==="release"&&n.macos?.appStore&&(!c.APPLE_APP_STORE_APPLICATION_CERTIFICATE||!c.APPLE_APP_STORE_INSTALLER_CERTIFICATE||!c.APPLE_APP_STORE_PROVISIONING_PROFILE_BASE64||!c.APP_STORE_CONNECT_API_KEY_ID||!c.APP_STORE_CONNECT_ISSUER_ID||!c.APP_STORE_CONNECT_PRIVATE_KEY))throw Error("App Store publishing requires distribution certificates, provisioning profile and App Store Connect credentials");if(i==="release"&&n.macos&&!(c.APPLE_SIGNING_IDENTITY||c.APPLE_APPLICATION_CERTIFICATE))throw Error("Native macOS releases require an application signing identity or certificate");let f=async(d)=>e(d[0],await a(d[0],d.slice(1),{cwd:r,env:c,inherit:!0})),y=[];try{if(i==="release"&&n.macos&&c.APPLE_APPLICATION_CERTIFICATE){let g=await me({applicationCertificate:c.APPLE_APPLICATION_CERTIFICATE,certificatePassword:c.APPLE_CERTIFICATE_PASSWORD||"",provisioningProfile:c.APPLE_PROVISIONING_PROFILE_BASE64});if(y.push(g.keychainPath),c.APPLE_SIGNING_IDENTITY=g.applicationFingerprint,g.provisioningProfilePath)c.APPLE_PROVISIONING_PROFILE_PATH=g.provisioningProfilePath}await f(["bun","install","--frozen-lockfile"]);for(let g of n.checks?.before??[])await f(g);if(Fe(A(r,".pantry/native/artifact.json"),{force:!0}),await f(n.build??["bun","run","package"]),i==="release"&&n.android)await Ra(s(r,n.android.bundle),c,a);let d=n.macos?_e(r):void 0;if(d){if(d.version!==u.version)throw Error("Native artifact belongs to a different package version");await Ut(d,n.macos?.maxBundleSize,a)}for(let g of n.checks?.after??[])await f(g);let m=d?[d.path]:n.android?[s(r,n.android.bundle)]:[];if(!m.length||m.some((g)=>!te(g)))throw Error("Native pipeline produced no release files");if(d&&i==="release"){e("Release signature",await a("codesign",["--verify","--deep","--strict",d.appPath??d.path]));let g=e("Release identity",await a("codesign",["-dv","--verbose=4",d.appPath??d.path]));if(!`${g.stdout}${g.stderr}`.includes("Authority=Developer ID Application:"))throw Error("Direct macOS releases require a Developer ID signature");if(d.path.toLowerCase().endsWith(".dmg"))await Ta(d.path,c.APPLE_SIGNING_IDENTITY,a)}if(l){let g=await Va(m[0],l,a);if(d?.appPath)await M(d.appPath,a);if(!m[0].toLowerCase().endsWith(".zip"))await M(m[0],a);let v=A(Be(m[0]),"notarization-receipt.json");nr(v,`${JSON.stringify(g,null,2)}
16
- `),m.push(v)}let h;if(i==="release"&&n.macos?.appStore){let g=await me({applicationCertificate:c.APPLE_APP_STORE_APPLICATION_CERTIFICATE,installerCertificate:c.APPLE_APP_STORE_INSTALLER_CERTIFICATE,certificatePassword:c.APPLE_CERTIFICATE_PASSWORD||"",provisioningProfile:c.APPLE_APP_STORE_PROVISIONING_PROFILE_BASE64});y.push(g.keychainPath),c.PANTRY_DISTRIBUTION="app-store",c.APPLE_SIGNING_IDENTITY=g.applicationFingerprint,c.APPLE_PROVISIONING_PROFILE_PATH=g.provisioningProfilePath,Fe(s(r,".pantry/native/app-store"),{recursive:!0,force:!0}),await f(["bun","run","build"]);let v=_e(r);if(await de(v,n.macos.maxBundleSize,a),!d||v.bundleId!==d.bundleId||v.version!==d.version||v.buildNumber!==d.buildNumber)throw Error("App Store bundle must match the qualified direct release identity and version");h=A(Be(m[0]),`${or(v.appPath??v.path,".app")}-${u.version}.pkg`),await qa(v.appPath??v.path,h,g.installerFingerprint,a),m.push(h)}return{config:n,version:u.version,files:m,...d?{artifact:d}:{},...h?{appStorePackage:h}:{}}}finally{for(let d of y.reverse())await qe(d)}}
17
- export{po,Ee,s,p,t,e,$a,vt,xt,wt,Ea,Pt,go,mo,_e,_a,Ta,M,N,Va,qa,Ra,Te,U,La,Ve,me,qe,Oa,de,Ut,C};
9
+ ${c.stderr}`);if(c.exitCode===0||!u||a===4){e(n,c);return}await dt(1000*2**a)}}async function Va(r,i,o=t){if(!x(r)||!/\.(dmg|pkg|zip)$/i.test(r))throw Error("Notarization requires an existing DMG, PKG or ZIP");let n=oe(V(pe(),"pantry-notary-"));try{let a;if("keychainProfile"in i)a=["--keychain-profile",i.keychainProfile];else if("apiKeyId"in i){let m=V(n,"AuthKey.p8");ce(m,i.privateKey,{mode:384}),a=["--key",m,"--key-id",i.apiKeyId,"--issuer",i.issuerId]}else a=["--apple-id",i.appleId,"--password",i.password,"--team-id",i.teamId];let c=e("Apple notarization",await o("xcrun",["notarytool","submit",r,...a,"--wait","--timeout","30m","--output-format","json"])),u=JSON.parse(c.stdout);if(!u.id||u.status!=="Accepted")throw Error(`Apple did not accept notarization: ${u.status??"unknown status"} (${u.id??"no submission ID"})`);if(!r.toLowerCase().endsWith(".zip"))await N("staple",r,o),await N("validate",r,o);return{schemaVersion:1,file:pt(r),submissionId:u.id,status:u.status,sha256:ct("sha256").update(se(r)).digest("hex"),completedAt:new Date().toISOString()}}finally{ae(n,{recursive:!0,force:!0})}}async function qa(r,i,o,n=t){if(!r.endsWith(".app")||!x(r)||!i.endsWith(".pkg")||!o)throw Error("App Store packaging requires an app, .pkg output and installer identity");if(x(i))throw Error(`Refusing to overwrite an existing package: ${i}`);if(!x(V(r,"Contents/embedded.provisionprofile")))throw Error("App Store app is missing its provisioning profile");e("App signature",await n("codesign",["--verify","--deep","--strict",r]));let a=e("Read signed entitlements",await n("codesign",["-d","--entitlements",":-",r])),c=oe(V(pe(),"pantry-app-store-package-"));try{let u=V(c,"entitlements.plist");if(ce(u,a.stdout||a.stderr),JSON.parse(e("App sandbox entitlement",await n("plutil",["-convert","json","-o","-",u])).stdout)["com.apple.security.app-sandbox"]!==!0)throw Error("App Store app sandbox must be enabled");if(e("Create signed App Store package",await n("productbuild",["--component",r,"/Applications","--sign",o,i],{cwd:ut(i)})),e("Installer signature",await n("pkgutil",["--check-signature",i])),!x(i))throw Error("productbuild did not produce the requested package");return i}finally{ae(c,{recursive:!0,force:!0})}}import ft from"node:process";import{existsSync as ue,mkdtempSync as lt,renameSync as mt,rmSync as fe,writeFileSync as yt}from"node:fs";import{tmpdir as gt}from"node:os";import{join as le}from"node:path";async function Ra(r,i=ft.env,o=t){if(!r.endsWith(".aab")||!ue(r))throw Error("Android signing requires an existing .aab");let n=[i.ANDROID_KEYSTORE_BASE64,i.ANDROID_KEYSTORE_PASSWORD,i.ANDROID_KEY_ALIAS,i.ANDROID_KEY_PASSWORD];if(n.some(Boolean)&&!n.every(Boolean))throw Error("Android signing requires a keystore, alias, store password and key password");let a=lt(le(gt(),"pantry-android-signing-")),c=`${r}.pantry-signed.aab`,u=async(m)=>{let f=e("Android bundle signature",await o("jarsigner",["-J-Duser.language=en","-J-Duser.country=US","-verify",m]));if(!/jar verified\./i.test(f.stdout)||/jar is unsigned/i.test(`${f.stdout}${f.stderr}`))throw Error("Android bundle is not signed")};try{if(n.every(Boolean)){if(ue(c))throw Error("A previous Android signing artifact still exists");let m=le(a,"release.keystore");yt(m,Buffer.from(i.ANDROID_KEYSTORE_BASE64,"base64"),{mode:384}),e("Android bundle signing",await o("jarsigner",["-J-Duser.language=en","-J-Duser.country=US","-keystore",m,"-storepass:env","PANTRY_ANDROID_STORE_PASSWORD","-keypass:env","PANTRY_ANDROID_KEY_PASSWORD","-signedjar",c,r,i.ANDROID_KEY_ALIAS],{env:{...i,PANTRY_ANDROID_STORE_PASSWORD:i.ANDROID_KEYSTORE_PASSWORD,PANTRY_ANDROID_KEY_PASSWORD:i.ANDROID_KEY_PASSWORD}})),await u(c),mt(c,r)}else await u(r)}finally{fe(c,{force:!0}),fe(a,{recursive:!0,force:!0})}}import{existsSync as Zt,readFileSync as Qt}from"node:fs";import{join as er}from"node:path";import{chmodSync as ii,existsSync as Se,readFileSync as be,renameSync as ni,rmSync as oi,writeFileSync as si}from"node:fs";import{basename as ci,dirname as pi,resolve as Ie}from"node:path";import{createCipheriv as Br,createDecipheriv as ge,createHash as X,createPrivateKey as ht,createPublicKey as Z,diffieHellman as vt,generateKeyPairSync as Yr,hkdfSync as Et,randomBytes as Wr}from"node:crypto";var W="x25519-public:",ye="x25519-private:",he="encrypted:v2:",ve="encrypted:",Nt=Buffer.from("stacks-env:v2","utf8"),we="Environment decryption failed: authentication or format error";function At(r){if(r.length===32)return r;return X("sha256").update(r).digest()}function _t(r,i,o,n){try{let a=ge("aes-256-gcm",At(i),Buffer.from(o,"hex"));return a.setAuthTag(Buffer.from(n,"hex")),Buffer.concat([a.update(Buffer.from(r,"hex")),a.final()]).toString("utf8")}catch{throw Error("Decryption failed: authentication or format error")}}function Q(r){return r.toString("base64url")}function I(r,i,o){if(typeof r!=="string"||r.length>0&&!/^[A-Za-z0-9_-]+$/.test(r))throw Error(`${i} is not canonical base64url`);let n=Buffer.from(r,"base64url");if(Q(n)!==r)throw Error(`${i} is not canonical base64url`);if(o!==void 0&&n.length!==o)throw Error(`${i} has an invalid length`);return n}function St(r){if(!r.startsWith(W))throw Error("Legacy or invalid public key. Run buddy env:rotate before creating new ciphertext.");let i=Z({key:I(r.slice(W.length),"public key"),format:"der",type:"spki"});if(i.asymmetricKeyType!=="x25519")throw Error("Public key is not X25519");return i}function L(r){if(typeof r!=="string")return!1;try{let i=St(r);return r===`${W}${Q(i.export({format:"der",type:"spki"}))}`}catch{return!1}}function Pe(r){if(!r.startsWith(ye))throw Error("Private key is not a version 2 X25519 key");let i=ht({key:I(r.slice(ye.length),"private key"),format:"der",type:"pkcs8"});if(i.asymmetricKeyType!=="x25519")throw Error("Private key is not X25519");return i}function j(r,i){if(!L(r)||typeof i!=="string")return!1;try{let o=Z(Pe(i));return r===`${W}${Q(o.export({format:"der",type:"spki"}))}`}catch{return!1}}function bt(r){return Buffer.from(`stacks-env:v2;${r.epk};${r.salt};${r.nonce}`,"utf8")}function It(r){let i=I(r.slice(he.length),"envelope").toString("utf8"),o=JSON.parse(i);if(!o||typeof o!=="object"||Array.isArray(o))throw Error("envelope is not an object");let n=Object.keys(o).sort(),a=["ciphertext","epk","nonce","salt","tag","v"];if(n.length!==a.length||n.some((c,u)=>c!==a[u]))throw Error("envelope fields are invalid");if(o.v!==2)throw Error("envelope version is unsupported");for(let c of["epk","salt","nonce","ciphertext","tag"])if(typeof o[c]!=="string")throw Error(`${c} is invalid`);return o}function kt(r,i){try{let o=It(r),n=Pe(i),a=Z({key:I(o.epk,"ephemeral public key"),format:"der",type:"spki"});if(a.asymmetricKeyType!=="x25519")throw Error("ephemeral key is not X25519");let c=I(o.salt,"salt",16),u=I(o.nonce,"nonce",12),m=I(o.ciphertext,"ciphertext"),f=I(o.tag,"tag",16),y=vt({privateKey:n,publicKey:a}),d=Buffer.from(Et("sha256",y,c,Nt,32));try{let l=ge("aes-256-gcm",d,u);return l.setAAD(bt(o)),l.setAuthTag(f),Buffer.concat([l.update(m),l.final()]).toString("utf8")}finally{y.fill(0),d.fill(0)}}catch{throw Error(we)}}function $t(r,i){try{if(!/^[0-9a-f]{64}$/.test(i))throw Error("invalid legacy private key");let o=Buffer.from(r.slice(ve.length),"base64");if(o.length<32)throw Error("invalid legacy payload");let n=X("sha256").update(Buffer.from(i,"hex")).digest(),a=X("sha256").update(n).digest();return _t(o.subarray(32).toString("hex"),a,o.subarray(0,16).toString("hex"),o.subarray(16,32).toString("hex"))}catch{throw Error(we)}}function ee(r,i){if(!r.startsWith(ve))return r;return r.startsWith(he)?kt(r,i):$t(r,i)}import{spawnSync as Tt}from"node:child_process";import{readFileSync as Ot}from"node:fs";import{arch as Rt,hostname as Kt,platform as Ae,release as Dt,userInfo as Vt}from"node:os";import{basename as Lt,dirname as Ft,resolve as Bt}from"node:path";function z(r){return typeof r==="string"&&(r.startsWith("encrypted:")||r.startsWith("enc:"))}function Ne(r,i=Object.keys(r)){let o=i.map((n)=>r[n]).filter((n)=>z(n));return Object.fromEntries(Object.entries(r).filter(([,n])=>n===void 0||!o.some((a)=>n.includes(a))))}function F(r,i={}){let o={},n=[],a=[],c=r.split(`
10
+ `),u=Ne(i.processEnv||process.env);for(let m of c){let f=m.trim();if(!f||f.startsWith("#"))continue;if(f.startsWith("DOTENV_PUBLIC_KEY=")){let h=f.match(/^DOTENV_PUBLIC_KEY=["']?([^"'\n]+)["']?/);if(h&&h[1]!==void 0)o.DOTENV_PUBLIC_KEY=h[1];continue}let y=f.match(/^([^=]+)=(.*)$/);if(!y||y[1]===void 0||y[2]===void 0)continue;let d=y[1].trim(),l=y[2].trim();if(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'")){if(l=l.slice(1,-1),l.includes("\\n"))l=l.replace(/\\n/g,`
11
+ `)}if(l.startsWith("encrypted:")||l.startsWith("enc:")){if(!i.privateKey){a.push(d);continue}try{let h=l.startsWith("enc:")?`encrypted:${l.slice(4)}`:l;l=ee(h,i.privateKey)}catch(h){n.push(`Failed to decrypt ${d}: ${h instanceof Error?h.message:"Unknown error"}`),a.push(d);continue}}l=Yt(l,{...u,...o}),l=Gt(l),o[d]=l}return{parsed:o,errors:n,skippedEncrypted:a}}function Yt(r,i){return r.replace(/\$\{([^}]+)\}/g,(o,n)=>{let a=n.match(/^([^:\-+]+)(:-|-)(.+)$/);if(a){let[,u,m,f]=a,y=i[u];if(m===":-")return y||f;else return y!==void 0?y:f}let c=n.match(/^([^:\-+]+)(:?\+)(.+)$/);if(c){let[,u,m,f]=c,y=i[u];if(m===":+")return y?f:"";else return y!==void 0?f:""}return i[n]||""})}var Wt=new Set(["date","hostname","whoami","uname","pwd","echo","printf","cat","basename","dirname"]);function jt(r){let i=[],o="",n=null,a=!1;for(let c of r.trim()){if(a){o+=c,a=!1;continue}if(c==="\\"&&n!=="'"){a=!0;continue}if(n){if(c===n)n=null;else o+=c;continue}if(c==='"'||c==="'"){n=c;continue}if(/\s/.test(c)){if(o)i.push(o),o="";continue}o+=c}if(a||n)throw Error("Command substitution contains an unterminated escape or quote");if(o)i.push(o);return i}function zt(r){let[i,...o]=r,n=o.some((a)=>a.startsWith("-"));if(i==="echo"&&!n)return o.join(" ");if(i==="printf"&&o.length===1&&!o[0]?.includes("%"))return o[0];if(i==="hostname"&&o.length===0)return Kt();if(i==="whoami"&&o.length===0)return Vt().username;if(i==="pwd"&&o.length===0)return process.cwd();if(i==="basename"&&o.length===1)return Lt(o[0]??"");if(i==="dirname"&&o.length===1)return Ft(o[0]??"");if(i==="cat"&&o.length>0&&!n)return o.map((a)=>Ot(Bt(process.cwd(),a),"utf8")).join("");if(i==="uname"){let a=o[0]??"-s";if(o.length<=1&&a==="-m")return Rt();if(o.length<=1&&a==="-r")return Dt();if(o.length<=1&&a==="-s")return{aix:"AIX",android:"Android",cygwin:"CYGWIN",darwin:"Darwin",freebsd:"FreeBSD",haiku:"Haiku",linux:"Linux",netbsd:"NetBSD",openbsd:"OpenBSD",sunos:"SunOS",win32:"Windows_NT"}[Ae()]??Ae()}return}function Gt(r){return r.replace(/\$\(([^)]+)\)/g,(i,o)=>{try{let n=jt(o),a=n[0];if(!a||!Wt.has(a))return console.warn(`[env] Blocked command substitution for disallowed command: ${a}`),"";let c=zt(n);if(c!==void 0)return c.trim();let u=Tt(a,n.slice(1),{encoding:"utf8",env:process.env});if(u.status===0)return u.stdout.trim();let m=u.stderr.trim();console.warn(`[env] Command substitution failed (exit code ${u.status??"unknown"}): ${a}${m?`: ${m}`:""}`)}catch(n){console.warn(`[env] Command substitution error: ${n instanceof Error?n.message:String(n)}`)}return""})}function ke(r){let i=((r||".env").split("/").pop()||"").replace(/^\.env\./,"").replace(/^\.env$/,"").toUpperCase();return{publicKeyName:i?`DOTENV_PUBLIC_KEY_${i}`:"DOTENV_PUBLIC_KEY",privateKeyName:i?`DOTENV_PRIVATE_KEY_${i}`:"DOTENV_PRIVATE_KEY"}}function qt(r){let{publicKeyName:i}=ke(r);return i==="DOTENV_PUBLIC_KEY"?[i]:[i,"DOTENV_PUBLIC_KEY"]}function $e(r){let{privateKeyName:i}=ke(r);return i==="DOTENV_PRIVATE_KEY"?[i]:[i,"DOTENV_PRIVATE_KEY"]}function te(r={}){let i=Ie(r.cwd||process.cwd(),r.keysFile||".env.keys"),o=Se(i)?F(be(i,"utf8")).parsed:{};for(let n of $e(r.file)){let a=o[n]||process.env[n];if(a)return a}return}function Mt(r,i,o,n){let a=n.file||".env",c=n.keysFile||".env.keys",[u]=$e(n.file),m=`${r.length===1?"Value":"Values"} that cannot be decrypted: ${r.join(", ")}.`;if(!o)return[`Cannot read ${a}: no private key for it.`,` Expected ${u} in ${c} or the environment, and found neither.`,` ${m}`].join(`
12
+ `);let f=qt(n.file).find((l)=>i[l]),y=f?i[f]:void 0,d=y&&!j(y,o)?` The private key found for it does not match ${f} in the file, so it belongs to a different key pair.`:" The private key found for it did not decrypt them. It may belong to a different key pair, or the values may be damaged.";return[`Cannot read ${a}: its private key does not decrypt it.`,d,` ${m}`].join(`
13
+ `)}function Ce(r,i={}){let o=i.cwd||process.cwd(),n=Ie(o,i.file||".env");if(!Se(n))return{success:!1,error:`File not found: ${n}`};try{let a=te(i),c=be(n,"utf-8"),{parsed:u,skippedEncrypted:m}=F(c,{privateKey:a}),f=r&&!i.all?m.filter((l)=>l===r):m;if(f.length>0)return{success:!1,error:Mt(f,u,a,i)};if(r&&!i.all){let l=u[r];if(l===void 0)return{success:!1,error:`Key not found: ${r}`};return{success:!0,output:l}}let y=u,d;switch(i.format){case"shell":d=Object.entries(y).map(([l,h])=>`${l}=${h}`).join(" ");break;case"eval":d=Object.entries(y).map(([l,h])=>`${l}="${h}"`).join(`
14
+ `);break;case"json":default:d=i.prettyPrint?JSON.stringify(y,null,2):JSON.stringify(y);break}return{success:!0,output:d}}catch(a){return{success:!1,error:`Failed to get: ${a instanceof Error?a.message:"Unknown error"}`}}}var Jt=/(?:^|_)(?:PASSWORD|PASSWD|SECRET|TOKEN|APIKEY|API_KEY|CREDENTIAL|CREDENTIALS|PRIVATE|SALT|DSN|CERT|CIPHER|SIGNATURE|WEBHOOK)(?:_|$)|(?:^|_)(?:ACCESS|SECRET)_KEY(?:_|$)|_KEY$/,Ht=/^DOTENV_(?:PUBLIC|PRIVATE)_KEY/,Xt=/^\$\{[^}]+\}$/;function Oe(r,i={}){let{placeholders:o={},strict:n=!1}=i,a=[];for(let[c,u]of Object.entries(r)){if(n&&c.startsWith("DOTENV_PUBLIC_KEY")){if(!L(u))a.push({key:c,reason:"invalid-public-key"});continue}if(n&&c.startsWith("DOTENV_PRIVATE_KEY")){if(u.trim())a.push({key:c,reason:"private-key-material"});continue}if(!u||u.trim()==="")continue;if(z(u))continue;if(Ht.test(c))continue;if(Xt.test(u.trim()))continue;let m=Jt.test(c),f=Object.prototype.hasOwnProperty.call(o,c)&&o[c]===u;if(m&&!f){a.push({key:c,reason:"plaintext-secret"});continue}if(n)a.push({key:c,reason:"plaintext-value"})}return a}function Te(r,i){if(!/^[a-z][a-z0-9-]*$/.test(i))throw Error("Invalid native release environment name");let o=er(r,`.env.${i}`);if(!Zt(o))throw Error(`Native release environment is missing: .env.${i}`);let{parsed:n,skippedEncrypted:a}=F(Qt(o,"utf8"),{processEnv:{}});if([...Object.keys(n),...a].some((m)=>m.startsWith("DOTENV_PRIVATE_KEY")))throw Error("Private decryption keys must never be committed in environment files");let c=Oe(n,{strict:!0});if(c.length)throw Error(`Native release environment must be Buddy-encrypted: ${c.map((m)=>m.key).join(", ")}`);let u=n[`DOTENV_PUBLIC_KEY_${i.toUpperCase()}`]||n.DOTENV_PUBLIC_KEY;if(!L(u))throw Error("Native release environment requires valid Buddy public-key metadata")}function U(r,i,o=()=>{}){Te(r,i);let n=`.env.${i}`,a=Ce(void 0,{cwd:r,file:n,all:!0,format:"json"});if(!a.success||!a.output)throw Error(a.error||`Could not read ${n}`);let c=JSON.parse(a.output),u=c[`DOTENV_PUBLIC_KEY_${i.toUpperCase()}`]||c.DOTENV_PUBLIC_KEY;if(!j(u,te({cwd:r,file:n})))throw Error("Native release environment key does not match its public metadata");for(let[m,f]of Object.entries(c)){if(m.startsWith("DOTENV_PRIVATE_KEY")&&f)throw Error("Private decryption keys must never be committed in environment files");if(!m.startsWith("DOTENV_PUBLIC_KEY")&&f)o(f)}return Object.fromEntries(Object.entries(c).filter(([m])=>!m.startsWith("DOTENV_")))}import tr from"node:process";import{existsSync as B,lstatSync as rr,readdirSync as ir,readFileSync as Ye,rmSync as Fe,writeFileSync as nr}from"node:fs";import{basename as or,dirname as Be,join as P}from"node:path";import*as Ke from"node:crypto";import*as k from"node:fs";import*as De from"node:os";import*as R from"node:path";function Oa(r){return[...r.matchAll(/^\s*\d+\)\s+[0-9A-F]+\s+"([^"]+)"/gim)].map((i)=>i[1])}function xe(r,i){let o=new Set([...r.matchAll(/^\s*\d+\)\s+([0-9A-F]{40})\s+"([^"]+)"/gim)].filter((n)=>n[2]===i).map((n)=>n[1].toUpperCase()));if(o.size!==1)throw Error(`Imported signing identity requires a unique certificate fingerprint: ${i}`);return[...o][0]}function Ve(r,i){let o=i==="application"?["3rd Party Mac Developer Application","Apple Distribution","Developer ID Application"]:["3rd Party Mac Developer Installer","Developer ID Installer"];for(let n of o){let a=r.find((c)=>c.startsWith(n));if(a)return a}return}async function Le(r,i){return t(r,i)}function S(r,i){if(i.exitCode===0)return;let o=`${i.stdout}
15
+ ${i.stderr}`.trim();throw Error(`${r} failed${o?`: ${o}`:` with exit code ${i.exitCode}`}`)}function Re(r,i,o){let n=R.join(r,i);return k.writeFileSync(n,Buffer.from(o.trim(),"base64"),{mode:384}),n}async function me(r,i={}){if((i.platform||process.platform)!=="darwin")throw Error("Apple code signing requires a macOS runner");if(!r.applicationCertificate)throw Error("Apple code signing requires an application certificate");if(!r.certificatePassword)throw Error("Apple code signing requires the password protecting the .p12 certificates");let n=i.runCommand||Le,a=k.mkdtempSync(R.join(i.tempDirectory||De.tmpdir(),"pantry-signing-")),c=Ke.randomBytes(24).toString("base64"),u=R.join(a,"pantry-signing.keychain-db");try{S("Keychain creation",await n("security",["create-keychain","-p",c,u])),S("Keychain configuration",await n("security",["set-keychain-settings","-lut","21600",u])),S("Keychain unlock",await n("security",["unlock-keychain","-p",c,u]));let m=[{name:"application.p12",content:r.applicationCertificate},...r.installerCertificate?[{name:"installer.p12",content:r.installerCertificate}]:[]];for(let _ of m){let K=Re(a,_.name,_.content);S(`Import of ${_.name}`,await n("security",["import",K,"-k",u,"-P",r.certificatePassword,"-T","/usr/bin/codesign","-T","/usr/bin/productbuild","-f","pkcs12","-A"])),k.rmSync(K,{force:!0})}S("Keychain partition list",await n("security",["set-key-partition-list","-S","apple-tool:,apple:,codesign:","-s","-k",c,u]));let f=await n("security",["list-keychains","-d","user"]);S("Keychain search list",f);let y=[...f.stdout.matchAll(/"([^"]+)"/g)].map((_)=>_[1]);S("Keychain search list update",await n("security",["list-keychains","-d","user","-s",u,...y]));let d=await n("security",["find-identity","-v",u]);S("Identity lookup",d);let l=Oa(d.stdout),h=Ve(l,"application");if(!h)throw Error(`No application signing identity found in the imported certificates (found: ${l.join(", ")||"none"})`);let g=Ve(l,"installer");if(r.installerCertificate&&!g)throw Error(`No installer signing identity found in the imported certificates (found: ${l.join(", ")})`);let v=r.provisioningProfile?Re(r.outputDirectory||a,"embedded.provisionprofile",r.provisioningProfile):void 0;return{keychainPath:u,applicationIdentity:h,applicationFingerprint:xe(d.stdout,h),...g?{installerIdentity:g,installerFingerprint:xe(d.stdout,g)}:{},...v?{provisioningProfilePath:v}:{}}}catch(m){try{await n("security",["delete-keychain",u])}catch(f){throw AggregateError([m,f],"Apple signing failed and its temporary keychain could not be removed")}finally{k.rmSync(a,{recursive:!0,force:!0})}throw m}}async function qe(r,i={}){let o=i.runCommand||Le;try{S("Keychain removal",await o("security",["delete-keychain",r]))}finally{k.rmSync(R.dirname(r),{recursive:!0,force:!0})}}function La(r){let i=rr(r);if(i.isSymbolicLink())throw Error(`Native app must not contain symbolic links: ${r}`);return i.isDirectory()?ir(r).reduce((o,n)=>o+La(P(r,n)),0):i.size}function Ma(r){return B(P(r,"Contents/Resources/native-screen.js"))&&B(P(r,"Contents/Resources/craft-app.json"))}async function de(r,i,o=t){let n=r.appPath??r.path;if(!n.endsWith(".app")||!B(n))throw Error("Native build must produce a macOS application bundle");let a=P(n,"Contents/Info.plist"),c=P(n,"Contents/MacOS",r.name),m=Ma(n)?["native-screen.js","craft-app.json"]:["index.html","craft.json"];for(let l of[a,c,...m.map((h)=>P(n,"Contents/Resources",h))])if(!B(l))throw Error(`Native app is incomplete: ${l}`);let f=Ye(c).subarray(0,4).toString("hex");if(!["cffaedfe","cefaedfe","cafebabe","bebafeca","cafebabf","bfbafeca"].includes(f))throw Error("Native app executable must be Mach-O");let y=La(n);if(i!==void 0&&y>=i)throw Error(`Native bundle is ${y} bytes; it must be below ${i}`);let d=JSON.parse(e("Read bundle metadata",await o("plutil",["-convert","json","-o","-",a])).stdout);if(d.CFBundleIdentifier!==r.bundleId||d.CFBundleShortVersionString!==r.version||String(d.CFBundleVersion)!==r.buildNumber)throw Error("Built app identity/version does not match the release manifest")}async function Ct(r,i,o=t){await de(r,i,o);let n=P(r.appPath??r.path,"Contents/MacOS",r.name);if(Ma(r.appPath??r.path)){let c=e("Native launch check",await o(n,["--version"]));if(!`${c.stdout}${c.stderr}`.includes("craft native macOS renderer"))throw Error("Native app did not report the AppKit renderer");return}let a=e("Native launch check",await o(n,["--benchmark"]));if(!`${a.stdout}${a.stderr}`.includes("ready"))throw Error("Native app did not report ready")}async function C(r,i,o={}){let n=p(r,!0),a=o.command??t,c={...o.env??tr.env};if(n.environment){if(Te(r,n.environment),i==="release"){let d=U(r,n.environment,o.onSecret);Object.assign(c,d,{APP_ENV:n.environment,NODE_ENV:n.environment,DOTENV_ENV:n.environment}),o.onEnvironment?.(d)}}let u=JSON.parse(Ye(P(r,"package.json"),"utf8"));if(!u.version||!/^\d+\.\d+\.\d+(?:-[\w.-]+)?$/.test(u.version))throw Error("A native release requires a semantic package version");if(c.PANTRY_BUILD_NUMBER=c.PANTRY_BUILD_NUMBER||c.GITHUB_RUN_NUMBER||u.version,i==="release"&&c.GITHUB_REF_TYPE==="tag"&&c.GITHUB_REF_NAME!==`v${u.version}`)throw Error("Release tag must match package.json version");if(i==="release"&&c.CRAFT_BIN)throw Error("Release builds must use the configured immutable runtime; CRAFT_BIN is a development override");let m=i==="release"&&n.macos?.notarize?_a(c):void 0;if(i==="release"&&n.registry&&!(c.PANTRY_REGISTRY_TOKEN||c.PANTRY_TOKEN))throw Error("Native registry publishing requires a Pantry publishing token");if(i==="release"&&n.android&&!c.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON)throw Error("Google Play publishing requires GOOGLE_PLAY_SERVICE_ACCOUNT_JSON");if(i==="release"&&n.macos?.appStore&&(!c.APPLE_APP_STORE_APPLICATION_CERTIFICATE||!c.APPLE_APP_STORE_INSTALLER_CERTIFICATE||!c.APPLE_APP_STORE_PROVISIONING_PROFILE_BASE64||!c.APP_STORE_CONNECT_API_KEY_ID||!c.APP_STORE_CONNECT_ISSUER_ID||!c.APP_STORE_CONNECT_PRIVATE_KEY))throw Error("App Store publishing requires distribution certificates, provisioning profile and App Store Connect credentials");if(i==="release"&&n.macos&&!(c.APPLE_SIGNING_IDENTITY||c.APPLE_APPLICATION_CERTIFICATE))throw Error("Native macOS releases require an application signing identity or certificate");let f=async(d)=>e(d[0],await a(d[0],d.slice(1),{cwd:r,env:c,inherit:!0})),y=[];try{if(i==="release"&&n.macos&&c.APPLE_APPLICATION_CERTIFICATE){let g=await me({applicationCertificate:c.APPLE_APPLICATION_CERTIFICATE,certificatePassword:c.APPLE_CERTIFICATE_PASSWORD||"",provisioningProfile:c.APPLE_PROVISIONING_PROFILE_BASE64});if(y.push(g.keychainPath),c.APPLE_SIGNING_IDENTITY=g.applicationFingerprint,g.provisioningProfilePath)c.APPLE_PROVISIONING_PROFILE_PATH=g.provisioningProfilePath}await f(["bun","install","--frozen-lockfile"]);for(let g of n.checks?.before??[])await f(g);if(Fe(P(r,".pantry/native/artifact.json"),{force:!0}),await f(n.build??["bun","run","package"]),i==="release"&&n.android)await Ra(s(r,n.android.bundle),c,a);let d=n.macos?_e(r):void 0;if(d){if(d.version!==u.version)throw Error("Native artifact belongs to a different package version");await Ct(d,n.macos?.maxBundleSize,a)}for(let g of n.checks?.after??[])await f(g);let l=d?[d.path]:n.android?[s(r,n.android.bundle)]:[];if(!l.length||l.some((g)=>!B(g)))throw Error("Native pipeline produced no release files");if(d&&i==="release"){e("Release signature",await a("codesign",["--verify","--deep","--strict",d.appPath??d.path]));let g=e("Release identity",await a("codesign",["-dv","--verbose=4",d.appPath??d.path]));if(!`${g.stdout}${g.stderr}`.includes("Authority=Developer ID Application:"))throw Error("Direct macOS releases require a Developer ID signature");if(d.path.toLowerCase().endsWith(".dmg"))await Ta(d.path,c.APPLE_SIGNING_IDENTITY,a)}if(m){let g=await Va(l[0],m,a);if(d?.appPath)await M(d.appPath,a);if(!l[0].toLowerCase().endsWith(".zip"))await M(l[0],a);let v=P(Be(l[0]),"notarization-receipt.json");nr(v,`${JSON.stringify(g,null,2)}
16
+ `),l.push(v)}let h;if(i==="release"&&n.macos?.appStore){let g=await me({applicationCertificate:c.APPLE_APP_STORE_APPLICATION_CERTIFICATE,installerCertificate:c.APPLE_APP_STORE_INSTALLER_CERTIFICATE,certificatePassword:c.APPLE_CERTIFICATE_PASSWORD||"",provisioningProfile:c.APPLE_APP_STORE_PROVISIONING_PROFILE_BASE64});y.push(g.keychainPath),c.PANTRY_DISTRIBUTION="app-store",c.APPLE_SIGNING_IDENTITY=g.applicationFingerprint,c.APPLE_PROVISIONING_PROFILE_PATH=g.provisioningProfilePath,Fe(s(r,".pantry/native/app-store"),{recursive:!0,force:!0}),await f(["bun","run","build"]);let v=_e(r);if(await de(v,n.macos.maxBundleSize,a),!d||v.bundleId!==d.bundleId||v.version!==d.version||v.buildNumber!==d.buildNumber)throw Error("App Store bundle must match the qualified direct release identity and version");h=P(Be(l[0]),`${or(v.appPath??v.path,".app")}-${u.version}.pkg`),await qa(v.appPath??v.path,h,g.installerFingerprint,a),l.push(h)}return{config:n,version:u.version,files:l,...d?{artifact:d}:{},...h?{appStorePackage:h}:{}}}finally{for(let d of y.reverse())await qe(d)}}
17
+ export{go,Ee,s,p,t,e,$a,xt,wt,Pt,Ea,Ut,mo,uo,_e,_a,Ta,M,N,Va,qa,Ra,Te,U,Oa,Ve,me,qe,La,Ma,de,Ct,C};
@@ -27,5 +27,5 @@ Received ${s}, cleaning up...`),e)try{await e()}catch(i){console.error("Error du
27
27
  `)),this.enableDidYouMean){let t=[];for(let i of this.commands){if(i.displayName)t.push(i.displayName);if(i.aliasNames)t.push(...i.aliasNames)}let s=q(e,t);if(s.length>0)console.log(C.yellow("Did you mean one of these?")),s.forEach((i)=>console.log(` ${C.dim("•")} ${this.name} ${i}`)),console.log("")}console.log(C.dim("Run"),`${this.name} --help`,C.dim("to see all available commands")),v.exit(1)}async parse(e=G,t={}){let{run:s=!0,exitOnError:i=!1}=t;if(i)try{return await this.parse(e,{run:s})}catch(n){throw this.handleUsageError(n),n}if(this.rawArgs=e,!this.name)this.name=e[1]?ne(e[1]):"cli";let o=!0,a=e.slice(2),h=a[0];if(h&&!h.startsWith("-")){for(let n of this.commands)if(n.isMatched(h)){let r=this.mri(a,n);o=!1;let u={...r,args:r.args.slice(1)};this.setParsedInfo(u,n,h),this.emit(`command:${h}`,n);break}if(o){let n=a[1];if(n&&!n.startsWith("-")){let r=`${h}:${n}`;for(let u of this.commands)if(u.isMatched(r)){let m=this.mri(a,u);o=!1;let l={...m,args:m.args.slice(2)};this.setParsedInfo(l,u,r),this.emit(`command:${r}`,u);break}}}}if(o){for(let n of this.commands)if(n.name===""){o=!1;let r=this.mri(a,n);this.setParsedInfo(r,n),this.emit("command:!",n);break}}if(o){let n=this.mri(e.slice(2));this.setParsedInfo(n)}if(this.options.verbose)this.isVerbose=!0;if(this.options.quiet)this.isQuiet=!0;if(this.options.debug)this.isDebug=!0;if(this.options.noInteraction||this.options.interaction===!1)this.isNoInteraction=!0;if(this.options.env)this.environment=String(this.options.env);if(this.options.dryRun)this.isDryRun=!0;if(this.options.force)this.isForce=!0;if(this.options.noEmoji||this.options.emoji===!1)this.useEmoji=!1;if(this.options.theme)this.theme=String(this.options.theme);if(this.options.noCache||this.options.cache===!1)this.isNoCache=!0;if(this.options.help&&this.showHelpOnExit)this.outputHelp(),s=!1,this.unsetMatchedCommand();if(this.options.version&&this.showVersionOnExit&&this.matchedCommandName==null)this.outputVersion(),s=!1,this.unsetMatchedCommand();let c={args:this.args,options:this.options};if(s)await this.runMatchedCommand();if(!this.matchedCommand&&this.args[0]){if(this.emit("command:*"),!(this.listenerCount("command:*")>0))this.showCommandNotFound(this.args[0])}return c}mri(e,t){let s=[...this.globalCommand.options,...t?t.options:[]],i=te(s),o=[],a=e.indexOf("--");if(a>-1)o=e.slice(a+1),e=e.slice(0,a);let h=le(e,i),c={_:h._};for(let l of Object.keys(h))if(l!=="_")c[I(l)]=h[l];let n=c._,r={"--":o},u=t&&t.config.ignoreOptionDefaultValue?t.config.ignoreOptionDefaultValue:this.globalCommand.config.ignoreOptionDefaultValue,m=Object.create(null);for(let l of s){if(!u&&l.config.default!==void 0)for(let b of l.names)r[b]=l.config.default;if(Array.isArray(l.config.type)){if(m[l.name]===void 0)m[l.name]={shouldTransform:!0,transformFunction:l.config.type[0]}}}for(let l of Object.keys(c))if(l!=="_"){let b=l.split(".");se(r,b,c[l]),ie(r,m)}return{args:n,options:r}}async run(e=G){return this.parse(e,{run:!0,exitOnError:!0})}handleUsageError(e){if(!re(e)||e.isUsageError===!1)return;let t=e.message||"command-line error",s=this.name?`${this.name}: `:"",i=/--help/.test(t)?"":e.usage?`
28
28
  Usage: ${e.usage}`:`
29
29
  Run \`${this.name??"cli"} --help\` for usage.`;v.stderr.write(`${s}${t}${i}
30
- `),v.exit(e.exitCode??2)}async runMatchedCommand(){let{args:e,options:t,matchedCommand:s}=this;if(!s||!s.commandAction)return;s.checkUnknownOptions(),s.checkOptionValue(),s.checkRequiredArgs();let i=[];s.args.forEach((c,n)=>{if(c.variadic)i.push(e.slice(n));else i.push(e[n])}),i.push(t);let o={command:s,args:i,options:t};for(let c of s.beforeHooks)await c(o);let a,h=async()=>{let c=s.commandAction.apply(this,i);if(c instanceof Promise)a=await c;else a=c;return a};if(s.middleware.length>0){let c=0,n=async()=>{if(c<s.middleware.length){let r=s.middleware[c++];await r({...o,next:n})}else await h()};await n()}else await h();for(let c of s.afterHooks)await c(o);return a}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return v.removeAllListeners("SIGINT"),v.removeAllListeners("SIGTERM"),this.signalHandlersSet=!1,this}destroy(){this.removeSignalHandlers(),this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.matchedCommand=void 0,this.matchedCommandName=void 0,this.removeAllListeners()}}class J{cache;enabled;cleanupInterval=null;hits=0;misses=0;constructor(){this.cache=new Map,this.enabled=!0,this.startCleanupInterval()}startCleanupInterval(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanup()},30000),this.cleanupInterval.unref()}stopCleanup(){if(this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}isEnabled(){return this.enabled}get(e){if(!this.enabled){this.misses++;return}let t=this.cache.get(e);if(!t){this.misses++;return}if(Date.now()-t.timestamp>t.ttl){this.cache.delete(e),this.misses++;return}return this.hits++,t.value}set(e,t,s=5000){if(!this.enabled)return;this.cache.set(e,{value:t,timestamp:Date.now(),ttl:s})}has(e){if(!this.enabled)return!1;let t=this.cache.get(e);if(!t)return!1;if(Date.now()-t.timestamp>t.ttl)return this.cache.delete(e),!1;return!0}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}disable(){this.enabled=!1,this.clear()}enable(){this.enabled=!0}stats(){return{size:this.cache.size,enabled:this.enabled,hits:this.hits,misses:this.misses}}resetStats(){this.hits=0,this.misses=0}keys(){return Array.from(this.cache.keys())}cleanup(){let e=Date.now();for(let[t,s]of this.cache.entries())if(e-s.timestamp>s.ttl)this.cache.delete(t)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var at=new J;function fe(){if("FORCE_COLOR"in S.env)return S.env.FORCE_COLOR!=="0";if("NO_COLOR"in S.env||S.env.TERM==="dumb")return!1;if(S.platform==="win32")return!0;return U.isatty(1)&&U.isatty(2)}var Q=fe();function p(e,t){if(!Q)return(s)=>s;return(s)=>e+s+t}var pe=p("\x1B[0m","\x1B[0m"),ge=p("\x1B[31m","\x1B[39m"),$e=p("\x1B[32m","\x1B[39m"),be=p("\x1B[33m","\x1B[39m"),ve=p("\x1B[34m","\x1B[39m"),we=p("\x1B[35m","\x1B[39m"),ye=p("\x1B[36m","\x1B[39m"),xe=p("\x1B[37m","\x1B[39m"),Ce=p("\x1B[90m","\x1B[39m"),Se=p("\x1B[1m","\x1B[22m"),Ie=p("\x1B[3m","\x1B[23m"),_e=p("\x1B[4m","\x1B[24m"),Oe=p("\x1B[2m","\x1B[22m"),ke=p("\x1B[7m","\x1B[27m"),Ee=p("\x1B[8m","\x1B[28m"),Be=p("\x1B[9m","\x1B[29m"),Te=p("\x1B[41m","\x1B[49m"),je=p("\x1B[42m","\x1B[49m"),Ve=p("\x1B[43m","\x1B[49m"),Ae=p("\x1B[44m","\x1B[49m"),Me=p("\x1B[45m","\x1B[49m"),Ne=p("\x1B[46m","\x1B[49m"),Re=p("\x1B[47m","\x1B[49m"),Le=Q,De={reset:pe,red:ge,green:$e,yellow:be,blue:ve,magenta:we,cyan:ye,white:xe,gray:Ce,bold:Se,italic:Ie,underline:_e,dim:Oe,inverse:ke,hidden:Ee,strikethrough:Be,bgRed:Te,bgGreen:je,bgYellow:Ve,bgBlue:Ae,bgMagenta:Me,bgCyan:Ne,bgWhite:Re,isColorSupported:Le},We=De,ze=["up","down","left","right","space","enter","cancel"],dt={actions:new Set(ze),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};var ft=Pe.platform.startsWith("win"),pt=Symbol("clapp:cancel");var Fe=oe();var f=(e,t)=>Fe?e:t,gt=f("◆","*"),$t=f("■","x"),bt=f("▲","x"),vt=f("◇","o"),wt=f("┌","T"),He=f("│","|"),yt=f("└","—"),xt=f("●",">"),Ct=f("○"," "),St=f("◻","[•]"),It=f("◼","[+]"),_t=f("◻","[ ]"),Ot=f("▪","•"),kt=f("─","-"),Et=f("╮","+"),Bt=f("├","+"),Tt=f("╯","+"),jt=f("●","•"),Vt=f("◆","*"),At=f("▲","!"),Mt=f("■","x");var Nt={light:f("─","-"),heavy:f("━","="),block:f("█","#")};function Ge(){return`${We.gray(He)} `}var Rt=Ge();var B="0.11.148";
30
+ `),v.exit(e.exitCode??2)}async runMatchedCommand(){let{args:e,options:t,matchedCommand:s}=this;if(!s||!s.commandAction)return;s.checkUnknownOptions(),s.checkOptionValue(),s.checkRequiredArgs();let i=[];s.args.forEach((c,n)=>{if(c.variadic)i.push(e.slice(n));else i.push(e[n])}),i.push(t);let o={command:s,args:i,options:t};for(let c of s.beforeHooks)await c(o);let a,h=async()=>{let c=s.commandAction.apply(this,i);if(c instanceof Promise)a=await c;else a=c;return a};if(s.middleware.length>0){let c=0,n=async()=>{if(c<s.middleware.length){let r=s.middleware[c++];await r({...o,next:n})}else await h()};await n()}else await h();for(let c of s.afterHooks)await c(o);return a}removeSignalHandlers(){if(!this.signalHandlersSet)return this;return v.removeAllListeners("SIGINT"),v.removeAllListeners("SIGTERM"),this.signalHandlersSet=!1,this}destroy(){this.removeSignalHandlers(),this.commands=[],this.rawArgs=[],this.args=[],this.options={},this.matchedCommand=void 0,this.matchedCommandName=void 0,this.removeAllListeners()}}class J{cache;enabled;cleanupInterval=null;hits=0;misses=0;constructor(){this.cache=new Map,this.enabled=!0,this.startCleanupInterval()}startCleanupInterval(){if(this.cleanupInterval)return;this.cleanupInterval=setInterval(()=>{this.cleanup()},30000),this.cleanupInterval.unref()}stopCleanup(){if(this.cleanupInterval)clearInterval(this.cleanupInterval),this.cleanupInterval=null}isEnabled(){return this.enabled}get(e){if(!this.enabled){this.misses++;return}let t=this.cache.get(e);if(!t){this.misses++;return}if(Date.now()-t.timestamp>t.ttl){this.cache.delete(e),this.misses++;return}return this.hits++,t.value}set(e,t,s=5000){if(!this.enabled)return;this.cache.set(e,{value:t,timestamp:Date.now(),ttl:s})}has(e){if(!this.enabled)return!1;let t=this.cache.get(e);if(!t)return!1;if(Date.now()-t.timestamp>t.ttl)return this.cache.delete(e),!1;return!0}delete(e){this.cache.delete(e)}clear(){this.cache.clear()}disable(){this.enabled=!1,this.clear()}enable(){this.enabled=!0}stats(){return{size:this.cache.size,enabled:this.enabled,hits:this.hits,misses:this.misses}}resetStats(){this.hits=0,this.misses=0}keys(){return Array.from(this.cache.keys())}cleanup(){let e=Date.now();for(let[t,s]of this.cache.entries())if(e-s.timestamp>s.ttl)this.cache.delete(t)}destroy(){this.stopCleanup(),this.clear(),this.resetStats()}}var at=new J;function fe(){if("FORCE_COLOR"in S.env)return S.env.FORCE_COLOR!=="0";if("NO_COLOR"in S.env||S.env.TERM==="dumb")return!1;if(S.platform==="win32")return!0;return U.isatty(1)&&U.isatty(2)}var Q=fe();function p(e,t){if(!Q)return(s)=>s;return(s)=>e+s+t}var pe=p("\x1B[0m","\x1B[0m"),ge=p("\x1B[31m","\x1B[39m"),$e=p("\x1B[32m","\x1B[39m"),be=p("\x1B[33m","\x1B[39m"),ve=p("\x1B[34m","\x1B[39m"),we=p("\x1B[35m","\x1B[39m"),ye=p("\x1B[36m","\x1B[39m"),xe=p("\x1B[37m","\x1B[39m"),Ce=p("\x1B[90m","\x1B[39m"),Se=p("\x1B[1m","\x1B[22m"),Ie=p("\x1B[3m","\x1B[23m"),_e=p("\x1B[4m","\x1B[24m"),Oe=p("\x1B[2m","\x1B[22m"),ke=p("\x1B[7m","\x1B[27m"),Ee=p("\x1B[8m","\x1B[28m"),Be=p("\x1B[9m","\x1B[29m"),Te=p("\x1B[41m","\x1B[49m"),je=p("\x1B[42m","\x1B[49m"),Ve=p("\x1B[43m","\x1B[49m"),Ae=p("\x1B[44m","\x1B[49m"),Me=p("\x1B[45m","\x1B[49m"),Ne=p("\x1B[46m","\x1B[49m"),Re=p("\x1B[47m","\x1B[49m"),Le=Q,De={reset:pe,red:ge,green:$e,yellow:be,blue:ve,magenta:we,cyan:ye,white:xe,gray:Ce,bold:Se,italic:Ie,underline:_e,dim:Oe,inverse:ke,hidden:Ee,strikethrough:Be,bgRed:Te,bgGreen:je,bgYellow:Ve,bgBlue:Ae,bgMagenta:Me,bgCyan:Ne,bgWhite:Re,isColorSupported:Le},We=De,ze=["up","down","left","right","space","enter","cancel"],dt={actions:new Set(ze),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["\x03","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"}};var ft=Pe.platform.startsWith("win"),pt=Symbol("clapp:cancel");var Fe=oe();var f=(e,t)=>Fe?e:t,gt=f("◆","*"),$t=f("■","x"),bt=f("▲","x"),vt=f("◇","o"),wt=f("┌","T"),He=f("│","|"),yt=f("└","—"),xt=f("●",">"),Ct=f("○"," "),St=f("◻","[•]"),It=f("◼","[+]"),_t=f("◻","[ ]"),Ot=f("▪","•"),kt=f("─","-"),Et=f("╮","+"),Bt=f("├","+"),Tt=f("╯","+"),jt=f("●","•"),Vt=f("◆","*"),At=f("▲","!"),Mt=f("■","x");var Nt={light:f("─","-"),heavy:f("━","="),block:f("█","#")};function Ge(){return`${We.gray(He)} `}var Rt=Ge();var B="0.11.152";
31
31
  export{T,B};
@@ -0,0 +1 @@
1
+ import{n,Z,Ze,I,d,pt,ee,gt,mt,ae,ea,aa,ta,z}from"./chunk-x2y7f62z.js";export{Z as cleanStaleOutputFiles,d as cleanupBrowserResources,ae as fetchAndSaveAllPackages,ea as fetchAndSavePackage,ee as fetchPantryPackage,z as fetchPantryPackageWithMetadata,pt as fetchPkgxProjects,Ze as getValidCachedPackage,ta as readPantryPackageInfo,n as savePackageAsTypeScript,I as saveToCacheAndOutput,aa as scanPantryPackages,gt as setupCleanupHandlers,mt as startPeriodicCleanup};